{"version":3,"sources":["jsdelivr-header.js","/npm/zigbee-herdsman-converters@26.14.0/dist/index.js"],"names":[],"mappings":"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","file":"/npm/zigbee-herdsman-converters@26.14.0/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/zigbee-herdsman-converters@26.14.0/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    var desc = Object.getOwnPropertyDescriptor(m, k);\n    if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n      desc = { enumerable: true, get: function() { return m[k]; } };\n    }\n    Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n    o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n    var ownKeys = function(o) {\n        ownKeys = Object.getOwnPropertyNames || function (o) {\n            var ar = [];\n            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n            return ar;\n        };\n        return ownKeys(o);\n    };\n    return function (mod) {\n        if (mod && mod.__esModule) return mod;\n        var result = {};\n        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n        __setModuleDefault(result, mod);\n        return result;\n    };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.externalDefinitions = exports.clearGlobalStore = exports.setLogger = exports.fromZigbee = exports.toZigbee = exports.Fan = exports.Cover = exports.Lock = exports.Switch = exports.Climate = exports.Light = exports.List = exports.Composite = exports.Text = exports.Enum = exports.Binary = exports.Numeric = exports.access = exports.ACTIONS = void 0;\nexports.removeExternalDefinitions = removeExternalDefinitions;\nexports.addExternalDefinition = addExternalDefinition;\nexports.prepareDefinition = prepareDefinition;\nexports.postProcessConvertedFromZigbeeMessage = postProcessConvertedFromZigbeeMessage;\nexports.findByDevice = findByDevice;\nexports.findDefinition = findDefinition;\nexports.generateExternalDefinitionSource = generateExternalDefinitionSource;\nexports.generateExternalDefinition = generateExternalDefinition;\nexports.onEvent = onEvent;\nconst node_assert_1 = __importDefault(require(\"node:assert\"));\nconst zigbee_herdsman_1 = require(\"zigbee-herdsman\");\nconst fromZigbee = __importStar(require(\"./converters/fromZigbee\"));\nexports.fromZigbee = fromZigbee;\nconst toZigbee = __importStar(require(\"./converters/toZigbee\"));\nexports.toZigbee = toZigbee;\nconst exposesLib = __importStar(require(\"./lib/exposes\"));\nconst exposes_1 = require(\"./lib/exposes\");\nObject.defineProperty(exports, \"access\", { enumerable: true, get: function () { return exposes_1.access; } });\nObject.defineProperty(exports, \"Binary\", { enumerable: true, get: function () { return exposes_1.Binary; } });\nObject.defineProperty(exports, \"Climate\", { enumerable: true, get: function () { return exposes_1.Climate; } });\nObject.defineProperty(exports, \"Composite\", { enumerable: true, get: function () { return exposes_1.Composite; } });\nObject.defineProperty(exports, \"Cover\", { enumerable: true, get: function () { return exposes_1.Cover; } });\nObject.defineProperty(exports, \"Enum\", { enumerable: true, get: function () { return exposes_1.Enum; } });\nObject.defineProperty(exports, \"Fan\", { enumerable: true, get: function () { return exposes_1.Fan; } });\nObject.defineProperty(exports, \"Light\", { enumerable: true, get: function () { return exposes_1.Light; } });\nObject.defineProperty(exports, \"List\", { enumerable: true, get: function () { return exposes_1.List; } });\nObject.defineProperty(exports, \"Lock\", { enumerable: true, get: function () { return exposes_1.Lock; } });\nObject.defineProperty(exports, \"Numeric\", { enumerable: true, get: function () { return exposes_1.Numeric; } });\nObject.defineProperty(exports, \"Switch\", { enumerable: true, get: function () { return exposes_1.Switch; } });\nObject.defineProperty(exports, \"Text\", { enumerable: true, get: function () { return exposes_1.Text; } });\nconst generateDefinition_1 = require(\"./lib/generateDefinition\");\nconst logger_1 = require(\"./lib/logger\");\nconst utils = __importStar(require(\"./lib/utils\"));\n// @ts-expect-error dynamically built\nconst models_index_json_1 = __importDefault(require(\"./models-index.json\"));\nconst NS = \"zhc\";\nconst MODELS_INDEX = models_index_json_1.default;\nvar actions_1 = require(\"./converters/actions\");\nObject.defineProperty(exports, \"ACTIONS\", { enumerable: true, get: function () { return actions_1.ACTIONS; } });\nvar logger_2 = require(\"./lib/logger\");\nObject.defineProperty(exports, \"setLogger\", { enumerable: true, get: function () { return logger_2.setLogger; } });\nvar store_1 = require(\"./lib/store\");\nObject.defineProperty(exports, \"clearGlobalStore\", { enumerable: true, get: function () { return store_1.clear; } });\n// key: zigbeeModel, value: array of definitions (most of the times 1)\nconst externalDefinitionsLookup = new Map();\nexports.externalDefinitions = [];\n// expected to be at the beginning of `definitions` array\nlet externalDefinitionsCount = 0;\nfunction arrayEquals(as, bs) {\n    if (as.length !== bs.length) {\n        return false;\n    }\n    for (const a of as) {\n        if (!bs.includes(a)) {\n            return false;\n        }\n    }\n    return true;\n}\nfunction addToExternalDefinitionsLookup(zigbeeModel, definition) {\n    const lookupModel = zigbeeModel ? zigbeeModel.toLowerCase() : \"null\";\n    if (!externalDefinitionsLookup.has(lookupModel)) {\n        externalDefinitionsLookup.set(lookupModel, []);\n    }\n    // key created above\n    // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`\n    if (!externalDefinitionsLookup.get(lookupModel).includes(definition)) {\n        // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`\n        externalDefinitionsLookup.get(lookupModel).splice(0, 0, definition);\n    }\n}\nfunction removeFromExternalDefinitionsLookup(zigbeeModel, definition) {\n    const lookupModel = zigbeeModel ? zigbeeModel.toLowerCase() : \"null\";\n    if (externalDefinitionsLookup.has(lookupModel)) {\n        // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`\n        const i = externalDefinitionsLookup.get(lookupModel).indexOf(definition);\n        if (i > -1) {\n            // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`\n            externalDefinitionsLookup.get(lookupModel).splice(i, 1);\n        }\n        // biome-ignore lint/style/noNonNullAssertion: ignored using `--suppress`\n        if (externalDefinitionsLookup.get(lookupModel).length === 0) {\n            externalDefinitionsLookup.delete(lookupModel);\n        }\n    }\n}\nfunction getFromExternalDefinitionsLookup(zigbeeModel) {\n    const lookupModel = zigbeeModel ? zigbeeModel.toLowerCase() : \"null\";\n    if (externalDefinitionsLookup.has(lookupModel)) {\n        return externalDefinitionsLookup.get(lookupModel);\n    }\n    return externalDefinitionsLookup.get(lookupModel.replace(/\\0(.|\\n)*$/g, \"\").trim());\n}\nfunction removeExternalDefinitions(converterName) {\n    for (let i = 0; i < externalDefinitionsCount; i++) {\n        const definition = exports.externalDefinitions[i];\n        if (converterName && definition.externalConverterName !== converterName) {\n            continue;\n        }\n        if (definition.zigbeeModel) {\n            for (const zigbeeModel of definition.zigbeeModel) {\n                removeFromExternalDefinitionsLookup(zigbeeModel, definition);\n            }\n        }\n        if (definition.fingerprint) {\n            for (const fingerprint of definition.fingerprint) {\n                removeFromExternalDefinitionsLookup(fingerprint.modelID, definition);\n            }\n        }\n        exports.externalDefinitions.splice(i, 1);\n        externalDefinitionsCount--;\n        i--;\n    }\n}\nfunction addExternalDefinition(definition) {\n    exports.externalDefinitions.splice(0, 0, definition);\n    externalDefinitionsCount++;\n    if (definition.fingerprint) {\n        for (const fingerprint of definition.fingerprint) {\n            addToExternalDefinitionsLookup(fingerprint.modelID, definition);\n        }\n    }\n    if (definition.zigbeeModel) {\n        for (const zigbeeModel of definition.zigbeeModel) {\n            addToExternalDefinitionsLookup(zigbeeModel, definition);\n        }\n    }\n}\nasync function getDefinitions(indexes) {\n    const indexedDefs = [];\n    // local cache for models with lots of matches (tuya...)\n    const defs = {};\n    for (const [moduleName, index] of indexes) {\n        if (!defs[moduleName]) {\n            // NOTE: modules are cached by nodejs until process is stopped\n            // currently using `commonjs`, so strip `.js` file extension, XXX: creates a warning with vitest (expects static `.js`)\n            const { definitions } = (await Promise.resolve(`${`./devices/${moduleName.slice(0, -3)}`}`).then(s => __importStar(require(s))));\n            defs[moduleName] = definitions;\n        }\n        indexedDefs.push(defs[moduleName][index]);\n    }\n    return indexedDefs;\n}\nasync function getFromIndex(zigbeeModel) {\n    const lookupModel = zigbeeModel ? zigbeeModel.toLowerCase() : \"null\";\n    let indexes = MODELS_INDEX[lookupModel];\n    if (indexes) {\n        logger_1.logger.debug(`Getting definitions for: ${indexes}`, NS);\n        return await getDefinitions(indexes);\n    }\n    indexes = MODELS_INDEX[lookupModel.replace(/\\0(.|\\n)*$/g, \"\").trim()];\n    if (indexes) {\n        logger_1.logger.debug(`Getting definitions for: ${indexes}`, NS);\n        return await getDefinitions(indexes);\n    }\n}\nconst converterRequiredFields = {\n    model: \"String\",\n    vendor: \"String\",\n    description: \"String\",\n    fromZigbee: \"Array\",\n    toZigbee: \"Array\",\n};\nfunction validateDefinition(definition) {\n    for (const [field, expectedType] of Object.entries(converterRequiredFields)) {\n        const val = definition[field];\n        (0, node_assert_1.default)(val !== null, `Converter field ${field} is null`);\n        (0, node_assert_1.default)(val !== undefined, `Converter field ${field} is undefined`);\n        (0, node_assert_1.default)(val.constructor.name === expectedType, `Converter field ${field} expected type doenst match to ${val}`);\n    }\n    node_assert_1.default.ok(Array.isArray(definition.exposes) || typeof definition.exposes === \"function\", \"Exposes incorrect\");\n}\nfunction processExtensions(definition) {\n    if (\"extend\" in definition) {\n        if (!Array.isArray(definition.extend)) {\n            node_assert_1.default.fail(`'${definition.model}' has legacy extend which is not supported anymore`);\n        }\n        // Modern extend, merges properties, e.g. when both extend and definition has toZigbee, toZigbee will be combined\n        let { extend, toZigbee, fromZigbee, exposes: definitionExposes, meta, endpoint, ota, configure: definitionConfigure, onEvent: definitionOnEvent, options, ...definitionWithoutExtend } = definition;\n        // Exposes can be an Expose[] or DefinitionExposesFunction. In case it's only Expose[] we return an array\n        // Otherwise return a DefinitionExposesFunction.\n        const allExposesIsExposeOnly = (allExposes) => {\n            return !allExposes.find((e) => typeof e === \"function\");\n        };\n        let allExposes = [];\n        if (definitionExposes) {\n            if (typeof definitionExposes === \"function\") {\n                allExposes.push(definitionExposes);\n            }\n            else {\n                allExposes.push(...definitionExposes);\n            }\n        }\n        toZigbee = [...(toZigbee ?? [])];\n        fromZigbee = [...(fromZigbee ?? [])];\n        options = [...(options ?? [])];\n        const configures = definitionConfigure ? [definitionConfigure] : [];\n        const onEvents = definitionOnEvent ? [definitionOnEvent] : [];\n        for (const ext of extend) {\n            if (!ext.isModernExtend) {\n                node_assert_1.default.fail(`'${definition.model}' has legacy extend in modern extend`);\n            }\n            if (ext.toZigbee) {\n                toZigbee.push(...ext.toZigbee);\n            }\n            if (ext.fromZigbee) {\n                fromZigbee.push(...ext.fromZigbee);\n            }\n            if (ext.options) {\n                options.push(...ext.options);\n            }\n            if (ext.exposes) {\n                allExposes.push(...ext.exposes);\n            }\n            if (ext.meta) {\n                meta = Object.assign({}, ext.meta, meta);\n            }\n            // Filter `undefined` configures, e.g. returned by setupConfigureForReporting.\n            if (ext.configure) {\n                configures.push(...ext.configure.filter((c) => c !== undefined));\n            }\n            if (ext.onEvent) {\n                onEvents.push(...ext.onEvent.filter((c) => c !== undefined));\n            }\n            if (ext.ota) {\n                ota = ext.ota;\n            }\n            if (ext.endpoint) {\n                if (endpoint) {\n                    node_assert_1.default.fail(`'${definition.model}' has multiple 'endpoint', this is not allowed`);\n                }\n                endpoint = ext.endpoint;\n            }\n        }\n        // Filtering out action exposes to combine them one\n        const actionExposes = allExposes.filter((e) => typeof e !== \"function\" && e.name === \"action\");\n        allExposes = allExposes.filter((e) => e.name !== \"action\");\n        if (actionExposes.length > 0) {\n            const actions = [];\n            for (const expose of actionExposes) {\n                if (expose instanceof exposes_1.Enum) {\n                    for (const action of expose.values) {\n                        actions.push(action.toString());\n                    }\n                }\n            }\n            const uniqueActions = actions.filter((value, index, array) => array.indexOf(value) === index);\n            allExposes.push(exposesLib.presets.action(uniqueActions));\n        }\n        let configure;\n        if (configures.length !== 0) {\n            configure = async (device, coordinatorEndpoint, configureDefinition) => {\n                for (const func of configures) {\n                    await func(device, coordinatorEndpoint, configureDefinition);\n                }\n            };\n        }\n        let onEvent;\n        if (onEvents.length !== 0) {\n            onEvent = async (event) => {\n                for (const func of onEvents) {\n                    await func(event);\n                }\n            };\n        }\n        // In case there is a function in allExposes, return a function, otherwise just an array.\n        let exposes;\n        if (allExposesIsExposeOnly(allExposes)) {\n            exposes = allExposes;\n        }\n        else {\n            exposes = (device, options) => {\n                const result = [];\n                for (const item of allExposes) {\n                    if (typeof item === \"function\") {\n                        try {\n                            const deviceExposes = item(device, options);\n                            result.push(...deviceExposes);\n                        }\n                        catch (error) {\n                            const ieeeAddr = utils.isDummyDevice(device) ? \"dummy-device\" : device.ieeeAddr;\n                            logger_1.logger.error(`Failed to process exposes for '${ieeeAddr}' (${error.stack})`, NS);\n                        }\n                    }\n                    else {\n                        result.push(item);\n                    }\n                }\n                return result;\n            };\n        }\n        return { version: \"0.0.0\", toZigbee, fromZigbee, exposes, meta, configure, endpoint, onEvent, ota, options, ...definitionWithoutExtend };\n    }\n    return { version: \"0.0.0\", ...definition };\n}\nfunction prepareDefinition(definition) {\n    const finalDefinition = processExtensions(definition);\n    finalDefinition.toZigbee = [\n        toZigbee.scene_store,\n        toZigbee.scene_recall,\n        toZigbee.scene_add,\n        toZigbee.scene_remove,\n        toZigbee.scene_remove_all,\n        toZigbee.scene_rename,\n        toZigbee.read,\n        toZigbee.write,\n        toZigbee.command,\n        toZigbee.factory_reset,\n        toZigbee.zcl_command,\n        // Add device specific toZigbee converters as last, otherwise the Tuya datapoints\n        // converters consume e.g. the `read` and `write`.\n        ...finalDefinition.toZigbee,\n    ];\n    if (definition.externalConverterName) {\n        validateDefinition(finalDefinition);\n    }\n    // Add all the options\n    finalDefinition.options = [...(finalDefinition.options ?? [])];\n    const optionKeys = finalDefinition.options.map((o) => o.name);\n    // Add calibration/precision options based on expose\n    for (const expose of Array.isArray(finalDefinition.exposes) ? finalDefinition.exposes : finalDefinition.exposes({ isDummyDevice: true }, {})) {\n        if (!optionKeys.includes(expose.name) &&\n            utils.isNumericExpose(expose) &&\n            expose.name in utils.calibrateAndPrecisionRoundOptionsDefaultPrecision) {\n            // Battery voltage is not calibratable\n            if (expose.name === \"voltage\" && expose.unit === \"mV\") {\n                continue;\n            }\n            const type = utils.calibrateAndPrecisionRoundOptionsIsPercentual(expose.name) ? \"percentual\" : \"absolute\";\n            finalDefinition.options.push(exposesLib.options.calibration(expose.name, type).withValueStep(0.1));\n            if (utils.calibrateAndPrecisionRoundOptionsDefaultPrecision[expose.name] !== 0) {\n                finalDefinition.options.push(exposesLib.options.precision(expose.name));\n            }\n            optionKeys.push(expose.name);\n        }\n    }\n    for (const converter of [...finalDefinition.toZigbee, ...finalDefinition.fromZigbee]) {\n        if (converter.options) {\n            const options = typeof converter.options === \"function\" ? converter.options(finalDefinition) : converter.options;\n            for (const option of options) {\n                if (!optionKeys.includes(option.name)) {\n                    finalDefinition.options.push(option);\n                    optionKeys.push(option.name);\n                }\n            }\n        }\n    }\n    return finalDefinition;\n}\nfunction postProcessConvertedFromZigbeeMessage(definition, payload, options, device) {\n    // Apply calibration/precision options\n    for (const [key, value] of Object.entries(payload)) {\n        const definitionExposes = Array.isArray(definition.exposes) ? definition.exposes : definition.exposes(device, {});\n        const expose = definitionExposes.find((e) => e.property === key);\n        if (expose?.name && expose.name in utils.calibrateAndPrecisionRoundOptionsDefaultPrecision && value !== \"\" && utils.isNumber(value)) {\n            try {\n                payload[key] = utils.calibrateAndPrecisionRoundOptions(value, options, expose.name);\n            }\n            catch (error) {\n                logger_1.logger.error(`Failed to apply calibration to '${expose.name}': ${error.message}`, NS);\n            }\n        }\n    }\n}\nasync function findByDevice(device, generateForUnknown = false) {\n    let definition = await findDefinition(device, generateForUnknown);\n    if (definition) {\n        if (definition.whiteLabel) {\n            const match = definition.whiteLabel.find((w) => \"fingerprint\" in w && w.fingerprint.find((f) => isFingerprintMatch(f, device)));\n            if (match) {\n                definition = {\n                    ...definition,\n                    model: match.model,\n                    vendor: match.vendor ?? definition.vendor,\n                    description: match.description ?? definition.description,\n                };\n            }\n        }\n        return prepareDefinition(definition);\n    }\n}\nasync function findDefinition(device, generateForUnknown = false) {\n    if (!device || device.type === \"Coordinator\") {\n        return undefined;\n    }\n    let candidates = await getFromIndex(device.modelID);\n    if (externalDefinitionsCount > 0) {\n        const extCandidates = getFromExternalDefinitionsLookup(device.modelID);\n        if (extCandidates) {\n            if (candidates) {\n                candidates.unshift(...extCandidates);\n            }\n            else {\n                candidates = extCandidates;\n            }\n        }\n    }\n    if (candidates) {\n        if (candidates.length === 1 && candidates[0].zigbeeModel) {\n            return candidates[0];\n        }\n        logger_1.logger.debug(() => `Candidates for ${device.ieeeAddr}/${device.modelID}: ${candidates.map((c) => `${c.model}/${c.vendor}`)}`, NS);\n        // First try to match based on fingerprint, return the first matching one.\n        const fingerprintMatch = { priority: undefined, definition: undefined };\n        for (const candidate of candidates) {\n            if (candidate.fingerprint) {\n                for (const fingerprint of candidate.fingerprint) {\n                    const priority = fingerprint.priority ?? 0;\n                    if (isFingerprintMatch(fingerprint, device) &&\n                        (fingerprintMatch.priority === undefined || priority > fingerprintMatch.priority)) {\n                        fingerprintMatch.definition = candidate;\n                        fingerprintMatch.priority = priority;\n                    }\n                }\n            }\n        }\n        if (fingerprintMatch.definition) {\n            return fingerprintMatch.definition;\n        }\n        // Match based on fingerprint failed, return first matching definition based on zigbeeModel\n        for (const candidate of candidates) {\n            if (candidate.zigbeeModel && device.modelID && candidate.zigbeeModel.includes(device.modelID)) {\n                return candidate;\n            }\n        }\n    }\n    if (!generateForUnknown) {\n        return undefined;\n    }\n    const { definition } = await (0, generateDefinition_1.generateDefinition)(device);\n    return definition;\n}\nasync function generateExternalDefinitionSource(device) {\n    return (await (0, generateDefinition_1.generateDefinition)(device)).externalDefinitionSource;\n}\nasync function generateExternalDefinition(device) {\n    const { definition } = await (0, generateDefinition_1.generateDefinition)(device);\n    return prepareDefinition(definition);\n}\nfunction isFingerprintMatch(fingerprint, device) {\n    let match = (fingerprint.applicationVersion === undefined || device.applicationVersion === fingerprint.applicationVersion) &&\n        (fingerprint.manufacturerID === undefined || device.manufacturerID === fingerprint.manufacturerID) &&\n        (!fingerprint.type || device.type === fingerprint.type) &&\n        (!fingerprint.dateCode || device.dateCode === fingerprint.dateCode) &&\n        (fingerprint.hardwareVersion === undefined || device.hardwareVersion === fingerprint.hardwareVersion) &&\n        (!fingerprint.manufacturerName || device.manufacturerName === fingerprint.manufacturerName) &&\n        (!fingerprint.modelID || device.modelID === fingerprint.modelID) &&\n        (!fingerprint.powerSource || device.powerSource === fingerprint.powerSource) &&\n        (!fingerprint.softwareBuildID || device.softwareBuildID === fingerprint.softwareBuildID) &&\n        (fingerprint.stackVersion === undefined || device.stackVersion === fingerprint.stackVersion) &&\n        (fingerprint.zclVersion === undefined || device.zclVersion === fingerprint.zclVersion) &&\n        (!fingerprint.ieeeAddr || device.ieeeAddr.match(fingerprint.ieeeAddr) !== null) &&\n        (!fingerprint.endpoints ||\n            arrayEquals(device.endpoints.map((e) => e.ID), fingerprint.endpoints.map((e) => e.ID)));\n    if (match && fingerprint.endpoints) {\n        for (const fingerprintEndpoint of fingerprint.endpoints) {\n            const deviceEndpoint = fingerprintEndpoint.ID !== undefined ? device.getEndpoint(fingerprintEndpoint.ID) : undefined;\n            match =\n                match &&\n                    (fingerprintEndpoint.deviceID === undefined ||\n                        (deviceEndpoint !== undefined && deviceEndpoint.deviceID === fingerprintEndpoint.deviceID)) &&\n                    (fingerprintEndpoint.profileID === undefined ||\n                        (deviceEndpoint !== undefined && deviceEndpoint.profileID === fingerprintEndpoint.profileID)) &&\n                    (!fingerprintEndpoint.inputClusters ||\n                        (deviceEndpoint !== undefined && arrayEquals(deviceEndpoint.inputClusters, fingerprintEndpoint.inputClusters))) &&\n                    (!fingerprintEndpoint.outputClusters ||\n                        (deviceEndpoint !== undefined && arrayEquals(deviceEndpoint.outputClusters, fingerprintEndpoint.outputClusters)));\n        }\n    }\n    return match;\n}\n// Can be used to handle events for devices which are not fully paired yet (no modelID).\n// Example usecase: https://github.com/Koenkk/zigbee2mqtt/issues/2399#issuecomment-570583325\nfunction onEvent(event) {\n    if (event.type === \"stop\")\n        return;\n    const { device } = event.data;\n    // support Legrand security protocol\n    // when pairing, a powered device will send a read frame to every device on the network\n    // it expects at least one answer. The payload contains the number of seconds\n    // since when the device is powered. If the value is too high, it will leave & not pair\n    // 23 works, 200 doesn't\n    if (device.manufacturerID === zigbee_herdsman_1.Zcl.ManufacturerCode.LEGRAND_GROUP && !device.customReadResponse) {\n        device.customReadResponse = (frame, endpoint) => {\n            if (frame.isCluster(\"genBasic\") && frame.payload.find((i) => i.attrId === 61440)) {\n                const options = { manufacturerCode: zigbee_herdsman_1.Zcl.ManufacturerCode.LEGRAND_GROUP, disableDefaultResponse: true };\n                const payload = { 61440: { value: 23, type: 35 } };\n                endpoint.readResponse(\"genBasic\", frame.header.transactionSequenceNumber, payload, options).catch((e) => {\n                    logger_1.logger.warning(`Legrand security read response failed: ${e}`, NS);\n                });\n                return true;\n            }\n            return false;\n        };\n    }\n    // Aqara feeder C1 polls the time during the interview, need to send back the local time instead of the UTC.\n    // The device.definition has not yet been set - therefore the device.definition.onEvent method does not work.\n    if (device.modelID === \"aqara.feeder.acn001\" && !device.customReadResponse) {\n        device.customReadResponse = (frame, endpoint) => {\n            if (frame.isCluster(\"genTime\")) {\n                const oneJanuary2000 = new Date(\"January 01, 2000 00:00:00 UTC+00:00\").getTime();\n                const secondsUTC = Math.round((Date.now() - oneJanuary2000) / 1000);\n                const secondsLocal = secondsUTC - new Date().getTimezoneOffset() * 60;\n                endpoint.readResponse(\"genTime\", frame.header.transactionSequenceNumber, { time: secondsLocal }).catch((e) => {\n                    logger_1.logger.warning(`ZNCWWSQ01LM custom time response failed: ${e}`, NS);\n                });\n                return true;\n            }\n            return false;\n        };\n    }\n    return Promise.resolve();\n}\n"]}