@gui-chat-plugin/spreadsheet 4.1.0 → 4.2.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.
Files changed (67) hide show
  1. package/README.md +38 -4
  2. package/dist/core/calculationErrors.d.ts +17 -0
  3. package/dist/core/contentVersion.d.ts +5 -0
  4. package/dist/core/definition.d.ts +1 -1
  5. package/dist/core/dispatch.d.ts +3 -3
  6. package/dist/core/dispatchReplies.d.ts +19 -0
  7. package/dist/core/index.d.ts +1 -1
  8. package/dist/core/rangeValues.d.ts +2 -1
  9. package/dist/core/types.d.ts +14 -1
  10. package/dist/core-CTRlKL9k.js +52 -0
  11. package/dist/core-Cf9Pxo_q.cjs +1 -0
  12. package/dist/core.cjs +1 -1
  13. package/dist/core.js +3 -3
  14. package/dist/engine/blankOperands.d.ts +14 -0
  15. package/dist/engine/calculator.d.ts +0 -7
  16. package/dist/engine/cellEmpty.d.ts +3 -0
  17. package/dist/engine/cellFormatting.d.ts +3 -2
  18. package/dist/engine/concatOperand.d.ts +3 -0
  19. package/dist/engine/concatPrecedence.d.ts +32 -0
  20. package/dist/engine/customFunctionSpecs.d.ts +30 -0
  21. package/dist/engine/customFunctions.d.ts +32 -0
  22. package/dist/engine/date-calendar.d.ts +32 -0
  23. package/dist/engine/date-utils.d.ts +4 -1
  24. package/dist/engine/dateDisplay.d.ts +20 -0
  25. package/dist/engine/escapes.d.ts +10 -0
  26. package/dist/engine/evaluator.d.ts +9 -2
  27. package/dist/engine/formatter.d.ts +4 -0
  28. package/dist/engine/functions/aliases.d.ts +6 -0
  29. package/dist/engine/functions/analysis-math.d.ts +3 -0
  30. package/dist/engine/functions/calendar.d.ts +9 -0
  31. package/dist/engine/functions/date.d.ts +1 -1
  32. package/dist/engine/functions/distribution-math.d.ts +44 -0
  33. package/dist/engine/functions/distributions.d.ts +7 -0
  34. package/dist/engine/functions/index.d.ts +5 -0
  35. package/dist/engine/functions/regression-math.d.ts +25 -0
  36. package/dist/engine/functions/regression.d.ts +5 -0
  37. package/dist/engine/functions/shape-math.d.ts +21 -0
  38. package/dist/engine/functions/shape.d.ts +5 -0
  39. package/dist/engine/functions/special-functions.d.ts +17 -0
  40. package/dist/engine/functions/statistical-analysis.d.ts +8 -1
  41. package/dist/engine/functions/statistical.d.ts +21 -1
  42. package/dist/engine/jsonCellLocator.d.ts +0 -16
  43. package/dist/engine/logicalLiterals.d.ts +11 -0
  44. package/dist/engine/math-ops.d.ts +4 -2
  45. package/dist/engine/numericCoercion.d.ts +6 -0
  46. package/dist/engine/registry.d.ts +32 -4
  47. package/dist/engine/sheetReference.d.ts +14 -0
  48. package/dist/engine/textCollation.d.ts +8 -0
  49. package/dist/engine/textComparison.d.ts +22 -0
  50. package/dist/engine/translateFormula.d.ts +16 -5
  51. package/dist/engine/wholeReferences.d.ts +19 -0
  52. package/dist/index.cjs +1 -1
  53. package/dist/index.js +3 -3
  54. package/dist/lang/messages.d.ts +5 -0
  55. package/dist/samples-C5JjpxYJ.js +4513 -0
  56. package/dist/samples-UnTPgkyq.cjs +2 -0
  57. package/dist/style.css +1 -1
  58. package/dist/vue/fileFollow.d.ts +7 -0
  59. package/dist/vue/sheetSession.d.ts +10 -4
  60. package/dist/vue/useCustomFunctions.d.ts +7 -0
  61. package/dist/vue.cjs +32 -32
  62. package/dist/vue.js +3099 -2921
  63. package/package.json +4 -2
  64. package/dist/core-CaJMHb3p.js +0 -44
  65. package/dist/core-PwJLsuHs.cjs +0 -1
  66. package/dist/samples-B6CgK8O-.cjs +0 -1
  67. package/dist/samples-miYeCJeQ.js +0 -2856
@@ -0,0 +1,2 @@
1
+ let e=require("gui-chat-protocol"),t=require("quickjs-emscripten-core");var n=`presentSpreadsheet`,r={type:`function`,name:n,description:`Display an Excel-like spreadsheet with formulas and calculations.`,parameters:{type:`object`,properties:{title:{type:`string`,description:`Title for the spreadsheet`},sheets:{type:`array`,description:`Sheets to render as spreadsheet tabs. Each sheet includes a name and 2D array of cells (rows x columns).`,items:{type:`object`,properties:{name:{type:`string`,description:`Sheet name (e.g., 'Sales Q1', 'Summary')`},data:{type:`array`,description:`Rows of cells. Each cell is an object with 'v' (value) and 'f' (format). Use Excel-style A1 notation in formulas: columns are letters (A, B, C...), rows are 1-based numbers (1, 2, 3...). Values can be text, numbers, dates, or formulas. Examples: [{"v": "Product"}, {"v": 2024, "f": "#,##0"}, {"v": "01/15/2025", "f": "MM/DD/YYYY"}, {"v": "=B2*1.05", "f": "$#,##0.00"}]. Format codes: '$#,##0.00' (currency), '#,##0' (integer), '0.00%' (percent), '0.00' (decimal), 'MM/DD/YYYY' (date), 'DD-MMM-YYYY' (date), 'YYYY-MM-DD' (ISO date).`,items:{type:`array`,description:`Row of cells. Each cell is an object with value and format.`,items:{type:`object`,description:`Cell object with value and optional format. If value is a string starting with '=', it's treated as a formula.`,properties:{v:{oneOf:[{type:`string`},{type:`number`},{type:`boolean`}],description:`Cell value. Can be text, number, date, or formula (string starting with '='). Examples: 'Revenue', 1500000, '01/15/2025', '=SUM(A1:A10)', '=B2-TODAY()'. Date strings like '01/15/2025' are automatically parsed to date serial numbers.`},f:{type:`string`,description:`Optional format code for displaying the value. Common formats: '$#,##0.00' (currency), '#,##0' (integer), '0.00%' (percent), '0.00' (decimal), 'MM/DD/YYYY' (date), 'DD-MMM-YYYY' (date), 'YYYY-MM-DD' (ISO date)`}},required:[`v`]}}},functions:{type:`array`,description:`Optional. Functions this workbook defines, for an analysis no built-in function does (a moving average, a custom score). A formula on any sheet calls one by name, e.g. =MOVING.AVG(B2:B100, 7), and it recalculates like any formula. Each is a JavaScript function body run in a sandbox with no network, files, DOM or timers, at most 50 ms per call. A range argument arrives as rows of cells (an array of arrays; a blank cell is null); a single cell and any other argument as its value. A whole column (A:A) arrives as the rows its sheet's data reaches. Return a number, text or true/false; anything else, a thrown error or a time-out shows as an error in the cell.`,items:{type:`object`,properties:{name:{type:`string`,description:`Letters and digits, parts joined by dots (MOVING.AVG). Not the name of a built-in function.`},params:{type:`array`,items:{type:`string`},description:`Parameter names, in call order, e.g. ["values", "n"].`},body:{type:`string`,description:`The function body, e.g. "const xs = values.flat().filter((v) => typeof v === 'number'); const tail = xs.slice(-n); return tail.reduce((a, b) => a + b, 0) / tail.length;"`},description:{type:`string`,description:`What it computes.`}},required:[`name`,`params`,`body`]}}},required:[`name`,`data`]}}},required:[`title`,`sheets`]}},i=`Use ${n} whenever the user needs a spreadsheet-style table, multi-step math, or dynamic what-if analysis—do not summarize in text. Build LIVE sheets where every cell is an object {"v": value, "f": format}. For formulas, set "v" to a string starting with "=" (e.g., {"v": "=B2*1.05", "f": "$#,##0.00"}). For dates, use date strings like "01/15/2025" or date formulas like "=TODAY()" or "=DATE(2025,1,15)". The spreadsheet auto-parses common date formats (MM/DD/YYYY, YYYY-MM-DD, DD-MMM-YYYY) into date serial numbers for calculations. Date arithmetic works: "=B2-TODAY()" calculates days between dates. Never pre-calculate; let the spreadsheet compute using cell refs, functions (SUM, AVERAGE, IF, TODAY, DATE, DATEDIF, etc.), and arithmetic. Standard formats: "$#,##0.00" currency, "#,##0" integer, "0.00%" percent, "0.00" decimal, "MM/DD/YYYY" date, "DD-MMM-YYYY" date, "YYYY-MM-DD" ISO date. Format is optional for plain text/numbers. When an analysis needs a method no built-in function has, define it once in the sheet's "functions" and call it from formulas, rather than pasting a computed number: it then recalculates when the data changes.`;function a(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function o(e){return typeof e==`object`&&!!e}var s=(e,t)=>a(e)&&typeof e[t]==`string`;function c(e,t){return e instanceof Error?e.message:s(e,`details`)&&e.details?e.details:s(e,`message`)&&e.message?e.message:t===void 0?String(e):t}var l=`spreadsheets`,u=`.json`,d=16,f=2,p=e=>`${e.getUTCFullYear()}/${String(e.getUTCMonth()+1).padStart(f,`0`)}`,ee=()=>globalThis.crypto.randomUUID().split(`-`).join(``).slice(0,d);function m(t=new Date,n=ee()){let r=`${l}/${p(t)}/${n}${u}`;return{relPath:r,filePath:`${e.ARTIFACTS_ROOT}/${r}`}}var h=new Set([``,`.`,`..`]);function te(t){return typeof t!=`string`||!t.startsWith(`${e.ARTIFACTS_ROOT}/${l}/`)||!t.endsWith(u)||t.includes(`\\`)?!1:!t.split(`/`).some(e=>h.has(e))}var ne=t=>t.slice(e.ARTIFACTS_ROOT.length+1),re=e=>typeof e==`string`||typeof e==`number`||typeof e==`boolean`,ie=e=>e===null||re(e)||a(e)&&(e.v===void 0||e.v===null||re(e.v))&&(e.f===void 0||typeof e.f==`string`),ae=e=>Array.isArray(e)&&e.every(ie),oe=e=>a(e)&&typeof e.name==`string`&&Array.isArray(e.data)&&e.data.every(ae);function se(e){return Array.isArray(e)&&e.every(oe)?e:null}var ce=`SHA-256`,le=16,ue=2;async function de(e){let t=await crypto.subtle.digest(ce,new TextEncoder().encode(e));return Array.from(new Uint8Array(t),e=>e.toString(le).padStart(ue,`0`)).join(``)}var fe=(e,t)=>e!==void 0&&t!==null&&e!==t;function pe(e){if(!a(e)||typeof e.path!=`string`)return!1;if(e.kind===`loadSpreadsheet`)return!0;let t=e.baseVersion;return e.kind===`saveSpreadsheet`&&Array.isArray(e.sheets)&&e.sheets.every(oe)&&(t===void 0||typeof t==`string`)}var me=e=>a(e)&&typeof e.read==`function`&&typeof e.write==`function`;function he(e){if(!a(e)||!a(e.files))return null;let t=e.files.artifacts;return me(t)?t:null}function ge(e,t){let n=se(JSON.parse(e));if(!n)throw Error(`${t} does not hold an array of sheets`);return n}async function _e(e,t){let n=await e.read(ne(t));return{message:`Loaded spreadsheet ${t}`,data:{sheets:ge(n,t),version:await de(n)}}}var ve=new Map;function ye(t){let n=ve.get(t);if(n)return n;let r=(0,e.createSerialLock)();return ve.set(t,r),r}async function be(e,t){return await e.exists(t)?e.read(t):null}function xe(e,t,n){return{message:`Did not save spreadsheet ${e}: it changed since it was read`,data:{sheets:ge(t,e),version:n,conflict:!0}}}async function Se(e,t,n,r){let i=ne(t);return ye(i)(async()=>{let a=r===void 0?null:await be(e,i),o=a===null?null:await de(a);if(a!==null&&o!==null&&fe(r,o))return xe(t,a,o);let s=JSON.stringify(n);return await e.write(i,s),{message:`Saved spreadsheet ${t}`,data:{sheets:t,version:await de(s)}}})}async function Ce(e,t){if(!te(t.path))throw Error(`path must be a .json file under artifacts/spreadsheets/`);return t.kind===`loadSpreadsheet`?_e(e,t.path):Se(e,t.path,t.sheets,t.baseVersion)}var we=[`#NULL!`,`#DIV/0!`,`#VALUE!`,`#REF!`,`#NAME?`,`#NUM!`,`#N/A`,`#ERROR!`],g=class{code;constructor(e){this.code=e}toString(){return this.code}toJSON(){return this.code}},Te=new g(`#NULL!`),_=new g(`#DIV/0!`),v=new g(`#VALUE!`),Ee=new g(`#REF!`),De=new g(`#NAME?`),y=new g(`#NUM!`),b=new g(`#N/A`),Oe={"#NULL!":Te,"#DIV/0!":_,"#VALUE!":v,"#REF!":Ee,"#NAME?":De,"#NUM!":y,"#N/A":b,"#ERROR!":new g(`#ERROR!`)},ke=e=>Oe[e],Ae=new Set(we);function je(e){return typeof e==`string`&&Ae.has(e)}function x(e){return e instanceof g}function Me(e){return x(e)?e.code:je(e)?e:null}function Ne(e){return e==null?!0:typeof e==`number`?Number.isNaN(e)||!Number.isFinite(e):x(e)}var Pe=e=>isNaN(e)?null:e;function Fe(e){if(e.includes(`%`)){let t=Pe(parseFloat(e.replace(`%`,``).trim()));return t===null?null:t/100}return e.includes(`$`)?Pe(parseFloat(e.replace(/[$,]/g,``).trim())):e.includes(`,`)?Pe(parseFloat(e.replace(/,/g,``).trim())):Pe(parseFloat(e))}function S(e){return typeof e==`number`?!isNaN(e):typeof e==`string`&&Fe(e)!==null}function C(e){return typeof e==`number`?e:typeof e==`boolean`?+!!e:typeof e==`string`?Fe(e)??v:e}function Ie(e){return typeof e==`number`?!isNaN(e):typeof e==`string`&&e.trim()!==``&&!isNaN(Number(e))}var Le=864e5,Re=new Date(Date.UTC(1899,11,30)),w=e=>(e.getTime()-Re.getTime())/Le,T=e=>{let t=Math.floor(e),n=e-t,r=new Date(Re.getTime()+t*Le),i=Math.round(n*24*60*60);return r.setSeconds(r.getSeconds()+i),r},ze=[`Jan`,`Feb`,`Mar`,`Apr`,`May`,`Jun`,`Jul`,`Aug`,`Sep`,`Oct`,`Nov`,`Dec`],Be=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],Ve=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],He=[`Sunday`,`Monday`,`Tuesday`,`Wednesday`,`Thursday`,`Friday`,`Saturday`];function Ue(e){if(typeof e!=`string`||e.length<6||e.length>30)return!1;let t=/\d/.test(e),n=/[/\-\s,]/.test(e);return!t||!n?!1:[/^\d{1,2}\/\d{1,2}\/\d{2,4}$/,/^\d{4}-\d{1,2}-\d{1,2}$/,/^\d{4}\/\d{1,2}\/\d{1,2}$/,/^\d{1,2}-[A-Za-z]{3}-\d{2,4}$/,/^[A-Za-z]{3,9}\s+\d{1,2},?\s+\d{4}$/,/^\d{1,2}\s+[A-Za-z]{3,9}\s+\d{4}$/].some(t=>t.test(e.trim()))}function We(e,t,n){return et(e,t,n)?w(new Date(Date.UTC(e,t-1,n))):null}function E(e,t){let[,n,r,i]=e.match(t)??[];return n===void 0||r===void 0||i===void 0?null:[n,r,i]}var Ge=/^(\d{1,2})\/(\d{1,2})\/(\d{2,4})$/,Ke=12,qe=(e,t,n)=>e>Ke||t<=Ke&&e<=Ke&&n;function Je(e){let t=e.toLowerCase(),n=ze.findIndex(e=>e.toLowerCase()===t);if(n!==-1)return n+1;let r=Be.findIndex(e=>e.toLowerCase()===t);return r===-1?null:r+1}function Ye(e,t=!1){if(!Ue(e))return null;let n=e.trim(),r=E(n,/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/);if(r){let[e,t,n]=r;return We(parseInt(e),parseInt(t),parseInt(n))}let i=E(n,/^(\d{1,2})-([A-Za-z]{3})-(\d{2,4})$/);if(i){let[e,t,n]=i;return $e(Qe(parseInt(n)),t,parseInt(e))}let a=E(n,/^([A-Za-z]{3,9})\s+(\d{1,2}),?\s+(\d{4})$/);if(a){let[e,t,n]=a;return $e(parseInt(n),e,parseInt(t))}let o=E(n,/^(\d{1,2})\s+([A-Za-z]{3,9})\s+(\d{4})$/);if(o){let[e,t,n]=o;return $e(parseInt(n),t,parseInt(e))}let s=E(n,Ge);if(s){let[e,n,r]=s,i=qe(parseInt(e),parseInt(n),t),a=parseInt(i?n:e),o=parseInt(i?e:n);return We(Qe(parseInt(r)),a,o)}return null}var Xe=100,Ze=30;function Qe(e){return e>=Xe?e:e<Ze?2e3+e:1900+e}function $e(e,t,n){let r=Je(t);return r===null?null:We(e,r,n)}function et(e,t,n){if(e<1900||e>2100||t<1||t>12||n<1||n>31)return!1;let r=new Date(Date.UTC(e,t-1,n));return r.getUTCFullYear()===e&&r.getUTCMonth()===t-1&&r.getUTCDate()===n}function tt(e,t=!1){let n=e.trim();if(/^\d{4}-\d{1,2}-\d{1,2}$/.test(n))return`YYYY-MM-DD`;if(/^\d{4}\/\d{1,2}\/\d{1,2}$/.test(n))return`YYYY/MM/DD`;if(/^\d{1,2}-[A-Za-z]{3}-\d{2,4}$/.test(n))return`DD-MMM-YYYY`;if(/^[A-Za-z]{3}\s+\d{1,2},?\s+\d{4}$/.test(n))return`MMM D, YYYY`;if(/^[A-Za-z]{4,9}\s+\d{1,2},?\s+\d{4}$/.test(n))return`MMMM D, YYYY`;let r=E(n,Ge);if(r){let[e,n]=r;return qe(parseInt(e),parseInt(n),t)?`DD/MM/YYYY`:`MM/DD/YYYY`}return t?`DD/MM/YYYY`:`MM/DD/YYYY`}var nt=(e,t)=>Error(`${e} requires at least ${t} argument${t===1?``:`s`}`),D=(e,t,n)=>{let r=t[n];if(r===void 0)throw nt(e.functionName,n+1);return r},rt=e=>e.getRangeValuesRaw??e.getRangeValues,O=e=>e.getRangeValuesKeepingBlanks??rt(e),k=new class{functions=new Map;overlay=null;register(e){this.functions.set(e.name.toUpperCase(),e)}get(e){let t=e.toUpperCase();return this.functions.get(t)??this.overlay?.get(t)}hasFunction(e){let t=e.toUpperCase();return this.functions.has(t)||(this.overlay?.has(t)??!1)}isBuiltIn(e){return this.functions.has(e.toUpperCase())}withOverlay(e,t){let n=this.overlay;this.overlay=e;try{return t()}finally{this.overlay=n}}getAllFunctions(){return Array.from(this.functions.values())}getFunctionsByCategory(){let e=new Map;for(let t of Array.from(this.functions.values())){let n=t.category||`Other`;e.has(n)||e.set(n,[]),e.get(n).push(t)}return e}},it=`[A-Z][A-Z0-9]*(?:\\.[A-Z0-9]+)*`,at=e=>/^[A-Z]+(?:\.[A-Z]+)*$/i.test(e)||k.hasFunction(e);function A(e){return typeof e==`number`?e:Fe(String(e))??0}function ot(e){return typeof e==`boolean`?e?`TRUE`:`FALSE`:String(e)}var st=/[.*+?^${}()|[\]\\]/,ct=e=>st.test(e)?`\\${e}`:e,lt=/~([\s\S])|[\s\S]/g,ut=e=>e.replace(lt,(e,t)=>t===void 0?e===`*`?`.*`:e===`?`?`.`:ct(e):ct(t));function dt(e){let t=RegExp(`^${ut(e)}$`,`iu`);return e=>t.test(e)}function ft(e,t=!1){let n=e.trim().replace(/^["']|["']$/g,``);if(n===`=`)return e=>String(e).trim()===``;if(n===`<>`)return e=>String(e).trim()!==``;let[,r,i]=n.match(/^([><=!]+)(.+)$/)??[];if(r!==void 0&&i!==void 0){let e=pt(i,t),n=mt(i,t),a=e=>t=>S(t)&&e(A(t));switch(r){case`>`:return a(t=>t>e);case`>=`:return a(t=>t>=e);case`<`:return a(t=>t<e);case`<=`:return a(t=>t<=e);case`=`:case`==`:return n;case`!=`:case`<>`:return e=>!n(e);default:return()=>!1}}return mt(n,t)}function pt(e,t){return Ye(e,t)??Fe(e)??NaN}function mt(e,t){let n=dt(e),r=pt(e,t),i=!isNaN(r);return e=>typeof e!=`number`&&n(String(e))||i&&S(e)&&A(e)===r}function ht(e,t,n){let r=e.evaluateFormula(D(e,t,n));return x(r)?r:typeof r==`boolean`?e=>e===r:ft(String(r),e.preferDDMMYYYY)}var gt=e=>e.reduce((e,t)=>e+t,0)/e.length;function _t(e){return e.length===0?_:gt(e)}function vt(e){return e.length===0?y:gt(yt([...e].sort((e,t)=>e-t)))}function yt(e){let t=Math.floor(e.length/2);return e.slice(e.length%2==0?t-1:t,t+1)}function bt(e){let t=new Map;for(let n of e)t.set(n,(t.get(n)??0)+1);let n=0,r=b;for(let[e,i]of t.entries())i>n&&(n=i,r=e);return n>=2?r:b}var xt=2;function St(e){if(e.length<xt)return _;let t=gt(e);return e.reduce((e,n)=>e+(n-t)**2,0)/(e.length-1)}function Ct(e){let t=St(e);return typeof t==`number`?Math.sqrt(t):t}var j=255,wt=/^\$?[A-Z]+\$?\d+$/i,Tt=e=>wt.test(e),Et=e=>e.slice(e.lastIndexOf(`!`)+1),Dt=e=>{if(!e)return!1;let[t,n]=Et(e).split(`:`);return!t||!n?!1:Tt(t)&&Tt(n)},Ot=e=>Dt(e)||Tt(Et(e)),kt=(e,t,n)=>{let r=[];for(let i of e){let e=i?.trim();e&&(Ot(e)?n(e).forEach(e=>r.push({value:e,isScalar:!1})):r.push({value:t.evaluateFormula(e),isScalar:!0}))}return r},At=(e,t)=>{if(!t.getRangeValuesKeepingBlanks)return Mt(e,t);let n=kt(e,t,t.getRangeValuesKeepingBlanks).flatMap(jt);return n.find(x)??n.filter(e=>typeof e==`number`)},jt=({value:e,isScalar:t})=>x(e)?[e]:t?[C(e)]:Ie(e)?[A(e)]:[];function Mt(e,t){let n=e.map(e=>e?.trim()??``).filter(e=>e!==``).map(e=>{if(Ot(e))return{error:t.getRangeValuesRaw?.(e).find(x),numbers:t.getRangeValues(e).map(A)};let n=C(t.evaluateFormula(e));return typeof n==`number`?{numbers:[n]}:{error:n,numbers:[]}});return n.find(({error:e})=>e)?.error??n.flatMap(({numbers:e})=>e)}var Nt=e=>e.filter(Ie).map(A),M=e=>(t,n)=>{let r=At(t,n);return Array.isArray(r)?e(r):r},Pt=(e,t)=>kt(e,t,O(t)).map(({value:e})=>e),Ft=M(e=>e.reduce((e,t)=>e+t,0)),It=M(_t),Lt=M(e=>e.length>0?Math.max(...e):0),Rt=M(e=>e.length>0?Math.min(...e):0),zt=({value:e,isScalar:t})=>!t||typeof C(e)==`number`,Bt=(e,t)=>kt(e,t,t.getRangeValues).filter(zt).length,Vt=M(vt),Ht=M(bt),Ut=M(Ct),Wt=M(St),Gt=e=>e!=null&&e!==``,Kt=(e,t)=>Ot(e)&&t.countFilledCells?t.countFilledCells(e):Pt([e],t).filter(Gt).length,qt=(e,t)=>e.reduce((e,n)=>{let r=n?.trim();return r?e+Kt(r,t):e},0),Jt=(e,t)=>{let n=O(t)(D(t,e,0)),r=ht(t,e,1);return typeof r==`function`?n.filter(r).length:r},Yt=(e,t)=>{let n=D(t,e,0),r=O(t),i=e.length===3?D(t,e,2):n;return{criteriaRange:r(n),valueRange:r(i),matches:ht(t,e,1)}},Xt=(e,t,n)=>e.reduce((e,r,i)=>{if(!n(r))return e;let a=t[i]??``;return x(a)?{...e,error:e.error??a}:{...e,sum:e.sum+A(a),count:e.count+ +!!S(a)}},{sum:0,count:0});k.register({name:`SUM`,handler:Ft,minArgs:1,maxArgs:j,description:`Returns the sum of all numbers in a range`,examples:[`SUM(A1:A10)`,`SUM(B2:B20)`],category:`Statistical`}),k.register({name:`AVERAGE`,handler:It,minArgs:1,maxArgs:j,description:`Returns the average (arithmetic mean) of numbers in a range`,examples:[`AVERAGE(A1:A10)`,`AVERAGE(B2:B20)`],category:`Statistical`}),k.register({name:`MAX`,handler:Lt,minArgs:1,description:`Returns the largest value in a range`,examples:[`MAX(A1:A10)`,`MAX(B2:B20)`],category:`Statistical`}),k.register({name:`MIN`,handler:Rt,minArgs:1,description:`Returns the smallest value in a range`,examples:[`MIN(A1:A10)`,`MIN(B2:B20)`],category:`Statistical`}),k.register({name:`COUNT`,handler:Bt,minArgs:1,maxArgs:j,description:`Counts the number of cells in a range`,examples:[`COUNT(A1:A10)`,`COUNT(B2:B20)`],category:`Statistical`}),k.register({name:`MEDIAN`,handler:Vt,minArgs:1,maxArgs:j,description:`Returns the median (middle) value in a range`,examples:[`MEDIAN(A1:A10)`,`MEDIAN(B2:B20)`],category:`Statistical`}),k.register({name:`MODE`,handler:Ht,minArgs:1,maxArgs:j,description:`Returns the most frequently occurring value in a range`,examples:[`MODE(A1:A10)`,`MODE(B2:B20)`],category:`Statistical`}),k.register({name:`STDEV`,handler:Ut,minArgs:1,maxArgs:j,description:`Returns the standard deviation of numbers in a range`,examples:[`STDEV(A1:A10)`,`STDEV(B2:B20)`],category:`Statistical`}),k.register({name:`VAR`,handler:Wt,minArgs:1,maxArgs:j,description:`Returns the variance of numbers in a range`,examples:[`VAR(A1:A10)`,`VAR(B2:B20)`],category:`Statistical`}),k.register({name:`COUNTA`,handler:qt,minArgs:1,maxArgs:j,description:`Counts the number of non-empty cells in a range`,examples:[`COUNTA(A1:A10)`,`COUNTA(B2:B20)`],category:`Statistical`}),k.register({name:`COUNTIF`,handler:Jt,minArgs:2,maxArgs:2,description:`Counts cells in a range that match a criteria`,examples:[`COUNTIF(A1:A10, ">5")`,`COUNTIF(B1:B10, "Yes")`],category:`Statistical`}),k.register({name:`SUMIF`,handler:(e,t)=>{let{criteriaRange:n,valueRange:r,matches:i}=Yt(e,t);if(typeof i!=`function`)return i;let{sum:a,error:o}=Xt(n,r,i);return o??a},minArgs:2,maxArgs:3,description:`Sums cells in a range that match a criteria`,examples:[`SUMIF(A1:A10, ">5")`,`SUMIF(A1:A10, ">5", B1:B10)`],category:`Statistical`}),k.register({name:`AVERAGEIF`,handler:(e,t)=>{let{criteriaRange:n,valueRange:r,matches:i}=Yt(e,t);if(typeof i!=`function`)return i;let{sum:a,count:o,error:s}=Xt(n,r,i);return s||(o>0?a/o:_)},minArgs:2,maxArgs:3,description:`Averages cells in a range that match a criteria`,examples:[`AVERAGEIF(A1:A10, ">5")`,`AVERAGEIF(A1:A10, ">5", B1:B10)`],category:`Statistical`});var Zt=2,Qt=1,$t=4,N=e=>e.reduce((e,t)=>e+t,0)/e.length,P=e=>{let t=N(e);return e.reduce((e,n)=>e+(n-t)**2,0)};function en(e,t){if(e.length!==t.length)return b;let n=e.flatMap((e,n)=>{let r=t[n];return S(e)&&r!==void 0&&S(r)?[{y:A(e),x:A(r)}]:[]});return{ys:n.map(e=>e.y),xs:n.map(e=>e.x)}}var tn=({ys:e,xs:t})=>{let n=N(e),r=N(t);return e.reduce((e,i,a)=>e+(i-n)*((t[a]??r)-r),0)};function nn(e){if(e.ys.length<Zt)return _;let t=Math.sqrt(P(e.ys)*P(e.xs));return t===0?_:tn(e)/t}function rn(e){if(e.ys.length<Zt)return _;let t=P(e.xs);return t===0?_:tn(e)/t}function an(e){let t=rn(e);return typeof t==`number`?N(e.ys)-t*N(e.xs):t}function on(e){let t=nn(e);return typeof t==`number`?t*t:t}function sn(e,t){if(e.length===0||t<0||t>Qt)return y;let n=[...e].sort((e,t)=>e-t),r=t*(n.length-1),i=n[Math.floor(r)]??0,a=n[Math.ceil(r)]??i;return i+(r-Math.floor(r))*(a-i)}function cn(e,t){let n=Math.trunc(t);return n<0||n>$t?y:sn(e,n/$t)}function ln(e,t){let n=Math.ceil(t);return n<1||n>e.length?y:[...e].sort((e,t)=>t-e)[n-1]??y}function un(e,t){let n=Math.ceil(t);return n<1||n>e.length?y:[...e].sort((e,t)=>e-t)[n-1]??y}function dn(e,t,n){return t.includes(e)?t.filter(t=>n?t<e:t>e).length+1:b}function fn(e){return e.length===0?_:P(e)/e.length}function pn(e){let t=fn(e);return typeof t==`number`?Math.sqrt(t):t}function mn(e,t){return t.some(({range:t})=>t.length!==e)?v:Array.from({length:e},(e,n)=>t.every(({range:e,matches:t})=>t(e[n]??``)))}var F=255,hn=(e,t,n)=>C(t.evaluateFormula(D(t,e,n))),gn=(e,t,n=0)=>{let r=O(t),[i,a]=[r(D(t,e,n)),r(D(t,e,n+1))];return[...i,...a].find(x)??en(i,a)},I=e=>(t,n)=>{let r=gn(t,n);return`ys`in r?e(r):r},_n=e=>(t,n)=>{let r=At([D(n,t,0)],n);if(!Array.isArray(r))return r;let i=hn(t,n,1);return typeof i==`number`?e(r,i):i},vn=(e,t)=>{let n=hn(e,t,0);if(typeof n!=`number`)return n;let r=At([D(t,e,1)],t);if(!Array.isArray(r))return r;let i=e.length>2?hn(e,t,2):0;return typeof i==`number`?dn(n,r,i!==0):i},yn=(e,t,n)=>{let r=O(t),i=Array.from({length:Math.ceil((e.length-n)/2)},(e,t)=>n+t*2).map(n=>({range:r(D(t,e,n)),matches:ht(t,e,n+1)}));return i.map(({matches:e})=>e).find(x)||i.flatMap(({range:e,matches:t})=>typeof t==`function`?[{range:e,matches:t}]:[])},bn=(e,t)=>{let n=O(t)(D(t,e,0)),r=yn(e,t,1);if(!Array.isArray(r))return r;let i=mn(n.length,r);if(!Array.isArray(i))return i;let a=n.filter((e,t)=>i[t]);return a.find(x)??a},xn=(e,t)=>{let n=bn(e,t);return Array.isArray(n)?n.reduce((e,t)=>e+A(t),0):n},Sn=(e,t)=>{let n=bn(e,t);if(!Array.isArray(n))return n;let r=n.filter(S).map(A);return r.length>0?r.reduce((e,t)=>e+t,0)/r.length:_},Cn=e=>(t,n)=>{let r=bn(t,n);if(!Array.isArray(r))return r;let i=r.filter(S).map(A);return i.length>0?i.reduce((t,n)=>e(t,n)):0};[{name:`CORREL`,handler:I(nn),minArgs:2,maxArgs:2,description:`Returns the correlation coefficient of two ranges`,examples:[`CORREL(A2:A20, B2:B20)`]},{name:`SLOPE`,handler:I(rn),minArgs:2,maxArgs:2,description:`Returns the slope of the least-squares line through known_y and known_x`,examples:[`SLOPE(B2:B20, A2:A20)`]},{name:`INTERCEPT`,handler:I(an),minArgs:2,maxArgs:2,description:`Returns where the least-squares line crosses the y axis`,examples:[`INTERCEPT(B2:B20, A2:A20)`]},{name:`RSQ`,handler:I(on),minArgs:2,maxArgs:2,description:`Returns the square of the correlation coefficient`,examples:[`RSQ(B2:B20, A2:A20)`]},{name:`PERCENTILE`,handler:_n(sn),minArgs:2,maxArgs:2,description:`Returns the k-th percentile (k from 0 to 1), interpolated like PERCENTILE.INC`,examples:[`PERCENTILE(A2:A100, 0.9)`]},{name:`QUARTILE`,handler:_n(cn),minArgs:2,maxArgs:2,description:`Returns a quartile (0 to 4), interpolated like QUARTILE.INC`,examples:[`QUARTILE(A2:A100, 1)`]},{name:`LARGE`,handler:_n(ln),minArgs:2,maxArgs:2,description:`Returns the k-th largest value`,examples:[`LARGE(A2:A100, 3)`]},{name:`SMALL`,handler:_n(un),minArgs:2,maxArgs:2,description:`Returns the k-th smallest value`,examples:[`SMALL(A2:A100, 3)`]},{name:`RANK`,handler:vn,minArgs:2,maxArgs:3,description:`Returns the rank of a number in a range (largest first unless order is non-zero)`,examples:[`RANK(A2, A2:A100)`,`RANK(A2, A2:A100, 1)`]},{name:`STDEVP`,handler:M(pn),minArgs:1,maxArgs:F,description:`Returns the population standard deviation`,examples:[`STDEVP(A2:A100)`]},{name:`VARP`,handler:M(fn),minArgs:1,maxArgs:F,description:`Returns the population variance`,examples:[`VARP(A2:A100)`]},{name:`SUMIFS`,handler:xn,minArgs:3,maxArgs:F,description:`Sums the cells whose rows meet every condition`,examples:[`SUMIFS(C2:C100, A2:A100, "East", B2:B100, ">10")`]},{name:`COUNTIFS`,handler:(e,t)=>{let n=yn(e,t,0);if(!Array.isArray(n))return n;let r=mn(n[0]?.range.length??0,n);return Array.isArray(r)?r.filter(Boolean).length:r},minArgs:2,maxArgs:F,description:`Counts the rows that meet every condition`,examples:[`COUNTIFS(A2:A100, "East", B2:B100, ">10")`]},{name:`MAXIFS`,handler:Cn(Math.max),minArgs:3,maxArgs:F,description:`Returns the largest value whose row meets every condition (0 when none does)`,examples:[`MAXIFS(C2:C100, A2:A100, "East")`]},{name:`MINIFS`,handler:Cn(Math.min),minArgs:3,maxArgs:F,description:`Returns the smallest value whose row meets every condition (0 when none does)`,examples:[`MINIFS(C2:C100, A2:A100, "East")`]},{name:`AVERAGEIFS`,handler:Sn,minArgs:3,maxArgs:F,description:`Averages the cells whose rows meet every condition`,examples:[`AVERAGEIFS(C2:C100, A2:A100, "East")`]}].forEach(e=>k.register({...e,category:`Statistical`}));var wn=3,Tn=2;function En(e,t){if(e.ys.length===0)return b;let n=rn(e);return typeof n==`number`?N(e.ys)+n*(t-N(e.xs)):n}function Dn(e){let t=e.ys.length;if(t===0)return b;let n=P(e.xs);if(t<wn||n===0)return _;let r=tn(e)/n,[i,a]=[N(e.ys),N(e.xs)],o=e.ys.reduce((t,n,o)=>t+(n-i-r*((e.xs[o]??a)-a))**2,0);return Math.sqrt(o/(t-2))}function On(e){return e.ys.length===0?_:tn(e)/e.ys.length}function kn(e){return e.ys.length<Tn?_:tn(e)/(e.ys.length-1)}var An=e=>Array.from({length:e},(e,t)=>t+1);function jn(e,t,n,r){if(e.length!==t.length)return Ee;let i=[...e,...t],a=i.find(x);if(a)return a;if(e.length===0||!i.every(S))return v;let o={ys:e.map(A),xs:t.map(A)};return r?Mn(o,n):Nn(o,n)}function Mn(e,t){let n=P(e.xs),r=N(e.ys);return n===0?r:r+tn(e)/n*(t-N(e.xs))}function Nn({ys:e,xs:t},n){let r=t.reduce((e,t)=>e+t*t,0),i=e.reduce((e,n,r)=>e+n*(t[r]??0),0);return r===0?0:i/r*n}function L(e){if(typeof e==`boolean`)return e;if(e==null)return!1;if(typeof e==`number`)return e!==0;if(x(e))return!0;let t=e.trim();if(t===``)return!1;let n=t.toLowerCase();if(n===`true`)return!0;if(n===`false`)return!1;let r=Number(t);return Number.isNaN(r)?!0:r!==0}var Pn=(e,t)=>{let n=hn(e,t,0);if(typeof n!=`number`)return n;let r=gn(e,t,1);return`ys`in r?En(r,n):r};function Fn(e,t){let[n,...r]=kt([e],t,O(t));return n===void 0||r.length>0?v:n.isScalar?C(n.value):x(n.value)?n.value:S(n.value)?A(n.value):v}function In(e,t){let n=e[3]?.trim();if(!n)return!0;let r=t.evaluateFormula(n);return x(r)?r:L(r)}[{name:`FORECAST.LINEAR`,handler:Pn,minArgs:3,maxArgs:3,description:`Returns the value of the least-squares line through known_y and known_x at x`,examples:[`FORECAST.LINEAR(30, B2:B20, A2:A20)`]},{name:`TREND`,handler:(e,t)=>{let n=O(t),r=n(D(t,e,0)),i=e[1]?.trim(),a=i?n(i):An(r.length),o=Fn(D(t,e,2),t);if(typeof o!=`number`)return o;let s=In(e,t);return typeof s==`boolean`?jn(r,a,o,s):s},minArgs:3,maxArgs:4,description:`Returns the least-squares line's value at one new x (known_x defaults to 1, 2, 3, …; const FALSE fits through the origin)`,examples:[`TREND(B2:B20, A2:A20, 30)`,`TREND(B2:B20, , 21)`]},{name:`STEYX`,handler:I(Dn),minArgs:2,maxArgs:2,description:`Returns the standard error of the y predicted by the least-squares line`,examples:[`STEYX(B2:B20, A2:A20)`]},{name:`COVARIANCE.P`,handler:I(On),minArgs:2,maxArgs:2,description:`Returns the population covariance of two ranges`,examples:[`COVARIANCE.P(A2:A20, B2:B20)`]},{name:`COVARIANCE.S`,handler:I(kn),minArgs:2,maxArgs:2,description:`Returns the sample covariance of two ranges`,examples:[`COVARIANCE.S(A2:A20, B2:B20)`]}].forEach(e=>k.register({...e,category:`Statistical`}));var Ln=.5*Math.log(2*Math.PI),Rn=1e-16,zn=1e-300,Bn=2e3,R=e=>Math.abs(e)<zn?zn:e,Vn=10,Hn=7,Un=[.9999999999998099,676.5203681218851,-1259.1392167224028,771.3234287776531,-176.6150291621406,12.507343278686905,-.13857109526572012,9984369578019572e-21,1.5056327351493116e-7],Wn=[1/12,-1/360,1/1260,-1/1680,1/1188,-691/360360,1/156,-3617/122400];function Gn(e){let t=1/(e*e);return Wn.reduceRight((e,n)=>e*t+n,0)/e}function Kn(e){let t=e-1,n=Un.slice(1).reduce((e,n,r)=>e+n/(t+r+1),Un[0]??1),r=t+Hn+.5;return Ln+(t+.5)*Math.log(r)-r+Math.log(n)}function z(e){return e>=Vn?Ln+(e-.5)*Math.log(e)-e+Gn(e):Kn(e)}function qn(e,t){let n=Math.min(e,t),r=Math.max(e,t);if(r>=Vn){let e=Gn(r)-Gn(n+r);return z(n)+e+n-n*Math.log(n+r)+(r-.5)*Math.log1p(-n/(n+r))}return z(n)+z(r)-z(n+r)}function Jn(e,t,n){let r={c:1,d:1/R(1-(t+n)*e/(t+1)),result:0};r.result=r.d;for(let i=1;i<=Bn;i+=1){let a=i*(n-i)*e/((t+2*i-1)*(t+2*i));r.d=1/R(1+a*r.d),r.c=R(1+a/r.c),r.result*=r.d*r.c;let o=-(t+i)*(t+n+i)*e/((t+2*i)*(t+2*i+1));r.d=1/R(1+o*r.d),r.c=R(1+o/r.c);let s=r.d*r.c;if(r.result*=s,Math.abs(s-1)<Rn)return r.result}return r.result}var Yn=1e4,Xn=8;function Zn(e,t,n,r,i){let a={term:1,sum:1};for(let t=0;t<Bn&&a.term>a.sum*Rn;t+=1)a.term*=(r+i+t)/(r+1+t)*e,a.sum+=a.term;return Math.exp(r*t+i*n-qn(r,i))/r*a.sum}function Qn(e,t,n,r){if(e===-1/0)return 0;if(t===-1/0)return 1;let i=Math.exp(e),a=Math.exp(t);if(Math.max(n,r)>=Yn&&a*(n+r)<=Xn)return 1-Zn(a,t,e,r,n);let o=Math.exp(n*e+r*t-qn(n,r));return i<(n+1)/(n+r+2)?o*Jn(i,n,r)/n:1-o*Jn(a,r,n)/r}function $n(e,t){let n={term:1/e,sum:1/e};for(let r=1;r<=Bn&&Math.abs(n.term)>=Math.abs(n.sum)*Rn;r+=1)n.term*=t/(e+r),n.sum+=n.term;return n.sum*Math.exp(-t+e*Math.log(t)-z(e))}function er(e,t){let n={b:t+1-e,c:1/zn,d:0,result:0};n.d=1/R(n.b),n.result=n.d;for(let t=1;t<=Bn;t+=1){let r=-t*(t-e);n.b+=2,n.d=1/R(r*n.d+n.b),n.c=R(n.b+r/n.c);let i=n.d*n.c;if(n.result*=i,Math.abs(i-1)<Rn)break}return Math.exp(-t+e*Math.log(t)-z(e))*n.result}function tr(e,t){return t<=0?1:t<e+1?1-$n(e,t):er(e,t)}var nr=Math.sqrt(2*Math.PI),rr=e=>e===0?0:-e,ir=1e-15,ar=200,or=e=>Math.exp(-.5*e*e)/nr;function sr(e){let t=.5*tr(.5,.5*e*e);return e>=0?t:1-t}var cr=e=>sr(-e),lr=[-39.69683028665376,220.9460984245205,-275.9285104469687,138.357751867269,-30.66479806614716,2.506628277459239],ur=[-54.47609879822406,161.5858368580409,-155.6989798598866,66.80131188771972,-13.28068155288572],dr=[-.007784894002430293,-.3223964580411365,-2.400758277161838,-2.549732539343734,4.374664141464968,2.938163982698783],fr=[.007784695709041462,.3224671290700398,2.445134137142996,3.754408661907416],pr=.02425,mr=(e,t)=>e.reduce((e,n)=>e*t+n,0);function hr(e){if(e<pr){let t=Math.sqrt(-2*Math.log(e));return mr(dr,t)/(mr(fr,t)*t+1)}let t=e-.5,n=t*t;return mr(lr,n)*t/(mr(ur,n)*n+1)}function gr(e){if(e>.5)return rr(gr(1-e));let t={z:hr(e)};for(let n=0;n<3;n+=1){let n=(cr(t.z)-e)/or(t.z);t.z-=n/(1+t.z*n/2)}return t.z}var _r=e=>rr(gr(e));function vr(e,t){return Math.exp(-qn(t/2,.5)-.5*Math.log(t)-(t+1)/2*Math.log1p(e*e/t))}function yr(e){if(e>0){let t=Math.log1p(Math.exp(-e));return{logX:-t,logComplement:-e-t}}let t=Math.log1p(Math.exp(e));return{logX:e-t,logComplement:-t}}function B(e,t){if(e===0)return .5;let{logX:n,logComplement:r}=yr(Math.log(t)-2*Math.log(Math.abs(e))),i=.5*Qn(n,r,t/2,.5);return e>=0?i:1-i}var br=(e,t)=>B(-e,t);function xr(e,t){let n={high:1};for(;B(n.high,t)>e&&n.high<Number.MAX_VALUE/2;)n.high*=2;return n.high}function Sr(e,t,n,r){let i=B(e,n);i>t?r.low=e:r.high=e;let a=e+(Math.log(i)-Math.log(t))*i/vr(e,n);return a>r.low&&a<r.high&&Number.isFinite(a)?a:(r.low+r.high)/2}function Cr(e,t){if(e===.5)return 0;let n={low:0,high:xr(e,t)},r={t:Math.min(Math.max(_r(e),0),n.high)};for(let i=0;i<ar;i+=1){let i=Sr(r.t,e,t,n),a=Math.abs(i-r.t)<=ir*Math.abs(i);if(r.t=i,a)break}return r.t}function wr(e,t){return e>.5?rr(Cr(1-e,t)):Cr(e,t)}var Tr=(e,t)=>rr(wr(e,t));function Er(e){let t=e.length,n=e.reduce((e,t)=>e+t,0)/t;return{count:t,mean:n,variance:e.reduce((e,t)=>e+(t-n)**2,0)/(t-1)}}function Dr(e){let{count:t,mean:n,variance:r}=Er(e);return{t:n/Math.sqrt(r/t),df:t-1}}function Or(e,t){let n=e.count+t.count-2,r=((e.count-1)*e.variance+(t.count-1)*t.variance)/n;return{t:(e.mean-t.mean)/Math.sqrt(r*(1/e.count+1/t.count)),df:n}}function kr(e,t){let n=e.variance/e.count,r=t.variance/t.count,i=(n+r)**2/(n**2/(e.count-1)+r**2/(t.count-1));return{t:(e.mean-t.mean)/Math.sqrt(n+r),df:i}}var Ar=({t:e,df:t},n)=>n*B(Math.abs(e),t),jr=(e,t,n)=>C(t.evaluateFormula(D(t,e,n)));function Mr(e,t,n){let r=t.evaluateFormula(D(t,e,n));return x(r)?r:L(r)}function Nr(e,t,n){let r=Array.from({length:n},(n,r)=>jr(e,t,r));return r.find(e=>typeof e!=`number`)??r.filter(e=>typeof e==`number`)}var V=(e,t)=>(n,r)=>{let i=Nr(n,r,e);return Array.isArray(i)?t(i):i},Pr=e=>{let t=Math.trunc(e);return t>=1?t:null},Fr=e=>e>0&&e<1,Ir=(e,t)=>{let n=Nr(e,t,2);if(!Array.isArray(n))return n;let[r=0,i=0]=n,a=Mr(e,t,2);if(typeof a!=`boolean`)return a;let o=Pr(i);return o===null?y:a?br(r,o):vr(r,o)},Lr=([e=0,t=0])=>{let n=Pr(t);return n===null||e<0?y:2*B(e,n)},Rr=([e=0,t=0])=>{let n=Pr(t);return n===null?y:B(e,n)},zr=([e=0,t=0])=>{let n=Pr(t);return n===null||!Fr(e)?y:Tr(e,n)},Br=([e=0,t=0])=>{let n=Pr(t);return n===null||e<=0||e>1?y:wr(e/2,n)},Vr=1,Hr=2,Ur=3;function Wr([e,t]){let n=en(e,t);return`ys`in n?Dr(n.ys.map((e,t)=>e-(n.xs[t]??0))):n}function Gr([e,t],n){let[r,i]=[Er(Nt(e)),Er(Nt(t))];return n===Hr?Or(r,i):kr(r,i)}var Kr=e=>`t`in e&&!(Number.isFinite(e.t)&&Number.isFinite(e.df))?_:e,qr=(e,t)=>{let n=O(t),r=[n(D(t,e,0)),n(D(t,e,1))],i=r.flat().find(x);if(i)return i;let a=[jr(e,t,2),jr(e,t,3)],o=a.find(e=>typeof e!=`number`);if(o)return o;let[s,c]=a.map(e=>Math.trunc(Number(e)));if(s!==1&&s!==2||c===void 0||c<Vr||c>Ur)return y;let l=Kr(c===Vr?Wr(r):Gr(r,c));return`t`in l?Ar(l,s===1?1:2):l},Jr=(e,t)=>{let n=Nr(e,t,3);if(!Array.isArray(n))return n;let[r=0,i=0,a=0]=n,o=Mr(e,t,3);if(typeof o!=`boolean`)return o;if(a<=0)return y;let s=(r-i)/a;return o?cr(s):or(s)/a},Yr=(e,t)=>{let n=jr(e,t,0);if(typeof n!=`number`)return n;let r=Mr(e,t,1);return typeof r==`boolean`?r?cr(n):or(n):r},Xr=([e=0,t=0,n=0])=>!Fr(e)||n<=0?y:t+n*gr(e),Zr=([e=0])=>Fr(e)?gr(e):y;function Qr([e=0,t=0,n=0]){let r=Math.trunc(n);return!Fr(e)||t<=0||r<1?y:{alpha:e,sd:t,size:r}}[{name:`T.TEST`,handler:qr,minArgs:4,maxArgs:4,description:`Returns the p-value of a t-test: tails 1 or 2; type 1 paired, 2 equal variance, 3 unequal variance (Welch)`,examples:[`T.TEST(A2:A20, B2:B20, 2, 3)`]},{name:`T.DIST`,handler:Ir,minArgs:3,maxArgs:3,description:`Returns the left-tailed Student's t distribution (cumulative TRUE) or its density`,examples:[`T.DIST(1.96, 30, TRUE)`]},{name:`T.DIST.2T`,handler:V(2,Lr),minArgs:2,maxArgs:2,description:`Returns the two-tailed Student's t distribution for x >= 0`,examples:[`T.DIST.2T(1.96, 30)`]},{name:`T.DIST.RT`,handler:V(2,Rr),minArgs:2,maxArgs:2,description:`Returns the right-tailed Student's t distribution`,examples:[`T.DIST.RT(1.96, 30)`]},{name:`T.INV`,handler:V(2,zr),minArgs:2,maxArgs:2,description:`Returns the t value with the given left-tailed probability`,examples:[`T.INV(0.975, 30)`]},{name:`T.INV.2T`,handler:V(2,Br),minArgs:2,maxArgs:2,description:`Returns the t value whose two tails hold the given probability`,examples:[`T.INV.2T(0.05, 30)`]},{name:`NORM.DIST`,handler:Jr,minArgs:4,maxArgs:4,description:`Returns the normal distribution (cumulative TRUE) or its density`,examples:[`NORM.DIST(42, 40, 1.5, TRUE)`]},{name:`NORM.S.DIST`,handler:Yr,minArgs:2,maxArgs:2,description:`Returns the standard normal distribution (cumulative TRUE) or its density`,examples:[`NORM.S.DIST(1.96, TRUE)`]},{name:`NORM.INV`,handler:V(3,Xr),minArgs:3,maxArgs:3,description:`Returns the value with the given cumulative normal probability`,examples:[`NORM.INV(0.9, 40, 1.5)`]},{name:`NORM.S.INV`,handler:V(1,Zr),minArgs:1,maxArgs:1,description:`Returns the z with the given cumulative standard normal probability`,examples:[`NORM.S.INV(0.975)`]},{name:`CONFIDENCE.NORM`,handler:V(3,e=>{let t=Qr(e);return`size`in t?_r(t.alpha/2)*t.sd/Math.sqrt(t.size):t}),minArgs:3,maxArgs:3,description:`Returns the half-width of a confidence interval for a mean, using the normal distribution`,examples:[`CONFIDENCE.NORM(0.05, 2.5, 50)`]},{name:`CONFIDENCE.T`,handler:V(3,e=>{let t=Qr(e);return`size`in t?t.size===1?_:wr(t.alpha/2,t.size-1)*t.sd/Math.sqrt(t.size):t}),minArgs:3,maxArgs:3,description:`Returns the half-width of a confidence interval for a mean, using Student's t distribution`,examples:[`CONFIDENCE.T(0.05, 1, 50)`]}].forEach(e=>k.register({...e,category:`Statistical`}));var $r=3,ei=4,ti=e=>e.reduce((e,t)=>e+t,0)/e.length;function ni(e,t){let n=ti(e),r=e.map(e=>e-n),i=Math.sqrt(r.reduce((e,t)=>e+t*t,0)/(e.length-1));return i===0?null:r.reduce((e,n)=>e+(n/i)**t,0)}function ri(e){let t=e.length,n=t<$r?null:ni(e,3);return n===null?_:t/((t-1)*(t-2))*n}function ii(e){let t=e.length,n=t<ei?null:ni(e,4);return n===null?_:t*(t+1)/((t-1)*(t-2)*(t-3))*n-3*(t-1)**2/((t-2)*(t-3))}var ai=(e,t,n)=>n>0?(e-t)/n:y;function oi(e){return e.length===0||e.some(e=>e<=0)?y:Math.exp(ti(e.map(Math.log)))}function si(e){return e.length===0||e.some(e=>e<=0)?y:e.length/e.reduce((e,t)=>e+1/t,0)}function ci(e,t){let n=e.length-1,r=e.filter(e=>e<t).length;if(e[r]===t)return r/n;let i=e[r-1]??t,a=e[r]??t;return(r-1+(t-i)/(a-i))/n}function li(e,t,n){let r=Math.trunc(n);if(r<1||e.length===0)return y;let i=Array.from(Float64Array.from(e).sort()),[a,o]=[i[0],i.at(-1)];if(a===void 0||o===void 0||t<a||t>o)return b;if(i.length===1)return 1;let s=10**r;return Math.floor(ci(i,t)*s*(1+2**-52*4))/s}var ui=255,di=3,fi=(e,t,n)=>C(t.evaluateFormula(D(t,e,n))),pi=e=>(t,n)=>{let r=At(t,n);return Array.isArray(r)?e(r):r};[{name:`SKEW`,handler:pi(ri),minArgs:1,maxArgs:ui,description:`Returns the skewness of a sample`,examples:[`SKEW(A2:A100)`]},{name:`KURT`,handler:pi(ii),minArgs:1,maxArgs:ui,description:`Returns the excess kurtosis of a sample`,examples:[`KURT(A2:A100)`]},{name:`STANDARDIZE`,handler:(e,t)=>{let n=[0,1,2].map(n=>fi(e,t,n)),r=n.find(e=>typeof e!=`number`);if(r)return r;let[i=0,a=0,o=0]=n.map(Number);return ai(i,a,o)},minArgs:3,maxArgs:3,description:`Returns (x - mean) / standard deviation`,examples:[`STANDARDIZE(A2, AVERAGE(A2:A100), STDEV(A2:A100))`]},{name:`PERCENTRANK.INC`,handler:(e,t)=>{let n=fi(e,t,1);if(typeof n!=`number`)return n;let r=e.length>2?fi(e,t,2):di;if(typeof r!=`number`)return r;let i=At([D(t,e,0)],t);return Array.isArray(i)?li(i,n,r):i},minArgs:2,maxArgs:3,description:`Returns the rank of x in a range as a fraction from 0 to 1, to significance digits (3 by default)`,examples:[`PERCENTRANK.INC(A2:A100, A2)`]},{name:`GEOMEAN`,handler:pi(oi),minArgs:1,maxArgs:ui,description:`Returns the geometric mean of positive numbers`,examples:[`GEOMEAN(A2:A20)`]},{name:`HARMEAN`,handler:pi(si),minArgs:1,maxArgs:ui,description:`Returns the harmonic mean of positive numbers`,examples:[`HARMEAN(A2:A20)`]}].forEach(e=>k.register({...e,category:`Statistical`}));var mi=10,hi=e=>mi**+e,gi=15,_i=e=>Number(e.toPrecision(gi)),vi=(e,t,n)=>{if(hi(t)===0)return 0;let r=Math.abs(e)*hi(t);return!Number.isFinite(r)||Number.isInteger(r)&&r!==0?e:Math.sign(e)*n(_i(r))/hi(t)},yi=(e,t,n)=>{let r=e/t;return!Number.isFinite(r)||Number.isInteger(r)?e:_i(n(_i(r))*t)};function bi(e,t){return vi(e,t,Math.round)}function xi(e,t){return hi(t)===0&&e!==0?y:vi(e,t,Math.ceil)}function Si(e,t){return vi(e,t,Math.floor)}var Ci=(e,t)=>e===0||Math.sign(e)===Math.sign(t);function wi(e,t){return t===0?_:Ci(e,t)?yi(e,t,Math.floor):y}function Ti(e,t){return t===0?0:Ci(e,t)?yi(e,t,Math.ceil):y}function Ei(e,t){return t===0?_:e-t*Math.floor(e/t)}function Di(e,t){if(e<0&&!Number.isInteger(t))return y;if(e===0&&t<0)return _;if(e===0&&t===0)return y;let n=e**+t;return Number.isFinite(n)?n:y}function Oi(e){return e<=0?y:Math.log(e)}function ki(e,t){let n=Oi(e);return x(n)?n:t<=0||t===1?y:n/Math.log(t)}function Ai(e){return e<=0?y:Math.log10(e)}function ji(e){return e<0?y:Math.sqrt(e)}k.register({name:`ROUND`,handler:(e,t)=>bi(A(t.evaluateFormula(D(t,e,0))),A(t.evaluateFormula(D(t,e,1)))),minArgs:2,maxArgs:2,description:`Rounds a number to a specified number of digits`,examples:[`ROUND(3.14159, 2)`,`ROUND(A1, 0)`],category:`Mathematical`}),k.register({name:`ROUNDUP`,handler:(e,t)=>xi(A(t.evaluateFormula(D(t,e,0))),A(t.evaluateFormula(D(t,e,1)))),minArgs:2,maxArgs:2,description:`Rounds a number up, away from zero`,examples:[`ROUNDUP(3.14159, 2)`,`ROUNDUP(A1, 0)`],category:`Mathematical`}),k.register({name:`ROUNDDOWN`,handler:(e,t)=>Si(A(t.evaluateFormula(D(t,e,0))),A(t.evaluateFormula(D(t,e,1)))),minArgs:2,maxArgs:2,description:`Rounds a number down, toward zero`,examples:[`ROUNDDOWN(3.14159, 2)`,`ROUNDDOWN(A1, 0)`],category:`Mathematical`}),k.register({name:`FLOOR`,handler:(e,t)=>wi(A(t.evaluateFormula(D(t,e,0))),A(t.evaluateFormula(D(t,e,1)))),minArgs:2,maxArgs:2,description:`Rounds a number down to the nearest multiple of significance`,examples:[`FLOOR(3.7, 1)`,`FLOOR(24, 5)`],category:`Mathematical`}),k.register({name:`CEILING`,handler:(e,t)=>Ti(A(t.evaluateFormula(D(t,e,0))),A(t.evaluateFormula(D(t,e,1)))),minArgs:2,maxArgs:2,description:`Rounds a number up to the nearest multiple of significance`,examples:[`CEILING(3.2, 1)`,`CEILING(24, 5)`],category:`Mathematical`}),k.register({name:`ABS`,handler:(e,t)=>{let n=C(t.evaluateFormula(D(t,e,0)));return x(n)?n:Math.abs(n)},minArgs:1,maxArgs:1,description:`Returns the absolute value of a number`,examples:[`ABS(-5)`,`ABS(A1)`],category:`Mathematical`}),k.register({name:`POWER`,handler:(e,t)=>Di(A(t.evaluateFormula(D(t,e,0))),A(t.evaluateFormula(D(t,e,1)))),minArgs:2,maxArgs:2,description:`Returns the result of a number raised to a power`,examples:[`POWER(2, 3)`,`POWER(A1, 2)`],category:`Mathematical`}),k.register({name:`SQRT`,handler:(e,t)=>ji(A(t.evaluateFormula(D(t,e,0)))),minArgs:1,maxArgs:1,description:`Returns the square root of a number`,examples:[`SQRT(16)`,`SQRT(A1)`],category:`Mathematical`}),k.register({name:`MOD`,handler:(e,t)=>Ei(A(t.evaluateFormula(D(t,e,0))),A(t.evaluateFormula(D(t,e,1)))),minArgs:2,maxArgs:2,description:`Returns the remainder after division`,examples:[`MOD(10, 3)`,`MOD(A1, 2)`],category:`Mathematical`}),k.register({name:`INT`,handler:(e,t)=>{let n=A(t.evaluateFormula(D(t,e,0)));return Math.floor(n)},minArgs:1,maxArgs:1,description:`Rounds a number down to the nearest integer`,examples:[`INT(3.7)`,`INT(A1)`],category:`Mathematical`}),k.register({name:`TRUNC`,handler:(e,t)=>Si(A(t.evaluateFormula(D(t,e,0))),e.length===2?A(t.evaluateFormula(D(t,e,1))):0),minArgs:1,maxArgs:2,description:`Truncates a number to a specified number of decimal places`,examples:[`TRUNC(3.14159, 2)`,`TRUNC(A1)`],category:`Mathematical`}),k.register({name:`SIGN`,handler:(e,t)=>{let n=C(t.evaluateFormula(D(t,e,0)));return x(n)?n:Math.sign(n)},minArgs:1,maxArgs:1,description:`Returns the sign of a number (1, 0, or -1)`,examples:[`SIGN(-5)`,`SIGN(A1)`],category:`Mathematical`}),k.register({name:`PI`,handler:()=>Math.PI,minArgs:0,maxArgs:0,description:`Returns the value of pi (3.14159...)`,examples:[`PI()`,`PI()*2`],category:`Mathematical`}),k.register({name:`EXP`,handler:(e,t)=>{let n=A(t.evaluateFormula(D(t,e,0)));return Math.exp(n)},minArgs:1,maxArgs:1,description:`Returns e raised to the power of a number`,examples:[`EXP(1)`,`EXP(A1)`],category:`Mathematical`}),k.register({name:`LN`,handler:(e,t)=>Oi(A(t.evaluateFormula(D(t,e,0)))),minArgs:1,maxArgs:1,description:`Returns the natural logarithm of a number`,examples:[`LN(10)`,`LN(A1)`],category:`Mathematical`}),k.register({name:`LOG`,handler:(e,t)=>ki(A(t.evaluateFormula(D(t,e,0))),e.length===2?A(t.evaluateFormula(D(t,e,1))):10),minArgs:1,maxArgs:2,description:`Returns the logarithm of a number to a specified base`,examples:[`LOG(100)`,`LOG(8, 2)`],category:`Mathematical`}),k.register({name:`LOG10`,handler:(e,t)=>Ai(A(t.evaluateFormula(D(t,e,0)))),minArgs:1,maxArgs:1,description:`Returns the base-10 logarithm of a number`,examples:[`LOG10(100)`,`LOG10(A1)`],category:`Mathematical`});function H(e,t){let n={position:t};for(;n.position>0&&e[n.position-1]===`\\`;)--n.position;return(t-n.position)%2==1}function Mi(e){return na(Ki(e))}function Ni(e,t){return e===``?t:t===e?``:e}function Pi(e){let t=e.split(``),n=[],r=``;return t.forEach((t,i)=>{(t===`"`||t===`'`)&&!H(e,i)&&(r=Ni(r,t)),n.push(t===`&`&&r===``?`+`:t)}),n.join(``)}function Fi(e){let t=[],n={openQuote:``};return e.split(``).forEach((r,i)=>{(r===`"`||r===`'`)&&!H(e,i)&&(n.openQuote=Ni(n.openQuote,r));let a=t.at(-1);n.openQuote===``&&(r===`-`||r===`+`)&&a===r&&t.push(` `),t.push(r)}),t.join(``)}function Ii(e){return e.replace(/([^<>!])=([^=])/g,`$1==$2`)}function Li(e){return/^[\d+\-*/(). ]+$/.test(e)}function Ri(e){return/^[\d+\-*/(). <>!=]+$/.test(e)}var zi=/^(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?/,Bi=/^[A-Za-z_$][\w$]*/,Vi=/^\s+/;function Hi(e,t){let n=e[t],r=Array.from(e.slice(t+1)).findIndex((r,i)=>r===n&&!H(e,t+1+i));return r===-1?e.length:t+r+2}var Ui={"(":`open`,")":`close`,"^":`caret`},Wi=[{kind:`number`,pattern:zi},{kind:`word`,pattern:Bi},{kind:`space`,pattern:Vi}];function Gi(e,t){let n=e[t];if(n===`"`||n===`'`)return{kind:`literal`,text:e.slice(t,Hi(e,t))};let r=e.slice(t),i=Wi.map(({kind:e,pattern:t})=>({kind:e,text:t.exec(r)?.[0]})).find(e=>e.text!==void 0);return i?.text===void 0?{kind:Ui[n]??`symbol`,text:n}:{kind:i.kind,text:i.text}}function Ki(e){let t=[],n={position:0};for(;n.position<e.length;){let r=Gi(e,n.position);t.push(r),n.position+=r.text.length}return t}var qi=e=>e?.kind===`symbol`&&(e.text===`-`||e.text===`+`);function Ji(e,t){let n={depth:0};return e.findIndex((e,r)=>r<t?!1:(e.kind===`open`&&(n.depth+=1),e.kind===`close`&&--n.depth,n.depth===0))}function Yi(e,t){let n=e[t];if(n===void 0)return null;if(n.kind===`number`||n.kind===`literal`||n.kind===`word`)return{text:n.text,end:t+1};if(n.kind!==`open`)return null;let r=Ji(e,t);return r===-1?null:{text:`(${na(e.slice(t+1,r))})`,end:r+1}}function Xi(e,t){let n={index:t};for(;qi(e[n.index])||e[n.index]?.kind===`space`;)n.index+=1;let r=Yi(e,n.index);if(r===null)return null;let i=e.slice(t,n.index),a=i.filter(e=>e.kind===`symbol`).map(e=>e.text),o=i.map(e=>e.text).join(``);return{text:a.join(` `)+r.text,source:o+r.text,signed:a.length>0,end:r.end}}function Zi(e,t){let n={index:t};for(;e[n.index]?.kind===`space`;)n.index+=1;return e[n.index]?.kind===`caret`?n.index:-1}var Qi=e=>e.signed?`(${e.text})`:e.text;function $i(e,t){let n={text:Qi(t),end:t.end,links:0};for(let t=Zi(e,n.end);t!==-1;t=Zi(e,n.end)){let r=Xi(e,t+1);if(r===null)break;let i=n.links===0?n.text:`(${n.text})`;Object.assign(n,{text:`${i}**${Qi(r)}`,end:r.end,links:n.links+1})}return n.links===0?{text:t.source,end:t.end}:n}var ea=e=>e===void 0||e.kind===`open`||e.kind===`symbol`||e.kind===`caret`,ta=(e,t)=>e.kind!==`space`&&(!qi(e)||ea(t));function na(e){let t=[],n={index:0,previous:void 0};for(;n.index<e.length;){let r=e[n.index],i=ta(r,n.previous)?Xi(e,n.index):null,a=i===null?null:$i(e,i);t.push(a===null?r.kind===`caret`?`**`:r.text:a.text);let o=a===null?n.index+1:a.end;r.kind!==`space`&&(n.previous=e[o-1]),n.index=o}return t.join(``)}var ra=e=>e===`"`||e===`'`;function ia(e){let t={quote:``,depth:0};return e.split(``).map((n,r)=>{let i=ra(n)&&!H(e,r)&&(t.quote===``||t.quote===n),a=t.quote!==``||i;i&&(t.quote=t.quote===``?n:``),!a&&n===`)`&&--t.depth;let o={char:n,inLiteral:a,depth:t.depth};return!a&&n===`(`&&(t.depth+=1),o})}var aa=(e,t)=>!e.inLiteral&&t.includes(e.char);function oa(e){let t=ia(e).flatMap((e,t)=>e.depth===0&&aa(e,`&`)?[t]:[]);return[-1,...t].map((n,r)=>e.slice(n+1,t[r]??e.length))}function sa(e){let t=ia(e),n=t.flatMap((e,t)=>e.depth===0&&aa(e,`(`)?[t]:[]),r=e=>t.findIndex((t,n)=>n>e&&t.depth===0&&aa(t,`)`));return n.map(e=>({open:e,close:r(e)})).filter(({close:e})=>e>0)}function ca(e){let{pieces:t,cursor:n}=sa(e).reduce((t,{open:n,close:r})=>({pieces:[...t.pieces,e.slice(t.cursor,n+1),fa(e.slice(n+1,r))],cursor:r}),{pieces:[],cursor:0});return[...t,e.slice(n)].join(``)}var la={true:`"TRUE"`,false:`"FALSE"`};function ua(e){let t=e.trim(),n=ia(t);return t.startsWith(`(`)&&n.findIndex((e,t)=>t>0&&e.depth===0&&aa(e,`)`))===t.length-1?ua(t.slice(1,-1)):t}var da=e=>la[ua(e)]??e;function fa(e){let t=oa(e).map(ca);return t.length===1?t[0]??``:`(""+${t.map(e=>`(${da(e)})`).join(`+`)})`}function pa(e){if(ia(e).some(e=>aa(e,`=<>`)))return Pi(e);let t=oa(e);return t.length>1&&t.some(e=>e.trim()===``)?Pi(e):fa(e)}function ma(e){let t=oa(e),n=t.flatMap(e=>sa(e).flatMap(({open:t,close:n})=>ma(e.slice(t+1,n))));return t.length>1?[...t,...n]:n}var ha=`
2
+ \v\f\r _-,;:!?.'"()[]{}@*/\\&#%\`^+<=>|~$0123456789abcdefghijklmnopqrstuvwxyz`,ga=74,_a=8,va=14,ya=31,ba=127;function xa(e){let t=e.codePointAt(0)??0;return t<=_a||t>=va&&t<=ya||t===ba}var Sa=/^[\u0300-\u036f]$/u,Ca=`34f.332.313 343.314.301 341.300 340.306.302.30c.30a.342.308.344.30b.303.307.338.327.328.304.30d 30e 312 315 31a 33d 33e 33f 346 34a 34b 34c 350 351 352 357 35b 35d 35e.316 317 318 319 31c 31d 31e 31f 320 329 32a 32b 32c 32f 333 33a 33b 33c 347 348 349 34d 34e 353 354 355 356 359 35a 35c 35f 362.336 337.335.305.309.30f.310.311.31b.321.322.323.324.325.326.32d.32e.330.331.334.339.345.358.360.361`.split(`.`),wa=0,Ta=`aeioucdhmrtvx`,Ea=867,Da=e=>Ta.charAt((e.codePointAt(0)??0)-Ea)||e,Oa=new Map(Ca.flatMap((e,t)=>e.split(` `).map(e=>[String.fromCodePoint(Number.parseInt(e,16)),t])));function ka(e){let t=ha.indexOf(e);return t>=0?t:ga+(e.codePointAt(0)??0)}function Aa(e){let t={primary:[],accents:[]};return Array.from(e.normalize(`NFD`)).filter(e=>!xa(e)).map(Da).forEach(e=>{let n=t.accents.at(-1);if(Sa.test(e)&&n!==void 0){let t=Oa.get(e)??wa;t!==wa&&n.push(t)}else t.primary.push(ka(e.toLowerCase())),t.accents.push([])}),t}function ja(e,t){let n=Math.min(e.length,t.length);for(let r=0;r<n;r+=1){let[n,i]=[e[r],t[r]];if(n!==void 0&&i!==void 0&&n!==i)return n<i?-1:1}return e.length-t.length}function Ma(e,t){return e.reduce((e,n,r)=>e||ja(n,t[r]??[]),0)}function Na(e,t){let[n,r]=[Aa(e),Aa(t)];return ja(n.primary,r.primary)||Ma(n.accents,r.accents)}var Pa=[`<>`,`<=`,`>=`,`=`,`<`,`>`],Fa=`=<>!`;function Ia(e){let t=[];return ia(e).forEach((e,n)=>{if(e.inLiteral||e.depth!==0||!Fa.includes(e.char))return;let r=t.at(-1);r!==void 0&&r.start+r.text.length===n?r.text+=e.char:t.push({start:n,text:e.char})}),t}var La=e=>Pa.some(t=>t===e);function Ra(e){let t=Ia(e);if(t.length===0)return null;let n=t.map(e=>e.text);if(!n.every(La))return null;let r=[{start:0,text:``},...t].map((n,r)=>({from:n.start+n.text.length,to:t[r]?.start??e.length})).map(({from:t,to:n})=>e.slice(t,n).trim());return r.some(e=>e===``)?null:{operands:r,operators:n.filter(La)}}var za=0,Ba=1,Va=2,Ha=e=>typeof e==`number`?za:typeof e==`boolean`?Va:Ba;function Ua(e,t){let n=Ha(e)-Ha(t);return n===0?typeof e==`number`&&typeof t==`number`?e-t:typeof e==`boolean`&&typeof t==`boolean`?Number(e)-Number(t):Na(String(e),String(t)):n}var Wa={"=":e=>e===0,"<>":e=>e!==0,"<":e=>e<0,">":e=>e>0,"<=":e=>e<=0,">=":e=>e>=0};function Ga(e,t,n){return Wa[e](Ua(t,n))}function Ka(e,t){return t.reduce((t,n,r)=>Ga(n,t,e[r+1]??``),e[0]??``)}var qa=e=>typeof e==`number`?0:typeof e!=`boolean`&&``;function Ja(e,t){return e.map((n,r)=>t[r]?r===0?qa(e[1]??0):r===1&&qa(e[0]??0):n)}var Ya=[`>=`,`<=`,`<>`,`!=`,`==`,`=`,`>`,`<`];function*Xa(e){let t=null;for(let n=0;n<e.length;n++){let r=e[n];t===null?r===`"`||r===`'`?t=r:yield n:r===`\\`?n++:r===t&&(t=null)}}function Za(e){let t=e.trim();for(;t.startsWith(`(`)&&t.endsWith(`)`);){let e=0,n=!0;for(let r of Xa(t)){let i=t[r];if(i===`(`)e++;else if(i===`)`){if(e--,e===0&&r<t.length-1){n=!1;break}if(e<0)return t}}if(!n||e!==0)return t;t=t.slice(1,-1).trim()}return t}function Qa(e){let t=Za(e);for(let e of Xa(t))for(let n of Ya)if(t.startsWith(n,e))return{left:t.slice(0,e).trim(),operator:n,right:t.slice(e+n.length).trim()};return null}function $a(e){return e.length>=2&&(e.startsWith(`"`)&&e.endsWith(`"`)||e.startsWith(`'`)&&e.endsWith(`'`))?{value:e.slice(1,-1).replace(/\\(["'\\])/g,`$1`),quoted:!0}:{value:e,quoted:!1}}function eo(e){let{value:t,quoted:n}=$a(e.trim());if(n)return t;if(t===``)return``;let r=t.toUpperCase();if(r===`TRUE`)return!0;if(r===`FALSE`)return!1;let i=Number(t);return Number.isNaN(i)?t:i}var to={">=":`>=`,"<=":`<=`,"<>":`<>`,"!=":`<>`,"==":`=`,"=":`=`,">":`>`,"<":`<`};function no(e,t){let[n,r]=[t(e.left),t(e.right)],i=e.left===``?qa(r):n,a=e.right===``?qa(n):r;return Ga(to[e.operator],i,a)}function ro(e){return typeof e==`boolean`?e:typeof e==`number`?e!==0:e!==``}function io(e,t){let n=Qa(e);return n?no(n,t):ro(t(Za(e)))}function ao(e){if(e==null)return`""`;let t=x(e)?e.code:e;return typeof t==`string`?`"${t.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}"`:t.toString()}var oo=/^(?:'((?:[^']|'')+)'|([^!]+))!(.+)$/;function so(e){let[,t,n,r]=e.match(oo)??[],i=t===void 0?n:t.replace(/''/g,`'`);return i===void 0||r===void 0?null:{sheetName:i,ref:r}}function co(e,t){let n=e.indexOf(`'`,t+1);return n===-1?-1:e[n+1]===`'`?co(e,n+1):n+1}var lo=e=>e.trim()===``;function uo(e,t){let n={at:t-1};for(;n.at>=0&&(lo(e[n.at]??``)||e[n.at]===`(`);)--n.at;return n.at<0?``:e[n.at]??``}function fo(e,t){let n={at:t};for(;n.at<e.length&&(lo(e[n.at]??``)||e[n.at]===`)`);)n.at+=1;return n.at>=e.length?``:e[n.at]??``}var po=e=>e===``||e===`&`;function mo(e,t,n){let r=uo(e,t),i=fo(e,n);return po(r)&&po(i)&&(r===`&`||i===`&`)}var U={div_zero:`#DIV/0!`,invalid_ref:`#REF!`,syntax:`#NAME?`,unknown:`#ERROR!`},ho={[U.div_zero]:`div_zero`,[U.invalid_ref]:`invalid_ref`,[U.syntax]:`syntax`},W=class extends Error{errorType;display;constructor(e,t,n){super(n??t),this.errorType=e,this.display=t,this.name=`FormulaError`}},go=e=>e instanceof W,_o=()=>new W(`div_zero`,U.div_zero,`Division by zero`),vo=e=>new W(`invalid_ref`,U.invalid_ref,`Invalid reference: ${e}`),yo=e=>new W(`syntax`,U.syntax,`Unknown function: ${e}`),bo=e=>new W(`unknown`,U.unknown,e),xo=e=>new W(ho[e]??`unknown`,e,`Propagated error: ${e}`),So=e=>go(e)?{type:e.errorType,display:e.display}:{type:`unknown`,display:U.unknown},Co=/("(?:[^"\\]|\\.|"")*"?|'(?:[^']|'')*'?)/,wo=/(?<![\w$.!])(TRUE|FALSE)(?![\w$.]|\s*[(!])/gi;function To(e){return e.split(Co).map((e,t)=>t%2==1?e:e.replace(wo,e=>e.toLowerCase())).join(``)}var Eo=/^\(*\s*(true|false)\s*\)*$/;function Do(e){let[,t]=e.trim().match(Eo)??[];return t===void 0?null:t===`true`}function Oo(e){return/["']/.test(e)?e:e.replace(/\btrue\b/g,`1`).replace(/\bfalse\b/g,`0`)}var ko=RegExp(`^(${it})\\((.*)\\)$`,`i`),Ao=RegExp(`^(${it})\\(`,`i`);function jo(e){if(e==null)return`0`;let t=x(e)?e.code:e;return typeof t==`string`?`"${t.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}"`:t.toString()}function Mo(e){let t=``,n=null;for(let r=0;r<e.length;r++){let i=e[r];if(n!==null){if(i===`\\`){r++;continue}i===n&&(n=null,t+=i)}else(i===`"`||i===`'`)&&(n=i),t+=i}return t}function No(e){let t=Mo(e).replace(/\b(?:true|false)\b/g,``);return/^[\d+\-*/(). "']*$/.test(t)}function Po(e,t){let n=e[t],r=t+1;for(;r<e.length;)if(e[r]===`\\`)r+=2;else{if(e[r]===n)return r+1;r++}return e.length}function Fo(e,t){let n=co(e,t);if(n===-1||e[n]!==`!`)return null;let r=e.substring(n+1).match(/^(\$?[A-Z]+\$?\d+)/);return r?e.substring(t,n+1+r[0].length):null}function Io(e,t){let n=e.substring(t),r=n.match(/^([A-Z][A-Z0-9]*)!/i);if(r){let e=n.substring(r[0].length).match(/^(\$?[A-Z]+\$?\d+)/);if(e)return r[0]+e[0]}let i=n.match(/^(\$?[A-Z]+\$?\d+)/);return i?i[0]:null}function Lo(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(r===`"`){n=Po(e,n);continue}if(r===`'`){let r=Fo(e,n);r?(t.push({ref:r,start:n}),n+=r.length):n=Po(e,n);continue}let i=Io(e,n);i?(t.push({ref:i,start:n}),n+=i.length):n++}return t}function Ro(e,t,n){return[...t].reverse().reduce((e,{ref:t,start:r})=>e.slice(0,r)+n(t,r)+e.slice(r+t.length),e)}function zo(e){let t=[],n=``,r=0,i=!1,a=``;for(let o=0;o<e.length;o++){let s=e[o];(s===`"`||s===`'`)&&!H(e,o)?(i?s===a&&(i=!1,a=``):(i=!0,a=s),n+=s):!i&&(s===`(`&&r++,s===`)`&&r--,s===`,`&&r===0)?(t.push(n.trim()),n=``):n+=s}return n.trim()&&t.push(n.trim()),t}function Bo(e){let t;try{t=Function(`return (${Fi(e)})`)()}catch{throw bo()}if(typeof t==`number`){if(!Number.isFinite(t))throw _o();return t}if(typeof t==`string`||typeof t==`boolean`)return t;throw bo()}function Vo(e){if(!e.includes(`&`))return null;let t=pa(e);return No(t)?(ma(e).filter(Li).forEach(Bo),Bo(t)):null}var Ho=/^\(*\s*(true|false)\s*\)*$/i,Uo=e=>(e.startsWith(`"`)||e.startsWith(`'`))&&e.endsWith(e[0]??``)&&Po(e,0)===e.length;function Wo(e){let t=Ho.exec(e)?.[1];if(t!==void 0)return t.toLowerCase()===`true`;let n=Vo(e);return n===null?Li(e)||Uo(Za(e))?Bo(e):null:n}var Go=e=>e!==null;function Ko(e,t){let n=Ra(e),r=t.isCellEmpty;return!n||!r?null:n.operands.map(e=>{let t=qo(e);return t!==null&&r(t)})}function qo(e){let t=Za(e).trim(),[n,...r]=Lo(t);return n&&r.length===0&&n.start===0&&n.ref.length===t.length?n.ref:null}function Jo(e,t){let n=To(e),r=n.trim();if(Uo(r)){let e=r.slice(1,-1),n=Ye(e,t.preferDDMMYYYY);return n===null?e:n}let[,i,a]=n.match(ko)??[];if(i!==void 0&&a!==void 0&&at(i)){let e=0,n=!0;for(let t of a)if(t===`(`)e++;else if(t===`)`&&(e--,e<0)){n=!1;break}let r=i.toUpperCase(),o=k.get(r);if(o&&n){let e=zo(a);if(o.minArgs!==void 0&&e.length<o.minArgs)throw nt(r,o.minArgs);if(o.maxArgs!==void 0&&e.length>o.maxArgs)throw Error(`${r} accepts at most ${o.maxArgs} argument${o.maxArgs===1?``:`s`}`);return o.handler(e,{functionName:r,getCellValue:t.getCellValue,getRangeValues:t.getRangeValues,getRangeValuesRaw:t.getRangeValuesRaw,getRangeValuesKeepingBlanks:t.getRangeValuesKeepingBlanks,countFilledCells:t.countFilledCells,evaluateFormula:t.evaluateFormula,isBlankReference:e=>{let n=qo(e);return n!==null&&t.isCellEmpty?.(n)===!0},preferDDMMYYYY:t.preferDDMMYYYY})}if(n&&!o)throw yo(r)}let o=n,s=0,c=0;for(;s<o.length&&c<100;){if(c++,o[s]===`"`||o[s]===`'`){s=Po(o,s);continue}let[,e]=o.substring(s).match(Ao)??[];if(e===void 0||!at(e)){if(s++,s>=o.length)break;continue}let n=s,r=s+e.length+1,i=1,a=r,l=!1,u=``;for(;a<o.length&&i>0;){let e=o[a];(e===`"`||e===`'`)&&!H(o,a)&&(l?e===u&&(l=!1,u=``):(l=!0,u=e)),l||(e===`(`?i++:e===`)`&&i--),a++}if(i===0){let e=o.substring(n,a),r=t.evaluateFormula(e);if(x(r))throw xo(r.code);let i=typeof r==`string`?jo(r):`(${r})`;o=o.substring(0,n)+i+o.substring(a),s=n+i.length}else s++}let l=Lo(o),u=l.length===1?l[0]:void 0;if(u){let e=o.slice(0,u.start),n=o.slice(u.start+u.ref.length);if(e.trim()===``&&n.trim()===``)return t.getCellValue(u.ref)}let d=o,f=Ko(d,t);o=Ro(o,l,(e,n)=>{if(mo(d,n,n+e.length)&&t.isCellEmpty?.(e))return`""`;let r=t.getCellValue(e),i=Me(r);if(i!==null)throw xo(i);return jo(r)}),o=o.replace(/"([^"]+)"/g,(e,n)=>{let r=Ye(n,t.preferDDMMYYYY);return r===null?e:r.toString()}),o=Mi(o);let p=Ra(o);if(p){let e=p.operands.map(Wo),t=f?.length===e.length;if(e.every(Go))return Ka(t?Ja(e,f):e,p.operators)}let ee=Vo(o);if(ee!==null)return ee;let m=Do(o);if(m!==null)return m;if(o=Oo(o),Ri(o))return Bo(Ii(o));if(Li(o))return Bo(o);let h=o.trim();return h.startsWith(`"`)&&h.endsWith(`"`)||h.startsWith(`'`)&&h.endsWith(`'`)?h.slice(1,-1):o}k.register({name:`IF`,handler:(e,t)=>{let n=D(t,e,0),r=D(t,e,1),i=D(t,e,2),a=L(t.evaluateFormula(n))?r:i;return/^["'](.*)["']$/.test(a)?a.slice(1,-1):t.evaluateFormula(a)},minArgs:3,maxArgs:3,description:`Returns one value if a condition is true and another if false`,examples:[`IF(A1>10, "High", "Low")`,`IF(B2>=5, SUM(C1:C10), 0)`],category:`Logical`}),k.register({name:`AND`,handler:(e,t)=>{for(let n of e)if(!L(t.evaluateFormula(n.trim())))return!1;return!0},minArgs:1,description:`Returns TRUE if all arguments are true`,examples:[`AND(A1>5, B1<10)`,`AND(A1>0, B1>0, C1>0)`],category:`Logical`}),k.register({name:`OR`,handler:(e,t)=>{for(let n of e)if(L(t.evaluateFormula(n.trim())))return!0;return!1},minArgs:1,description:`Returns TRUE if any argument is true`,examples:[`OR(A1>5, B1<10)`,`OR(A1>0, B1>0)`],category:`Logical`}),k.register({name:`NOT`,handler:(e,t)=>!L(t.evaluateFormula(D(t,e,0))),minArgs:1,maxArgs:1,description:`Reverses the logical value of its argument`,examples:[`NOT(A1>5)`,`NOT(B1)`],category:`Logical`}),k.register({name:`IFERROR`,handler:(e,t)=>{try{let n=t.evaluateFormula(D(t,e,0));return Ne(n)?t.evaluateFormula(D(t,e,1)):n}catch{return t.evaluateFormula(D(t,e,1))}},minArgs:2,maxArgs:2,description:`Returns a value if expression is an error, otherwise returns the expression`,examples:[`IFERROR(A1/B1, 0)`,`IFERROR(VLOOKUP(A1, B1:C10, 2), "Not found")`],category:`Logical`}),k.register({name:`IFNA`,handler:(e,t)=>{let n=t.evaluateFormula(D(t,e,0)),r=x(n)&&n.code===b.code;return n==null||r?t.evaluateFormula(D(t,e,1)):n},minArgs:2,maxArgs:2,description:`Returns a value if expression is #N/A, otherwise returns the expression`,examples:[`IFNA(A1, "N/A")`,`IFNA(MATCH(A1, B1:B10), 0)`],category:`Logical`}),k.register({name:`IFS`,handler:(e,t)=>{if(e.length<2||e.length%2!=0)throw Error(`IFS requires an even number of arguments (condition-value pairs)`);for(let n=0;n<e.length;n+=2){let r=D(t,e,n),i=D(t,e,n+1);if(io(Ro(r,Lo(r),e=>ao(t.getCellValue(e))),e=>{let n=eo(e);return typeof n==`string`&&n===e.trim()?t.evaluateFormula(e):n}))return/^["'](.*)["']$/.test(i)?i.slice(1,-1):t.evaluateFormula(i)}return b},minArgs:2,description:`Checks multiple conditions and returns the first true result`,examples:[`IFS(A1>90, "A", A1>80, "B", A1>70, "C")`,`IFS(B1="Yes", 1, B1="No", 0)`],category:`Logical`}),k.register({name:`TRUE`,handler:()=>!0,minArgs:0,maxArgs:0,description:`Returns the logical value TRUE`,examples:[`TRUE()`,`IF(A1>0, TRUE(), FALSE())`],category:`Logical`}),k.register({name:`FALSE`,handler:()=>!1,minArgs:0,maxArgs:0,description:`Returns the logical value FALSE`,examples:[`FALSE()`,`IF(A1>0, TRUE(), FALSE())`],category:`Logical`});function Yo(e){return/[YMD]|MMM|DD|YYYY|h:mm|AM\/PM/i.test(e)}var Xo=/YYYY|YY|MMMM|MMM|MM|M|dddd|ddd|DD|D|AM\/PM|am\/pm|HH|H|hh|h|mm|ss/g;function Zo(e,t){let n=T(e),r=n.getUTCFullYear(),i=n.getUTCMonth(),a=n.getUTCDate(),o=n.getUTCHours(),s=n.getUTCMinutes(),c=n.getUTCSeconds(),l=n.getUTCDay(),u=/AM\/PM|am\/pm/.test(t),d=o%12||12,f=o>=12,p={YYYY:r.toString(),YY:(r%100).toString().padStart(2,`0`),MMMM:Be[i]??Be[0],MMM:ze[i]??ze[0],MM:(i+1).toString().padStart(2,`0`),M:(i+1).toString(),dddd:He[l]??He[0],ddd:Ve[l]??Ve[0],DD:a.toString().padStart(2,`0`),D:a.toString(),"AM/PM":f?`PM`:`AM`,"am/pm":f?`pm`:`am`,HH:o.toString().padStart(2,`0`),H:o.toString(),hh:(u?d:o).toString().padStart(2,`0`),h:(u?d:o).toString(),mm:s.toString().padStart(2,`0`),ss:c.toString().padStart(2,`0`)};return t.replace(Xo,e=>p[e]??e)}var Qo=3,$o=e=>Array.from(e).reduce((t,n,r)=>r>0&&(e.length-r)%Qo===0?`${t},${n}`:`${t}${n}`,``),es=e=>{let[t,...n]=e.split(`.`);return t===void 0?e:[$o(t),...n].join(`.`)};function ts(e,t){if(!t)return e.toString();try{if(Yo(t))return Zo(e,t);if(t.includes(`$`)){let n=(t.match(/\.0+/)||[``])[0].length-1,r=Math.abs(e).toFixed(n>=0?n:0),i=`$`+(t.includes(`,`)?es(r):r);return e<0?`-`+i:i}if(t.includes(`%`)){let n=(t.match(/\.0+/)||[``])[0].length-1;return(e*100).toFixed(n>=0?n:2)+`%`}if(t.includes(`,`)){let n=(t.match(/\.0+/)||[``])[0].length-1,r=es(Math.abs(e).toFixed(n>=0?n:0));return e<0?`-`+r:r}let n=(t.match(/\.0+/)||[``])[0].length-1;return n>=0?e.toFixed(n):e.toString()}catch(t){return console.error(`Format error:`,t),e.toString()}}var ns=100,rs=`?\\*_[]"@;/`,is=/[#0][#0,.]*/,as=/[#0]/,os=/0+$/,ss=(e,t)=>Array.from(e).filter(e=>t.includes(e)).length,cs=e=>Array.from(e).some(e=>rs.includes(e)),ls=e=>{let t=is.exec(e);if(!t||t[0].endsWith(`,`))return null;let n=e.slice(0,t.index),r=e.slice(t.index+t[0].length);if(as.test(r)||cs(n)||cs(r))return null;let[i,a=``,...o]=t[0].split(`.`);return i===void 0||o.length>0?null:{prefix:n,suffix:r,useGrouping:i.includes(`,`),integerMinDigits:ss(i,`0`),minDecimals:ss(a,`0`),maxDecimals:ss(a,`#0`),isPercent:n.includes(`%`)||r.includes(`%`)}},us=(e,t)=>{let n=e.replace(os,``);return n.length>=t?n:e.slice(0,t)},ds=(e,t)=>{let n=e.toFixed(t.maxDecimals),r=n.indexOf(`.`),i=r===-1?n:n.slice(0,r),a=r===-1?``:n.slice(r+1),o=i.padStart(t.integerMinDigits,`0`),s=t.useGrouping?$o(o):o,c=us(a,t.minDecimals);return c?`${s}.${c}`:s},fs=e=>Array.from(e).every(e=>e===`0`||e===`,`||e===`.`),ps=(e,t)=>{if(!Number.isFinite(e))return null;let n=ls(t);if(!n)return null;let r=n.isPercent?e*ns:e,i=ds(Math.abs(r),n);return`${r<0&&!fs(i)?`-`:``}${n.prefix}${i}${n.suffix}`},ms=e=>/[\p{L}\p{M}]/u.test(e),hs=e=>{let t=Array.from(e);return t.map((e,n)=>{let r=t[n-1];return r===void 0||!ms(r)?e.toUpperCase():e.toLowerCase()}).join(``)},gs=e=>!Number.isFinite(e)||e<0?v:Math.trunc(e),_s=(e,t)=>{let n=gs(t);return x(n)?n:e.substring(0,n)},vs=(e,t)=>{let n=gs(t);return x(n)?n:e.substring(e.length-n)},ys=(e,t,n,r)=>{let i=e.split(t);return r>i.length-1?e:i.slice(0,r).join(t)+n+i.slice(r).join(t)},bs=(e,t,n,r)=>{if(t===``)return e;if(r===void 0)return e.split(t).join(n);let i=Math.trunc(r);return!Number.isFinite(i)||i<=0?v:ys(e,t,n,i)},xs=(e,t)=>e.isBlankReference?.(t)?``:ot(e.evaluateFormula(t)),G=(e,t,n)=>xs(e,D(e,t,n)),Ss=(e,t)=>e.map(e=>xs(t,e.trim())).join(``),Cs=Ss,ws=(e,t)=>_s(G(t,e,0),e.length===2?Number(t.evaluateFormula(D(t,e,1))):1),Ts=(e,t)=>vs(G(t,e,0),e.length===2?Number(t.evaluateFormula(D(t,e,1))):1),Es=(e,t,n)=>{let r=gs(n);if(x(r))return r;if(!Number.isFinite(t)||t<1)return v;let i=Math.trunc(t)-1;return e.substring(i,i+r)},Ds=(e,t)=>Es(G(t,e,0),Number(t.evaluateFormula(D(t,e,1))),Number(t.evaluateFormula(D(t,e,2)))),Os=(e,t)=>G(t,e,0).length,ks=(e,t)=>G(t,e,0).toUpperCase(),As=(e,t)=>G(t,e,0).toLowerCase(),js=(e,t)=>hs(G(t,e,0)),Ms=(e,t)=>G(t,e,0).trim().replace(/\s+/g,` `),Ns=(e,t)=>bs(G(t,e,0),G(t,e,1),G(t,e,2),e.length===4?Number(t.evaluateFormula(D(t,e,3))):void 0),Ps=(e,t)=>{let n=G(t,e,0),r=Number(t.evaluateFormula(D(t,e,1)))-1,i=Number(t.evaluateFormula(D(t,e,2))),a=G(t,e,3);return n.substring(0,r)+a+n.substring(r+i)},Fs=(e,t,n,r)=>{let i=r.caseInsensitive?e.toLowerCase():e,a=(r.caseInsensitive?t.toLowerCase():t).indexOf(i,n);return a===-1?v:a+1},Is=e=>(t,n)=>Fs(G(n,t,0),G(n,t,1),t.length===3?Number(n.evaluateFormula(D(n,t,2)))-1:0,{caseInsensitive:e}),Ls=Is(!1),Rs=Is(!0),zs=e=>e.replace(/^["']/,``).replace(/["']$/,``),Bs=(e,t)=>{let n=t.evaluateFormula(D(t,e,0)),r=zs(G(t,e,1));return typeof n==`number`?ps(n,r)??ot(n):ot(n)},Vs=/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/,Hs=e=>{if(!Vs.test(e))return null;let t=Number(e);return Number.isFinite(t)?t:null},Us=e=>{let t=e.replace(/[$,]/g,``).trim();if(t.endsWith(`%`)){let e=Hs(t.slice(0,-1).trim());return e===null?v:e/100}let n=Hs(t);return n===null?v:n};k.register({name:`CONCATENATE`,handler:Ss,minArgs:1,description:`Joins several text strings into one string`,examples:[`CONCATENATE("Hello", " ", "World")`,`CONCATENATE(A1, B1)`],category:`Text`}),k.register({name:`CONCAT`,handler:Cs,minArgs:1,description:`Joins several text strings into one string (same as CONCATENATE)`,examples:[`CONCAT("Hello", " ", "World")`,`CONCAT(A1, B1)`],category:`Text`}),k.register({name:`LEFT`,handler:ws,minArgs:1,maxArgs:2,description:`Returns the leftmost characters from a text string`,examples:[`LEFT("Hello", 2)`,`LEFT(A1, 3)`],category:`Text`}),k.register({name:`RIGHT`,handler:Ts,minArgs:1,maxArgs:2,description:`Returns the rightmost characters from a text string`,examples:[`RIGHT("Hello", 2)`,`RIGHT(A1, 3)`],category:`Text`}),k.register({name:`MID`,handler:Ds,minArgs:3,maxArgs:3,description:`Returns characters from the middle of a text string`,examples:[`MID("Hello", 2, 3)`,`MID(A1, 1, 5)`],category:`Text`}),k.register({name:`LEN`,handler:Os,minArgs:1,maxArgs:1,description:`Returns the number of characters in a text string`,examples:[`LEN("Hello")`,`LEN(A1)`],category:`Text`}),k.register({name:`UPPER`,handler:ks,minArgs:1,maxArgs:1,description:`Converts text to uppercase`,examples:[`UPPER("hello")`,`UPPER(A1)`],category:`Text`}),k.register({name:`LOWER`,handler:As,minArgs:1,maxArgs:1,description:`Converts text to lowercase`,examples:[`LOWER("HELLO")`,`LOWER(A1)`],category:`Text`}),k.register({name:`PROPER`,handler:js,minArgs:1,maxArgs:1,description:`Capitalizes the first letter of each word`,examples:[`PROPER("hello world")`,`PROPER(A1)`],category:`Text`}),k.register({name:`TRIM`,handler:Ms,minArgs:1,maxArgs:1,description:`Removes extra spaces from text`,examples:[`TRIM(" hello world ")`,`TRIM(A1)`],category:`Text`}),k.register({name:`SUBSTITUTE`,handler:Ns,minArgs:3,maxArgs:4,description:`Replaces old text with new text in a string`,examples:[`SUBSTITUTE("Hello World", "World", "Earth")`,`SUBSTITUTE(A1, "old", "new", 1)`],category:`Text`}),k.register({name:`REPLACE`,handler:Ps,minArgs:4,maxArgs:4,description:`Replaces part of a text string with a different text string`,examples:[`REPLACE("Hello World", 7, 5, "Earth")`,`REPLACE(A1, 1, 3, "New")`],category:`Text`}),k.register({name:`FIND`,handler:Ls,minArgs:2,maxArgs:3,description:`Finds one text string within another (case-sensitive)`,examples:[`FIND("o", "Hello")`,`FIND("World", A1)`],category:`Text`}),k.register({name:`SEARCH`,handler:Rs,minArgs:2,maxArgs:3,description:`Finds one text string within another (case-insensitive)`,examples:[`SEARCH("O", "Hello")`,`SEARCH("world", A1)`],category:`Text`}),k.register({name:`TEXT`,handler:Bs,minArgs:2,maxArgs:2,description:`Formats a number and converts it to text`,examples:[`TEXT(1234.5, "$#,##0.00")`,`TEXT(0.5, "0%")`],category:`Text`}),k.register({name:`VALUE`,handler:(e,t)=>Us(ot(t.evaluateFormula(D(t,e,0)))),minArgs:1,maxArgs:1,description:`Converts a text string to a number`,examples:[`VALUE("123")`,`VALUE("$1,234.56")`],category:`Text`}),k.register({name:`EXACT`,handler:(e,t)=>G(t,e,0)===G(t,e,1),minArgs:2,maxArgs:2,description:`Checks if two text strings are exactly the same`,examples:[`EXACT("Hello", "hello")`,`EXACT(A1, B1)`],category:`Text`});function Ws(e,t,n,r,i){if(e===0)return-(r+n*t);let a=(1+e)**+t;return-r*a-n*(a-1)*(1+e*i)/e}function Gs(e,t,n,r,i){if(e===0)return-(r+n)/t;let a=(1+e)**+t;return-e*(r+n*a)/((a-1)*(1+e*i))}function Ks(e,t,n,r,i,a){let o=Gs(e,n,r,i,a);if(t===1&&a===1)return 0;let s=Ws(e,a===1?t-2:t-1,o,r,a)*e;return a===1?s/(1+e):s}function qs(e,t,n,r,i,a){return Gs(e,n,r,i,a)-Ks(e,t,n,r,i,a)}function Js(e,t,n,r,i){if(e===0)return-(r+n*t);let a=(1+e)**+t;return(-r-n*(a-1)*(1+e*i)/e)/a}function Ys(e,t,n,r,i){if(e===0)return-(r+n)/t;let a=t*(1+e*i);return Math.log((a-r*e)/(a+n*e))/Math.log(1+e)}var Xs=100,K=1e-7;function Zs(e,t,n,r,i,a){let o=a;for(let a=0;a<Xs;a++){Math.abs(o)<K&&(o=K);let a=(1+o)**+e,s=n*a+t*((a-1)/o)*(1+o*i)+r,c=e*n*(1+o)**(e-1)+t*(1+o*i)*(e*(1+o)**(e-1)*o-(a-1))/(o*o)+t*i*((a-1)/o),l=o-s/c;if(Math.abs(l-o)<K)return Number.isFinite(l)?l:y;o=l}return y}function Qs(e,t){return t.reduce((t,n,r)=>t+n/(1+e)**+(r+1),0)}function $s(e,t){return e.reduce((e,n,r)=>{let i=(1+t)**+r;return{npv:e.npv+n/i,dnpv:e.dnpv-r*n/(i*(1+t))}},{npv:0,dnpv:0})}function ec(e,t){let n=t;for(let t=0;t<Xs;t++){let{npv:t,dnpv:r}=$s(e,n);if(Math.abs(t)<K)return n;if(Math.abs(r)<K)return y;let i=n-t/r;if(Math.abs(i-n)<K)return Number.isFinite(i)?i:y;n=i}return y}var q=(e,t,n,r)=>{let i=n=>A(t.evaluateFormula(D(t,e,n))),a=Array.from({length:n},(e,t)=>i(t)),o=r.map((t,r)=>e.length>n+r?i(n+r):t);return[...a,...o]},tc=(e,t)=>{let[n,r,i,a,o]=q(e,t,3,[0,0]);return Ws(n,r,i,a,o)},nc=(e,t)=>{let[n,r,i,a,o]=q(e,t,3,[0,0]);return Js(n,r,i,a,o)},rc=(e,t)=>{let[n,r,i,a,o]=q(e,t,3,[0,0]);return Gs(n,r,i,a,o)},ic=(e,t)=>{let[n,r,i,a,o]=q(e,t,3,[0,0]);return Ys(n,r,i,a,o)},ac=(e,t)=>{let[n,r,i,a,o,s]=q(e,t,3,[0,0,.1]);return Zs(n,r,i,a,o,s)},oc=e=>(t,n)=>{let[r,i,a,o,s,c]=q(t,n,4,[0,0]);return e(r,i,a,o,s,c)},sc=oc(Ks),cc=oc(qs),lc=(e,t)=>e.flatMap(e=>(e.includes(`:`)?t.getRangeValues(e):[t.evaluateFormula(e)]).map(A));k.register({name:`FV`,handler:tc,minArgs:3,maxArgs:5,description:`Calculates the future value of an investment based on periodic, constant payments and a constant interest rate`,examples:[`FV(0.06/12, 12, -100, -1000, 1)`,`FV(A1, A2, A3)`],category:`Financial`}),k.register({name:`PV`,handler:nc,minArgs:3,maxArgs:5,description:`Calculates the present value of an investment based on periodic, constant payments and a constant interest rate`,examples:[`PV(0.08/12, 12*20, 500, 0, 0)`,`PV(A1, A2, A3)`],category:`Financial`}),k.register({name:`PMT`,handler:rc,minArgs:3,maxArgs:5,description:`Calculates the payment for a loan based on constant payments and a constant interest rate`,examples:[`PMT(0.06/12, 30*12, 250000)`,`PMT(A1, A2, A3)`],category:`Financial`}),k.register({name:`NPER`,handler:ic,minArgs:3,maxArgs:5,description:`Calculates the number of periods for an investment based on periodic, constant payments and a constant interest rate`,examples:[`NPER(0.06/12, -1000, 50000, 0, 0)`,`NPER(A1, A2, A3)`],category:`Financial`}),k.register({name:`RATE`,handler:ac,minArgs:3,maxArgs:6,description:`Calculates the interest rate per period of an annuity using iteration`,examples:[`RATE(12, -100, 1000, 0, 0, 0.1)`,`RATE(A1, A2, A3)`],category:`Financial`}),k.register({name:`IPMT`,handler:sc,minArgs:4,maxArgs:6,description:`Calculates the interest payment for a given period for an investment`,examples:[`IPMT(0.06/12, 1, 30*12, 250000)`,`IPMT(A1, A2, A3, A4)`],category:`Financial`}),k.register({name:`PPMT`,handler:cc,minArgs:4,maxArgs:6,description:`Calculates the payment on the principal for a given period for an investment`,examples:[`PPMT(0.06/12, 1, 30*12, 250000)`,`PPMT(A1, A2, A3, A4)`],category:`Financial`}),k.register({name:`NPV`,handler:(e,t)=>Qs(A(t.evaluateFormula(D(t,e,0))),lc(e.slice(1),t)),minArgs:2,description:`Calculates the net present value of an investment based on a discount rate and a series of future cash flows`,examples:[`NPV(0.1, -10000, 3000, 4200, 6800)`,`NPV(A1, B1:B10)`],category:`Financial`}),k.register({name:`IRR`,handler:(e,t)=>{let n=t.getRangeValues(D(t,e,0)).map(A),r=e.length===2?A(t.evaluateFormula(D(t,e,1))):.1;if(n.length===0)throw Error(`IRR requires at least one value`);return ec(n,r)},minArgs:1,maxArgs:2,description:`Calculates the internal rate of return for a series of cash flows`,examples:[`IRR(A1:A5, 0.1)`,`IRR(B1:B10)`],category:`Financial`});function uc(e){let t=0;for(let n=0;n<e.length;n++)t=t*26+(e.charCodeAt(n)-64);return t-1}function J(e){let t=``,n=e+1;for(;n>0;){let e=(n-1)%26;t=String.fromCharCode(65+e)+t,n=Math.floor((n-1)/26)}return t}var dc=/\$?[A-Z]+\$?\d+:\$?[A-Z]+\$?\d+/g,fc=/\$?[A-Z]+\$?\d+/g;function pc(e){return e.startsWith(`=`)?e.slice(1):e}var mc=/^([A-Z]+)(\d+)$/;function hc(e){let[,t,n]=e.match(mc)??[];return t===void 0||n===void 0?null:{col:uc(t),rowNumber:parseInt(n,10)}}function gc(e){let[t,n,...r]=e.split(`:`);if(t===void 0||n===void 0||r.length>0)return null;let i=hc(t),a=hc(n);return i&&a?{start:i,end:a}:null}function _c(e){let t=gc(e.replace(/\$/g,``));if(!t)return[];let{start:n,end:r}=t,i=[];for(let e=n.rowNumber-1;e<=r.rowNumber-1;e++)for(let t=n.col;t<=r.col;t++)i.push({row:e,col:t});return i}function vc(e){let t=e.trim().toUpperCase();if(t.includes(`:`)){let e=_c(t);return e.length>0?e:null}let n=yc(t);return n?[n]:null}function yc(e){let t=hc(e.replace(/\$/g,``));return t?{col:t.col,row:t.rowNumber-1}:null}var bc=/^\$?[A-Za-z]+\$?\d+$/;function xc(e){let t=e.lastIndexOf(`!`),n=t>=0?e.slice(0,t+1):``,r=t>=0?e.slice(t+1):e,i=r.split(`:`).every(e=>bc.test(e))?gc(r.replace(/\$/g,``).toUpperCase()):null;if(!i)return null;let{start:a,end:o}=i;return{sheetPrefix:n,startCol:a.col,startRow:a.rowNumber,endCol:o.col,endRow:o.rowNumber}}var Sc=0,Cc=1;function wc(e,t){let n=Math.trunc(e);return Number.isFinite(n)?n===Sc?t===1?0:null:n<Cc||n>t?null:n-Cc:null}function Tc(e,t,n){let r=wc(t,e.endRow-e.startRow+1),i=wc(n,e.endCol-e.startCol+1);return r===null||i===null?null:{colIndex:e.startCol+i,row:e.startRow+r}}function Ec(e,t){let n=Math.trunc(e);return!Number.isFinite(n)||n<Cc||n>t?null:n-Cc}function Dc(e){let t=pc(e),n=[],r=new Set,i=e=>{let t=`${e.row},${e.col}`;r.has(t)||(r.add(t),n.push(e))};for(let e of t.match(dc)??[])for(let t of _c(e))i(t);let a=t.replace(dc,``);for(let e of a.match(fc)??[]){let t=yc(e);t&&i(t)}return n}function Oc(e){if(typeof e==`boolean`)return e;if(typeof e==`number`)return e!==0;if(x(e))return!1;let t=e.trim().toUpperCase();return t===`TRUE`||t===`1`}var kc=(e,t)=>Array.from({length:Math.max(0,t-e+1)},(t,n)=>e+n),Ac=(e,t,n,r,i)=>kc(r,i).map(r=>e.getCellValue(`${t}${n}${r}`)),jc=(e,t,n,r,i)=>kc(r,i).map(r=>e.getCellValue(`${t}${J(r)}${n}`)),Mc=(e,t)=>e.reduce((e,n,r)=>t(n)?r:e,-1),Nc=(e,t)=>{let n=e.findIndex(e=>!t(e));return(n===-1?e.length:n)-1},Pc=(e,t)=>typeof e==`number`&&typeof t==`number`?e-t:String(e).localeCompare(String(t)),Fc=(e,t,n=1,r=1)=>{if(n===0){let n=typeof e==`string`&&(e.includes(`*`)||e.includes(`?`))?ft(e):t=>t==e;return r===1?t.findIndex(n):Mc(t,n)}return n===1?Nc(t,t=>Pc(t,e)<=0):n===-1?Nc(t,t=>Pc(t,e)>=0):-1};k.register({name:`VLOOKUP`,handler:(e,t)=>{let n=t.evaluateFormula(D(t,e,0)),r=xc(D(t,e,1));if(!r)throw Error(`Invalid table array range`);let i=A(t.evaluateFormula(D(t,e,2))),a=+!!Oc(e.length!==4||t.evaluateFormula(D(t,e,3))),o=Ec(i,r.endCol-r.startCol+1);if(o===null)return Ee;let s=J(r.startCol),c=Fc(n,Ac(t,r.sheetPrefix,s,r.startRow,r.endRow),a);if(c===-1)return b;let l=J(r.startCol+o),u=r.startRow+c;return t.getCellValue(`${r.sheetPrefix}${l}${u}`)},minArgs:3,maxArgs:4,description:`Looks for a value in the leftmost column of a table, and then returns a value in the same row from a column you specify`,examples:[`VLOOKUP(105, A2:C10, 2)`,`VLOOKUP("Smith", A2:E10, 5, FALSE)`],category:`Lookup & Reference`}),k.register({name:`HLOOKUP`,handler:(e,t)=>{let n=t.evaluateFormula(D(t,e,0)),r=xc(D(t,e,1));if(!r)throw Error(`Invalid range format`);let i=A(t.evaluateFormula(D(t,e,2))),a=+!!Oc(e.length!==4||t.evaluateFormula(D(t,e,3))),o=Ec(i,r.endRow-r.startRow+1);if(o===null)return Ee;let s=Fc(n,jc(t,r.sheetPrefix,r.startRow,r.startCol,r.endCol),a);if(s===-1)return b;let c=J(r.startCol+s),l=r.startRow+o;return t.getCellValue(`${r.sheetPrefix}${c}${l}`)},minArgs:3,maxArgs:4,description:`Looks for a value in the top row of a table, and then returns a value in the same column from a row you specify`,examples:[`HLOOKUP("Axles", A1:C10, 2, TRUE)`],category:`Lookup & Reference`}),k.register({name:`MATCH`,handler:(e,t)=>{let n=t.evaluateFormula(D(t,e,0)),r=D(t,e,1),i=e.length===3?A(t.evaluateFormula(D(t,e,2))):1,a=Fc(n,rt(t)(r),i);return a===-1?b:a+1},minArgs:2,maxArgs:3,description:`Returns the relative position of an item in an array that matches a specified value`,examples:[`MATCH(25, A1:A10, 0)`,`MATCH("b", A1:A5, 0)`],category:`Lookup & Reference`}),k.register({name:`INDEX`,handler:(e,t)=>{let n=xc(D(t,e,0));if(!n)throw Error(`Invalid range format`);let r=Tc(n,A(t.evaluateFormula(D(t,e,1))),e.length>=3?A(t.evaluateFormula(D(t,e,2))):1);return r?t.getCellValue(`${n.sheetPrefix}${J(r.colIndex)}${r.row}`):Ee},minArgs:2,maxArgs:4,description:`Returns the value of an element in a table or an array, selected by the row and column number indexes`,examples:[`INDEX(A1:B5, 2, 2)`,`INDEX(A1:A10, 5)`],category:`Lookup & Reference`}),k.register({name:`XLOOKUP`,handler:(e,t)=>{let n=t.evaluateFormula(D(t,e,0)),r=D(t,e,1),i=D(t,e,2),a=e.length>=4?t.evaluateFormula(D(t,e,3)):b,o=e.length>=5?A(t.evaluateFormula(D(t,e,4))):0,s=e.length>=6?A(t.evaluateFormula(D(t,e,5))):1,c=rt(t),l=c(r),u=c(i),d=-1;if(o===0||o===2)d=Fc(n,l,0,s);else{let e=1/0;for(let t=0;t<l.length;t++){let r=s===1?t:l.length-1-t,i=l[r];if(i==n){d=r;break}if(typeof i==`number`&&typeof n==`number`){let t=i-n;o===-1&&t<0&&Math.abs(t)<e?(e=Math.abs(t),d=r):o===1&&t>0&&t<e&&(e=t,d=r)}}}if(d===-1)return a;let f=u[d];return f===void 0?b:f},minArgs:3,maxArgs:6,description:`Searches a range or an array, and returns an item corresponding to the first match it finds`,examples:[`XLOOKUP(A1, B1:B10, C1:C10)`,`XLOOKUP("USA", Countries, Populations)`],category:`Lookup & Reference`});var Ic=864e5,Y=12;function Lc(e,t){let n=e.getUTCMonth()+t,r=e.getUTCFullYear()+Math.floor(n/Y),i=(n%Y+Y)%Y,a=new Date(Date.UTC(r,i+1,0)).getUTCDate(),o=Math.min(e.getUTCDate(),a);return new Date(Date.UTC(r,i,o))}function Rc(e,t,n){if(e>t)return y;let r=T(e),i=T(t),a=i.getUTCFullYear()-r.getUTCFullYear(),o=i.getUTCMonth()-r.getUTCMonth(),s=i.getUTCDate()-r.getUTCDate();switch(n.toUpperCase()){case`Y`:{let e=a;return o<0||o===0&&s<0?e-1:e}case`M`:{let e=a*Y+o;return s<0?e-1:e}case`D`:return Math.floor(t-e);case`MD`:{let e=Lc(r,a*Y+o-+(s<0)),t=Date.UTC(i.getUTCFullYear(),i.getUTCMonth(),i.getUTCDate());return Math.round((t-e.getTime())/Ic)}case`YM`:{let e=s<0?o-1:o;return e<0?e+Y:e}case`YD`:{let e=new Date(r);return e.setUTCFullYear(i.getUTCFullYear()),e.getTime()-i.getTime()>0&&e.setUTCFullYear(i.getUTCFullYear()-1),Math.floor((i.getTime()-e.getTime())/Ic)}default:return y}}k.register({name:`NOW`,handler:()=>{let e=new Date;return w(new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds())))},minArgs:0,maxArgs:0,description:`Returns the serial number of the current date and time`,examples:[`NOW()`],category:`Date & Time`}),k.register({name:`TODAY`,handler:()=>{let e=new Date;return w(new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())))},minArgs:0,maxArgs:0,description:`Returns the serial number of today's date`,examples:[`TODAY()`],category:`Date & Time`}),k.register({name:`DATE`,handler:(e,t)=>{let n=A(t.evaluateFormula(D(t,e,0))),r=A(t.evaluateFormula(D(t,e,1))),i=A(t.evaluateFormula(D(t,e,2)));return w(new Date(Date.UTC(n,r-1,i)))},minArgs:3,maxArgs:3,description:`Returns the serial number that represents a particular date`,examples:[`DATE(2023, 11, 25)`],category:`Date & Time`}),k.register({name:`TIME`,handler:(e,t)=>{let n=A(t.evaluateFormula(D(t,e,0))),r=A(t.evaluateFormula(D(t,e,1))),i=A(t.evaluateFormula(D(t,e,2))),a=n*3600+r*60+i,o=86400;return a%o/o},minArgs:3,maxArgs:3,description:`Returns the serial number of a particular time`,examples:[`TIME(14, 30, 0)`],category:`Date & Time`}),k.register({name:`YEAR`,handler:(e,t)=>T(A(t.evaluateFormula(D(t,e,0)))).getUTCFullYear(),minArgs:1,maxArgs:1,description:`Converts a serial number to a year`,examples:[`YEAR(TODAY())`,`YEAR(A1)`],category:`Date & Time`}),k.register({name:`MONTH`,handler:(e,t)=>T(A(t.evaluateFormula(D(t,e,0)))).getUTCMonth()+1,minArgs:1,maxArgs:1,description:`Converts a serial number to a month`,examples:[`MONTH(TODAY())`,`MONTH(A1)`],category:`Date & Time`}),k.register({name:`DAY`,handler:(e,t)=>T(A(t.evaluateFormula(D(t,e,0)))).getUTCDate(),minArgs:1,maxArgs:1,description:`Converts a serial number to a day of the month`,examples:[`DAY(TODAY())`,`DAY(A1)`],category:`Date & Time`}),k.register({name:`HOUR`,handler:(e,t)=>{let n=A(t.evaluateFormula(D(t,e,0))),r=n-Math.floor(n),i=Math.round(r*86400);return Math.floor(i/3600)},minArgs:1,maxArgs:1,description:`Converts a serial number to an hour`,examples:[`HOUR(NOW())`,`HOUR(A1)`],category:`Date & Time`}),k.register({name:`MINUTE`,handler:(e,t)=>{let n=A(t.evaluateFormula(D(t,e,0))),r=n-Math.floor(n),i=Math.round(r*86400);return Math.floor(i%3600/60)},minArgs:1,maxArgs:1,description:`Converts a serial number to a minute`,examples:[`MINUTE(NOW())`,`MINUTE(A1)`],category:`Date & Time`}),k.register({name:`SECOND`,handler:(e,t)=>{let n=A(t.evaluateFormula(D(t,e,0))),r=n-Math.floor(n);return Math.round(r*86400)%60},minArgs:1,maxArgs:1,description:`Converts a serial number to a second`,examples:[`SECOND(NOW())`,`SECOND(A1)`],category:`Date & Time`}),k.register({name:`DATEDIF`,handler:(e,t)=>Rc(A(t.evaluateFormula(D(t,e,0))),A(t.evaluateFormula(D(t,e,1))),ot(t.evaluateFormula(D(t,e,2)))),minArgs:3,maxArgs:3,description:`Calculates the number of days, months, or years between two dates`,examples:[`DATEDIF(A1, B1, "Y")`,`DATEDIF(DATE(2020,1,1), TODAY(), "D")`],category:`Date & Time`});var X=7,zc=5,Bc=0,Vc=6,Hc=Vc,Z=e=>Math.floor(e),Q=e=>Number.isFinite(e)&&e>=0&&e<=2958465,Uc=e=>((Z(e)+Hc)%X+X)%X,Wc={1:0,2:1,11:1,12:2,13:3,14:4,15:5,16:6,17:0},Gc=3;function Kc(e,t=1){if(!Q(e))return y;let n=Uc(e);if(t===Gc)return(n+X-1)%X;let r=Wc[t];return r===void 0?y:(n-r+X)%X+1}function qc(e,t){return!Q(e)||!Q(t)?y:Z(e)-Z(t)}var Jc=(e,t)=>new Date(Date.UTC(e,t+1,0)).getUTCDate(),Yc=e=>Q(e)?e:y;function Xc(e,t){if(!Q(e)||!Number.isFinite(t))return y;let n=T(Z(e)),r=n.getUTCFullYear(),i=n.getUTCMonth()+Math.trunc(t),a=Math.min(n.getUTCDate(),Jc(r,i));return Yc(w(new Date(Date.UTC(r,i,a))))}function Zc(e,t){if(!Q(e)||!Number.isFinite(t))return y;let n=T(Z(e));return Yc(w(new Date(Date.UTC(n.getUTCFullYear(),n.getUTCMonth()+Math.trunc(t)+1,0))))}var Qc=e=>{let t=Uc(e);return t!==Bc&&t!==Vc},$c=e=>new Set(e.map(Z));function el(e,t,n=[]){if(!Q(e)||!Number.isFinite(t))return y;let r=$c(n),i=Math.sign(t),a={date:Z(e),left:Math.abs(Math.trunc(t))};for(;a.left>0;){if(a.date+=i,!Q(a.date))return y;Qc(a.date)&&!r.has(a.date)&&--a.left}return a.date}function tl(e,t){let n=t-e+1,r=Math.floor(n/X),i=Array.from({length:n%X},(t,n)=>e+r*X+n);return r*zc+i.filter(Qc).length}function nl(e,t,n=[]){if(!Q(e)||!Q(t))return y;let[r,i]=[Z(e),Z(t)],[a,o]=r<=i?[r,i]:[i,r],s=[...$c(n)].filter(e=>e>=a&&e<=o&&Qc(e)).length,c=tl(a,o)-s;return r<=i?c:-c}var $=(e,t,n)=>C(t.evaluateFormula(D(t,e,n))),rl=e=>e.find(x)??e.filter(e=>typeof e==`number`);function il(e,t,n){if(e.length<=n)return[];let r=rt(t)(D(t,e,n));return r.length===0?rl([$(e,t,n)]):r.find(x)??r.filter(S).map(A)}var al=(e,t)=>{let n=rl([$(e,t,0),e.length>1?$(e,t,1):1]);if(x(n))return n;let[r=0,i=1]=n;return Kc(r,i)},ol=e=>(t,n)=>{let r=rl([$(t,n,0),$(t,n,1)]);if(x(r))return r;let[i=0,a=0]=r;return e(i,a)},sl=e=>(t,n)=>{let r=rl([$(t,n,0),$(t,n,1)]);if(x(r))return r;let i=il(t,n,2);if(x(i))return i;let[a=0,o=0]=r;return e(a,o,i)};[{name:`WEEKDAY`,handler:al,minArgs:1,maxArgs:2,description:`Returns the day of the week (1 = Sunday by default)`,examples:[`WEEKDAY(A2)`,`WEEKDAY(A2, 2)`]},{name:`DAYS`,handler:ol(qc),minArgs:2,maxArgs:2,description:`Returns the number of days between two dates`,examples:[`DAYS(B2, A2)`]},{name:`EDATE`,handler:ol(Xc),minArgs:2,maxArgs:2,description:`Returns the date a number of months before or after a date`,examples:[`EDATE(A2, 1)`]},{name:`EOMONTH`,handler:ol(Zc),minArgs:2,maxArgs:2,description:`Returns the last day of the month a number of months away`,examples:[`EOMONTH(A2, 0)`]},{name:`WORKDAY`,handler:sl(el),minArgs:2,maxArgs:3,description:`Returns the date a number of working days away, skipping weekends and holidays`,examples:[`WORKDAY(A2, 10)`,`WORKDAY(A2, 10, H2:H5)`]},{name:`NETWORKDAYS`,handler:sl(nl),minArgs:2,maxArgs:3,description:`Returns the number of working days between two dates, both included`,examples:[`NETWORKDAYS(A2, B2)`,`NETWORKDAYS(A2, B2, H2:H5)`]}].forEach(e=>k.register({...e,category:`Date & Time`})),Object.entries({"PERCENTILE.INC":`PERCENTILE`,"QUARTILE.INC":`QUARTILE`,"STDEV.S":`STDEV`,"STDEV.P":`STDEVP`,"VAR.S":`VAR`,"VAR.P":`VARP`,"RANK.EQ":`RANK`,TTEST:`T.TEST`,PERCENTRANK:`PERCENTRANK.INC`,FORECAST:`FORECAST.LINEAR`,PEARSON:`CORREL`}).forEach(([e,t])=>{let n=k.get(t);if(!n)throw Error(`alias ${e} names ${t}, which is not registered`);k.register({...n,name:e,description:`Same as ${t}`,examples:[]})});var cl=RegExp(`^${it}$`,`i`),ll=/^[A-Za-z_$][\w$]*$/,ul=32,dl=e=>typeof e==`object`&&!!e&&!Array.isArray(e),fl=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`),pl=e=>dl(e)&&typeof e.name==`string`&&typeof e.body==`string`&&fl(e.params)&&(e.description===void 0||typeof e.description==`string`);function ml(e){return Array.isArray(e)?e.filter(pl):[]}function hl(e,t){if(!cl.test(e.name))return`a name is letters and digits, parts joined by dots (MOVING.AVG)`;if(t(e.name))return`${e.name.toUpperCase()} is a built-in function`;if(e.params.length>ul)return`at most ${ul} parameters`;let n=e.params.find(e=>!ll.test(e));return n===void 0?new Set(e.params).size===e.params.length?null:`a parameter is named twice`:`"${n}" is not a parameter name`}function gl(e,t){let n=new Map,r=[];return e.forEach(e=>{let i=e.name.toUpperCase(),a=n.has(i)?`${i} is defined twice`:hl(e,t);a?r.push({name:e.name,reason:a}):n.set(i,e)}),{usable:n,problems:r}}var _l=e=>`Function(${[...e.params,`"use strict";\n${e.body}`].map(e=>JSON.stringify(e)).join(`, `)})`,vl=50,yl=2e3,bl=16777216,xl=1048576,Sl=1e5,Cl=`(fn, args) => fn(...JSON.parse(args))`,wl=`(?:(?:'(?:[^']|'')+'|[^!'"(),]+)!)?`,Tl=RegExp(`^${wl}\\$?[A-Z]+\\$?\\d+:\\$?[A-Z]+\\$?\\d+$`,`i`),El=RegExp(`^${wl}\\$?[A-Z]+\\$?\\d+$`,`i`),Dl=null,Ol=async()=>(Dl??=import(`@jitl/quickjs-singlefile-mjs-release-sync`).then(e=>e.default,e=>{throw Dl=null,e}),(0,t.newQuickJSWASMModuleFromVariant)(await Dl)),kl=()=>void 0,Al={definitions:new Map,problems:[],startCalculation:kl,dispose:kl};function jl(e,t){return e.startCalculation(),k.withOverlay(e.definitions,t)}async function Ml(e){let{usable:t,problems:n}=gl(e.flatMap(e=>ml(e.functions)),e=>k.isBuiltIn(e));return t.size===0?{...Al,problems:n}:Nl(await Ol(),t,n)}function Nl(e,t,n){let r=e.newRuntime();r.setMemoryLimit(bl),r.setMaxStackSize(xl);let i={calculationStart:Date.now()},a=[],o=new Map;return t.forEach((e,t)=>{let s=r.newContext(),c=[];a.push({vm:s,handles:c});let l=Ll(r,Date.now()+vl,()=>{let t=s.evalCode(_l(e));return t.error?{error:Pl(s,t.error)||`it stopped while loading`}:{fn:t.value}});if(`error`in l){n.push({name:e.name,reason:`does not compile: ${l.error}`});return}let u=s.unwrapResult(s.evalCode(Cl));c.push(l.fn,u);let d={vm:s,runtime:r,caller:u,fn:l.fn};o.set(t,Bl(e,e=>Fl(d,e,i.calculationStart)))}),{definitions:o,problems:n,startCalculation:()=>i.calculationStart=Date.now(),dispose:()=>{try{a.forEach(({vm:e,handles:t})=>{t.forEach(e=>e.dispose()),e.dispose()}),r.dispose()}catch{}}}}function Pl(e,t){try{let n=e.getProp(t,`message`),r=e.typeof(n)===`string`?e.getString(n):``;return n.dispose(),r}catch{return``}finally{t.dispose()}}function Fl({vm:e,runtime:t,caller:n,fn:r},i,a){let o=Math.min(Date.now()+vl,a+yl);return Date.now()>=o?y:Ll(t,o,()=>{let t=e.newString(i),a=e.callFunction(n,e.undefined,r,t);if(t.dispose(),a.error)return Pl(e,a.error)===Il?y:v;let o=Rl(e,a.value);return a.value.dispose(),o})}var Il=`interrupted`;function Ll(e,n,r){e.setInterruptHandler((0,t.shouldInterruptAfterDeadline)(n));try{return r()}finally{e.removeInterruptHandler()}}function Rl(e,t){let n=e.typeof(t);return n===`number`?zl(e.getNumber(t)):n===`string`?e.getString(t):n===`boolean`?zl(e.dump(t)):v}function zl(e){return typeof e==`number`?Number.isFinite(e)?e:y:typeof e==`string`||typeof e==`boolean`?e:v}function Bl(e,t){let n=e.description??`Defined in this workbook (${e.params.join(`, `)})`;return{name:e.name.toUpperCase(),minArgs:e.params.length,maxArgs:e.params.length,description:n,category:`Workbook`,handler:(e,n)=>{let r=e.map(e=>Hl(e.trim(),n));return r.find(x)??t(JSON.stringify(r))}}}var Vl=e=>x(e)?e:e===``?null:e;function Hl(e,t){return Tl.test(e)?Wl(e,t):El.test(e)?Vl(Ul(t)(e)[0]??``):Vl(t.evaluateFormula(e))}var Ul=e=>e.getRangeValuesKeepingBlanks??e.getRangeValuesRaw??e.getRangeValues;function Wl(e,t){let n=e.lastIndexOf(`!`),r=n>=0?e.slice(0,n+1):``,i=vc(e.slice(n+1))??[];if(i.length>Sl)return v;let a=Ul(t),o=new Map;for(let{row:e,col:t}of i){let n=Vl(a(`${r}${J(t)}${e+1}`)[0]??``);if(x(n))return n;o.set(e,[...o.get(e)??[],n])}return Array.from(o.values())}function Gl(e){if(e==null)return!0;if(typeof e==`string`)return e.trim()===``;if(o(e)){if(!(`v`in e))return!0;let t=e.v;return t==null||typeof t==`string`&&t.trim()===``}return!1}function Kl(e){return!x(e)&&Gl(e)}var ql=36e3,Jl=63499,Yl=e=>a(e)&&`v`in e,Xl=e=>typeof e==`number`&&Number.isInteger(e)&&e>=ql&&e<=Jl,Zl=(e,t,n,r)=>{if(x(t))return t.code;if(!Yl(e)||typeof t!=`number`)return t;let i=typeof e.f==`string`?e.f:``;return i?ts(t,i):typeof e.v==`string`&&e.v.startsWith(`=`)&&r&&Xl(t)?ts(t,n?`DD/MM/YYYY`:`MM/DD/YYYY`):t},Ql=new Set([`DATE`,`TODAY`,`EDATE`,`EOMONTH`,`WORKDAY`]),$l=/^[\s(+-]*([A-Z][A-Z0-9]*(?:\.[A-Z0-9]+)*)\s*\(/i;function eu(e){let t=$l.exec(e)?.[1];return t===void 0?null:t.toUpperCase()}function tu(e,t,n,r=new Set){let i=e.replace(/^=/,``),a=eu(i);if(a!==null&&Ql.has(a))return!0;let o=Lo(i)[0]?.ref,s=o===void 0?null:n(o,t);if(s===null||o===void 0)return!1;if(Yo(s.format))return!0;let c=`${s.sheet}!${o.replace(/^.*!/,``).replace(/\$/g,``).toUpperCase()}`;return s.formula===null||r.has(c)?!1:tu(s.formula,s.sheet,n,new Set([...r,c]))}var nu=String.raw`(?:'((?:[^']|'')+)'|([A-Za-z_][\w.]*))!`,ru=String.raw`[(,+\-*/^&=<>\s]`,iu=String.raw`[),+\-*/^&=<>\s]`,au=new RegExp(String.raw`(?<=^|${ru})(?:${nu})?(?:(\$?[A-Za-z]{1,3}):(\$?[A-Za-z]{1,3})|(\$?\d+):(\$?\d+))(?=$|${iu})`,`g`),ou=e=>e.replace(`$`,``).toUpperCase(),su=([e,t],n)=>{let r=[ou(e),ou(t)];return n(r[0])<=n(r[1])?r:[r[1],r[0]]};function cu({whole:e,sheetName:t,columns:n,rows:r},i){let a=i(t);if(!a)return null;let o=e.slice(0,e.lastIndexOf(`!`)+1),s=Math.max(a.rows,1);if(n){let[e,t]=su(n,uc);return`${o}${e}1:${t}${s}`}let c=J(Math.max(a.columns,1)-1),[l,u]=su(r??[`1`,`1`],Number);return`${o}A${l}:${c}${u}`}function lu(e,t){return e.replace(au,(e,n,r,i,a,o,s)=>cu({whole:e,sheetName:n?.replace(/''/g,`'`)??r??null,columns:i&&a?[i,a]:void 0,rows:o&&s?[o,s]:void 0},t)??e)}function uu(e,t){return e.split(/("(?:[^"]|"")*(?:"|$))/).map((e,n)=>n%2==1?e:lu(e,t)).join(``)}function du(e){return(t,n)=>{let r=so(t),i=r?.sheetName??n,a=yc(r?.ref??t),s=a?e.find(e=>e.name===i)?.data[a.row]?.[a.col]:void 0;if(!o(s))return null;let c=typeof s.v==`string`&&s.v.startsWith(`=`)?s.v:null;return{format:typeof s.f==`string`?s.f:``,formula:c,sheet:i}}}function fu(e){if(!e||!Array.isArray(e)||e.length===0)return[];if(Array.isArray(e[0]))return e;if(o(e[0])){let t=[];for(let n=0;n<e.length;n+=2){let r=[e[n]];n+1<e.length&&r.push(e[n+1]),t.push(r)}return t}return console.warn(`Unknown data structure in spreadsheet, returning empty:`,e),[]}function pu(e,t){return e.map(e=>e.map(e=>{if(!o(e)||!(`v`in e))return e;let n=e.v;if(typeof n==`string`&&!n.startsWith(`=`)){let r=Ye(n,t);if(r!==null)return{v:r,f:e.f||tt(n,t)}}return e}))}function mu(e,t,n={}){return hu(e,t,n,new Map).finish()}function hu(e,t,n,r){let i=n.preferDDMMYYYY??!1,s=n.skipFormatting??!1,l=pu(fu(e.data),i),u=t?.map(e=>({...e,data:pu(fu(e.data),i)})),d=l,f=e.name,p=[],ee=[],m=d.map(e=>[...e]),h=new Set,te=new Set,ne=e=>{let t=e===null||e===f?d:u?.find(t=>t.name===e)?.data;return t?{rows:t.length,columns:t.reduce((e,t)=>Math.max(e,t.length),0)}:null},re=(e,{cells:t,row:n,col:r})=>{let i=`${n},${r}`;if(h.has(i))return p.push({cell:{row:n,col:r},formula:e,error:`Circular reference detected`,type:`circular`}),0;if(te.has(i))return t[r];h.add(i);try{let n=he(uu(e.substring(1),ne));return t[r]=n,n}catch(i){let{type:a,display:o}=So(i);p.push({cell:{row:n,col:r},formula:e,error:c(i),type:a});let s=ke(o);return t[r]=s,s}finally{h.delete(i),te.add(i)}},ie=(e,t)=>{if(e==null)return 0;if(x(e)||typeof e==`number`)return e;if(typeof e==`string`){if(e.trim()===``)return 0;if(e.includes(`%`)){let t=e.replace(`%`,``).trim(),n=parseFloat(t);return isNaN(n)?0:n/100}if(e.includes(`$`)){let t=e.replace(/[$,]/g,``).trim(),n=parseFloat(t);return isNaN(n)?0:n}if(e.includes(`,`)){let t=e.replace(/,/g,``).trim(),n=parseFloat(t);return isNaN(n)?0:n}let t=parseFloat(e);return isNaN(t)?e:t}if(o(e)){let n=`v`in e?e.v:void 0;return typeof n==`string`&&n.startsWith(`=`)?t?re(n,t):0:ie(n)}let n=parseFloat(e);return isNaN(n)?e:n},ae=e=>{let t=so(e);if(!t)return{sheetData:m,ref:e,read:ie};let n=r.get(t.sheetName)??oe(t.sheetName);return n?{sheetData:n.calculated,ref:t.ref,read:n.read}:null},oe=e=>{let t=u?.find(t=>t.name===e);return!t||!t.data?null:(hu(t,u,{preferDDMMYYYY:i,skipFormatting:!0},r),r.get(e)??null)},se=e=>{let t=ae(e);if(!t)throw vo(e);let{sheetData:n,ref:r,read:i}=t,a=yc(r);if(!a)return null;let{row:o,col:s}=a,c=o>=0?n[o]:void 0;return!c||s<0||s>=c.length?null:{cell:c[s],position:{cells:c,row:o,col:s},read:i}},ce=e=>{let t=se(e);return t?t.read(t.cell,t.position):0},le=e=>{let t=se(e);if(t===null)return!0;let{cell:n,position:r,read:i}=t,o=a(n)?n.v:void 0;return Kl(typeof o==`string`&&o.startsWith(`=`)?i(n,r):n)},ue=(e,t)=>{let n=ae(e);if(!n)return[];let{sheetData:r,ref:i,read:a}=n,o=vc(i);if(!o)return[];let s=[];for(let{row:e,col:n}of o){let i=e>=0?r[e]:void 0,o=i&&n>=0?i[n]:void 0,c=a(o,i?{cells:i,row:e,col:n}:void 0);if(t.numericOnly)!Gl(o)&&Ie(c)&&s.push(c);else{let e=Gl(o)&&!x(o);s.push(t.keepBlanks&&e?``:c)}}return s},de=e=>ue(e,{numericOnly:!0}),fe=e=>ue(e,{numericOnly:!1}),pe=e=>ue(e,{numericOnly:!1,keepBlanks:!0}),me=e=>{let t=ae(e),n=t?vc(t.ref):null;if(!t||!n)return 0;let r=so(e)?.sheetName??f,i=r===f?d:u?.find(e=>e.name===r)?.data;return i?n.filter(({row:e,col:t})=>{let n=i[e]?.[t];return n!==void 0&&!Gl(n)}).length:0},he=e=>Jo(e,{getCellValue:ce,getRangeValues:de,getRangeValuesRaw:fe,getRangeValuesKeepingBlanks:pe,countFilledCells:me,evaluateFormula:he,preferDDMMYYYY:i,isCellEmpty:le}),ge=(e,t)=>{if(!o(e)||!(`v`in e))return;let n=e.v;if(typeof n!=`string`||!n.startsWith(`=`)){t.cells[t.col]=n;return}let r={cell:{row:t.row,col:t.col},formula:n,dependencies:[],result:0};ee.push(r),r.result=re(n,t),t.cells[t.col]=r.result},_e=e=>{d.forEach((t,n)=>{let r=m[n];r&&t.forEach((t,i)=>e(t,{cells:r,row:n,col:i}))})};return r.set(f,{calculated:m,read:ie}),{finish:()=>{if(_e(ge),!s){let e=du([{name:f,data:d},...(u??[]).filter(e=>e.name!==f)]);_e((t,{cells:n,col:r})=>{let a=o(t)&&typeof t.v==`string`?t.v:``,s=a.startsWith(`=`)&&tu(a,f,e);n[r]=Zl(t,n[r],i,s)})}return{name:f,data:m,formulas:ee,errors:p}}}}function gu(e,t={}){return e.map(n=>mu(n,e,t))}var _u=RegExp(`^[-+]?\\s*(${it})\\s*\\(`,`i`),vu=e=>{let t=e.match(_u)?.[1];return t!==void 0&&at(t)},yu=/[A-Z]+\d+\s*[+\-*/^]/,bu=/\d+\s*[+\-*/^]\s*\d+/,xu=/^[-+]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?$/;function Su(e){return vu(e)||yu.test(e)||bu.test(e)}function Cu(e){let t=e.trim();return t===``?``:Su(t)?`=${t}`:xu.test(t)?Number(t):t}function wu(e){if(e.type===`string`)return{v:String(e.value)};let t={v:Cu(e.formula??``)};return e.format&&e.format.length>0&&(t.f=e.format),t}var Tu=class{options;constructor(e={}){this.options={maxIterations:e.maxIterations??100,enableCrossSheetRefs:e.enableCrossSheetRefs??!0,strictMode:e.strictMode??!1,preferDDMMYYYY:e.preferDDMMYYYY??!1}}calculate(e,t){return mu(e,t,{preferDDMMYYYY:this.options.preferDDMMYYYY})}calculateWorkbook(e){return gu(e,{preferDDMMYYYY:this.options.preferDDMMYYYY})}getOptions(){return{...this.options}}setOptions(e){this.options={...this.options,...e}}createSheet(e,t){return{name:e,data:t.map(e=>e.map(e=>o(e)&&`v`in e?e:{v:e}))}}toStringArray(e){return e.data.map(e=>e.map(e=>String(e??``)))}},Eu=e=>e.length>80?`${e.slice(0,80)}…`:e,Du=e=>{let t=typeof e==`object`&&e&&`v`in e?e.v:e;return typeof t==`string`&&t.startsWith(`=`)?t:null};function Ou(e,t=Al){let n=e.map(e=>({name:e.name,data:fu(e.data)})),r=jl(t,()=>n.map(e=>mu(e,n,{skipFormatting:!0}))).flatMap((t,n)=>t.data.flatMap((t,r)=>t.flatMap((t,i)=>{let a=Du(e[n]?.data[r]?.[i]);return a===null||!x(t)?[]:[`${e[n]?.name??``}!${J(i)}${r+1} = ${t.code} (${Eu(a)})`]})));return{count:r.length,samples:r.slice(0,5)}}function ku({count:e,samples:t}){if(e===0)return``;let n=e>t.length?`, and ${e-t.length} more`:``;return` ${e} formula cell(s) calculate to an error; fix any that are not meant to be errors before telling the user the spreadsheet is ready: ${t.join(`; `)}${n}.`}function Au(e){if(typeof e!=`string`)return e;try{let t=JSON.parse(e);return console.warn(`Sheets was provided as a string and has been parsed to an array`),t}catch(e){throw Error(`Invalid sheets format: sheets must be an array, not a string. Parse error: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}function ju(e){if(!Array.isArray(e)||e.length===0)throw Error(`At least one sheet is required. Sheets must be an array of sheet objects.`);e.forEach(e=>{if(!e.name||!e.data||e.data.length===0)throw Error(`Invalid sheet: ${e.name||`unnamed`}. Each sheet must have a name and data array.`)})}async function Mu(e){let t=await Ml(e);try{return(t.problems.length===0?``:` These functions could not be used and calls to them show #NAME?: ${t.problems.slice(0,5).map(({name:e,reason:t})=>`${e} (${t})`).join(`; `)}.`)+ku(Ou(e,t))}finally{t.dispose()}}var Nu=async(e,t)=>{let{title:n}=t,r=Au(t.sheets);ju(r);let i=`Acknowledge that the spreadsheet has been created and is displayed to the user.`,a=await Mu(r),o=he(e);if(!o)return{message:`Created spreadsheet: ${n}${a}`,title:n,data:{sheets:r},instructions:i};let{relPath:s,filePath:c}=m();return await o.write(s,JSON.stringify(r)),{message:`Created spreadsheet: ${n}. Saved to ${c}; the user can edit cells there, so read that file for the current values.${a}`,title:n,data:{sheets:c},instructions:i}};async function Pu(e,t){if(!(`kind`in t))return Nu(e,t);let n=he(e);if(!n)throw Error(`This host does not provide files.artifacts, so spreadsheets cannot be loaded or saved`);if(!pe(t))throw Error(`Invalid spreadsheet dispatch`);return Ce(n,t)}var Fu={toolDefinition:r,execute:Pu,generatingMessage:`Creating spreadsheet...`,waitingMessage:`Tell the user that the spreadsheet was created and will be presented shortly.`,isEnabled:()=>!0,systemPrompt:i},Iu=[{name:`Simple Budget`,args:{title:`Monthly Budget`,sheets:[{name:`Budget`,data:[[{v:`Category`},{v:`Amount`}],[{v:`Income`},{v:5e3,f:`$#,##0.00`}],[{v:`Rent`},{v:-1500,f:`$#,##0.00`}],[{v:`Utilities`},{v:-200,f:`$#,##0.00`}],[{v:`Food`},{v:-600,f:`$#,##0.00`}],[{v:`Transport`},{v:-300,f:`$#,##0.00`}],[{v:`Total`},{v:`=SUM(B2:B6)`,f:`$#,##0.00`}]]}]}},{name:`Sales Report`,args:{title:`Q1 Sales Report`,sheets:[{name:`Sales`,data:[[{v:`Product`},{v:`Jan`},{v:`Feb`},{v:`Mar`},{v:`Total`}],[{v:`Widget A`},{v:1200},{v:1350},{v:1500},{v:`=SUM(B2:D2)`}],[{v:`Widget B`},{v:800},{v:920},{v:1100},{v:`=SUM(B3:D3)`}],[{v:`Widget C`},{v:450},{v:480},{v:520},{v:`=SUM(B4:D4)`}],[{v:`Total`},{v:`=SUM(B2:B4)`},{v:`=SUM(C2:C4)`},{v:`=SUM(D2:D4)`},{v:`=SUM(E2:E4)`}]]}]}},{name:`Loan Calculator`,args:{title:`Loan Calculator`,sheets:[{name:`Calculator`,data:[[{v:`Loan Amount`},{v:25e4,f:`$#,##0`}],[{v:`Interest Rate`},{v:.065,f:`0.00%`}],[{v:`Term (Years)`},{v:30}],[{v:``},{v:``}],[{v:`Monthly Payment`},{v:`=PMT(B2/12, B3*12, -B1)`,f:`$#,##0.00`}],[{v:`Total Interest`},{v:`=B5*B3*12-B1`,f:`$#,##0.00`}]]}]}},{name:`World Population`,args:{title:`世界人口(上位10)`,sheets:[{name:`世界人口(上位10)`,data:[[{v:`順位`},{v:`国・地域`},{v:`人口(概数)`,f:`#,##0`},{v:`上位10合計に占める割合`},{v:`世界人口に占める割合`}],[{v:1,f:`#,##0`},{v:`インド`},{v:1428627e3,f:`#,##0`},{v:`=C2/$C$12`,f:`0.00%`},{v:`=C2/$C$13`,f:`0.00%`}],[{v:2,f:`#,##0`},{v:`中国`},{v:1425671e3,f:`#,##0`},{v:`=C3/$C$12`,f:`0.00%`},{v:`=C3/$C$13`,f:`0.00%`}],[{v:3,f:`#,##0`},{v:`アメリカ合衆国`},{v:334e6,f:`#,##0`},{v:`=C4/$C$12`,f:`0.00%`},{v:`=C4/$C$13`,f:`0.00%`}],[{v:4,f:`#,##0`},{v:`インドネシア`},{v:277e6,f:`#,##0`},{v:`=C5/$C$12`,f:`0.00%`},{v:`=C5/$C$13`,f:`0.00%`}],[{v:5,f:`#,##0`},{v:`パキスタン`},{v:24e7,f:`#,##0`},{v:`=C6/$C$12`,f:`0.00%`},{v:`=C6/$C$13`,f:`0.00%`}],[{v:6,f:`#,##0`},{v:`ナイジェリア`},{v:219e6,f:`#,##0`},{v:`=C7/$C$12`,f:`0.00%`},{v:`=C7/$C$13`,f:`0.00%`}],[{v:7,f:`#,##0`},{v:`ブラジル`},{v:216e6,f:`#,##0`},{v:`=C8/$C$12`,f:`0.00%`},{v:`=C8/$C$13`,f:`0.00%`}],[{v:8,f:`#,##0`},{v:`バングラデシュ`},{v:172e6,f:`#,##0`},{v:`=C9/$C$12`,f:`0.00%`},{v:`=C9/$C$13`,f:`0.00%`}],[{v:9,f:`#,##0`},{v:`ロシア`},{v:146e6,f:`#,##0`},{v:`=C10/$C$12`,f:`0.00%`},{v:`=C10/$C$13`,f:`0.00%`}],[{v:10,f:`#,##0`},{v:`メキシコ`},{v:13e7,f:`#,##0`},{v:`=C11/$C$12`,f:`0.00%`},{v:`=C11/$C$13`,f:`0.00%`}],[{v:``},{v:`合計(上位10)`},{v:`=SUM(C2:C11)`,f:`#,##0`},{v:``},{v:``}],[{v:``},{v:`世界推定人口(例)`},{v:805e7,f:`#,##0`},{v:``},{v:``}]]}]}}];Object.defineProperty(exports,"C",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"E",{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,"S",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"T",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"_",{enumerable:!0,get:function(){return pe}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return wu}}),Object.defineProperty(exports,"b",{enumerable:!0,get:function(){return ne}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return Al}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return Dc}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return xc}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return Ce}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return Tu}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return jl}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return Nu}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return mu}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return yc}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return Fu}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return fu}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return Iu}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return Ml}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return se}}),Object.defineProperty(exports,"w",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"x",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"y",{enumerable:!0,get:function(){return te}});
package/dist/style.css CHANGED
@@ -1,3 +1,3 @@
1
1
  /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-700:oklch(52.7% .154 150.069);--color-green-900:oklch(39.3% .095 152.535);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-800:oklch(27.8% .033 256.848);--color-white:#fff;--spacing:.25rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-medium:500;--radius-md:.375rem;--radius-lg:.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.row-2{grid-row:2}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-1{margin-top:var(--spacing)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.inline{display:inline}.table{display:table}.h-8{height:calc(var(--spacing) * 8)}.h-\[600px\]{height:600px}.max-h-64{max-height:calc(var(--spacing) * 64)}.min-h-full{min-height:100%}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[200px\]{max-width:200px}.flex-shrink{flex-shrink:1}.border-collapse{border-collapse:collapse}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.resize{resize:both}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1{gap:var(--spacing)}.gap-2{gap:calc(var(--spacing) * 2)}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-gray-200{border-color:var(--color-gray-200)}.border-green-200{border-color:var(--color-green-200)}.bg-\[\#217346\]{background-color:#217346}.bg-gray-100{background-color:var(--color-gray-100)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-white{background-color:var(--color-white)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-8{padding:calc(var(--spacing) * 8)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-2{padding-block:calc(var(--spacing) * 2)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.break-words{overflow-wrap:break-word}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-800{color:var(--color-gray-800)}.text-green-700{color:var(--color-green-700)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.hover\:border-green-300:hover{border-color:var(--color-green-300)}.hover\:bg-\[\#1e6a3f\]:hover{background-color:#1e6a3f}.hover\:bg-green-200:hover{background-color:var(--color-green-200)}}.active\:bg-\[\#1a5c36\]:active{background-color:#1a5c36}@media (prefers-color-scheme:dark){.dark\:bg-green-900{background-color:var(--color-green-900)}.dark\:text-gray-200{color:var(--color-gray-200)}.dark\:text-gray-400{color:var(--color-gray-400)}}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}.spreadsheet-container[data-v-a54883ee]{background:#fff;flex-direction:column;width:100%;height:100%;display:flex}.spreadsheet-content-wrapper[data-v-a54883ee]{flex:1;min-height:0;overflow-y:auto}.header[data-v-a54883ee]{justify-content:space-between;align-items:center;margin-bottom:1em;display:flex}.title[data-v-a54883ee]{margin:0;font-size:2em;font-weight:700}.sheet-tabs[data-v-a54883ee]{border-bottom:2px solid #e0e0e0;gap:.25em;margin-bottom:1em;display:flex}.sheet-tab[data-v-a54883ee]{cursor:pointer;color:#666;background:#f5f5f5;border:none;border-top-left-radius:4px;border-top-right-radius:4px;padding:.5em 1em;font-size:.9em;transition:background-color .2s}.sheet-tab[data-v-a54883ee]:hover{background:#e8e8e8}.sheet-tab.active[data-v-a54883ee]{color:#333;background:#fff;border-bottom:2px solid #fff;margin-bottom:-2px;font-weight:500}.table-container[data-v-a54883ee]{background:#fff;overflow-x:auto}.table-container[data-v-a54883ee] table{border-collapse:collapse;width:100%;font-family:Segoe UI,Arial,sans-serif;font-size:.9em}.table-container[data-v-a54883ee] td,.table-container[data-v-a54883ee] th{text-align:left;border:1px solid #d0d0d0;padding:.5em .75em}.table-container[data-v-a54883ee] th{color:#333;background-color:#f5f5f5;font-weight:600}.table-container[data-v-a54883ee] tr:nth-child(2n){background-color:#fafafa}.table-container[data-v-a54883ee] tr:hover{background-color:#f0f0f0}.table-container[data-v-a54883ee] .cell-editing{outline-offset:-2px;background-color:#e8f5e9!important;outline:2px solid #217346!important}.table-container[data-v-a54883ee] .cell-referenced{outline-offset:-2px;background-color:#fff3e0!important;outline:2px solid #ff9800!important}.error[data-v-a54883ee]{color:#c62828;background:#ffebee;border-radius:4px;margin:1em 0;padding:1em}.spreadsheet-source[data-v-a54883ee]{background:#f5f5f5;border-top:1px solid #e0e0e0;flex-shrink:0;padding:.5rem;font-family:Consolas,MS Gothic,BIZ UDGothic,monospace;font-size:.85rem}.spreadsheet-source summary[data-v-a54883ee]{cursor:pointer;-webkit-user-select:none;user-select:none;color:#333;background:#e8e8e8;border-radius:4px;padding:.5rem;font-weight:500}.spreadsheet-source[open] summary[data-v-a54883ee]{margin-bottom:.5rem}.spreadsheet-source summary[data-v-a54883ee]:hover{background:#d8d8d8}.spreadsheet-editor[data-v-a54883ee]{color:#333;resize:vertical;background:#fff;border:1px solid #ccc;border-radius:4px;width:100%;height:40vh;margin-bottom:.5rem;padding:1rem;font-family:Courier New,MS Gothic,BIZ UDGothic,monospace;font-size:.9rem;line-height:1.5}.spreadsheet-editor[data-v-a54883ee]:focus{border-color:#217346;outline:none;box-shadow:0 0 0 2px #2173461a}.apply-btn[data-v-a54883ee]{color:#fff;cursor:pointer;background:#217346;border:none;border-radius:4px;padding:.5rem 1rem;font-size:.9rem;font-weight:500;transition:background .2s}.apply-btn[data-v-a54883ee]:hover{background:#1e6a3f}.apply-btn[data-v-a54883ee]:active{background:#1a5c36}.apply-btn[data-v-a54883ee]:disabled{color:#666;cursor:not-allowed;opacity:.6;background:#ccc}.apply-btn[data-v-a54883ee]:disabled:hover{background:#ccc}.mini-editor-panel[data-v-a54883ee]{background:#f8f8f8;border-top:1px solid #d0d0d0;flex-shrink:0}.mini-editor-content[data-v-a54883ee]{align-items:center;gap:.5rem;padding:.5rem 1rem;display:flex}.cell-ref[data-v-a54883ee]{color:#217346;min-width:2rem;font-family:Consolas,MS Gothic,BIZ UDGothic,monospace;font-size:.85rem;font-weight:600}.radio-group[data-v-a54883ee]{border-right:1px solid #d0d0d0;gap:.75rem;padding-right:.75rem;display:flex}.radio-option[data-v-a54883ee]{cursor:pointer;color:#555;align-items:center;gap:.25rem;font-size:.85rem;display:flex}.radio-option input[type=radio][data-v-a54883ee]{cursor:pointer;width:.9rem;height:.9rem}.form-input[data-v-a54883ee]{border:1px solid #ccc;border-radius:3px;flex:1;min-width:120px;padding:.4rem .6rem;font-family:inherit;font-size:.85rem;transition:border-color .2s}.form-input[data-v-a54883ee]:focus{border-color:#217346;outline:none;box-shadow:0 0 0 2px #2173461a}.form-input[data-v-a54883ee]::placeholder{color:#999;font-size:.8rem}.save-btn[data-v-a54883ee],.cancel-btn[data-v-a54883ee]{cursor:pointer;border:none;border-radius:3px;padding:.4rem .8rem;font-size:.85rem;font-weight:500;transition:background .2s}.save-btn[data-v-a54883ee]{color:#fff;background:#217346}.save-btn[data-v-a54883ee]:hover{background:#1e6a3f}.cancel-btn[data-v-a54883ee]{color:#666;background:0 0;padding:.4rem;font-size:1.2rem;line-height:1}.cancel-btn[data-v-a54883ee]:hover{color:#333;background:#e0e0e0}
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-700:oklch(52.7% .154 150.069);--color-green-900:oklch(39.3% .095 152.535);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-800:oklch(27.8% .033 256.848);--color-white:#fff;--spacing:.25rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-medium:500;--radius-md:.375rem;--radius-lg:.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.row-2{grid-row:2}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-1{margin-top:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.table{display:table}.h-8{height:calc(var(--spacing) * 8)}.h-\[600px\]{height:600px}.max-h-64{max-height:calc(var(--spacing) * 64)}.min-h-full{min-height:100%}.max-w-4xl{max-width:var(--container-4xl)}.max-w-\[200px\]{max-width:200px}.min-w-0{min-width:0}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.border-collapse{border-collapse:collapse}.cursor-pointer{cursor:pointer}.resize{resize:both}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-center{justify-content:center}.gap-1{gap:var(--spacing)}.gap-2{gap:calc(var(--spacing) * 2)}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-amber-300{border-color:var(--color-amber-300)}.border-gray-200{border-color:var(--color-gray-200)}.border-green-200{border-color:var(--color-green-200)}.bg-\[\#217346\]{background-color:#217346}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-700{background-color:var(--color-amber-700)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-white{background-color:var(--color-white)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-8{padding:calc(var(--spacing) * 8)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-1{padding-block:var(--spacing)}.py-2{padding-block:calc(var(--spacing) * 2)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.break-words{overflow-wrap:break-word}.text-amber-800{color:var(--color-amber-800)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-800{color:var(--color-gray-800)}.text-green-700{color:var(--color-green-700)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.hover\:border-green-300:hover{border-color:var(--color-green-300)}.hover\:bg-\[\#1e6a3f\]:hover{background-color:#1e6a3f}.hover\:bg-amber-100:hover{background-color:var(--color-amber-100)}.hover\:bg-amber-800:hover{background-color:var(--color-amber-800)}.hover\:bg-green-200:hover{background-color:var(--color-green-200)}}.active\:bg-\[\#1a5c36\]:active{background-color:#1a5c36}@media (prefers-color-scheme:dark){.dark\:bg-green-900{background-color:var(--color-green-900)}.dark\:text-gray-200{color:var(--color-gray-200)}.dark\:text-gray-400{color:var(--color-gray-400)}}}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}.spreadsheet-container[data-v-b2eaeddb]{background:#fff;flex-direction:column;width:100%;height:100%;display:flex}.spreadsheet-content-wrapper[data-v-b2eaeddb]{flex:1;min-height:0;overflow-y:auto}.header[data-v-b2eaeddb]{justify-content:space-between;align-items:center;margin-bottom:1em;display:flex}.title[data-v-b2eaeddb]{margin:0;font-size:2em;font-weight:700}.sheet-tabs[data-v-b2eaeddb]{border-bottom:2px solid #e0e0e0;gap:.25em;margin-bottom:1em;display:flex}.sheet-tab[data-v-b2eaeddb]{cursor:pointer;color:#666;background:#f5f5f5;border:none;border-top-left-radius:4px;border-top-right-radius:4px;padding:.5em 1em;font-size:.9em;transition:background-color .2s}.sheet-tab[data-v-b2eaeddb]:hover{background:#e8e8e8}.sheet-tab.active[data-v-b2eaeddb]{color:#333;background:#fff;border-bottom:2px solid #fff;margin-bottom:-2px;font-weight:500}.table-container[data-v-b2eaeddb]{background:#fff;overflow-x:auto}.table-container[data-v-b2eaeddb] table{border-collapse:collapse;width:100%;font-family:Segoe UI,Arial,sans-serif;font-size:.9em}.table-container[data-v-b2eaeddb] td,.table-container[data-v-b2eaeddb] th{text-align:left;border:1px solid #d0d0d0;padding:.5em .75em}.table-container[data-v-b2eaeddb] th{color:#333;background-color:#f5f5f5;font-weight:600}.table-container[data-v-b2eaeddb] tr:nth-child(2n){background-color:#fafafa}.table-container[data-v-b2eaeddb] tr:hover{background-color:#f0f0f0}.table-container[data-v-b2eaeddb] .cell-editing{outline-offset:-2px;background-color:#e8f5e9!important;outline:2px solid #217346!important}.table-container[data-v-b2eaeddb] .cell-referenced{outline-offset:-2px;background-color:#fff3e0!important;outline:2px solid #ff9800!important}.error[data-v-b2eaeddb]{color:#c62828;background:#ffebee;border-radius:4px;margin:1em 0;padding:1em}.spreadsheet-source[data-v-b2eaeddb]{background:#f5f5f5;border-top:1px solid #e0e0e0;flex-shrink:0;padding:.5rem;font-family:Consolas,MS Gothic,BIZ UDGothic,monospace;font-size:.85rem}.spreadsheet-source summary[data-v-b2eaeddb]{cursor:pointer;-webkit-user-select:none;user-select:none;color:#333;background:#e8e8e8;border-radius:4px;padding:.5rem;font-weight:500}.spreadsheet-source[open] summary[data-v-b2eaeddb]{margin-bottom:.5rem}.spreadsheet-source summary[data-v-b2eaeddb]:hover{background:#d8d8d8}.spreadsheet-editor[data-v-b2eaeddb]{color:#333;resize:vertical;background:#fff;border:1px solid #ccc;border-radius:4px;width:100%;height:40vh;margin-bottom:.5rem;padding:1rem;font-family:Courier New,MS Gothic,BIZ UDGothic,monospace;font-size:.9rem;line-height:1.5}.spreadsheet-editor[data-v-b2eaeddb]:focus{border-color:#217346;outline:none;box-shadow:0 0 0 2px #2173461a}.apply-btn[data-v-b2eaeddb]{color:#fff;cursor:pointer;background:#217346;border:none;border-radius:4px;padding:.5rem 1rem;font-size:.9rem;font-weight:500;transition:background .2s}.apply-btn[data-v-b2eaeddb]:hover{background:#1e6a3f}.apply-btn[data-v-b2eaeddb]:active{background:#1a5c36}.apply-btn[data-v-b2eaeddb]:disabled{color:#666;cursor:not-allowed;opacity:.6;background:#ccc}.apply-btn[data-v-b2eaeddb]:disabled:hover{background:#ccc}.mini-editor-panel[data-v-b2eaeddb]{background:#f8f8f8;border-top:1px solid #d0d0d0;flex-shrink:0}.mini-editor-content[data-v-b2eaeddb]{align-items:center;gap:.5rem;padding:.5rem 1rem;display:flex}.cell-ref[data-v-b2eaeddb]{color:#217346;min-width:2rem;font-family:Consolas,MS Gothic,BIZ UDGothic,monospace;font-size:.85rem;font-weight:600}.radio-group[data-v-b2eaeddb]{border-right:1px solid #d0d0d0;gap:.75rem;padding-right:.75rem;display:flex}.radio-option[data-v-b2eaeddb]{cursor:pointer;color:#555;align-items:center;gap:.25rem;font-size:.85rem;display:flex}.radio-option input[type=radio][data-v-b2eaeddb]{cursor:pointer;width:.9rem;height:.9rem}.form-input[data-v-b2eaeddb]{border:1px solid #ccc;border-radius:3px;flex:1;min-width:120px;padding:.4rem .6rem;font-family:inherit;font-size:.85rem;transition:border-color .2s}.form-input[data-v-b2eaeddb]:focus{border-color:#217346;outline:none;box-shadow:0 0 0 2px #2173461a}.form-input[data-v-b2eaeddb]::placeholder{color:#999;font-size:.8rem}.save-btn[data-v-b2eaeddb],.cancel-btn[data-v-b2eaeddb]{cursor:pointer;border:none;border-radius:3px;padding:.4rem .8rem;font-size:.85rem;font-weight:500;transition:background .2s}.save-btn[data-v-b2eaeddb]{color:#fff;background:#217346}.save-btn[data-v-b2eaeddb]:hover{background:#1e6a3f}.cancel-btn[data-v-b2eaeddb]{color:#666;background:0 0;padding:.4rem;font-size:1.2rem;line-height:1}.cancel-btn[data-v-b2eaeddb]:hover{color:#333;background:#e0e0e0}
3
3
  /*$vite$:1*/
@@ -0,0 +1,7 @@
1
+ import type { SpreadsheetSheet } from "../core/types";
2
+ /** `same`: nothing to do (usually this View's own save coming back).
3
+ * `apply`: show the file's sheets.
4
+ * `hold`: keep what is on screen and say the file changed, because the JSON
5
+ * editor holds edits not yet applied, and replacing them would lose them. */
6
+ export type FileChangeAction = "same" | "apply" | "hold";
7
+ export declare function fileChangeAction(onDisk: SpreadsheetSheet[], shown: SpreadsheetSheet[], hasUnappliedEdits: boolean, savesInFlight?: readonly SpreadsheetSheet[][]): FileChangeAction;
@@ -1,11 +1,13 @@
1
+ import type { LoadedWorkbook, SaveReply } from "../core/dispatchReplies";
1
2
  import type { SpreadsheetSheet } from "../core/types";
2
3
  export interface SheetSessionHost {
3
- loadFromHost(path: string): Promise<SpreadsheetSheet[]>;
4
- saveToHost(path: string, sheets: SpreadsheetSheet[]): Promise<unknown>;
4
+ loadFromHost(path: string): Promise<LoadedWorkbook>;
5
+ saveToHost(path: string, sheets: SpreadsheetSheet[], baseVersion: string | undefined): Promise<SaveReply>;
5
6
  }
6
7
  export type LoadOutcome = {
7
8
  kind: "sheets";
8
9
  sheets: SpreadsheetSheet[];
10
+ version?: string;
9
11
  } | {
10
12
  kind: "notSheets";
11
13
  } | {
@@ -18,7 +20,11 @@ export type LoadOutcome = {
18
20
  export interface SheetSession {
19
21
  /** Resolves to null when a newer `load` started before this one finished. */
20
22
  load(raw: unknown): Promise<LoadOutcome | null>;
21
- /** Waits for every earlier save, so the last edit made is the last written. */
22
- save(path: string, sheets: SpreadsheetSheet[]): Promise<void>;
23
+ /** Waits for every earlier save, so the last edit made is the last written. A save is
24
+ * written only over the version last adopted or saved; otherwise it answers a conflict. */
25
+ save(path: string, sheets: SpreadsheetSheet[]): Promise<SaveReply>;
26
+ /** The version of the sheets now on screen. Only what is shown may be a save's base: a
27
+ * loaded file the View held back from showing must still conflict. */
28
+ adopt(path: string, version: string | undefined): void;
23
29
  }
24
30
  export declare function createSheetSession(host: SheetSessionHost | null): SheetSession;
@@ -0,0 +1,7 @@
1
+ import { type Ref } from "vue";
2
+ import { loadCustomFunctions, type CustomFunctionSet } from "../engine/customFunctions";
3
+ import type { SpreadsheetSheet } from "../core/types";
4
+ /** What decides the set: every sheet's definitions, as text, so an unrelated cell edit does not reload. */
5
+ export declare const definitionsKey: (sheets: readonly SpreadsheetSheet[]) => string;
6
+ /** `load` is the loader, swappable so the order two loads land in can be tested. */
7
+ export declare function useCustomFunctions(sheets: Ref<SpreadsheetSheet[]>, load?: typeof loadCustomFunctions): Ref<CustomFunctionSet>;