@zwave-js/nvmedit 14.0.0 → 14.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/build/cjs/cli.js +1 -1
  2. package/build/cjs/cli.js.map +1 -1
  3. package/build/cjs/convert.js +1 -1
  4. package/build/cjs/convert.js.map +1 -1
  5. package/build/cjs/index.d.ts +1 -1
  6. package/build/cjs/index.js +4 -8
  7. package/build/cjs/index.js.map +2 -2
  8. package/build/cjs/index_browser.d.ts +12 -0
  9. package/build/cjs/index_browser.js +42 -0
  10. package/build/cjs/index_browser.js.map +7 -0
  11. package/build/cjs/index_safe.d.ts +1 -0
  12. package/build/cjs/index_safe.js +3 -0
  13. package/build/cjs/index_safe.js.map +2 -2
  14. package/build/cjs/lib/NVM3.js +17 -17
  15. package/build/cjs/lib/NVM3.js.map +3 -3
  16. package/build/cjs/lib/nvm3/adapter.js +7 -7
  17. package/build/cjs/lib/nvm3/adapter.js.map +3 -3
  18. package/build/cjs/lib/nvm500/EntryParsers.js +1 -2
  19. package/build/cjs/lib/nvm500/EntryParsers.js.map +2 -2
  20. package/build/cjs/lib/nvm500/adapter.js +1 -1
  21. package/build/cjs/lib/nvm500/adapter.js.map +1 -1
  22. package/build/esm/cli.js +1 -1
  23. package/build/esm/cli.js.map +1 -1
  24. package/build/esm/convert.js +1 -1
  25. package/build/esm/convert.js.map +1 -1
  26. package/build/esm/index.d.ts +1 -1
  27. package/build/esm/index.d.ts.map +1 -1
  28. package/build/esm/index.js +1 -1
  29. package/build/esm/index.js.map +1 -1
  30. package/build/esm/index_browser.d.ts +12 -0
  31. package/build/esm/index_browser.d.ts.map +1 -0
  32. package/build/esm/index_browser.js +6 -0
  33. package/build/esm/index_browser.js.map +1 -0
  34. package/build/esm/index_safe.d.ts +1 -0
  35. package/build/esm/index_safe.d.ts.map +1 -1
  36. package/build/esm/index_safe.js +1 -0
  37. package/build/esm/index_safe.js.map +1 -1
  38. package/build/esm/lib/NVM3.js +2 -2
  39. package/build/esm/lib/NVM3.js.map +1 -1
  40. package/build/esm/lib/nvm3/adapter.js +3 -3
  41. package/build/esm/lib/nvm3/adapter.js.map +1 -1
  42. package/build/esm/lib/nvm500/EntryParsers.d.ts.map +1 -1
  43. package/build/esm/lib/nvm500/EntryParsers.js +1 -2
  44. package/build/esm/lib/nvm500/EntryParsers.js.map +1 -1
  45. package/build/esm/lib/nvm500/adapter.js +1 -1
  46. package/build/esm/lib/nvm500/adapter.js.map +1 -1
  47. package/package.json +6 -5
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/nvm3/adapter.ts"],
4
- "sourcesContent": ["import { ZWaveError, ZWaveErrorCodes } from \"@zwave-js/core\";\nimport { num2hex } from \"@zwave-js/shared\";\nimport { assertNever } from \"alcalzone-shared/helpers/index.js\";\nimport { SUC_MAX_UPDATES } from \"../../consts.js\";\nimport { type NVM3 } from \"../NVM3.js\";\nimport {\n\ttype ControllerNVMProperty,\n\ttype LRNodeNVMProperty,\n\ttype NVMAdapter,\n\ttype NVMProperty,\n\ttype NVMPropertyToDataType,\n\ttype NodeNVMProperty,\n} from \"../common/definitions.js\";\nimport { type RouteCache } from \"../common/routeCache.js\";\nimport {\n\ttype ApplicationCCsFile,\n\tApplicationCCsFileID,\n\tApplicationDataFile,\n\tApplicationDataFileID,\n\tApplicationNameFile,\n\tApplicationNameFileID,\n\ttype ApplicationRFConfigFile,\n\tApplicationRFConfigFileID,\n\ttype ApplicationTypeFile,\n\tApplicationTypeFileID,\n\ttype ApplicationVersionFile,\n\ttype ApplicationVersionFile800,\n\tApplicationVersionFile800ID,\n\tApplicationVersionFileID,\n\ttype ControllerInfoFile,\n\tControllerInfoFileID,\n\tLRNodeInfoFileV5,\n\tNVMFile,\n\tNodeInfoFileV0,\n\tNodeInfoFileV1,\n\tProtocolAppRouteLockNodeMaskFile,\n\tProtocolAppRouteLockNodeMaskFileID,\n\tProtocolLRNodeListFile,\n\tProtocolLRNodeListFileID,\n\tProtocolNodeListFile,\n\tProtocolNodeListFileID,\n\tProtocolPendingDiscoveryNodeMaskFile,\n\tProtocolPendingDiscoveryNodeMaskFileID,\n\tProtocolPreferredRepeatersFile,\n\tProtocolPreferredRepeatersFileID,\n\tProtocolRouteCacheExistsNodeMaskFile,\n\tProtocolRouteCacheExistsNodeMaskFileID,\n\tProtocolRouteSlaveSUCNodeMaskFile,\n\tProtocolRouteSlaveSUCNodeMaskFileID,\n\tProtocolSUCPendingUpdateNodeMaskFile,\n\tProtocolSUCPendingUpdateNodeMaskFileID,\n\ttype ProtocolVersionFile,\n\tProtocolVersionFileID,\n\tProtocolVirtualNodeMaskFile,\n\tProtocolVirtualNodeMaskFileID,\n\tRouteCacheFileV0,\n\tRouteCacheFileV1,\n\tSUCUpdateEntriesFileIDV0,\n\tSUCUpdateEntriesFileV0,\n\tSUCUpdateEntriesFileV5,\n\tSUCUpdateEntriesFileV5IDBase,\n\tSUCUpdateEntriesFileV5IDMax,\n\tSUC_UPDATES_PER_FILE_V5,\n\tgetNVMSectionByFileID,\n\tnodeIdToLRNodeInfoFileIDV5,\n\tnodeIdToNodeInfoFileIDV0,\n\tnodeIdToNodeInfoFileIDV1,\n\tnodeIdToRouteCacheFileIDV0,\n\tnodeIdToRouteCacheFileIDV1,\n\tsucUpdateIndexToSUCUpdateEntriesFileIDV5,\n} from \"./files/index.js\";\n\nconst DEFAULT_FILE_VERSION = \"7.0.0\";\n\nexport class NVM3Adapter implements NVMAdapter {\n\tpublic constructor(nvm: NVM3) {\n\t\tthis._nvm = nvm;\n\t}\n\n\tprivate _nvm: NVM3;\n\tprivate _initialized: boolean = false;\n\n\tprivate _protocolInfo: {\n\t\tversion: string;\n\t\tformat: number;\n\t} | undefined;\n\tprivate _applicationInfo: {\n\t\tversion: string;\n\t\tformat: number;\n\t} | undefined;\n\n\t/** A list of pending changes that haven't been written to the NVM yet. `null` indicates a deleted entry. */\n\tprivate _pendingChanges: Map<number, Uint8Array | null> = new Map();\n\n\tprivate getFileVersion(fileId: number): string {\n\t\tif (\n\t\t\tfileId === ProtocolVersionFileID\n\t\t\t|| fileId === ApplicationVersionFileID\n\t\t\t|| fileId === ApplicationVersionFile800ID\n\t\t) {\n\t\t\treturn DEFAULT_FILE_VERSION;\n\t\t}\n\t\tconst section = getNVMSectionByFileID(fileId);\n\t\tif (section === \"application\") {\n\t\t\treturn this._applicationInfo?.version ?? DEFAULT_FILE_VERSION;\n\t\t} else if (section === \"protocol\") {\n\t\t\treturn this._protocolInfo?.version ?? DEFAULT_FILE_VERSION;\n\t\t}\n\n\t\treturn DEFAULT_FILE_VERSION;\n\t}\n\n\tprivate async init(): Promise<void> {\n\t\tif (!this._protocolInfo) {\n\t\t\tconst protocolVersionFile = await this._getFile<\n\t\t\t\tProtocolVersionFile\n\t\t\t>(\n\t\t\t\tProtocolVersionFileID,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\tif (protocolVersionFile) {\n\t\t\t\tconst version =\n\t\t\t\t\t`${protocolVersionFile.major}.${protocolVersionFile.minor}.${protocolVersionFile.patch}`;\n\t\t\t\tthis._protocolInfo = {\n\t\t\t\t\tversion,\n\t\t\t\t\tformat: protocolVersionFile.format,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (!this._applicationInfo) {\n\t\t\tconst applicationVersionFile700 = await this._getFile<\n\t\t\t\tApplicationVersionFile\n\t\t\t>(ApplicationVersionFileID, true);\n\t\t\tconst applicationVersionFile800 = await this._getFile<\n\t\t\t\tApplicationVersionFile800\n\t\t\t>(ApplicationVersionFile800ID, true);\n\t\t\tconst applicationVersionFile = applicationVersionFile700\n\t\t\t\t?? applicationVersionFile800;\n\n\t\t\tif (applicationVersionFile) {\n\t\t\t\tconst version =\n\t\t\t\t\t`${applicationVersionFile.major}.${applicationVersionFile.minor}.${applicationVersionFile.patch}`;\n\t\t\t\tthis._applicationInfo = {\n\t\t\t\t\tversion,\n\t\t\t\t\tformat: applicationVersionFile.format,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tthis._initialized = true;\n\t}\n\n\t/** Adds a complete file to the list of pending changes */\n\tpublic setFile(file: NVMFile): void {\n\t\tconst { key, data } = file.serialize();\n\t\tthis._pendingChanges.set(key, data);\n\t}\n\n\tpublic async hasFile(fileId: number): Promise<boolean> {\n\t\tif (!this._initialized) await this.init();\n\n\t\tif (this._pendingChanges.has(fileId)) {\n\t\t\treturn this._pendingChanges.get(fileId) !== null;\n\t\t} else {\n\t\t\treturn this._nvm.has(fileId);\n\t\t}\n\t}\n\n\tprivate async _getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\tskipInit: boolean = false,\n\t): Promise<T | undefined> {\n\t\tif (!skipInit && !this._initialized) await this.init();\n\n\t\t// Prefer pending changes over the actual NVM, so changes can be composed\n\t\tlet data: Uint8Array | null | undefined;\n\t\tif (this._pendingChanges.has(fileId)) {\n\t\t\tdata = this._pendingChanges.get(fileId);\n\t\t} else {\n\t\t\tdata = await this._nvm.get(fileId);\n\t\t}\n\t\tif (!data) return;\n\n\t\tconst fileVersion = this.getFileVersion(fileId);\n\t\treturn NVMFile.from(fileId, data, fileVersion) as T;\n\t}\n\n\tprivate async _expectFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\tskipInit: boolean = false,\n\t): Promise<T> {\n\t\tconst file = await this._getFile<T>(fileId, skipInit);\n\t\tif (!file) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`NVM file ${num2hex(fileId)} not found`,\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t}\n\t\treturn file;\n\t}\n\n\tpublic getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\trequired: true,\n\t): Promise<T>;\n\n\tpublic getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\trequired?: false,\n\t): Promise<T | undefined>;\n\n\tpublic getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\trequired?: boolean,\n\t): Promise<unknown> {\n\t\tif (required) {\n\t\t\treturn this._expectFile<T>(fileId) as any;\n\t\t} else {\n\t\t\treturn this._getFile<T>(fileId) as any;\n\t\t}\n\t}\n\n\tpublic get<T extends NVMProperty, R extends boolean = boolean>(\n\t\tproperty: T,\n\t\trequired?: R,\n\t): Promise<\n\t\tR extends true ? NVMPropertyToDataType<T>\n\t\t\t: (NVMPropertyToDataType<T> | undefined)\n\t> {\n\t\tif (property.domain === \"controller\") {\n\t\t\treturn this.getControllerNVMProperty(property, !!required) as any;\n\t\t} else if (property.domain === \"lrnode\") {\n\t\t\treturn this.getLRNodeNVMProperty(property, !!required) as any;\n\t\t} else {\n\t\t\treturn this.getNodeNVMProperty(property, !!required) as any;\n\t\t}\n\t}\n\n\tprivate async getControllerNVMProperty(\n\t\tproperty: ControllerNVMProperty,\n\t\trequired: boolean,\n\t): Promise<unknown> {\n\t\tconst getFile = <T extends NVMFile>(fileId: number) => {\n\t\t\tif (required) {\n\t\t\t\treturn this._expectFile<T>(fileId);\n\t\t\t} else {\n\t\t\t\treturn this._getFile<T>(fileId);\n\t\t\t}\n\t\t};\n\n\t\tswitch (property.type) {\n\t\t\tcase \"protocolVersion\": {\n\t\t\t\tconst file = await getFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\tif (!file) return;\n\t\t\t\treturn `${file.major}.${file.minor}.${file.patch}`;\n\t\t\t}\n\t\t\tcase \"protocolFileFormat\": {\n\t\t\t\tconst file = await getFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.format;\n\t\t\t}\n\t\t\tcase \"applicationVersion\":\n\t\t\tcase \"applicationFileFormat\": {\n\t\t\t\tconst file700 = await this._getFile<ApplicationVersionFile>(\n\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t);\n\t\t\t\tconst file800 = await this._getFile<ApplicationVersionFile800>(\n\t\t\t\t\tApplicationVersionFile800ID,\n\t\t\t\t);\n\t\t\t\tconst file = file700 ?? file800;\n\n\t\t\t\tif (!file) {\n\t\t\t\t\tif (required) {\n\t\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\t\"ApplicationVersionFile not found!\",\n\t\t\t\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (property.type === \"applicationVersion\") {\n\t\t\t\t\treturn `${file.major}.${file.minor}.${file.patch}`;\n\t\t\t\t} else if (property.type === \"applicationFileFormat\") {\n\t\t\t\t\treturn file?.format;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcase \"applicationData\": {\n\t\t\t\tconst file = await getFile<ApplicationDataFile>(\n\t\t\t\t\tApplicationDataFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.applicationData;\n\t\t\t}\n\n\t\t\tcase \"applicationName\": {\n\t\t\t\tconst file = await getFile<ApplicationNameFile>(\n\t\t\t\t\tApplicationNameFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.name;\n\t\t\t}\n\n\t\t\tcase \"homeId\":\n\t\t\tcase \"nodeId\":\n\t\t\tcase \"lastNodeId\":\n\t\t\tcase \"staticControllerNodeId\":\n\t\t\tcase \"sucLastIndex\":\n\t\t\tcase \"controllerConfiguration\":\n\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\tcase \"maxNodeId\":\n\t\t\tcase \"reservedId\":\n\t\t\tcase \"systemState\":\n\t\t\tcase \"lastNodeIdLR\":\n\t\t\tcase \"maxNodeIdLR\":\n\t\t\tcase \"reservedIdLR\":\n\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\tcase \"dcdcConfig\": {\n\t\t\t\tconst file = await getFile<ControllerInfoFile>(\n\t\t\t\t\tControllerInfoFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"includedInsecurely\":\n\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\tcase \"includedSecurelySecureCCs\": {\n\t\t\t\tconst file = await getFile<ApplicationCCsFile>(\n\t\t\t\t\tApplicationCCsFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"rfRegion\":\n\t\t\tcase \"txPower\":\n\t\t\tcase \"measured0dBm\":\n\t\t\tcase \"enablePTI\":\n\t\t\tcase \"maxTXPower\":\n\t\t\tcase \"nodeIdType\": {\n\t\t\t\tconst file = await getFile<ApplicationRFConfigFile>(\n\t\t\t\t\tApplicationRFConfigFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"isListening\":\n\t\t\tcase \"optionalFunctionality\":\n\t\t\tcase \"genericDeviceClass\":\n\t\t\tcase \"specificDeviceClass\": {\n\t\t\t\tconst file = await getFile<ApplicationTypeFile>(\n\t\t\t\t\tApplicationTypeFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"preferredRepeaters\": {\n\t\t\t\tconst file = await getFile<ProtocolPreferredRepeatersFile>(\n\t\t\t\t\tProtocolPreferredRepeatersFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"appRouteLock\": {\n\t\t\t\tconst file = await getFile<\n\t\t\t\t\tProtocolAppRouteLockNodeMaskFile\n\t\t\t\t>(\n\t\t\t\t\tProtocolAppRouteLockNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\tconst file = await getFile<\n\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFile\n\t\t\t\t>(\n\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\tconst file = await getFile<\n\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFile\n\t\t\t\t>(\n\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\tconst file = await getFile<\n\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFile\n\t\t\t\t>(\n\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"nodeIds\": {\n\t\t\t\tconst file = await getFile<ProtocolNodeListFile>(\n\t\t\t\t\tProtocolNodeListFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"lrNodeIds\": {\n\t\t\t\tconst file = await getFile<ProtocolLRNodeListFile>(\n\t\t\t\t\tProtocolLRNodeListFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\tconst file = await getFile<ProtocolVirtualNodeMaskFile>(\n\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\tif (this._protocolInfo!.format < 5) {\n\t\t\t\t\tconst file = await getFile<SUCUpdateEntriesFileV0>(\n\t\t\t\t\t\tSUCUpdateEntriesFileIDV0,\n\t\t\t\t\t);\n\t\t\t\t\treturn file?.updateEntries;\n\t\t\t\t} else {\n\t\t\t\t\t// V5 has split the entries into multiple files\n\t\t\t\t\tconst updateEntries = [];\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet index = 0;\n\t\t\t\t\t\tindex < SUC_MAX_UPDATES;\n\t\t\t\t\t\tindex += SUC_UPDATES_PER_FILE_V5\n\t\t\t\t\t) {\n\t\t\t\t\t\t// None of the files are required\n\t\t\t\t\t\tconst file = await this._getFile<\n\t\t\t\t\t\t\tSUCUpdateEntriesFileV5\n\t\t\t\t\t\t>(\n\t\t\t\t\t\t\tsucUpdateIndexToSUCUpdateEntriesFileIDV5(index),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!file) break;\n\t\t\t\t\t\tupdateEntries.push(...file.updateEntries);\n\t\t\t\t\t}\n\t\t\t\t\treturn updateEntries;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcase \"learnedHomeId\":\n\t\t\tcase \"commandClasses\":\n\t\t\tcase \"watchdogStarted\":\n\t\t\tcase \"powerLevelNormal\":\n\t\t\tcase \"powerLevelLow\":\n\t\t\tcase \"powerMode\":\n\t\t\tcase \"powerModeExtintEnable\":\n\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\t// 500 series only, not supported on 700+\n\t\t\t\treturn;\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tprivate async getNodeNVMProperty(\n\t\tproperty: NodeNVMProperty,\n\t\trequired: boolean,\n\t): Promise<unknown> {\n\t\tconst getFile = <T extends NVMFile>(fileId: number) => {\n\t\t\tif (required) {\n\t\t\t\treturn this._expectFile<T>(fileId);\n\t\t\t} else {\n\t\t\t\treturn this._getFile<T>(fileId);\n\t\t\t}\n\t\t};\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\tconst file = await getFile<NodeInfoFileV0>(\n\t\t\t\t\t\tnodeIdToNodeInfoFileIDV0(\n\t\t\t\t\t\t\tproperty.nodeId,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\treturn file?.nodeInfo;\n\t\t\t\t} else {\n\t\t\t\t\tconst file = await getFile<NodeInfoFileV1>(\n\t\t\t\t\t\tnodeIdToNodeInfoFileIDV1(\n\t\t\t\t\t\t\tproperty.nodeId,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\treturn file?.nodeInfos.find((info) =>\n\t\t\t\t\t\tinfo.nodeId === property.nodeId\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcase \"routes\": {\n\t\t\t\t// The existence of routes is stored separately\n\t\t\t\tconst nodeMaskFile = await this.getFile<\n\t\t\t\t\tProtocolRouteCacheExistsNodeMaskFile\n\t\t\t\t>(ProtocolRouteCacheExistsNodeMaskFileID);\n\n\t\t\t\t// If the node is not marked as having routes, don't try to read them\n\t\t\t\tif (!nodeMaskFile) return;\n\t\t\t\tif (!nodeMaskFile.nodeIdSet.has(property.nodeId)) return;\n\n\t\t\t\tlet routeCache: RouteCache | undefined;\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\tconst file = await getFile<RouteCacheFileV0>(\n\t\t\t\t\t\tnodeIdToRouteCacheFileIDV0(property.nodeId),\n\t\t\t\t\t);\n\t\t\t\t\trouteCache = file?.routeCache;\n\t\t\t\t} else {\n\t\t\t\t\tconst file = await getFile<RouteCacheFileV1>(\n\t\t\t\t\t\tnodeIdToRouteCacheFileIDV1(property.nodeId),\n\t\t\t\t\t);\n\t\t\t\t\trouteCache = file?.routeCaches.find((route) =>\n\t\t\t\t\t\troute.nodeId === property.nodeId\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (!routeCache) return;\n\t\t\t\treturn {\n\t\t\t\t\tlwr: routeCache.lwr,\n\t\t\t\t\tnlwr: routeCache.nlwr,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tprivate async getLRNodeNVMProperty(\n\t\tproperty: LRNodeNVMProperty,\n\t\trequired: boolean,\n\t): Promise<unknown> {\n\t\tconst getFile = <T extends NVMFile>(fileId: number) => {\n\t\t\tif (required) {\n\t\t\t\treturn this._expectFile<T>(fileId);\n\t\t\t} else {\n\t\t\t\treturn this._getFile<T>(fileId);\n\t\t\t}\n\t\t};\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tconst file = await getFile<LRNodeInfoFileV5>(\n\t\t\t\t\tnodeIdToLRNodeInfoFileIDV5(property.nodeId),\n\t\t\t\t);\n\t\t\t\treturn file?.nodeInfos.find((info) =>\n\t\t\t\t\tinfo.nodeId === property.nodeId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tpublic async set<T extends NVMProperty>(\n\t\tproperty: T,\n\t\tvalue: NVMPropertyToDataType<T>,\n\t): Promise<void> {\n\t\tif (!this._initialized) await this.init();\n\n\t\tif (property.domain === \"controller\") {\n\t\t\treturn this.setControllerNVMProperty(property, value);\n\t\t} else if (property.domain === \"lrnode\") {\n\t\t\treturn this.setLRNodeNVMProperty(property, value);\n\t\t} else {\n\t\t\treturn this.setNodeNVMProperty(property, value);\n\t\t}\n\t}\n\n\tprivate async setControllerNVMProperty(\n\t\tproperty: ControllerNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tfunction failFileMissing(): never {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"Cannot set property in NVM for non-existing file\",\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t}\n\n\t\tconst expectFile = async <T extends NVMFile>(\n\t\t\tfileId: number,\n\t\t): Promise<T> => {\n\t\t\tconst file = await this._getFile<T>(fileId);\n\t\t\tif (!file) failFileMissing();\n\t\t\treturn file;\n\t\t};\n\n\t\tconst changedFiles: NVMFile[] = [];\n\t\tconst deletedFiles: number[] = [];\n\n\t\tswitch (property.type) {\n\t\t\tcase \"protocolVersion\": {\n\t\t\t\tconst file = await expectFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\tconst [major, minor, patch] = (value as string).split(\".\")\n\t\t\t\t\t.map((part) => parseInt(part, 10));\n\t\t\t\tfile.major = major;\n\t\t\t\tfile.minor = minor;\n\t\t\t\tfile.patch = patch;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"protocolFileFormat\": {\n\t\t\t\tconst file = await expectFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\tfile.format = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"applicationVersion\": {\n\t\t\t\tconst file700 = await this._getFile<ApplicationVersionFile>(\n\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t);\n\t\t\t\tconst file800 = await this._getFile<ApplicationVersionFile800>(\n\t\t\t\t\tApplicationVersionFile800ID,\n\t\t\t\t);\n\t\t\t\tconst file = file700 ?? file800;\n\t\t\t\tif (!file) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\"ApplicationVersionFile not found!\",\n\t\t\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst [major, minor, patch] = (value as string).split(\".\")\n\t\t\t\t\t.map((part) => parseInt(part, 10));\n\t\t\t\tfile.major = major;\n\t\t\t\tfile.minor = minor;\n\t\t\t\tfile.patch = patch;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"applicationFileFormat\": {\n\t\t\t\tconst file = await expectFile<ApplicationVersionFile>(\n\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t);\n\t\t\t\tfile.format = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"applicationData\": {\n\t\t\t\tconst file = new ApplicationDataFile({\n\t\t\t\t\tapplicationData: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(ApplicationDataFileID),\n\t\t\t\t});\n\t\t\t\tfile.applicationData = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"applicationName\": {\n\t\t\t\tconst file = new ApplicationNameFile({\n\t\t\t\t\tname: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(ApplicationNameFileID),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"homeId\":\n\t\t\tcase \"nodeId\":\n\t\t\tcase \"lastNodeId\":\n\t\t\tcase \"staticControllerNodeId\":\n\t\t\tcase \"sucLastIndex\":\n\t\t\tcase \"controllerConfiguration\":\n\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\tcase \"maxNodeId\":\n\t\t\tcase \"reservedId\":\n\t\t\tcase \"systemState\":\n\t\t\tcase \"lastNodeIdLR\":\n\t\t\tcase \"maxNodeIdLR\":\n\t\t\tcase \"reservedIdLR\":\n\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\tcase \"dcdcConfig\": {\n\t\t\t\tconst file = await expectFile<ControllerInfoFile>(\n\t\t\t\t\tControllerInfoFileID,\n\t\t\t\t);\n\t\t\t\tfile[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"includedInsecurely\":\n\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\tcase \"includedSecurelySecureCCs\": {\n\t\t\t\tconst file = await expectFile<ApplicationCCsFile>(\n\t\t\t\t\tApplicationCCsFileID,\n\t\t\t\t);\n\t\t\t\tfile[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"rfRegion\":\n\t\t\tcase \"txPower\":\n\t\t\tcase \"measured0dBm\":\n\t\t\tcase \"enablePTI\":\n\t\t\tcase \"maxTXPower\":\n\t\t\tcase \"nodeIdType\": {\n\t\t\t\tconst file = await expectFile<ApplicationRFConfigFile>(\n\t\t\t\t\tApplicationRFConfigFileID,\n\t\t\t\t);\n\t\t\t\t(file as any)[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"isListening\":\n\t\t\tcase \"optionalFunctionality\":\n\t\t\tcase \"genericDeviceClass\":\n\t\t\tcase \"specificDeviceClass\": {\n\t\t\t\tconst file = await expectFile<ApplicationTypeFile>(\n\t\t\t\t\tApplicationTypeFileID,\n\t\t\t\t);\n\t\t\t\t(file as any)[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"nodeIds\": {\n\t\t\t\tconst file = await this._getFile<ProtocolNodeListFile>(\n\t\t\t\t\tProtocolNodeListFileID,\n\t\t\t\t) ?? new ProtocolNodeListFile({\n\t\t\t\t\tnodeIds: [],\n\t\t\t\t\tfileVersion: this.getFileVersion(ProtocolNodeListFileID),\n\t\t\t\t});\n\t\t\t\tfile.nodeIds = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"lrNodeIds\": {\n\t\t\t\tconst file = await this._getFile<ProtocolLRNodeListFile>(\n\t\t\t\t\tProtocolLRNodeListFileID,\n\t\t\t\t) ?? new ProtocolLRNodeListFile({\n\t\t\t\t\tnodeIds: [],\n\t\t\t\t\tfileVersion: this.getFileVersion(ProtocolLRNodeListFileID),\n\t\t\t\t});\n\t\t\t\tfile.nodeIds = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\tconst file = await this._getFile<ProtocolVirtualNodeMaskFile>(\n\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t) ?? new ProtocolVirtualNodeMaskFile({\n\t\t\t\t\tnodeIds: [],\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tfile.nodeIds = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"preferredRepeaters\": {\n\t\t\t\tconst file = new ProtocolPreferredRepeatersFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolPreferredRepeatersFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"appRouteLock\": {\n\t\t\t\tconst file = new ProtocolAppRouteLockNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolAppRouteLockNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\tconst file = new ProtocolRouteSlaveSUCNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\tconst file = new ProtocolSUCPendingUpdateNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\tconst file = new ProtocolPendingDiscoveryNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\tif (this._protocolInfo!.format < 5) {\n\t\t\t\t\tconst file = new SUCUpdateEntriesFileV0({\n\t\t\t\t\t\tupdateEntries: value,\n\t\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\t\tSUCUpdateEntriesFileIDV0,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\t// V5 has split the entries into multiple files\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet index = 0;\n\t\t\t\t\t\tindex < SUC_MAX_UPDATES;\n\t\t\t\t\t\tindex += SUC_UPDATES_PER_FILE_V5\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst fileId = sucUpdateIndexToSUCUpdateEntriesFileIDV5(\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst fileExists = await this.hasFile(fileId);\n\t\t\t\t\t\tconst fileVersion = this.getFileVersion(fileId);\n\t\t\t\t\t\tconst slice = value.slice(\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\tindex + SUC_UPDATES_PER_FILE_V5,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (slice.length > 0) {\n\t\t\t\t\t\t\tconst file = new SUCUpdateEntriesFileV5({\n\t\t\t\t\t\t\t\tupdateEntries: slice,\n\t\t\t\t\t\t\t\tfileId,\n\t\t\t\t\t\t\t\tfileVersion,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t\t} else if (fileExists) {\n\t\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"learnedHomeId\":\n\t\t\tcase \"commandClasses\":\n\t\t\tcase \"watchdogStarted\":\n\t\t\tcase \"powerLevelNormal\":\n\t\t\tcase \"powerLevelLow\":\n\t\t\tcase \"powerMode\":\n\t\t\tcase \"powerModeExtintEnable\":\n\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\t// 500 series only, not supported on 700+\n\t\t\t\treturn;\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\n\t\tfor (const file of changedFiles) {\n\t\t\tconst { key, data } = file.serialize();\n\t\t\tthis._pendingChanges.set(key, data);\n\t\t}\n\t\tfor (const file of deletedFiles) {\n\t\t\tthis._pendingChanges.set(file, null);\n\t\t}\n\t}\n\n\tprivate async setLRNodeNVMProperty(\n\t\tproperty: LRNodeNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tconst changedFiles: NVMFile[] = [];\n\t\tconst deletedFiles: number[] = [];\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tconst fileId = nodeIdToLRNodeInfoFileIDV5(property.nodeId);\n\t\t\t\tlet file = await this._getFile<LRNodeInfoFileV5>(\n\t\t\t\t\tfileId,\n\t\t\t\t);\n\t\t\t\tif (value) {\n\t\t\t\t\t// Info added or modified\n\t\t\t\t\tfile ??= new LRNodeInfoFileV5({\n\t\t\t\t\t\tnodeInfos: [],\n\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t});\n\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t);\n\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\tfile.nodeInfos[existingIndex] = value;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfile.nodeInfos.push(value);\n\t\t\t\t\t}\n\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t} else if (file) {\n\t\t\t\t\t// info deleted\n\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t);\n\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\tfile.nodeInfos.splice(existingIndex, 1);\n\t\t\t\t\t\tif (file.nodeInfos.length === 0) {\n\t\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\n\t\tfor (const file of changedFiles) {\n\t\t\tconst { key, data } = file.serialize();\n\t\t\tthis._pendingChanges.set(key, data);\n\t\t}\n\t\tfor (const file of deletedFiles) {\n\t\t\tthis._pendingChanges.set(file, null);\n\t\t}\n\t}\n\n\tprivate async setNodeNVMProperty(\n\t\tproperty: NodeNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tconst changedFiles: NVMFile[] = [];\n\t\tconst deletedFiles: number[] = [];\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\t// V0, single node info per file\n\t\t\t\t\tconst fileId = nodeIdToNodeInfoFileIDV0(property.nodeId);\n\t\t\t\t\tlet file = await this._getFile<NodeInfoFileV0>(fileId);\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\t// Info added or modified\n\t\t\t\t\t\tfile ??= new NodeInfoFileV0({\n\t\t\t\t\t\t\tnodeInfo: undefined as any,\n\t\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfile.nodeInfo = value;\n\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// info deleted\n\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// V1+, multiple node infos per file\n\t\t\t\t\tconst fileId = nodeIdToNodeInfoFileIDV1(property.nodeId);\n\t\t\t\t\tlet file = await this._getFile<NodeInfoFileV1>(\n\t\t\t\t\t\tfileId,\n\t\t\t\t\t);\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\t// Info added or modified\n\t\t\t\t\t\tfile ??= new NodeInfoFileV1({\n\t\t\t\t\t\t\tnodeInfos: [],\n\t\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\t\tfile.nodeInfos[existingIndex] = value;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfile.nodeInfos.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t} else if (file) {\n\t\t\t\t\t\t// info deleted\n\t\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\t\tfile.nodeInfos.splice(existingIndex, 1);\n\t\t\t\t\t\t\tif (file.nodeInfos.length === 0) {\n\t\t\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"routes\": {\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\t// V0, single route per file\n\t\t\t\t\tconst fileId = nodeIdToRouteCacheFileIDV0(property.nodeId);\n\t\t\t\t\tlet file = await this._getFile<RouteCacheFileV0>(fileId);\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\t// Route added or modified\n\t\t\t\t\t\tfile ??= new RouteCacheFileV0({\n\t\t\t\t\t\t\trouteCache: undefined as any,\n\t\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfile.routeCache = {\n\t\t\t\t\t\t\tnodeId: property.nodeId,\n\t\t\t\t\t\t\tlwr: value.lwr,\n\t\t\t\t\t\t\tnlwr: value.nlwr,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t} else if (file) {\n\t\t\t\t\t\t// Route deleted\n\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// V1+, multiple routes per file\n\t\t\t\t\tconst fileId = nodeIdToRouteCacheFileIDV1(property.nodeId);\n\t\t\t\t\tconst file = await this._getFile<RouteCacheFileV1>(\n\t\t\t\t\t\tfileId,\n\t\t\t\t\t) ?? new RouteCacheFileV1({\n\t\t\t\t\t\trouteCaches: [],\n\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t});\n\t\t\t\t\tconst existingIndex = file.routeCaches.findIndex(\n\t\t\t\t\t\t(route) => route.nodeId === property.nodeId,\n\t\t\t\t\t);\n\t\t\t\t\tconst newRoute: RouteCache = {\n\t\t\t\t\t\tnodeId: property.nodeId,\n\t\t\t\t\t\tlwr: value.lwr,\n\t\t\t\t\t\tnlwr: value.nlwr,\n\t\t\t\t\t};\n\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\tfile.routeCaches[existingIndex] = newRoute;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfile.routeCaches.push(newRoute);\n\t\t\t\t\t}\n\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t}\n\n\t\t\t\t// The existence of routes is stored separately\n\t\t\t\tconst nodeMaskFile = await this._getFile<\n\t\t\t\t\tProtocolRouteCacheExistsNodeMaskFile\n\t\t\t\t>(ProtocolRouteCacheExistsNodeMaskFileID)\n\t\t\t\t\t?? new ProtocolRouteCacheExistsNodeMaskFile({\n\t\t\t\t\t\tnodeIds: [],\n\t\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\t\tProtocolRouteCacheExistsNodeMaskFileID,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\n\t\t\t\tif (!value && nodeMaskFile.nodeIdSet.has(property.nodeId)) {\n\t\t\t\t\tnodeMaskFile.nodeIdSet.delete(property.nodeId);\n\t\t\t\t\tchangedFiles.push(nodeMaskFile);\n\t\t\t\t} else if (\n\t\t\t\t\tvalue && !nodeMaskFile.nodeIdSet.has(property.nodeId)\n\t\t\t\t) {\n\t\t\t\t\tnodeMaskFile.nodeIdSet.add(property.nodeId);\n\t\t\t\t\tchangedFiles.push(nodeMaskFile);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\n\t\tfor (const file of changedFiles) {\n\t\t\tconst { key, data } = file.serialize();\n\t\t\tthis._pendingChanges.set(key, data);\n\t\t}\n\t\tfor (const file of deletedFiles) {\n\t\t\tthis._pendingChanges.set(file, null);\n\t\t}\n\t}\n\n\tpublic async delete(\n\t\tproperty: NVMProperty,\n\t): Promise<void> {\n\t\tif (property.domain === \"controller\") {\n\t\t\tswitch (property.type) {\n\t\t\t\tcase \"protocolVersion\":\n\t\t\t\tcase \"protocolFileFormat\": {\n\t\t\t\t\tthis._pendingChanges.set(ProtocolVersionFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"applicationVersion\":\n\t\t\t\tcase \"applicationFileFormat\": {\n\t\t\t\t\tif (await this.hasFile(ApplicationVersionFileID)) {\n\t\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (await this.hasFile(ApplicationVersionFile800ID)) {\n\t\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\t\tApplicationVersionFile800ID,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"applicationData\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationDataFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"applicationName\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationNameFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"homeId\":\n\t\t\t\tcase \"nodeId\":\n\t\t\t\tcase \"lastNodeId\":\n\t\t\t\tcase \"staticControllerNodeId\":\n\t\t\t\tcase \"sucLastIndex\":\n\t\t\t\tcase \"controllerConfiguration\":\n\t\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\t\tcase \"maxNodeId\":\n\t\t\t\tcase \"reservedId\":\n\t\t\t\tcase \"systemState\":\n\t\t\t\tcase \"lastNodeIdLR\":\n\t\t\t\tcase \"maxNodeIdLR\":\n\t\t\t\tcase \"reservedIdLR\":\n\t\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\t\tcase \"dcdcConfig\": {\n\t\t\t\t\tthis._pendingChanges.set(ControllerInfoFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"includedInsecurely\":\n\t\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\t\tcase \"includedSecurelySecureCCs\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationCCsFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"rfRegion\":\n\t\t\t\tcase \"txPower\":\n\t\t\t\tcase \"measured0dBm\":\n\t\t\t\tcase \"enablePTI\":\n\t\t\t\tcase \"maxTXPower\":\n\t\t\t\tcase \"nodeIdType\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationRFConfigFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"isListening\":\n\t\t\t\tcase \"optionalFunctionality\":\n\t\t\t\tcase \"genericDeviceClass\":\n\t\t\t\tcase \"specificDeviceClass\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationTypeFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"nodeIds\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolNodeListFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"lrNodeIds\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolLRNodeListFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"preferredRepeaters\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolPreferredRepeatersFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"appRouteLock\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolAppRouteLockNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\t\tif (this._protocolInfo!.format < 5) {\n\t\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\t\tSUCUpdateEntriesFileIDV0,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\tlet id = SUCUpdateEntriesFileV5IDBase;\n\t\t\t\t\t\t\tid <= SUCUpdateEntriesFileV5IDMax;\n\t\t\t\t\t\t\tid++\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif (await this.hasFile(id)) {\n\t\t\t\t\t\t\t\tthis._pendingChanges.set(id, null);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"learnedHomeId\":\n\t\t\t\tcase \"commandClasses\":\n\t\t\t\tcase \"watchdogStarted\":\n\t\t\t\tcase \"powerLevelNormal\":\n\t\t\t\tcase \"powerLevelLow\":\n\t\t\t\tcase \"powerMode\":\n\t\t\t\tcase \"powerModeExtintEnable\":\n\t\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\t\t// 500 series only, not supported on 700+\n\t\t\t\t\treturn;\n\n\t\t\t\tdefault:\n\t\t\t\t\tassertNever(property);\n\t\t\t}\n\t\t} else if (\n\t\t\tproperty.domain === \"lrnode\"\n\t\t) {\n\t\t\t// Node properties are handled by set(..., undefined) because\n\t\t\t// it requires both modifying and deleting files\n\t\t\treturn this.setLRNodeNVMProperty(property, undefined);\n\t\t} else if (\n\t\t\tproperty.domain === \"node\"\n\t\t) {\n\t\t\t// Node properties are handled by set(..., undefined) because\n\t\t\t// it requires both modifying and deleting files\n\t\t\treturn this.setNodeNVMProperty(property, undefined);\n\t\t}\n\t}\n\n\tpublic hasPendingChanges(): boolean {\n\t\treturn this._pendingChanges.size > 0;\n\t}\n\n\tpublic async commit(): Promise<void> {\n\t\tawait this._nvm.setMany([...this._pendingChanges]);\n\t}\n}\n"],
5
- "mappings": "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",
6
- "names": []
4
+ "sourcesContent": ["import { ZWaveError, ZWaveErrorCodes } from \"@zwave-js/core/safe\";\nimport { num2hex } from \"@zwave-js/shared/safe\";\nimport { assertNever } from \"alcalzone-shared/helpers\";\nimport { SUC_MAX_UPDATES } from \"../../consts.js\";\nimport { type NVM3 } from \"../NVM3.js\";\nimport {\n\ttype ControllerNVMProperty,\n\ttype LRNodeNVMProperty,\n\ttype NVMAdapter,\n\ttype NVMProperty,\n\ttype NVMPropertyToDataType,\n\ttype NodeNVMProperty,\n} from \"../common/definitions.js\";\nimport { type RouteCache } from \"../common/routeCache.js\";\nimport {\n\ttype ApplicationCCsFile,\n\tApplicationCCsFileID,\n\tApplicationDataFile,\n\tApplicationDataFileID,\n\tApplicationNameFile,\n\tApplicationNameFileID,\n\ttype ApplicationRFConfigFile,\n\tApplicationRFConfigFileID,\n\ttype ApplicationTypeFile,\n\tApplicationTypeFileID,\n\ttype ApplicationVersionFile,\n\ttype ApplicationVersionFile800,\n\tApplicationVersionFile800ID,\n\tApplicationVersionFileID,\n\ttype ControllerInfoFile,\n\tControllerInfoFileID,\n\tLRNodeInfoFileV5,\n\tNVMFile,\n\tNodeInfoFileV0,\n\tNodeInfoFileV1,\n\tProtocolAppRouteLockNodeMaskFile,\n\tProtocolAppRouteLockNodeMaskFileID,\n\tProtocolLRNodeListFile,\n\tProtocolLRNodeListFileID,\n\tProtocolNodeListFile,\n\tProtocolNodeListFileID,\n\tProtocolPendingDiscoveryNodeMaskFile,\n\tProtocolPendingDiscoveryNodeMaskFileID,\n\tProtocolPreferredRepeatersFile,\n\tProtocolPreferredRepeatersFileID,\n\tProtocolRouteCacheExistsNodeMaskFile,\n\tProtocolRouteCacheExistsNodeMaskFileID,\n\tProtocolRouteSlaveSUCNodeMaskFile,\n\tProtocolRouteSlaveSUCNodeMaskFileID,\n\tProtocolSUCPendingUpdateNodeMaskFile,\n\tProtocolSUCPendingUpdateNodeMaskFileID,\n\ttype ProtocolVersionFile,\n\tProtocolVersionFileID,\n\tProtocolVirtualNodeMaskFile,\n\tProtocolVirtualNodeMaskFileID,\n\tRouteCacheFileV0,\n\tRouteCacheFileV1,\n\tSUCUpdateEntriesFileIDV0,\n\tSUCUpdateEntriesFileV0,\n\tSUCUpdateEntriesFileV5,\n\tSUCUpdateEntriesFileV5IDBase,\n\tSUCUpdateEntriesFileV5IDMax,\n\tSUC_UPDATES_PER_FILE_V5,\n\tgetNVMSectionByFileID,\n\tnodeIdToLRNodeInfoFileIDV5,\n\tnodeIdToNodeInfoFileIDV0,\n\tnodeIdToNodeInfoFileIDV1,\n\tnodeIdToRouteCacheFileIDV0,\n\tnodeIdToRouteCacheFileIDV1,\n\tsucUpdateIndexToSUCUpdateEntriesFileIDV5,\n} from \"./files/index.js\";\n\nconst DEFAULT_FILE_VERSION = \"7.0.0\";\n\nexport class NVM3Adapter implements NVMAdapter {\n\tpublic constructor(nvm: NVM3) {\n\t\tthis._nvm = nvm;\n\t}\n\n\tprivate _nvm: NVM3;\n\tprivate _initialized: boolean = false;\n\n\tprivate _protocolInfo: {\n\t\tversion: string;\n\t\tformat: number;\n\t} | undefined;\n\tprivate _applicationInfo: {\n\t\tversion: string;\n\t\tformat: number;\n\t} | undefined;\n\n\t/** A list of pending changes that haven't been written to the NVM yet. `null` indicates a deleted entry. */\n\tprivate _pendingChanges: Map<number, Uint8Array | null> = new Map();\n\n\tprivate getFileVersion(fileId: number): string {\n\t\tif (\n\t\t\tfileId === ProtocolVersionFileID\n\t\t\t|| fileId === ApplicationVersionFileID\n\t\t\t|| fileId === ApplicationVersionFile800ID\n\t\t) {\n\t\t\treturn DEFAULT_FILE_VERSION;\n\t\t}\n\t\tconst section = getNVMSectionByFileID(fileId);\n\t\tif (section === \"application\") {\n\t\t\treturn this._applicationInfo?.version ?? DEFAULT_FILE_VERSION;\n\t\t} else if (section === \"protocol\") {\n\t\t\treturn this._protocolInfo?.version ?? DEFAULT_FILE_VERSION;\n\t\t}\n\n\t\treturn DEFAULT_FILE_VERSION;\n\t}\n\n\tprivate async init(): Promise<void> {\n\t\tif (!this._protocolInfo) {\n\t\t\tconst protocolVersionFile = await this._getFile<\n\t\t\t\tProtocolVersionFile\n\t\t\t>(\n\t\t\t\tProtocolVersionFileID,\n\t\t\t\ttrue,\n\t\t\t);\n\t\t\tif (protocolVersionFile) {\n\t\t\t\tconst version =\n\t\t\t\t\t`${protocolVersionFile.major}.${protocolVersionFile.minor}.${protocolVersionFile.patch}`;\n\t\t\t\tthis._protocolInfo = {\n\t\t\t\t\tversion,\n\t\t\t\t\tformat: protocolVersionFile.format,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (!this._applicationInfo) {\n\t\t\tconst applicationVersionFile700 = await this._getFile<\n\t\t\t\tApplicationVersionFile\n\t\t\t>(ApplicationVersionFileID, true);\n\t\t\tconst applicationVersionFile800 = await this._getFile<\n\t\t\t\tApplicationVersionFile800\n\t\t\t>(ApplicationVersionFile800ID, true);\n\t\t\tconst applicationVersionFile = applicationVersionFile700\n\t\t\t\t?? applicationVersionFile800;\n\n\t\t\tif (applicationVersionFile) {\n\t\t\t\tconst version =\n\t\t\t\t\t`${applicationVersionFile.major}.${applicationVersionFile.minor}.${applicationVersionFile.patch}`;\n\t\t\t\tthis._applicationInfo = {\n\t\t\t\t\tversion,\n\t\t\t\t\tformat: applicationVersionFile.format,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tthis._initialized = true;\n\t}\n\n\t/** Adds a complete file to the list of pending changes */\n\tpublic setFile(file: NVMFile): void {\n\t\tconst { key, data } = file.serialize();\n\t\tthis._pendingChanges.set(key, data);\n\t}\n\n\tpublic async hasFile(fileId: number): Promise<boolean> {\n\t\tif (!this._initialized) await this.init();\n\n\t\tif (this._pendingChanges.has(fileId)) {\n\t\t\treturn this._pendingChanges.get(fileId) !== null;\n\t\t} else {\n\t\t\treturn this._nvm.has(fileId);\n\t\t}\n\t}\n\n\tprivate async _getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\tskipInit: boolean = false,\n\t): Promise<T | undefined> {\n\t\tif (!skipInit && !this._initialized) await this.init();\n\n\t\t// Prefer pending changes over the actual NVM, so changes can be composed\n\t\tlet data: Uint8Array | null | undefined;\n\t\tif (this._pendingChanges.has(fileId)) {\n\t\t\tdata = this._pendingChanges.get(fileId);\n\t\t} else {\n\t\t\tdata = await this._nvm.get(fileId);\n\t\t}\n\t\tif (!data) return;\n\n\t\tconst fileVersion = this.getFileVersion(fileId);\n\t\treturn NVMFile.from(fileId, data, fileVersion) as T;\n\t}\n\n\tprivate async _expectFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\tskipInit: boolean = false,\n\t): Promise<T> {\n\t\tconst file = await this._getFile<T>(fileId, skipInit);\n\t\tif (!file) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`NVM file ${num2hex(fileId)} not found`,\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t}\n\t\treturn file;\n\t}\n\n\tpublic getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\trequired: true,\n\t): Promise<T>;\n\n\tpublic getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\trequired?: false,\n\t): Promise<T | undefined>;\n\n\tpublic getFile<T extends NVMFile = NVMFile>(\n\t\tfileId: number,\n\t\trequired?: boolean,\n\t): Promise<unknown> {\n\t\tif (required) {\n\t\t\treturn this._expectFile<T>(fileId) as any;\n\t\t} else {\n\t\t\treturn this._getFile<T>(fileId) as any;\n\t\t}\n\t}\n\n\tpublic get<T extends NVMProperty, R extends boolean = boolean>(\n\t\tproperty: T,\n\t\trequired?: R,\n\t): Promise<\n\t\tR extends true ? NVMPropertyToDataType<T>\n\t\t\t: (NVMPropertyToDataType<T> | undefined)\n\t> {\n\t\tif (property.domain === \"controller\") {\n\t\t\treturn this.getControllerNVMProperty(property, !!required) as any;\n\t\t} else if (property.domain === \"lrnode\") {\n\t\t\treturn this.getLRNodeNVMProperty(property, !!required) as any;\n\t\t} else {\n\t\t\treturn this.getNodeNVMProperty(property, !!required) as any;\n\t\t}\n\t}\n\n\tprivate async getControllerNVMProperty(\n\t\tproperty: ControllerNVMProperty,\n\t\trequired: boolean,\n\t): Promise<unknown> {\n\t\tconst getFile = <T extends NVMFile>(fileId: number) => {\n\t\t\tif (required) {\n\t\t\t\treturn this._expectFile<T>(fileId);\n\t\t\t} else {\n\t\t\t\treturn this._getFile<T>(fileId);\n\t\t\t}\n\t\t};\n\n\t\tswitch (property.type) {\n\t\t\tcase \"protocolVersion\": {\n\t\t\t\tconst file = await getFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\tif (!file) return;\n\t\t\t\treturn `${file.major}.${file.minor}.${file.patch}`;\n\t\t\t}\n\t\t\tcase \"protocolFileFormat\": {\n\t\t\t\tconst file = await getFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.format;\n\t\t\t}\n\t\t\tcase \"applicationVersion\":\n\t\t\tcase \"applicationFileFormat\": {\n\t\t\t\tconst file700 = await this._getFile<ApplicationVersionFile>(\n\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t);\n\t\t\t\tconst file800 = await this._getFile<ApplicationVersionFile800>(\n\t\t\t\t\tApplicationVersionFile800ID,\n\t\t\t\t);\n\t\t\t\tconst file = file700 ?? file800;\n\n\t\t\t\tif (!file) {\n\t\t\t\t\tif (required) {\n\t\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\t\"ApplicationVersionFile not found!\",\n\t\t\t\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (property.type === \"applicationVersion\") {\n\t\t\t\t\treturn `${file.major}.${file.minor}.${file.patch}`;\n\t\t\t\t} else if (property.type === \"applicationFileFormat\") {\n\t\t\t\t\treturn file?.format;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcase \"applicationData\": {\n\t\t\t\tconst file = await getFile<ApplicationDataFile>(\n\t\t\t\t\tApplicationDataFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.applicationData;\n\t\t\t}\n\n\t\t\tcase \"applicationName\": {\n\t\t\t\tconst file = await getFile<ApplicationNameFile>(\n\t\t\t\t\tApplicationNameFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.name;\n\t\t\t}\n\n\t\t\tcase \"homeId\":\n\t\t\tcase \"nodeId\":\n\t\t\tcase \"lastNodeId\":\n\t\t\tcase \"staticControllerNodeId\":\n\t\t\tcase \"sucLastIndex\":\n\t\t\tcase \"controllerConfiguration\":\n\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\tcase \"maxNodeId\":\n\t\t\tcase \"reservedId\":\n\t\t\tcase \"systemState\":\n\t\t\tcase \"lastNodeIdLR\":\n\t\t\tcase \"maxNodeIdLR\":\n\t\t\tcase \"reservedIdLR\":\n\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\tcase \"dcdcConfig\": {\n\t\t\t\tconst file = await getFile<ControllerInfoFile>(\n\t\t\t\t\tControllerInfoFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"includedInsecurely\":\n\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\tcase \"includedSecurelySecureCCs\": {\n\t\t\t\tconst file = await getFile<ApplicationCCsFile>(\n\t\t\t\t\tApplicationCCsFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"rfRegion\":\n\t\t\tcase \"txPower\":\n\t\t\tcase \"measured0dBm\":\n\t\t\tcase \"enablePTI\":\n\t\t\tcase \"maxTXPower\":\n\t\t\tcase \"nodeIdType\": {\n\t\t\t\tconst file = await getFile<ApplicationRFConfigFile>(\n\t\t\t\t\tApplicationRFConfigFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"isListening\":\n\t\t\tcase \"optionalFunctionality\":\n\t\t\tcase \"genericDeviceClass\":\n\t\t\tcase \"specificDeviceClass\": {\n\t\t\t\tconst file = await getFile<ApplicationTypeFile>(\n\t\t\t\t\tApplicationTypeFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.[property.type];\n\t\t\t}\n\n\t\t\tcase \"preferredRepeaters\": {\n\t\t\t\tconst file = await getFile<ProtocolPreferredRepeatersFile>(\n\t\t\t\t\tProtocolPreferredRepeatersFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"appRouteLock\": {\n\t\t\t\tconst file = await getFile<\n\t\t\t\t\tProtocolAppRouteLockNodeMaskFile\n\t\t\t\t>(\n\t\t\t\t\tProtocolAppRouteLockNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\tconst file = await getFile<\n\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFile\n\t\t\t\t>(\n\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\tconst file = await getFile<\n\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFile\n\t\t\t\t>(\n\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\tconst file = await getFile<\n\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFile\n\t\t\t\t>(\n\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"nodeIds\": {\n\t\t\t\tconst file = await getFile<ProtocolNodeListFile>(\n\t\t\t\t\tProtocolNodeListFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"lrNodeIds\": {\n\t\t\t\tconst file = await getFile<ProtocolLRNodeListFile>(\n\t\t\t\t\tProtocolLRNodeListFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\tconst file = await getFile<ProtocolVirtualNodeMaskFile>(\n\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t);\n\t\t\t\treturn file?.nodeIds;\n\t\t\t}\n\n\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\tif (this._protocolInfo!.format < 5) {\n\t\t\t\t\tconst file = await getFile<SUCUpdateEntriesFileV0>(\n\t\t\t\t\t\tSUCUpdateEntriesFileIDV0,\n\t\t\t\t\t);\n\t\t\t\t\treturn file?.updateEntries;\n\t\t\t\t} else {\n\t\t\t\t\t// V5 has split the entries into multiple files\n\t\t\t\t\tconst updateEntries = [];\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet index = 0;\n\t\t\t\t\t\tindex < SUC_MAX_UPDATES;\n\t\t\t\t\t\tindex += SUC_UPDATES_PER_FILE_V5\n\t\t\t\t\t) {\n\t\t\t\t\t\t// None of the files are required\n\t\t\t\t\t\tconst file = await this._getFile<\n\t\t\t\t\t\t\tSUCUpdateEntriesFileV5\n\t\t\t\t\t\t>(\n\t\t\t\t\t\t\tsucUpdateIndexToSUCUpdateEntriesFileIDV5(index),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (!file) break;\n\t\t\t\t\t\tupdateEntries.push(...file.updateEntries);\n\t\t\t\t\t}\n\t\t\t\t\treturn updateEntries;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcase \"learnedHomeId\":\n\t\t\tcase \"commandClasses\":\n\t\t\tcase \"watchdogStarted\":\n\t\t\tcase \"powerLevelNormal\":\n\t\t\tcase \"powerLevelLow\":\n\t\t\tcase \"powerMode\":\n\t\t\tcase \"powerModeExtintEnable\":\n\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\t// 500 series only, not supported on 700+\n\t\t\t\treturn;\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tprivate async getNodeNVMProperty(\n\t\tproperty: NodeNVMProperty,\n\t\trequired: boolean,\n\t): Promise<unknown> {\n\t\tconst getFile = <T extends NVMFile>(fileId: number) => {\n\t\t\tif (required) {\n\t\t\t\treturn this._expectFile<T>(fileId);\n\t\t\t} else {\n\t\t\t\treturn this._getFile<T>(fileId);\n\t\t\t}\n\t\t};\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\tconst file = await getFile<NodeInfoFileV0>(\n\t\t\t\t\t\tnodeIdToNodeInfoFileIDV0(\n\t\t\t\t\t\t\tproperty.nodeId,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\treturn file?.nodeInfo;\n\t\t\t\t} else {\n\t\t\t\t\tconst file = await getFile<NodeInfoFileV1>(\n\t\t\t\t\t\tnodeIdToNodeInfoFileIDV1(\n\t\t\t\t\t\t\tproperty.nodeId,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\treturn file?.nodeInfos.find((info) =>\n\t\t\t\t\t\tinfo.nodeId === property.nodeId\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcase \"routes\": {\n\t\t\t\t// The existence of routes is stored separately\n\t\t\t\tconst nodeMaskFile = await this.getFile<\n\t\t\t\t\tProtocolRouteCacheExistsNodeMaskFile\n\t\t\t\t>(ProtocolRouteCacheExistsNodeMaskFileID);\n\n\t\t\t\t// If the node is not marked as having routes, don't try to read them\n\t\t\t\tif (!nodeMaskFile) return;\n\t\t\t\tif (!nodeMaskFile.nodeIdSet.has(property.nodeId)) return;\n\n\t\t\t\tlet routeCache: RouteCache | undefined;\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\tconst file = await getFile<RouteCacheFileV0>(\n\t\t\t\t\t\tnodeIdToRouteCacheFileIDV0(property.nodeId),\n\t\t\t\t\t);\n\t\t\t\t\trouteCache = file?.routeCache;\n\t\t\t\t} else {\n\t\t\t\t\tconst file = await getFile<RouteCacheFileV1>(\n\t\t\t\t\t\tnodeIdToRouteCacheFileIDV1(property.nodeId),\n\t\t\t\t\t);\n\t\t\t\t\trouteCache = file?.routeCaches.find((route) =>\n\t\t\t\t\t\troute.nodeId === property.nodeId\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (!routeCache) return;\n\t\t\t\treturn {\n\t\t\t\t\tlwr: routeCache.lwr,\n\t\t\t\t\tnlwr: routeCache.nlwr,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tprivate async getLRNodeNVMProperty(\n\t\tproperty: LRNodeNVMProperty,\n\t\trequired: boolean,\n\t): Promise<unknown> {\n\t\tconst getFile = <T extends NVMFile>(fileId: number) => {\n\t\t\tif (required) {\n\t\t\t\treturn this._expectFile<T>(fileId);\n\t\t\t} else {\n\t\t\t\treturn this._getFile<T>(fileId);\n\t\t\t}\n\t\t};\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tconst file = await getFile<LRNodeInfoFileV5>(\n\t\t\t\t\tnodeIdToLRNodeInfoFileIDV5(property.nodeId),\n\t\t\t\t);\n\t\t\t\treturn file?.nodeInfos.find((info) =>\n\t\t\t\t\tinfo.nodeId === property.nodeId\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tpublic async set<T extends NVMProperty>(\n\t\tproperty: T,\n\t\tvalue: NVMPropertyToDataType<T>,\n\t): Promise<void> {\n\t\tif (!this._initialized) await this.init();\n\n\t\tif (property.domain === \"controller\") {\n\t\t\treturn this.setControllerNVMProperty(property, value);\n\t\t} else if (property.domain === \"lrnode\") {\n\t\t\treturn this.setLRNodeNVMProperty(property, value);\n\t\t} else {\n\t\t\treturn this.setNodeNVMProperty(property, value);\n\t\t}\n\t}\n\n\tprivate async setControllerNVMProperty(\n\t\tproperty: ControllerNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tfunction failFileMissing(): never {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t\"Cannot set property in NVM for non-existing file\",\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t}\n\n\t\tconst expectFile = async <T extends NVMFile>(\n\t\t\tfileId: number,\n\t\t): Promise<T> => {\n\t\t\tconst file = await this._getFile<T>(fileId);\n\t\t\tif (!file) failFileMissing();\n\t\t\treturn file;\n\t\t};\n\n\t\tconst changedFiles: NVMFile[] = [];\n\t\tconst deletedFiles: number[] = [];\n\n\t\tswitch (property.type) {\n\t\t\tcase \"protocolVersion\": {\n\t\t\t\tconst file = await expectFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\tconst [major, minor, patch] = (value as string).split(\".\")\n\t\t\t\t\t.map((part) => parseInt(part, 10));\n\t\t\t\tfile.major = major;\n\t\t\t\tfile.minor = minor;\n\t\t\t\tfile.patch = patch;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"protocolFileFormat\": {\n\t\t\t\tconst file = await expectFile<ProtocolVersionFile>(\n\t\t\t\t\tProtocolVersionFileID,\n\t\t\t\t);\n\t\t\t\tfile.format = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"applicationVersion\": {\n\t\t\t\tconst file700 = await this._getFile<ApplicationVersionFile>(\n\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t);\n\t\t\t\tconst file800 = await this._getFile<ApplicationVersionFile800>(\n\t\t\t\t\tApplicationVersionFile800ID,\n\t\t\t\t);\n\t\t\t\tconst file = file700 ?? file800;\n\t\t\t\tif (!file) {\n\t\t\t\t\tthrow new ZWaveError(\n\t\t\t\t\t\t\"ApplicationVersionFile not found!\",\n\t\t\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst [major, minor, patch] = (value as string).split(\".\")\n\t\t\t\t\t.map((part) => parseInt(part, 10));\n\t\t\t\tfile.major = major;\n\t\t\t\tfile.minor = minor;\n\t\t\t\tfile.patch = patch;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"applicationFileFormat\": {\n\t\t\t\tconst file = await expectFile<ApplicationVersionFile>(\n\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t);\n\t\t\t\tfile.format = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"applicationData\": {\n\t\t\t\tconst file = new ApplicationDataFile({\n\t\t\t\t\tapplicationData: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(ApplicationDataFileID),\n\t\t\t\t});\n\t\t\t\tfile.applicationData = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"applicationName\": {\n\t\t\t\tconst file = new ApplicationNameFile({\n\t\t\t\t\tname: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(ApplicationNameFileID),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"homeId\":\n\t\t\tcase \"nodeId\":\n\t\t\tcase \"lastNodeId\":\n\t\t\tcase \"staticControllerNodeId\":\n\t\t\tcase \"sucLastIndex\":\n\t\t\tcase \"controllerConfiguration\":\n\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\tcase \"maxNodeId\":\n\t\t\tcase \"reservedId\":\n\t\t\tcase \"systemState\":\n\t\t\tcase \"lastNodeIdLR\":\n\t\t\tcase \"maxNodeIdLR\":\n\t\t\tcase \"reservedIdLR\":\n\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\tcase \"dcdcConfig\": {\n\t\t\t\tconst file = await expectFile<ControllerInfoFile>(\n\t\t\t\t\tControllerInfoFileID,\n\t\t\t\t);\n\t\t\t\tfile[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"includedInsecurely\":\n\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\tcase \"includedSecurelySecureCCs\": {\n\t\t\t\tconst file = await expectFile<ApplicationCCsFile>(\n\t\t\t\t\tApplicationCCsFileID,\n\t\t\t\t);\n\t\t\t\tfile[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"rfRegion\":\n\t\t\tcase \"txPower\":\n\t\t\tcase \"measured0dBm\":\n\t\t\tcase \"enablePTI\":\n\t\t\tcase \"maxTXPower\":\n\t\t\tcase \"nodeIdType\": {\n\t\t\t\tconst file = await expectFile<ApplicationRFConfigFile>(\n\t\t\t\t\tApplicationRFConfigFileID,\n\t\t\t\t);\n\t\t\t\t(file as any)[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"isListening\":\n\t\t\tcase \"optionalFunctionality\":\n\t\t\tcase \"genericDeviceClass\":\n\t\t\tcase \"specificDeviceClass\": {\n\t\t\t\tconst file = await expectFile<ApplicationTypeFile>(\n\t\t\t\t\tApplicationTypeFileID,\n\t\t\t\t);\n\t\t\t\t(file as any)[property.type] = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"nodeIds\": {\n\t\t\t\tconst file = await this._getFile<ProtocolNodeListFile>(\n\t\t\t\t\tProtocolNodeListFileID,\n\t\t\t\t) ?? new ProtocolNodeListFile({\n\t\t\t\t\tnodeIds: [],\n\t\t\t\t\tfileVersion: this.getFileVersion(ProtocolNodeListFileID),\n\t\t\t\t});\n\t\t\t\tfile.nodeIds = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"lrNodeIds\": {\n\t\t\t\tconst file = await this._getFile<ProtocolLRNodeListFile>(\n\t\t\t\t\tProtocolLRNodeListFileID,\n\t\t\t\t) ?? new ProtocolLRNodeListFile({\n\t\t\t\t\tnodeIds: [],\n\t\t\t\t\tfileVersion: this.getFileVersion(ProtocolLRNodeListFileID),\n\t\t\t\t});\n\t\t\t\tfile.nodeIds = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\tconst file = await this._getFile<ProtocolVirtualNodeMaskFile>(\n\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t) ?? new ProtocolVirtualNodeMaskFile({\n\t\t\t\t\tnodeIds: [],\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tfile.nodeIds = value;\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"preferredRepeaters\": {\n\t\t\t\tconst file = new ProtocolPreferredRepeatersFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolPreferredRepeatersFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"appRouteLock\": {\n\t\t\t\tconst file = new ProtocolAppRouteLockNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolAppRouteLockNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\tconst file = new ProtocolRouteSlaveSUCNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\tconst file = new ProtocolSUCPendingUpdateNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\tconst file = new ProtocolPendingDiscoveryNodeMaskFile({\n\t\t\t\t\tnodeIds: value,\n\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFileID,\n\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\tchangedFiles.push(file);\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\tif (this._protocolInfo!.format < 5) {\n\t\t\t\t\tconst file = new SUCUpdateEntriesFileV0({\n\t\t\t\t\t\tupdateEntries: value,\n\t\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\t\tSUCUpdateEntriesFileIDV0,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\t// V5 has split the entries into multiple files\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet index = 0;\n\t\t\t\t\t\tindex < SUC_MAX_UPDATES;\n\t\t\t\t\t\tindex += SUC_UPDATES_PER_FILE_V5\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst fileId = sucUpdateIndexToSUCUpdateEntriesFileIDV5(\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst fileExists = await this.hasFile(fileId);\n\t\t\t\t\t\tconst fileVersion = this.getFileVersion(fileId);\n\t\t\t\t\t\tconst slice = value.slice(\n\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\tindex + SUC_UPDATES_PER_FILE_V5,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (slice.length > 0) {\n\t\t\t\t\t\t\tconst file = new SUCUpdateEntriesFileV5({\n\t\t\t\t\t\t\t\tupdateEntries: slice,\n\t\t\t\t\t\t\t\tfileId,\n\t\t\t\t\t\t\t\tfileVersion,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t\t} else if (fileExists) {\n\t\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"learnedHomeId\":\n\t\t\tcase \"commandClasses\":\n\t\t\tcase \"watchdogStarted\":\n\t\t\tcase \"powerLevelNormal\":\n\t\t\tcase \"powerLevelLow\":\n\t\t\tcase \"powerMode\":\n\t\t\tcase \"powerModeExtintEnable\":\n\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\t// 500 series only, not supported on 700+\n\t\t\t\treturn;\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\n\t\tfor (const file of changedFiles) {\n\t\t\tconst { key, data } = file.serialize();\n\t\t\tthis._pendingChanges.set(key, data);\n\t\t}\n\t\tfor (const file of deletedFiles) {\n\t\t\tthis._pendingChanges.set(file, null);\n\t\t}\n\t}\n\n\tprivate async setLRNodeNVMProperty(\n\t\tproperty: LRNodeNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tconst changedFiles: NVMFile[] = [];\n\t\tconst deletedFiles: number[] = [];\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tconst fileId = nodeIdToLRNodeInfoFileIDV5(property.nodeId);\n\t\t\t\tlet file = await this._getFile<LRNodeInfoFileV5>(\n\t\t\t\t\tfileId,\n\t\t\t\t);\n\t\t\t\tif (value) {\n\t\t\t\t\t// Info added or modified\n\t\t\t\t\tfile ??= new LRNodeInfoFileV5({\n\t\t\t\t\t\tnodeInfos: [],\n\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t});\n\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t);\n\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\tfile.nodeInfos[existingIndex] = value;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfile.nodeInfos.push(value);\n\t\t\t\t\t}\n\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t} else if (file) {\n\t\t\t\t\t// info deleted\n\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t);\n\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\tfile.nodeInfos.splice(existingIndex, 1);\n\t\t\t\t\t\tif (file.nodeInfos.length === 0) {\n\t\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\n\t\tfor (const file of changedFiles) {\n\t\t\tconst { key, data } = file.serialize();\n\t\t\tthis._pendingChanges.set(key, data);\n\t\t}\n\t\tfor (const file of deletedFiles) {\n\t\t\tthis._pendingChanges.set(file, null);\n\t\t}\n\t}\n\n\tprivate async setNodeNVMProperty(\n\t\tproperty: NodeNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tconst changedFiles: NVMFile[] = [];\n\t\tconst deletedFiles: number[] = [];\n\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\t// V0, single node info per file\n\t\t\t\t\tconst fileId = nodeIdToNodeInfoFileIDV0(property.nodeId);\n\t\t\t\t\tlet file = await this._getFile<NodeInfoFileV0>(fileId);\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\t// Info added or modified\n\t\t\t\t\t\tfile ??= new NodeInfoFileV0({\n\t\t\t\t\t\t\tnodeInfo: undefined as any,\n\t\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfile.nodeInfo = value;\n\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// info deleted\n\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// V1+, multiple node infos per file\n\t\t\t\t\tconst fileId = nodeIdToNodeInfoFileIDV1(property.nodeId);\n\t\t\t\t\tlet file = await this._getFile<NodeInfoFileV1>(\n\t\t\t\t\t\tfileId,\n\t\t\t\t\t);\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\t// Info added or modified\n\t\t\t\t\t\tfile ??= new NodeInfoFileV1({\n\t\t\t\t\t\t\tnodeInfos: [],\n\t\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\t\tfile.nodeInfos[existingIndex] = value;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfile.nodeInfos.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t} else if (file) {\n\t\t\t\t\t\t// info deleted\n\t\t\t\t\t\tconst existingIndex = file.nodeInfos.findIndex(\n\t\t\t\t\t\t\t(info) => info.nodeId === property.nodeId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\t\tfile.nodeInfos.splice(existingIndex, 1);\n\t\t\t\t\t\t\tif (file.nodeInfos.length === 0) {\n\t\t\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase \"routes\": {\n\t\t\t\tif (this._protocolInfo!.format < 1) {\n\t\t\t\t\t// V0, single route per file\n\t\t\t\t\tconst fileId = nodeIdToRouteCacheFileIDV0(property.nodeId);\n\t\t\t\t\tlet file = await this._getFile<RouteCacheFileV0>(fileId);\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\t// Route added or modified\n\t\t\t\t\t\tfile ??= new RouteCacheFileV0({\n\t\t\t\t\t\t\trouteCache: undefined as any,\n\t\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfile.routeCache = {\n\t\t\t\t\t\t\tnodeId: property.nodeId,\n\t\t\t\t\t\t\tlwr: value.lwr,\n\t\t\t\t\t\t\tnlwr: value.nlwr,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t\t} else if (file) {\n\t\t\t\t\t\t// Route deleted\n\t\t\t\t\t\tdeletedFiles.push(fileId);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// V1+, multiple routes per file\n\t\t\t\t\tconst fileId = nodeIdToRouteCacheFileIDV1(property.nodeId);\n\t\t\t\t\tconst file = await this._getFile<RouteCacheFileV1>(\n\t\t\t\t\t\tfileId,\n\t\t\t\t\t) ?? new RouteCacheFileV1({\n\t\t\t\t\t\trouteCaches: [],\n\t\t\t\t\t\tfileVersion: this.getFileVersion(fileId),\n\t\t\t\t\t});\n\t\t\t\t\tconst existingIndex = file.routeCaches.findIndex(\n\t\t\t\t\t\t(route) => route.nodeId === property.nodeId,\n\t\t\t\t\t);\n\t\t\t\t\tconst newRoute: RouteCache = {\n\t\t\t\t\t\tnodeId: property.nodeId,\n\t\t\t\t\t\tlwr: value.lwr,\n\t\t\t\t\t\tnlwr: value.nlwr,\n\t\t\t\t\t};\n\t\t\t\t\tif (existingIndex !== -1) {\n\t\t\t\t\t\tfile.routeCaches[existingIndex] = newRoute;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfile.routeCaches.push(newRoute);\n\t\t\t\t\t}\n\t\t\t\t\tchangedFiles.push(file);\n\t\t\t\t}\n\n\t\t\t\t// The existence of routes is stored separately\n\t\t\t\tconst nodeMaskFile = await this._getFile<\n\t\t\t\t\tProtocolRouteCacheExistsNodeMaskFile\n\t\t\t\t>(ProtocolRouteCacheExistsNodeMaskFileID)\n\t\t\t\t\t?? new ProtocolRouteCacheExistsNodeMaskFile({\n\t\t\t\t\t\tnodeIds: [],\n\t\t\t\t\t\tfileVersion: this.getFileVersion(\n\t\t\t\t\t\t\tProtocolRouteCacheExistsNodeMaskFileID,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\n\t\t\t\tif (!value && nodeMaskFile.nodeIdSet.has(property.nodeId)) {\n\t\t\t\t\tnodeMaskFile.nodeIdSet.delete(property.nodeId);\n\t\t\t\t\tchangedFiles.push(nodeMaskFile);\n\t\t\t\t} else if (\n\t\t\t\t\tvalue && !nodeMaskFile.nodeIdSet.has(property.nodeId)\n\t\t\t\t) {\n\t\t\t\t\tnodeMaskFile.nodeIdSet.add(property.nodeId);\n\t\t\t\t\tchangedFiles.push(nodeMaskFile);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\n\t\tfor (const file of changedFiles) {\n\t\t\tconst { key, data } = file.serialize();\n\t\t\tthis._pendingChanges.set(key, data);\n\t\t}\n\t\tfor (const file of deletedFiles) {\n\t\t\tthis._pendingChanges.set(file, null);\n\t\t}\n\t}\n\n\tpublic async delete(\n\t\tproperty: NVMProperty,\n\t): Promise<void> {\n\t\tif (property.domain === \"controller\") {\n\t\t\tswitch (property.type) {\n\t\t\t\tcase \"protocolVersion\":\n\t\t\t\tcase \"protocolFileFormat\": {\n\t\t\t\t\tthis._pendingChanges.set(ProtocolVersionFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"applicationVersion\":\n\t\t\t\tcase \"applicationFileFormat\": {\n\t\t\t\t\tif (await this.hasFile(ApplicationVersionFileID)) {\n\t\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\t\tApplicationVersionFileID,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (await this.hasFile(ApplicationVersionFile800ID)) {\n\t\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\t\tApplicationVersionFile800ID,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"applicationData\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationDataFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"applicationName\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationNameFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"homeId\":\n\t\t\t\tcase \"nodeId\":\n\t\t\t\tcase \"lastNodeId\":\n\t\t\t\tcase \"staticControllerNodeId\":\n\t\t\t\tcase \"sucLastIndex\":\n\t\t\t\tcase \"controllerConfiguration\":\n\t\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\t\tcase \"maxNodeId\":\n\t\t\t\tcase \"reservedId\":\n\t\t\t\tcase \"systemState\":\n\t\t\t\tcase \"lastNodeIdLR\":\n\t\t\t\tcase \"maxNodeIdLR\":\n\t\t\t\tcase \"reservedIdLR\":\n\t\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\t\tcase \"dcdcConfig\": {\n\t\t\t\t\tthis._pendingChanges.set(ControllerInfoFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"includedInsecurely\":\n\t\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\t\tcase \"includedSecurelySecureCCs\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationCCsFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"rfRegion\":\n\t\t\t\tcase \"txPower\":\n\t\t\t\tcase \"measured0dBm\":\n\t\t\t\tcase \"enablePTI\":\n\t\t\t\tcase \"maxTXPower\":\n\t\t\t\tcase \"nodeIdType\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationRFConfigFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"isListening\":\n\t\t\t\tcase \"optionalFunctionality\":\n\t\t\t\tcase \"genericDeviceClass\":\n\t\t\t\tcase \"specificDeviceClass\": {\n\t\t\t\t\tthis._pendingChanges.set(ApplicationTypeFileID, null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"nodeIds\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolNodeListFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"lrNodeIds\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolLRNodeListFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolVirtualNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"preferredRepeaters\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolPreferredRepeatersFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"appRouteLock\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolAppRouteLockNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolRouteSlaveSUCNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolSUCPendingUpdateNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\tProtocolPendingDiscoveryNodeMaskFileID,\n\t\t\t\t\t\tnull,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\t\tif (this._protocolInfo!.format < 5) {\n\t\t\t\t\t\tthis._pendingChanges.set(\n\t\t\t\t\t\t\tSUCUpdateEntriesFileIDV0,\n\t\t\t\t\t\t\tnull,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\tlet id = SUCUpdateEntriesFileV5IDBase;\n\t\t\t\t\t\t\tid <= SUCUpdateEntriesFileV5IDMax;\n\t\t\t\t\t\t\tid++\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tif (await this.hasFile(id)) {\n\t\t\t\t\t\t\t\tthis._pendingChanges.set(id, null);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcase \"learnedHomeId\":\n\t\t\t\tcase \"commandClasses\":\n\t\t\t\tcase \"watchdogStarted\":\n\t\t\t\tcase \"powerLevelNormal\":\n\t\t\t\tcase \"powerLevelLow\":\n\t\t\t\tcase \"powerMode\":\n\t\t\t\tcase \"powerModeExtintEnable\":\n\t\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\t\t// 500 series only, not supported on 700+\n\t\t\t\t\treturn;\n\n\t\t\t\tdefault:\n\t\t\t\t\tassertNever(property);\n\t\t\t}\n\t\t} else if (\n\t\t\tproperty.domain === \"lrnode\"\n\t\t) {\n\t\t\t// Node properties are handled by set(..., undefined) because\n\t\t\t// it requires both modifying and deleting files\n\t\t\treturn this.setLRNodeNVMProperty(property, undefined);\n\t\t} else if (\n\t\t\tproperty.domain === \"node\"\n\t\t) {\n\t\t\t// Node properties are handled by set(..., undefined) because\n\t\t\t// it requires both modifying and deleting files\n\t\t\treturn this.setNodeNVMProperty(property, undefined);\n\t\t}\n\t}\n\n\tpublic hasPendingChanges(): boolean {\n\t\treturn this._pendingChanges.size > 0;\n\t}\n\n\tpublic async commit(): Promise<void> {\n\t\tawait this._nvm.setMany([...this._pendingChanges]);\n\t}\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;AAAA,kBAA4C;AAC5C,IAAAA,eAAwB;AACxB,qBAA4B;AAC5B,oBAAgC;AAWhC,mBAwDO;AAEP,MAAM,uBAAuB;AAEvB,MAAO,YAAW;EACvB,YAAmB,KAAS;AAC3B,SAAK,OAAO;EACb;EAEQ;EACA,eAAwB;EAExB;EAIA;;EAMA,kBAAkD,oBAAI,IAAG;EAEzD,eAAe,QAAc;AACpC,QACC,WAAW,sCACR,WAAW,yCACX,WAAW,0CACb;AACD,aAAO;IACR;AACA,UAAM,cAAU,oCAAsB,MAAM;AAC5C,QAAI,YAAY,eAAe;AAC9B,aAAO,KAAK,kBAAkB,WAAW;IAC1C,WAAW,YAAY,YAAY;AAClC,aAAO,KAAK,eAAe,WAAW;IACvC;AAEA,WAAO;EACR;EAEQ,MAAM,OAAI;AACjB,QAAI,CAAC,KAAK,eAAe;AACxB,YAAM,sBAAsB,MAAM,KAAK,SAGtC,oCACA,IAAI;AAEL,UAAI,qBAAqB;AACxB,cAAM,UACL,GAAG,oBAAoB,KAAK,IAAI,oBAAoB,KAAK,IAAI,oBAAoB,KAAK;AACvF,aAAK,gBAAgB;UACpB;UACA,QAAQ,oBAAoB;;MAE9B;IACD;AAEA,QAAI,CAAC,KAAK,kBAAkB;AAC3B,YAAM,4BAA4B,MAAM,KAAK,SAE3C,uCAA0B,IAAI;AAChC,YAAM,4BAA4B,MAAM,KAAK,SAE3C,0CAA6B,IAAI;AACnC,YAAM,yBAAyB,6BAC3B;AAEJ,UAAI,wBAAwB;AAC3B,cAAM,UACL,GAAG,uBAAuB,KAAK,IAAI,uBAAuB,KAAK,IAAI,uBAAuB,KAAK;AAChG,aAAK,mBAAmB;UACvB;UACA,QAAQ,uBAAuB;;MAEjC;IACD;AAEA,SAAK,eAAe;EACrB;;EAGO,QAAQ,MAAa;AAC3B,UAAM,EAAE,KAAK,KAAI,IAAK,KAAK,UAAS;AACpC,SAAK,gBAAgB,IAAI,KAAK,IAAI;EACnC;EAEO,MAAM,QAAQ,QAAc;AAClC,QAAI,CAAC,KAAK;AAAc,YAAM,KAAK,KAAI;AAEvC,QAAI,KAAK,gBAAgB,IAAI,MAAM,GAAG;AACrC,aAAO,KAAK,gBAAgB,IAAI,MAAM,MAAM;IAC7C,OAAO;AACN,aAAO,KAAK,KAAK,IAAI,MAAM;IAC5B;EACD;EAEQ,MAAM,SACb,QACA,WAAoB,OAAK;AAEzB,QAAI,CAAC,YAAY,CAAC,KAAK;AAAc,YAAM,KAAK,KAAI;AAGpD,QAAI;AACJ,QAAI,KAAK,gBAAgB,IAAI,MAAM,GAAG;AACrC,aAAO,KAAK,gBAAgB,IAAI,MAAM;IACvC,OAAO;AACN,aAAO,MAAM,KAAK,KAAK,IAAI,MAAM;IAClC;AACA,QAAI,CAAC;AAAM;AAEX,UAAM,cAAc,KAAK,eAAe,MAAM;AAC9C,WAAO,qBAAQ,KAAK,QAAQ,MAAM,WAAW;EAC9C;EAEQ,MAAM,YACb,QACA,WAAoB,OAAK;AAEzB,UAAM,OAAO,MAAM,KAAK,SAAY,QAAQ,QAAQ;AACpD,QAAI,CAAC,MAAM;AACV,YAAM,IAAI,uBACT,gBAAY,sBAAQ,MAAM,CAAC,cAC3B,4BAAgB,kBAAkB;IAEpC;AACA,WAAO;EACR;EAYO,QACN,QACA,UAAkB;AAElB,QAAI,UAAU;AACb,aAAO,KAAK,YAAe,MAAM;IAClC,OAAO;AACN,aAAO,KAAK,SAAY,MAAM;IAC/B;EACD;EAEO,IACN,UACA,UAAY;AAKZ,QAAI,SAAS,WAAW,cAAc;AACrC,aAAO,KAAK,yBAAyB,UAAU,CAAC,CAAC,QAAQ;IAC1D,WAAW,SAAS,WAAW,UAAU;AACxC,aAAO,KAAK,qBAAqB,UAAU,CAAC,CAAC,QAAQ;IACtD,OAAO;AACN,aAAO,KAAK,mBAAmB,UAAU,CAAC,CAAC,QAAQ;IACpD;EACD;EAEQ,MAAM,yBACb,UACA,UAAiB;AAEjB,UAAM,UAAU,CAAoB,WAAkB;AACrD,UAAI,UAAU;AACb,eAAO,KAAK,YAAe,MAAM;MAClC,OAAO;AACN,eAAO,KAAK,SAAY,MAAM;MAC/B;IACD;AAEA,YAAQ,SAAS,MAAM;MACtB,KAAK,mBAAmB;AACvB,cAAM,OAAO,MAAM,QAClB,kCAAqB;AAEtB,YAAI,CAAC;AAAM;AACX,eAAO,GAAG,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK;MACjD;MACA,KAAK,sBAAsB;AAC1B,cAAM,OAAO,MAAM,QAClB,kCAAqB;AAEtB,eAAO,MAAM;MACd;MACA,KAAK;MACL,KAAK,yBAAyB;AAC7B,cAAM,UAAU,MAAM,KAAK,SAC1B,qCAAwB;AAEzB,cAAM,UAAU,MAAM,KAAK,SAC1B,wCAA2B;AAE5B,cAAM,OAAO,WAAW;AAExB,YAAI,CAAC,MAAM;AACV,cAAI,UAAU;AACb,kBAAM,IAAI,uBACT,qCACA,4BAAgB,kBAAkB;UAEpC,OAAO;AACN;UACD;QACD;AAEA,YAAI,SAAS,SAAS,sBAAsB;AAC3C,iBAAO,GAAG,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK;QACjD,WAAW,SAAS,SAAS,yBAAyB;AACrD,iBAAO,MAAM;QACd;MACD;MAEA,KAAK,mBAAmB;AACvB,cAAM,OAAO,MAAM,QAClB,kCAAqB;AAEtB,eAAO,MAAM;MACd;MAEA,KAAK,mBAAmB;AACvB,cAAM,OAAO,MAAM,QAClB,kCAAqB;AAEtB,eAAO,MAAM;MACd;MAEA,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK,cAAc;AAClB,cAAM,OAAO,MAAM,QAClB,iCAAoB;AAErB,eAAO,OAAO,SAAS,IAAI;MAC5B;MAEA,KAAK;MACL,KAAK;MACL,KAAK,6BAA6B;AACjC,cAAM,OAAO,MAAM,QAClB,iCAAoB;AAErB,eAAO,OAAO,SAAS,IAAI;MAC5B;MAEA,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK,cAAc;AAClB,cAAM,OAAO,MAAM,QAClB,sCAAyB;AAE1B,eAAO,OAAO,SAAS,IAAI;MAC5B;MAEA,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK,uBAAuB;AAC3B,cAAM,OAAO,MAAM,QAClB,kCAAqB;AAEtB,eAAO,OAAO,SAAS,IAAI;MAC5B;MAEA,KAAK,sBAAsB;AAC1B,cAAM,OAAO,MAAM,QAClB,6CAAgC;AAEjC,eAAO,MAAM;MACd;MAEA,KAAK,gBAAgB;AACpB,cAAM,OAAO,MAAM,QAGlB,+CAAkC;AAEnC,eAAO,MAAM;MACd;MACA,KAAK,iBAAiB;AACrB,cAAM,OAAO,MAAM,QAGlB,gDAAmC;AAEpC,eAAO,MAAM;MACd;MACA,KAAK,oBAAoB;AACxB,cAAM,OAAO,MAAM,QAGlB,mDAAsC;AAEvC,eAAO,MAAM;MACd;MACA,KAAK,oBAAoB;AACxB,cAAM,OAAO,MAAM,QAGlB,mDAAsC;AAEvC,eAAO,MAAM;MACd;MAEA,KAAK,WAAW;AACf,cAAM,OAAO,MAAM,QAClB,mCAAsB;AAEvB,eAAO,MAAM;MACd;MAEA,KAAK,aAAa;AACjB,cAAM,OAAO,MAAM,QAClB,qCAAwB;AAEzB,eAAO,MAAM;MACd;MAEA,KAAK,kBAAkB;AACtB,cAAM,OAAO,MAAM,QAClB,0CAA6B;AAE9B,eAAO,MAAM;MACd;MAEA,KAAK,oBAAoB;AACxB,YAAI,KAAK,cAAe,SAAS,GAAG;AACnC,gBAAM,OAAO,MAAM,QAClB,qCAAwB;AAEzB,iBAAO,MAAM;QACd,OAAO;AAEN,gBAAM,gBAAgB,CAAA;AACtB,mBACK,QAAQ,GACZ,QAAQ,+BACR,SAAS,sCACR;AAED,kBAAM,OAAO,MAAM,KAAK,aAGvB,uDAAyC,KAAK,CAAC;AAEhD,gBAAI,CAAC;AAAM;AACX,0BAAc,KAAK,GAAG,KAAK,aAAa;UACzC;AACA,iBAAO;QACR;MACD;MAEA,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;AAEJ;MAED;AACC,wCAAY,SAAS,IAAI;IAC3B;EACD;EAEQ,MAAM,mBACb,UACA,UAAiB;AAEjB,UAAM,UAAU,CAAoB,WAAkB;AACrD,UAAI,UAAU;AACb,eAAO,KAAK,YAAe,MAAM;MAClC,OAAO;AACN,eAAO,KAAK,SAAY,MAAM;MAC/B;IACD;AAEA,YAAQ,SAAS,MAAM;MACtB,KAAK,QAAQ;AACZ,YAAI,KAAK,cAAe,SAAS,GAAG;AACnC,gBAAM,OAAO,MAAM,YAClB,uCACC,SAAS,MAAM,CACf;AAEF,iBAAO,MAAM;QACd,OAAO;AACN,gBAAM,OAAO,MAAM,YAClB,uCACC,SAAS,MAAM,CACf;AAEF,iBAAO,MAAM,UAAU,KAAK,CAAC,SAC5B,KAAK,WAAW,SAAS,MAAM;QAEjC;MACD;MAEA,KAAK,UAAU;AAEd,cAAM,eAAe,MAAM,KAAK,QAE9B,mDAAsC;AAGxC,YAAI,CAAC;AAAc;AACnB,YAAI,CAAC,aAAa,UAAU,IAAI,SAAS,MAAM;AAAG;AAElD,YAAI;AACJ,YAAI,KAAK,cAAe,SAAS,GAAG;AACnC,gBAAM,OAAO,MAAM,YAClB,yCAA2B,SAAS,MAAM,CAAC;AAE5C,uBAAa,MAAM;QACpB,OAAO;AACN,gBAAM,OAAO,MAAM,YAClB,yCAA2B,SAAS,MAAM,CAAC;AAE5C,uBAAa,MAAM,YAAY,KAAK,CAAC,UACpC,MAAM,WAAW,SAAS,MAAM;QAElC;AACA,YAAI,CAAC;AAAY;AACjB,eAAO;UACN,KAAK,WAAW;UAChB,MAAM,WAAW;;MAEnB;MAEA;AACC,wCAAY,SAAS,IAAI;IAC3B;EACD;EAEQ,MAAM,qBACb,UACA,UAAiB;AAEjB,UAAM,UAAU,CAAoB,WAAkB;AACrD,UAAI,UAAU;AACb,eAAO,KAAK,YAAe,MAAM;MAClC,OAAO;AACN,eAAO,KAAK,SAAY,MAAM;MAC/B;IACD;AAEA,YAAQ,SAAS,MAAM;MACtB,KAAK,QAAQ;AACZ,cAAM,OAAO,MAAM,YAClB,yCAA2B,SAAS,MAAM,CAAC;AAE5C,eAAO,MAAM,UAAU,KAAK,CAAC,SAC5B,KAAK,WAAW,SAAS,MAAM;MAEjC;MAEA;AACC,wCAAY,SAAS,IAAI;IAC3B;EACD;EAEO,MAAM,IACZ,UACA,OAA+B;AAE/B,QAAI,CAAC,KAAK;AAAc,YAAM,KAAK,KAAI;AAEvC,QAAI,SAAS,WAAW,cAAc;AACrC,aAAO,KAAK,yBAAyB,UAAU,KAAK;IACrD,WAAW,SAAS,WAAW,UAAU;AACxC,aAAO,KAAK,qBAAqB,UAAU,KAAK;IACjD,OAAO;AACN,aAAO,KAAK,mBAAmB,UAAU,KAAK;IAC/C;EACD;EAEQ,MAAM,yBACb,UACA,OAAU;AAEV,aAAS,kBAAe;AACvB,YAAM,IAAI,uBACT,oDACA,4BAAgB,kBAAkB;IAEpC;AAEA,UAAM,aAAa,OAClB,WACe;AACf,YAAM,OAAO,MAAM,KAAK,SAAY,MAAM;AAC1C,UAAI,CAAC;AAAM,wBAAe;AAC1B,aAAO;IACR;AAEA,UAAM,eAA0B,CAAA;AAChC,UAAM,eAAyB,CAAA;AAE/B,YAAQ,SAAS,MAAM;MACtB,KAAK,mBAAmB;AACvB,cAAM,OAAO,MAAM,WAClB,kCAAqB;AAEtB,cAAM,CAAC,OAAO,OAAO,KAAK,IAAK,MAAiB,MAAM,GAAG,EACvD,IAAI,CAAC,SAAS,SAAS,MAAM,EAAE,CAAC;AAClC,aAAK,QAAQ;AACb,aAAK,QAAQ;AACb,aAAK,QAAQ;AACb,qBAAa,KAAK,IAAI;AACtB;MACD;MACA,KAAK,sBAAsB;AAC1B,cAAM,OAAO,MAAM,WAClB,kCAAqB;AAEtB,aAAK,SAAS;AACd,qBAAa,KAAK,IAAI;AACtB;MACD;MACA,KAAK,sBAAsB;AAC1B,cAAM,UAAU,MAAM,KAAK,SAC1B,qCAAwB;AAEzB,cAAM,UAAU,MAAM,KAAK,SAC1B,wCAA2B;AAE5B,cAAM,OAAO,WAAW;AACxB,YAAI,CAAC,MAAM;AACV,gBAAM,IAAI,uBACT,qCACA,4BAAgB,kBAAkB;QAEpC;AAEA,cAAM,CAAC,OAAO,OAAO,KAAK,IAAK,MAAiB,MAAM,GAAG,EACvD,IAAI,CAAC,SAAS,SAAS,MAAM,EAAE,CAAC;AAClC,aAAK,QAAQ;AACb,aAAK,QAAQ;AACb,aAAK,QAAQ;AACb,qBAAa,KAAK,IAAI;AACtB;MACD;MACA,KAAK,yBAAyB;AAC7B,cAAM,OAAO,MAAM,WAClB,qCAAwB;AAEzB,aAAK,SAAS;AACd,qBAAa,KAAK,IAAI;AACtB;MACD;MAEA,KAAK,mBAAmB;AACvB,cAAM,OAAO,IAAI,iCAAoB;UACpC,iBAAiB;UACjB,aAAa,KAAK,eAAe,kCAAqB;SACtD;AACD,aAAK,kBAAkB;AACvB,qBAAa,KAAK,IAAI;AACtB;MACD;MAEA,KAAK,mBAAmB;AACvB,cAAM,OAAO,IAAI,iCAAoB;UACpC,MAAM;UACN,aAAa,KAAK,eAAe,kCAAqB;SACtD;AACD,qBAAa,KAAK,IAAI;AACtB;MACD;MAEA,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK,cAAc;AAClB,cAAM,OAAO,MAAM,WAClB,iCAAoB;AAErB,aAAK,SAAS,IAAI,IAAI;AACtB,qBAAa,KAAK,IAAI;AACtB;MACD;MAEA,KAAK;MACL,KAAK;MACL,KAAK,6BAA6B;AACjC,cAAM,OAAO,MAAM,WAClB,iCAAoB;AAErB,aAAK,SAAS,IAAI,IAAI;AACtB,qBAAa,KAAK,IAAI;AACtB;MACD;MAEA,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK,cAAc;AAClB,cAAM,OAAO,MAAM,WAClB,sCAAyB;AAEzB,aAAa,SAAS,IAAI,IAAI;AAC/B,qBAAa,KAAK,IAAI;AACtB;MACD;MAEA,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK,uBAAuB;AAC3B,cAAM,OAAO,MAAM,WAClB,kCAAqB;AAErB,aAAa,SAAS,IAAI,IAAI;AAC/B,qBAAa,KAAK,IAAI;AACtB;MACD;MAEA,KAAK,WAAW;AACf,cAAM,OAAO,MAAM,KAAK,SACvB,mCAAsB,KAClB,IAAI,kCAAqB;UAC7B,SAAS,CAAA;UACT,aAAa,KAAK,eAAe,mCAAsB;SACvD;AACD,aAAK,UAAU;AACf,qBAAa,KAAK,IAAI;AACtB;MACD;MAEA,KAAK,aAAa;AACjB,cAAM,OAAO,MAAM,KAAK,SACvB,qCAAwB,KACpB,IAAI,oCAAuB;UAC/B,SAAS,CAAA;UACT,aAAa,KAAK,eAAe,qCAAwB;SACzD;AACD,aAAK,UAAU;AACf,qBAAa,KAAK,IAAI;AACtB;MACD;MAEA,KAAK,kBAAkB;AACtB,cAAM,OAAO,MAAM,KAAK,SACvB,0CAA6B,KACzB,IAAI,yCAA4B;UACpC,SAAS,CAAA;UACT,aAAa,KAAK,eACjB,0CAA6B;SAE9B;AACD,aAAK,UAAU;AACf,qBAAa,KAAK,IAAI;AACtB;MACD;MAEA,KAAK,sBAAsB;AAC1B,cAAM,OAAO,IAAI,4CAA+B;UAC/C,SAAS;UACT,aAAa,KAAK,eACjB,6CAAgC;SAEjC;AACD,qBAAa,KAAK,IAAI;AACtB;MACD;MAEA,KAAK,gBAAgB;AACpB,cAAM,OAAO,IAAI,8CAAiC;UACjD,SAAS;UACT,aAAa,KAAK,eACjB,+CAAkC;SAEnC;AACD,qBAAa,KAAK,IAAI;AACtB;MACD;MACA,KAAK,iBAAiB;AACrB,cAAM,OAAO,IAAI,+CAAkC;UAClD,SAAS;UACT,aAAa,KAAK,eACjB,gDAAmC;SAEpC;AACD,qBAAa,KAAK,IAAI;AACtB;MACD;MACA,KAAK,oBAAoB;AACxB,cAAM,OAAO,IAAI,kDAAqC;UACrD,SAAS;UACT,aAAa,KAAK,eACjB,mDAAsC;SAEvC;AACD,qBAAa,KAAK,IAAI;AACtB;MACD;MACA,KAAK,oBAAoB;AACxB,cAAM,OAAO,IAAI,kDAAqC;UACrD,SAAS;UACT,aAAa,KAAK,eACjB,mDAAsC;SAEvC;AACD,qBAAa,KAAK,IAAI;AACtB;MACD;MAEA,KAAK,oBAAoB;AACxB,YAAI,KAAK,cAAe,SAAS,GAAG;AACnC,gBAAM,OAAO,IAAI,oCAAuB;YACvC,eAAe;YACf,aAAa,KAAK,eACjB,qCAAwB;WAEzB;AACD,uBAAa,KAAK,IAAI;AACtB;QACD,OAAO;AAEN,mBACK,QAAQ,GACZ,QAAQ,+BACR,SAAS,sCACR;AACD,kBAAM,aAAS,uDACd,KAAK;AAEN,kBAAM,aAAa,MAAM,KAAK,QAAQ,MAAM;AAC5C,kBAAM,cAAc,KAAK,eAAe,MAAM;AAC9C,kBAAM,QAAQ,MAAM,MACnB,OACA,QAAQ,oCAAuB;AAEhC,gBAAI,MAAM,SAAS,GAAG;AACrB,oBAAM,OAAO,IAAI,oCAAuB;gBACvC,eAAe;gBACf;gBACA;eACA;AACD,2BAAa,KAAK,IAAI;YACvB,WAAW,YAAY;AACtB,2BAAa,KAAK,MAAM;YACzB;UACD;QACD;AACA;MACD;MAEA,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;AAEJ;MAED;AACC,wCAAY,SAAS,IAAI;IAC3B;AAEA,eAAW,QAAQ,cAAc;AAChC,YAAM,EAAE,KAAK,KAAI,IAAK,KAAK,UAAS;AACpC,WAAK,gBAAgB,IAAI,KAAK,IAAI;IACnC;AACA,eAAW,QAAQ,cAAc;AAChC,WAAK,gBAAgB,IAAI,MAAM,IAAI;IACpC;EACD;EAEQ,MAAM,qBACb,UACA,OAAU;AAEV,UAAM,eAA0B,CAAA;AAChC,UAAM,eAAyB,CAAA;AAE/B,YAAQ,SAAS,MAAM;MACtB,KAAK,QAAQ;AACZ,cAAM,aAAS,yCAA2B,SAAS,MAAM;AACzD,YAAI,OAAO,MAAM,KAAK,SACrB,MAAM;AAEP,YAAI,OAAO;AAEV,mBAAS,IAAI,8BAAiB;YAC7B,WAAW,CAAA;YACX,aAAa,KAAK,eAAe,MAAM;WACvC;AACD,gBAAM,gBAAgB,KAAK,UAAU,UACpC,CAAC,SAAS,KAAK,WAAW,SAAS,MAAM;AAE1C,cAAI,kBAAkB,IAAI;AACzB,iBAAK,UAAU,aAAa,IAAI;UACjC,OAAO;AACN,iBAAK,UAAU,KAAK,KAAK;UAC1B;AACA,uBAAa,KAAK,IAAI;QACvB,WAAW,MAAM;AAEhB,gBAAM,gBAAgB,KAAK,UAAU,UACpC,CAAC,SAAS,KAAK,WAAW,SAAS,MAAM;AAE1C,cAAI,kBAAkB,IAAI;AACzB,iBAAK,UAAU,OAAO,eAAe,CAAC;AACtC,gBAAI,KAAK,UAAU,WAAW,GAAG;AAChC,2BAAa,KAAK,MAAM;YACzB,OAAO;AACN,2BAAa,KAAK,IAAI;YACvB;UACD;QACD;AAEA;MACD;MAEA;AACC,wCAAY,SAAS,IAAI;IAC3B;AAEA,eAAW,QAAQ,cAAc;AAChC,YAAM,EAAE,KAAK,KAAI,IAAK,KAAK,UAAS;AACpC,WAAK,gBAAgB,IAAI,KAAK,IAAI;IACnC;AACA,eAAW,QAAQ,cAAc;AAChC,WAAK,gBAAgB,IAAI,MAAM,IAAI;IACpC;EACD;EAEQ,MAAM,mBACb,UACA,OAAU;AAEV,UAAM,eAA0B,CAAA;AAChC,UAAM,eAAyB,CAAA;AAE/B,YAAQ,SAAS,MAAM;MACtB,KAAK,QAAQ;AACZ,YAAI,KAAK,cAAe,SAAS,GAAG;AAEnC,gBAAM,aAAS,uCAAyB,SAAS,MAAM;AACvD,cAAI,OAAO,MAAM,KAAK,SAAyB,MAAM;AACrD,cAAI,OAAO;AAEV,qBAAS,IAAI,4BAAe;cAC3B,UAAU;cACV,aAAa,KAAK,eAAe,MAAM;aACvC;AACD,iBAAK,WAAW;AAChB,yBAAa,KAAK,IAAI;UACvB,OAAO;AAEN,yBAAa,KAAK,MAAM;UACzB;QACD,OAAO;AAEN,gBAAM,aAAS,uCAAyB,SAAS,MAAM;AACvD,cAAI,OAAO,MAAM,KAAK,SACrB,MAAM;AAEP,cAAI,OAAO;AAEV,qBAAS,IAAI,4BAAe;cAC3B,WAAW,CAAA;cACX,aAAa,KAAK,eAAe,MAAM;aACvC;AACD,kBAAM,gBAAgB,KAAK,UAAU,UACpC,CAAC,SAAS,KAAK,WAAW,SAAS,MAAM;AAE1C,gBAAI,kBAAkB,IAAI;AACzB,mBAAK,UAAU,aAAa,IAAI;YACjC,OAAO;AACN,mBAAK,UAAU,KAAK,KAAK;YAC1B;AACA,yBAAa,KAAK,IAAI;UACvB,WAAW,MAAM;AAEhB,kBAAM,gBAAgB,KAAK,UAAU,UACpC,CAAC,SAAS,KAAK,WAAW,SAAS,MAAM;AAE1C,gBAAI,kBAAkB,IAAI;AACzB,mBAAK,UAAU,OAAO,eAAe,CAAC;AACtC,kBAAI,KAAK,UAAU,WAAW,GAAG;AAChC,6BAAa,KAAK,MAAM;cACzB,OAAO;AACN,6BAAa,KAAK,IAAI;cACvB;YACD;UACD;QACD;AAEA;MACD;MAEA,KAAK,UAAU;AACd,YAAI,KAAK,cAAe,SAAS,GAAG;AAEnC,gBAAM,aAAS,yCAA2B,SAAS,MAAM;AACzD,cAAI,OAAO,MAAM,KAAK,SAA2B,MAAM;AACvD,cAAI,OAAO;AAEV,qBAAS,IAAI,8BAAiB;cAC7B,YAAY;cACZ,aAAa,KAAK,eAAe,MAAM;aACvC;AACD,iBAAK,aAAa;cACjB,QAAQ,SAAS;cACjB,KAAK,MAAM;cACX,MAAM,MAAM;;AAEb,yBAAa,KAAK,IAAI;UACvB,WAAW,MAAM;AAEhB,yBAAa,KAAK,MAAM;UACzB;QACD,OAAO;AAEN,gBAAM,aAAS,yCAA2B,SAAS,MAAM;AACzD,gBAAM,OAAO,MAAM,KAAK,SACvB,MAAM,KACF,IAAI,8BAAiB;YACzB,aAAa,CAAA;YACb,aAAa,KAAK,eAAe,MAAM;WACvC;AACD,gBAAM,gBAAgB,KAAK,YAAY,UACtC,CAAC,UAAU,MAAM,WAAW,SAAS,MAAM;AAE5C,gBAAM,WAAuB;YAC5B,QAAQ,SAAS;YACjB,KAAK,MAAM;YACX,MAAM,MAAM;;AAEb,cAAI,kBAAkB,IAAI;AACzB,iBAAK,YAAY,aAAa,IAAI;UACnC,OAAO;AACN,iBAAK,YAAY,KAAK,QAAQ;UAC/B;AACA,uBAAa,KAAK,IAAI;QACvB;AAGA,cAAM,eAAe,MAAM,KAAK,SAE9B,mDAAsC,KACpC,IAAI,kDAAqC;UAC3C,SAAS,CAAA;UACT,aAAa,KAAK,eACjB,mDAAsC;SAEvC;AAEF,YAAI,CAAC,SAAS,aAAa,UAAU,IAAI,SAAS,MAAM,GAAG;AAC1D,uBAAa,UAAU,OAAO,SAAS,MAAM;AAC7C,uBAAa,KAAK,YAAY;QAC/B,WACC,SAAS,CAAC,aAAa,UAAU,IAAI,SAAS,MAAM,GACnD;AACD,uBAAa,UAAU,IAAI,SAAS,MAAM;AAC1C,uBAAa,KAAK,YAAY;QAC/B;AAEA;MACD;MAEA;AACC,wCAAY,SAAS,IAAI;IAC3B;AAEA,eAAW,QAAQ,cAAc;AAChC,YAAM,EAAE,KAAK,KAAI,IAAK,KAAK,UAAS;AACpC,WAAK,gBAAgB,IAAI,KAAK,IAAI;IACnC;AACA,eAAW,QAAQ,cAAc;AAChC,WAAK,gBAAgB,IAAI,MAAM,IAAI;IACpC;EACD;EAEO,MAAM,OACZ,UAAqB;AAErB,QAAI,SAAS,WAAW,cAAc;AACrC,cAAQ,SAAS,MAAM;QACtB,KAAK;QACL,KAAK,sBAAsB;AAC1B,eAAK,gBAAgB,IAAI,oCAAuB,IAAI;AACpD;QACD;QAEA,KAAK;QACL,KAAK,yBAAyB;AAC7B,cAAI,MAAM,KAAK,QAAQ,qCAAwB,GAAG;AACjD,iBAAK,gBAAgB,IACpB,uCACA,IAAI;UAEN;AACA,cAAI,MAAM,KAAK,QAAQ,wCAA2B,GAAG;AACpD,iBAAK,gBAAgB,IACpB,0CACA,IAAI;UAEN;AACA;QACD;QAEA,KAAK,mBAAmB;AACvB,eAAK,gBAAgB,IAAI,oCAAuB,IAAI;AACpD;QACD;QAEA,KAAK,mBAAmB;AACvB,eAAK,gBAAgB,IAAI,oCAAuB,IAAI;AACpD;QACD;QAEA,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK,cAAc;AAClB,eAAK,gBAAgB,IAAI,mCAAsB,IAAI;AACnD;QACD;QAEA,KAAK;QACL,KAAK;QACL,KAAK,6BAA6B;AACjC,eAAK,gBAAgB,IAAI,mCAAsB,IAAI;AACnD;QACD;QAEA,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK,cAAc;AAClB,eAAK,gBAAgB,IAAI,wCAA2B,IAAI;AACxD;QACD;QAEA,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK,uBAAuB;AAC3B,eAAK,gBAAgB,IAAI,oCAAuB,IAAI;AACpD;QACD;QAEA,KAAK,WAAW;AACf,eAAK,gBAAgB,IACpB,qCACA,IAAI;AAEL;QACD;QAEA,KAAK,aAAa;AACjB,eAAK,gBAAgB,IACpB,uCACA,IAAI;AAEL;QACD;QAEA,KAAK,kBAAkB;AACtB,eAAK,gBAAgB,IACpB,4CACA,IAAI;AAEL;QACD;QAEA,KAAK,sBAAsB;AAC1B,eAAK,gBAAgB,IACpB,+CACA,IAAI;AAEL;QACD;QAEA,KAAK,gBAAgB;AACpB,eAAK,gBAAgB,IACpB,iDACA,IAAI;AAEL;QACD;QACA,KAAK,iBAAiB;AACrB,eAAK,gBAAgB,IACpB,kDACA,IAAI;AAEL;QACD;QACA,KAAK,oBAAoB;AACxB,eAAK,gBAAgB,IACpB,qDACA,IAAI;AAEL;QACD;QACA,KAAK,oBAAoB;AACxB,eAAK,gBAAgB,IACpB,qDACA,IAAI;AAEL;QACD;QAEA,KAAK,oBAAoB;AACxB,cAAI,KAAK,cAAe,SAAS,GAAG;AACnC,iBAAK,gBAAgB,IACpB,uCACA,IAAI;UAEN,OAAO;AACN,qBACK,KAAK,2CACT,MAAM,0CACN,MACC;AACD,kBAAI,MAAM,KAAK,QAAQ,EAAE,GAAG;AAC3B,qBAAK,gBAAgB,IAAI,IAAI,IAAI;cAClC;YACD;UACD;AACA;QACD;QAEA,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;AAEJ;QAED;AACC,0CAAY,QAAQ;MACtB;IACD,WACC,SAAS,WAAW,UACnB;AAGD,aAAO,KAAK,qBAAqB,UAAU,MAAS;IACrD,WACC,SAAS,WAAW,QACnB;AAGD,aAAO,KAAK,mBAAmB,UAAU,MAAS;IACnD;EACD;EAEO,oBAAiB;AACvB,WAAO,KAAK,gBAAgB,OAAO;EACpC;EAEO,MAAM,SAAM;AAClB,UAAM,KAAK,KAAK,QAAQ,CAAC,GAAG,KAAK,eAAe,CAAC;EAClD;;",
6
+ "names": ["import_safe"]
7
7
  }
@@ -28,7 +28,6 @@ __export(EntryParsers_exports, {
28
28
  module.exports = __toCommonJS(EntryParsers_exports);
29
29
  var import_safe = require("@zwave-js/core/safe");
30
30
  var import_safe2 = require("@zwave-js/shared/safe");
31
- var import_strings = require("alcalzone-shared/strings/index.js");
32
31
  function parseNVMDescriptor(data, offset = 0) {
33
32
  const buffer = import_safe2.Bytes.view(data);
34
33
  return {
@@ -38,7 +37,7 @@ function parseNVMDescriptor(data, offset = 0) {
38
37
  productID: buffer.readUInt16BE(offset + 6),
39
38
  firmwareVersion: `${buffer[offset + 8]}.${buffer[offset + 9]}`,
40
39
  // Z-Wave protocol versions are formatted as "6.07" and similar
41
- protocolVersion: `${buffer[offset + 10]}.${(0, import_strings.padStart)(buffer[offset + 11].toString(), 2, "0")}`
40
+ protocolVersion: `${buffer[offset + 10]}.${buffer[offset + 11].toString().padStart(2, "0")}`
42
41
  };
43
42
  }
44
43
  function encodeNVMDescriptor(descriptor) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/nvm500/EntryParsers.ts"],
4
- "sourcesContent": ["import {\n\ttype NodeProtocolInfo,\n\tencodeNodeProtocolInfo,\n\tparseNodeProtocolInfo,\n} from \"@zwave-js/core/safe\";\nimport { Bytes } from \"@zwave-js/shared/safe\";\nimport { padStart } from \"alcalzone-shared/strings/index.js\";\nimport type { NVMModuleType } from \"./shared.js\";\n\nexport interface NVMDescriptor {\n\tmanufacturerID: number;\n\tfirmwareID: number;\n\tproductType: number;\n\tproductID: number;\n\tfirmwareVersion: string;\n\tprotocolVersion: string;\n}\n\nexport function parseNVMDescriptor(\n\tdata: Uint8Array,\n\toffset: number = 0,\n): NVMDescriptor {\n\tconst buffer = Bytes.view(data);\n\treturn {\n\t\tmanufacturerID: buffer.readUInt16BE(offset),\n\t\tfirmwareID: buffer.readUInt16BE(offset + 2),\n\t\tproductType: buffer.readUInt16BE(offset + 4),\n\t\tproductID: buffer.readUInt16BE(offset + 6),\n\t\tfirmwareVersion: `${buffer[offset + 8]}.${buffer[offset + 9]}`,\n\t\t// Z-Wave protocol versions are formatted as \"6.07\" and similar\n\t\tprotocolVersion: `${buffer[offset + 10]}.${\n\t\t\tpadStart(\n\t\t\t\tbuffer[offset + 11].toString(),\n\t\t\t\t2,\n\t\t\t\t\"0\",\n\t\t\t)\n\t\t}`,\n\t};\n}\n\nexport function encodeNVMDescriptor(descriptor: NVMDescriptor): Bytes {\n\tconst ret = new Bytes(12);\n\tret.writeUInt16BE(descriptor.manufacturerID, 0);\n\tret.writeUInt16BE(descriptor.firmwareID, 2);\n\tret.writeUInt16BE(descriptor.productType, 4);\n\tret.writeUInt16BE(descriptor.productID, 6);\n\tconst fwVersionParts = descriptor.firmwareVersion\n\t\t.split(\".\")\n\t\t.map((i) => parseInt(i));\n\tret[8] = fwVersionParts[0];\n\tret[9] = fwVersionParts[1];\n\tconst protocolVersionParts = descriptor.protocolVersion\n\t\t.split(\".\")\n\t\t.map((i) => parseInt(i));\n\tret[10] = protocolVersionParts[0];\n\tret[11] = protocolVersionParts[1];\n\treturn ret;\n}\n\nexport interface NVMModuleDescriptor {\n\tsize: number;\n\ttype: NVMModuleType;\n\tversion: string;\n}\n\nexport function parseNVMModuleDescriptor(\n\tdata: Uint8Array,\n\toffset: number = 0,\n): NVMModuleDescriptor {\n\tconst buffer = Bytes.view(data);\n\treturn {\n\t\tsize: buffer.readUInt16BE(offset),\n\t\ttype: buffer[offset + 2],\n\t\tversion: `${buffer[offset + 3]}.${buffer[offset + 4]}`,\n\t};\n}\n\nexport function encodeNVMModuleDescriptor(\n\tdescriptior: NVMModuleDescriptor,\n): Bytes {\n\tconst ret = new Bytes(5);\n\tret.writeUInt16BE(descriptior.size, 0);\n\tret[2] = descriptior.type;\n\tconst versionParts = descriptior.version.split(\".\").map((i) => parseInt(i));\n\tret[3] = versionParts[0];\n\tret[4] = versionParts[1];\n\treturn ret;\n}\n\nexport interface NVM500NodeInfo\n\textends Omit<NodeProtocolInfo, \"hasSpecificDeviceClass\">\n{\n\tgenericDeviceClass: number;\n\tspecificDeviceClass: number | null;\n}\n\nexport function parseNVM500NodeInfo(\n\tbuffer: Uint8Array,\n\toffset: number,\n): NVM500NodeInfo {\n\tconst { hasSpecificDeviceClass, ...protocolInfo } = parseNodeProtocolInfo(\n\t\tbuffer,\n\t\toffset,\n\t);\n\tconst genericDeviceClass = buffer[offset + 3];\n\tconst specificDeviceClass = hasSpecificDeviceClass\n\t\t? buffer[offset + 4]\n\t\t: null;\n\treturn {\n\t\t...protocolInfo,\n\t\tgenericDeviceClass,\n\t\tspecificDeviceClass,\n\t};\n}\n\nexport function encodeNVM500NodeInfo(nodeInfo: NVM500NodeInfo): Bytes {\n\treturn Bytes.concat([\n\t\tencodeNodeProtocolInfo({\n\t\t\t...nodeInfo,\n\t\t\thasSpecificDeviceClass: !!nodeInfo.specificDeviceClass,\n\t\t}),\n\t\tBytes.from([\n\t\t\tnodeInfo.genericDeviceClass,\n\t\t\tnodeInfo.specificDeviceClass ?? 0,\n\t\t]),\n\t]);\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;AAAA,kBAIO;AACP,IAAAA,eAAsB;AACtB,qBAAyB;AAYnB,SAAU,mBACf,MACA,SAAiB,GAAC;AAElB,QAAM,SAAS,mBAAM,KAAK,IAAI;AAC9B,SAAO;IACN,gBAAgB,OAAO,aAAa,MAAM;IAC1C,YAAY,OAAO,aAAa,SAAS,CAAC;IAC1C,aAAa,OAAO,aAAa,SAAS,CAAC;IAC3C,WAAW,OAAO,aAAa,SAAS,CAAC;IACzC,iBAAiB,GAAG,OAAO,SAAS,CAAC,CAAC,IAAI,OAAO,SAAS,CAAC,CAAC;;IAE5D,iBAAiB,GAAG,OAAO,SAAS,EAAE,CAAC,QACtC,yBACC,OAAO,SAAS,EAAE,EAAE,SAAQ,GAC5B,GACA,GAAG,CAEL;;AAEF;AAEM,SAAU,oBAAoB,YAAyB;AAC5D,QAAM,MAAM,IAAI,mBAAM,EAAE;AACxB,MAAI,cAAc,WAAW,gBAAgB,CAAC;AAC9C,MAAI,cAAc,WAAW,YAAY,CAAC;AAC1C,MAAI,cAAc,WAAW,aAAa,CAAC;AAC3C,MAAI,cAAc,WAAW,WAAW,CAAC;AACzC,QAAM,iBAAiB,WAAW,gBAChC,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;AACxB,MAAI,CAAC,IAAI,eAAe,CAAC;AACzB,MAAI,CAAC,IAAI,eAAe,CAAC;AACzB,QAAM,uBAAuB,WAAW,gBACtC,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;AACxB,MAAI,EAAE,IAAI,qBAAqB,CAAC;AAChC,MAAI,EAAE,IAAI,qBAAqB,CAAC;AAChC,SAAO;AACR;AAQM,SAAU,yBACf,MACA,SAAiB,GAAC;AAElB,QAAM,SAAS,mBAAM,KAAK,IAAI;AAC9B,SAAO;IACN,MAAM,OAAO,aAAa,MAAM;IAChC,MAAM,OAAO,SAAS,CAAC;IACvB,SAAS,GAAG,OAAO,SAAS,CAAC,CAAC,IAAI,OAAO,SAAS,CAAC,CAAC;;AAEtD;AAEM,SAAU,0BACf,aAAgC;AAEhC,QAAM,MAAM,IAAI,mBAAM,CAAC;AACvB,MAAI,cAAc,YAAY,MAAM,CAAC;AACrC,MAAI,CAAC,IAAI,YAAY;AACrB,QAAM,eAAe,YAAY,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;AAC1E,MAAI,CAAC,IAAI,aAAa,CAAC;AACvB,MAAI,CAAC,IAAI,aAAa,CAAC;AACvB,SAAO;AACR;AASM,SAAU,oBACf,QACA,QAAc;AAEd,QAAM,EAAE,wBAAwB,GAAG,aAAY,QAAK,mCACnD,QACA,MAAM;AAEP,QAAM,qBAAqB,OAAO,SAAS,CAAC;AAC5C,QAAM,sBAAsB,yBACzB,OAAO,SAAS,CAAC,IACjB;AACH,SAAO;IACN,GAAG;IACH;IACA;;AAEF;AAEM,SAAU,qBAAqB,UAAwB;AAC5D,SAAO,mBAAM,OAAO;QACnB,oCAAuB;MACtB,GAAG;MACH,wBAAwB,CAAC,CAAC,SAAS;KACnC;IACD,mBAAM,KAAK;MACV,SAAS;MACT,SAAS,uBAAuB;KAChC;GACD;AACF;",
4
+ "sourcesContent": ["import {\n\ttype NodeProtocolInfo,\n\tencodeNodeProtocolInfo,\n\tparseNodeProtocolInfo,\n} from \"@zwave-js/core/safe\";\nimport { Bytes } from \"@zwave-js/shared/safe\";\nimport type { NVMModuleType } from \"./shared.js\";\n\nexport interface NVMDescriptor {\n\tmanufacturerID: number;\n\tfirmwareID: number;\n\tproductType: number;\n\tproductID: number;\n\tfirmwareVersion: string;\n\tprotocolVersion: string;\n}\n\nexport function parseNVMDescriptor(\n\tdata: Uint8Array,\n\toffset: number = 0,\n): NVMDescriptor {\n\tconst buffer = Bytes.view(data);\n\treturn {\n\t\tmanufacturerID: buffer.readUInt16BE(offset),\n\t\tfirmwareID: buffer.readUInt16BE(offset + 2),\n\t\tproductType: buffer.readUInt16BE(offset + 4),\n\t\tproductID: buffer.readUInt16BE(offset + 6),\n\t\tfirmwareVersion: `${buffer[offset + 8]}.${buffer[offset + 9]}`,\n\t\t// Z-Wave protocol versions are formatted as \"6.07\" and similar\n\t\tprotocolVersion: `${buffer[offset + 10]}.${\n\t\t\tbuffer[offset + 11].toString().padStart(\n\t\t\t\t2,\n\t\t\t\t\"0\",\n\t\t\t)\n\t\t}`,\n\t};\n}\n\nexport function encodeNVMDescriptor(descriptor: NVMDescriptor): Bytes {\n\tconst ret = new Bytes(12);\n\tret.writeUInt16BE(descriptor.manufacturerID, 0);\n\tret.writeUInt16BE(descriptor.firmwareID, 2);\n\tret.writeUInt16BE(descriptor.productType, 4);\n\tret.writeUInt16BE(descriptor.productID, 6);\n\tconst fwVersionParts = descriptor.firmwareVersion\n\t\t.split(\".\")\n\t\t.map((i) => parseInt(i));\n\tret[8] = fwVersionParts[0];\n\tret[9] = fwVersionParts[1];\n\tconst protocolVersionParts = descriptor.protocolVersion\n\t\t.split(\".\")\n\t\t.map((i) => parseInt(i));\n\tret[10] = protocolVersionParts[0];\n\tret[11] = protocolVersionParts[1];\n\treturn ret;\n}\n\nexport interface NVMModuleDescriptor {\n\tsize: number;\n\ttype: NVMModuleType;\n\tversion: string;\n}\n\nexport function parseNVMModuleDescriptor(\n\tdata: Uint8Array,\n\toffset: number = 0,\n): NVMModuleDescriptor {\n\tconst buffer = Bytes.view(data);\n\treturn {\n\t\tsize: buffer.readUInt16BE(offset),\n\t\ttype: buffer[offset + 2],\n\t\tversion: `${buffer[offset + 3]}.${buffer[offset + 4]}`,\n\t};\n}\n\nexport function encodeNVMModuleDescriptor(\n\tdescriptior: NVMModuleDescriptor,\n): Bytes {\n\tconst ret = new Bytes(5);\n\tret.writeUInt16BE(descriptior.size, 0);\n\tret[2] = descriptior.type;\n\tconst versionParts = descriptior.version.split(\".\").map((i) => parseInt(i));\n\tret[3] = versionParts[0];\n\tret[4] = versionParts[1];\n\treturn ret;\n}\n\nexport interface NVM500NodeInfo\n\textends Omit<NodeProtocolInfo, \"hasSpecificDeviceClass\">\n{\n\tgenericDeviceClass: number;\n\tspecificDeviceClass: number | null;\n}\n\nexport function parseNVM500NodeInfo(\n\tbuffer: Uint8Array,\n\toffset: number,\n): NVM500NodeInfo {\n\tconst { hasSpecificDeviceClass, ...protocolInfo } = parseNodeProtocolInfo(\n\t\tbuffer,\n\t\toffset,\n\t);\n\tconst genericDeviceClass = buffer[offset + 3];\n\tconst specificDeviceClass = hasSpecificDeviceClass\n\t\t? buffer[offset + 4]\n\t\t: null;\n\treturn {\n\t\t...protocolInfo,\n\t\tgenericDeviceClass,\n\t\tspecificDeviceClass,\n\t};\n}\n\nexport function encodeNVM500NodeInfo(nodeInfo: NVM500NodeInfo): Bytes {\n\treturn Bytes.concat([\n\t\tencodeNodeProtocolInfo({\n\t\t\t...nodeInfo,\n\t\t\thasSpecificDeviceClass: !!nodeInfo.specificDeviceClass,\n\t\t}),\n\t\tBytes.from([\n\t\t\tnodeInfo.genericDeviceClass,\n\t\t\tnodeInfo.specificDeviceClass ?? 0,\n\t\t]),\n\t]);\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;AAAA,kBAIO;AACP,IAAAA,eAAsB;AAYhB,SAAU,mBACf,MACA,SAAiB,GAAC;AAElB,QAAM,SAAS,mBAAM,KAAK,IAAI;AAC9B,SAAO;IACN,gBAAgB,OAAO,aAAa,MAAM;IAC1C,YAAY,OAAO,aAAa,SAAS,CAAC;IAC1C,aAAa,OAAO,aAAa,SAAS,CAAC;IAC3C,WAAW,OAAO,aAAa,SAAS,CAAC;IACzC,iBAAiB,GAAG,OAAO,SAAS,CAAC,CAAC,IAAI,OAAO,SAAS,CAAC,CAAC;;IAE5D,iBAAiB,GAAG,OAAO,SAAS,EAAE,CAAC,IACtC,OAAO,SAAS,EAAE,EAAE,SAAQ,EAAG,SAC9B,GACA,GAAG,CAEL;;AAEF;AAEM,SAAU,oBAAoB,YAAyB;AAC5D,QAAM,MAAM,IAAI,mBAAM,EAAE;AACxB,MAAI,cAAc,WAAW,gBAAgB,CAAC;AAC9C,MAAI,cAAc,WAAW,YAAY,CAAC;AAC1C,MAAI,cAAc,WAAW,aAAa,CAAC;AAC3C,MAAI,cAAc,WAAW,WAAW,CAAC;AACzC,QAAM,iBAAiB,WAAW,gBAChC,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;AACxB,MAAI,CAAC,IAAI,eAAe,CAAC;AACzB,MAAI,CAAC,IAAI,eAAe,CAAC;AACzB,QAAM,uBAAuB,WAAW,gBACtC,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;AACxB,MAAI,EAAE,IAAI,qBAAqB,CAAC;AAChC,MAAI,EAAE,IAAI,qBAAqB,CAAC;AAChC,SAAO;AACR;AAQM,SAAU,yBACf,MACA,SAAiB,GAAC;AAElB,QAAM,SAAS,mBAAM,KAAK,IAAI;AAC9B,SAAO;IACN,MAAM,OAAO,aAAa,MAAM;IAChC,MAAM,OAAO,SAAS,CAAC;IACvB,SAAS,GAAG,OAAO,SAAS,CAAC,CAAC,IAAI,OAAO,SAAS,CAAC,CAAC;;AAEtD;AAEM,SAAU,0BACf,aAAgC;AAEhC,QAAM,MAAM,IAAI,mBAAM,CAAC;AACvB,MAAI,cAAc,YAAY,MAAM,CAAC;AACrC,MAAI,CAAC,IAAI,YAAY;AACrB,QAAM,eAAe,YAAY,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;AAC1E,MAAI,CAAC,IAAI,aAAa,CAAC;AACvB,MAAI,CAAC,IAAI,aAAa,CAAC;AACvB,SAAO;AACR;AASM,SAAU,oBACf,QACA,QAAc;AAEd,QAAM,EAAE,wBAAwB,GAAG,aAAY,QAAK,mCACnD,QACA,MAAM;AAEP,QAAM,qBAAqB,OAAO,SAAS,CAAC;AAC5C,QAAM,sBAAsB,yBACzB,OAAO,SAAS,CAAC,IACjB;AACH,SAAO;IACN,GAAG;IACH;IACA;;AAEF;AAEM,SAAU,qBAAqB,UAAwB;AAC5D,SAAO,mBAAM,OAAO;QACnB,oCAAuB;MACtB,GAAG;MACH,wBAAwB,CAAC,CAAC,SAAS;KACnC;IACD,mBAAM,KAAK;MACV,SAAS;MACT,SAAS,uBAAuB;KAChC;GACD;AACF;",
6
6
  "names": ["import_safe"]
7
7
  }
@@ -23,7 +23,7 @@ __export(adapter_exports, {
23
23
  module.exports = __toCommonJS(adapter_exports);
24
24
  var import_core = require("@zwave-js/core");
25
25
  var import_shared = require("@zwave-js/shared");
26
- var import_helpers = require("alcalzone-shared/helpers/index.js");
26
+ var import_helpers = require("alcalzone-shared/helpers");
27
27
  var import_consts = require("../../consts.js");
28
28
  var import_shared2 = require("./shared.js");
29
29
  class NVM500Adapter {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/lib/nvm500/adapter.ts"],
4
- "sourcesContent": ["import {\n\ttype CommandClasses,\n\tZWaveError,\n\tZWaveErrorCodes,\n} from \"@zwave-js/core\";\nimport { Bytes } from \"@zwave-js/shared\";\nimport { assertNever } from \"alcalzone-shared/helpers/index.js\";\nimport { SUC_MAX_UPDATES } from \"../../consts.js\";\nimport { type NVM500, type NVM500Info } from \"../NVM500.js\";\nimport {\n\ttype ControllerNVMProperty,\n\ttype NVMAdapter,\n\ttype NVMProperty,\n\ttype NVMPropertyToDataType,\n\ttype NodeNVMProperty,\n} from \"../common/definitions.js\";\nimport { type Route } from \"../common/routeCache.js\";\nimport { type SUCUpdateEntry } from \"../common/sucUpdateEntry.js\";\nimport { type NodeInfo } from \"../nvm3/files/index.js\";\nimport { type NVM500NodeInfo } from \"./EntryParsers.js\";\nimport {\n\tAPPL_NODEPARM_MAX,\n\ttype NVMData,\n\ttype NVMEntryName,\n\tNVM_SERIALAPI_HOST_SIZE,\n} from \"./shared.js\";\n\nexport class NVM500Adapter implements NVMAdapter {\n\tpublic constructor(nvm: NVM500) {\n\t\tthis._nvm = nvm;\n\t}\n\n\tprivate _nvm: NVM500;\n\n\tpublic async get<T extends NVMProperty, R extends boolean = boolean>(\n\t\tproperty: T,\n\t\trequired?: R,\n\t): Promise<\n\t\tR extends true ? NonNullable<NVMPropertyToDataType<T>>\n\t\t\t: (NVMPropertyToDataType<T> | undefined)\n\t> {\n\t\tconst info = this._nvm.info ?? await this._nvm.init();\n\n\t\tlet ret: unknown;\n\t\tif (property.domain === \"controller\") {\n\t\t\tret = await this.getControllerNVMProperty(info, property);\n\t\t} else if (property.domain === \"lrnode\") {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`500 series NVM has no support for Long Range node information`,\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t} else {\n\t\t\tret = await this.getNodeNVMProperty(property);\n\t\t}\n\t\tif (required && ret === undefined) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`NVM data for property ${JSON.stringify(property)} not found`,\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t}\n\t\treturn ret as any;\n\t}\n\n\tprivate async getOnly<T extends NVMData>(\n\t\tproperty: NVMEntryName,\n\t): Promise<T | undefined> {\n\t\tconst data = await this._nvm.get(property);\n\t\treturn data?.[0] as T | undefined;\n\t}\n\n\tprivate async getSingle<T extends NVMData>(\n\t\tproperty: NVMEntryName,\n\t\tindex: number,\n\t): Promise<T | undefined> {\n\t\tconst data = await this._nvm.getSingle(property, index);\n\t\treturn data as T | undefined;\n\t}\n\n\tprivate getAll<T extends NVMData>(\n\t\tproperty: NVMEntryName,\n\t): Promise<T[] | undefined> {\n\t\treturn this._nvm.get(property) as any;\n\t}\n\n\tprivate async getControllerNVMProperty(\n\t\tinfo: NVM500Info,\n\t\tproperty: ControllerNVMProperty,\n\t): Promise<unknown> {\n\t\tswitch (property.type) {\n\t\t\tcase \"protocolVersion\":\n\t\t\t\treturn info.nvmDescriptor.protocolVersion;\n\t\t\tcase \"applicationVersion\":\n\t\t\t\treturn info.nvmDescriptor.firmwareVersion;\n\n\t\t\tcase \"protocolFileFormat\":\n\t\t\tcase \"applicationFileFormat\":\n\t\t\t\t// Not supported in 500 series, but we use 500 in JSON to designate a 500 series NVM\n\t\t\t\treturn 500;\n\n\t\t\tcase \"applicationData\":\n\t\t\t\treturn this.getOnly<Uint8Array>(\n\t\t\t\t\t\"EEOFFSET_HOST_OFFSET_START_far\",\n\t\t\t\t);\n\n\t\t\tcase \"applicationName\":\n\t\t\t\t// Not supported in 500 series\n\t\t\t\treturn;\n\n\t\t\tcase \"homeId\": {\n\t\t\t\t// 500 series stores the home ID as a number\n\t\t\t\tconst homeId = await this.getOnly<number>(\n\t\t\t\t\t\"EX_NVM_HOME_ID_far\",\n\t\t\t\t);\n\t\t\t\tif (homeId == undefined) return;\n\t\t\t\tconst ret = new Bytes(4).fill(0);\n\t\t\t\t// FIXME: BE? LE?\n\t\t\t\tret.writeUInt32BE(homeId, 0);\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\tcase \"learnedHomeId\": {\n\t\t\t\t// 500 series stores the home ID as a number\n\t\t\t\tconst homeId = await this.getOnly<number>(\"NVM_HOMEID_far\");\n\t\t\t\tif (homeId == undefined) return;\n\t\t\t\tconst ret = new Bytes(4).fill(0);\n\t\t\t\t// FIXME: BE? LE?\n\t\t\t\tret.writeUInt32BE(homeId, 0);\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\tcase \"nodeId\":\n\t\t\t\treturn this.getOnly<number>(\"NVM_NODEID_far\");\n\n\t\t\tcase \"lastNodeId\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EX_NVM_LAST_USED_NODE_ID_START_far\",\n\t\t\t\t);\n\n\t\t\tcase \"staticControllerNodeId\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EX_NVM_STATIC_CONTROLLER_NODE_ID_START_far\",\n\t\t\t\t);\n\t\t\tcase \"sucLastIndex\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EX_NVM_SUC_LAST_INDEX_START_far\",\n\t\t\t\t);\n\t\t\tcase \"controllerConfiguration\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EX_NVM_CONTROLLER_CONFIGURATION_far\",\n\t\t\t\t);\n\n\t\t\tcase \"maxNodeId\":\n\t\t\t\treturn this.getOnly<number>(\"EX_NVM_MAX_NODE_ID_far\");\n\t\t\tcase \"reservedId\":\n\t\t\t\treturn this.getOnly<number>(\"EX_NVM_RESERVED_ID_far\");\n\t\t\tcase \"systemState\":\n\t\t\t\treturn this.getOnly<number>(\"NVM_SYSTEM_STATE\");\n\n\t\t\tcase \"commandClasses\": {\n\t\t\t\tconst numCCs = await this.getOnly<number>(\n\t\t\t\t\t\"EEOFFSET_CMDCLASS_LEN_far\",\n\t\t\t\t);\n\t\t\t\tconst ret = await this.getAll<CommandClasses>(\n\t\t\t\t\t\"EEOFFSET_CMDCLASS_far\",\n\t\t\t\t);\n\t\t\t\treturn ret?.slice(0, numCCs);\n\t\t\t}\n\n\t\t\tcase \"preferredRepeaters\":\n\t\t\t\treturn this.getOnly<number[]>(\"NVM_PREFERRED_REPEATERS_far\");\n\n\t\t\tcase \"appRouteLock\": {\n\t\t\t\treturn this.getOnly<number[]>(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_APP_LOCK_far\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\treturn this.getOnly<number[]>(\n\t\t\t\t\t\"EX_NVM_SUC_ROUTING_SLAVE_LIST_START_far\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\treturn this.getOnly<number[]>(\"EX_NVM_PENDING_UPDATE_far\");\n\t\t\t}\n\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\treturn this.getOnly<number[]>(\"NVM_PENDING_DISCOVERY_far\");\n\t\t\t}\n\n\t\t\tcase \"nodeIds\": {\n\t\t\t\tconst nodeInfos = await this.getAll<NVM500NodeInfo>(\n\t\t\t\t\t\"EX_NVM_NODE_TABLE_START_far\",\n\t\t\t\t);\n\t\t\t\treturn nodeInfos\n\t\t\t\t\t?.map((info, index) => info ? (index + 1) : undefined)\n\t\t\t\t\t.filter((id) => id != undefined);\n\t\t\t}\n\n\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\tconst ret = await this.getOnly<number[]>(\n\t\t\t\t\t\"EX_NVM_BRIDGE_NODEPOOL_START_far\",\n\t\t\t\t);\n\t\t\t\treturn ret ?? [];\n\t\t\t}\n\n\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\tconst ret = await this.getAll<SUCUpdateEntry>(\n\t\t\t\t\t\"EX_NVM_SUC_NODE_LIST_START_far\",\n\t\t\t\t);\n\t\t\t\treturn ret?.filter(Boolean);\n\t\t\t}\n\n\t\t\tcase \"watchdogStarted\":\n\t\t\t\treturn this.getOnly<number>(\"EEOFFSET_WATCHDOG_STARTED_far\");\n\n\t\t\tcase \"powerLevelNormal\":\n\t\t\t\treturn this.getAll<number>(\n\t\t\t\t\t\"EEOFFSET_POWERLEVEL_NORMAL_far\",\n\t\t\t\t);\n\t\t\tcase \"powerLevelLow\":\n\t\t\t\treturn this.getAll<number>(\n\t\t\t\t\t\"EEOFFSET_POWERLEVEL_LOW_far\",\n\t\t\t\t);\n\t\t\tcase \"powerMode\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_far\",\n\t\t\t\t);\n\t\t\tcase \"powerModeExtintEnable\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_EXTINT_ENABLE_far\",\n\t\t\t\t);\n\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_WUT_TIMEOUT_far\",\n\t\t\t\t);\n\n\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\tcase \"lastNodeIdLR\":\n\t\t\tcase \"maxNodeIdLR\":\n\t\t\tcase \"reservedIdLR\":\n\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\tcase \"dcdcConfig\":\n\t\t\tcase \"lrNodeIds\":\n\t\t\tcase \"includedInsecurely\":\n\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\tcase \"includedSecurelySecureCCs\":\n\t\t\tcase \"rfRegion\":\n\t\t\tcase \"txPower\":\n\t\t\tcase \"measured0dBm\":\n\t\t\tcase \"enablePTI\":\n\t\t\tcase \"maxTXPower\":\n\t\t\tcase \"nodeIdType\":\n\t\t\tcase \"isListening\":\n\t\t\tcase \"optionalFunctionality\":\n\t\t\tcase \"genericDeviceClass\":\n\t\t\tcase \"specificDeviceClass\":\n\t\t\t\t// Not supported on 500 series, 700+ series only\n\t\t\t\treturn;\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tprivate async getNodeNVMProperty(\n\t\tproperty: NodeNVMProperty,\n\t): Promise<unknown> {\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tconst nodeId = property.nodeId;\n\t\t\t\tconst nodeInfo = await this.getSingle<NVM500NodeInfo>(\n\t\t\t\t\t\"EX_NVM_NODE_TABLE_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t);\n\t\t\t\tconst sucUpdateIndex = await this.getSingle<number>(\n\t\t\t\t\t\"EX_NVM_SUC_CONTROLLER_LIST_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t) ?? 0xff;\n\t\t\t\tconst neighbors = await this.getSingle<number[]>(\n\t\t\t\t\t\"EX_NVM_ROUTING_TABLE_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t) ?? [];\n\n\t\t\t\tif (!nodeInfo) return;\n\n\t\t\t\treturn {\n\t\t\t\t\tnodeId,\n\t\t\t\t\t...nodeInfo,\n\t\t\t\t\tneighbors,\n\t\t\t\t\tsucUpdateIndex,\n\t\t\t\t} satisfies NodeInfo;\n\t\t\t}\n\n\t\t\tcase \"routes\": {\n\t\t\t\tconst lwr = await this.getSingle<Route>(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_START_far\",\n\t\t\t\t\tproperty.nodeId - 1,\n\t\t\t\t);\n\t\t\t\tconst nlwr = await this.getSingle<Route>(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_NLWR_SR_START_far\",\n\t\t\t\t\tproperty.nodeId - 1,\n\t\t\t\t);\n\t\t\t\treturn { lwr, nlwr };\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate setOnly(\n\t\tproperty: NVMEntryName,\n\t\tvalue: NVMData,\n\t): Promise<void> {\n\t\treturn this._nvm.set(property, [value]);\n\t}\n\n\tprivate setSingle(\n\t\tproperty: NVMEntryName,\n\t\tindex: number,\n\t\tvalue: NVMData,\n\t): Promise<void> {\n\t\treturn this._nvm.setSingle(property, index, value);\n\t}\n\n\tprivate setAll(\n\t\tproperty: NVMEntryName,\n\t\tvalue: NVMData[],\n\t): Promise<void> {\n\t\treturn this._nvm.set(property, value);\n\t}\n\n\tset<T extends NVMProperty>(\n\t\tproperty: T,\n\t\tvalue: NVMPropertyToDataType<T>,\n\t): Promise<void> {\n\t\tif (property.domain === \"controller\") {\n\t\t\treturn this.setControllerNVMProperty(property, value);\n\t\t} else if (property.domain === \"lrnode\") {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`500 series NVM has no support for Long Range node information`,\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t} else {\n\t\t\treturn this.setNodeNVMProperty(property, value);\n\t\t}\n\t}\n\n\tprivate async setControllerNVMProperty(\n\t\tproperty: ControllerNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tswitch (property.type) {\n\t\t\tcase \"protocolVersion\":\n\t\t\tcase \"applicationVersion\":\n\t\t\t\t// Only written during erase\n\t\t\t\treturn;\n\n\t\t\tcase \"protocolFileFormat\":\n\t\t\tcase \"applicationFileFormat\":\n\t\t\t\t// Cannot be written\n\t\t\t\treturn;\n\n\t\t\tcase \"applicationData\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EEOFFSET_HOST_OFFSET_START_far\",\n\t\t\t\t\tvalue ?? new Bytes(NVM_SERIALAPI_HOST_SIZE).fill(0xff),\n\t\t\t\t);\n\n\t\t\tcase \"applicationName\":\n\t\t\t\t// Not supported in 500 series\n\t\t\t\treturn;\n\n\t\t\tcase \"homeId\": {\n\t\t\t\t// 500 series stores the home ID as a number\n\t\t\t\tconst homeId = value.readUInt32BE(0);\n\t\t\t\treturn this.setOnly(\"EX_NVM_HOME_ID_far\", homeId);\n\t\t\t}\n\n\t\t\tcase \"learnedHomeId\": {\n\t\t\t\t// 500 series stores the home ID as a number\n\t\t\t\tconst learnedHomeId = value?.readUInt32BE(0) ?? 0x00000000;\n\t\t\t\treturn this.setOnly(\"NVM_HOMEID_far\", learnedHomeId);\n\t\t\t}\n\n\t\t\tcase \"nodeId\":\n\t\t\t\treturn this.setOnly(\"NVM_NODEID_far\", value);\n\n\t\t\tcase \"lastNodeId\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_LAST_USED_NODE_ID_START_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\n\t\t\tcase \"staticControllerNodeId\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_STATIC_CONTROLLER_NODE_ID_START_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"sucLastIndex\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_SUC_LAST_INDEX_START_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"controllerConfiguration\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_CONTROLLER_CONFIGURATION_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\n\t\t\tcase \"maxNodeId\":\n\t\t\t\treturn this.setOnly(\"EX_NVM_MAX_NODE_ID_far\", value);\n\t\t\tcase \"reservedId\":\n\t\t\t\treturn this.setOnly(\"EX_NVM_RESERVED_ID_far\", value);\n\t\t\tcase \"systemState\":\n\t\t\t\treturn this.setOnly(\"NVM_SYSTEM_STATE\", value);\n\n\t\t\tcase \"commandClasses\": {\n\t\t\t\tawait this.setOnly(\n\t\t\t\t\t\"EEOFFSET_CMDCLASS_LEN_far\",\n\t\t\t\t\tvalue.length,\n\t\t\t\t);\n\t\t\t\tconst CCs = new Array(APPL_NODEPARM_MAX).fill(0xff);\n\t\t\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\t\t\tif (i < APPL_NODEPARM_MAX) {\n\t\t\t\t\t\tCCs[i] = value[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait this.setAll(\n\t\t\t\t\t\"EEOFFSET_CMDCLASS_far\",\n\t\t\t\t\tCCs,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase \"preferredRepeaters\":\n\t\t\t\treturn this.setOnly(\"NVM_PREFERRED_REPEATERS_far\", value);\n\n\t\t\tcase \"appRouteLock\": {\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_APP_LOCK_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_SUC_ROUTING_SLAVE_LIST_START_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\treturn this.setOnly(\"EX_NVM_PENDING_UPDATE_far\", value);\n\t\t\t}\n\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\treturn this.setOnly(\"NVM_PENDING_DISCOVERY_far\", value);\n\t\t\t}\n\n\t\t\tcase \"nodeIds\":\n\t\t\t\t// Cannot be written. Is implied by the node info table\n\t\t\t\treturn;\n\n\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_BRIDGE_NODEPOOL_START_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\tconst entries = value as SUCUpdateEntry[];\n\t\t\t\tconst sucUpdateEntries = new Array(SUC_MAX_UPDATES).fill(\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tfor (let i = 0; i < entries.length; i++) {\n\t\t\t\t\tif (i < SUC_MAX_UPDATES) {\n\t\t\t\t\t\tsucUpdateEntries[i] = entries[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this.setAll(\n\t\t\t\t\t\"EX_NVM_SUC_NODE_LIST_START_far\",\n\t\t\t\t\tsucUpdateEntries,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcase \"watchdogStarted\":\n\t\t\t\treturn this.setOnly(\"EEOFFSET_WATCHDOG_STARTED_far\", value);\n\n\t\t\tcase \"powerLevelNormal\":\n\t\t\t\treturn this.setAll(\n\t\t\t\t\t\"EEOFFSET_POWERLEVEL_NORMAL_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"powerLevelLow\":\n\t\t\t\treturn this.setAll(\n\t\t\t\t\t\"EEOFFSET_POWERLEVEL_LOW_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"powerMode\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"powerModeExtintEnable\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_EXTINT_ENABLE_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_WUT_TIMEOUT_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\n\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\tcase \"lastNodeIdLR\":\n\t\t\tcase \"maxNodeIdLR\":\n\t\t\tcase \"reservedIdLR\":\n\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\tcase \"dcdcConfig\":\n\t\t\tcase \"lrNodeIds\":\n\t\t\tcase \"includedInsecurely\":\n\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\tcase \"includedSecurelySecureCCs\":\n\t\t\tcase \"rfRegion\":\n\t\t\tcase \"txPower\":\n\t\t\tcase \"measured0dBm\":\n\t\t\tcase \"enablePTI\":\n\t\t\tcase \"maxTXPower\":\n\t\t\tcase \"nodeIdType\":\n\t\t\tcase \"isListening\":\n\t\t\tcase \"optionalFunctionality\":\n\t\t\tcase \"genericDeviceClass\":\n\t\t\tcase \"specificDeviceClass\":\n\t\t\t\t// Not supported on 500 series, 700+ series only\n\t\t\t\treturn;\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tprivate async setNodeNVMProperty(\n\t\tproperty: NodeNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tconst nodeId = property.nodeId;\n\t\t\t\tconst node = value as NodeInfo;\n\t\t\t\tawait this.setSingle(\n\t\t\t\t\t\"EX_NVM_NODE_TABLE_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t\tnode\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\tisListening: node.isListening,\n\t\t\t\t\t\t\tisFrequentListening: node.isFrequentListening,\n\t\t\t\t\t\t\tisRouting: node.isRouting,\n\t\t\t\t\t\t\tsupportedDataRates: node.supportedDataRates,\n\t\t\t\t\t\t\tprotocolVersion: node.protocolVersion,\n\t\t\t\t\t\t\toptionalFunctionality: node.optionalFunctionality,\n\t\t\t\t\t\t\tnodeType: node.nodeType,\n\t\t\t\t\t\t\tsupportsSecurity: node.supportsSecurity,\n\t\t\t\t\t\t\tsupportsBeaming: node.supportsBeaming,\n\t\t\t\t\t\t\tgenericDeviceClass: node.genericDeviceClass,\n\t\t\t\t\t\t\tspecificDeviceClass: node.specificDeviceClass\n\t\t\t\t\t\t\t\t?? null,\n\t\t\t\t\t\t} satisfies NVM500NodeInfo\n\t\t\t\t\t\t: undefined,\n\t\t\t\t);\n\t\t\t\tawait this.setSingle(\n\t\t\t\t\t\"EX_NVM_SUC_CONTROLLER_LIST_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t\tnode?.sucUpdateIndex ?? 0xfe,\n\t\t\t\t);\n\t\t\t\tawait this.setSingle(\n\t\t\t\t\t\"EX_NVM_ROUTING_TABLE_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t\tnode?.neighbors,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcase \"routes\": {\n\t\t\t\tconst nodeId = property.nodeId;\n\t\t\t\tconst routes = value as { lwr?: Route; nlwr?: Route };\n\t\t\t\tawait this.setSingle(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t\troutes.lwr,\n\t\t\t\t);\n\t\t\t\tawait this.setSingle(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_NLWR_SR_START_far\",\n\t\t\t\t\tproperty.nodeId - 1,\n\t\t\t\t\troutes.nlwr,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/require-await\n\tpublic async delete(_property: NVMProperty): Promise<void> {\n\t\tthrow new Error(\"Method not implemented.\");\n\t}\n\n\tpublic hasPendingChanges(): boolean {\n\t\t// We don't buffer changes\n\t\treturn false;\n\t}\n\n\tpublic async commit(): Promise<void> {\n\t\t// We don't buffer changes at the moment\n\t}\n}\n"],
4
+ "sourcesContent": ["import {\n\ttype CommandClasses,\n\tZWaveError,\n\tZWaveErrorCodes,\n} from \"@zwave-js/core\";\nimport { Bytes } from \"@zwave-js/shared\";\nimport { assertNever } from \"alcalzone-shared/helpers\";\nimport { SUC_MAX_UPDATES } from \"../../consts.js\";\nimport { type NVM500, type NVM500Info } from \"../NVM500.js\";\nimport {\n\ttype ControllerNVMProperty,\n\ttype NVMAdapter,\n\ttype NVMProperty,\n\ttype NVMPropertyToDataType,\n\ttype NodeNVMProperty,\n} from \"../common/definitions.js\";\nimport { type Route } from \"../common/routeCache.js\";\nimport { type SUCUpdateEntry } from \"../common/sucUpdateEntry.js\";\nimport { type NodeInfo } from \"../nvm3/files/index.js\";\nimport { type NVM500NodeInfo } from \"./EntryParsers.js\";\nimport {\n\tAPPL_NODEPARM_MAX,\n\ttype NVMData,\n\ttype NVMEntryName,\n\tNVM_SERIALAPI_HOST_SIZE,\n} from \"./shared.js\";\n\nexport class NVM500Adapter implements NVMAdapter {\n\tpublic constructor(nvm: NVM500) {\n\t\tthis._nvm = nvm;\n\t}\n\n\tprivate _nvm: NVM500;\n\n\tpublic async get<T extends NVMProperty, R extends boolean = boolean>(\n\t\tproperty: T,\n\t\trequired?: R,\n\t): Promise<\n\t\tR extends true ? NonNullable<NVMPropertyToDataType<T>>\n\t\t\t: (NVMPropertyToDataType<T> | undefined)\n\t> {\n\t\tconst info = this._nvm.info ?? await this._nvm.init();\n\n\t\tlet ret: unknown;\n\t\tif (property.domain === \"controller\") {\n\t\t\tret = await this.getControllerNVMProperty(info, property);\n\t\t} else if (property.domain === \"lrnode\") {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`500 series NVM has no support for Long Range node information`,\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t} else {\n\t\t\tret = await this.getNodeNVMProperty(property);\n\t\t}\n\t\tif (required && ret === undefined) {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`NVM data for property ${JSON.stringify(property)} not found`,\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t}\n\t\treturn ret as any;\n\t}\n\n\tprivate async getOnly<T extends NVMData>(\n\t\tproperty: NVMEntryName,\n\t): Promise<T | undefined> {\n\t\tconst data = await this._nvm.get(property);\n\t\treturn data?.[0] as T | undefined;\n\t}\n\n\tprivate async getSingle<T extends NVMData>(\n\t\tproperty: NVMEntryName,\n\t\tindex: number,\n\t): Promise<T | undefined> {\n\t\tconst data = await this._nvm.getSingle(property, index);\n\t\treturn data as T | undefined;\n\t}\n\n\tprivate getAll<T extends NVMData>(\n\t\tproperty: NVMEntryName,\n\t): Promise<T[] | undefined> {\n\t\treturn this._nvm.get(property) as any;\n\t}\n\n\tprivate async getControllerNVMProperty(\n\t\tinfo: NVM500Info,\n\t\tproperty: ControllerNVMProperty,\n\t): Promise<unknown> {\n\t\tswitch (property.type) {\n\t\t\tcase \"protocolVersion\":\n\t\t\t\treturn info.nvmDescriptor.protocolVersion;\n\t\t\tcase \"applicationVersion\":\n\t\t\t\treturn info.nvmDescriptor.firmwareVersion;\n\n\t\t\tcase \"protocolFileFormat\":\n\t\t\tcase \"applicationFileFormat\":\n\t\t\t\t// Not supported in 500 series, but we use 500 in JSON to designate a 500 series NVM\n\t\t\t\treturn 500;\n\n\t\t\tcase \"applicationData\":\n\t\t\t\treturn this.getOnly<Uint8Array>(\n\t\t\t\t\t\"EEOFFSET_HOST_OFFSET_START_far\",\n\t\t\t\t);\n\n\t\t\tcase \"applicationName\":\n\t\t\t\t// Not supported in 500 series\n\t\t\t\treturn;\n\n\t\t\tcase \"homeId\": {\n\t\t\t\t// 500 series stores the home ID as a number\n\t\t\t\tconst homeId = await this.getOnly<number>(\n\t\t\t\t\t\"EX_NVM_HOME_ID_far\",\n\t\t\t\t);\n\t\t\t\tif (homeId == undefined) return;\n\t\t\t\tconst ret = new Bytes(4).fill(0);\n\t\t\t\t// FIXME: BE? LE?\n\t\t\t\tret.writeUInt32BE(homeId, 0);\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\tcase \"learnedHomeId\": {\n\t\t\t\t// 500 series stores the home ID as a number\n\t\t\t\tconst homeId = await this.getOnly<number>(\"NVM_HOMEID_far\");\n\t\t\t\tif (homeId == undefined) return;\n\t\t\t\tconst ret = new Bytes(4).fill(0);\n\t\t\t\t// FIXME: BE? LE?\n\t\t\t\tret.writeUInt32BE(homeId, 0);\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\tcase \"nodeId\":\n\t\t\t\treturn this.getOnly<number>(\"NVM_NODEID_far\");\n\n\t\t\tcase \"lastNodeId\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EX_NVM_LAST_USED_NODE_ID_START_far\",\n\t\t\t\t);\n\n\t\t\tcase \"staticControllerNodeId\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EX_NVM_STATIC_CONTROLLER_NODE_ID_START_far\",\n\t\t\t\t);\n\t\t\tcase \"sucLastIndex\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EX_NVM_SUC_LAST_INDEX_START_far\",\n\t\t\t\t);\n\t\t\tcase \"controllerConfiguration\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EX_NVM_CONTROLLER_CONFIGURATION_far\",\n\t\t\t\t);\n\n\t\t\tcase \"maxNodeId\":\n\t\t\t\treturn this.getOnly<number>(\"EX_NVM_MAX_NODE_ID_far\");\n\t\t\tcase \"reservedId\":\n\t\t\t\treturn this.getOnly<number>(\"EX_NVM_RESERVED_ID_far\");\n\t\t\tcase \"systemState\":\n\t\t\t\treturn this.getOnly<number>(\"NVM_SYSTEM_STATE\");\n\n\t\t\tcase \"commandClasses\": {\n\t\t\t\tconst numCCs = await this.getOnly<number>(\n\t\t\t\t\t\"EEOFFSET_CMDCLASS_LEN_far\",\n\t\t\t\t);\n\t\t\t\tconst ret = await this.getAll<CommandClasses>(\n\t\t\t\t\t\"EEOFFSET_CMDCLASS_far\",\n\t\t\t\t);\n\t\t\t\treturn ret?.slice(0, numCCs);\n\t\t\t}\n\n\t\t\tcase \"preferredRepeaters\":\n\t\t\t\treturn this.getOnly<number[]>(\"NVM_PREFERRED_REPEATERS_far\");\n\n\t\t\tcase \"appRouteLock\": {\n\t\t\t\treturn this.getOnly<number[]>(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_APP_LOCK_far\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\treturn this.getOnly<number[]>(\n\t\t\t\t\t\"EX_NVM_SUC_ROUTING_SLAVE_LIST_START_far\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\treturn this.getOnly<number[]>(\"EX_NVM_PENDING_UPDATE_far\");\n\t\t\t}\n\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\treturn this.getOnly<number[]>(\"NVM_PENDING_DISCOVERY_far\");\n\t\t\t}\n\n\t\t\tcase \"nodeIds\": {\n\t\t\t\tconst nodeInfos = await this.getAll<NVM500NodeInfo>(\n\t\t\t\t\t\"EX_NVM_NODE_TABLE_START_far\",\n\t\t\t\t);\n\t\t\t\treturn nodeInfos\n\t\t\t\t\t?.map((info, index) => info ? (index + 1) : undefined)\n\t\t\t\t\t.filter((id) => id != undefined);\n\t\t\t}\n\n\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\tconst ret = await this.getOnly<number[]>(\n\t\t\t\t\t\"EX_NVM_BRIDGE_NODEPOOL_START_far\",\n\t\t\t\t);\n\t\t\t\treturn ret ?? [];\n\t\t\t}\n\n\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\tconst ret = await this.getAll<SUCUpdateEntry>(\n\t\t\t\t\t\"EX_NVM_SUC_NODE_LIST_START_far\",\n\t\t\t\t);\n\t\t\t\treturn ret?.filter(Boolean);\n\t\t\t}\n\n\t\t\tcase \"watchdogStarted\":\n\t\t\t\treturn this.getOnly<number>(\"EEOFFSET_WATCHDOG_STARTED_far\");\n\n\t\t\tcase \"powerLevelNormal\":\n\t\t\t\treturn this.getAll<number>(\n\t\t\t\t\t\"EEOFFSET_POWERLEVEL_NORMAL_far\",\n\t\t\t\t);\n\t\t\tcase \"powerLevelLow\":\n\t\t\t\treturn this.getAll<number>(\n\t\t\t\t\t\"EEOFFSET_POWERLEVEL_LOW_far\",\n\t\t\t\t);\n\t\t\tcase \"powerMode\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_far\",\n\t\t\t\t);\n\t\t\tcase \"powerModeExtintEnable\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_EXTINT_ENABLE_far\",\n\t\t\t\t);\n\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\treturn this.getOnly<number>(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_WUT_TIMEOUT_far\",\n\t\t\t\t);\n\n\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\tcase \"lastNodeIdLR\":\n\t\t\tcase \"maxNodeIdLR\":\n\t\t\tcase \"reservedIdLR\":\n\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\tcase \"dcdcConfig\":\n\t\t\tcase \"lrNodeIds\":\n\t\t\tcase \"includedInsecurely\":\n\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\tcase \"includedSecurelySecureCCs\":\n\t\t\tcase \"rfRegion\":\n\t\t\tcase \"txPower\":\n\t\t\tcase \"measured0dBm\":\n\t\t\tcase \"enablePTI\":\n\t\t\tcase \"maxTXPower\":\n\t\t\tcase \"nodeIdType\":\n\t\t\tcase \"isListening\":\n\t\t\tcase \"optionalFunctionality\":\n\t\t\tcase \"genericDeviceClass\":\n\t\t\tcase \"specificDeviceClass\":\n\t\t\t\t// Not supported on 500 series, 700+ series only\n\t\t\t\treturn;\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tprivate async getNodeNVMProperty(\n\t\tproperty: NodeNVMProperty,\n\t): Promise<unknown> {\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tconst nodeId = property.nodeId;\n\t\t\t\tconst nodeInfo = await this.getSingle<NVM500NodeInfo>(\n\t\t\t\t\t\"EX_NVM_NODE_TABLE_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t);\n\t\t\t\tconst sucUpdateIndex = await this.getSingle<number>(\n\t\t\t\t\t\"EX_NVM_SUC_CONTROLLER_LIST_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t) ?? 0xff;\n\t\t\t\tconst neighbors = await this.getSingle<number[]>(\n\t\t\t\t\t\"EX_NVM_ROUTING_TABLE_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t) ?? [];\n\n\t\t\t\tif (!nodeInfo) return;\n\n\t\t\t\treturn {\n\t\t\t\t\tnodeId,\n\t\t\t\t\t...nodeInfo,\n\t\t\t\t\tneighbors,\n\t\t\t\t\tsucUpdateIndex,\n\t\t\t\t} satisfies NodeInfo;\n\t\t\t}\n\n\t\t\tcase \"routes\": {\n\t\t\t\tconst lwr = await this.getSingle<Route>(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_START_far\",\n\t\t\t\t\tproperty.nodeId - 1,\n\t\t\t\t);\n\t\t\t\tconst nlwr = await this.getSingle<Route>(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_NLWR_SR_START_far\",\n\t\t\t\t\tproperty.nodeId - 1,\n\t\t\t\t);\n\t\t\t\treturn { lwr, nlwr };\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate setOnly(\n\t\tproperty: NVMEntryName,\n\t\tvalue: NVMData,\n\t): Promise<void> {\n\t\treturn this._nvm.set(property, [value]);\n\t}\n\n\tprivate setSingle(\n\t\tproperty: NVMEntryName,\n\t\tindex: number,\n\t\tvalue: NVMData,\n\t): Promise<void> {\n\t\treturn this._nvm.setSingle(property, index, value);\n\t}\n\n\tprivate setAll(\n\t\tproperty: NVMEntryName,\n\t\tvalue: NVMData[],\n\t): Promise<void> {\n\t\treturn this._nvm.set(property, value);\n\t}\n\n\tset<T extends NVMProperty>(\n\t\tproperty: T,\n\t\tvalue: NVMPropertyToDataType<T>,\n\t): Promise<void> {\n\t\tif (property.domain === \"controller\") {\n\t\t\treturn this.setControllerNVMProperty(property, value);\n\t\t} else if (property.domain === \"lrnode\") {\n\t\t\tthrow new ZWaveError(\n\t\t\t\t`500 series NVM has no support for Long Range node information`,\n\t\t\t\tZWaveErrorCodes.NVM_ObjectNotFound,\n\t\t\t);\n\t\t} else {\n\t\t\treturn this.setNodeNVMProperty(property, value);\n\t\t}\n\t}\n\n\tprivate async setControllerNVMProperty(\n\t\tproperty: ControllerNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tswitch (property.type) {\n\t\t\tcase \"protocolVersion\":\n\t\t\tcase \"applicationVersion\":\n\t\t\t\t// Only written during erase\n\t\t\t\treturn;\n\n\t\t\tcase \"protocolFileFormat\":\n\t\t\tcase \"applicationFileFormat\":\n\t\t\t\t// Cannot be written\n\t\t\t\treturn;\n\n\t\t\tcase \"applicationData\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EEOFFSET_HOST_OFFSET_START_far\",\n\t\t\t\t\tvalue ?? new Bytes(NVM_SERIALAPI_HOST_SIZE).fill(0xff),\n\t\t\t\t);\n\n\t\t\tcase \"applicationName\":\n\t\t\t\t// Not supported in 500 series\n\t\t\t\treturn;\n\n\t\t\tcase \"homeId\": {\n\t\t\t\t// 500 series stores the home ID as a number\n\t\t\t\tconst homeId = value.readUInt32BE(0);\n\t\t\t\treturn this.setOnly(\"EX_NVM_HOME_ID_far\", homeId);\n\t\t\t}\n\n\t\t\tcase \"learnedHomeId\": {\n\t\t\t\t// 500 series stores the home ID as a number\n\t\t\t\tconst learnedHomeId = value?.readUInt32BE(0) ?? 0x00000000;\n\t\t\t\treturn this.setOnly(\"NVM_HOMEID_far\", learnedHomeId);\n\t\t\t}\n\n\t\t\tcase \"nodeId\":\n\t\t\t\treturn this.setOnly(\"NVM_NODEID_far\", value);\n\n\t\t\tcase \"lastNodeId\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_LAST_USED_NODE_ID_START_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\n\t\t\tcase \"staticControllerNodeId\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_STATIC_CONTROLLER_NODE_ID_START_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"sucLastIndex\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_SUC_LAST_INDEX_START_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"controllerConfiguration\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_CONTROLLER_CONFIGURATION_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\n\t\t\tcase \"maxNodeId\":\n\t\t\t\treturn this.setOnly(\"EX_NVM_MAX_NODE_ID_far\", value);\n\t\t\tcase \"reservedId\":\n\t\t\t\treturn this.setOnly(\"EX_NVM_RESERVED_ID_far\", value);\n\t\t\tcase \"systemState\":\n\t\t\t\treturn this.setOnly(\"NVM_SYSTEM_STATE\", value);\n\n\t\t\tcase \"commandClasses\": {\n\t\t\t\tawait this.setOnly(\n\t\t\t\t\t\"EEOFFSET_CMDCLASS_LEN_far\",\n\t\t\t\t\tvalue.length,\n\t\t\t\t);\n\t\t\t\tconst CCs = new Array(APPL_NODEPARM_MAX).fill(0xff);\n\t\t\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\t\t\tif (i < APPL_NODEPARM_MAX) {\n\t\t\t\t\t\tCCs[i] = value[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tawait this.setAll(\n\t\t\t\t\t\"EEOFFSET_CMDCLASS_far\",\n\t\t\t\t\tCCs,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcase \"preferredRepeaters\":\n\t\t\t\treturn this.setOnly(\"NVM_PREFERRED_REPEATERS_far\", value);\n\n\t\t\tcase \"appRouteLock\": {\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_APP_LOCK_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"routeSlaveSUC\": {\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_SUC_ROUTING_SLAVE_LIST_START_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase \"sucPendingUpdate\": {\n\t\t\t\treturn this.setOnly(\"EX_NVM_PENDING_UPDATE_far\", value);\n\t\t\t}\n\t\t\tcase \"pendingDiscovery\": {\n\t\t\t\treturn this.setOnly(\"NVM_PENDING_DISCOVERY_far\", value);\n\t\t\t}\n\n\t\t\tcase \"nodeIds\":\n\t\t\t\t// Cannot be written. Is implied by the node info table\n\t\t\t\treturn;\n\n\t\t\tcase \"virtualNodeIds\": {\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EX_NVM_BRIDGE_NODEPOOL_START_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcase \"sucUpdateEntries\": {\n\t\t\t\tconst entries = value as SUCUpdateEntry[];\n\t\t\t\tconst sucUpdateEntries = new Array(SUC_MAX_UPDATES).fill(\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tfor (let i = 0; i < entries.length; i++) {\n\t\t\t\t\tif (i < SUC_MAX_UPDATES) {\n\t\t\t\t\t\tsucUpdateEntries[i] = entries[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this.setAll(\n\t\t\t\t\t\"EX_NVM_SUC_NODE_LIST_START_far\",\n\t\t\t\t\tsucUpdateEntries,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcase \"watchdogStarted\":\n\t\t\t\treturn this.setOnly(\"EEOFFSET_WATCHDOG_STARTED_far\", value);\n\n\t\t\tcase \"powerLevelNormal\":\n\t\t\t\treturn this.setAll(\n\t\t\t\t\t\"EEOFFSET_POWERLEVEL_NORMAL_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"powerLevelLow\":\n\t\t\t\treturn this.setAll(\n\t\t\t\t\t\"EEOFFSET_POWERLEVEL_LOW_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"powerMode\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"powerModeExtintEnable\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_EXTINT_ENABLE_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\t\t\tcase \"powerModeWutTimeout\":\n\t\t\t\treturn this.setOnly(\n\t\t\t\t\t\"EEOFFSET_MODULE_POWER_MODE_WUT_TIMEOUT_far\",\n\t\t\t\t\tvalue,\n\t\t\t\t);\n\n\t\t\tcase \"sucAwarenessPushNeeded\":\n\t\t\tcase \"lastNodeIdLR\":\n\t\t\tcase \"maxNodeIdLR\":\n\t\t\tcase \"reservedIdLR\":\n\t\t\tcase \"primaryLongRangeChannelId\":\n\t\t\tcase \"dcdcConfig\":\n\t\t\tcase \"lrNodeIds\":\n\t\t\tcase \"includedInsecurely\":\n\t\t\tcase \"includedSecurelyInsecureCCs\":\n\t\t\tcase \"includedSecurelySecureCCs\":\n\t\t\tcase \"rfRegion\":\n\t\t\tcase \"txPower\":\n\t\t\tcase \"measured0dBm\":\n\t\t\tcase \"enablePTI\":\n\t\t\tcase \"maxTXPower\":\n\t\t\tcase \"nodeIdType\":\n\t\t\tcase \"isListening\":\n\t\t\tcase \"optionalFunctionality\":\n\t\t\tcase \"genericDeviceClass\":\n\t\t\tcase \"specificDeviceClass\":\n\t\t\t\t// Not supported on 500 series, 700+ series only\n\t\t\t\treturn;\n\n\t\t\tdefault:\n\t\t\t\tassertNever(property.type);\n\t\t}\n\t}\n\n\tprivate async setNodeNVMProperty(\n\t\tproperty: NodeNVMProperty,\n\t\tvalue: any,\n\t): Promise<void> {\n\t\tswitch (property.type) {\n\t\t\tcase \"info\": {\n\t\t\t\tconst nodeId = property.nodeId;\n\t\t\t\tconst node = value as NodeInfo;\n\t\t\t\tawait this.setSingle(\n\t\t\t\t\t\"EX_NVM_NODE_TABLE_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t\tnode\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\tisListening: node.isListening,\n\t\t\t\t\t\t\tisFrequentListening: node.isFrequentListening,\n\t\t\t\t\t\t\tisRouting: node.isRouting,\n\t\t\t\t\t\t\tsupportedDataRates: node.supportedDataRates,\n\t\t\t\t\t\t\tprotocolVersion: node.protocolVersion,\n\t\t\t\t\t\t\toptionalFunctionality: node.optionalFunctionality,\n\t\t\t\t\t\t\tnodeType: node.nodeType,\n\t\t\t\t\t\t\tsupportsSecurity: node.supportsSecurity,\n\t\t\t\t\t\t\tsupportsBeaming: node.supportsBeaming,\n\t\t\t\t\t\t\tgenericDeviceClass: node.genericDeviceClass,\n\t\t\t\t\t\t\tspecificDeviceClass: node.specificDeviceClass\n\t\t\t\t\t\t\t\t?? null,\n\t\t\t\t\t\t} satisfies NVM500NodeInfo\n\t\t\t\t\t\t: undefined,\n\t\t\t\t);\n\t\t\t\tawait this.setSingle(\n\t\t\t\t\t\"EX_NVM_SUC_CONTROLLER_LIST_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t\tnode?.sucUpdateIndex ?? 0xfe,\n\t\t\t\t);\n\t\t\t\tawait this.setSingle(\n\t\t\t\t\t\"EX_NVM_ROUTING_TABLE_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t\tnode?.neighbors,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcase \"routes\": {\n\t\t\t\tconst nodeId = property.nodeId;\n\t\t\t\tconst routes = value as { lwr?: Route; nlwr?: Route };\n\t\t\t\tawait this.setSingle(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_START_far\",\n\t\t\t\t\tnodeId - 1,\n\t\t\t\t\troutes.lwr,\n\t\t\t\t);\n\t\t\t\tawait this.setSingle(\n\t\t\t\t\t\"EX_NVM_ROUTECACHE_NLWR_SR_START_far\",\n\t\t\t\t\tproperty.nodeId - 1,\n\t\t\t\t\troutes.nlwr,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/require-await\n\tpublic async delete(_property: NVMProperty): Promise<void> {\n\t\tthrow new Error(\"Method not implemented.\");\n\t}\n\n\tpublic hasPendingChanges(): boolean {\n\t\t// We don't buffer changes\n\t\treturn false;\n\t}\n\n\tpublic async commit(): Promise<void> {\n\t\t// We don't buffer changes at the moment\n\t}\n}\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;AAAA;;;;;AAAA,kBAIO;AACP,oBAAsB;AACtB,qBAA4B;AAC5B,oBAAgC;AAahC,IAAAA,iBAKO;AAED,MAAO,cAAa;EACzB,YAAmB,KAAW;AAC7B,SAAK,OAAO;EACb;EAEQ;EAED,MAAM,IACZ,UACA,UAAY;AAKZ,UAAM,OAAO,KAAK,KAAK,QAAQ,MAAM,KAAK,KAAK,KAAI;AAEnD,QAAI;AACJ,QAAI,SAAS,WAAW,cAAc;AACrC,YAAM,MAAM,KAAK,yBAAyB,MAAM,QAAQ;IACzD,WAAW,SAAS,WAAW,UAAU;AACxC,YAAM,IAAI,uBACT,iEACA,4BAAgB,kBAAkB;IAEpC,OAAO;AACN,YAAM,MAAM,KAAK,mBAAmB,QAAQ;IAC7C;AACA,QAAI,YAAY,QAAQ,QAAW;AAClC,YAAM,IAAI,uBACT,yBAAyB,KAAK,UAAU,QAAQ,CAAC,cACjD,4BAAgB,kBAAkB;IAEpC;AACA,WAAO;EACR;EAEQ,MAAM,QACb,UAAsB;AAEtB,UAAM,OAAO,MAAM,KAAK,KAAK,IAAI,QAAQ;AACzC,WAAO,OAAO,CAAC;EAChB;EAEQ,MAAM,UACb,UACA,OAAa;AAEb,UAAM,OAAO,MAAM,KAAK,KAAK,UAAU,UAAU,KAAK;AACtD,WAAO;EACR;EAEQ,OACP,UAAsB;AAEtB,WAAO,KAAK,KAAK,IAAI,QAAQ;EAC9B;EAEQ,MAAM,yBACb,MACA,UAA+B;AAE/B,YAAQ,SAAS,MAAM;MACtB,KAAK;AACJ,eAAO,KAAK,cAAc;MAC3B,KAAK;AACJ,eAAO,KAAK,cAAc;MAE3B,KAAK;MACL,KAAK;AAEJ,eAAO;MAER,KAAK;AACJ,eAAO,KAAK,QACX,gCAAgC;MAGlC,KAAK;AAEJ;MAED,KAAK,UAAU;AAEd,cAAM,SAAS,MAAM,KAAK,QACzB,oBAAoB;AAErB,YAAI,UAAU;AAAW;AACzB,cAAM,MAAM,IAAI,oBAAM,CAAC,EAAE,KAAK,CAAC;AAE/B,YAAI,cAAc,QAAQ,CAAC;AAC3B,eAAO;MACR;MAEA,KAAK,iBAAiB;AAErB,cAAM,SAAS,MAAM,KAAK,QAAgB,gBAAgB;AAC1D,YAAI,UAAU;AAAW;AACzB,cAAM,MAAM,IAAI,oBAAM,CAAC,EAAE,KAAK,CAAC;AAE/B,YAAI,cAAc,QAAQ,CAAC;AAC3B,eAAO;MACR;MAEA,KAAK;AACJ,eAAO,KAAK,QAAgB,gBAAgB;MAE7C,KAAK;AACJ,eAAO,KAAK,QACX,oCAAoC;MAGtC,KAAK;AACJ,eAAO,KAAK,QACX,4CAA4C;MAE9C,KAAK;AACJ,eAAO,KAAK,QACX,iCAAiC;MAEnC,KAAK;AACJ,eAAO,KAAK,QACX,qCAAqC;MAGvC,KAAK;AACJ,eAAO,KAAK,QAAgB,wBAAwB;MACrD,KAAK;AACJ,eAAO,KAAK,QAAgB,wBAAwB;MACrD,KAAK;AACJ,eAAO,KAAK,QAAgB,kBAAkB;MAE/C,KAAK,kBAAkB;AACtB,cAAM,SAAS,MAAM,KAAK,QACzB,2BAA2B;AAE5B,cAAM,MAAM,MAAM,KAAK,OACtB,uBAAuB;AAExB,eAAO,KAAK,MAAM,GAAG,MAAM;MAC5B;MAEA,KAAK;AACJ,eAAO,KAAK,QAAkB,6BAA6B;MAE5D,KAAK,gBAAgB;AACpB,eAAO,KAAK,QACX,gCAAgC;MAElC;MACA,KAAK,iBAAiB;AACrB,eAAO,KAAK,QACX,yCAAyC;MAE3C;MACA,KAAK,oBAAoB;AACxB,eAAO,KAAK,QAAkB,2BAA2B;MAC1D;MACA,KAAK,oBAAoB;AACxB,eAAO,KAAK,QAAkB,2BAA2B;MAC1D;MAEA,KAAK,WAAW;AACf,cAAM,YAAY,MAAM,KAAK,OAC5B,6BAA6B;AAE9B,eAAO,WACJ,IAAI,CAACC,OAAM,UAAUA,QAAQ,QAAQ,IAAK,MAAS,EACpD,OAAO,CAAC,OAAO,MAAM,MAAS;MACjC;MAEA,KAAK,kBAAkB;AACtB,cAAM,MAAM,MAAM,KAAK,QACtB,kCAAkC;AAEnC,eAAO,OAAO,CAAA;MACf;MAEA,KAAK,oBAAoB;AACxB,cAAM,MAAM,MAAM,KAAK,OACtB,gCAAgC;AAEjC,eAAO,KAAK,OAAO,OAAO;MAC3B;MAEA,KAAK;AACJ,eAAO,KAAK,QAAgB,+BAA+B;MAE5D,KAAK;AACJ,eAAO,KAAK,OACX,gCAAgC;MAElC,KAAK;AACJ,eAAO,KAAK,OACX,6BAA6B;MAE/B,KAAK;AACJ,eAAO,KAAK,QACX,gCAAgC;MAElC,KAAK;AACJ,eAAO,KAAK,QACX,8CAA8C;MAEhD,KAAK;AACJ,eAAO,KAAK,QACX,4CAA4C;MAG9C,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;AAEJ;MAED;AACC,wCAAY,SAAS,IAAI;IAC3B;EACD;EAEQ,MAAM,mBACb,UAAyB;AAEzB,YAAQ,SAAS,MAAM;MACtB,KAAK,QAAQ;AACZ,cAAM,SAAS,SAAS;AACxB,cAAM,WAAW,MAAM,KAAK,UAC3B,+BACA,SAAS,CAAC;AAEX,cAAM,iBAAiB,MAAM,KAAK,UACjC,wCACA,SAAS,CAAC,KACN;AACL,cAAM,YAAY,MAAM,KAAK,UAC5B,kCACA,SAAS,CAAC,KACN,CAAA;AAEL,YAAI,CAAC;AAAU;AAEf,eAAO;UACN;UACA,GAAG;UACH;UACA;;MAEF;MAEA,KAAK,UAAU;AACd,cAAM,MAAM,MAAM,KAAK,UACtB,+BACA,SAAS,SAAS,CAAC;AAEpB,cAAM,OAAO,MAAM,KAAK,UACvB,uCACA,SAAS,SAAS,CAAC;AAEpB,eAAO,EAAE,KAAK,KAAI;MACnB;IACD;EACD;EAEQ,QACP,UACA,OAAc;AAEd,WAAO,KAAK,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;EACvC;EAEQ,UACP,UACA,OACA,OAAc;AAEd,WAAO,KAAK,KAAK,UAAU,UAAU,OAAO,KAAK;EAClD;EAEQ,OACP,UACA,OAAgB;AAEhB,WAAO,KAAK,KAAK,IAAI,UAAU,KAAK;EACrC;EAEA,IACC,UACA,OAA+B;AAE/B,QAAI,SAAS,WAAW,cAAc;AACrC,aAAO,KAAK,yBAAyB,UAAU,KAAK;IACrD,WAAW,SAAS,WAAW,UAAU;AACxC,YAAM,IAAI,uBACT,iEACA,4BAAgB,kBAAkB;IAEpC,OAAO;AACN,aAAO,KAAK,mBAAmB,UAAU,KAAK;IAC/C;EACD;EAEQ,MAAM,yBACb,UACA,OAAU;AAEV,YAAQ,SAAS,MAAM;MACtB,KAAK;MACL,KAAK;AAEJ;MAED,KAAK;MACL,KAAK;AAEJ;MAED,KAAK;AACJ,eAAO,KAAK,QACX,kCACA,SAAS,IAAI,oBAAM,sCAAuB,EAAE,KAAK,GAAI,CAAC;MAGxD,KAAK;AAEJ;MAED,KAAK,UAAU;AAEd,cAAM,SAAS,MAAM,aAAa,CAAC;AACnC,eAAO,KAAK,QAAQ,sBAAsB,MAAM;MACjD;MAEA,KAAK,iBAAiB;AAErB,cAAM,gBAAgB,OAAO,aAAa,CAAC,KAAK;AAChD,eAAO,KAAK,QAAQ,kBAAkB,aAAa;MACpD;MAEA,KAAK;AACJ,eAAO,KAAK,QAAQ,kBAAkB,KAAK;MAE5C,KAAK;AACJ,eAAO,KAAK,QACX,sCACA,KAAK;MAGP,KAAK;AACJ,eAAO,KAAK,QACX,8CACA,KAAK;MAEP,KAAK;AACJ,eAAO,KAAK,QACX,mCACA,KAAK;MAEP,KAAK;AACJ,eAAO,KAAK,QACX,uCACA,KAAK;MAGP,KAAK;AACJ,eAAO,KAAK,QAAQ,0BAA0B,KAAK;MACpD,KAAK;AACJ,eAAO,KAAK,QAAQ,0BAA0B,KAAK;MACpD,KAAK;AACJ,eAAO,KAAK,QAAQ,oBAAoB,KAAK;MAE9C,KAAK,kBAAkB;AACtB,cAAM,KAAK,QACV,6BACA,MAAM,MAAM;AAEb,cAAM,MAAM,IAAI,MAAM,gCAAiB,EAAE,KAAK,GAAI;AAClD,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACtC,cAAI,IAAI,kCAAmB;AAC1B,gBAAI,CAAC,IAAI,MAAM,CAAC;UACjB;QACD;AACA,cAAM,KAAK,OACV,yBACA,GAAG;AAEJ;MACD;MAEA,KAAK;AACJ,eAAO,KAAK,QAAQ,+BAA+B,KAAK;MAEzD,KAAK,gBAAgB;AACpB,eAAO,KAAK,QACX,kCACA,KAAK;MAEP;MACA,KAAK,iBAAiB;AACrB,eAAO,KAAK,QACX,2CACA,KAAK;MAEP;MACA,KAAK,oBAAoB;AACxB,eAAO,KAAK,QAAQ,6BAA6B,KAAK;MACvD;MACA,KAAK,oBAAoB;AACxB,eAAO,KAAK,QAAQ,6BAA6B,KAAK;MACvD;MAEA,KAAK;AAEJ;MAED,KAAK,kBAAkB;AACtB,eAAO,KAAK,QACX,oCACA,KAAK;MAEP;MAEA,KAAK,oBAAoB;AACxB,cAAM,UAAU;AAChB,cAAM,mBAAmB,IAAI,MAAM,6BAAe,EAAE,KACnD,MAAS;AAEV,iBAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACxC,cAAI,IAAI,+BAAiB;AACxB,6BAAiB,CAAC,IAAI,QAAQ,CAAC;UAChC;QACD;AACA,eAAO,KAAK,OACX,kCACA,gBAAgB;MAElB;MAEA,KAAK;AACJ,eAAO,KAAK,QAAQ,iCAAiC,KAAK;MAE3D,KAAK;AACJ,eAAO,KAAK,OACX,kCACA,KAAK;MAEP,KAAK;AACJ,eAAO,KAAK,OACX,+BACA,KAAK;MAEP,KAAK;AACJ,eAAO,KAAK,QACX,kCACA,KAAK;MAEP,KAAK;AACJ,eAAO,KAAK,QACX,gDACA,KAAK;MAEP,KAAK;AACJ,eAAO,KAAK,QACX,8CACA,KAAK;MAGP,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;MACL,KAAK;AAEJ;MAED;AACC,wCAAY,SAAS,IAAI;IAC3B;EACD;EAEQ,MAAM,mBACb,UACA,OAAU;AAEV,YAAQ,SAAS,MAAM;MACtB,KAAK,QAAQ;AACZ,cAAM,SAAS,SAAS;AACxB,cAAM,OAAO;AACb,cAAM,KAAK,UACV,+BACA,SAAS,GACT,OACG;UACD,aAAa,KAAK;UAClB,qBAAqB,KAAK;UAC1B,WAAW,KAAK;UAChB,oBAAoB,KAAK;UACzB,iBAAiB,KAAK;UACtB,uBAAuB,KAAK;UAC5B,UAAU,KAAK;UACf,kBAAkB,KAAK;UACvB,iBAAiB,KAAK;UACtB,oBAAoB,KAAK;UACzB,qBAAqB,KAAK,uBACtB;YAEH,MAAS;AAEb,cAAM,KAAK,UACV,wCACA,SAAS,GACT,MAAM,kBAAkB,GAAI;AAE7B,cAAM,KAAK,UACV,kCACA,SAAS,GACT,MAAM,SAAS;MAEjB;MAEA,KAAK,UAAU;AACd,cAAM,SAAS,SAAS;AACxB,cAAM,SAAS;AACf,cAAM,KAAK,UACV,+BACA,SAAS,GACT,OAAO,GAAG;AAEX,cAAM,KAAK,UACV,uCACA,SAAS,SAAS,GAClB,OAAO,IAAI;MAEb;IACD;EACD;;EAGO,MAAM,OAAO,WAAsB;AACzC,UAAM,IAAI,MAAM,yBAAyB;EAC1C;EAEO,oBAAiB;AAEvB,WAAO;EACR;EAEO,MAAM,SAAM;EAEnB;;",
6
6
  "names": ["import_shared", "info"]
7
7
  }
package/build/esm/cli.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { readJSON } from "@zwave-js/shared";
2
- import { isObject } from "alcalzone-shared/typeguards/index.js";
2
+ import { isObject } from "alcalzone-shared/typeguards";
3
3
  import fs from "node:fs/promises";
4
4
  import "reflect-metadata";
5
5
  import yargs from "yargs";
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAChE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,kBAAkB,CAAC;AAC1B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EACN,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,SAAS,GACT,MAAM,cAAc,CAAC;AAEtB,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AAEnD,KAAK,aAAa;KAChB,GAAG,CAAC,SAAS,CAAC;KACd,MAAM,EAAE;KACR,KAAK,CAAC,wDAAwD,CAAC;KAC/D,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC;KAClB,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC;KACrB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,aAAa,EAAE,CAAC,CAAC;KAClD,OAAO,CAAC;IACR,OAAO,EAAE;QACR,KAAK,EAAE,IAAI;QACX,QAAQ,EAAE,sBAAsB;QAChC,IAAI,EAAE,SAAS;KACf;CACD,CAAC;KACD,OAAO,CACP,UAAU,EACV,+BAA+B,EAC/B,CAAC,KAAK,EAAE,EAAE,CACT,KAAK,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC,OAAO,CAAC;IAC9D,EAAE,EAAE;QACH,QAAQ,EAAE,qBAAqB;QAC/B,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;KACd;IACD,GAAG,EAAE;QACJ,QAAQ,EAAE,sBAAsB;QAChC,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;KACd;CACD,CAAC,EACH,KAAK,EAAE,IAAI,EAAE,EAAE;IACd,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1C,IAAI,IAAS,CAAC;IACd,IAAI,CAAC;QACJ,IAAI,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,IAAI,CAAC;YACJ,IAAI,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACF,CAAC;IACD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,KAAK,CAAC,yBAAyB,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAEnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CACD;KACA,OAAO,CACP,UAAU,EACV,qDAAqD,EACrD,CAAC,KAAK,EAAE,EAAE,CACT,KAAK;KACH,KAAK,CACL,qEAAqE,CACrE;KACA,OAAO,CAAC;IACR,EAAE,EAAE;QACH,QAAQ,EAAE,qBAAqB;QAC/B,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;KACd;IACD,GAAG,EAAE;QACJ,QAAQ,EAAE,qBAAqB;QAC/B,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;KACd;IACD,eAAe,EAAE;QAChB,KAAK,EAAE,GAAG;QACV,QAAQ,EACP,oDAAoD;QACrD,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;KACd;CACD,CAAC,EACJ,KAAK,EAAE,IAAI,EAAE,EAAE;IACd,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IACjC,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAEvD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC;IACtC,IAAI,YAAY,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CACZ,2BAA2B,eAAe;6CACF,CACxC,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;SAAM,IAAI,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,OAAO,CAAC,KAAK,CACZ,2BAA2B,eAAe;6CACF,CACxC,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CACZ;0HACqH,CACrH,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,GAAG,GAAG,YAAY;QACvB,CAAC,CAAC,MAAM,YAAY,CAAC,IAAI,EAAE,eAAe,CAAC;QAC3C,CAAC,CAAC,MAAM,SAAS,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAClC,OAAO,CAAC,KAAK,CAAC,2BAA2B,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAErD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CACD;KACA,OAAO,CACP,UAAU,EACV,4DAA4D,EAC5D,CAAC,KAAK,EAAE,EAAE,CACT,KAAK;KACH,KAAK,CAAC,sDAAsD,CAAC;KAC7D,OAAO,CAAC;IACR,EAAE,EAAE;QACH,QAAQ,EAAE,gCAAgC;QAC1C,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;KACd;IACD,GAAG,EAAE;QACJ,QAAQ,EAAE,4BAA4B;QACtC,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;KACd;IACD,QAAQ,EAAE;QACT,KAAK,EAAE,GAAG;QACV,QAAQ,EACP,4DAA4D;QAC7D,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,KAAK;KACd;CACD,CAAC,EACJ,KAAK,EAAE,IAAI,EAAE,EAAE;IACd,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,KAAK,CAAC,oCAAoC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAE9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CACD;KACA,OAAO,CACP,UAAU,EACV,4DAA4D,EAC5D,CAAC,KAAK,EAAE,EAAE,CACT,KAAK,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC,OAAO,CAAC;IAC9D,EAAE,EAAE;QACH,QAAQ,EAAE,gCAAgC;QAC1C,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;KACd;IACD,GAAG,EAAE;QACJ,QAAQ,EAAE,4BAA4B;QACtC,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;KACd;CACD,CAAC,EACH,KAAK,EAAE,IAAI,EAAE,EAAE;IACd,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,KAAK,CAAC,oCAAoC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAE9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CACD;KACA,OAAO,CACP,SAAS,EACT,sEAAsE,EACtE,CAAC,KAAK,EAAE,EAAE,CACT,KAAK;KACH,KAAK,CACL,+DAA+D,CAC/D;KACA,OAAO,CAAC;IACR,MAAM,EAAE;QACP,QAAQ,EACP,+EAA+E;QAChF,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;KACd;IACD,MAAM,EAAE;QACP,QAAQ,EACP,0FAA0F;QAC3F,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;KACd;IACD,GAAG,EAAE;QACJ,QAAQ,EACP,4DAA4D;QAC7D,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,IAAI;KACd;CACD,CAAC,EACJ,KAAK,EAAE,IAAI,EAAE,EAAE;IACd,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACrC,OAAO,CAAC,KAAK,CAAC,4BAA4B,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAEtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CACD;KACA,aAAa,CAAC,CAAC,EAAE,0BAA0B,CAAC;KAC5C,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { ControllerCapabilityFlags, MAX_NODES, NodeIDType, NodeType, RFRegion, ZWaveError, ZWaveErrorCodes, isZWaveError, stripUndefined, } from "@zwave-js/core/safe";
2
2
  import { Bytes, buffer2hex, cloneDeep, num2hex, pick, } from "@zwave-js/shared/safe";
3
- import { isObject } from "alcalzone-shared/typeguards/index.js";
3
+ import { isObject } from "alcalzone-shared/typeguards";
4
4
  import semver from "semver";
5
5
  import { MAX_PROTOCOL_FILE_FORMAT, SUC_MAX_UPDATES } from "./consts.js";
6
6
  import { NVM3 } from "./lib/NVM3.js";