@microtronics/studio-cli 1.3.0-alpha.2 → 1.3.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.js +1 -1
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -2630,7 +2630,7 @@ ${S0}
|
|
|
2630
2630
|
`).forEach(c=>{this.onConsole(c)}),x=""}for(let l=r.length-1;l>=0;l--)Date.now()>r[l].start+TC&&r.splice(l,1)}}isHex(x){return/^[a-fA-F0-9]*$/.test(x)}onConsole(x){if(!(x[0]===""&&x[1]==="#"&&x.length<10)){if(x[0]===""&&x[1]==="."&&x.length<10050){let[A,e]=x.substr(2).split("=");if(A.length>1&&A.length<50){["~~","~h","~g","~i","~r","~s"].includes(A)||(this.emit("#watch",{key:A,value:e,date:new Date}),this.logger.debug(`#watch ${A} = ${e}`));return}}this.formatConsoleLine(x)}}process_x01(x,A){if(x.length<11)return;let e=x.substr(1,4);if(!this.isHex(e))return;let r=x.substr(-5,4);if(!this.isHex(r))return;let t=parseInt(e,16),a=parseInt(r,16),i=65535&(A<0?0:t-A),l=65535&a-t-x.length;if(i&&this.onConsole(`?console - x01 ${i} characters lost`),A=a,l){this.onConsole(`?console - x01 ${l} characters lost (dropped "${x}")`);return}this.onConsole(x[0]+x.slice(5,-5))}dispose(){this.atHandler.off("data",this.dataHandler),this.removeAllListeners()}};function je(x){return parseInt(x.slice(6),16)}function TA(x){return"400000"+x.toString(16).toUpperCase().padStart(10,"0")}function S8(x){return x?new Uint8Array(x):null}function $n(x){return{...x,data:S8(x.data)}}function vs(x){return{...x,data:S8(x.data)}}var NC=/^400000[0-9A-F]{10}$/;function UF(x,A){if(!NC.test(A))throw new Error(`MemoryStorage: uto_data row for tag ${x} has non-canonical stamp "${A}"; expected 16-char uppercase hex output of stamp40ToDbHex ("400000" + 10 hex digits)`)}var IC=class q8{constructor(){i0(this,"metadata",new Map),i0(this,"utoData",new Map),i0(this,"changeRequests",[]),i0(this,"files",new Map)}async getMetadataValue(A){return this.metadata.get(A)??null}async setMetadataValue(A,e){this.metadata.set(A,e)}async deleteMetadataValue(A){this.metadata.delete(A)}async getUtoDataTags(){return[...this.utoData.keys()]}async getLatestStampForTag(A){let e=this.utoData.get(A);return!e||e.size===0?null:[...e.keys()].sort().at(-1)}async getRowForTag(A){let e=await this.getLatestStampForTag(A);return e===null?null:$n(this.utoData.get(A).get(e))}async replaceUtoRow(A){UF(A.tag,A.stamp),this.utoData.set(A.tag,new Map([[A.stamp,$n(A)]]))}async insertHistoricRows(A){for(let e of A){UF(e.tag,e.stamp);let r=this.utoData.get(e.tag);r||(r=new Map,this.utoData.set(e.tag,r)),r.has(e.stamp)||r.set(e.stamp,$n(e))}}async getHistoricRows(A,e){let r=this.utoData.get(A);if(!r)return[];let t=[...r.values()];if(e.fromStamp!==void 0){let i=e.fromStamp;t=t.filter(l=>l.stamp>=i)}if(e.untilStamp!==void 0){let i=e.untilStamp;t=t.filter(l=>l.stamp<=i)}t.sort((i,l)=>e.order==="desc"?l.stamp.localeCompare(i.stamp):i.stamp.localeCompare(l.stamp));let a=e.offset??0;return t.slice(a,a+e.limit).map($n)}async getUtoChangeRequests(){return[...this.changeRequests].sort((A,e)=>A.tag-e.tag||A.stamp.localeCompare(e.stamp)).map(A=>({...A}))}async insertUtoChangeRequests(A){for(let e of A)this.changeRequests.push({tag:e.tag,stamp:TA(e.stamp40),user:e.user??"",json:e.json})}async clearUtoChangeRequests(){this.changeRequests=[]}async getFiles(){return[...this.files.values()].map(vs)}async getFile(A){let e=this.files.get(A);return e?vs(e):null}async upsertFile(A){this.files.set(A.filename,vs(A))}async deleteFile(A){this.files.delete(A)}toJSON(){let A=[];for(let e of this.utoData.values())for(let r of e.values())A.push({tag:r.tag,stamp:r.stamp,flags:r.flags,site_related:r.site_related,data:r.data?Hn(r.data):null});return{metadata:Object.fromEntries(this.metadata),utoData:A,changeRequests:this.changeRequests.map(e=>({...e})),files:[...this.files.values()].map(e=>({filename:e.filename,stamp:e.stamp,crc:e.crc,size:e.size,flags:e.flags,flags_int:e.flags_int,data:e.data?Hn(e.data):null}))}}static fromJSON(A){let e=new q8;for(let[r,t]of Object.entries(A.metadata??{}))e.metadata.set(r,t);for(let r of A.utoData??[]){let t=e.utoData.get(r.tag);t||(t=new Map,e.utoData.set(r.tag,t)),t.set(r.stamp,{tag:r.tag,stamp:r.stamp,flags:r.flags,site_related:r.site_related,data:r.data?gs(r.data,`uto_data.data of tag ${r.tag}`):null})}e.changeRequests=(A.changeRequests??[]).map(r=>({...r}));for(let r of A.files??[])e.files.set(r.filename,{filename:r.filename,stamp:r.stamp,crc:r.crc,size:r.size,flags:r.flags,flags_int:r.flags_int,data:r.data?gs(r.data,`files.data of "${r.filename}"`):null});return e}},MC=new Set(["link","unknown"]);function Gt(x){return MC.has(x)}var T8=-2;function Le(x){return x.index===T8}var RC=65535,HF={configa:4294928218,configb:4294928219,configc:4294928220};function Ws(x){let A=x.toLowerCase();if(A==="histdata"||A==="histdata0")return"histdata0";let e=/^rm2mconfig([0-9a-c])$/.exec(A);return e?`config${e[1]}`:x}function zn(x){let A=Ws(x.trim()).toLowerCase();return Object.prototype.hasOwnProperty.call(HF,A)?HF[A]:ix.containerIdToTag(A,!1)}function Rt(x){return zn(x.name)}function LC(x,A){let e=x.byNameOrAlias(A);return zn(e?e.name:A)}function P8(x){return Number.isInteger(x)&&x>=0&&x<=RC}var OC={u8:"u8",s8:"s8",u16:"u16",s16:"s16",u32:"u32",s32:"s32",s64:"s64",f32:"f32",f64:"f64",floatm16:"floatm16",stamp4:"stamp4",stamp:"stamp",stamp8:"stamp8",datetime:"datetime",ufm8:"ufm8",link:"link",string:"string",float:"f32",float32:"f32",float64:"f64",char:"string",bint:"s8",wint:"s16",dint:"s32",qint:"s64",byte:"u8",word:"u16",dword:"u32",time_span:"s64"};function GC(x){return x===void 0?"unknown":OC[x.toLowerCase()]??"unknown"}var UC={u8:1,s8:1,u16:2,s16:2,floatm16:2,u32:4,s32:4,f32:4,stamp4:4,stamp:5,stamp8:8,datetime:8,ufm8:1,link:0,unknown:0,s64:8,f64:8},HC=new Set(["name","alias","title","index","byteofs","type","max","decpl","vscale","vofs","units","editmask","view","edit","default","bitmask"]),Xs="name",JC="type";function KC(x){let A=x.indexOf("=");return{key:x.slice(0,A).trim().toLowerCase(),value:x.slice(A+1).trim()}}function zC(x){return/^config[0-9]$/.test(x)||/^config[A-C]$/i.test(x)?"config":/^histdata[0-9]$/.test(x)?"histdata":"other"}function Kr(x,A){let e=x.get(A);if(e===void 0)return;let r=parseInt(e,10);return Number.isNaN(r)?void 0:r}function VC(x){let A=x.get("bitmask");if(A===void 0)return;let e=A.startsWith("$")?A.slice(1):A,r=parseInt(e,16);return Number.isNaN(r)?void 0:r}var WC=/^(.*?)%(config[0-9a-fA-F])%(.+)$/;function $8(x){let A=WC.exec(x);if(!A)return{};let e=A[1],r=e===""?NaN:Number(e);return{ref:{container:A[2],field:A[3]},prefixValue:Number.isFinite(r)?r:void 0}}function XC(x){let A=x.get("vscale");if(A===void 0)return{value:1};let e=$8(A);if(e.ref)return{value:e.prefixValue??1,ref:e.ref};let r=Number(A);return Number.isFinite(r)?{value:r}:{value:1}}function YC(x){let A=x.get("vofs");if(A===void 0)return{value:0};let e=$8(A);if(e.ref)return{value:e.prefixValue??0,ref:e.ref};let r=Number(A);return Number.isFinite(r)?{value:r}:{value:0}}function QC(x,A){return x==="string"?A??0:UC[x]}function ZC(x){let A={};for(let[e,r]of x)HC.has(e)||(A[e]=r);return A}function xd(x,A,e){let r=GC(x.get(JC)),t=Kr(x,"max"),a=QC(r,t),i=A.fields[A.fields.length-1],c=Kr(x,"byteofs")??(i?i.byteofs+i.size:A.kind==="histdata"?1:0),u=A.fields.length,b=x.get(Xs)??(A.kind==="histdata"?`ch${u}`:`field${u}`),m=XC(x),g=YC(x),q=Kr(x,"index");return{name:b,alias:x.get("alias"),title:x.get("title"),index:q,sortIndex:q??e,byteofs:c,type:r,size:a,max:t,decpl:Kr(x,"decpl"),vscale:m.value,vofs:g.value,vscaleRef:m.ref,vofsRef:g.ref,units:x.get("units"),editmask:x.get("editmask"),view:Kr(x,"view"),edit:Kr(x,"edit"),default:x.get("default"),bitmask:VC(x),attrs:ZC(x)}}function Ad(){return{name:"",kind:"other",fields:[],recordSize:0}}function ed(x,A,e){switch(A){case Xs:{let r=Ws(e);x.name=r,x.kind=zC(r);break}case"alias":x.alias=e;break;case"title":x.title=e;break;case"upload":x.upload=parseInt(e,10);break;case"download":x.download=parseInt(e,10);break;case"edit":x.edit=parseInt(e,10);break;default:break}}function rd(x){if(!x.name)throw new Error("?dde.table-without-name");x.recordSize=x.fields.filter(A=>!Gt(A.type)).reduce((A,e)=>Math.max(A,e.byteofs+e.size),0),x.fields.sort((A,e)=>A.sortIndex-e.sortIndex)}function td(x){if(x==="*")return{keyBytes:[],matchAll:!0};let A=x.slice(0,2).toLowerCase()==="0x"?x.slice(2):x;A.length%2!==0&&(A=`0${A}`);let e=[];for(let r=0;r<A.length;r+=2){let t=parseInt(A.slice(r,r+2),16);e.push(Number.isNaN(t)?0:t)}return{keyBytes:e,matchAll:!1}}function nd(x){return x.toLowerCase()==="histdata28"?"applog0":Ws(x)}function id(x){let{keyBytes:A,matchAll:e}=td(x.get("key")??"00");return{source:x.get("source")??"",target:nd(x.get("target")??""),key:A[0]??0,keyBytes:A,matchAll:e,keepraw:Kr(x,"keepraw")}}function sd(x,A){return{containers:x,splits:A,byNameOrAlias(e){let r=e.toLowerCase();return x.find(t=>t.name.toLowerCase()===r||(t.alias??"").toLowerCase()===r)??null}}}function ad(x,A){switch(A){case"<table>":return x.container=Ad(),x.expectName=!0,!0;case"</table>":return x.container&&(rd(x.container),x.containers.push(x.container)),x.container=null,!0;case"<field>":return x.field=new Map,!0;case"</field>":return x.container&&x.field&&x.container.fields.push(xd(x.field,x.container,x.line)),x.field=null,!0;case"<split>":return x.split=new Map,!0;case"</split>":return x.split&&x.splits.push(id(x.split)),x.split=null,!0;default:return!1}}function od(x,A){let{key:e,value:r}=KC(A);if(x.split)x.split.set(e,r);else if(x.field)x.field.set(e,r);else if(x.container){if(x.expectName&&e!==Xs)throw new Error(`?dde.first-table-attr-not-name."${e}"`);x.expectName=!1,ed(x.container,e,r)}}function Fd(x){let A={containers:[],splits:[],container:null,field:null,split:null,expectName:!1,line:0};for(let[e,r]of x.replace(/\r\n/g,`
|
|
2631
2631
|
`).replace(/\r/g,`
|
|
2632
2632
|
`).split(`
|
|
2633
|
-
`).entries()){A.line=e;let t=r.trim();t===""||t.startsWith("//")||ad(A,t)||t.includes("=")&&od(A,t)}return sd(A.containers,A.splits)}var N8=null,vd=4;function Dt(x){let A=new Date(x),e=(r,t)=>r.toString().padStart(t,"0");return e(A.getUTCFullYear(),4)+e(A.getUTCMonth()+1,2)+e(A.getUTCDate(),2)+e(A.getUTCHours(),2)+e(A.getUTCMinutes(),2)+e(A.getUTCSeconds(),2)+e(A.getUTCMilliseconds(),3)}function bt(x){let A=x.trim();if(A==="*")return N8;if(!/^\d{4,17}$/.test(A))throw new Error(`?apiStamp.invalid-input."${x}"`);let e=(b,m,g)=>{let q=A.slice(b,b+m);return parseInt(q.length?q.padEnd(m,"0"):g,10)},r=parseInt(A.slice(0,vd),10),t=A.length>=6?e(4,2,"01"):1,a=A.length>=8?e(6,2,"01"):1,i=e(8,2,"00"),l=e(10,2,"00"),c=e(12,2,"00"),u=e(14,3,"000");return Date.UTC(r,t-1,a,i,l,c,u)}var Ut="NAN",fd="%HEX%",ld=65535,Ys=class extends Error{constructor(x){super(`?ddeCodec.unknown-alias."${x}"`),i0(this,"alias",x),this.name="DdeUnknownAliasError"}};function Ai(x){return(x.alias??x.name).toLowerCase()}function ei(x){return x==="string"}function Qs(x){return x==="stamp"||x==="stamp4"||x==="stamp8"||x==="datetime"}function I8(x){return(x.editmask??"").toUpperCase()===fd}function cd(x,A){return A===void 0||!Number.isFinite(x)?x:Zs(x,A)}function Zs(x,A){if(!Number.isFinite(x))return x;let e=10**A;return Math.sign(x)*Math.round(Math.abs(x)*e)/e}function Ed(x,A){if(!Number.isFinite(x)||x===0)return x;let e=Math.abs(x),r=Math.floor(Math.log10(e));return 10**(r+1)<=e?r+=1:10**r>e&&(r-=1),Zs(x,A-1-r)}function Bd(x){return x==="floatm16"||x==="f32"||x==="f64"}function Cd(x,A){if(!Number.isFinite(A))return A;let e=x.decpl??(Bd(x.type)?9:0),r=Zs(A,e),t=x.type==="floatm16"?3:x.type==="f32"?7:15;return Ed(r,t)}function Vn(x,A){let e=BigInt.asUintN(64,BigInt(Math.trunc(x))),r=BigInt.asUintN(64,BigInt(Math.trunc(A))),t=0n,a=1n;for(;r!==0n;)r&1n&&(e&1n&&(t|=a),a<<=1n),e>>=1n,r>>=1n;return Number(t)}function M8(x,A,e){let r=BigInt.asUintN(64,BigInt(Math.trunc(x))),t=BigInt.asUintN(64,BigInt(Math.trunc(A))),a=BigInt.asUintN(64,BigInt(Math.trunc(e))),i=1n;for(;a!==0n;)a&1n&&(r=t&1n?r|i:r&~i,t>>=1n),a>>=1n,i<<=1n;return Number(r)}var dd=new Set(["u8","s8","u16","s16","u32","s32","s64","ufm8"]);function Wn(x){return!!x.bitmask&&dd.has(x.type)}var R8=255,L8=254,O8=253,G8=252,U8=251,ud=207,xa=65535,Xn=65534,Aa=65533,ea=65532,ra=65531;function Dd(x){switch(x){case R8:return xa;case L8:return Xn;case O8:return Aa;case G8:return ea;case U8:return ra;default:return x<=31?x:x>ud?Xn:(x&15|16)<<(x>>4)-1}}function pd(x){switch(x){case xa:return R8;case Xn:return L8;case Aa:return O8;case ea:return G8;case ra:return U8;default:{if(x<=31)return x;let A=1,e=x;for(;(e&65504)>0;)e>>=1,A++;return A<<4|e&15}}}var Yn=1023,Ss=31,H8=127,fs=8388607,bd=255,qs=15,md=-14,JF=15;function J8(x){let A=(x&Yn)<<13,e=(x&31744)>>10;if(e===Ss)return z8(1024-(x&Yn));e!==0&&(e=e-qs+4+H8);let r=(A|e<<23)>>>0;x&32768&&(r=(r|2147483648)>>>0);let t=new DataView(new ArrayBuffer(4));return t.setUint32(0,r),t.getFloat32(0)}function K8(x){if(typeof x=="string"||Number.isNaN(x))return ld;let A=new DataView(new ArrayBuffer(4));A.setFloat32(0,x);let e=A.getUint32(0),r=e>>>16&32768,t=(e&fs)+4096,a=(t>fs?1:0)+(e>>>23&bd),i=(t&fs)>>>13;return a!==0&&(a=a-H8-4,a<md?(i=0,a=0):a>JF?(i=Yn,a=JF+qs):a=a+qs),r|a<<10|i}var jd=["OF","UF","OL","SC"],Ts={u8:{NAN:255,OF:254,UF:253,OL:252,SC:251},u16:{NAN:65535,OF:65534,UF:65533,OL:65532,SC:65531},u32:{NAN:4294967295,OF:4294967294,UF:4294967293,OL:4294967292,SC:4294967291},s8:{NAN:127,OF:126,UF:-126,OL:-127,SC:-128},s16:{NAN:32767,OF:32766,UF:-32766,OL:-32767,SC:-32768},s32:{NAN:2147483647,OF:2147483646,UF:-2147483646,OL:-2147483647,SC:-2147483648},s64:{NAN:0x7fffffffffffffffn,OF:0x7ffffffffffffffen,UF:-0x7ffffffffffffffen,OL:-0x7fffffffffffffffn,SC:-0x8000000000000000n},ufm8:{NAN:xa,OF:Xn,UF:Aa,OL:ea,SC:ra}},hd={NAN:65535,OF:65534,UF:65533,OL:65532,SC:65531},lA={NAN:1,OF:2,UF:3,OL:4,SC:5},gd=new Set(["u8","u16","u32","ufm8"]);function kd(x){let A=Math.floor(x),e=x-A;return e<.5?A:e>.5?A+1:A%2===0?A:A+1}function ta(x){let A=x.replace(/,/g,"").trim();if(!/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?$/.test(A))return null;let e=Number(A);return Number.isFinite(e)?e:null}function na(x,A,e){switch(x){case"u8":return A.getUint8(e);case"s8":return A.getInt8(e);case"u16":return A.getUint16(e,!1);case"s16":return A.getInt16(e,!1);case"u32":return A.getUint32(e,!1);case"s32":return A.getInt32(e,!1);case"s64":return Number(A.getBigInt64(e,!1));case"f32":return A.getFloat32(e,!1);case"f64":return A.getFloat64(e,!1);case"floatm16":return J8(A.getUint16(e,!1));case"ufm8":return Dd(A.getUint8(e));default:throw new Error(`?ddeCodec.non-numeric-type."${x}"`)}}function z8(x){switch(x){case lA.OF:return"OF";case lA.UF:return"UF";case lA.OL:return"OL";case lA.SC:return"SC";default:return Ut}}var KF=[["NAN",lA.NAN],["OF",lA.OF],["UF",lA.UF],["OL",lA.OL],["SC",lA.SC]];function yd(x,A){let e=x.getUint32(A,!1);if((e&2139095040)!==2139095040)return 0;let r=e&8388607;return r===0?lA.NAN:(r=r&4194304?8388608-r:r&255,r===0?lA.NAN:r)}function _d(x,A){let e=x.getBigUint64(A,!1);if((e&0x7ff0000000000000n)!==0x7ff0000000000000n)return 0;let r=Number(e&0xffn);return r===0?lA.NAN:r}function wd(x,A){if(x.type==="s64"){let t=A.getBigInt64(x.byteofs,!1);Wn(x)&&(t=BigInt(Vn(Number(t),x.bitmask)));let a=Ts.s64;return KF.find(([i])=>t===BigInt(a[i]))?.[1]??0}let e=Ts[x.type];if(!e)return 0;let r=na(x.type,A,x.byteofs);return Wn(x)&&(r=Vn(r,x.bitmask)),KF.find(([t])=>r===e[t])?.[1]??0}function V8(x,A){switch(x.type){case"floatm16":{let e=A.getUint16(x.byteofs,!1);return(e>>10&Ss)===Ss?1024-(e&Yn):0}case"f32":return yd(A,x.byteofs);case"f64":return _d(A,x.byteofs);default:return wd(x,A)}}function W8(x,A){let e=na(x.type,A,x.byteofs);return typeof e=="string"||Number.isNaN(e)?NaN:(Wn(x)&&(e=Vn(e,x.bitmask)),e*x.vscale+x.vofs)}function Sd(x,A){let e=V8(x,A);if(e!==0)return z8(e);let r=W8(x,A);return Number.isNaN(r)?Ut:Cd(x,r)}function qd(x,A){if(x.byteofs+x.size>A.byteLength)return null;if(ei(x.type)||Qs(x.type))return NaN;let e=new DataView(A.buffer,A.byteOffset,A.byteLength);return V8(x,e)!==0?NaN:W8(x,e)}function Td(x,A){if(I8(x)){let e="";for(let r=0;r<x.size;r++)e+=A.getUint8(x.byteofs+r).toString(16).padStart(2,"0");return e.toUpperCase()}return ix.cp1252Unpack(A,x.byteofs,x.size)}var X8=25569,Y8=864e5;function Pd(x){return(x-X8)*Y8}function $d(x){return x/Y8+X8}function Nd(x,A){if(x.type==="datetime")return Dt(Pd(A.getFloat64(x.byteofs,!1)));if(x.type==="stamp8"){let r=A.getBigUint64(x.byteofs,!1),t=Number(r&0xffffffffffn);return Dt(ix.stamp40ToMS(t))}let e=A.getUint32(x.byteofs,!1)*256;return x.size>=5&&(e+=A.getUint8(x.byteofs+4)),Dt(ix.stamp40ToMS(e))}var Id=new Set(["u8","s8","u16","s16","u32","s32","s64","ufm8"]);function Md(x,A){return/^[+-]?\d+$/.test(x)?parseInt(x,10):/^\$[0-9a-fA-F]+$/.test(x)?parseInt(x.slice(1),16):A}function Rd(x){let A=x.default;if(A===void 0)return;if(ei(x.type))return A;let e=A.trim();if(e===""||e.toUpperCase()===Ut)return Ut;if(Id.has(x.type))return Md(e,0);let r=ta(e);return r!==null?r:A}function Ld(x,A,e){return x.byteofs+x.size>e?Rd(x):ei(x.type)?Td(x,A):Qs(x.type)?Nd(x,A):Sd(x,A)}function Ps(x,A){let e=new DataView(A.buffer,A.byteOffset,A.byteLength),r={};for(let t of x.fields)Le(t)||Gt(t.type)||(r[Ai(t)]=Ld(t,e,A.byteLength));return r}function Od(x,A){if(typeof A=="number")return Number.isFinite(A)?{kind:"value",physical:A}:{kind:"sentinel",state:"NAN"};if(typeof A=="string"){if(A.toUpperCase()===Ut||A==="")return{kind:"sentinel",state:"NAN"};let e=jd.find(t=>t===A);if(e)return{kind:"sentinel",state:e};if("OUS".includes(A[0]))return{kind:"skip"};let r=ta(A);return r!==null?{kind:"value",physical:r}:zF(x)}return zF(x)}function zF(x){let A=x.default;return A!==void 0&&A.startsWith("%")?{kind:"sentinel",state:"NAN"}:{kind:"value",physical:(A!==void 0?ta(A):null)??0}}function $s(x,A,e){switch(x.type){case"floatm16":return A.setUint16(x.byteofs,hd[e],!1);case"f32":return A.setUint32(x.byteofs,(2139095040|lA[e])>>>0,!1);case"f64":return A.setBigUint64(x.byteofs,0x7ff0000000000000n|BigInt(lA[e]),!1);default:break}let r=Ts[x.type]?.[e];if(r===void 0)throw new Error(`?ddeCodec.non-numeric-type."${x.type}"`);if(x.type==="s64")return A.setBigInt64(x.byteofs,BigInt(r),!1);Q8(x,A,Number(r))}function Gd(x,A,e){if(x.vscale===0)return;let r=(e-x.vofs)/x.vscale;switch(x.type){case"f32":return A.setFloat32(x.byteofs,r,!1);case"f64":return A.setFloat64(x.byteofs,r,!1);case"floatm16":return A.setUint16(x.byteofs,K8(r),!1);default:break}if(Number.isNaN(r))return $s(x,A,"NAN");if(!Number.isFinite(r))return $s(x,A,"OF");let t=r;gd.has(x.type)&&t<0&&(t=0),Q8(x,A,kd(t))}function Q8(x,A,e){if(Wn(x)){let r=na(x.type,A,x.byteofs);e=M8(r,e,x.bitmask)}Ud(x.type,A,x.byteofs,e)}function Ud(x,A,e,r){switch(x){case"u8":return A.setUint8(e,r);case"s8":return A.setInt8(e,r);case"u16":return A.setUint16(e,r,!1);case"s16":return A.setInt16(e,r,!1);case"u32":return A.setUint32(e,r,!1);case"s32":return A.setInt32(e,r,!1);case"s64":return A.setBigInt64(e,BigInt(r),!1);case"ufm8":return A.setUint8(e,pd(r));default:throw new Error(`?ddeCodec.non-numeric-type."${x}"`)}}function Hd(x,A,e){let r=String(e);if(I8(x)){let t=r.trim();if(t.length%2!==0||t.length>x.size*2)throw new Error(`?ddeCodec.invalid-hex."${Ai(x)}"`);for(let a=0;a<x.size;a++){let i=a*2<t.length?parseInt(t.substr(a*2,2),16):0;A.setUint8(x.byteofs+a,i)}return}ix.cp1252Pack(A,x.byteofs,x.size,r)}function Jd(x,A,e){let r=bt(String(e));if(r===null)throw new Error(`?ddeCodec.unbounded-stamp."${Ai(x)}"`);if(x.type==="datetime"){A.setFloat64(x.byteofs,$d(r),!1);return}let t=ix.msToStamp40(r);if(x.type==="stamp8"){A.setBigUint64(x.byteofs,BigInt(t),!1);return}A.setUint32(x.byteofs,Math.trunc(t/256),!1),x.size>=5&&A.setUint8(x.byteofs+4,t&255)}function Kd(x,A,e){if(ei(x.type))return Hd(x,A,e);if(Qs(x.type))return Jd(x,A,e);let r=Od(x,e);switch(r.kind){case"skip":return;case"sentinel":return $s(x,A,r.state);case"value":return Gd(x,A,r.physical)}}function Ns(x,A,e){let r=e?new Uint8Array(e):new Uint8Array(x.recordSize),t=new DataView(r.buffer,r.byteOffset,r.byteLength),a=new Map(x.fields.filter(i=>!Le(i)&&!Gt(i.type)).map(i=>[Ai(i),i]));for(let[i,l]of Object.entries(A)){let c=a.get(i.toLowerCase());if(!c)throw new Ys(i);Kd(c,t,l)}return r}var VF=99,zd=256,Er=class extends Error{constructor(x){super(`?ddeMapper.unknown-container."${x}"`),i0(this,"container",x),this.name="DdeUnknownContainerError"}},Ht=class extends Error{constructor(x,A){let e=A?`${x}.${A}`:x;super(`?ddeMapper.write-forbidden."${e}"`),i0(this,"container",x),i0(this,"field",A),this.name="DdeWriteForbiddenError"}},ia=class extends Error{constructor(x){super(`?ddeMapper.unknown-field."${x}"`),i0(this,"field",x),this.name="DdeUnknownFieldError"}};function ls(x){return(x.alias??x.name).toLowerCase()}var Vd=class{constructor(x,A,e=zt){i0(this,"model",x),i0(this,"storage",A),i0(this,"timeSource",e)}async readContainer(x){let A=this.model.byNameOrAlias(x);if(!A)return null;let e=Rt(A);if(e===null)return null;let r=await this.storage.getRowForTag(e);if(!r||!r.data)return null;let t=Ps(await this.resolveScaleRefs(A),r.data);return delete t.stamp,{stamp:this.rowStamp(r),...t}}async writeContainer(x,A){let e=this.model.byNameOrAlias(x);if(!e)throw new Er(x);let r=Rt(e);if(r===null)throw new Er(x);if(e.edit===VF)throw new Ht(e.name);let{stamp:t,...a}=A;this.assertFieldsWritable(e,a);let i=await this.storage.getRowForTag(r),l=Ns(await this.resolveScaleRefs(e),a,i?.data??null),c=ix.msToStamp40(this.recordStampMs(t)??this.timeSource.nowMs()),u=TA(c);return await this.storage.replaceUtoRow({tag:r,stamp:u,flags:i?.flags??0,site_related:i?.site_related??0,data:l}),{tag:r,stampHex:u,stamp40:c,data:l,devicePushable:P8(r)&&e.download!==0,upload:e.upload,download:e.download}}async seedContainer(x,A){let e=this.model.byNameOrAlias(x);if(!e)throw new Er(x);let r=Rt(e);if(r===null)throw new Er(x);let{stamp:t,...a}=A,i=Ns(await this.resolveScaleRefs(e),a,null),l=ix.msToStamp40(this.recordStampMs(t)??this.timeSource.nowMs());await this.storage.replaceUtoRow({tag:r,stamp:TA(l),flags:0,site_related:0,data:i})}recordStampMs(x){if(typeof x!="string")return null;try{return bt(x)}catch{return null}}async readTimeseries(x,A){let e=this.model.byNameOrAlias(x);if(!e)throw new Er(x);let r=this.model.splits.find(u=>u.target.toLowerCase()===e.name.toLowerCase());if(!r)throw new Er(x);let t=Math.abs(A.count),a=A.offset??0,i=this.buildSelectSet(e,A.select),l=await this.resolveScaleRefs(e);return(await this.collectMatched(l,r,a+t,{fromStamp:this.boundHex(A.fromMs),untilStamp:this.boundHex(A.untilMs),order:A.count<0?"desc":"asc",selectSet:i})).slice(a,a+t)}matchesSplit(x,A){return x.length===0?!1:A.matchAll?!0:x.length<A.keyBytes.length?!1:A.keyBytes.every((e,r)=>x[r]===e)}async collectMatched(x,A,e,r){let t=[];if(e<=0)return t;let a=Math.max(e,zd);for(let i=0;;i+=a){let l=await this.storage.getHistoricRows(26623,{fromStamp:r.fromStamp,untilStamp:r.untilStamp,order:r.order,limit:a,offset:i});for(let c of l)if(c.data&&this.matchesSplit(c.data,A)&&(t.push(this.recordFromRow(x,c,r.selectSet)),t.length>=e))return t;if(l.length<a)return t}}async readTimeseriesEdge(x,A,e){return(await this.readTimeseries(x,{count:A==="youngest"?-1:1,select:e}))[0]??null}recordFromRow(x,A,e){let r=Ps(x,A.data),t={stamp:this.rowStamp(A)};for(let[a,i]of Object.entries(r))a!=="stamp"&&(!e||e.has(a))&&(t[a]=i);return t}rowStamp(x){return Dt(ix.stamp40ToMS(je(x.stamp)))}boundHex(x){if(x!=null)return TA(ix.msToStamp40(x))}async resolveScaleRefs(x){if(!x.fields.some(r=>r.vscaleRef||r.vofsRef))return x;let A=new Map,e=[];for(let r of x.fields){if(!r.vscaleRef&&!r.vofsRef){e.push(r);continue}e.push({...r,vscale:r.vscaleRef?await this.resolveRef(r.vscaleRef,A,r.vscale):r.vscale,vofs:r.vofsRef?await this.resolveRef(r.vofsRef,A,r.vofs):r.vofs})}return{...x,fields:e}}async resolveRef(x,A,e){if(!/^config[0-9a-f]$/i.test(x.container))return e;let r=this.referencedField(x);if(!r)return e;let t=x.container.toLowerCase();A.has(t)||A.set(t,await this.referencedRecordData(x.container));let a=A.get(t);if(!a)return e;let i=qd(r,a);return i===null?e:i}referencedField(x){let A=x.field.toLowerCase();return this.model.byNameOrAlias(x.container)?.fields.find(r=>ls(r)===A||r.name.toLowerCase()===A)??null}async referencedRecordData(x){let A=this.model.byNameOrAlias(x);if(!A)return null;let e=Rt(A);return e===null?null:(await this.storage.getRowForTag(e))?.data??null}assertFieldsWritable(x,A){let e=new Map(x.fields.filter(r=>!Le(r)&&!Gt(r.type)).map(r=>[ls(r),r]));for(let r of Object.keys(A)){let t=e.get(r.toLowerCase());if(t&&t.edit===VF)throw new Ht(x.name,t.name)}}buildSelectSet(x,A){if(!A||A.length===0)return null;let e=new Set(x.fields.filter(t=>!Le(t)&&!Gt(t.type)).map(t=>ls(t))),r=new Set;for(let t of A){let a=t.toLowerCase();if(a!=="stamp"){if(!e.has(a))throw new ia(t);r.add(a)}}return r}},Wd=new Set(["$titles","$meta"]);function Xd(x){let A=x;if(typeof x=="string")try{A=JSON.parse(x)}catch{return null}return typeof A!="object"||A===null||Array.isArray(A)?null:A}function Is(x,A){let e=A.toLowerCase();if(Wd.has(e))return null;let r=x[e];if(typeof r!="object"||r===null)return null;let t=new Map;for(let[a,i]of Object.entries(r)){if(typeof i!="object"||i===null)continue;let l=i.alias;typeof l=="string"&&l.length>0&&t.set(a.toLowerCase(),l)}return t}function Z8(x,A){let e={};for(let[r,t]of Object.entries(x)){if(r==="stamp"){e[r]=t;continue}let a=A?.get(r.toLowerCase());e[a??r]=t}return e}function Vt(x,A){if(!x)return null;let e=Is(x,A.name);return e||(A.alias?Is(x,A.alias):null)}var Yd=require("events"),X0="[OfflineSyncManager]",Qd=500,Zd="site_info",xu=new Set(["local-data-interface.json"]);function nA(x){if(x?.aborted)throw x.reason??new DOMException("The operation was aborted.","AbortError")}function Au(x){let A=Kn(x);return!!(x&2)||A!==0&&A!==65}function WF(x){return x.filter(A=>(A.filename===ut||A.filename===Ks)&&A.outcome==="download").map(A=>A.filename)}var Gr="skip-equal",dt="skip-device-readonly",cs="delete",lr="error",Es="upload",Bs="uploading-utos",XF="downloading-utos",Nn="fetching-device-state",Cs="uploading-files",In="downloading-files",YF="executing-change-requests",QF="executed",eu="error",ds="skip-old-stamp",ru=class extends Yd.EventEmitter{constructor(x,A,e){super(),i0(this,"utoMaster",x),i0(this,"storage",A),i0(this,"logger",e)}emitProgress(x,A,e,r,t){let a={phase:x,item:A,completed:e,total:r,...t};this.emit("progress",a)}async uploadHistoricTag(x,A,e,r,t){try{let a=await this.storage.getRowForTag(x),i=0,l=async c=>{let u=c.filter(b=>b.stamp40>e).map(b=>({tag:x,stamp:TA(b.stamp40),flags:a?.flags??0,site_related:a?.site_related??0,data:b.data}));await this.storage.insertHistoricRows(u),i+=u.length};return await this.utoMaster.requestHistoricUtos(x,e,t,void 0,Qd,l),this.logger?.info(`${X0} historic upload tag=0x${x.toString(16)} +${i} records`),{tag:x,sTag:A.sTag,historic:!0,outcome:"upload",dbStamp40:e,deviceStamp40:r,recordsAppended:i}}catch(a){return this.logger?.error(`${X0} historic upload error tag=0x${x.toString(16)}: ${a}`),{tag:x,sTag:A.sTag,historic:!0,outcome:"error",dbStamp40:e,deviceStamp40:r}}}async uploadSingleTag(x,A,e,r){try{let t=await this.utoMaster.requestUto(x,0);if(!t)return this.logger?.info(`${X0} single upload tag=0x${x.toString(16)} \u2014 device returned no data (skip)`),{tag:x,sTag:A.sTag,historic:!1,outcome:Gr,dbStamp40:e,deviceStamp40:r};let a=await this.storage.getRowForTag(x);return await this.storage.replaceUtoRow({tag:x,stamp:TA(t.stamp),flags:a?.flags??0,site_related:a?.site_related??0,data:t.data?new Uint8Array(t.data.buffer.slice(t.data.byteOffset,t.data.byteOffset+t.data.byteLength)):null}),this.logger?.info(`${X0} single upload tag=0x${x.toString(16)}`),{tag:x,sTag:A.sTag,historic:!1,outcome:"upload",dbStamp40:e,deviceStamp40:r}}catch(t){return this.logger?.error(`${X0} single upload error tag=0x${x.toString(16)}: ${JSON.stringify(t)}`),{tag:x,sTag:A.sTag,historic:!1,outcome:"error",dbStamp40:e,deviceStamp40:r}}}async uploadUtoTags(x,A,e,r){let t=x.length;this.emitProgress(Bs,null,0,t);let a=0;for(let i of x){nA(r);let l=A.get(i),{tagInfo:c,dbStamp40:u,deviceStamp40:b}=l;if(this.emitProgress(Bs,c?.sTag??`0x${i.toString(16)}`,a,t),!c||b===null)e.set(i,{tag:i,sTag:"?",historic:!1,outcome:"unknown-tag",dbStamp40:u,deviceStamp40:b});else if(!(!c.flags.up||b<=u)){let m=c.sTag,g=a,q=c.historic?await this.uploadHistoricTag(i,c,u,b,_=>{this.emitProgress(Bs,m,g,t,{recordsReceived:_})}):await this.uploadSingleTag(i,c,u,b);e.set(i,q)}++a}}async pullFileFromDevice(x,A,e,r,t,a){let i=A.stamp;try{let l=await this.utoMaster.requestFile(x,u=>{this.emitProgress(Cs,x,a,t,{bytesTransferred:u})}),c=Js(l);if(c!==A.crc32)throw new Error(`crc32 mismatch: expected 0x${A.crc32.toString(16)}, got 0x${c.toString(16)}`);return await this.storage.upsertFile({filename:x,stamp:TA(i),crc:A.crc32,size:l.byteLength,flags:A._flags,flags_int:r,data:l}),{filename:x,outcome:Es,dbStamp40:e,deviceStamp40:i}}catch(l){return this.logger?.error(`${X0} file upload error ${x}: ${JSON.stringify(l)}`),{filename:x,outcome:lr,dbStamp40:e,deviceStamp40:i}}}async autoSyncUploadFile(x,A,e,r,t,a,i,l){let c=A.stamp;if(c>r)return this.fileContentMatches(A,e)?this.convergeFileStamp(x,A,e,r):a?this.pullFileFromDevice(x,A,r,t,i,l):void 0;if(c===r&&this.fileContentMatches(A,e))return{filename:x,outcome:Gr,dbStamp40:r,deviceStamp40:c}}async convergeFileStamp(x,A,e,r){let t=A.stamp;try{return await this.storage.upsertFile({filename:x,stamp:TA(t),crc:A.crc32,size:A.size,flags:A._flags,flags_int:e.flags_int,data:e.data}),{filename:x,outcome:Gr,dbStamp40:r,deviceStamp40:t}}catch(a){return this.logger?.error(`${X0} file upload error ${x}: ${JSON.stringify(a)}`),{filename:x,outcome:lr,dbStamp40:r,deviceStamp40:t}}}async mirrorUploadFile(x,A,e,r,t,a,i){let l=A.stamp;if(l!==r||!this.fileContentMatches(A,e))return t?this.pullFileFromDevice(x,A,r,e.flags_int,a,i):{filename:x,outcome:dt,dbStamp40:r,deviceStamp40:l}}async decideFileUpload(x,A,e,r){let t=await this.storage.getFile(x),a=!!(A._flags&1);if(!t)return a?this.pullFileFromDevice(x,A,0,16,e,r):void 0;let i=je(t.stamp);return A._flags&8?this.autoSyncUploadFile(x,A,t,i,t.flags_int,a,e,r):this.decideNonSystemUpload(x,A,t,i,a,e,r)}pullIfReadable(x,A,e,r,t,a,i){return x?this.pullFileFromDevice(A,e,r,t,a,i):void 0}async decideNonSystemUpload(x,A,e,r,t,a,i){let l=e.flags_int;if(!(l&2))return l&4?this.pullIfReadable(t,x,A,r,l,a,i):this.decideUploadBySyncLogic(x,A,e,r,t,a,i)}async decideUploadBySyncLogic(x,A,e,r,t,a,i){let l=e.flags_int,c=Kn(l);if(c===65)return this.fileContentMatches(A,e)?this.convergeFileStamp(x,A,e,r):this.pullIfReadable(t,x,A,r,l,a,i);if(c===1)return this.autoSyncUploadFile(x,A,e,r,l,t,a,i);if(c===97)return A.stamp>r?this.pullIfReadable(t,x,A,r,l,a,i):void 0;if(c!==33)return this.mirrorUploadFile(x,A,e,r,t,a,i)}async uploadFiles(x,A,e,r){let t=Object.entries(x),a=t.length;this.emitProgress(Cs,null,0,a);let i=0;for(let[l,c]of t){if(nA(r),!(l===Ks||l===ut&&!e)){let b=await this.decideFileUpload(l,c,a,i);b&&A.set(l,b)}this.emitProgress(Cs,l,++i,a)}}fileContentMatches(x,A){return A!==null&&x.crc32===A.crc&&x.size===A.size}async downloadSingleTag(x,A,e,r){try{let t=await this.storage.getRowForTag(x);return t?.data&&await this.utoMaster.sendUTOCmdExt(3,x,t.data,e),{tag:x,sTag:A.sTag,historic:!1,outcome:"download",dbStamp40:e,deviceStamp40:r}}catch(t){return this.logger?.error(`${X0} download error tag=0x${x.toString(16)}: ${t}`),{tag:x,sTag:A.sTag,historic:!1,outcome:"error",dbStamp40:e,deviceStamp40:r}}}async processDownloadTag(x,A,e,r,t){if(e===r&&!t.has(x)){let a=A.flags.up?Gr:"skip-db-readonly";t.set(x,{tag:x,sTag:A.sTag,historic:!1,outcome:a,dbStamp40:e,deviceStamp40:r});return}if(e>r){let a=A.flags.down?await this.downloadSingleTag(x,A,e,r):{tag:x,sTag:A.sTag,historic:!1,outcome:dt,dbStamp40:e,deviceStamp40:r};t.set(x,a)}}async downloadUtoTags(x,A,e,r){let t=x.length;this.emitProgress(XF,null,0,t);let a=0;for(let i of x){nA(r);let{tagInfo:l,dbStamp40:c,deviceStamp40:u}=A.get(i);l&&u!==null&&!l.historic&&await this.processDownloadTag(i,l,c,u,e),this.emitProgress(XF,l?.sTag??`0x${i.toString(16)}`,++a,t)}}async sendFileToDevice(x,A,e,r,t){let a=x.data.byteLength,i=l=>{if(l!==null){let c=Math.round(a*parseInt(l,10)/100);this.emitProgress(In,x.filename,t,r,{bytesTransferred:c,bytesTotal:a})}};this.utoMaster.on("installing",i);try{return await this.utoMaster.sendFile(0,x.data,ix.stamp40ToMS(A),x.filename),{filename:x.filename,outcome:"download",dbStamp40:A,deviceStamp40:e}}catch(l){return this.logger?.error(`${X0} file download error ${x.filename}: ${l}`),{filename:x.filename,outcome:"error",dbStamp40:A,deviceStamp40:e}}finally{this.utoMaster.removeListener("installing",i)}}async processDownloadFile(x,A,e,r,t=!1){if(!x.data)return;let a=A?.stamp??0,i=je(x.stamp);if(A!==void 0&&this.fileContentMatches(A,x))return i===a?void 0:{filename:x.filename,outcome:Gr,dbStamp40:i,deviceStamp40:a};if(!(!t&&i<a))return!t&&A!==void 0&&!(A._flags&2)?{filename:x.filename,outcome:dt,dbStamp40:i,deviceStamp40:a}:this.sendFileToDevice(x,i,a,e,r)}async isAppInDevPhase(){let x=await this.storage.getMetadataValue(Zd);if(!x)return!1;try{return JSON.parse(x).app?.phase==="dev"}catch(A){return this.logger?.error(`${X0} corrupt site_info metadata: ${A}`),!1}}async downloadFiles(x,A,e,r){let t=await this.storage.getFiles(),a=t.filter(m=>m.flags&8),i=t.filter(m=>!(m.flags&8)),l=[...a,...i].filter(m=>m.filename),c=Object.entries(x).filter(([,m])=>m._flags&4).map(([m])=>m),u=l.length;this.emitProgress(In,null,0,u);let b=0;for(let m of l){if(nA(r),e&&m.filename===ut){this.emitProgress(In,m.filename,++b,u);continue}let g=m.filename===ut&&!e,q=await this.decideFileDownload(m,x[m.filename],A.get(m.filename),c,g,u,b);q&&A.set(m.filename,q),this.emitProgress(In,m.filename,++b,u)}}async decideFileDownload(x,A,e,r,t,a,i){return A!==void 0?this.decideDownloadExisting(x,A,e,t,a,i):this.decideDownloadMissing(x,r,a,i)}async decideDownloadExisting(x,A,e,r,t,a){if(A._flags&4)return;if(x.flags&8)return e?void 0:this.processDownloadFile(x,A,t,a,r);let i=x.flags_int;if(i&8)return this.handleDeviceDelete(x,A,e);if(!e&&!(i&4))return this.pushToDevice(x,A,t,a)}async pushToDevice(x,A,e,r){let t=A.stamp,a=je(x.stamp),i=this.wantDownloadPush(x,A,a,t);if(i==="match")return{filename:x.filename,outcome:Gr,dbStamp40:a,deviceStamp40:t};if(i!=="none"&&!(a===0||!x.data||x.data.byteLength===0))return A._flags&2?this.sendFileToDevice(x,a,t,e,r):{filename:x.filename,outcome:dt,dbStamp40:a,deviceStamp40:t}}wantDownloadPush(x,A,e,r){let t=x.flags_int;if(t&2)return"push";let a=this.fileContentMatches(A,x),i=Kn(t);return i===33||i===1&&e>=r?a?"match":"push":i===97&&e>r?"push":"none"}async handleDeviceDelete(x,A,e){let r=A.stamp,t=je(x.stamp);if(!(e&&(e.outcome===Es||e.outcome===lr))){if(!(A._flags&2))return{filename:x.filename,outcome:dt,dbStamp40:t,deviceStamp40:r};try{return await this.utoMaster.deleteFile(x.filename),await this.storage.deleteFile(x.filename),{filename:x.filename,outcome:cs,dbStamp40:t,deviceStamp40:r}}catch(a){return this.logger?.error(`${X0} file delete error ${x.filename}: ${JSON.stringify(a)}`),{filename:x.filename,outcome:lr,dbStamp40:t,deviceStamp40:r}}}}async decideDownloadMissing(x,A,e,r){let t=x.flags_int,a=je(x.stamp);if(t&8)try{return await this.storage.deleteFile(x.filename),{filename:x.filename,outcome:cs,dbStamp40:a,deviceStamp40:null}}catch(i){return this.logger?.error(`${X0} file delete error ${x.filename}: ${JSON.stringify(i)}`),{filename:x.filename,outcome:lr,dbStamp40:a,deviceStamp40:null}}if(!(x.flags&12)&&Au(t)&&x.flags&2&&this.hasMatchingNode(x.filename,A)&&x.data)return this.sendFileToDevice(x,a,0,e,r)}hasMatchingNode(x,A){return A.some(e=>e.slice(0,-1)===x.slice(0,e.length-1))}async reconcileFileState(x){try{await this.reconcileFileStateUnguarded(x)}catch(A){if(x?.aborted)throw A;this.logger?.error(`${X0} file-state reconciliation failed: ${JSON.stringify(A)}`)}}async reconcileFileStateUnguarded(x){let A=await this.utoMaster.requestFileList(),e=new Set(Object.keys(A)),r=await this.storage.getFiles(),t=new Map(r.map(a=>[a.filename,a]));for(let[a,i]of Object.entries(A))nA(x),await this.reconcileDeviceFile(a,i,t.get(a)??null);for(let a of r)nA(x),e.has(a.filename)||await this.dropRowMissingFromDevice(a)}async reconcileDeviceFile(x,A,e){let r=!!((A._flags|(e?.flags??0))&8);if(e?.data&&!this.fileContentMatches(A,e)){this.logger?.info(`${X0} reconcile keep ${x}: row holds undeployed content`);return}if(!e?.data&&!r)return;let t={filename:x,stamp:TA(A.stamp),crc:A.crc32,size:A.size,flags:A._flags,flags_int:e?.flags_int??16,data:this.keepBlob(x,r)?e?.data??null:null};e&&this.fileRowMatches(e,t)||await this.storage.upsertFile(t)}keepBlob(x,A){return!A||xu.has(x)}fileRowMatches(x,A){return x.stamp===A.stamp&&x.crc===A.crc&&x.size===A.size&&x.flags===A.flags&&x.flags_int===A.flags_int&&(x.data??null)===A.data}async dropRowMissingFromDevice(x){try{await this.storage.deleteFile(x.filename)}catch(A){this.logger?.error(`${X0} reconcile delete error ${x.filename}: ${JSON.stringify(A)}`)}}async validateDevice(x){nA(x),this.emitProgress("validating",null,0,1);let A=await this.utoMaster.requestDeviceInfo();if(!A)throw new Error(`${X0} requestDeviceInfo returned null`);let e=await this.storage.getMetadataValue("device_id");if(e===null){if(!A.serialNumber)throw new Error(`${X0} DB metadata missing device_id and connected device has no serialNumber`);if(!this.storage.setMetadataValue)throw new Error(`${X0} DB metadata missing device_id`);await this.storage.setMetadataValue("device_id",A.serialNumber),e=A.serialNumber}if(e.toUpperCase()!==A.serialNumber.toUpperCase())throw new Error(`${X0} DB device_id "${e}" does not match connected device "${A.serialNumber}"`);return this.emitProgress("validating",null,1,1),A}buildTagMap(x){let A=new Map;for(let e=0;e<x.utos.length;e++){let r=x.utos[e];A.set(r.wTag,{index:e,flags:{up:r.flags.up,down:r.flags.down,setValue:!!r.flags.setValue},historic:r.flags.historic,sTag:r.sTag})}return A}async resolveDbTags(x){let A=await this.storage.getUtoDataTags(),e=new Set(A);for(let[r,t]of x)t.historic&&!e.has(r)&&A.push(r);return A}async buildTagStampCache(x,A,e){let r=new Map;for(let t of x){let a=A.get(t),i=await this.storage.getLatestStampForTag(t),l=i?je(i):0,c=a&&a.index<e.stamps.length?e.stamps[a.index]:null;r.set(t,{dbStamp40:l,deviceStamp40:c,tagInfo:a})}return r}async executeChangeRequests(x,A,e,r,t,a){let i=await this.storage.getUtoChangeRequests(),l=this.groupChangeRequests(i),c=l.size;if(this.emitProgress(YF,null,0,c),c===0)return;let u=new Set,b=0;for(let[m,g]of l){nA(a);let q=x.get(m),_=q?.sTag??`0x${m.toString(16)}`;this.emitProgress(YF,_,b,c),await this.executeChangeRequestTag(m,_,q,g,A,r,t,u),++b}u.size>0&&await this.repullExecutedTags(u,x,e,a)}groupChangeRequests(x){let A=new Map;for(let e of x){let r=A.get(e.tag)??[];r.push({stamp40:je(e.stamp),user:e.user,json:e.json}),A.set(e.tag,r)}return A}async executeChangeRequestTag(x,A,e,r,t,a,i,l){if(!e){this.pushChangeResults(i,x,A,r,"unknown-tag");return}if(!e.flags.setValue){this.pushChangeResults(i,x,A,r,"skip-unsupported");return}let c=e.index<t.stamps.length?t.stamps[e.index]:0,u=r.filter(m=>m.stamp40<=c),b=r.filter(m=>m.stamp40>c);this.pushChangeResults(i,x,A,u,ds),b.length>0&&await this.coalesceAndSend(x,A,e,b,a,i,l)}async coalesceAndSend(x,A,e,r,t,a,i){let l=await this.storage.getRowForTag(x);if(t.get(x)?.outcome===lr||!l||!l.data){this.pushChangeResults(a,x,A,r,"error");return}let c=this.resolveSetObject(l.data,r,A);if(c===null){this.pushChangeResults(a,x,A,r,"error");return}if(Object.keys(c).length===0){this.pushChangeResults(a,x,A,r,"skip-no-change");return}let u=r[r.length-1].stamp40,b=await this.utoMaster.sendSetValue(x,JSON.stringify(c),u);b.outcome==="ok"||b.outcome==="stamp"?(i.add(x),this.pushChangeResults(a,x,A,r,QF,b.resultCode)):b.outcome==="denied"?(this.logger?.warn(`${X0} change-request denied ${A} (result=${b.resultCode}) \u2014 server will retry`),this.pushChangeResults(a,x,A,r,"denied",b.resultCode)):(this.logger?.error(`${X0} change-request error ${A} (result=${b.resultCode})`),this.pushChangeResults(a,x,A,r,"error",b.resultCode))}resolveSetObject(x,A,e){try{let r=JSON.parse(ix.cp1252Unpack(x,0,x.byteLength));return this.buildSetObject(r,A,e)}catch(r){return this.logger?.error(`${X0} change-request unparseable uto_data ${e}: ${r}`),null}}buildSetObject(x,A,e){let r={};for(let t of A){let a=JSON.parse(t.json);if(!this.isPlainRecord(a))throw new Error(`change-request JSON is not an object on ${e}`);for(let[i,l]of Object.entries(a)){let c=this.resolveChangeField(x[i],l,i,e);c.apply&&(r[i]=c.value,x[i]=c.value)}}return r}resolveChangeField(x,A,e,r){if(this.isBitwiseOp(A)){let{op:t,val:a}=A;return this.resolveBitwiseOp(x,t,a,e,r)}return x===A?{apply:!1}:{apply:!0,value:A}}resolveBitwiseOp(x,A,e,r,t){return A!=="|"&&A!=="&"?(this.logger?.warn(`${X0} change-request unknown op "${A}" on ${t}.${r} \u2014 skipped`),{apply:!1}):typeof e!="number"?(this.logger?.warn(`${X0} change-request op "${A}" with non-number val on ${t}.${r} \u2014 skipped`),{apply:!1}):x===void 0?A==="|"?{apply:!0,value:e}:{apply:!1}:typeof x!="number"?(this.logger?.warn(`${X0} change-request op "${A}" on non-number ${t}.${r} \u2014 skipped`),{apply:!1}):{apply:!0,value:A==="|"?x|e:x&e}}isBitwiseOp(x){return this.isPlainRecord(x)&&"op"in x}isPlainRecord(x){return typeof x=="object"&&x!==null&&!Array.isArray(x)}pushChangeResults(x,A,e,r,t,a){for(let i of r)x.push({tag:A,sTag:e,stamp40:i.stamp40,user:i.user,outcome:t,resultCode:a})}async repullExecutedTags(x,A,e,r){let t=null;try{t=await this.utoMaster.requestStamps()}catch(a){this.logger?.warn(`${X0} change-request STAMPS re-fetch failed \u2014 using per-tag stamps: ${a}`)}for(let a of x)nA(r),await this.repullExecutedTag(a,A,t,e)}async repullExecutedTag(x,A,e,r){try{let t=await this.utoMaster.requestUto(x,0);if(!t){this.logger?.info(`${X0} change-request re-pull tag=0x${x.toString(16)} \u2014 device returned no data (E_EOD), DB row unchanged`);return}let a=await this.storage.getRowForTag(x),i=t.stamp;await this.storage.replaceUtoRow({tag:x,stamp:TA(i),flags:a?.flags??0,site_related:a?.site_related??0,data:t.data?new Uint8Array(t.data.buffer.slice(t.data.byteOffset,t.data.byteOffset+t.data.byteLength)):null});let l=r.get(x);if(l){let c=A.get(x),u=e&&c&&c.index<e.stamps.length?e.stamps[c.index]:i;l.dbStamp40=i,l.deviceStamp40=u}this.logger?.info(`${X0} change-request re-pull tag=0x${x.toString(16)} \u2192 stamp ${i}`)}catch(t){this.logger?.error(`${X0} change-request re-pull error tag=0x${x.toString(16)}: ${t}`)}}aggregateResult(x,A,e){let r=[...x.values()],t=[...A.values()],a=WF(t);return{tags:r,files:t,changeRequests:e,requiresReconnectSync:a.length>0,rebootFilesDeployed:a,totalTagsUploaded:r.filter(i=>i.outcome==="upload"&&!i.historic).length,totalTagsDownloaded:r.filter(i=>i.outcome==="download").length,totalTagsSkipped:r.filter(i=>i.outcome===Gr||i.outcome==="skip-db-readonly"||i.outcome===dt).length,totalHistoricRecordsAppended:r.reduce((i,l)=>i+(l.recordsAppended??0),0),totalFilesUploaded:t.filter(i=>i.outcome===Es).length,totalFilesDownloaded:t.filter(i=>i.outcome==="download").length,totalFilesDeleted:t.filter(i=>i.outcome===cs).length,totalChangeRequestsExecuted:e.filter(i=>i.outcome===QF).length,totalErrors:r.filter(i=>i.outcome===lr).length+t.filter(i=>i.outcome===lr).length+e.filter(i=>i.outcome===eu).length}}async sync(x){let{signal:A}=x??{},e=await this.validateDevice(A);nA(A),this.emitProgress(Nn,null,0,3);let r=this.buildTagMap(e),t=await this.utoMaster.requestStamps();if(!t)throw new Error(`${X0} requestStamps returned null`);this.emitProgress(Nn,"stamps",1,3);let a=await this.utoMaster.requestFileList();this.emitProgress(Nn,"file-list",2,3);let i=await this.resolveDbTags(r);this.emitProgress(Nn,"db-tags",3,3);let l=await this.buildTagStampCache(i,r,t),c=new Map,u=new Map,b=[],m=await this.isAppInDevPhase();return nA(A),await this.uploadUtoTags(i,l,c,A),nA(A),await this.uploadFiles(a,u,m,A),nA(A),await this.executeChangeRequests(r,t,l,c,b,A),nA(A),await this.downloadUtoTags(i,l,c,A),nA(A),await this.downloadFiles(a,u,m,A),nA(A),WF([...u.values()]).length===0&&await this.reconcileFileState(A),this.emitProgress("complete",null,0,0),this.aggregateResult(c,u,b)}async executeAdHocChangeRequest(x,A){let e=await this.utoMaster.requestDeviceInfo();if(!e)throw new Error(`${X0} requestDeviceInfo returned null`);let r=this.buildTagMap(e),t=await this.utoMaster.requestStamps();if(!t)throw new Error(`${X0} requestStamps returned null`);let a=r.get(x),i=a?.sTag??`0x${x.toString(16)}`,l=A.map(g=>({stamp40:g.stamp40,user:"",json:g.json})).sort((g,q)=>g.stamp40-q.stamp40),c=new Map,u=[],b=new Set;return await this.executeChangeRequestTag(x,i,a,l,t,c,u,b),b.size>0&&await this.repullExecutedTags(b,r,new Map,void 0),u.find(g=>g.outcome!==ds)?.outcome??ds}},tu=require("events"),nu=require("events"),iu=require("events"),su=5e3,sa=class xv extends iu.EventEmitter{constructor(A=he){super(),i0(this,"logger",A),i0(this,"ws",null),i0(this,"bridgeTransport",null),i0(this,"bridgeSignal"),i0(this,"bridgeResolve",null),i0(this,"bridgeReject",null),i0(this,"serverMessageCount",0),i0(this,"settled",!1),i0(this,"abortHandler",null),i0(this,"connectTimeout"),i0(this,"writeQueue",[]),i0(this,"isProcessingQueue",!1),i0(this,"queueAborted",!1),i0(this,"queueDrainPromise",Promise.resolve()),i0(this,"transportUnsubscribe",null)}static buildSyncUrl(A,e){return`wss://${A}/uto/1/sync/${e}`}resetBridgeState(){this.serverMessageCount=0,this.settled=!1,this.abortHandler=null,this.connectTimeout=void 0,this.writeQueue=[],this.isProcessingQueue=!1,this.queueAborted=!1,this.queueDrainPromise=Promise.resolve(),this.bridgeResolve=null,this.bridgeReject=null,this.bridgeTransport=null,this.bridgeSignal=void 0,this.transportUnsubscribe=null}async processWriteQueue(){if(!this.isProcessingQueue){for(this.isProcessingQueue=!0;this.writeQueue.length>0&&!this.queueAborted;){let A=this.writeQueue.shift();try{await y8(this.bridgeTransport,A)}catch(e){let r=e instanceof Error?e.message:String(e);this.logger.error(`Error writing to transport: ${r}`)}}this.isProcessingQueue=!1}}cleanup(){this.transportUnsubscribe&&(this.transportUnsubscribe(),this.transportUnsubscribe=null),this.abortHandler&&this.bridgeSignal&&(this.bridgeSignal.removeEventListener("abort",this.abortHandler),this.abortHandler=null),this.connectTimeout!==void 0&&(clearTimeout(this.connectTimeout),this.connectTimeout=void 0),this.ws=null}settle(A,e){this.settled||(this.settled=!0,this.cleanup(),A==="resolve"?this.bridgeResolve?.({serverMessageCount:this.serverMessageCount}):this.bridgeReject?.(e))}attachWebSocketHandlers(A,e){let r=t=>{A.readyState===WebSocket.OPEN&&!this.bridgeSignal?.aborted&&!this.settled&&A.send(t)};this.abortHandler=()=>{this.logger.info("WebSocket bridge aborted"),this.queueAborted=!0,this.writeQueue.length=0,(A.readyState===WebSocket.OPEN||A.readyState===WebSocket.CONNECTING)&&A.close(),this.settle("reject",new Error("Operation aborted"))},this.bridgeSignal&&this.bridgeSignal.addEventListener("abort",this.abortHandler),A.onopen=()=>{this.connectTimeout!==void 0&&(clearTimeout(this.connectTimeout),this.connectTimeout=void 0),this.logger.info(`WebSocket connected to ${e}`),this.transportUnsubscribe=this.bridgeTransport.onData(r),this.emit("wsConnected")},A.onmessage=t=>{this.serverMessageCount++,this.emit("serverMessage",this.serverMessageCount),!(this.bridgeSignal?.aborted||this.settled)&&(this.writeQueue.push(t.data),this.isProcessingQueue||(this.queueDrainPromise=this.processWriteQueue()))},A.onclose=t=>{this.logger.info(`WebSocket closed (server=${e}, code=${t.code}, messages=${this.serverMessageCount})`),this.emit("wsClosed",t.code,t.reason),this.queueDrainPromise.then(()=>this.settle("resolve")).catch(()=>this.settle("resolve"))},A.onerror=t=>{this.logger.error(`WebSocket error (server=${e})`),this.emit("wsError",t),this.queueAborted=!0,this.writeQueue.length=0,this.settle("reject",new Error("WebSocket error"))}}async bridge(A,e,r,t){return new Promise((a,i)=>{if(t?.aborted){i(new Error("Operation aborted"));return}this.resetBridgeState(),this.bridgeTransport=A,this.bridgeSignal=t,this.bridgeResolve=a,this.bridgeReject=i;let l=xv.buildSyncUrl(e,r);this.logger.info(`Opening WebSocket: ${l}`);let c=new WebSocket(l);c.binaryType="arraybuffer",this.ws=c,this.connectTimeout=setTimeout(()=>{c.readyState===WebSocket.CONNECTING&&(this.logger.error("WebSocket connection timeout"),c.close(),this.settle("reject",new Error("WebSocket connection timeout")))},su),this.attachWebSocketHandlers(c,e)})}close(){this.ws&&this.ws.readyState===WebSocket.OPEN&&this.ws.close()}},Av="https://lic.mydatanet.at/api/2/";async function ev(x,A=Av){let e=`${A}devices/${x}/assignment`,r=await fetch(e);if(!r.ok)throw new Error(`Failed to get device assignment: ${r.status} ${r.statusText}`);return r.json()}var rv=class extends nu.EventEmitter{constructor(x=he){super(),i0(this,"logger",x)}async execute(x,A,e,r){let t=e;t||(this.logger.info("[LegacySync] No serverUrl provided, resolving via device assignment..."),this.emit("syncPhase",{phase:"resolving-server"}),t=(await ev(A)).server_url,this.logger.info("[LegacySync] Resolved server URL: "+t)),this.logger.info("[LegacySync] Starting legacy sync (server="+t+")");let a=new sa(this.logger);a.on("wsConnected",()=>this.emit("wsConnected")),a.on("wsClosed",(l,c)=>this.emit("wsClosed",l,c)),a.on("wsError",l=>this.emit("wsError",l)),a.on("serverMessage",l=>this.emit("serverMessage",l));let i=await a.bridge(x,t,A,r);return this.logger.info("[LegacySync] Legacy sync completed (serverMessages="+i.serverMessageCount+")"),{serverMessageCount:i.serverMessageCount}}},au=require("events"),tv="Operation aborted";function ou(x){return x instanceof Error?x.message:String(x)}function us(x){if(x?.aborted)throw new Error(tv)}var nv=class extends au.EventEmitter{constructor(x,A=he){super(),i0(this,"atHandler",x),i0(this,"logger",A)}async execute(x,A,e,r){this.logger.info("Starting debug-enabled sync");let t=[{name:"mnt",queryServer:i=>this.atHandler.queryMntServerConfig(i),initiateSync:i=>this.atHandler.initiateMntSync(i)},{name:"mdn",queryServer:i=>this.atHandler.queryMdnServerConfig(i),initiateSync:i=>this.atHandler.initiateMdnSync(i)}],a={};for(let i of t)try{a[i.name]=await this.runSyncPhase(i,x,A,r)}catch(l){if(r?.aborted)throw new Error(tv);let c=`${i.name.toUpperCase()} sync phase failed: ${ou(l)}`;throw this.logger.error(c),new Error(c)}return this.logger.info(`Debug sync completed (mntMessages=${a.mnt}, mdnMessages=${a.mdn})`),{mntServerMessageCount:a.mnt,mdnServerMessageCount:a.mdn}}async runSyncPhase(x,A,e,r){us(r);let t=x.name.toUpperCase();this.emit("syncPhase",{phase:x.name}),this.logger.info(`Phase: Querying ${t} server configuration`);let a=await x.queryServer(r);this.logger.info(`${t} server domain: ${a}`),us(r),await x.initiateSync(r),us(r);let i=await this.syncWithServer(A,a,e,r);return this.logger.info(`${t} phase completed (serverMessages=${i.serverMessageCount})`),i.serverMessageCount}async syncWithServer(x,A,e,r){let t=new sa(this.logger),a=!1;t.on("wsConnected",()=>this.emit("wsConnected"));let i=this.atHandler.createConCloseMonitor(()=>{a=!0,this.logger.info("Device initiated close (+CONCLOSE), closing WebSocket"),t.close()});try{let l=await t.bridge(x,A,e,r);return a?this.logger.info("Connection closed by device (+CONCLOSE)"):(this.logger.info("Connection closed by server, sending +CONCLOSE to device"),await this.atHandler.sendConnectionClose(r)),l}finally{i()}}},Fu=class extends tu.EventEmitter{constructor(x,A,e=he){super(),i0(this,"syncTransport",x),i0(this,"logger",e),i0(this,"atHandler"),this.atHandler=A??null}async sync(x){let A=this.atHandler?"debug":"legacy";this.emit("syncStart",{mode:A});try{if(this.atHandler)try{return this.emit("syncPhase",{phase:"debug-sync"}),await this.syncWithDebug(x)}catch(e){return this.logger.warn("[SyncManager] Debug sync failed, falling back to legacy sync: "+(e instanceof Error?e.message:String(e))),this.emit("syncPhase",{phase:"debug-fallback-legacy"}),await this.syncLegacy(x)}return this.emit("syncPhase",{phase:"legacy"}),await this.syncLegacy(x)}catch(e){throw this.emit("syncError",e),e}}async syncLegacy(x){let A=new rv(this.logger);A.on("syncPhase",t=>this.emit("syncPhase",t));let r={mode:"legacy",serverMessageCount:(await A.execute(this.syncTransport,x.serialNumber,x.serverUrl,x.signal)).serverMessageCount};return this.emit("syncComplete",r),r}async syncWithDebug(x){let A=new nv(this.atHandler,this.logger);A.on("syncPhase",t=>this.emit("syncPhase",t));let e=await A.execute(this.syncTransport,x.serialNumber,x.serverUrl??"",x.signal),r={mode:"debug",serverMessageCount:e.mntServerMessageCount+e.mdnServerMessageCount,mntServerMessageCount:e.mntServerMessageCount,mdnServerMessageCount:e.mdnServerMessageCount};return this.emit("syncComplete",r),r}dispose(){}},vu=require("events"),Hx={MNT_CFG:"at+mntcfg?",MDN_CFG:"at+mdncfg?",MNT_SYNC:"at+mntsync",MDN_SYNC:"at+mdnsync",CON_CLOSE:"at+conclose",APP_GET_METADATA:"AT+APP=GETMETADATA",APP_GET_DATAVALUE:"AT+APP=GETDATAVALUE",APP_TRIG_MEASURE:"AT+APP=TRIGMEASURE",APP_TRIG_MEASURE_TEST:"AT+APP=TRIGMEASURE=?",ATI:"ati",RM2M_STATE:"at+rm2mstate?",TX:"at+tx",TX_MAINTENANCE:"at+tx=4",TX_GSM_POSITION:"at+tx=1",TX_MODE_TRIGGERED:"at+txmode=0",TX_MODE_WAKEUP:"at+txmode=1",TX_MODE_ONLINE:"at+txmode=2",COMPANION_CERT:"AT+COMPCERT",COMPANION_CERT_TEST:"AT+COMPCERT=?"},nx={OK:"OK",ERROR:"ERROR",SYNC_START:"+SYNC START",MEASURED:"+MEASURED",CON_CLOSE:"+CONCLOSE",MNT_CFG_PREFIX:"+MNTCFG",MDN_CFG_PREFIX:"+MDNCFG",RM2M_STATE:"+RM2MSTATE",ERROR_PIN_REQUIRED:"ERROR PIN REQUIRED",ERROR_NO_DATA:"ERROR NO DATA",COMPCERT_ERROR:/\+COMPCERT ERROR:\s*(\d+)/},fA=1e4,iv=9e4,sv=/(?:ERROR PIN REQUIRED|ERROR NO DATA|ERROR|OK)\r\n/;function av(){return{buffer:"",closedByDevice:!1,reset(){this.buffer="",this.closedByDevice=!1}}}var Ur="Operation aborted",oA=class extends Error{constructor(x="AT command handler was disposed"){super(x),this.name="AtHandlerDisposedError"}},aa=class extends Error{constructor(x="Device returned ERROR response"){super(x),this.name="AtDeviceError"}},fu=class extends vu.EventEmitter{constructor(x,A=he){super(),i0(this,"transport",x),i0(this,"logger",A),i0(this,"mutex",new Vs("AtCommandHandler")),i0(this,"bufferState",av()),i0(this,"responseCallback",null),i0(this,"decoder",new TextDecoder),i0(this,"dataHandler"),i0(this,"disposeTransportListener"),i0(this,"isDisposed",!1),i0(this,"activeAbort",null),i0(this,"session"),this.dataHandler=e=>this.handleIncomingData(e),this.disposeTransportListener=this.transport.onData(this.dataHandler),this.session={sendAndWait:(e,r,t=fA,a)=>this.executeSendAndWait(e,r,t,a),sendRaw:(e,r=fA)=>this.executeSendRaw(e,r),queryMntServerConfig:e=>this.executeQueryConfig(Hx.MNT_CFG,nx.MNT_CFG_PREFIX,e),queryMdnServerConfig:e=>this.executeQueryConfig(Hx.MDN_CFG,nx.MDN_CFG_PREFIX,e),initiateMntSync:e=>this.executeInitiateMntSync(e),initiateMdnSync:e=>this.executeInitiateMdnSync(e),sendCompanionCert:(e,r)=>this.executeSendCompanionCert(e,r),queryCompanionCertSupport:e=>this.executeQueryCompanionCertSupport(e),sendConnectionClose:e=>this.executeSendConnectionClose(e)}}get isBusy(){return this.mutex.islocked}get disposed(){return this.isDisposed}async withAtLock(x){await this.mutex.requestLock();try{if(this.isDisposed)throw new oA;return await x(this.session)}finally{this.mutex.unlock()}}handleIncomingData(x){let A=this.decoder.decode(x);this.bufferState.buffer+=A,this.emit("data",A),this.responseCallback&&this.responseCallback(this.bufferState.buffer),!this.responseCallback&&this.bufferState.buffer.length>1e3&&(this.bufferState.buffer=this.bufferState.buffer.slice(-500))}encodeCommand(x){let A=new Uint8Array(x.length+2);for(let e=0;e<x.length;e++)A[e]=x.charCodeAt(e);return A[x.length]=10,A[x.length+1]=13,A.buffer}makeCleanup(x,A,e){return()=>{this.responseCallback=null,this.activeAbort=null,clearTimeout(x),A&&e&&A.removeEventListener("abort",e)}}makeResponseChecker(x,A,e,r){let t=x instanceof RegExp;return a=>{if(x!==nx.ERROR&&a.includes(nx.ERROR)){A(),r(new aa);return}let i=!1,l=a;if(t){let c=a.match(x);c&&(i=!0,l=c[0])}else i=a.includes(x);if(i){A(),e(l);return}a.length>500&&(this.bufferState.buffer=this.bufferState.buffer.slice(-250))}}executeSendAndWait(x,A,e,r){return new Promise((t,a)=>{if(this.isDisposed){a(new oA);return}if(r?.aborted){a(new Error(Ur));return}x&&(this.bufferState.buffer="");let l=A instanceof RegExp?A.source:A,c={cleanup:()=>{}},u=setTimeout(()=>{c.cleanup(),a(new Error(`Timeout waiting for response: ${l}`))},e),b=()=>{c.cleanup(),a(new Error(Ur))};c.cleanup=this.makeCleanup(u,r,b),r&&r.addEventListener("abort",b);let m=this.makeResponseChecker(A,c.cleanup,t,a);this.responseCallback=m,this.activeAbort=()=>{c.cleanup(),a(new oA)},!x&&this.bufferState.buffer&&m(this.bufferState.buffer),x&&(this.logger.info("TX: "+x),this.transport.write(this.encodeCommand(x)).catch(g=>{c.cleanup(),a(g)}))})}executeSendRaw(x,A){return new Promise((e,r)=>{if(this.isDisposed){r(new oA);return}this.bufferState.buffer="";let t=setTimeout(()=>{a(),r(new Error(`Timeout waiting for raw AT response to: ${x}`))},A),a=this.makeCleanup(t);this.activeAbort=()=>{a(),r(new oA)},this.responseCallback=i=>{sv.test(i)&&(a(),this.logger.info("RX: "+i.trim()),e(i))},this.logger.info("TX: "+x),this.transport.write(this.encodeCommand(x)).catch(i=>{a(),r(i)})})}executeQueryConfig(x,A,e){return new Promise((r,t)=>{if(this.isDisposed){t(new oA);return}if(e?.aborted){t(new Error(Ur));return}this.bufferState.buffer="";let a={cleanup:()=>{}},i=setTimeout(()=>{a.cleanup(),this.logger.error(`Timeout waiting for ${A} server config`),t(new Error(`Timeout waiting for ${A} response \u2014 server configuration not available`))},fA),l=()=>{a.cleanup(),t(new Error(Ur))};a.cleanup=this.makeCleanup(i,e,l),e&&e.addEventListener("abort",l);let c=new RegExp(`\\${A}:\\s*<?([^,>\\s]+)>?`);this.activeAbort=()=>{a.cleanup(),t(new oA)},this.responseCallback=u=>{let b=u.match(c);if(b){a.cleanup();let m=b[1].trim();this.logger.info(`Server config ${A}: ${m}`),r(m);return}u.length>500&&(this.bufferState.buffer=this.bufferState.buffer.slice(-250))},this.logger.info("TX: "+x),this.transport.write(this.encodeCommand(x)).catch(u=>{a.cleanup(),this.logger.error(`Failed to send ${A} command: `+(u instanceof Error?u.message:String(u))),t(u)})})}async sendAndWait(x,A,e=fA,r){return this.withAtLock(t=>t.sendAndWait(x,A,e,r))}async sendRaw(x,A=fA){return this.withAtLock(e=>e.sendRaw(x,A))}async queryMntServerConfig(x){return this.withAtLock(A=>A.queryMntServerConfig(x))}async queryMdnServerConfig(x){return this.withAtLock(A=>A.queryMdnServerConfig(x))}async initiateMntSync(x){return this.withAtLock(A=>A.initiateMntSync(x))}async initiateMdnSync(x){return this.withAtLock(A=>A.initiateMdnSync(x))}async sendCompanionCert(x,A){return this.withAtLock(e=>e.sendCompanionCert(x,A))}async executeInitiateMntSync(x){this.logger.info("Initiating MNT sync"),await this.executeSendAndWait(Hx.MNT_SYNC,nx.OK,fA,x)}async executeInitiateMdnSync(x){this.logger.info("Initiating MDN sync");try{await this.executeSendAndWait(Hx.MDN_SYNC,nx.OK,fA,x),await this.executeSendAndWait(null,nx.SYNC_START,fA,x)}catch(A){this.logger.error("Failed to initiate MDN sync: "+(A instanceof Error?A.message:String(A)))}}async executeSendCompanionCert(x,A){if(this.isDisposed)throw new oA;if(A?.aborted)throw new Error(Ur);let e=x.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-x.length%4)%4),r=e.length,t=await this.executeSendAndWait(`${Hx.COMPANION_CERT}=${r}`,nx.OK,fA,A),a=parseInt(t.match(/(\d+)/)[1],10),i=0;for(;i<r;){let l=Math.min(a,r-i),c=e.slice(i,i+l);await this.executeSendAndWait(`${Hx.COMPANION_CERT}=${l},${i},${c}`,nx.OK,fA,A),i+=l}return this.executeCompanionCertFinalize(r,A)}executeCompanionCertFinalize(x,A){return new Promise((e,r)=>{if(this.isDisposed){r(new oA);return}if(A?.aborted){r(new Error(Ur));return}this.bufferState.buffer="";let t={cleanup:()=>{}},a=setTimeout(()=>{t.cleanup(),r(new Error("Timeout waiting for AT+COMPCERT finalize response"))},fA),i=()=>{t.cleanup(),r(new Error(Ur))};t.cleanup=this.makeCleanup(a,A,i),A&&A.addEventListener("abort",i),this.activeAbort=()=>{t.cleanup(),r(new oA)},this.responseCallback=c=>{let u=c.match(nx.COMPCERT_ERROR);if(u){t.cleanup(),e({success:!1,errorCode:parseInt(u[1],10)});return}if(c.includes(nx.OK)){t.cleanup(),e({success:!0});return}c.length>500&&(this.bufferState.buffer=this.bufferState.buffer.slice(-250))};let l=`${Hx.COMPANION_CERT}=0,${x}`;this.logger.info("TX: "+l),this.transport.write(this.encodeCommand(l)).catch(c=>{t.cleanup(),r(c)})})}async queryCompanionCertSupport(x){return this.withAtLock(A=>A.queryCompanionCertSupport(x))}async executeQueryCompanionCertSupport(x){try{return await this.executeSendAndWait(Hx.COMPANION_CERT_TEST,nx.OK,fA,x),!0}catch(A){if(A instanceof oA)throw A;return!1}}async sendConnectionClose(x){return this.withAtLock(A=>A.sendConnectionClose(x))}async executeSendConnectionClose(x){try{await this.executeSendAndWait(Hx.CON_CLOSE,nx.CON_CLOSE,fA,x)}catch(A){this.logger.error("Failed to receive +CONCLOSE response: "+(A instanceof Error?A.message:String(A)))}}createConCloseMonitor(x){let A="",e=r=>{A+=r,A.includes(nx.CON_CLOSE)&&(A="",this.bufferState.closedByDevice=!0,x()),A.length>1e3&&(A=A.slice(-500))};return this.on("data",e),()=>{this.off("data",e)}}dispose(){this.isDisposed||(this.isDisposed=!0,this.activeAbort?.(),this.disposeTransportListener(),this.responseCallback=null,this.activeAbort=null,this.removeAllListeners())}},ov=(x=>(x[x.FORMAT=1]="FORMAT",x[x.SIGNATURE=2]="SIGNATURE",x[x.EXPIRED=3]="EXPIRED",x[x.NO_MDN_PUBKEY=4]="NO_MDN_PUBKEY",x[x.BUSY=5]="BUSY",x[x.INTERNAL=6]="INTERNAL",x))(ov||{}),lu=require("events"),Ds="requesting-cert",ps="cert-revoked",Fv=class Ms extends lu.EventEmitter{constructor(){super(...arguments),i0(this,"utoMaster",null)}async authenticate(A){let e=A.logger??Jn,{signal:r,atHandler:t}=A,a=()=>{if(r?.aborted)throw new Error("Operation aborted")};try{this.emitPhase("checking-cert"),a();let i=await this.loadOrGenerateKeypair(A.storage),l=await A.storage.getCertificate(A.apiConfig.apiHost);(l===null||!Hs(l.notAfter))&&(e.info("Companion cert missing or near expiry \u2014 requesting new cert"),this.emitPhase(Ds),a(),l=await this.requestAndStoreCert(i,A)),this.utoMaster=new _8(A.utoTransport,e,A.timeSource),this.emitPhase("cert-presenting"),a();let c=l;l=await t.withAtLock(async m=>{let g=await this.presentCertWithRefresh(m,c,i,A);return await m.initiateMdnSync(r),g}),this.emitPhase("ecs-handshake"),a(),await this.utoMaster.init();let u=await this.utoMaster.initiateEcsHandshake({companionPublicKey:i.publicKey,companionPrivateKey:i.privateKey,signal:r});if(!u.success)return this.fail("ecs-handshake",`ECS handshake failed (code ${u.resultCode})`);this.emitPhase("connected");let b=this.utoMaster;return this.utoMaster=null,{success:!0,utoMaster:b}}catch(i){return this.handleError(i)}}dispose(){this.utoMaster=null,this.removeAllListeners()}async loadOrGenerateKeypair(A){let e=await A.getKeypair();if(e!==null)return e;let r=await hs();return await A.saveKeypair(r),r}static async fetchCertOrThrowRevoked(A,e){try{return await C8(e.apiConfig,{publicKey:A.publicKey,subject:e.subject})}catch(r){throw r instanceof Ot&&(r.httpStatus===401||r.httpStatus===404)?(await e.storage.clearCertificate(e.apiConfig.apiHost),new bs(ps,`Companion cert revoked or session expired (HTTP ${r.httpStatus})`,{httpStatus:r.httpStatus,apiCode:r.code})):r}}async requestAndStoreCert(A,e){let r=await Ms.fetchCertOrThrowRevoked(A,e),t={base64Url:r.certificateBase64Url,notAfter:r.notAfter};return await e.storage.saveCertificate(t,e.apiConfig.apiHost),t}static async refreshCertificate(A){let e=await A.storage.getKeypair(),r=e!==null?e:await(async()=>{let i=await hs();return await A.storage.saveKeypair(i),i})(),t=await Ms.fetchCertOrThrowRevoked(r,A),a={base64Url:t.certificateBase64Url,notAfter:t.notAfter};return await A.storage.saveCertificate(a,A.apiConfig.apiHost),a}static async clearCredentials(A,e){await A.clearCertificate(e)}async presentCertWithRefresh(A,e,r,t){let a=await A.sendCompanionCert(e.base64Url,t.signal);if(a.success||a.errorCode===3&&((t.logger??Jn).info("Device reported EXPIRED \u2014 refreshing cert and retrying"),this.emitPhase(Ds),e=await this.requestAndStoreCert(r,t),a=await A.sendCompanionCert(e.base64Url,t.signal),a.success))return e;throw new bs("cert-presenting",`AT+COMPCERT rejected (code ${a.errorCode??"?"})`,{certErrorCode:a.errorCode})}emitPhase(A){this.emit("phase",A)}fail(A,e){return this.emit("phase","error"),{success:!1,phase:A,error:e}}handleError(A){return A instanceof bs?(this.emit("phase",A.phase===ps?ps:"error"),{success:!1,phase:A.phase,error:A.message,certErrorCode:A.certErrorCode,httpStatus:A.httpStatus,apiCode:A.apiCode}):(this.emit("phase","error"),A instanceof Ot?{success:!1,phase:Ds,error:A.message,httpStatus:A.httpStatus,apiCode:A.code}:{success:!1,phase:"error",error:A instanceof Error?A.message:String(A)})}};i0(Fv,"encodePublicKeyBase64Url",Us);var cu=Fv,bs=class extends Error{constructor(x,A,e={}){super(A),i0(this,"phase",x),i0(this,"extra",e),this.name="AuthError"}get certErrorCode(){return this.extra.certErrorCode}get httpStatus(){return this.extra.httpStatus}get apiCode(){return this.extra.apiCode}},vv=(x=>(x.CERT_FORMAT="cert_format",x.CERT_SIGNATURE="cert_signature",x.CERT_EXPIRED="cert_expired",x.NO_MDN_PUBKEY="no_mdn_pubkey",x.DEVICE_BUSY="device_busy",x.DEVICE_INTERNAL="device_internal",x.ECS_FAILURE="ecs_failure",x.CERT_REVOKED="cert_revoked",x.SESSION_EXPIRED="session_expired",x.ABORTED="aborted",x.UNKNOWN="unknown",x))(vv||{}),Eu={cert_format:"companion_auth.error.cert_format",cert_signature:"companion_auth.error.cert_signature",cert_expired:"companion_auth.error.cert_expired",no_mdn_pubkey:"companion_auth.error.no_mdn_pubkey",device_busy:"companion_auth.error.device_busy",device_internal:"companion_auth.error.device_internal",ecs_failure:"companion_auth.error.ecs_failure",cert_revoked:"companion_auth.error.cert_revoked",session_expired:"companion_auth.error.session_expired",aborted:"companion_auth.error.aborted",unknown:"companion_auth.error.unknown"};function Bu(x){if(x.certErrorCode!==void 0)switch(x.certErrorCode){case 1:return"cert_format";case 2:return"cert_signature";case 3:return"cert_expired";case 4:return"no_mdn_pubkey";case 5:return"device_busy";case 6:return"device_internal"}return x.phase==="cert-revoked"?x.httpStatus===401?"session_expired":"cert_revoked":x.phase==="ecs-handshake"?"ecs_failure":x.error==="Operation aborted"?"aborted":"unknown"}var Cu=require("events");function fv(x){let A=x.replace(/\r\nOK\r\n$/,"").trim();return A?A.split("\f").map(e=>{let r=e.split(" ");return r.length<4?null:{name:r[0],scale:parseFloat(r[1]),offset:parseFloat(r[2]),unit:r[3]}}).filter(e=>e!==null):[]}function lv(x){let A=x.replace(/^\+[^\r\n]*\r\n/gm,"").replace(/\r\nOK\r\n$/,"").trim();return A?A.split("\f"):[]}function cv(x,A,e){let r=parseFloat(x);return isNaN(r)?x:parseFloat(Number(r*A+e).toFixed(3)).toString()}function Rs(x,A){return x.map((e,r)=>({name:e.name,displayValue:cv(A[r]??"",e.scale,e.offset),unit:e.unit}))}var du=2e3,Ev=class extends Cu.EventEmitter{constructor(x,A=he){super(),i0(this,"atHandler",x),i0(this,"logger",A),i0(this,"datapoints",[]),i0(this,"values",[]),i0(this,"polling",!1),i0(this,"pollTimer",null),i0(this,"fetchInProgress",!1),i0(this,"fetchPromise",null)}async checkSupport(){this.logger.info("Checking local data support");let x=await this.atHandler.sendRaw(Hx.APP_GET_METADATA),A=x.includes(nx.OK)?{supported:!0,pinRequired:!1}:x.includes(nx.ERROR_PIN_REQUIRED)?{supported:!0,pinRequired:!0}:x.includes(nx.ERROR_NO_DATA)?{supported:!1,pinRequired:!1}:x.includes(nx.ERROR)?{supported:!1,pinRequired:!1}:{supported:!1,pinRequired:!1};return this.logger.info("Local data support: "+JSON.stringify(A)),A}async fetchMetadata(x){this.logger.info("Fetching metadata"+(x?" (with PIN)":""));let A=x?`${Hx.APP_GET_METADATA}=${x}`:Hx.APP_GET_METADATA,e=await this.atHandler.sendRaw(A);if(this.logger.debug("Metadata response: "+e),e.includes(nx.ERROR_PIN_REQUIRED))return this.logger.warn("PIN required/invalid for metadata"),null;if(e.includes(nx.ERROR_NO_DATA))return this.logger.warn("No data available from device"),this.datapoints=[],this.values=[],this.emit("metadata",[]),this.emit("error","No local data available from device"),[];if(e.includes(nx.OK)){let r=fv(e);return this.logger.info("Parsed "+r.length+" datapoints"),this.datapoints=r,this.values=new Array(r.length).fill(""),this.emit("metadata",r),r}return e.includes(nx.ERROR)?(this.logger.error("Metadata fetch error: "+e),this.emit("error","Device returned error during metadata fetch"),[]):[]}async fetchValues(x){return this.readValues(A=>this.atHandler.sendRaw(A),x)}async readValues(x,A){try{this.logger.debug("Fetching values");let e=A?`${Hx.APP_GET_DATAVALUE}=${A}`:Hx.APP_GET_DATAVALUE,r=await x(e);if(r.includes(nx.OK)){let t=lv(r);return this.logger.debug("Values: "+t.join(", ")),this.values=t,this.emit("values",t),this.emit("displayValues",Rs(this.datapoints,t)),t}return[]}catch(e){return this.logger.warn("Value fetch error: "+(e instanceof Error?e.message:String(e))),[]}}async checkMeasurementTriggerSupport(){this.logger.info("Checking measurement trigger support");try{let A=(await this.atHandler.sendRaw(Hx.APP_TRIG_MEASURE_TEST)).includes(nx.OK);return this.logger.info("Measurement trigger support: "+A),A}catch(x){if(x instanceof oA)throw x;return this.logger.warn("Measurement trigger probe failed: "+(x instanceof Error?x.message:String(x))),!1}}async triggerMeasurement(x={}){let{pin:A,timeoutMs:e=iv,signal:r}=x;return this.logger.info("Triggering measurement"),this.atHandler.withAtLock(async t=>{let a=await t.sendRaw(Hx.APP_TRIG_MEASURE);if(this.logger.debug("Trigger measurement response: "+a),!a.includes(nx.OK))return this.logger.warn("Measurement trigger rejected: "+a.trim()),{outcome:"rejected",values:[],response:a};this.emit("measurementTriggered");try{let i=await t.sendAndWait(null,nx.MEASURED,e,r);return this.emit("measurementCompleted"),{outcome:"measured",values:await this.readValues(c=>t.sendRaw(c),A),response:i}}catch(i){if(i instanceof oA)throw i;let l="timeout";return i instanceof aa?l="error":r?.aborted&&(l="aborted"),this.logger.warn(`Measurement ${l} while waiting for ${nx.MEASURED}: `+(i instanceof Error?i.message:String(i))),this.emit("measurementFailed",l),{outcome:l,values:[],response:a}}})}async startPolling(x,A=du){if(this.polling){this.logger.warn("Polling already active \u2014 ignoring startPolling call");return}this.logger.info("Starting polling every "+A+" ms"),this.polling=!0,this.fetchInProgress=!1,this.emit("pollingStarted"),this.fetchPromise=this.fetchValues(x),await this.fetchPromise,this.fetchPromise=null,this.polling&&(this.pollTimer=setInterval(()=>{this.fetchInProgress||(this.fetchInProgress=!0,this.fetchPromise=this.fetchValues(x).finally(()=>{this.fetchInProgress=!1,this.fetchPromise=null}))},A))}async stopPolling(){this.pollTimer&&(clearInterval(this.pollTimer),this.pollTimer=null),this.polling&&(this.logger.info("Polling stopped"),this.polling=!1,this.emit("pollingStopped")),this.fetchPromise&&await this.fetchPromise}getSnapshot(){return{datapoints:[...this.datapoints],values:[...this.values],isPolling:this.polling}}getDisplayValues(){return Rs(this.datapoints,this.values)}dispose(){this.stopPolling(),this.datapoints=[],this.values=[],this.removeAllListeners()}};async function uu(x,A,e){let r=a=>{if(a instanceof oA)throw a},t=new Ev(x);try{let a=await x.queryMdnServerConfig(e).catch(m=>(r(m),!1)),i=await t.checkSupport().catch(m=>(r(m),{supported:!1,pinRequired:!1})),l=i.supported?await t.checkMeasurementTriggerSupport().catch(m=>(r(m),!1)):!1,c=i.supported?{pinRequired:i.pinRequired,canTriggerMeasurement:l}:!1,u=!1,b=!1;if(a){let[m,g]=await Promise.all([x.queryCompanionCertSupport(e).catch(q=>(r(q),!1)),A?.getCertificate(a)]);u=m,b=g!=null&&Hs(g.notAfter)}return{hostname:a,localData:c,secureConnection:u,validCert:b}}finally{t.dispose()}}var Du=require("events"),pu={0:"trigger",1:"wakeup",2:"online"},bu={0:["2G","","GSM"],1:["2G","Compact","GSM-COMPACT"],2:["3G","","UTRAN"],3:["2G","EDGE","GSM-EGPRS"],4:["3G","HSDPA","UTRAN-HSDPA"],5:["3G","HSUPA","UTRAN-HSUPA"],6:["3G","HSPA+","UTRAN-HSXPA"],7:["4G","","EUTRAN"],8:["4G","LTE-M","LTE-CATM1"],9:["4G","NB-IoT","LTE-CATNB1"],100:["WiFi","","WIFI"],101:["LAN","Ethernet","ETHERNET"],102:["Local","Wireless","WIRELESS"],103:["Local","Wired","WIRED"]},mu={"NO SCRIPT":"none","SCRIPT ERROR":"error","SCRIPT OK":"ok"},Yx={FAILED:1,ACTIVE:2,STARTED:4,RETRY:8,WAKEUPABLE:16,EXTSIM:32,DISABLED:64,WAKEUP:256,POSUPDATE_ACTIVE:512},ju=Yx.FAILED|Yx.ACTIVE|Yx.STARTED|Yx.RETRY|Yx.WAKEUPABLE|Yx.EXTSIM|Yx.DISABLED|Yx.WAKEUP|Yx.POSUPDATE_ACTIVE,ZF=`${nx.RM2M_STATE}: `;function Bv(x=0){let A=(x&Yx.WAKEUPABLE)!==0,e="offline",r=A;return x&Yx.POSUPDATE_ACTIVE?(e="locating",r=!1):x&Yx.RETRY?(e="retry",r=!1):x&Yx.STARTED?(e="dialing",r=!1):x&Yx.ACTIVE?(e="active",r=!1):x&Yx.FAILED?(e="failed",r=A):x&Yx.DISABLED&&(e="disabled",r=!1),{signal:e,simType:(x&Yx.EXTSIM)!==0?"external":"internal",wakeupable:r,unknownFlags:x&~ju}}function hu(x){if(x===void 0)return null;let A=parseInt(x,10);return isNaN(A)?x:pu[A]??x}function gu(x){if(x===void 0)return null;let A=parseInt(x,10);return isNaN(A)?null:bu[A]??["unknown",`itf#${x}`,`itf#${x}`]}function ku(x){if(x.length===0)return null;let A=x.join(",");return mu[A]??A}function Cv(x){let A=x.split(","),[e,r,t,a,...i]=A;if(!e||!/^-?\d+$/.test(e)||!r||!/^\d+$/.test(r))return null;let l=parseInt(r,10),c=gu(a),u=a!==void 0?parseInt(a,10):NaN;return{stamp:new Date,rssi:u>=101?null:parseInt(e,10),state:l,uplinkState:Bv(l),uplinkMode:hu(t),uplinkInterface:c?c[0]:null,uplinkInterfaceExtended:c?c[1]:null,uplinkInterfaceTechnical:c?c[2]:null,scriptState:ku(i)}}function dv(x){let A=x.indexOf(ZF);if(A===-1)return null;let e=x.substring(A+ZF.length),r=e.search(/\r?\n/);if(r===-1)return null;let t=e.substring(0,r).trim();return t?Cv(t):null}var yu=5e3,_u=class extends Du.EventEmitter{constructor(x,A=Jn){super(),i0(this,"atHandler"),i0(this,"logger"),i0(this,"lastState",null),i0(this,"pollingTimer",null),i0(this,"polling",!1),i0(this,"fetchInProgress",!1),i0(this,"fetchPromise",null),this.atHandler=x,this.logger=A}async fetchState(){try{let x=await this.atHandler.sendRaw(Hx.RM2M_STATE),A=dv(x);return A?(this.lastState=A,this.emit("state",A),this.logger.debug("RM2M state fetched successfully")):this.logger.warn("Failed to parse RM2M state response"),A}catch(x){let A=x instanceof Error?x.message:String(x);return this.logger.error(`Failed to fetch RM2M state: ${A}`),this.emit("error",A),null}}startPolling(x=yu){if(this.polling){this.logger.debug("Polling already active, ignoring startPolling call");return}this.logger.info(`Starting RM2M state polling every ${x}ms`),this.polling=!0,this.fetchInProgress=!1,this.emit("pollingStarted"),this.runGuardedFetch(),this.pollingTimer=setInterval(()=>this.runGuardedFetch(),x)}runGuardedFetch(){this.fetchInProgress||(this.fetchInProgress=!0,this.fetchPromise=this.fetchState().finally(()=>{this.fetchInProgress=!1,this.fetchPromise=null}))}async stopPolling(){this.pollingTimer&&(clearInterval(this.pollingTimer),this.pollingTimer=null),this.polling&&(this.logger.info("RM2M state polling stopped"),this.polling=!1,this.emit("pollingStopped")),this.fetchPromise&&await this.fetchPromise}getLastState(){return this.lastState?{...this.lastState,uplinkState:{...this.lastState.uplinkState}}:null}get isPolling(){return this.polling}dispose(){this.stopPolling(),this.lastState=null,this.removeAllListeners()}},wu=require("events"),uv=class extends wu.EventEmitter{constructor(){super(...arguments),i0(this,"serialNumber",""),i0(this,"serverUrl",""),i0(this,"deviceId",""),i0(this,"rssi",null),i0(this,"hasDebugSupport",!1),i0(this,"connectionState","disconnected"),i0(this,"connectionError",""),i0(this,"mtuSize",23)}get isConnected(){return this.connectionState==="connected"}setConnected(x){this.serialNumber=x.serialNumber,this.deviceId=x.deviceId,this.serverUrl=x.serverUrl??this.serverUrl,this.hasDebugSupport=x.hasDebugSupport??!1,this.mtuSize=x.mtuSize??23,this.rssi=x.rssi??null,this.connectionState="connected",this.connectionError="",this.emit("connected",this.snapshot()),this.emit("stateChange",this.snapshot())}setDisconnected(){this.connectionState="disconnected",this.rssi=null,this.emit("disconnected"),this.emit("stateChange",this.snapshot())}setError(x){this.connectionError=x,this.connectionState="disconnected",this.emit("error",x),this.emit("stateChange",this.snapshot())}setConnectionState(x){this.connectionState=x,this.emit("stateChange",this.snapshot())}updateRssi(x){this.rssi=x,this.emit("rssiUpdate",x)}reset(){this.serialNumber="",this.serverUrl="",this.deviceId="",this.rssi=null,this.hasDebugSupport=!1,this.connectionState="disconnected",this.connectionError="",this.mtuSize=23,this.emit("reset"),this.emit("stateChange",this.snapshot())}snapshot(){return{serialNumber:this.serialNumber,serverUrl:this.serverUrl,deviceId:this.deviceId,rssi:this.rssi,hasDebugSupport:this.hasDebugSupport,connectionState:this.connectionState,connectionError:this.connectionError,mtuSize:this.mtuSize,isConnected:this.isConnected}}},Su=require("events"),Dv={maxDuration:6e4,initialDelay:1e3,maxDelay:1e4,maxGattRetries:3},qu=class extends Su.EventEmitter{constructor(x=he,A){super(),i0(this,"logger",x),i0(this,"state"),i0(this,"transports",null),i0(this,"transportFactory",null),i0(this,"disconnectFn",null),i0(this,"reconnectOptions"),i0(this,"reconnectAbortController",null),this.state=new uv,this.reconnectOptions={...Dv,...A}}async connect(x,A,e){this.transportFactory=x,this.disconnectFn=A,this.state.setConnectionState("connecting");try{return this.transports=await x(),this.state.setConnected(e),this.logger.info(`Connected to device ${e.serialNumber}`),this.transports}catch(r){let t=r instanceof Error?r.message:String(r);throw this.state.setError(t),this.logger.error(`Connection failed: ${t}`),r}}async disconnect(){if(this.stopReconnect(),this.disconnectFn)try{await this.disconnectFn()}catch(x){this.logger.warn(`Disconnect error: ${x}`)}this.transports=null,this.state.setDisconnected(),this.logger.info("Disconnected from device")}async reconnect(){if(!this.transportFactory||!this.disconnectFn)return this.logger.error("Cannot reconnect: no transport factory"),!1;this.state.setConnectionState("reconnecting"),this.reconnectAbortController=new AbortController;let{signal:x}=this.reconnectAbortController,A=Date.now(),e=this.reconnectOptions.initialDelay;for(;Date.now()-A<this.reconnectOptions.maxDuration;){if(x.aborted||(this.logger.info(`Reconnecting in ${e}ms...`),await this.sleep(e,x),x.aborted))return!1;try{return this.transports=await this.transportFactory(),this.state.setConnectionState("connected"),this.state.connectionError="",this.logger.info("Reconnected successfully"),this.emit("reconnected"),!0}catch(r){this.logger.warn(`Reconnect attempt failed: ${r}`),e=Math.min(e*2,this.reconnectOptions.maxDelay)}}return this.state.setError("Reconnect timeout exceeded"),this.logger.error("Reconnect failed: timeout exceeded"),this.emit("reconnectFailed"),!1}stopReconnect(){this.reconnectAbortController?.abort(),this.reconnectAbortController=null}getTransports(){return this.transports}sleep(x,A){return new Promise(e=>{let r=setTimeout(e,x);A?.addEventListener("abort",()=>{clearTimeout(r),e()},{once:!0})})}},Tu={configurationNumber:1,utoInterface:0,utoEndpoint:1,utoSize:64*1024,debugInterface:1,debugEndpoint:2,debugSize:1024},Pu={service:"BC300000-0FA0-4ED4-860A-CF95434B5A4E",txCharacteristic:"BC30E1FF-0FA0-4ED4-860A-CF95434B5A4E",rxCharacteristic:"BC30E1FE-0FA0-4ED4-860A-CF95434B5A4E",txDebugCharacteristic:"BC30E201-0FA0-4ED4-860A-CF95434B5A4E",rxDebugCharacteristic:"BC30E200-0FA0-4ED4-860A-CF95434B5A4E"},$u=590,Nu=3e4,R0=class extends Error{constructor(x){super(x),this.name="ApiBadRequestError"}},PA=class extends Error{constructor(x){super(x),this.name="ApiNotFoundError"}},ri=class extends Error{constructor(x){super(x),this.name="ApiForbiddenError"}},oa=class extends Error{constructor(x){super(x),this.name="ApiMethodNotAllowedError"}};function $A(x){try{return decodeURIComponent(x)}catch{throw new R0("malformed url encoding")}}var Iu=2e3,Mu=2136;function Fa(x){if(x.length===0)return!0;if(!/^\d{4,17}$/.test(x))return!1;let A=Number(x.slice(0,4));return A>=Iu&&A<=Mu}function mt(x){if(x)for(let A of["stamp","from","until"]){let e=x[A];if(typeof e=="string"&&!(A==="until"&&e==="*")&&!(A!=="stamp"&&e.trim().length===0)&&!Fa(e))throw new R0(`attribute '${A}' is not valid`)}}function Ru(x){return typeof x.setMetadataValue=="function"?x:null}function Lu(x){return typeof x.insertUtoChangeRequests=="function"?x:null}function va(){return{lastIssuedStamp40:0,tagMutexTails:new Map}}async function Ou(x){return{status:200,body:x.ctx.siteInfo}}async function Gu(x){let{blueprint:A}=x.ctx;if(!A)throw new PA("blueprint unavailable");return{status:200,body:A}}async function Uu(x){let{me:A}=x.ctx;if(A==null)throw new PA("no profile stored");return{status:200,body:A}}function pv(x,A,e,r){let t=x.push;t&&(async()=>{try{await t.container(A,e,r)}catch(a){x.logger?.error(`[localApi] device push for tag ${A} failed:`,a)}})()}async function Hu(x,A,e){let r=x.push;if(!r)return null;try{return await r.adHocChangeRequest(A,e)}catch(t){return x.logger?.error(`[localApi] change request for tag ${A} failed:`,t),null}}var Ju=1024;function Wt(x){let A=x.indexOf(0),e=A<0?x:x.subarray(0,A);try{let r=new TextDecoder("utf-8").decode(e),t=JSON.parse(r);return typeof t!="object"||t===null||Array.isArray(t)?null:t}catch{return null}}function bv(x,A=0){let e=new TextEncoder().encode(x),r=Math.max(Ju,A,e.length+1),t=new Uint8Array(r);return t.set(e,0),t}var fa=26432,Wr={aberrant:1,service:2,standby:4,commissioned:8,offline:16,commissioning:65536,online:131072},mv=Object.keys(Wr),Xt=["standby","commissioned","offline","commissioning","online"],Ls=Xt.reduce((x,A)=>x|Wr[A],0)>>>0;function jv(x){let A=0;for(let e of mv)x[e]===!0&&(A|=Wr[e]);return A>>>0}function la(x,A){let e={};for(let r of mv)x&Wr[r]?e[r]=!0:typeof A?.[r]=="boolean"&&(e[r]=!1);return e}async function hv(x,A){let e=A.device;if(!e)return!1;let r=await x.getRowForTag(fa);if(!r?.data)return!1;let t=Wt(r.data);if(!t)return!1;let a=!1;if(typeof t.lifecycleFlags=="number"){let i=la(t.lifecycleFlags,e.lifecycle_flags);JSON.stringify(e.lifecycle_flags)!==JSON.stringify(i)&&(e.lifecycle_flags=i,a=!0)}return typeof t.lifecycleState=="string"&&e.lifecycle_state!==t.lifecycleState&&(e.lifecycle_state=t.lifecycleState,a=!0),a}var Ku=new Set([...Xt,"service","lifecycle_state"]);function zu(x,A){let e=Math.max(ix.msToStamp40((x.timeSource??zt).nowMs()),A.lastIssuedStamp40+1);return A.lastIssuedStamp40=e+1,e}async function Vu(x){let A=Qu(x.request.body??null);if(!A)throw new R0("invalid or missing request body");Wu(A);let e=x.ctx,r=e.siteInfo.lifecycle_flags;if(!Yu(r))throw new R0("this site does not support lifecycle flags!");let t=jv(r),a=t;for(let u of Xt){let b=A[u];typeof b=="boolean"&&(a=b?a|Wr[u]:a&~Wr[u])}if(a>>>=0,a===t)return{status:204,body:""};let i=zu(e,x.session),l=[{json:JSON.stringify({lifecycleFlags:{op:"&",val:~Ls>>>0}}),stamp40:i},{json:JSON.stringify({lifecycleFlags:{op:"|",val:a&Ls}}),stamp40:i+1}],c=Lu(e.storage);return c&&await c.insertUtoChangeRequests(l.map(u=>({tag:fa,stamp40:u.stamp40,json:u.json}))),e.siteInfo.lifecycle_flags=la(a,r),await gv(e),Xu(e,l),{status:204,body:""}}function Wu(x){let A=[];for(let[e,r]of Object.entries(x))Ku.has(e)?(e==="lifecycle_state"?typeof r!="string":typeof r!="boolean")&&A.push(`"${e}" is not valid`):A.push(`"${e}" is not an allowed lifecycle property`);if(A.length>0)throw new R0(`validation errors: ${A.join(", ")}`);if(Object.keys(x).some(e=>!Xt.includes(e)))throw new R0("invalid parameters")}async function Xu(x,A){try{let e=await Hu(x,fa,A);e==="executed"?await hv(x.storage,x.siteInfo)&&await gv(x):e!==null&&x.logger?.warn(`[localApi] lifecycle change request not applied by the device (outcome=${e})`)}catch(e){x.logger?.error("[localApi] lifecycle device-mirror refresh failed:",e)}}async function gv(x){await Ru(x.storage)?.setMetadataValue("site_info",JSON.stringify(x.siteInfo))}function Yu(x){return typeof x=="object"&&x!==null&&!Array.isArray(x)}function Qu(x){if(!x)return null;let A;try{A=JSON.parse(x)}catch{return null}return typeof A!="object"||A===null||Array.isArray(A)?null:A}function kv(x){if(x!=null){if(Array.isArray(x)&&x.every(A=>typeof A=="string"))return x;throw new R0('"select" must be an array')}}function Zu(x){if(x!=null){if(Array.isArray(x)&&x.every(A=>typeof A=="string"))return x;throw new R0("invalid parameter, select must be an array")}}function xD(x,A){let e=new Map;if(A){for(let[r,t]of A)e.set(t,r);return e}for(let r of x?.fields??[]){if(Le(r))continue;let t=r.alias??r.name;e.set(t,t.toLowerCase())}return e}function AD(x){let A=new Map;for(let e of x.fields){if(Le(e))continue;let r=(e.alias??e.name).toLowerCase();A.set(e.name,r),e.alias&&A.set(e.alias,r)}return A}function eD(x){let A=new Set;for(let e of x.fields)Le(e)||A.add((e.alias??e.name).toLowerCase());return A.add("stamp"),A}function rD(x,A,e){if(!e)return null;let r=xD(x,A),t=new Set,a=[];for(let i of e){if(i==="stamp")continue;let l=r.get(i);l?t.add(l):a.push(i)}if(a.length>0)throw yv(a);return t}function tD(x,A){let e=AD(x),r=[],t=[],a=!1;for(let i of A){if(i==="stamp"){a=!0,r.push("stamp");continue}let l=e.get(i);l?r.push(l):t.push(i)}if(t.length>0)throw yv(t);return a||r.unshift("stamp"),r}function nD(x,A){if(A===void 0)return;let e=eD(x),r=A.map(a=>a.toLowerCase()),t=r.filter(a=>!e.has(a));if(t.length>0)throw new R0(`unknown field name(s): ${t.join(",")}`);return r.includes("stamp")?r:["stamp",...r]}function iD(x,A){if(!A)return x;let e={};for(let[r,t]of Object.entries(x))(r==="stamp"||A.has(r))&&(e[r]=t);return e}function ca(x,A){if(!A)return x;let e={};for(let r of A)e[r]=r in x?x[r]:null;return e}function yv(x){return new R0(`Fields [\`${x.join("`, `")}\`] do not exist in this container`)}function ti(x,A){return x.containers.find(e=>e.name===A||e.alias===A)??null}async function sD(x){let A=x.ctx,e=$A(x.params[1]),r=ti(A.model,e);if(!r)throw new R0("container does not exist");let t=await A.mapper.readContainer(e);if(!t)throw new PA(`no data for container "${e}"`);let a=oD(A,r,t,aD(x));return{status:200,body:_v(A,e,a)}}function aD(x){let A=x.query.json??{};return kv(A.select)}function oD(x,A,e,r){let t=rD(A,Vt(x.blueprint??null,A),r);return iD(e,t)}function _v(x,A,e){let r=x.model.byNameOrAlias(A);return r?Z8(e,Vt(x.blueprint??null,r)):e}async function FD(x){let A=x.ctx,e=$A(x.params[1]),r=A.model.byNameOrAlias(e);if(!r)throw new PA(`unknown container "${e}"`);let t=await A.mapper.readContainer(e);if(!t)throw new PA(`unknown container "${e}"`);let a=x.query.json??{},i=Zu(a.select),l=nD(r,i);return{status:200,body:ca(t,l)}}async function vD(x){let A=$A(x.params[1]);return wv(x,A,"canonical")}async function fD(x){let A=$A(x.params[1]);if(!x.ctx.model.byNameOrAlias(A))throw new PA(`unknown container "${A}"`);return wv(x,A,"legacy")}async function wv(x,A,e){let r=dD(x);if(!r)throw new R0("invalid or missing request body");mt(r);let{stamp:t,...a}=r;if(e==="canonical"&&t!==void 0&&typeof t!="string")throw new R0("value(s) of field(s) stamp are not valid");let i=x.ctx;if(e==="canonical"&&!ti(i.model,A))throw new R0("container does not exist");let l=i.model.byNameOrAlias(A);if(l?.kind==="histdata")throw new PA(`unknown container "${A}"`);let c=e==="canonical"?ED(i,l,a):BD(l,a);try{let u=e==="canonical"&&t!==void 0?{...c,stamp:t}:c,b=await i.mapper.writeContainer(A,u);return b.devicePushable&&pv(i,b.tag,b.data,b.stamp40),{status:204,body:""}}catch(u){throw lD(u,A,e,i,l)}}function lD(x,A,e,r,t){if(x instanceof Ht){let a=x.field?cD(r,t,x.field,e):void 0;return e==="canonical"?a?new R0(`no permission to modify container field \`${a}\``):new R0(`no permission to modify container \`${A}\``):a?new ri(`unknown field name(s): ${a}`):new oa(`no permission to modify '${A}'`)}return x}function cD(x,A,e,r){if(!A)return e;let t=A.fields.find(i=>i.name===e||i.name.toLowerCase()===e||(i.alias??i.name).toLowerCase()===e);return t?r==="legacy"?(t.alias??t.name).toLowerCase():Vt(x.blueprint??null,A)?.get(e)??t.alias??t.name:e}function ED(x,A,e){if(!A)return e;let r=Vt(x.blueprint??null,A),t=new Map;if(r)for(let[a,i]of r)t.set(i,a);else for(let a of A.fields){let i=a.alias??a.name;t.set(i,i.toLowerCase()),t.set(i.toLowerCase(),i.toLowerCase())}return Sv(A,t,e,a=>new R0(`unknown field name(s): ${a}`))}function BD(x,A){if(!x)return A;let e=new Map;for(let r of x.fields){let t=r.alias??r.name;e.set(t.toLowerCase(),t.toLowerCase()),e.set(t,t.toLowerCase())}return Sv(x,e,A,r=>new ri(`unknown field name(s): ${r}`))}var CD=new Set(["stamp","stamp4","stamp8","datetime"]);function Sv(x,A,e,r){let t=new Map(x.fields.map(c=>[(c.alias??c.name).toLowerCase(),c])),a={},i=[],l=[];for(let[c,u]of Object.entries(e)){let b=A.get(c);if(!b){i.push(c);continue}let m=t.get(b);if(m&&CD.has(m.type)&&!(typeof u=="string"&&Fa(u))){l.push(c);continue}a[b]=u}if(i.length>0)throw r(i.join(","));if(l.length>0)throw new R0(`value(s) of field(s) ${l.join(",")} are not valid`);return a}function dD(x){let A=x.query.json,e=A!=null&&typeof A=="object"&&!Array.isArray(A)?A:void 0,r=x.request.body;if(!r)return e?{...e}:null;let t=uD(r);if(t===void 0)throw new R0("request supplied data which is not json formatted");return typeof t!="object"||t===null||Array.isArray(t)?null:{...e,...t}}function uD(x){try{return JSON.parse(x)}catch{return}}var qv="x-mt-backfill",Tv="pending";async function Ea(x,A,e){let r=x.push?.backfill;if(!(!r||A===void 0||A===null||e===null))try{return await r.call(x.push,{fromMs:e})==="pending"?{[qv]:Tv}:void 0}catch(t){x.logger?.error("[localApi] historic backfill check failed:",t);return}}var DD=1e3,Mn=1e3,Pv="20000101",$v="*";async function pD(x){let A=x.query.json??{};Ov(A,["from","until","count","offset","select"]),mt(A);let e=x.ctx,r=$A(x.params[1]),{mapperSelect:t,order:a}=Iv(e,r,A.select);Mv(e,r);let i=Qn(A.from,Pv,"from"),l=Qn(A.until,$v,"until");Rv(i,l),l!==null&&(l=mD(l));let c=jD(A.count),u=Lv(A.offset),b=await Ea(e,A.from,i);return{status:200,body:(await e.mapper.readTimeseries(r,{fromMs:i,untilMs:l,count:c,offset:u,select:t})).map(g=>Nv(x,e,r,ca(g,a))),headers:b}}async function bD(x){let A=x.query.json??{};Ov(A,["from","until","offset","select"]),mt(A);let e=x.ctx,r=$A(x.params[1]),t=x.params[2],{mapperSelect:a,order:i}=Iv(e,r,A.select);Mv(e,r);let l=Qn(A.from,Pv,"from"),c=Qn(A.until,$v,"until");Rv(l,c);let u=Lv(A.offset),b=await Ea(e,A.from,l),g=(await e.mapper.readTimeseries(r,{fromMs:l,untilMs:c,count:t==="youngest"?-1:1,offset:u,select:a}))[0];return g?{status:200,body:Nv(x,e,r,ca(g,i)),headers:b}:{status:204,body:JSON.stringify("no timeseries recordData found"),headers:b}}function Nv(x,A,e,r){return x.apiVersion==="1"?r:_v(A,e,r)}function Iv(x,A,e){let r=kv(e);if(!r)return{mapperSelect:void 0,order:null};let t=ti(x.model,A);if(!t)return{mapperSelect:r,order:null};let a=tD(t,r),i=a.filter(l=>l!=="stamp");return{mapperSelect:i.length>0?i:void 0,order:a}}function Mv(x,A){if(!ti(x.model,A))throw new R0("timeseries does not exist")}function Qn(x,A,e){let t=x==null||typeof x=="string"&&x.trim()===""?A:String(x);if(t==="*")return null;try{return bt(t)}catch{throw new R0(`attribute '${e}' is not valid`)}}function Rv(x,A){if(x!==null&&A!==null&&x>A)throw new R0('E_BAD_REQUEST "from" value must be older than "until"')}function mD(x){let A=ix.msToStamp40(x);return ix.stamp40ToMS(A)>=x&&(A-=1),ix.stamp40ToMS(A)}function jD(x){if(x==null||x==="")return DD;let A=Number(x);if(!Number.isInteger(A))throw new R0('"count" must be an integer');if(A===0)throw new R0("`count` cannot be 0");if(A<-Mn)throw new R0(`"count" must be greater than or equal to -${Mn}`);if(A>Mn)throw new R0(`"count" must be less than or equal to ${Mn}`);return A}function Lv(x){if(x==null||x==="")return 0;let A=Number(x);if(!Number.isInteger(A))throw new R0('"offset" must be an integer');if(A<0)throw new R0('"offset" must be greater than or equal to 0');return A}function Ov(x,A){for(let e of Object.keys(x))if(!A.includes(e))throw new R0(`"${e}" is not allowed`)}var hD=1e5,gD="20000101",kD="*";async function yD(x){let e=`histdata${x.params[1]?Number(x.params[1]):0}`,r=x.ctx,t=r.model.byNameOrAlias(e);if(!t)throw new PA(`unknown container "${e}"`);let a=x.query.json??{};mt(a);let{fromMs:i,untilMs:l}=SD(a);qD(i,l);let c=TD(a),u=PD(a),b=Gv(t,a.select)??["stamp"],m=Zn(a.from)?await Ea(r,a.from,i):void 0,g=b.filter($=>$!=="stamp");return{status:200,body:(await r.mapper.readTimeseries(e,{fromMs:i,untilMs:l,count:c,offset:u,select:g.length>0?g:void 0})).map($=>b.map(T=>T==="stamp"?$.stamp:$[T]??null)),headers:m}}async function _D(x){let e=`histdata${x.params[1]?Number(x.params[1]):0}`,r=x.params[2],t=x.ctx,a=t.model.byNameOrAlias(e);if(!a)throw new PA(`unknown container "${e}"`);let i=x.query.json??{};mt(i);let l=Gv(a,i.select)??["stamp"],c=wD(i),u=l.filter(g=>g!=="stamp"),m=(await t.mapper.readTimeseries(e,{fromMs:null,untilMs:c??null,count:c!==void 0||r==="youngest"?-1:1,select:u.length>0?u:void 0}))[0];return m?{status:200,body:[l.map(g=>g==="stamp"?m.stamp:m[g]??null)]}:{status:200,body:[]}}function wD(x){if(!(!Zn(x.until)||x.until==="*"))try{return bt(String(x.until))??void 0}catch{throw new R0("from or until value invalid")}}function SD(x){let A=Zn(x.from),e=Zn(x.until);if((!A||!e)&&!Ba(x.count))throw new R0("missing or invalid parameters (from and until and/or count)");return{fromMs:x8(A?x.from:gD),untilMs:x8(e?x.until:kD)}}function qD(x,A){if(x!==null&&A!==null&&x>A)throw new R0('"from" value must be older than "until"')}function x8(x){let A=String(x);try{return bt(A)}catch{throw new R0(`invalid stamp "${A}"`)}}function TD(x){if(!Ba(x.count))return hD;if(typeof x.count!="number")throw new R0("invalid parameter count");return x.count}function PD(x){let A=x.offset;if(A==null||A==="")return 0;if(typeof A!="number"||A<0)throw new R0("invalid parameter offset");return A}function Gv(x,A){if(A==null)return;if(!Array.isArray(A))throw new R0("invalid parameter, select must be an array");let e=A.map(l=>String(l).toLowerCase()),r=e.filter(l=>l.includes(" "));if(r.length>0)throw new R0(`aggregation suffix not allowed: ${r.join(",")}`);let t=e.includes("stamp")?e:["stamp",...e],a=new Set(x.fields.filter(l=>!Le(l)).map(l=>(l.alias??l.name).toLowerCase()));a.add("stamp");let i=t.filter(l=>!a.has(l));if(i.length>0)throw new R0(`invalid channel(s) ${i.join(",")}`);return t}function Ba(x){return!!x}function Zn(x){return typeof x=="string"?x.trim().length>0:Ba(x)}var $D="device_id";function ND(x){return async A=>(await ni(A),{status:200,body:await MD(A.ctx,x)})}async function ni(x){let A=$A(x.params[0]),e=await ID(x.ctx);if(!e||e.toLowerCase()!==A.toLowerCase())throw new PA(`unknown device "${A}"`)}async function ID(x){return x.deviceId||x.siteInfo.device?.device_id||x.storage.getMetadataValue($D)}async function MD(x,A){let e=await x.storage.getRowForTag(A);if(!e||!e.data)return{};let r=Wt(e.data);return r?(typeof r.pipAppVer=="number"&&(r.pipAppVer=`${r.pipAppVer}.0.0`),r.stamp=Dt(ix.stamp40ToMS(je(e.stamp))),r):{}}function Ca(x,A,e){let t=(x.tagMutexTails.get(A)??Promise.resolve()).then(e);return x.tagMutexTails.set(A,t.catch(()=>{})),t}function RD(x){return async A=>{await ni(A);let e=GD(A.request.body??null);if(!e)throw new R0("invalid or missing request body");return Ca(A.session,x,async()=>{let r=await A.ctx.storage.getRowForTag(x),t=r?.data?Wt(r.data)??{}:{};return await da(A.ctx,x,r,{...t,...e}),{status:204,body:""}})}}function LD(x){return async A=>(await ni(A),Ca(A.session,x,async()=>{let e=await A.ctx.storage.getRowForTag(x);return!e||!e.data?{status:204,body:""}:(await da(A.ctx,x,e,{}),{status:204,body:""})}))}function OD(x){return async A=>{await ni(A);let e=$A(A.params[1]);return Ca(A.session,x,async()=>{let r=await A.ctx.storage.getRowForTag(x);if(!r||!r.data)return{status:204,body:""};let t=Wt(r.data)??{},a=e.toLowerCase();for(let i of Object.keys(t))i.toLowerCase()===a&&delete t[i];return await da(A.ctx,x,r,t),{status:204,body:""}})}}function GD(x){if(!x)return null;let A;try{A=JSON.parse(x)}catch{return null}return typeof A!="object"||A===null||Array.isArray(A)?null:A}async function da(x,A,e,r){let t=bv(JSON.stringify(r),e?.data?.length??0),a=ix.msToStamp40((x.timeSource??zt).nowMs());await x.storage.replaceUtoRow({tag:A,stamp:TA(a),flags:e?.flags??0,site_related:e?.site_related??0,data:t}),pv(x,A,t,a)}var Uv={"content-type":"application/json"},UD=[{method:"GET",pattern:/^\/api\/1\/me$/,handler:Uu,checksUid:!1},{method:"GET",pattern:/^\/api\/[12]\/sites\/([^/]+)$/,handler:Ou,checksUid:!0},{method:"GET",pattern:/^\/api\/[12]\/sites\/([^/]+)\/blueprint$/,handler:Gu,checksUid:!0},{method:"POST",pattern:/^\/api\/1\/sites\/([^/]+)\/cn-set-lifecycle$/,handler:Vu,checksUid:!0},{method:"GET",pattern:/^\/api\/[12]\/sites\/([^/]+)\/timeseries\/([^/]+)\/(oldest|youngest)$/,handler:bD,checksUid:!0},{method:"GET",pattern:/^\/api\/[12]\/sites\/([^/]+)\/timeseries\/([^/]+)$/,handler:pD,checksUid:!0},{method:"GET",pattern:/^\/api\/[12]\/sites\/([^/]+)\/containers\/([^/]+)$/,handler:sD,checksUid:!0},{method:"PUT",pattern:/^\/api\/[12]\/sites\/([^/]+)\/containers\/([^/]+)$/,handler:vD,checksUid:!0},{method:"GET",pattern:/^\/api\/1\/sites\/([^/]+)\/histdata(\d)?\/(oldest|youngest)$/,handler:_D,checksUid:!0},{method:"GET",pattern:/^\/api\/1\/sites\/([^/]+)\/histdata(\d)?$/,handler:yD,checksUid:!0},{method:"GET",pattern:/^\/api\/1\/sites\/([^/]+)\/(config[0-9a-c]|config[A-C])$/,handler:FD,checksUid:!0},{method:"PUT",pattern:/^\/api\/1\/sites\/([^/]+)\/(config[0-9a-c]|config[A-C])$/,handler:fD,checksUid:!0},...HD()];function HD(){let x={"sys-otp":26432,"sys-flash":26433,"app-otp":26434,"app-flash":26435,"app-state":26436,"sys-info":26437,"app-info":26438},A={"sys-flash":26433,"app-flash":26435},e=Object.entries(x).map(([t,a])=>({method:"GET",pattern:new RegExp(`^/api/1/devices/([^/]+)/${t}$`),handler:ND(a),checksUid:!1})),r=Object.entries(A).flatMap(([t,a])=>[{method:"PUT",pattern:new RegExp(`^/api/1/devices/([^/]+)/${t}$`),handler:RD(a),checksUid:!1},{method:"DELETE",pattern:new RegExp(`^/api/1/devices/([^/]+)/${t}$`),handler:LD(a),checksUid:!1},{method:"DELETE",pattern:new RegExp(`^/api/1/devices/([^/]+)/${t}/([^/]+)$`),handler:OD(a),checksUid:!1}]);return[...e,...r]}var JD=/^\/api\/([12])\/customers\/([^/]+)\/sites\/(.*)$/;function KD(x){let A=va();return e=>Hv(x,e,A)}async function Hv(x,A,e=va()){try{let[r,t]=WD(A.path),a=XD(t),i=VD(r,x);if(i===null)return Vr(404,"E_NOT_FOUND","unknown customer");let l=A.method.toUpperCase();for(let c of UD){if(c.method!==l)continue;let u=c.pattern.exec(i);if(!u)continue;let b=u.slice(1);if(c.checksUid&&!zD(x,b[0]))return Vr(404,"E_NOT_FOUND","unknown site");let m=/^\/api\/([12])\//.exec(i)?.[1]??"1",g=await c.handler({request:A,params:b,query:a,ctx:x,session:e,apiVersion:m});return ZD(g)}return Vr(404,"E_NOT_FOUND","not found")}catch(r){return Kv(r)}}function zD(x,A){return x.allowAnySiteUid===!0||A!==void 0&&$A(A)===x.siteUid}function VD(x,A){let e=JD.exec(x);if(!e)return x;let r=$A(e[2]).toLowerCase();return(A.siteInfo.customer_id??"").toLowerCase()===r||(A.siteInfo.customer_uid??"").toLowerCase()===r?`/api/${e[1]}/sites/${e[3]}`:null}function WD(x){let A=x.indexOf("?");return A<0?[x,""]:[x.slice(0,A),x.slice(A+1)]}function XD(x){let A={params:{}};if(!x)return A;for(let e of x.split("&"))e&&YD(A,e);return A}function YD(x,A){let e=A.indexOf("="),r=$A(e<0?A:A.slice(0,e)),t=e<0?"":$A(A.slice(e+1));r==="json"?x.json=QD(t):x.params[r]=t}function QD(x){try{return JSON.parse(x)}catch{throw new R0("request supplied data which is not json formatted ")}}function ZD(x){let A=typeof x.body=="string"?x.body:JSON.stringify(x.body);return{status:x.status,headers:{...Uv,...x.headers},body:A}}function Jv(x,A){return{status:x,headers:{...Uv},body:JSON.stringify(A)}}function Kv(x){return x instanceof R0||x instanceof ia||x instanceof Ys?Vr(400,"E_BAD_REQUEST",x.message):x instanceof ri||x instanceof Ht?Vr(403,"E_FORBIDDEN",x.message):x instanceof oa?Vr(405,"E_METHOD_NOT_ALLOWED",x.message):x instanceof PA||x instanceof Er?Vr(404,"E_NOT_FOUND",x.message):Jv(500,{err:x instanceof Error?x.message:String(x)})}function Vr(x,A,e){return Jv(x,{err:`${A} ${e}`})}function x7(x,A){let e=A.apmId??"local",r=A.version??1;return{uid:A.siteUid,name:A.name??A.siteUid,customer_id:e,customer_uid:e,app:{apmid:e,version:String(r)},device:{device_id:A.deviceId,lifecycle_flags:{}},lifecycle_flags:{},containers:x.containers.map(t=>({name:t.name,alias:t.alias??t.name,kind:t.kind}))}}});var Lb={};Lc(Lb,{default:()=>Jl,deviceExitCode:()=>Hl,program:()=>RA});module.exports=Oc(Lb);var rx=require("commander"),vn=Y0(require("chalk"));var Li={name:"@microtronics/studio-cli",version:"1.3.0-alpha.2",description:"Microtronics Studio CLI Tool",main:"./out/api.js",typings:"./out/studio-cli.d.ts",bin:{"studio-cli":"studio-cli"},publishConfig:{access:"public"},scripts:{compile:"npm run build:registryApiTypings && tsc","build:cli":"node build.mjs","build:exe":"node build-exe.mjs",api:"api-extractor run --local --verbose",build:"npm run compile && npm run api && npm run build:cli","watch:build":"npm run compile -- --watch",test:"cross-env STUDIO_ENV=lucky mocha","test-ci":"cross-env STUDIO_ENV=lucky mocha --reporter mocha-junit-reporter","watch:test":"npm run test -- --watch",prepublishOnly:"npm run build","build:registryApiTypings":"npx openapi-typescript https://api.registry.lucky.ci.microtronics.com/v1/openapi.yaml -o ./src/typings/registry.ts"},author:"Microtronics",license:"ISC",dependencies:{"@gera2ld/tarjs":"^0.3.1",ajv:"^8.17.1","ajv-formats":"^3.0.1","ajv-keywords":"^5.1.0",chalk:"^5.4.1",commander:"^12.1.0","cross-fetch":"^4.0.0","deepmerge-ts":"^7.1.5",dotenv:"^16.4.7","file-type-checker":"^1.1.2",glob:"^11.0.1","iconv-lite":"^0.6.3","image-dimensions":"^2.3.0",ini:"^5.0.0",minimatch:"^10.0.1","openapi-fetch":"^0.13.0",pako:"^2.1.0",semver:"^7.7.2","sql.js":"^1.14.2","tinytar-fix":"^0.1.1","update-notifier":"^7.3.1",usb:"^2.14.0",uuid:"^9.0.1","vscode-uri":"^3.0.8",yaml:"^2.6.1"},engines:{node:">= 22"},devDependencies:{"@microsoft/api-extractor":"^7.47.11","@microtronics/device-master":"bitbucket:microtronics-core/device-master#v4.1.0","@types/chai":"^4.3.6","@types/chai-as-promised":"^7.1.5","@types/ini":"^4.1.1","@types/mocha":"^10.0.9","@types/node":"^22.9.1","@types/semver":"^7.5.6","@types/sql.js":"^1.4.11","@types/update-notifier":"^6.0.8","@types/vscode":"^1.86.2","@yao-pkg/pkg":"^6.22.0",chai:"^4.3.8","chai-as-promised":"^7.1.2","cross-env":"^7.0.3",esbuild:"^0.27.3","extract-zip":"^2.0.1",mocha:"^10.8.2","mocha-junit-reporter":"^2.2.1","openapi-typescript":"^7.6.0","pawncc-wasm":"bitbucket:microtronics-core/pawncc-wasm#v1.2.0",resedit:"^3.0.2",tar:"^7.5.7","ts-node":"^10.9.2",typescript:"^5.6.3"},mocha:{require:["ts-node/register"],"watch-files":"src/**",spec:"./test/**/*.spec.ts",recursive:!0},files:["out/api.js","out/studio-cli.d.ts","dist/main.js","dist/studio-cli.d.ts","studio-cli","CHANGELOG.md"]};var QA=Y0(require("node:fs/promises"));var Tt=require("vscode-uri"),Do=require("glob"),Pe={readFile(x){return QA.default.readFile(x.fsPath)},async rm(x){if(await this.stat(x))return QA.default.rm(x.fsPath,{recursive:!0})},async stat(x){try{let A=await QA.default.stat(x.fsPath),e=(A.isDirectory()?2:0)|(A.isFile()?1:0)|(A.isSymbolicLink()?64:0);return{ctime:A.ctimeMs,mtime:A.mtimeMs,permissions:void 0,size:A.size,type:e}}catch{return null}},async writeFile(x,A){typeof A=="string"&&(A=new TextEncoder().encode(A));let e=Tt.Utils.dirname(x);return await QA.default.mkdir(e.fsPath,{recursive:!0}),QA.default.writeFile(x.fsPath,A,{flag:"w"})},async findFiles(x,A,e){let r={ignore:e,nodir:!0,absolute:!0,dot:!0,cwd:x.fsPath};return(await(0,Do.glob)(A,r)).map(a=>{let i=a.replace(/\\/g,"/");return Tt.URI.parse(`file:///${i}`)})},async copy(x,A){let e=await QA.default.stat(x.fsPath);return await QA.default.mkdir(Tt.Utils.dirname(A).fsPath,{recursive:!0}),e.isDirectory()?QA.default.cp(x.fsPath,A.fsPath,{force:!0,recursive:!0}):QA.default.copyFile(x.fsPath,A.fsPath)},async mkdir(x){await QA.default.mkdir(x.fsPath,{recursive:!0})}};var yt=require("vscode-uri");var Ge=require("vscode-uri");var ot=require("vscode-uri");var Uc=new Uint32Array([0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117]);function Bn(x,A=0){let e=~~A^-1;for(let r=0;r<x.length;r++)e=e>>>8^Uc[(e^x[r])&255];return(e^-1)>>>0}var Qb=new Uint8Array([0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64]),Zb=new Uint8Array([0,192,193,1,195,3,2,194,198,6,7,199,5,197,196,4,204,12,13,205,15,207,206,14,10,202,203,11,201,9,8,200,216,24,25,217,27,219,218,26,30,222,223,31,221,29,28,220,20,212,213,21,215,23,22,214,210,18,19,211,17,209,208,16,240,48,49,241,51,243,242,50,54,246,247,55,245,53,52,244,60,252,253,61,255,63,62,254,250,58,59,251,57,249,248,56,40,232,233,41,235,43,42,234,238,46,47,239,45,237,236,44,228,36,37,229,39,231,230,38,34,226,227,35,225,33,32,224,160,96,97,161,99,163,162,98,102,166,167,103,165,101,100,164,108,172,173,109,175,111,110,174,170,106,107,171,105,169,168,104,120,184,185,121,187,123,122,186,190,126,127,191,125,189,188,124,180,116,117,181,119,183,182,118,114,178,179,115,177,113,112,176,80,144,145,81,147,83,82,146,150,86,87,151,85,149,148,84,156,92,93,157,95,159,158,94,90,154,155,91,153,89,88,152,136,72,73,137,75,139,138,74,78,142,143,79,141,77,76,140,68,132,133,69,135,71,70,134,130,66,67,131,65,129,128,64]);var T0;(q=>{function x(_,$){let[T,M]=$,{line:N,col:z}=_.linePos(T);return{line:Number(N)-1,startCharacter:z-1,endCharacter:z+(M-T)}}q.yamlRangeToLineInformation=x;let A=new TextEncoder;function e(_){return Bn(A.encode(_)).toString(16)}q.generateHashForLibraryName=e;function r(_){return Bn(A.encode(_)).toString(16)}q.generateHashForFilePath=r;function t(_){return Bn(_).toString(16).toUpperCase().padStart(8,"0")}q.generateCRC32ForFileContent=t;function a(_){try{let $=null;return _?.type==="Buffer"?$=Uint8Array.from(_.data):$=_,new TextDecoder("utf8").decode($)}catch{return""}}q.convertBlobToString=a;function i(_=""){return _.replace(/\r\n|\n\r|\r/g,`
|
|
2633
|
+
`).entries()){A.line=e;let t=r.trim();t===""||t.startsWith("//")||ad(A,t)||t.includes("=")&&od(A,t)}return sd(A.containers,A.splits)}var N8=null,vd=4;function Dt(x){let A=new Date(x),e=(r,t)=>r.toString().padStart(t,"0");return e(A.getUTCFullYear(),4)+e(A.getUTCMonth()+1,2)+e(A.getUTCDate(),2)+e(A.getUTCHours(),2)+e(A.getUTCMinutes(),2)+e(A.getUTCSeconds(),2)+e(A.getUTCMilliseconds(),3)}function bt(x){let A=x.trim();if(A==="*")return N8;if(!/^\d{4,17}$/.test(A))throw new Error(`?apiStamp.invalid-input."${x}"`);let e=(b,m,g)=>{let q=A.slice(b,b+m);return parseInt(q.length?q.padEnd(m,"0"):g,10)},r=parseInt(A.slice(0,vd),10),t=A.length>=6?e(4,2,"01"):1,a=A.length>=8?e(6,2,"01"):1,i=e(8,2,"00"),l=e(10,2,"00"),c=e(12,2,"00"),u=e(14,3,"000");return Date.UTC(r,t-1,a,i,l,c,u)}var Ut="NAN",fd="%HEX%",ld=65535,Ys=class extends Error{constructor(x){super(`?ddeCodec.unknown-alias."${x}"`),i0(this,"alias",x),this.name="DdeUnknownAliasError"}};function Ai(x){return(x.alias??x.name).toLowerCase()}function ei(x){return x==="string"}function Qs(x){return x==="stamp"||x==="stamp4"||x==="stamp8"||x==="datetime"}function I8(x){return(x.editmask??"").toUpperCase()===fd}function cd(x,A){return A===void 0||!Number.isFinite(x)?x:Zs(x,A)}function Zs(x,A){if(!Number.isFinite(x))return x;let e=10**A;return Math.sign(x)*Math.round(Math.abs(x)*e)/e}function Ed(x,A){if(!Number.isFinite(x)||x===0)return x;let e=Math.abs(x),r=Math.floor(Math.log10(e));return 10**(r+1)<=e?r+=1:10**r>e&&(r-=1),Zs(x,A-1-r)}function Bd(x){return x==="floatm16"||x==="f32"||x==="f64"}function Cd(x,A){if(!Number.isFinite(A))return A;let e=x.decpl??(Bd(x.type)?9:0),r=Zs(A,e),t=x.type==="floatm16"?3:x.type==="f32"?7:15;return Ed(r,t)}function Vn(x,A){let e=BigInt.asUintN(64,BigInt(Math.trunc(x))),r=BigInt.asUintN(64,BigInt(Math.trunc(A))),t=0n,a=1n;for(;r!==0n;)r&1n&&(e&1n&&(t|=a),a<<=1n),e>>=1n,r>>=1n;return Number(t)}function M8(x,A,e){let r=BigInt.asUintN(64,BigInt(Math.trunc(x))),t=BigInt.asUintN(64,BigInt(Math.trunc(A))),a=BigInt.asUintN(64,BigInt(Math.trunc(e))),i=1n;for(;a!==0n;)a&1n&&(r=t&1n?r|i:r&~i,t>>=1n),a>>=1n,i<<=1n;return Number(r)}var dd=new Set(["u8","s8","u16","s16","u32","s32","s64","ufm8"]);function Wn(x){return!!x.bitmask&&dd.has(x.type)}var R8=255,L8=254,O8=253,G8=252,U8=251,ud=207,xa=65535,Xn=65534,Aa=65533,ea=65532,ra=65531;function Dd(x){switch(x){case R8:return xa;case L8:return Xn;case O8:return Aa;case G8:return ea;case U8:return ra;default:return x<=31?x:x>ud?Xn:(x&15|16)<<(x>>4)-1}}function pd(x){switch(x){case xa:return R8;case Xn:return L8;case Aa:return O8;case ea:return G8;case ra:return U8;default:{if(x<=31)return x;let A=1,e=x;for(;(e&65504)>0;)e>>=1,A++;return A<<4|e&15}}}var Yn=1023,Ss=31,H8=127,fs=8388607,bd=255,qs=15,md=-14,JF=15;function J8(x){let A=(x&Yn)<<13,e=(x&31744)>>10;if(e===Ss)return z8(1024-(x&Yn));e!==0&&(e=e-qs+4+H8);let r=(A|e<<23)>>>0;x&32768&&(r=(r|2147483648)>>>0);let t=new DataView(new ArrayBuffer(4));return t.setUint32(0,r),t.getFloat32(0)}function K8(x){if(typeof x=="string"||Number.isNaN(x))return ld;let A=new DataView(new ArrayBuffer(4));A.setFloat32(0,x);let e=A.getUint32(0),r=e>>>16&32768,t=(e&fs)+4096,a=(t>fs?1:0)+(e>>>23&bd),i=(t&fs)>>>13;return a!==0&&(a=a-H8-4,a<md?(i=0,a=0):a>JF?(i=Yn,a=JF+qs):a=a+qs),r|a<<10|i}var jd=["OF","UF","OL","SC"],Ts={u8:{NAN:255,OF:254,UF:253,OL:252,SC:251},u16:{NAN:65535,OF:65534,UF:65533,OL:65532,SC:65531},u32:{NAN:4294967295,OF:4294967294,UF:4294967293,OL:4294967292,SC:4294967291},s8:{NAN:127,OF:126,UF:-126,OL:-127,SC:-128},s16:{NAN:32767,OF:32766,UF:-32766,OL:-32767,SC:-32768},s32:{NAN:2147483647,OF:2147483646,UF:-2147483646,OL:-2147483647,SC:-2147483648},s64:{NAN:0x7fffffffffffffffn,OF:0x7ffffffffffffffen,UF:-0x7ffffffffffffffen,OL:-0x7fffffffffffffffn,SC:-0x8000000000000000n},ufm8:{NAN:xa,OF:Xn,UF:Aa,OL:ea,SC:ra}},hd={NAN:65535,OF:65534,UF:65533,OL:65532,SC:65531},lA={NAN:1,OF:2,UF:3,OL:4,SC:5},gd=new Set(["u8","u16","u32","ufm8"]);function kd(x){let A=Math.floor(x),e=x-A;return e<.5?A:e>.5?A+1:A%2===0?A:A+1}function ta(x){let A=x.replace(/,/g,"").trim();if(!/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?$/.test(A))return null;let e=Number(A);return Number.isFinite(e)?e:null}function na(x,A,e){switch(x){case"u8":return A.getUint8(e);case"s8":return A.getInt8(e);case"u16":return A.getUint16(e,!1);case"s16":return A.getInt16(e,!1);case"u32":return A.getUint32(e,!1);case"s32":return A.getInt32(e,!1);case"s64":return Number(A.getBigInt64(e,!1));case"f32":return A.getFloat32(e,!1);case"f64":return A.getFloat64(e,!1);case"floatm16":return J8(A.getUint16(e,!1));case"ufm8":return Dd(A.getUint8(e));default:throw new Error(`?ddeCodec.non-numeric-type."${x}"`)}}function z8(x){switch(x){case lA.OF:return"OF";case lA.UF:return"UF";case lA.OL:return"OL";case lA.SC:return"SC";default:return Ut}}var KF=[["NAN",lA.NAN],["OF",lA.OF],["UF",lA.UF],["OL",lA.OL],["SC",lA.SC]];function yd(x,A){let e=x.getUint32(A,!1);if((e&2139095040)!==2139095040)return 0;let r=e&8388607;return r===0?lA.NAN:(r=r&4194304?8388608-r:r&255,r===0?lA.NAN:r)}function _d(x,A){let e=x.getBigUint64(A,!1);if((e&0x7ff0000000000000n)!==0x7ff0000000000000n)return 0;let r=Number(e&0xffn);return r===0?lA.NAN:r}function wd(x,A){if(x.type==="s64"){let t=A.getBigInt64(x.byteofs,!1);Wn(x)&&(t=BigInt(Vn(Number(t),x.bitmask)));let a=Ts.s64;return KF.find(([i])=>t===BigInt(a[i]))?.[1]??0}let e=Ts[x.type];if(!e)return 0;let r=na(x.type,A,x.byteofs);return Wn(x)&&(r=Vn(r,x.bitmask)),KF.find(([t])=>r===e[t])?.[1]??0}function V8(x,A){switch(x.type){case"floatm16":{let e=A.getUint16(x.byteofs,!1);return(e>>10&Ss)===Ss?1024-(e&Yn):0}case"f32":return yd(A,x.byteofs);case"f64":return _d(A,x.byteofs);default:return wd(x,A)}}function W8(x,A){let e=na(x.type,A,x.byteofs);return typeof e=="string"||Number.isNaN(e)?NaN:(Wn(x)&&(e=Vn(e,x.bitmask)),e*x.vscale+x.vofs)}function Sd(x,A){let e=V8(x,A);if(e!==0)return z8(e);let r=W8(x,A);return Number.isNaN(r)?Ut:Cd(x,r)}function qd(x,A){if(x.byteofs+x.size>A.byteLength)return null;if(ei(x.type)||Qs(x.type))return NaN;let e=new DataView(A.buffer,A.byteOffset,A.byteLength);return V8(x,e)!==0?NaN:W8(x,e)}function Td(x,A){if(I8(x)){let e="";for(let r=0;r<x.size;r++)e+=A.getUint8(x.byteofs+r).toString(16).padStart(2,"0");return e.toUpperCase()}return ix.cp1252Unpack(A,x.byteofs,x.size)}var X8=25569,Y8=864e5;function Pd(x){return(x-X8)*Y8}function $d(x){return x/Y8+X8}function Nd(x,A){if(x.type==="datetime")return Dt(Pd(A.getFloat64(x.byteofs,!1)));if(x.type==="stamp8"){let r=A.getBigUint64(x.byteofs,!1),t=Number(r&0xffffffffffn);return Dt(ix.stamp40ToMS(t))}let e=A.getUint32(x.byteofs,!1)*256;return x.size>=5&&(e+=A.getUint8(x.byteofs+4)),Dt(ix.stamp40ToMS(e))}var Id=new Set(["u8","s8","u16","s16","u32","s32","s64","ufm8"]);function Md(x,A){return/^[+-]?\d+$/.test(x)?parseInt(x,10):/^\$[0-9a-fA-F]+$/.test(x)?parseInt(x.slice(1),16):A}function Rd(x){let A=x.default;if(A===void 0)return;if(ei(x.type))return A;let e=A.trim();if(e===""||e.toUpperCase()===Ut)return Ut;if(Id.has(x.type))return Md(e,0);let r=ta(e);return r!==null?r:A}function Ld(x,A,e){return x.byteofs+x.size>e?Rd(x):ei(x.type)?Td(x,A):Qs(x.type)?Nd(x,A):Sd(x,A)}function Ps(x,A){let e=new DataView(A.buffer,A.byteOffset,A.byteLength),r={};for(let t of x.fields)Le(t)||Gt(t.type)||(r[Ai(t)]=Ld(t,e,A.byteLength));return r}function Od(x,A){if(typeof A=="number")return Number.isFinite(A)?{kind:"value",physical:A}:{kind:"sentinel",state:"NAN"};if(typeof A=="string"){if(A.toUpperCase()===Ut||A==="")return{kind:"sentinel",state:"NAN"};let e=jd.find(t=>t===A);if(e)return{kind:"sentinel",state:e};if("OUS".includes(A[0]))return{kind:"skip"};let r=ta(A);return r!==null?{kind:"value",physical:r}:zF(x)}return zF(x)}function zF(x){let A=x.default;return A!==void 0&&A.startsWith("%")?{kind:"sentinel",state:"NAN"}:{kind:"value",physical:(A!==void 0?ta(A):null)??0}}function $s(x,A,e){switch(x.type){case"floatm16":return A.setUint16(x.byteofs,hd[e],!1);case"f32":return A.setUint32(x.byteofs,(2139095040|lA[e])>>>0,!1);case"f64":return A.setBigUint64(x.byteofs,0x7ff0000000000000n|BigInt(lA[e]),!1);default:break}let r=Ts[x.type]?.[e];if(r===void 0)throw new Error(`?ddeCodec.non-numeric-type."${x.type}"`);if(x.type==="s64")return A.setBigInt64(x.byteofs,BigInt(r),!1);Q8(x,A,Number(r))}function Gd(x,A,e){if(x.vscale===0)return;let r=(e-x.vofs)/x.vscale;switch(x.type){case"f32":return A.setFloat32(x.byteofs,r,!1);case"f64":return A.setFloat64(x.byteofs,r,!1);case"floatm16":return A.setUint16(x.byteofs,K8(r),!1);default:break}if(Number.isNaN(r))return $s(x,A,"NAN");if(!Number.isFinite(r))return $s(x,A,"OF");let t=r;gd.has(x.type)&&t<0&&(t=0),Q8(x,A,kd(t))}function Q8(x,A,e){if(Wn(x)){let r=na(x.type,A,x.byteofs);e=M8(r,e,x.bitmask)}Ud(x.type,A,x.byteofs,e)}function Ud(x,A,e,r){switch(x){case"u8":return A.setUint8(e,r);case"s8":return A.setInt8(e,r);case"u16":return A.setUint16(e,r,!1);case"s16":return A.setInt16(e,r,!1);case"u32":return A.setUint32(e,r,!1);case"s32":return A.setInt32(e,r,!1);case"s64":return A.setBigInt64(e,BigInt(r),!1);case"ufm8":return A.setUint8(e,pd(r));default:throw new Error(`?ddeCodec.non-numeric-type."${x}"`)}}function Hd(x,A,e){let r=String(e);if(I8(x)){let t=r.trim();if(t.length%2!==0||t.length>x.size*2)throw new Error(`?ddeCodec.invalid-hex."${Ai(x)}"`);for(let a=0;a<x.size;a++){let i=a*2<t.length?parseInt(t.substr(a*2,2),16):0;A.setUint8(x.byteofs+a,i)}return}ix.cp1252Pack(A,x.byteofs,x.size,r)}function Jd(x,A,e){let r=bt(String(e));if(r===null)throw new Error(`?ddeCodec.unbounded-stamp."${Ai(x)}"`);if(x.type==="datetime"){A.setFloat64(x.byteofs,$d(r),!1);return}let t=ix.msToStamp40(r);if(x.type==="stamp8"){A.setBigUint64(x.byteofs,BigInt(t),!1);return}A.setUint32(x.byteofs,Math.trunc(t/256),!1),x.size>=5&&A.setUint8(x.byteofs+4,t&255)}function Kd(x,A,e){if(ei(x.type))return Hd(x,A,e);if(Qs(x.type))return Jd(x,A,e);let r=Od(x,e);switch(r.kind){case"skip":return;case"sentinel":return $s(x,A,r.state);case"value":return Gd(x,A,r.physical)}}function Ns(x,A,e){let r=e?new Uint8Array(e):new Uint8Array(x.recordSize),t=new DataView(r.buffer,r.byteOffset,r.byteLength),a=new Map(x.fields.filter(i=>!Le(i)&&!Gt(i.type)).map(i=>[Ai(i),i]));for(let[i,l]of Object.entries(A)){let c=a.get(i.toLowerCase());if(!c)throw new Ys(i);Kd(c,t,l)}return r}var VF=99,zd=256,Er=class extends Error{constructor(x){super(`?ddeMapper.unknown-container."${x}"`),i0(this,"container",x),this.name="DdeUnknownContainerError"}},Ht=class extends Error{constructor(x,A){let e=A?`${x}.${A}`:x;super(`?ddeMapper.write-forbidden."${e}"`),i0(this,"container",x),i0(this,"field",A),this.name="DdeWriteForbiddenError"}},ia=class extends Error{constructor(x){super(`?ddeMapper.unknown-field."${x}"`),i0(this,"field",x),this.name="DdeUnknownFieldError"}};function ls(x){return(x.alias??x.name).toLowerCase()}var Vd=class{constructor(x,A,e=zt){i0(this,"model",x),i0(this,"storage",A),i0(this,"timeSource",e)}async readContainer(x){let A=this.model.byNameOrAlias(x);if(!A)return null;let e=Rt(A);if(e===null)return null;let r=await this.storage.getRowForTag(e);if(!r||!r.data)return null;let t=Ps(await this.resolveScaleRefs(A),r.data);return delete t.stamp,{stamp:this.rowStamp(r),...t}}async writeContainer(x,A){let e=this.model.byNameOrAlias(x);if(!e)throw new Er(x);let r=Rt(e);if(r===null)throw new Er(x);if(e.edit===VF)throw new Ht(e.name);let{stamp:t,...a}=A;this.assertFieldsWritable(e,a);let i=await this.storage.getRowForTag(r),l=Ns(await this.resolveScaleRefs(e),a,i?.data??null),c=ix.msToStamp40(this.recordStampMs(t)??this.timeSource.nowMs()),u=TA(c);return await this.storage.replaceUtoRow({tag:r,stamp:u,flags:i?.flags??0,site_related:i?.site_related??0,data:l}),{tag:r,stampHex:u,stamp40:c,data:l,devicePushable:P8(r)&&e.download!==0,upload:e.upload,download:e.download}}async seedContainer(x,A){let e=this.model.byNameOrAlias(x);if(!e)throw new Er(x);let r=Rt(e);if(r===null)throw new Er(x);let{stamp:t,...a}=A,i=Ns(await this.resolveScaleRefs(e),a,null),l=ix.msToStamp40(this.recordStampMs(t)??this.timeSource.nowMs());await this.storage.replaceUtoRow({tag:r,stamp:TA(l),flags:0,site_related:0,data:i})}recordStampMs(x){if(typeof x!="string")return null;try{return bt(x)}catch{return null}}async readTimeseries(x,A){let e=this.model.byNameOrAlias(x);if(!e)throw new Er(x);let r=this.model.splits.find(u=>u.target.toLowerCase()===e.name.toLowerCase());if(!r)throw new Er(x);let t=Math.abs(A.count),a=A.offset??0,i=this.buildSelectSet(e,A.select),l=await this.resolveScaleRefs(e);return(await this.collectMatched(l,r,a+t,{fromStamp:this.boundHex(A.fromMs),untilStamp:this.boundHex(A.untilMs),order:A.count<0?"desc":"asc",selectSet:i})).slice(a,a+t)}matchesSplit(x,A){return x.length===0?!1:A.matchAll?!0:x.length<A.keyBytes.length?!1:A.keyBytes.every((e,r)=>x[r]===e)}async collectMatched(x,A,e,r){let t=[];if(e<=0)return t;let a=Math.max(e,zd);for(let i=0;;i+=a){let l=await this.storage.getHistoricRows(26623,{fromStamp:r.fromStamp,untilStamp:r.untilStamp,order:r.order,limit:a,offset:i});for(let c of l)if(c.data&&this.matchesSplit(c.data,A)&&(t.push(this.recordFromRow(x,c,r.selectSet)),t.length>=e))return t;if(l.length<a)return t}}async readTimeseriesEdge(x,A,e){return(await this.readTimeseries(x,{count:A==="youngest"?-1:1,select:e}))[0]??null}recordFromRow(x,A,e){let r=Ps(x,A.data),t={stamp:this.rowStamp(A)};for(let[a,i]of Object.entries(r))a!=="stamp"&&(!e||e.has(a))&&(t[a]=i);return t}rowStamp(x){return Dt(ix.stamp40ToMS(je(x.stamp)))}boundHex(x){if(x!=null)return TA(ix.msToStamp40(x))}async resolveScaleRefs(x){if(!x.fields.some(r=>r.vscaleRef||r.vofsRef))return x;let A=new Map,e=[];for(let r of x.fields){if(!r.vscaleRef&&!r.vofsRef){e.push(r);continue}e.push({...r,vscale:r.vscaleRef?await this.resolveRef(r.vscaleRef,A,r.vscale):r.vscale,vofs:r.vofsRef?await this.resolveRef(r.vofsRef,A,r.vofs):r.vofs})}return{...x,fields:e}}async resolveRef(x,A,e){if(!/^config[0-9a-f]$/i.test(x.container))return e;let r=this.referencedField(x);if(!r)return e;let t=x.container.toLowerCase();A.has(t)||A.set(t,await this.referencedRecordData(x.container));let a=A.get(t);if(!a)return e;let i=qd(r,a);return i===null?e:i}referencedField(x){let A=x.field.toLowerCase();return this.model.byNameOrAlias(x.container)?.fields.find(r=>ls(r)===A||r.name.toLowerCase()===A)??null}async referencedRecordData(x){let A=this.model.byNameOrAlias(x);if(!A)return null;let e=Rt(A);return e===null?null:(await this.storage.getRowForTag(e))?.data??null}assertFieldsWritable(x,A){let e=new Map(x.fields.filter(r=>!Le(r)&&!Gt(r.type)).map(r=>[ls(r),r]));for(let r of Object.keys(A)){let t=e.get(r.toLowerCase());if(t&&t.edit===VF)throw new Ht(x.name,t.name)}}buildSelectSet(x,A){if(!A||A.length===0)return null;let e=new Set(x.fields.filter(t=>!Le(t)&&!Gt(t.type)).map(t=>ls(t))),r=new Set;for(let t of A){let a=t.toLowerCase();if(a!=="stamp"){if(!e.has(a))throw new ia(t);r.add(a)}}return r}},Wd=new Set(["$titles","$meta"]);function Xd(x){let A=x;if(typeof x=="string")try{A=JSON.parse(x)}catch{return null}return typeof A!="object"||A===null||Array.isArray(A)?null:A}function Is(x,A){let e=A.toLowerCase();if(Wd.has(e))return null;let r=x[e];if(typeof r!="object"||r===null)return null;let t=new Map;for(let[a,i]of Object.entries(r)){if(typeof i!="object"||i===null)continue;let l=i.alias;typeof l=="string"&&l.length>0&&t.set(a.toLowerCase(),l)}return t}function Z8(x,A){let e={};for(let[r,t]of Object.entries(x)){if(r==="stamp"){e[r]=t;continue}let a=A?.get(r.toLowerCase());e[a??r]=t}return e}function Vt(x,A){if(!x)return null;let e=Is(x,A.name);return e||(A.alias?Is(x,A.alias):null)}var Yd=require("events"),X0="[OfflineSyncManager]",Qd=500,Zd="site_info",xu=new Set(["local-data-interface.json"]);function nA(x){if(x?.aborted)throw x.reason??new DOMException("The operation was aborted.","AbortError")}function Au(x){let A=Kn(x);return!!(x&2)||A!==0&&A!==65}function WF(x){return x.filter(A=>(A.filename===ut||A.filename===Ks)&&A.outcome==="download").map(A=>A.filename)}var Gr="skip-equal",dt="skip-device-readonly",cs="delete",lr="error",Es="upload",Bs="uploading-utos",XF="downloading-utos",Nn="fetching-device-state",Cs="uploading-files",In="downloading-files",YF="executing-change-requests",QF="executed",eu="error",ds="skip-old-stamp",ru=class extends Yd.EventEmitter{constructor(x,A,e){super(),i0(this,"utoMaster",x),i0(this,"storage",A),i0(this,"logger",e)}emitProgress(x,A,e,r,t){let a={phase:x,item:A,completed:e,total:r,...t};this.emit("progress",a)}async uploadHistoricTag(x,A,e,r,t){try{let a=await this.storage.getRowForTag(x),i=0,l=async c=>{let u=c.filter(b=>b.stamp40>e).map(b=>({tag:x,stamp:TA(b.stamp40),flags:a?.flags??0,site_related:a?.site_related??0,data:b.data}));await this.storage.insertHistoricRows(u),i+=u.length};return await this.utoMaster.requestHistoricUtos(x,e,t,void 0,Qd,l),this.logger?.info(`${X0} historic upload tag=0x${x.toString(16)} +${i} records`),{tag:x,sTag:A.sTag,historic:!0,outcome:"upload",dbStamp40:e,deviceStamp40:r,recordsAppended:i}}catch(a){return this.logger?.error(`${X0} historic upload error tag=0x${x.toString(16)}: ${a}`),{tag:x,sTag:A.sTag,historic:!0,outcome:"error",dbStamp40:e,deviceStamp40:r}}}async uploadSingleTag(x,A,e,r){try{let t=await this.utoMaster.requestUto(x,0);if(!t)return this.logger?.info(`${X0} single upload tag=0x${x.toString(16)} \u2014 device returned no data (skip)`),{tag:x,sTag:A.sTag,historic:!1,outcome:Gr,dbStamp40:e,deviceStamp40:r};let a=await this.storage.getRowForTag(x);return await this.storage.replaceUtoRow({tag:x,stamp:TA(t.stamp),flags:a?.flags??0,site_related:a?.site_related??0,data:t.data?new Uint8Array(t.data.buffer.slice(t.data.byteOffset,t.data.byteOffset+t.data.byteLength)):null}),this.logger?.info(`${X0} single upload tag=0x${x.toString(16)}`),{tag:x,sTag:A.sTag,historic:!1,outcome:"upload",dbStamp40:e,deviceStamp40:r}}catch(t){return this.logger?.error(`${X0} single upload error tag=0x${x.toString(16)}: ${JSON.stringify(t)}`),{tag:x,sTag:A.sTag,historic:!1,outcome:"error",dbStamp40:e,deviceStamp40:r}}}async uploadUtoTags(x,A,e,r){let t=x.length;this.emitProgress(Bs,null,0,t);let a=0;for(let i of x){nA(r);let l=A.get(i),{tagInfo:c,dbStamp40:u,deviceStamp40:b}=l;if(this.emitProgress(Bs,c?.sTag??`0x${i.toString(16)}`,a,t),!c||b===null)e.set(i,{tag:i,sTag:"?",historic:!1,outcome:"unknown-tag",dbStamp40:u,deviceStamp40:b});else if(!(!c.flags.up||b<=u)){let m=c.sTag,g=a,q=c.historic?await this.uploadHistoricTag(i,c,u,b,_=>{this.emitProgress(Bs,m,g,t,{recordsReceived:_})}):await this.uploadSingleTag(i,c,u,b);e.set(i,q)}++a}}async pullFileFromDevice(x,A,e,r,t,a){let i=A.stamp;try{let l=await this.utoMaster.requestFile(x,u=>{this.emitProgress(Cs,x,a,t,{bytesTransferred:u})}),c=Js(l);if(c!==A.crc32)throw new Error(`crc32 mismatch: expected 0x${A.crc32.toString(16)}, got 0x${c.toString(16)}`);return await this.storage.upsertFile({filename:x,stamp:TA(i),crc:A.crc32,size:l.byteLength,flags:A._flags,flags_int:r,data:l}),{filename:x,outcome:Es,dbStamp40:e,deviceStamp40:i}}catch(l){return this.logger?.error(`${X0} file upload error ${x}: ${JSON.stringify(l)}`),{filename:x,outcome:lr,dbStamp40:e,deviceStamp40:i}}}async autoSyncUploadFile(x,A,e,r,t,a,i,l){let c=A.stamp;if(c>r)return this.fileContentMatches(A,e)?this.convergeFileStamp(x,A,e,r):a?this.pullFileFromDevice(x,A,r,t,i,l):void 0;if(c===r&&this.fileContentMatches(A,e))return{filename:x,outcome:Gr,dbStamp40:r,deviceStamp40:c}}async convergeFileStamp(x,A,e,r){let t=A.stamp;try{return await this.storage.upsertFile({filename:x,stamp:TA(t),crc:A.crc32,size:A.size,flags:A._flags,flags_int:e.flags_int,data:e.data}),{filename:x,outcome:Gr,dbStamp40:r,deviceStamp40:t}}catch(a){return this.logger?.error(`${X0} file upload error ${x}: ${JSON.stringify(a)}`),{filename:x,outcome:lr,dbStamp40:r,deviceStamp40:t}}}async mirrorUploadFile(x,A,e,r,t,a,i){let l=A.stamp;if(l!==r||!this.fileContentMatches(A,e))return t?this.pullFileFromDevice(x,A,r,e.flags_int,a,i):{filename:x,outcome:dt,dbStamp40:r,deviceStamp40:l}}async decideFileUpload(x,A,e,r){let t=await this.storage.getFile(x),a=!!(A._flags&1);if(!t)return a?this.pullFileFromDevice(x,A,0,16,e,r):void 0;let i=je(t.stamp);return A._flags&8?this.autoSyncUploadFile(x,A,t,i,t.flags_int,a,e,r):this.decideNonSystemUpload(x,A,t,i,a,e,r)}pullIfReadable(x,A,e,r,t,a,i){return x?this.pullFileFromDevice(A,e,r,t,a,i):void 0}async decideNonSystemUpload(x,A,e,r,t,a,i){let l=e.flags_int;if(!(l&2))return l&4?this.pullIfReadable(t,x,A,r,l,a,i):this.decideUploadBySyncLogic(x,A,e,r,t,a,i)}async decideUploadBySyncLogic(x,A,e,r,t,a,i){let l=e.flags_int,c=Kn(l);if(c===65)return this.fileContentMatches(A,e)?this.convergeFileStamp(x,A,e,r):this.pullIfReadable(t,x,A,r,l,a,i);if(c===1)return this.autoSyncUploadFile(x,A,e,r,l,t,a,i);if(c===97)return A.stamp>r?this.pullIfReadable(t,x,A,r,l,a,i):void 0;if(c!==33)return this.mirrorUploadFile(x,A,e,r,t,a,i)}async uploadFiles(x,A,e,r){let t=Object.entries(x),a=t.length;this.emitProgress(Cs,null,0,a);let i=0;for(let[l,c]of t){if(nA(r),!(l===Ks||l===ut&&!e)){let b=await this.decideFileUpload(l,c,a,i);b&&A.set(l,b)}this.emitProgress(Cs,l,++i,a)}}fileContentMatches(x,A){return A!==null&&x.crc32===A.crc&&x.size===A.size}async downloadSingleTag(x,A,e,r){try{let t=await this.storage.getRowForTag(x);return t?.data&&await this.utoMaster.sendUTOCmdExt(3,x,t.data,e),{tag:x,sTag:A.sTag,historic:!1,outcome:"download",dbStamp40:e,deviceStamp40:r}}catch(t){return this.logger?.error(`${X0} download error tag=0x${x.toString(16)}: ${t}`),{tag:x,sTag:A.sTag,historic:!1,outcome:"error",dbStamp40:e,deviceStamp40:r}}}async processDownloadTag(x,A,e,r,t){if(e===r&&!t.has(x)){let a=A.flags.up?Gr:"skip-db-readonly";t.set(x,{tag:x,sTag:A.sTag,historic:!1,outcome:a,dbStamp40:e,deviceStamp40:r});return}if(e>r){let a=A.flags.down?await this.downloadSingleTag(x,A,e,r):{tag:x,sTag:A.sTag,historic:!1,outcome:dt,dbStamp40:e,deviceStamp40:r};t.set(x,a)}}async downloadUtoTags(x,A,e,r){let t=x.length;this.emitProgress(XF,null,0,t);let a=0;for(let i of x){nA(r);let{tagInfo:l,dbStamp40:c,deviceStamp40:u}=A.get(i);l&&u!==null&&!l.historic&&await this.processDownloadTag(i,l,c,u,e),this.emitProgress(XF,l?.sTag??`0x${i.toString(16)}`,++a,t)}}async sendFileToDevice(x,A,e,r,t){let a=x.data.byteLength,i=l=>{if(l!==null){let c=Math.round(a*parseInt(l,10)/100);this.emitProgress(In,x.filename,t,r,{bytesTransferred:c,bytesTotal:a})}};this.utoMaster.on("installing",i);try{return await this.utoMaster.sendFile(0,x.data,ix.stamp40ToMS(A),x.filename),{filename:x.filename,outcome:"download",dbStamp40:A,deviceStamp40:e}}catch(l){return this.logger?.error(`${X0} file download error ${x.filename}: ${l}`),{filename:x.filename,outcome:"error",dbStamp40:A,deviceStamp40:e}}finally{this.utoMaster.removeListener("installing",i)}}async processDownloadFile(x,A,e,r,t=!1){if(!x.data)return;let a=A?.stamp??0,i=je(x.stamp);if(A!==void 0&&this.fileContentMatches(A,x))return i===a?void 0:{filename:x.filename,outcome:Gr,dbStamp40:i,deviceStamp40:a};if(!(!t&&i<a))return!t&&A!==void 0&&!(A._flags&2)?{filename:x.filename,outcome:dt,dbStamp40:i,deviceStamp40:a}:this.sendFileToDevice(x,i,a,e,r)}async isAppInDevPhase(){let x=await this.storage.getMetadataValue(Zd);if(!x)return!1;try{return JSON.parse(x).app?.phase==="dev"}catch(A){return this.logger?.error(`${X0} corrupt site_info metadata: ${A}`),!1}}async downloadFiles(x,A,e,r){let t=await this.storage.getFiles(),a=t.filter(m=>m.flags&8),i=t.filter(m=>!(m.flags&8)),l=[...a,...i].filter(m=>m.filename),c=Object.entries(x).filter(([,m])=>m._flags&4).map(([m])=>m),u=l.length;this.emitProgress(In,null,0,u);let b=0;for(let m of l){if(nA(r),e&&m.filename===ut){this.emitProgress(In,m.filename,++b,u);continue}let g=m.filename===ut&&!e,q=await this.decideFileDownload(m,x[m.filename],A.get(m.filename),c,g,u,b);q&&A.set(m.filename,q),this.emitProgress(In,m.filename,++b,u)}}async decideFileDownload(x,A,e,r,t,a,i){return A!==void 0?this.decideDownloadExisting(x,A,e,t,a,i):this.decideDownloadMissing(x,r,a,i)}async decideDownloadExisting(x,A,e,r,t,a){if(A._flags&4)return;if(x.flags&8)return e?void 0:this.processDownloadFile(x,A,t,a,r);let i=x.flags_int;if(i&8)return this.handleDeviceDelete(x,A,e);if(!e&&!(i&4))return this.pushToDevice(x,A,t,a)}async pushToDevice(x,A,e,r){let t=A.stamp,a=je(x.stamp),i=this.wantDownloadPush(x,A,a,t);if(i==="match")return{filename:x.filename,outcome:Gr,dbStamp40:a,deviceStamp40:t};if(i!=="none"&&!(a===0||!x.data||x.data.byteLength===0))return A._flags&2?this.sendFileToDevice(x,a,t,e,r):{filename:x.filename,outcome:dt,dbStamp40:a,deviceStamp40:t}}wantDownloadPush(x,A,e,r){let t=x.flags_int;if(t&2)return"push";let a=this.fileContentMatches(A,x),i=Kn(t);return i===33||i===1&&e>=r?a?"match":"push":i===97&&e>r?"push":"none"}async handleDeviceDelete(x,A,e){let r=A.stamp,t=je(x.stamp);if(!(e&&(e.outcome===Es||e.outcome===lr))){if(!(A._flags&2))return{filename:x.filename,outcome:dt,dbStamp40:t,deviceStamp40:r};try{return await this.utoMaster.deleteFile(x.filename),await this.storage.deleteFile(x.filename),{filename:x.filename,outcome:cs,dbStamp40:t,deviceStamp40:r}}catch(a){return this.logger?.error(`${X0} file delete error ${x.filename}: ${JSON.stringify(a)}`),{filename:x.filename,outcome:lr,dbStamp40:t,deviceStamp40:r}}}}async decideDownloadMissing(x,A,e,r){let t=x.flags_int,a=je(x.stamp);if(t&8)try{return await this.storage.deleteFile(x.filename),{filename:x.filename,outcome:cs,dbStamp40:a,deviceStamp40:null}}catch(i){return this.logger?.error(`${X0} file delete error ${x.filename}: ${JSON.stringify(i)}`),{filename:x.filename,outcome:lr,dbStamp40:a,deviceStamp40:null}}if(!(x.flags&12)&&Au(t)&&x.flags&2&&this.hasMatchingNode(x.filename,A)&&x.data)return this.sendFileToDevice(x,a,0,e,r)}hasMatchingNode(x,A){return A.some(e=>e.slice(0,-1)===x.slice(0,e.length-1))}async reconcileFileState(x){try{await this.reconcileFileStateUnguarded(x)}catch(A){if(x?.aborted)throw A;this.logger?.error(`${X0} file-state reconciliation failed: ${JSON.stringify(A)}`)}}async reconcileFileStateUnguarded(x){let A=await this.utoMaster.requestFileList(),e=new Set(Object.keys(A)),r=await this.storage.getFiles(),t=new Map(r.map(a=>[a.filename,a]));for(let[a,i]of Object.entries(A))nA(x),await this.reconcileDeviceFile(a,i,t.get(a)??null);for(let a of r)nA(x),e.has(a.filename)||await this.dropRowMissingFromDevice(a)}async reconcileDeviceFile(x,A,e){let r=!!((A._flags|(e?.flags??0))&8);if(e?.data&&!this.fileContentMatches(A,e)){this.logger?.info(`${X0} reconcile keep ${x}: row holds undeployed content`);return}if(!e?.data&&!r)return;let t={filename:x,stamp:TA(A.stamp),crc:A.crc32,size:A.size,flags:A._flags,flags_int:e?.flags_int??16,data:this.keepBlob(x,r)?e?.data??null:null};e&&this.fileRowMatches(e,t)||await this.storage.upsertFile(t)}keepBlob(x,A){return!A||xu.has(x)}fileRowMatches(x,A){return x.stamp===A.stamp&&x.crc===A.crc&&x.size===A.size&&x.flags===A.flags&&x.flags_int===A.flags_int&&(x.data??null)===A.data}async dropRowMissingFromDevice(x){try{await this.storage.deleteFile(x.filename)}catch(A){this.logger?.error(`${X0} reconcile delete error ${x.filename}: ${JSON.stringify(A)}`)}}async validateDevice(x){nA(x),this.emitProgress("validating",null,0,1);let A=await this.utoMaster.requestDeviceInfo();if(!A)throw new Error(`${X0} requestDeviceInfo returned null`);let e=await this.storage.getMetadataValue("device_id");if(e===null){if(!A.serialNumber)throw new Error(`${X0} DB metadata missing device_id and connected device has no serialNumber`);if(!this.storage.setMetadataValue)throw new Error(`${X0} DB metadata missing device_id`);await this.storage.setMetadataValue("device_id",A.serialNumber),e=A.serialNumber}if(e.toUpperCase()!==A.serialNumber.toUpperCase())throw new Error(`${X0} DB device_id "${e}" does not match connected device "${A.serialNumber}"`);return this.emitProgress("validating",null,1,1),A}buildTagMap(x){let A=new Map;for(let e=0;e<x.utos.length;e++){let r=x.utos[e];A.set(r.wTag,{index:e,flags:{up:r.flags.up,down:r.flags.down,setValue:!!r.flags.setValue},historic:r.flags.historic,sTag:r.sTag})}return A}async resolveDbTags(x){let A=await this.storage.getUtoDataTags(),e=new Set(A);for(let[r,t]of x)t.historic&&!e.has(r)&&A.push(r);return A}async buildTagStampCache(x,A,e){let r=new Map;for(let t of x){let a=A.get(t),i=await this.storage.getLatestStampForTag(t),l=i?je(i):0,c=a&&a.index<e.stamps.length?e.stamps[a.index]:null;r.set(t,{dbStamp40:l,deviceStamp40:c,tagInfo:a})}return r}async executeChangeRequests(x,A,e,r,t,a){let i=await this.storage.getUtoChangeRequests(),l=this.groupChangeRequests(i),c=l.size;if(this.emitProgress(YF,null,0,c),c===0)return;let u=new Set,b=0;for(let[m,g]of l){nA(a);let q=x.get(m),_=q?.sTag??`0x${m.toString(16)}`;this.emitProgress(YF,_,b,c),await this.executeChangeRequestTag(m,_,q,g,A,r,t,u),++b}u.size>0&&await this.repullExecutedTags(u,x,e,a)}groupChangeRequests(x){let A=new Map;for(let e of x){let r=A.get(e.tag)??[];r.push({stamp40:je(e.stamp),user:e.user,json:e.json}),A.set(e.tag,r)}return A}async executeChangeRequestTag(x,A,e,r,t,a,i,l){if(!e){this.pushChangeResults(i,x,A,r,"unknown-tag");return}if(!e.flags.setValue){this.pushChangeResults(i,x,A,r,"skip-unsupported");return}let c=e.index<t.stamps.length?t.stamps[e.index]:0,u=r.filter(m=>m.stamp40<=c),b=r.filter(m=>m.stamp40>c);this.pushChangeResults(i,x,A,u,ds),b.length>0&&await this.coalesceAndSend(x,A,e,b,a,i,l)}async coalesceAndSend(x,A,e,r,t,a,i){let l=await this.storage.getRowForTag(x);if(t.get(x)?.outcome===lr||!l||!l.data){this.pushChangeResults(a,x,A,r,"error");return}let c=this.resolveSetObject(l.data,r,A);if(c===null){this.pushChangeResults(a,x,A,r,"error");return}if(Object.keys(c).length===0){this.pushChangeResults(a,x,A,r,"skip-no-change");return}let u=r[r.length-1].stamp40,b=await this.utoMaster.sendSetValue(x,JSON.stringify(c),u);b.outcome==="ok"||b.outcome==="stamp"?(i.add(x),this.pushChangeResults(a,x,A,r,QF,b.resultCode)):b.outcome==="denied"?(this.logger?.warn(`${X0} change-request denied ${A} (result=${b.resultCode}) \u2014 server will retry`),this.pushChangeResults(a,x,A,r,"denied",b.resultCode)):(this.logger?.error(`${X0} change-request error ${A} (result=${b.resultCode})`),this.pushChangeResults(a,x,A,r,"error",b.resultCode))}resolveSetObject(x,A,e){try{let r=JSON.parse(ix.cp1252Unpack(x,0,x.byteLength));return this.buildSetObject(r,A,e)}catch(r){return this.logger?.error(`${X0} change-request unparseable uto_data ${e}: ${r}`),null}}buildSetObject(x,A,e){let r={};for(let t of A){let a=JSON.parse(t.json);if(!this.isPlainRecord(a))throw new Error(`change-request JSON is not an object on ${e}`);for(let[i,l]of Object.entries(a)){let c=this.resolveChangeField(x[i],l,i,e);c.apply&&(r[i]=c.value,x[i]=c.value)}}return r}resolveChangeField(x,A,e,r){if(this.isBitwiseOp(A)){let{op:t,val:a}=A;return this.resolveBitwiseOp(x,t,a,e,r)}return x===A?{apply:!1}:{apply:!0,value:A}}resolveBitwiseOp(x,A,e,r,t){return A!=="|"&&A!=="&"?(this.logger?.warn(`${X0} change-request unknown op "${A}" on ${t}.${r} \u2014 skipped`),{apply:!1}):typeof e!="number"?(this.logger?.warn(`${X0} change-request op "${A}" with non-number val on ${t}.${r} \u2014 skipped`),{apply:!1}):x===void 0?A==="|"?{apply:!0,value:e}:{apply:!1}:typeof x!="number"?(this.logger?.warn(`${X0} change-request op "${A}" on non-number ${t}.${r} \u2014 skipped`),{apply:!1}):{apply:!0,value:A==="|"?x|e:x&e}}isBitwiseOp(x){return this.isPlainRecord(x)&&"op"in x}isPlainRecord(x){return typeof x=="object"&&x!==null&&!Array.isArray(x)}pushChangeResults(x,A,e,r,t,a){for(let i of r)x.push({tag:A,sTag:e,stamp40:i.stamp40,user:i.user,outcome:t,resultCode:a})}async repullExecutedTags(x,A,e,r){let t=null;try{t=await this.utoMaster.requestStamps()}catch(a){this.logger?.warn(`${X0} change-request STAMPS re-fetch failed \u2014 using per-tag stamps: ${a}`)}for(let a of x)nA(r),await this.repullExecutedTag(a,A,t,e)}async repullExecutedTag(x,A,e,r){try{let t=await this.utoMaster.requestUto(x,0);if(!t){this.logger?.info(`${X0} change-request re-pull tag=0x${x.toString(16)} \u2014 device returned no data (E_EOD), DB row unchanged`);return}let a=await this.storage.getRowForTag(x),i=t.stamp;await this.storage.replaceUtoRow({tag:x,stamp:TA(i),flags:a?.flags??0,site_related:a?.site_related??0,data:t.data?new Uint8Array(t.data.buffer.slice(t.data.byteOffset,t.data.byteOffset+t.data.byteLength)):null});let l=r.get(x);if(l){let c=A.get(x),u=e&&c&&c.index<e.stamps.length?e.stamps[c.index]:i;l.dbStamp40=i,l.deviceStamp40=u}this.logger?.info(`${X0} change-request re-pull tag=0x${x.toString(16)} \u2192 stamp ${i}`)}catch(t){this.logger?.error(`${X0} change-request re-pull error tag=0x${x.toString(16)}: ${t}`)}}aggregateResult(x,A,e){let r=[...x.values()],t=[...A.values()],a=WF(t);return{tags:r,files:t,changeRequests:e,requiresReconnectSync:a.length>0,rebootFilesDeployed:a,totalTagsUploaded:r.filter(i=>i.outcome==="upload"&&!i.historic).length,totalTagsDownloaded:r.filter(i=>i.outcome==="download").length,totalTagsSkipped:r.filter(i=>i.outcome===Gr||i.outcome==="skip-db-readonly"||i.outcome===dt).length,totalHistoricRecordsAppended:r.reduce((i,l)=>i+(l.recordsAppended??0),0),totalFilesUploaded:t.filter(i=>i.outcome===Es).length,totalFilesDownloaded:t.filter(i=>i.outcome==="download").length,totalFilesDeleted:t.filter(i=>i.outcome===cs).length,totalChangeRequestsExecuted:e.filter(i=>i.outcome===QF).length,totalErrors:r.filter(i=>i.outcome===lr).length+t.filter(i=>i.outcome===lr).length+e.filter(i=>i.outcome===eu).length}}async sync(x){let{signal:A}=x??{},e=await this.validateDevice(A);nA(A),this.emitProgress(Nn,null,0,3);let r=this.buildTagMap(e),t=await this.utoMaster.requestStamps();if(!t)throw new Error(`${X0} requestStamps returned null`);this.emitProgress(Nn,"stamps",1,3);let a=await this.utoMaster.requestFileList();this.emitProgress(Nn,"file-list",2,3);let i=await this.resolveDbTags(r);this.emitProgress(Nn,"db-tags",3,3);let l=await this.buildTagStampCache(i,r,t),c=new Map,u=new Map,b=[],m=await this.isAppInDevPhase();return nA(A),await this.uploadUtoTags(i,l,c,A),nA(A),await this.uploadFiles(a,u,m,A),nA(A),await this.executeChangeRequests(r,t,l,c,b,A),nA(A),await this.downloadUtoTags(i,l,c,A),nA(A),await this.downloadFiles(a,u,m,A),nA(A),WF([...u.values()]).length===0&&await this.reconcileFileState(A),this.emitProgress("complete",null,0,0),this.aggregateResult(c,u,b)}async executeAdHocChangeRequest(x,A){let e=await this.utoMaster.requestDeviceInfo();if(!e)throw new Error(`${X0} requestDeviceInfo returned null`);let r=this.buildTagMap(e),t=await this.utoMaster.requestStamps();if(!t)throw new Error(`${X0} requestStamps returned null`);let a=r.get(x),i=a?.sTag??`0x${x.toString(16)}`,l=A.map(g=>({stamp40:g.stamp40,user:"",json:g.json})).sort((g,q)=>g.stamp40-q.stamp40),c=new Map,u=[],b=new Set;return await this.executeChangeRequestTag(x,i,a,l,t,c,u,b),b.size>0&&await this.repullExecutedTags(b,r,new Map,void 0),u.find(g=>g.outcome!==ds)?.outcome??ds}},tu=require("events"),nu=require("events"),iu=require("events"),su=5e3,sa=class xv extends iu.EventEmitter{constructor(A=he){super(),i0(this,"logger",A),i0(this,"ws",null),i0(this,"bridgeTransport",null),i0(this,"bridgeSignal"),i0(this,"bridgeResolve",null),i0(this,"bridgeReject",null),i0(this,"serverMessageCount",0),i0(this,"settled",!1),i0(this,"abortHandler",null),i0(this,"connectTimeout"),i0(this,"writeQueue",[]),i0(this,"isProcessingQueue",!1),i0(this,"queueAborted",!1),i0(this,"queueDrainPromise",Promise.resolve()),i0(this,"transportUnsubscribe",null)}static buildSyncUrl(A,e){return`wss://${A}/uto/1/sync/${e}`}resetBridgeState(){this.serverMessageCount=0,this.settled=!1,this.abortHandler=null,this.connectTimeout=void 0,this.writeQueue=[],this.isProcessingQueue=!1,this.queueAborted=!1,this.queueDrainPromise=Promise.resolve(),this.bridgeResolve=null,this.bridgeReject=null,this.bridgeTransport=null,this.bridgeSignal=void 0,this.transportUnsubscribe=null}async processWriteQueue(){if(!this.isProcessingQueue){for(this.isProcessingQueue=!0;this.writeQueue.length>0&&!this.queueAborted;){let A=this.writeQueue.shift();try{await y8(this.bridgeTransport,A)}catch(e){let r=e instanceof Error?e.message:String(e);this.logger.error(`Error writing to transport: ${r}`)}}this.isProcessingQueue=!1}}cleanup(){this.transportUnsubscribe&&(this.transportUnsubscribe(),this.transportUnsubscribe=null),this.abortHandler&&this.bridgeSignal&&(this.bridgeSignal.removeEventListener("abort",this.abortHandler),this.abortHandler=null),this.connectTimeout!==void 0&&(clearTimeout(this.connectTimeout),this.connectTimeout=void 0),this.ws=null}settle(A,e){this.settled||(this.settled=!0,this.cleanup(),A==="resolve"?this.bridgeResolve?.({serverMessageCount:this.serverMessageCount}):this.bridgeReject?.(e))}attachWebSocketHandlers(A,e){let r=t=>{A.readyState===WebSocket.OPEN&&!this.bridgeSignal?.aborted&&!this.settled&&A.send(t)};this.abortHandler=()=>{this.logger.info("WebSocket bridge aborted"),this.queueAborted=!0,this.writeQueue.length=0,(A.readyState===WebSocket.OPEN||A.readyState===WebSocket.CONNECTING)&&A.close(),this.settle("reject",new Error("Operation aborted"))},this.bridgeSignal&&this.bridgeSignal.addEventListener("abort",this.abortHandler),A.onopen=()=>{this.connectTimeout!==void 0&&(clearTimeout(this.connectTimeout),this.connectTimeout=void 0),this.logger.info(`WebSocket connected to ${e}`),this.transportUnsubscribe=this.bridgeTransport.onData(r),this.emit("wsConnected")},A.onmessage=t=>{this.serverMessageCount++,this.emit("serverMessage",this.serverMessageCount),!(this.bridgeSignal?.aborted||this.settled)&&(this.writeQueue.push(t.data),this.isProcessingQueue||(this.queueDrainPromise=this.processWriteQueue()))},A.onclose=t=>{this.logger.info(`WebSocket closed (server=${e}, code=${t.code}, messages=${this.serverMessageCount})`),this.emit("wsClosed",t.code,t.reason),this.queueDrainPromise.then(()=>this.settle("resolve")).catch(()=>this.settle("resolve"))},A.onerror=t=>{this.logger.error(`WebSocket error (server=${e})`),this.emit("wsError",t),this.queueAborted=!0,this.writeQueue.length=0,this.settle("reject",new Error("WebSocket error"))}}async bridge(A,e,r,t){return new Promise((a,i)=>{if(t?.aborted){i(new Error("Operation aborted"));return}this.resetBridgeState(),this.bridgeTransport=A,this.bridgeSignal=t,this.bridgeResolve=a,this.bridgeReject=i;let l=xv.buildSyncUrl(e,r);this.logger.info(`Opening WebSocket: ${l}`);let c=new WebSocket(l);c.binaryType="arraybuffer",this.ws=c,this.connectTimeout=setTimeout(()=>{c.readyState===WebSocket.CONNECTING&&(this.logger.error("WebSocket connection timeout"),c.close(),this.settle("reject",new Error("WebSocket connection timeout")))},su),this.attachWebSocketHandlers(c,e)})}close(){this.ws&&this.ws.readyState===WebSocket.OPEN&&this.ws.close()}},Av="https://lic.mydatanet.at/api/2/";async function ev(x,A=Av){let e=`${A}devices/${x}/assignment`,r=await fetch(e);if(!r.ok)throw new Error(`Failed to get device assignment: ${r.status} ${r.statusText}`);return r.json()}var rv=class extends nu.EventEmitter{constructor(x=he){super(),i0(this,"logger",x)}async execute(x,A,e,r){let t=e;t||(this.logger.info("[LegacySync] No serverUrl provided, resolving via device assignment..."),this.emit("syncPhase",{phase:"resolving-server"}),t=(await ev(A)).server_url,this.logger.info("[LegacySync] Resolved server URL: "+t)),this.logger.info("[LegacySync] Starting legacy sync (server="+t+")");let a=new sa(this.logger);a.on("wsConnected",()=>this.emit("wsConnected")),a.on("wsClosed",(l,c)=>this.emit("wsClosed",l,c)),a.on("wsError",l=>this.emit("wsError",l)),a.on("serverMessage",l=>this.emit("serverMessage",l));let i=await a.bridge(x,t,A,r);return this.logger.info("[LegacySync] Legacy sync completed (serverMessages="+i.serverMessageCount+")"),{serverMessageCount:i.serverMessageCount}}},au=require("events"),tv="Operation aborted";function ou(x){return x instanceof Error?x.message:String(x)}function us(x){if(x?.aborted)throw new Error(tv)}var nv=class extends au.EventEmitter{constructor(x,A=he){super(),i0(this,"atHandler",x),i0(this,"logger",A)}async execute(x,A,e,r){this.logger.info("Starting debug-enabled sync");let t=[{name:"mnt",queryServer:i=>this.atHandler.queryMntServerConfig(i),initiateSync:i=>this.atHandler.initiateMntSync(i)},{name:"mdn",queryServer:i=>this.atHandler.queryMdnServerConfig(i),initiateSync:i=>this.atHandler.initiateMdnSync(i)}],a={};for(let i of t)try{a[i.name]=await this.runSyncPhase(i,x,A,r)}catch(l){if(r?.aborted)throw new Error(tv);let c=`${i.name.toUpperCase()} sync phase failed: ${ou(l)}`;throw this.logger.error(c),new Error(c)}return this.logger.info(`Debug sync completed (mntMessages=${a.mnt}, mdnMessages=${a.mdn})`),{mntServerMessageCount:a.mnt,mdnServerMessageCount:a.mdn}}async runSyncPhase(x,A,e,r){us(r);let t=x.name.toUpperCase();this.emit("syncPhase",{phase:x.name}),this.logger.info(`Phase: Querying ${t} server configuration`);let a=await x.queryServer(r);this.logger.info(`${t} server domain: ${a}`),us(r),await x.initiateSync(r),us(r);let i=await this.syncWithServer(A,a,e,r);return this.logger.info(`${t} phase completed (serverMessages=${i.serverMessageCount})`),i.serverMessageCount}async syncWithServer(x,A,e,r){let t=new sa(this.logger),a=!1;t.on("wsConnected",()=>this.emit("wsConnected"));let i=this.atHandler.createConCloseMonitor(()=>{a=!0,this.logger.info("Device initiated close (+CONCLOSE), closing WebSocket"),t.close()});try{let l=await t.bridge(x,A,e,r);return a?this.logger.info("Connection closed by device (+CONCLOSE)"):(this.logger.info("Connection closed by server, sending +CONCLOSE to device"),await this.atHandler.sendConnectionClose(r)),l}finally{i()}}},Fu=class extends tu.EventEmitter{constructor(x,A,e=he){super(),i0(this,"syncTransport",x),i0(this,"logger",e),i0(this,"atHandler"),this.atHandler=A??null}async sync(x){let A=this.atHandler?"debug":"legacy";this.emit("syncStart",{mode:A});try{if(this.atHandler)try{return this.emit("syncPhase",{phase:"debug-sync"}),await this.syncWithDebug(x)}catch(e){return this.logger.warn("[SyncManager] Debug sync failed, falling back to legacy sync: "+(e instanceof Error?e.message:String(e))),this.emit("syncPhase",{phase:"debug-fallback-legacy"}),await this.syncLegacy(x)}return this.emit("syncPhase",{phase:"legacy"}),await this.syncLegacy(x)}catch(e){throw this.emit("syncError",e),e}}async syncLegacy(x){let A=new rv(this.logger);A.on("syncPhase",t=>this.emit("syncPhase",t));let r={mode:"legacy",serverMessageCount:(await A.execute(this.syncTransport,x.serialNumber,x.serverUrl,x.signal)).serverMessageCount};return this.emit("syncComplete",r),r}async syncWithDebug(x){let A=new nv(this.atHandler,this.logger);A.on("syncPhase",t=>this.emit("syncPhase",t));let e=await A.execute(this.syncTransport,x.serialNumber,x.serverUrl??"",x.signal),r={mode:"debug",serverMessageCount:e.mntServerMessageCount+e.mdnServerMessageCount,mntServerMessageCount:e.mntServerMessageCount,mdnServerMessageCount:e.mdnServerMessageCount};return this.emit("syncComplete",r),r}dispose(){}},vu=require("events"),Hx={MNT_CFG:"at+mntcfg?",MDN_CFG:"at+mdncfg?",MNT_SYNC:"at+mntsync",MDN_SYNC:"at+mdnsync",CON_CLOSE:"at+conclose",APP_GET_METADATA:"AT+APP=GETMETADATA",APP_GET_DATAVALUE:"AT+APP=GETDATAVALUE",APP_TRIG_MEASURE:"AT+APP=TRIGMEASURE",APP_TRIG_MEASURE_TEST:"AT+APP=TRIGMEASURE=?",ATI:"ati",RM2M_STATE:"at+rm2mstate?",TX:"at+tx",TX_MAINTENANCE:"at+tx=4",TX_GSM_POSITION:"at+tx=1",TX_MODE_TRIGGERED:"at+txmode=0",TX_MODE_WAKEUP:"at+txmode=1",TX_MODE_ONLINE:"at+txmode=2",COMPANION_CERT:"AT+COMPCERT",COMPANION_CERT_TEST:"AT+COMPCERT=?"},nx={OK:"OK",ERROR:"ERROR",SYNC_START:"+SYNC START",MEASURED:"+MEASURED",CON_CLOSE:"+CONCLOSE",MNT_CFG_PREFIX:"+MNTCFG",MDN_CFG_PREFIX:"+MDNCFG",RM2M_STATE:"+RM2MSTATE",ERROR_PIN_REQUIRED:"ERROR PIN REQUIRED",ERROR_NO_DATA:"ERROR NO DATA",COMPCERT_ERROR:/\+COMPCERT ERROR:\s*(\d+)/},fA=1e4,iv=9e4,sv=/(?:ERROR PIN REQUIRED|ERROR NO DATA|ERROR|OK)\r\n/;function av(){return{buffer:"",closedByDevice:!1,reset(){this.buffer="",this.closedByDevice=!1}}}var Ur="Operation aborted",oA=class extends Error{constructor(x="AT command handler was disposed"){super(x),this.name="AtHandlerDisposedError"}},aa=class extends Error{constructor(x="Device returned ERROR response"){super(x),this.name="AtDeviceError"}},fu=class extends vu.EventEmitter{constructor(x,A=he){super(),i0(this,"transport",x),i0(this,"logger",A),i0(this,"mutex",new Vs("AtCommandHandler")),i0(this,"bufferState",av()),i0(this,"responseCallback",null),i0(this,"decoder",new TextDecoder),i0(this,"dataHandler"),i0(this,"disposeTransportListener"),i0(this,"isDisposed",!1),i0(this,"activeAbort",null),i0(this,"session"),this.dataHandler=e=>this.handleIncomingData(e),this.disposeTransportListener=this.transport.onData(this.dataHandler),this.session={sendAndWait:(e,r,t=fA,a)=>this.executeSendAndWait(e,r,t,a),sendRaw:(e,r=fA)=>this.executeSendRaw(e,r),queryMntServerConfig:e=>this.executeQueryConfig(Hx.MNT_CFG,nx.MNT_CFG_PREFIX,e),queryMdnServerConfig:e=>this.executeQueryConfig(Hx.MDN_CFG,nx.MDN_CFG_PREFIX,e),initiateMntSync:e=>this.executeInitiateMntSync(e),initiateMdnSync:e=>this.executeInitiateMdnSync(e),sendCompanionCert:(e,r)=>this.executeSendCompanionCert(e,r),queryCompanionCertSupport:e=>this.executeQueryCompanionCertSupport(e),sendConnectionClose:e=>this.executeSendConnectionClose(e)}}get isBusy(){return this.mutex.islocked}get disposed(){return this.isDisposed}async withAtLock(x){await this.mutex.requestLock();try{if(this.isDisposed)throw new oA;return await x(this.session)}finally{this.mutex.unlock()}}handleIncomingData(x){let A=this.decoder.decode(x);this.bufferState.buffer+=A,this.emit("data",A),this.responseCallback&&this.responseCallback(this.bufferState.buffer),!this.responseCallback&&this.bufferState.buffer.length>1e3&&(this.bufferState.buffer=this.bufferState.buffer.slice(-500))}encodeCommand(x){let A=new Uint8Array(x.length+2);for(let e=0;e<x.length;e++)A[e]=x.charCodeAt(e);return A[x.length]=10,A[x.length+1]=13,A.buffer}makeCleanup(x,A,e){return()=>{this.responseCallback=null,this.activeAbort=null,clearTimeout(x),A&&e&&A.removeEventListener("abort",e)}}makeResponseChecker(x,A,e,r){let t=x instanceof RegExp;return a=>{if(x!==nx.ERROR&&a.includes(nx.ERROR)){A(),r(new aa);return}let i=!1,l=a;if(t){let c=a.match(x);c&&(i=!0,l=c[0])}else i=a.includes(x);if(i){A(),e(l);return}a.length>500&&(this.bufferState.buffer=this.bufferState.buffer.slice(-250))}}executeSendAndWait(x,A,e,r){return new Promise((t,a)=>{if(this.isDisposed){a(new oA);return}if(r?.aborted){a(new Error(Ur));return}x&&(this.bufferState.buffer="");let l=A instanceof RegExp?A.source:A,c={cleanup:()=>{}},u=setTimeout(()=>{c.cleanup(),a(new Error(`Timeout waiting for response: ${l}`))},e),b=()=>{c.cleanup(),a(new Error(Ur))};c.cleanup=this.makeCleanup(u,r,b),r&&r.addEventListener("abort",b);let m=this.makeResponseChecker(A,c.cleanup,t,a);this.responseCallback=m,this.activeAbort=()=>{c.cleanup(),a(new oA)},!x&&this.bufferState.buffer&&m(this.bufferState.buffer),x&&(this.logger.info("TX: "+x),this.transport.write(this.encodeCommand(x)).catch(g=>{c.cleanup(),a(g)}))})}executeSendRaw(x,A){return new Promise((e,r)=>{if(this.isDisposed){r(new oA);return}this.bufferState.buffer="";let t=setTimeout(()=>{a(),r(new Error(`Timeout waiting for raw AT response to: ${x}`))},A),a=this.makeCleanup(t);this.activeAbort=()=>{a(),r(new oA)},this.responseCallback=i=>{sv.test(i)&&(a(),this.logger.info("RX: "+i.trim()),e(i))},this.logger.info("TX: "+x),this.transport.write(this.encodeCommand(x)).catch(i=>{a(),r(i)})})}executeQueryConfig(x,A,e){return new Promise((r,t)=>{if(this.isDisposed){t(new oA);return}if(e?.aborted){t(new Error(Ur));return}this.bufferState.buffer="";let a={cleanup:()=>{}},i=setTimeout(()=>{a.cleanup(),this.logger.error(`Timeout waiting for ${A} server config`),t(new Error(`Timeout waiting for ${A} response \u2014 server configuration not available`))},fA),l=()=>{a.cleanup(),t(new Error(Ur))};a.cleanup=this.makeCleanup(i,e,l),e&&e.addEventListener("abort",l);let c=new RegExp(`\\${A}:\\s*<?([^,>\\s]+)>?`);this.activeAbort=()=>{a.cleanup(),t(new oA)},this.responseCallback=u=>{let b=u.match(c);if(b){a.cleanup();let m=b[1].trim();this.logger.info(`Server config ${A}: ${m}`),r(m);return}u.length>500&&(this.bufferState.buffer=this.bufferState.buffer.slice(-250))},this.logger.info("TX: "+x),this.transport.write(this.encodeCommand(x)).catch(u=>{a.cleanup(),this.logger.error(`Failed to send ${A} command: `+(u instanceof Error?u.message:String(u))),t(u)})})}async sendAndWait(x,A,e=fA,r){return this.withAtLock(t=>t.sendAndWait(x,A,e,r))}async sendRaw(x,A=fA){return this.withAtLock(e=>e.sendRaw(x,A))}async queryMntServerConfig(x){return this.withAtLock(A=>A.queryMntServerConfig(x))}async queryMdnServerConfig(x){return this.withAtLock(A=>A.queryMdnServerConfig(x))}async initiateMntSync(x){return this.withAtLock(A=>A.initiateMntSync(x))}async initiateMdnSync(x){return this.withAtLock(A=>A.initiateMdnSync(x))}async sendCompanionCert(x,A){return this.withAtLock(e=>e.sendCompanionCert(x,A))}async executeInitiateMntSync(x){this.logger.info("Initiating MNT sync"),await this.executeSendAndWait(Hx.MNT_SYNC,nx.OK,fA,x)}async executeInitiateMdnSync(x){this.logger.info("Initiating MDN sync");try{await this.executeSendAndWait(Hx.MDN_SYNC,nx.OK,fA,x),await this.executeSendAndWait(null,nx.SYNC_START,fA,x)}catch(A){this.logger.error("Failed to initiate MDN sync: "+(A instanceof Error?A.message:String(A)))}}async executeSendCompanionCert(x,A){if(this.isDisposed)throw new oA;if(A?.aborted)throw new Error(Ur);let e=x.replace(/-/g,"+").replace(/_/g,"/")+"=".repeat((4-x.length%4)%4),r=e.length,t=await this.executeSendAndWait(`${Hx.COMPANION_CERT}=${r}`,nx.OK,fA,A),a=parseInt(t.match(/(\d+)/)[1],10),i=0;for(;i<r;){let l=Math.min(a,r-i),c=e.slice(i,i+l);await this.executeSendAndWait(`${Hx.COMPANION_CERT}=${l},${i},${c}`,nx.OK,fA,A),i+=l}return this.executeCompanionCertFinalize(r,A)}executeCompanionCertFinalize(x,A){return new Promise((e,r)=>{if(this.isDisposed){r(new oA);return}if(A?.aborted){r(new Error(Ur));return}this.bufferState.buffer="";let t={cleanup:()=>{}},a=setTimeout(()=>{t.cleanup(),r(new Error("Timeout waiting for AT+COMPCERT finalize response"))},fA),i=()=>{t.cleanup(),r(new Error(Ur))};t.cleanup=this.makeCleanup(a,A,i),A&&A.addEventListener("abort",i),this.activeAbort=()=>{t.cleanup(),r(new oA)},this.responseCallback=c=>{let u=c.match(nx.COMPCERT_ERROR);if(u){t.cleanup(),e({success:!1,errorCode:parseInt(u[1],10)});return}if(c.includes(nx.OK)){t.cleanup(),e({success:!0});return}c.length>500&&(this.bufferState.buffer=this.bufferState.buffer.slice(-250))};let l=`${Hx.COMPANION_CERT}=0,${x}`;this.logger.info("TX: "+l),this.transport.write(this.encodeCommand(l)).catch(c=>{t.cleanup(),r(c)})})}async queryCompanionCertSupport(x){return this.withAtLock(A=>A.queryCompanionCertSupport(x))}async executeQueryCompanionCertSupport(x){try{return await this.executeSendAndWait(Hx.COMPANION_CERT_TEST,nx.OK,fA,x),!0}catch(A){if(A instanceof oA)throw A;return!1}}async sendConnectionClose(x){return this.withAtLock(A=>A.sendConnectionClose(x))}async executeSendConnectionClose(x){try{await this.executeSendAndWait(Hx.CON_CLOSE,nx.CON_CLOSE,fA,x)}catch(A){this.logger.error("Failed to receive +CONCLOSE response: "+(A instanceof Error?A.message:String(A)))}}createConCloseMonitor(x){let A="",e=r=>{A+=r,A.includes(nx.CON_CLOSE)&&(A="",this.bufferState.closedByDevice=!0,x()),A.length>1e3&&(A=A.slice(-500))};return this.on("data",e),()=>{this.off("data",e)}}dispose(){this.isDisposed||(this.isDisposed=!0,this.activeAbort?.(),this.disposeTransportListener(),this.responseCallback=null,this.activeAbort=null,this.removeAllListeners())}},ov=(x=>(x[x.FORMAT=1]="FORMAT",x[x.SIGNATURE=2]="SIGNATURE",x[x.EXPIRED=3]="EXPIRED",x[x.NO_MDN_PUBKEY=4]="NO_MDN_PUBKEY",x[x.BUSY=5]="BUSY",x[x.INTERNAL=6]="INTERNAL",x))(ov||{}),lu=require("events"),Ds="requesting-cert",ps="cert-revoked",Fv=class Ms extends lu.EventEmitter{constructor(){super(...arguments),i0(this,"utoMaster",null)}async authenticate(A){let e=A.logger??Jn,{signal:r,atHandler:t}=A,a=()=>{if(r?.aborted)throw new Error("Operation aborted")};try{this.emitPhase("checking-cert"),a();let i=await this.loadOrGenerateKeypair(A.storage),l=await A.storage.getCertificate(A.apiConfig.apiHost);(l===null||!Hs(l.notAfter))&&(e.info("Companion cert missing or near expiry \u2014 requesting new cert"),this.emitPhase(Ds),a(),l=await this.requestAndStoreCert(i,A)),this.utoMaster=new _8(A.utoTransport,e,A.timeSource),this.emitPhase("cert-presenting"),a();let c=l;l=await t.withAtLock(async m=>{let g=await this.presentCertWithRefresh(m,c,i,A);return await m.initiateMdnSync(r),g}),this.emitPhase("ecs-handshake"),a(),await this.utoMaster.init();let u=await this.utoMaster.initiateEcsHandshake({companionPublicKey:i.publicKey,companionPrivateKey:i.privateKey,signal:r});if(!u.success)return this.fail("ecs-handshake",`ECS handshake failed (code ${u.resultCode})`);this.emitPhase("connected");let b=this.utoMaster;return this.utoMaster=null,{success:!0,utoMaster:b}}catch(i){return this.handleError(i)}}dispose(){this.utoMaster=null,this.removeAllListeners()}async loadOrGenerateKeypair(A){let e=await A.getKeypair();if(e!==null)return e;let r=await hs();return await A.saveKeypair(r),r}static async fetchCertOrThrowRevoked(A,e){try{return await C8(e.apiConfig,{publicKey:A.publicKey,subject:e.subject})}catch(r){throw r instanceof Ot&&(r.httpStatus===401||r.httpStatus===404)?(await e.storage.clearCertificate(e.apiConfig.apiHost),new bs(ps,`Companion cert revoked or session expired (HTTP ${r.httpStatus})`,{httpStatus:r.httpStatus,apiCode:r.code})):r}}async requestAndStoreCert(A,e){let r=await Ms.fetchCertOrThrowRevoked(A,e),t={base64Url:r.certificateBase64Url,notAfter:r.notAfter};return await e.storage.saveCertificate(t,e.apiConfig.apiHost),t}static async refreshCertificate(A){let e=await A.storage.getKeypair(),r=e!==null?e:await(async()=>{let i=await hs();return await A.storage.saveKeypair(i),i})(),t=await Ms.fetchCertOrThrowRevoked(r,A),a={base64Url:t.certificateBase64Url,notAfter:t.notAfter};return await A.storage.saveCertificate(a,A.apiConfig.apiHost),a}static async clearCredentials(A,e){await A.clearCertificate(e)}async presentCertWithRefresh(A,e,r,t){let a=await A.sendCompanionCert(e.base64Url,t.signal);if(a.success||a.errorCode===3&&((t.logger??Jn).info("Device reported EXPIRED \u2014 refreshing cert and retrying"),this.emitPhase(Ds),e=await this.requestAndStoreCert(r,t),a=await A.sendCompanionCert(e.base64Url,t.signal),a.success))return e;throw new bs("cert-presenting",`AT+COMPCERT rejected (code ${a.errorCode??"?"})`,{certErrorCode:a.errorCode})}emitPhase(A){this.emit("phase",A)}fail(A,e){return this.emit("phase","error"),{success:!1,phase:A,error:e}}handleError(A){return A instanceof bs?(this.emit("phase",A.phase===ps?ps:"error"),{success:!1,phase:A.phase,error:A.message,certErrorCode:A.certErrorCode,httpStatus:A.httpStatus,apiCode:A.apiCode}):(this.emit("phase","error"),A instanceof Ot?{success:!1,phase:Ds,error:A.message,httpStatus:A.httpStatus,apiCode:A.code}:{success:!1,phase:"error",error:A instanceof Error?A.message:String(A)})}};i0(Fv,"encodePublicKeyBase64Url",Us);var cu=Fv,bs=class extends Error{constructor(x,A,e={}){super(A),i0(this,"phase",x),i0(this,"extra",e),this.name="AuthError"}get certErrorCode(){return this.extra.certErrorCode}get httpStatus(){return this.extra.httpStatus}get apiCode(){return this.extra.apiCode}},vv=(x=>(x.CERT_FORMAT="cert_format",x.CERT_SIGNATURE="cert_signature",x.CERT_EXPIRED="cert_expired",x.NO_MDN_PUBKEY="no_mdn_pubkey",x.DEVICE_BUSY="device_busy",x.DEVICE_INTERNAL="device_internal",x.ECS_FAILURE="ecs_failure",x.CERT_REVOKED="cert_revoked",x.SESSION_EXPIRED="session_expired",x.ABORTED="aborted",x.UNKNOWN="unknown",x))(vv||{}),Eu={cert_format:"companion_auth.error.cert_format",cert_signature:"companion_auth.error.cert_signature",cert_expired:"companion_auth.error.cert_expired",no_mdn_pubkey:"companion_auth.error.no_mdn_pubkey",device_busy:"companion_auth.error.device_busy",device_internal:"companion_auth.error.device_internal",ecs_failure:"companion_auth.error.ecs_failure",cert_revoked:"companion_auth.error.cert_revoked",session_expired:"companion_auth.error.session_expired",aborted:"companion_auth.error.aborted",unknown:"companion_auth.error.unknown"};function Bu(x){if(x.certErrorCode!==void 0)switch(x.certErrorCode){case 1:return"cert_format";case 2:return"cert_signature";case 3:return"cert_expired";case 4:return"no_mdn_pubkey";case 5:return"device_busy";case 6:return"device_internal"}return x.phase==="cert-revoked"?x.httpStatus===401?"session_expired":"cert_revoked":x.phase==="ecs-handshake"?"ecs_failure":x.error==="Operation aborted"?"aborted":"unknown"}var Cu=require("events");function fv(x){let A=x.replace(/\r\nOK\r\n$/,"").trim();return A?A.split("\f").map(e=>{let r=e.split(" ");return r.length<4?null:{name:r[0],scale:parseFloat(r[1]),offset:parseFloat(r[2]),unit:r[3]}}).filter(e=>e!==null):[]}function lv(x){let A=x.replace(/^\+[^\r\n]*\r\n/gm,"").replace(/\r\nOK\r\n$/,"").trim();return A?A.split("\f"):[]}function cv(x,A,e){let r=parseFloat(x);return isNaN(r)?x:parseFloat(Number(r*A+e).toFixed(3)).toString()}function Rs(x,A){return x.map((e,r)=>({name:e.name,displayValue:cv(A[r]??"",e.scale,e.offset),unit:e.unit}))}var du=2e3,Ev=class extends Cu.EventEmitter{constructor(x,A=he){super(),i0(this,"atHandler",x),i0(this,"logger",A),i0(this,"datapoints",[]),i0(this,"values",[]),i0(this,"polling",!1),i0(this,"pollTimer",null),i0(this,"fetchInProgress",!1),i0(this,"fetchPromise",null)}async checkSupport(){this.logger.info("Checking local data support");let x=await this.atHandler.sendRaw(Hx.APP_GET_METADATA),A=x.includes(nx.OK)?{supported:!0,pinRequired:!1}:x.includes(nx.ERROR_PIN_REQUIRED)?{supported:!0,pinRequired:!0}:x.includes(nx.ERROR_NO_DATA)?{supported:!1,pinRequired:!1}:x.includes(nx.ERROR)?{supported:!1,pinRequired:!1}:{supported:!1,pinRequired:!1};return this.logger.info("Local data support: "+JSON.stringify(A)),A}async fetchMetadata(x){this.logger.info("Fetching metadata"+(x?" (with PIN)":""));let A=x?`${Hx.APP_GET_METADATA}=${x}`:Hx.APP_GET_METADATA,e=await this.atHandler.sendRaw(A);if(this.logger.debug("Metadata response: "+e),e.includes(nx.ERROR_PIN_REQUIRED))return this.logger.warn("PIN required/invalid for metadata"),null;if(e.includes(nx.ERROR_NO_DATA))return this.logger.warn("No data available from device"),this.datapoints=[],this.values=[],this.emit("metadata",[]),this.emit("error","No local data available from device"),[];if(e.includes(nx.OK)){let r=fv(e);return this.logger.info("Parsed "+r.length+" datapoints"),this.datapoints=r,this.values=new Array(r.length).fill(""),this.emit("metadata",r),r}return e.includes(nx.ERROR)?(this.logger.error("Metadata fetch error: "+e),this.emit("error","Device returned error during metadata fetch"),[]):[]}async fetchValues(x){return this.readValues(A=>this.atHandler.sendRaw(A),x)}async readValues(x,A){try{this.logger.debug("Fetching values");let e=A?`${Hx.APP_GET_DATAVALUE}=${A}`:Hx.APP_GET_DATAVALUE,r=await x(e);if(r.includes(nx.OK)){let t=lv(r);return this.logger.debug("Values: "+t.join(", ")),this.values=t,this.emit("values",t),this.emit("displayValues",Rs(this.datapoints,t)),t}return[]}catch(e){return this.logger.warn("Value fetch error: "+(e instanceof Error?e.message:String(e))),[]}}async checkMeasurementTriggerSupport(){this.logger.info("Checking measurement trigger support");try{let A=(await this.atHandler.sendRaw(Hx.APP_TRIG_MEASURE_TEST)).includes(nx.OK);return this.logger.info("Measurement trigger support: "+A),A}catch(x){if(x instanceof oA)throw x;return this.logger.warn("Measurement trigger probe failed: "+(x instanceof Error?x.message:String(x))),!1}}async triggerMeasurement(x={}){let{pin:A,timeoutMs:e=iv,signal:r}=x;return this.logger.info("Triggering measurement"),this.atHandler.withAtLock(async t=>{let a=await t.sendRaw(Hx.APP_TRIG_MEASURE);if(this.logger.debug("Trigger measurement response: "+a),!a.includes(nx.OK))return this.logger.warn("Measurement trigger rejected: "+a.trim()),{outcome:"rejected",values:[],response:a};this.emit("measurementTriggered");try{let i=await t.sendAndWait(null,nx.MEASURED,e,r);return this.emit("measurementCompleted"),{outcome:"measured",values:await this.readValues(c=>t.sendRaw(c),A),response:i}}catch(i){if(i instanceof oA)throw i;let l="timeout";return i instanceof aa?l="error":r?.aborted&&(l="aborted"),this.logger.warn(`Measurement ${l} while waiting for ${nx.MEASURED}: `+(i instanceof Error?i.message:String(i))),this.emit("measurementFailed",l),{outcome:l,values:[],response:a}}})}async startPolling(x,A=du){if(this.polling){this.logger.warn("Polling already active \u2014 ignoring startPolling call");return}this.logger.info("Starting polling every "+A+" ms"),this.polling=!0,this.fetchInProgress=!1,this.emit("pollingStarted"),this.fetchPromise=this.fetchValues(x),await this.fetchPromise,this.fetchPromise=null,this.polling&&(this.pollTimer=setInterval(()=>{this.fetchInProgress||(this.fetchInProgress=!0,this.fetchPromise=this.fetchValues(x).finally(()=>{this.fetchInProgress=!1,this.fetchPromise=null}))},A))}async stopPolling(){this.pollTimer&&(clearInterval(this.pollTimer),this.pollTimer=null),this.polling&&(this.logger.info("Polling stopped"),this.polling=!1,this.emit("pollingStopped")),this.fetchPromise&&await this.fetchPromise}getSnapshot(){return{datapoints:[...this.datapoints],values:[...this.values],isPolling:this.polling}}getDisplayValues(){return Rs(this.datapoints,this.values)}dispose(){this.stopPolling(),this.datapoints=[],this.values=[],this.removeAllListeners()}};async function uu(x,A,e){let r=a=>{if(a instanceof oA)throw a},t=new Ev(x);try{let a=await x.queryMdnServerConfig(e).catch(m=>(r(m),!1)),i=await t.checkSupport().catch(m=>(r(m),{supported:!1,pinRequired:!1})),l=i.supported?await t.checkMeasurementTriggerSupport().catch(m=>(r(m),!1)):!1,c=i.supported?{pinRequired:i.pinRequired,canTriggerMeasurement:l}:!1,u=!1,b=!1;if(a){let[m,g]=await Promise.all([x.queryCompanionCertSupport(e).catch(q=>(r(q),!1)),A?.getCertificate(a)]);u=m,b=g!=null&&Hs(g.notAfter)}return{hostname:a,localData:c,secureConnection:u,validCert:b}}finally{t.dispose()}}var Du=require("events"),pu={0:"trigger",1:"wakeup",2:"online"},bu={0:["2G","","GSM"],1:["2G","Compact","GSM-COMPACT"],2:["3G","","UTRAN"],3:["2G","EDGE","GSM-EGPRS"],4:["3G","HSDPA","UTRAN-HSDPA"],5:["3G","HSUPA","UTRAN-HSUPA"],6:["3G","HSPA+","UTRAN-HSXPA"],7:["4G","","EUTRAN"],8:["4G","LTE-M","LTE-CATM1"],9:["4G","NB-IoT","LTE-CATNB1"],100:["WiFi","","WIFI"],101:["LAN","Ethernet","ETHERNET"],102:["Local","Wireless","WIRELESS"],103:["Local","Wired","WIRED"]},mu={"NO SCRIPT":"none","SCRIPT ERROR":"error","SCRIPT OK":"ok"},Yx={FAILED:1,ACTIVE:2,STARTED:4,RETRY:8,WAKEUPABLE:16,EXTSIM:32,DISABLED:64,WAKEUP:256,POSUPDATE_ACTIVE:512},ju=Yx.FAILED|Yx.ACTIVE|Yx.STARTED|Yx.RETRY|Yx.WAKEUPABLE|Yx.EXTSIM|Yx.DISABLED|Yx.WAKEUP|Yx.POSUPDATE_ACTIVE,ZF=`${nx.RM2M_STATE}: `;function Bv(x=0){let A=(x&Yx.WAKEUPABLE)!==0,e="offline",r=A;return x&Yx.POSUPDATE_ACTIVE?(e="locating",r=!1):x&Yx.RETRY?(e="retry",r=!1):x&Yx.STARTED?(e="dialing",r=!1):x&Yx.ACTIVE?(e="active",r=!1):x&Yx.FAILED?(e="failed",r=A):x&Yx.DISABLED&&(e="disabled",r=!1),{signal:e,simType:(x&Yx.EXTSIM)!==0?"external":"internal",wakeupable:r,unknownFlags:x&~ju}}function hu(x){if(x===void 0)return null;let A=parseInt(x,10);return isNaN(A)?x:pu[A]??x}function gu(x){if(x===void 0)return null;let A=parseInt(x,10);return isNaN(A)?null:bu[A]??["unknown",`itf#${x}`,`itf#${x}`]}function ku(x){if(x.length===0)return null;let A=x.join(",");return mu[A]??A}function Cv(x){let A=x.split(","),[e,r,t,a,...i]=A;if(!e||!/^-?\d+$/.test(e)||!r||!/^\d+$/.test(r))return null;let l=parseInt(r,10),c=gu(a),u=a!==void 0?parseInt(a,10):NaN;return{stamp:new Date,rssi:u>=101?null:parseInt(e,10),state:l,uplinkState:Bv(l),uplinkMode:hu(t),uplinkInterface:c?c[0]:null,uplinkInterfaceExtended:c?c[1]:null,uplinkInterfaceTechnical:c?c[2]:null,scriptState:ku(i)}}function dv(x){let A=x.indexOf(ZF);if(A===-1)return null;let e=x.substring(A+ZF.length),r=e.search(/\r?\n/);if(r===-1)return null;let t=e.substring(0,r).trim();return t?Cv(t):null}var yu=5e3,_u=class extends Du.EventEmitter{constructor(x,A=Jn){super(),i0(this,"atHandler"),i0(this,"logger"),i0(this,"lastState",null),i0(this,"pollingTimer",null),i0(this,"polling",!1),i0(this,"fetchInProgress",!1),i0(this,"fetchPromise",null),this.atHandler=x,this.logger=A}async fetchState(){try{let x=await this.atHandler.sendRaw(Hx.RM2M_STATE),A=dv(x);return A?(this.lastState=A,this.emit("state",A),this.logger.debug("RM2M state fetched successfully")):this.logger.warn("Failed to parse RM2M state response"),A}catch(x){let A=x instanceof Error?x.message:String(x);return this.logger.error(`Failed to fetch RM2M state: ${A}`),this.emit("error",A),null}}startPolling(x=yu){if(this.polling){this.logger.debug("Polling already active, ignoring startPolling call");return}this.logger.info(`Starting RM2M state polling every ${x}ms`),this.polling=!0,this.fetchInProgress=!1,this.emit("pollingStarted"),this.runGuardedFetch(),this.pollingTimer=setInterval(()=>this.runGuardedFetch(),x)}runGuardedFetch(){this.fetchInProgress||(this.fetchInProgress=!0,this.fetchPromise=this.fetchState().finally(()=>{this.fetchInProgress=!1,this.fetchPromise=null}))}async stopPolling(){this.pollingTimer&&(clearInterval(this.pollingTimer),this.pollingTimer=null),this.polling&&(this.logger.info("RM2M state polling stopped"),this.polling=!1,this.emit("pollingStopped")),this.fetchPromise&&await this.fetchPromise}getLastState(){return this.lastState?{...this.lastState,uplinkState:{...this.lastState.uplinkState}}:null}get isPolling(){return this.polling}dispose(){this.stopPolling(),this.lastState=null,this.removeAllListeners()}},wu=require("events"),uv=class extends wu.EventEmitter{constructor(){super(...arguments),i0(this,"serialNumber",""),i0(this,"serverUrl",""),i0(this,"deviceId",""),i0(this,"rssi",null),i0(this,"hasDebugSupport",!1),i0(this,"connectionState","disconnected"),i0(this,"connectionError",""),i0(this,"mtuSize",23)}get isConnected(){return this.connectionState==="connected"}setConnected(x){this.serialNumber=x.serialNumber,this.deviceId=x.deviceId,this.serverUrl=x.serverUrl??this.serverUrl,this.hasDebugSupport=x.hasDebugSupport??!1,this.mtuSize=x.mtuSize??23,this.rssi=x.rssi??null,this.connectionState="connected",this.connectionError="",this.emit("connected",this.snapshot()),this.emit("stateChange",this.snapshot())}setDisconnected(){this.connectionState="disconnected",this.rssi=null,this.emit("disconnected"),this.emit("stateChange",this.snapshot())}setError(x){this.connectionError=x,this.connectionState="disconnected",this.emit("error",x),this.emit("stateChange",this.snapshot())}setConnectionState(x){this.connectionState=x,this.emit("stateChange",this.snapshot())}updateRssi(x){this.rssi=x,this.emit("rssiUpdate",x)}reset(){this.serialNumber="",this.serverUrl="",this.deviceId="",this.rssi=null,this.hasDebugSupport=!1,this.connectionState="disconnected",this.connectionError="",this.mtuSize=23,this.emit("reset"),this.emit("stateChange",this.snapshot())}snapshot(){return{serialNumber:this.serialNumber,serverUrl:this.serverUrl,deviceId:this.deviceId,rssi:this.rssi,hasDebugSupport:this.hasDebugSupport,connectionState:this.connectionState,connectionError:this.connectionError,mtuSize:this.mtuSize,isConnected:this.isConnected}}},Su=require("events"),Dv={maxDuration:6e4,initialDelay:1e3,maxDelay:1e4,maxGattRetries:3},qu=class extends Su.EventEmitter{constructor(x=he,A){super(),i0(this,"logger",x),i0(this,"state"),i0(this,"transports",null),i0(this,"transportFactory",null),i0(this,"disconnectFn",null),i0(this,"reconnectOptions"),i0(this,"reconnectAbortController",null),this.state=new uv,this.reconnectOptions={...Dv,...A}}async connect(x,A,e){this.transportFactory=x,this.disconnectFn=A,this.state.setConnectionState("connecting");try{return this.transports=await x(),this.state.setConnected(e),this.logger.info(`Connected to device ${e.serialNumber}`),this.transports}catch(r){let t=r instanceof Error?r.message:String(r);throw this.state.setError(t),this.logger.error(`Connection failed: ${t}`),r}}async disconnect(){if(this.stopReconnect(),this.disconnectFn)try{await this.disconnectFn()}catch(x){this.logger.warn(`Disconnect error: ${x}`)}this.transports=null,this.state.setDisconnected(),this.logger.info("Disconnected from device")}async reconnect(){if(!this.transportFactory||!this.disconnectFn)return this.logger.error("Cannot reconnect: no transport factory"),!1;this.state.setConnectionState("reconnecting"),this.reconnectAbortController=new AbortController;let{signal:x}=this.reconnectAbortController,A=Date.now(),e=this.reconnectOptions.initialDelay;for(;Date.now()-A<this.reconnectOptions.maxDuration;){if(x.aborted||(this.logger.info(`Reconnecting in ${e}ms...`),await this.sleep(e,x),x.aborted))return!1;try{return this.transports=await this.transportFactory(),this.state.setConnectionState("connected"),this.state.connectionError="",this.logger.info("Reconnected successfully"),this.emit("reconnected"),!0}catch(r){this.logger.warn(`Reconnect attempt failed: ${r}`),e=Math.min(e*2,this.reconnectOptions.maxDelay)}}return this.state.setError("Reconnect timeout exceeded"),this.logger.error("Reconnect failed: timeout exceeded"),this.emit("reconnectFailed"),!1}stopReconnect(){this.reconnectAbortController?.abort(),this.reconnectAbortController=null}getTransports(){return this.transports}sleep(x,A){return new Promise(e=>{let r=setTimeout(e,x);A?.addEventListener("abort",()=>{clearTimeout(r),e()},{once:!0})})}},Tu={configurationNumber:1,utoInterface:0,utoEndpoint:1,utoSize:64*1024,debugInterface:1,debugEndpoint:2,debugSize:1024},Pu={service:"BC300000-0FA0-4ED4-860A-CF95434B5A4E",txCharacteristic:"BC30E1FF-0FA0-4ED4-860A-CF95434B5A4E",rxCharacteristic:"BC30E1FE-0FA0-4ED4-860A-CF95434B5A4E",txDebugCharacteristic:"BC30E201-0FA0-4ED4-860A-CF95434B5A4E",rxDebugCharacteristic:"BC30E200-0FA0-4ED4-860A-CF95434B5A4E"},$u=590,Nu=3e4,R0=class extends Error{constructor(x){super(x),this.name="ApiBadRequestError"}},PA=class extends Error{constructor(x){super(x),this.name="ApiNotFoundError"}},ri=class extends Error{constructor(x){super(x),this.name="ApiForbiddenError"}},oa=class extends Error{constructor(x){super(x),this.name="ApiMethodNotAllowedError"}};function $A(x){try{return decodeURIComponent(x)}catch{throw new R0("malformed url encoding")}}var Iu=2e3,Mu=2136;function Fa(x){if(x.length===0)return!0;if(!/^\d{4,17}$/.test(x))return!1;let A=Number(x.slice(0,4));return A>=Iu&&A<=Mu}function mt(x){if(x)for(let A of["stamp","from","until"]){let e=x[A];if(typeof e=="string"&&!(A==="until"&&e==="*")&&!(A!=="stamp"&&e.trim().length===0)&&!Fa(e))throw new R0(`attribute '${A}' is not valid`)}}function Ru(x){return typeof x.setMetadataValue=="function"?x:null}function Lu(x){return typeof x.insertUtoChangeRequests=="function"?x:null}function va(){return{lastIssuedStamp40:0,tagMutexTails:new Map}}async function Ou(x){return{status:200,body:x.ctx.siteInfo}}async function Gu(x){let{blueprint:A}=x.ctx;if(!A)throw new PA("blueprint unavailable");return{status:200,body:A}}async function Uu(x){let{me:A}=x.ctx;if(A==null)throw new PA("no profile stored");return{status:200,body:A}}function pv(x,A,e,r){let t=x.push;t&&(async()=>{try{await t.container(A,e,r)}catch(a){x.logger?.error(`[localApi] device push for tag ${A} failed:`,a)}})()}async function Hu(x,A,e){let r=x.push;if(!r)return null;try{return await r.adHocChangeRequest(A,e)}catch(t){return x.logger?.error(`[localApi] change request for tag ${A} failed:`,t),null}}var Ju=1024;function Wt(x){let A=x.indexOf(0),e=A<0?x:x.subarray(0,A);try{let r=new TextDecoder("utf-8").decode(e),t=JSON.parse(r);return typeof t!="object"||t===null||Array.isArray(t)?null:t}catch{return null}}function bv(x,A=0){let e=new TextEncoder().encode(x),r=Math.max(Ju,A,e.length+1),t=new Uint8Array(r);return t.set(e,0),t}var fa=26432,Wr={aberrant:1,service:2,standby:4,commissioned:8,offline:16,commissioning:65536,online:131072},mv=Object.keys(Wr),Xt=["standby","commissioned","offline","commissioning","online"],Ls=Xt.reduce((x,A)=>x|Wr[A],0)>>>0;function jv(x){let A=0;for(let e of mv)x[e]===!0&&(A|=Wr[e]);return A>>>0}function la(x,A){let e={};for(let r of mv)x&Wr[r]?e[r]=!0:typeof A?.[r]=="boolean"&&(e[r]=!1);return e}async function hv(x,A){let e=A.device;if(!e)return!1;let r=await x.getRowForTag(fa);if(!r?.data)return!1;let t=Wt(r.data);if(!t)return!1;let a=!1;if(typeof t.lifecycleFlags=="number"){let i=la(t.lifecycleFlags,e.lifecycle_flags);JSON.stringify(e.lifecycle_flags)!==JSON.stringify(i)&&(e.lifecycle_flags=i,a=!0)}return typeof t.lifecycleState=="string"&&e.lifecycle_state!==t.lifecycleState&&(e.lifecycle_state=t.lifecycleState,a=!0),a}var Ku=new Set([...Xt,"service","lifecycle_state"]);function zu(x,A){let e=Math.max(ix.msToStamp40((x.timeSource??zt).nowMs()),A.lastIssuedStamp40+1);return A.lastIssuedStamp40=e+1,e}async function Vu(x){let A=Qu(x.request.body??null);if(!A)throw new R0("invalid or missing request body");Wu(A);let e=x.ctx,r=e.siteInfo.lifecycle_flags;if(!Yu(r))throw new R0("this site does not support lifecycle flags!");let t=jv(r),a=t;for(let u of Xt){let b=A[u];typeof b=="boolean"&&(a=b?a|Wr[u]:a&~Wr[u])}if(a>>>=0,a===t)return{status:204,body:""};let i=zu(e,x.session),l=[{json:JSON.stringify({lifecycleFlags:{op:"&",val:~Ls>>>0}}),stamp40:i},{json:JSON.stringify({lifecycleFlags:{op:"|",val:a&Ls}}),stamp40:i+1}],c=Lu(e.storage);return c&&await c.insertUtoChangeRequests(l.map(u=>({tag:fa,stamp40:u.stamp40,json:u.json}))),e.siteInfo.lifecycle_flags=la(a,r),await gv(e),Xu(e,l),{status:204,body:""}}function Wu(x){let A=[];for(let[e,r]of Object.entries(x))Ku.has(e)?(e==="lifecycle_state"?typeof r!="string":typeof r!="boolean")&&A.push(`"${e}" is not valid`):A.push(`"${e}" is not an allowed lifecycle property`);if(A.length>0)throw new R0(`validation errors: ${A.join(", ")}`);if(Object.keys(x).some(e=>!Xt.includes(e)))throw new R0("invalid parameters")}async function Xu(x,A){try{let e=await Hu(x,fa,A);e==="executed"?await hv(x.storage,x.siteInfo)&&await gv(x):e!==null&&x.logger?.warn(`[localApi] lifecycle change request not applied by the device (outcome=${e})`)}catch(e){x.logger?.error("[localApi] lifecycle device-mirror refresh failed:",e)}}async function gv(x){await Ru(x.storage)?.setMetadataValue("site_info",JSON.stringify(x.siteInfo))}function Yu(x){return typeof x=="object"&&x!==null&&!Array.isArray(x)}function Qu(x){if(!x)return null;let A;try{A=JSON.parse(x)}catch{return null}return typeof A!="object"||A===null||Array.isArray(A)?null:A}function kv(x){if(x!=null){if(Array.isArray(x)&&x.every(A=>typeof A=="string"))return x;throw new R0('"select" must be an array')}}function Zu(x){if(x!=null){if(Array.isArray(x)&&x.every(A=>typeof A=="string"))return x;throw new R0("invalid parameter, select must be an array")}}function xD(x,A){let e=new Map;if(A){for(let[r,t]of A)e.set(t,r);return e}for(let r of x?.fields??[]){if(Le(r))continue;let t=r.alias??r.name;e.set(t,t.toLowerCase())}return e}function AD(x){let A=new Map;for(let e of x.fields){if(Le(e))continue;let r=(e.alias??e.name).toLowerCase();A.set(e.name,r),e.alias&&A.set(e.alias,r)}return A}function eD(x){let A=new Set;for(let e of x.fields)Le(e)||A.add((e.alias??e.name).toLowerCase());return A.add("stamp"),A}function rD(x,A,e){if(!e)return null;let r=xD(x,A),t=new Set,a=[];for(let i of e){if(i==="stamp")continue;let l=r.get(i);l?t.add(l):a.push(i)}if(a.length>0)throw yv(a);return t}function tD(x,A){let e=AD(x),r=[],t=[],a=!1;for(let i of A){if(i==="stamp"){a=!0,r.push("stamp");continue}let l=e.get(i);l?r.push(l):t.push(i)}if(t.length>0)throw yv(t);return a||r.unshift("stamp"),r}function nD(x,A){if(A===void 0)return;let e=eD(x),r=A.map(a=>a.toLowerCase()),t=r.filter(a=>!e.has(a));if(t.length>0)throw new R0(`unknown field name(s): ${t.join(",")}`);return r.includes("stamp")?r:["stamp",...r]}function iD(x,A){if(!A)return x;let e={};for(let[r,t]of Object.entries(x))(r==="stamp"||A.has(r))&&(e[r]=t);return e}function ca(x,A){if(!A)return x;let e={};for(let r of A)e[r]=r in x?x[r]:null;return e}function yv(x){return new R0(`Fields [\`${x.join("`, `")}\`] do not exist in this container`)}function ti(x,A){return x.containers.find(e=>e.name===A||e.alias===A)??null}async function sD(x){let A=x.ctx,e=$A(x.params[1]),r=ti(A.model,e);if(!r)throw new R0("container does not exist");let t=await A.mapper.readContainer(e);if(!t)throw new PA(`no data for container "${e}"`);let a=oD(A,r,t,aD(x));return{status:200,body:_v(A,e,a)}}function aD(x){let A=x.query.json??{};return kv(A.select)}function oD(x,A,e,r){let t=rD(A,Vt(x.blueprint??null,A),r);return iD(e,t)}function _v(x,A,e){let r=x.model.byNameOrAlias(A);return r?Z8(e,Vt(x.blueprint??null,r)):e}async function FD(x){let A=x.ctx,e=$A(x.params[1]),r=A.model.byNameOrAlias(e);if(!r)throw new PA(`unknown container "${e}"`);let t=await A.mapper.readContainer(e);if(!t)throw new PA(`unknown container "${e}"`);let a=x.query.json??{},i=Zu(a.select),l=nD(r,i);return{status:200,body:ca(t,l)}}async function vD(x){let A=$A(x.params[1]);return wv(x,A,"canonical")}async function fD(x){let A=$A(x.params[1]);if(!x.ctx.model.byNameOrAlias(A))throw new PA(`unknown container "${A}"`);return wv(x,A,"legacy")}async function wv(x,A,e){let r=dD(x);if(!r)throw new R0("invalid or missing request body");mt(r);let{stamp:t,...a}=r;if(e==="canonical"&&t!==void 0&&typeof t!="string")throw new R0("value(s) of field(s) stamp are not valid");let i=x.ctx;if(e==="canonical"&&!ti(i.model,A))throw new R0("container does not exist");let l=i.model.byNameOrAlias(A);if(l?.kind==="histdata")throw new PA(`unknown container "${A}"`);let c=e==="canonical"?ED(i,l,a):BD(l,a);try{let u=e==="canonical"&&t!==void 0?{...c,stamp:t}:c,b=await i.mapper.writeContainer(A,u);return b.devicePushable&&pv(i,b.tag,b.data,b.stamp40),{status:204,body:""}}catch(u){throw lD(u,A,e,i,l)}}function lD(x,A,e,r,t){if(x instanceof Ht){let a=x.field?cD(r,t,x.field,e):void 0;return e==="canonical"?a?new R0(`no permission to modify container field \`${a}\``):new R0(`no permission to modify container \`${A}\``):a?new ri(`unknown field name(s): ${a}`):new oa(`no permission to modify '${A}'`)}return x}function cD(x,A,e,r){if(!A)return e;let t=A.fields.find(i=>i.name===e||i.name.toLowerCase()===e||(i.alias??i.name).toLowerCase()===e);return t?r==="legacy"?(t.alias??t.name).toLowerCase():Vt(x.blueprint??null,A)?.get(e)??t.alias??t.name:e}function ED(x,A,e){if(!A)return e;let r=Vt(x.blueprint??null,A),t=new Map;if(r)for(let[a,i]of r)t.set(i,a);else for(let a of A.fields){let i=a.alias??a.name;t.set(i,i.toLowerCase()),t.set(i.toLowerCase(),i.toLowerCase())}return Sv(A,t,e,a=>new R0(`unknown field name(s): ${a}`))}function BD(x,A){if(!x)return A;let e=new Map;for(let r of x.fields){let t=r.alias??r.name;e.set(t.toLowerCase(),t.toLowerCase()),e.set(t,t.toLowerCase())}return Sv(x,e,A,r=>new ri(`unknown field name(s): ${r}`))}var CD=new Set(["stamp","stamp4","stamp8","datetime"]);function Sv(x,A,e,r){let t=new Map(x.fields.map(c=>[(c.alias??c.name).toLowerCase(),c])),a={},i=[],l=[];for(let[c,u]of Object.entries(e)){let b=A.get(c);if(!b){i.push(c);continue}let m=t.get(b);if(m&&CD.has(m.type)&&!(typeof u=="string"&&Fa(u))){l.push(c);continue}a[b]=u}if(i.length>0)throw r(i.join(","));if(l.length>0)throw new R0(`value(s) of field(s) ${l.join(",")} are not valid`);return a}function dD(x){let A=x.query.json,e=A!=null&&typeof A=="object"&&!Array.isArray(A)?A:void 0,r=x.request.body;if(!r)return e?{...e}:null;let t=uD(r);if(t===void 0)throw new R0("request supplied data which is not json formatted");return typeof t!="object"||t===null||Array.isArray(t)?null:{...e,...t}}function uD(x){try{return JSON.parse(x)}catch{return}}var qv="x-mt-backfill",Tv="pending";async function Ea(x,A,e){let r=x.push?.backfill;if(!(!r||A===void 0||A===null||e===null))try{return await r.call(x.push,{fromMs:e})==="pending"?{[qv]:Tv}:void 0}catch(t){x.logger?.error("[localApi] historic backfill check failed:",t);return}}var DD=1e3,Mn=1e3,Pv="20000101",$v="*";async function pD(x){let A=x.query.json??{};Ov(A,["from","until","count","offset","select"]),mt(A);let e=x.ctx,r=$A(x.params[1]),{mapperSelect:t,order:a}=Iv(e,r,A.select);Mv(e,r);let i=Qn(A.from,Pv,"from"),l=Qn(A.until,$v,"until");Rv(i,l),l!==null&&(l=mD(l));let c=jD(A.count),u=Lv(A.offset),b=await Ea(e,A.from,i);return{status:200,body:(await e.mapper.readTimeseries(r,{fromMs:i,untilMs:l,count:c,offset:u,select:t})).map(g=>Nv(x,e,r,ca(g,a))),headers:b}}async function bD(x){let A=x.query.json??{};Ov(A,["from","until","offset","select"]),mt(A);let e=x.ctx,r=$A(x.params[1]),t=x.params[2],{mapperSelect:a,order:i}=Iv(e,r,A.select);Mv(e,r);let l=Qn(A.from,Pv,"from"),c=Qn(A.until,$v,"until");Rv(l,c);let u=Lv(A.offset),b=await Ea(e,A.from,l),g=(await e.mapper.readTimeseries(r,{fromMs:l,untilMs:c,count:t==="youngest"?-1:1,offset:u,select:a}))[0];return g?{status:200,body:Nv(x,e,r,ca(g,i)),headers:b}:{status:204,body:JSON.stringify("no timeseries recordData found"),headers:b}}function Nv(x,A,e,r){return x.apiVersion==="1"?r:_v(A,e,r)}function Iv(x,A,e){let r=kv(e);if(!r)return{mapperSelect:void 0,order:null};let t=ti(x.model,A);if(!t)return{mapperSelect:r,order:null};let a=tD(t,r),i=a.filter(l=>l!=="stamp");return{mapperSelect:i.length>0?i:void 0,order:a}}function Mv(x,A){if(!ti(x.model,A))throw new R0("timeseries does not exist")}function Qn(x,A,e){let t=x==null||typeof x=="string"&&x.trim()===""?A:String(x);if(t==="*")return null;try{return bt(t)}catch{throw new R0(`attribute '${e}' is not valid`)}}function Rv(x,A){if(x!==null&&A!==null&&x>A)throw new R0('E_BAD_REQUEST "from" value must be older than "until"')}function mD(x){let A=ix.msToStamp40(x);return ix.stamp40ToMS(A)>=x&&(A-=1),ix.stamp40ToMS(A)}function jD(x){if(x==null||x==="")return DD;let A=Number(x);if(!Number.isInteger(A))throw new R0('"count" must be an integer');if(A===0)throw new R0("`count` cannot be 0");if(A<-Mn)throw new R0(`"count" must be greater than or equal to -${Mn}`);if(A>Mn)throw new R0(`"count" must be less than or equal to ${Mn}`);return A}function Lv(x){if(x==null||x==="")return 0;let A=Number(x);if(!Number.isInteger(A))throw new R0('"offset" must be an integer');if(A<0)throw new R0('"offset" must be greater than or equal to 0');return A}function Ov(x,A){for(let e of Object.keys(x))if(!A.includes(e))throw new R0(`"${e}" is not allowed`)}var hD=1e5,gD="20000101",kD="*";async function yD(x){let e=`histdata${x.params[1]?Number(x.params[1]):0}`,r=x.ctx,t=r.model.byNameOrAlias(e);if(!t)throw new PA(`unknown container "${e}"`);let a=x.query.json??{};mt(a);let{fromMs:i,untilMs:l}=SD(a);qD(i,l);let c=TD(a),u=PD(a),b=Gv(t,a.select)??["stamp"],m=Zn(a.from)?await Ea(r,a.from,i):void 0,g=b.filter($=>$!=="stamp");return{status:200,body:(await r.mapper.readTimeseries(e,{fromMs:i,untilMs:l,count:c,offset:u,select:g.length>0?g:void 0})).map($=>b.map(T=>T==="stamp"?$.stamp:$[T]??null)),headers:m}}async function _D(x){let e=`histdata${x.params[1]?Number(x.params[1]):0}`,r=x.params[2],t=x.ctx,a=t.model.byNameOrAlias(e);if(!a)throw new PA(`unknown container "${e}"`);let i=x.query.json??{};mt(i);let l=Gv(a,i.select)??["stamp"],c=wD(i),u=l.filter(g=>g!=="stamp"),m=(await t.mapper.readTimeseries(e,{fromMs:null,untilMs:c??null,count:c!==void 0||r==="youngest"?-1:1,select:u.length>0?u:void 0}))[0];return m?{status:200,body:[l.map(g=>g==="stamp"?m.stamp:m[g]??null)]}:{status:200,body:[]}}function wD(x){if(!(!Zn(x.until)||x.until==="*"))try{return bt(String(x.until))??void 0}catch{throw new R0("from or until value invalid")}}function SD(x){let A=Zn(x.from),e=Zn(x.until);if((!A||!e)&&!Ba(x.count))throw new R0("missing or invalid parameters (from and until and/or count)");return{fromMs:x8(A?x.from:gD),untilMs:x8(e?x.until:kD)}}function qD(x,A){if(x!==null&&A!==null&&x>A)throw new R0('"from" value must be older than "until"')}function x8(x){let A=String(x);try{return bt(A)}catch{throw new R0(`invalid stamp "${A}"`)}}function TD(x){if(!Ba(x.count))return hD;if(typeof x.count!="number")throw new R0("invalid parameter count");return x.count}function PD(x){let A=x.offset;if(A==null||A==="")return 0;if(typeof A!="number"||A<0)throw new R0("invalid parameter offset");return A}function Gv(x,A){if(A==null)return;if(!Array.isArray(A))throw new R0("invalid parameter, select must be an array");let e=A.map(l=>String(l).toLowerCase()),r=e.filter(l=>l.includes(" "));if(r.length>0)throw new R0(`aggregation suffix not allowed: ${r.join(",")}`);let t=e.includes("stamp")?e:["stamp",...e],a=new Set(x.fields.filter(l=>!Le(l)).map(l=>(l.alias??l.name).toLowerCase()));a.add("stamp");let i=t.filter(l=>!a.has(l));if(i.length>0)throw new R0(`invalid channel(s) ${i.join(",")}`);return t}function Ba(x){return!!x}function Zn(x){return typeof x=="string"?x.trim().length>0:Ba(x)}var $D="device_id";function ND(x){return async A=>(await ni(A),{status:200,body:await MD(A.ctx,x)})}async function ni(x){let A=$A(x.params[0]),e=await ID(x.ctx);if(!e||e.toLowerCase()!==A.toLowerCase())throw new PA(`unknown device "${A}"`)}async function ID(x){return x.deviceId||x.siteInfo.device?.device_id||x.storage.getMetadataValue($D)}async function MD(x,A){let e=await x.storage.getRowForTag(A);if(!e||!e.data)return{};let r=Wt(e.data);return r?(typeof r.pipAppVer=="number"&&(r.pipAppVer=`${r.pipAppVer}.0.0`),r.stamp=Dt(ix.stamp40ToMS(je(e.stamp))),r):{}}function Ca(x,A,e){let t=(x.tagMutexTails.get(A)??Promise.resolve()).then(e);return x.tagMutexTails.set(A,t.catch(()=>{})),t}function RD(x){return async A=>{await ni(A);let e=GD(A.request.body??null);if(!e)throw new R0("invalid or missing request body");return Ca(A.session,x,async()=>{let r=await A.ctx.storage.getRowForTag(x),t=r?.data?Wt(r.data)??{}:{};return await da(A.ctx,x,r,{...t,...e}),{status:204,body:""}})}}function LD(x){return async A=>(await ni(A),Ca(A.session,x,async()=>{let e=await A.ctx.storage.getRowForTag(x);return!e||!e.data?{status:204,body:""}:(await da(A.ctx,x,e,{}),{status:204,body:""})}))}function OD(x){return async A=>{await ni(A);let e=$A(A.params[1]);return Ca(A.session,x,async()=>{let r=await A.ctx.storage.getRowForTag(x);if(!r||!r.data)return{status:204,body:""};let t=Wt(r.data)??{},a=e.toLowerCase();for(let i of Object.keys(t))i.toLowerCase()===a&&delete t[i];return await da(A.ctx,x,r,t),{status:204,body:""}})}}function GD(x){if(!x)return null;let A;try{A=JSON.parse(x)}catch{return null}return typeof A!="object"||A===null||Array.isArray(A)?null:A}async function da(x,A,e,r){let t=bv(JSON.stringify(r),e?.data?.length??0),a=ix.msToStamp40((x.timeSource??zt).nowMs());await x.storage.replaceUtoRow({tag:A,stamp:TA(a),flags:e?.flags??0,site_related:e?.site_related??0,data:t}),pv(x,A,t,a)}var Uv={"content-type":"application/json"},UD=[{method:"GET",pattern:/^\/api\/1\/me$/,handler:Uu,checksUid:!1},{method:"GET",pattern:/^\/api\/[12]\/sites\/([^/]+)$/,handler:Ou,checksUid:!0},{method:"GET",pattern:/^\/api\/[12]\/sites\/([^/]+)\/blueprint$/,handler:Gu,checksUid:!0},{method:"POST",pattern:/^\/api\/1\/sites\/([^/]+)\/cn-set-lifecycle$/,handler:Vu,checksUid:!0},{method:"GET",pattern:/^\/api\/[12]\/sites\/([^/]+)\/timeseries\/([^/]+)\/(oldest|youngest)$/,handler:bD,checksUid:!0},{method:"GET",pattern:/^\/api\/[12]\/sites\/([^/]+)\/timeseries\/([^/]+)$/,handler:pD,checksUid:!0},{method:"GET",pattern:/^\/api\/[12]\/sites\/([^/]+)\/containers\/([^/]+)$/,handler:sD,checksUid:!0},{method:"PUT",pattern:/^\/api\/[12]\/sites\/([^/]+)\/containers\/([^/]+)$/,handler:vD,checksUid:!0},{method:"GET",pattern:/^\/api\/1\/sites\/([^/]+)\/histdata(\d)?\/(oldest|youngest)$/,handler:_D,checksUid:!0},{method:"GET",pattern:/^\/api\/1\/sites\/([^/]+)\/histdata(\d)?$/,handler:yD,checksUid:!0},{method:"GET",pattern:/^\/api\/1\/sites\/([^/]+)\/(config[0-9a-c]|config[A-C])$/,handler:FD,checksUid:!0},{method:"PUT",pattern:/^\/api\/1\/sites\/([^/]+)\/(config[0-9a-c]|config[A-C])$/,handler:fD,checksUid:!0},...HD()];function HD(){let x={"sys-otp":26432,"sys-flash":26433,"app-otp":26434,"app-flash":26435,"app-state":26436,"sys-info":26437,"app-info":26438},A={"sys-flash":26433,"app-flash":26435},e=Object.entries(x).map(([t,a])=>({method:"GET",pattern:new RegExp(`^/api/1/devices/([^/]+)/${t}$`),handler:ND(a),checksUid:!1})),r=Object.entries(A).flatMap(([t,a])=>[{method:"PUT",pattern:new RegExp(`^/api/1/devices/([^/]+)/${t}$`),handler:RD(a),checksUid:!1},{method:"DELETE",pattern:new RegExp(`^/api/1/devices/([^/]+)/${t}$`),handler:LD(a),checksUid:!1},{method:"DELETE",pattern:new RegExp(`^/api/1/devices/([^/]+)/${t}/([^/]+)$`),handler:OD(a),checksUid:!1}]);return[...e,...r]}var JD=/^\/api\/([12])\/customers\/([^/]+)\/sites\/(.*)$/;function KD(x){let A=va();return e=>Hv(x,e,A)}async function Hv(x,A,e=va()){try{let[r,t]=WD(A.path),a=XD(t),i=VD(r,x);if(i===null)return Vr(404,"E_NOT_FOUND","unknown customer");let l=A.method.toUpperCase();for(let c of UD){if(c.method!==l)continue;let u=c.pattern.exec(i);if(!u)continue;let b=u.slice(1);if(c.checksUid&&!zD(x,b[0]))return Vr(404,"E_NOT_FOUND","unknown site");let m=/^\/api\/([12])\//.exec(i)?.[1]??"1",g=await c.handler({request:A,params:b,query:a,ctx:x,session:e,apiVersion:m});return ZD(g)}return Vr(404,"E_NOT_FOUND","not found")}catch(r){return Kv(r)}}function zD(x,A){return x.allowAnySiteUid===!0||A!==void 0&&$A(A)===x.siteUid}function VD(x,A){let e=JD.exec(x);if(!e)return x;let r=$A(e[2]).toLowerCase();return(A.siteInfo.customer_id??"").toLowerCase()===r||(A.siteInfo.customer_uid??"").toLowerCase()===r?`/api/${e[1]}/sites/${e[3]}`:null}function WD(x){let A=x.indexOf("?");return A<0?[x,""]:[x.slice(0,A),x.slice(A+1)]}function XD(x){let A={params:{}};if(!x)return A;for(let e of x.split("&"))e&&YD(A,e);return A}function YD(x,A){let e=A.indexOf("="),r=$A(e<0?A:A.slice(0,e)),t=e<0?"":$A(A.slice(e+1));r==="json"?x.json=QD(t):x.params[r]=t}function QD(x){try{return JSON.parse(x)}catch{throw new R0("request supplied data which is not json formatted ")}}function ZD(x){let A=typeof x.body=="string"?x.body:JSON.stringify(x.body);return{status:x.status,headers:{...Uv,...x.headers},body:A}}function Jv(x,A){return{status:x,headers:{...Uv},body:JSON.stringify(A)}}function Kv(x){return x instanceof R0||x instanceof ia||x instanceof Ys?Vr(400,"E_BAD_REQUEST",x.message):x instanceof ri||x instanceof Ht?Vr(403,"E_FORBIDDEN",x.message):x instanceof oa?Vr(405,"E_METHOD_NOT_ALLOWED",x.message):x instanceof PA||x instanceof Er?Vr(404,"E_NOT_FOUND",x.message):Jv(500,{err:x instanceof Error?x.message:String(x)})}function Vr(x,A,e){return Jv(x,{err:`${A} ${e}`})}function x7(x,A){let e=A.apmId??"local",r=A.version??1;return{uid:A.siteUid,name:A.name??A.siteUid,customer_id:e,customer_uid:e,app:{apmid:e,version:String(r)},device:{device_id:A.deviceId,lifecycle_flags:{}},lifecycle_flags:{},containers:x.containers.map(t=>({name:t.name,alias:t.alias??t.name,kind:t.kind}))}}});var Lb={};Lc(Lb,{default:()=>Jl,deviceExitCode:()=>Hl,program:()=>RA});module.exports=Oc(Lb);var rx=require("commander"),vn=Y0(require("chalk"));var Li={name:"@microtronics/studio-cli",version:"1.3.0-alpha.3",description:"Microtronics Studio CLI Tool",main:"./out/api.js",typings:"./out/studio-cli.d.ts",bin:{"studio-cli":"studio-cli"},publishConfig:{access:"public"},scripts:{compile:"npm run build:registryApiTypings && tsc","build:cli":"node build.mjs","build:exe":"node build-exe.mjs",api:"api-extractor run --local --verbose",build:"npm run compile && npm run api && npm run build:cli","watch:build":"npm run compile -- --watch",test:"cross-env STUDIO_ENV=lucky mocha","test-ci":"cross-env STUDIO_ENV=lucky mocha --reporter mocha-junit-reporter","watch:test":"npm run test -- --watch",prepublishOnly:"npm run build","build:registryApiTypings":"npx openapi-typescript https://api.registry.lucky.ci.microtronics.com/v1/openapi.yaml -o ./src/typings/registry.ts"},author:"Microtronics",license:"ISC",dependencies:{"@gera2ld/tarjs":"^0.3.1",ajv:"^8.17.1","ajv-formats":"^3.0.1","ajv-keywords":"^5.1.0",chalk:"^5.4.1",commander:"^12.1.0","cross-fetch":"^4.0.0","deepmerge-ts":"^7.1.5",dotenv:"^16.4.7","file-type-checker":"^1.1.2",glob:"^11.0.1","iconv-lite":"^0.6.3","image-dimensions":"^2.3.0",ini:"^5.0.0",minimatch:"^10.0.1","openapi-fetch":"^0.13.0",pako:"^2.1.0",semver:"^7.7.2","sql.js":"^1.14.2","tinytar-fix":"^0.1.1","update-notifier":"^7.3.1",usb:"^2.14.0",uuid:"^9.0.1","vscode-uri":"^3.0.8",yaml:"^2.6.1"},engines:{node:">= 22"},devDependencies:{"@microsoft/api-extractor":"^7.47.11","@microtronics/device-master":"bitbucket:microtronics-core/device-master#v4.1.0","@types/chai":"^4.3.6","@types/chai-as-promised":"^7.1.5","@types/ini":"^4.1.1","@types/mocha":"^10.0.9","@types/node":"^22.9.1","@types/semver":"^7.5.6","@types/sql.js":"^1.4.11","@types/update-notifier":"^6.0.8","@types/vscode":"^1.86.2","@yao-pkg/pkg":"^6.22.0",chai:"^4.3.8","chai-as-promised":"^7.1.2","cross-env":"^7.0.3",esbuild:"^0.27.3","extract-zip":"^2.0.1",mocha:"^10.8.2","mocha-junit-reporter":"^2.2.1","openapi-typescript":"^7.6.0","pawncc-wasm":"bitbucket:microtronics-core/pawncc-wasm#v1.2.0",resedit:"^3.0.2",tar:"^7.5.7","ts-node":"^10.9.2",typescript:"^5.6.3"},mocha:{require:["ts-node/register"],"watch-files":"src/**",spec:"./test/**/*.spec.ts",recursive:!0},files:["out/api.js","out/studio-cli.d.ts","dist/main.js","dist/studio-cli.d.ts","studio-cli","CHANGELOG.md"]};var QA=Y0(require("node:fs/promises"));var Tt=require("vscode-uri"),Do=require("glob"),Pe={readFile(x){return QA.default.readFile(x.fsPath)},async rm(x){if(await this.stat(x))return QA.default.rm(x.fsPath,{recursive:!0})},async stat(x){try{let A=await QA.default.stat(x.fsPath),e=(A.isDirectory()?2:0)|(A.isFile()?1:0)|(A.isSymbolicLink()?64:0);return{ctime:A.ctimeMs,mtime:A.mtimeMs,permissions:void 0,size:A.size,type:e}}catch{return null}},async writeFile(x,A){typeof A=="string"&&(A=new TextEncoder().encode(A));let e=Tt.Utils.dirname(x);return await QA.default.mkdir(e.fsPath,{recursive:!0}),QA.default.writeFile(x.fsPath,A,{flag:"w"})},async findFiles(x,A,e){let r={ignore:e,nodir:!0,absolute:!0,dot:!0,cwd:x.fsPath};return(await(0,Do.glob)(A,r)).map(a=>{let i=a.replace(/\\/g,"/");return Tt.URI.parse(`file:///${i}`)})},async copy(x,A){let e=await QA.default.stat(x.fsPath);return await QA.default.mkdir(Tt.Utils.dirname(A).fsPath,{recursive:!0}),e.isDirectory()?QA.default.cp(x.fsPath,A.fsPath,{force:!0,recursive:!0}):QA.default.copyFile(x.fsPath,A.fsPath)},async mkdir(x){await QA.default.mkdir(x.fsPath,{recursive:!0})}};var yt=require("vscode-uri");var Ge=require("vscode-uri");var ot=require("vscode-uri");var Uc=new Uint32Array([0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117]);function Bn(x,A=0){let e=~~A^-1;for(let r=0;r<x.length;r++)e=e>>>8^Uc[(e^x[r])&255];return(e^-1)>>>0}var Qb=new Uint8Array([0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64,0,193,129,64,1,192,128,65,0,193,129,64,1,192,128,65,1,192,128,65,0,193,129,64]),Zb=new Uint8Array([0,192,193,1,195,3,2,194,198,6,7,199,5,197,196,4,204,12,13,205,15,207,206,14,10,202,203,11,201,9,8,200,216,24,25,217,27,219,218,26,30,222,223,31,221,29,28,220,20,212,213,21,215,23,22,214,210,18,19,211,17,209,208,16,240,48,49,241,51,243,242,50,54,246,247,55,245,53,52,244,60,252,253,61,255,63,62,254,250,58,59,251,57,249,248,56,40,232,233,41,235,43,42,234,238,46,47,239,45,237,236,44,228,36,37,229,39,231,230,38,34,226,227,35,225,33,32,224,160,96,97,161,99,163,162,98,102,166,167,103,165,101,100,164,108,172,173,109,175,111,110,174,170,106,107,171,105,169,168,104,120,184,185,121,187,123,122,186,190,126,127,191,125,189,188,124,180,116,117,181,119,183,182,118,114,178,179,115,177,113,112,176,80,144,145,81,147,83,82,146,150,86,87,151,85,149,148,84,156,92,93,157,95,159,158,94,90,154,155,91,153,89,88,152,136,72,73,137,75,139,138,74,78,142,143,79,141,77,76,140,68,132,133,69,135,71,70,134,130,66,67,131,65,129,128,64]);var T0;(q=>{function x(_,$){let[T,M]=$,{line:N,col:z}=_.linePos(T);return{line:Number(N)-1,startCharacter:z-1,endCharacter:z+(M-T)}}q.yamlRangeToLineInformation=x;let A=new TextEncoder;function e(_){return Bn(A.encode(_)).toString(16)}q.generateHashForLibraryName=e;function r(_){return Bn(A.encode(_)).toString(16)}q.generateHashForFilePath=r;function t(_){return Bn(_).toString(16).toUpperCase().padStart(8,"0")}q.generateCRC32ForFileContent=t;function a(_){try{let $=null;return _?.type==="Buffer"?$=Uint8Array.from(_.data):$=_,new TextDecoder("utf8").decode($)}catch{return""}}q.convertBlobToString=a;function i(_=""){return _.replace(/\r\n|\n\r|\r/g,`
|
|
2634
2634
|
`)}q.normalizeLF=i;function l(_){try{let $=a(_);return i($).split(`
|
|
2635
2635
|
`)}catch{return[]}}q.convertBlobToStringArray=l,q.isNumeric=_=>!Array.isArray(_)&&_-parseFloat(_)+1>=0;function u(_){let $="",T=_.byteLength;for(let M=0;M<T;M++)$+=String.fromCharCode(_[M]);return btoa($)}q.bufferToBase64=u;function b(_,$){let T=`${_}`.match(/\{\d*(index)(\+\d*)?}/g);if(T){let M=_;return T.forEach(N=>{let z=N.replace(/\+0$/,""),F0=z.match(/index/)?.[0];if(F0){let R=z.slice(1,-1).split(F0)[1],k=parseInt(R)||0;M=M.replace(N,`${$+k}`)}}),M}else return _}q.patchValueWithArrayInfo=b;let m={};function g(_,$,T){let M=m[_];M&&clearTimeout(M.timer),m[_]={timer:setTimeout(()=>{delete m[_],T()},$),handler:T}}q.defer=g})(T0||={});var Ro=require("image-dimensions"),Lo=require("file-type-checker");var jm=require("cross-fetch/polyfill"),No=Y0(require("openapi-fetch"));var Fr=require("vscode-uri");var _x=require("vscode-uri");var de=Y0(require("semver"));var tA="dist/",po="dde/",Oi="dlo/",Gi=".studio/",bo="dfiles/",s0;(c=>{c.fileNames={projectSettings:"studio.json",mainAmx:"main.amx",mainAmxReport:"main.xml",ddeXml:"dde.xml",ddeOpenApi:"main.yaml",historyJson:"history.json",mainDDE:"main.dde",autoInc:"auto.inc",defaultInc:"default.inc",autoUplinkInc:"app-uplink.inc",autoDdeInc:"X-dde.inc",mainDdeInc:"main-dde.inc",autoLocalDataInc:"auto-local-data.inc",legacyAutoInc:"legacy-auto.inc",legacyAutoDdeInc:"legacy-auto-dde.inc",legacyAutoUplinkInc:"legacy-auto-uplink.inc",reportTemplate:"mdn_report_template.json",dloCfg:"dlo.cfg",devMirror:"mirror.json",devDeviceLog:"device.jsonl"};let A=`${Gi}auto/`,e=`${Gi}dev/`,r=`${A}dlo/`,t=`${A}dde/`;c.filePaths={studio:{initFile:`${A}.init`,auto:{path:A,dlo:{path:r,autoInc:`${r}${c.fileNames.autoInc}`,defaultInc:`${r}${c.fileNames.defaultInc}`,autoUplinkInc:`${r}${c.fileNames.autoUplinkInc}`,autoLocalDataInc:`${r}${c.fileNames.autoLocalDataInc}`,autoDdeInc:`${r}${c.fileNames.autoDdeInc}`,mainDdeInc:`${r}${c.fileNames.mainDdeInc}`,legacyAutoInc:`${r}${c.fileNames.legacyAutoInc}`,legacyAutoDdeInc:`${r}${c.fileNames.legacyAutoDdeInc}`,legacyAutoUplinkInc:`${r}${c.fileNames.legacyAutoUplinkInc}`,cfg:`${r}${c.fileNames.dloCfg}`},dde:{path:t,historyJson:`${t}${c.fileNames.historyJson}`}},libdeps:`${Gi}libdeps/`,dev:{path:e,mirror:`${e}${c.fileNames.devMirror}`,deviceLog:`${e}${c.fileNames.devDeviceLog}`}},dist:{path:tA,dloPath:`${tA}dlo/`,mainAmxPath:`${tA}dlo/${c.fileNames.mainAmx}`,mainAmxReportPath:`${tA}dlo/${c.fileNames.mainAmxReport}`,ddeXmlPath:`${tA}dde/${c.fileNames.ddeXml}`,ddeApiPath:`${tA}api/`,ddeApi:`${tA}api/${c.fileNames.ddeOpenApi}`,historyJson:`${tA}dde/${c.fileNames.historyJson}`,povPath:`${tA}pov`,povDetailsPath:`${tA}pov/details`,dfilesPath:`${tA}dfiles`,dfilesProperties:`${tA}dfiles/properties.json`,bloPath:`${tA}blo`,reportTemplate:`${tA}/${c.fileNames.reportTemplate}`,definesTs:`${tA}defines.ts`,definesAppTs:`${tA}defines.app.ts`},dlo:{path:Oi,mainDLO:`${Oi}main.dlo`,mainINI:`${Oi}main.ini`},dde:{path:po,mainDDE:`${po}main.dde`},dfiles:{path:bo,mainDFILES:`${bo}/main.dfiles`},appIni:"app.ini",defaultsIni:"defaults.ini"},c.readme=u=>`# ${u} README
|
|
2636
2636
|
|