[{"id":"6f998f8.9ef41f","type":"function","z":"60ab02a0.152ae4","name":"script 03 - adeunis codec 1.6.1 (and polyfills)","func":"/*\n Copyright (c) 2010, Linden Research, Inc.\n Copyright (c) 2014, Joshua Bell\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in\n all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n THE SOFTWARE.\n $/LicenseInfo$\n */\n\n// Original can be found at:\n//   https://bitbucket.org/lindenlab/llsd\n// Modifications by Joshua Bell inexorabletash@gmail.com\n//   https://github.com/inexorabletash/polyfill\n\n// ES3/ES5 implementation of the Krhonos Typed Array Specification\n//   Ref: http://www.khronos.org/registry/typedarray/specs/latest/\n//   Date: 2011-02-01\n//\n// Variations:\n//  * Allows typed_array.get/set() as alias for subscripts (typed_array[])\n//  * Gradually migrating structure from Khronos spec to ES2015 spec\n//\n// Caveats:\n//  * Beyond 10000 or so entries, polyfilled array accessors (ta[0],\n//    etc) become memory-prohibitive, so array creation will fail. Set\n//    self.TYPED_ARRAY_POLYFILL_NO_ARRAY_ACCESSORS=true to disable\n//    creation of accessors. Your code will need to use the\n//    non-standard get()/set() instead, and will need to add those to\n//    native arrays for interop.\n(function(global) {\n    'use strict';\n    // var undefined = (void 0); // Paranoia\n\n    // Beyond this value, index getters/setters (i.e. array[0], array[1]) are so slow to\n    // create, and consume so much memory, that the browser appears frozen.\n    var MAX_ARRAY_LENGTH = 1e5;\n\n    // Approximations of internal ECMAScript conversion functions\n    function Type(v) {\n        switch(typeof v) {\n            case 'undefined': return 'undefined';\n            case 'boolean': return 'boolean';\n            case 'number': return 'number';\n            case 'string': return 'string';\n            default: return v === null ? 'null' : 'object';\n        }\n    }\n\n    // Class returns internal [[Class]] property, used to avoid cross-frame instanceof issues:\n    function Class(v) { return Object.prototype.toString.call(v).replace(/^\\[object *|\\]$/g, ''); }\n    function IsCallable(o) { return typeof o === 'function'; }\n    function ToObject(v) {\n        if (v === null || v === undefined) throw TypeError();\n        return Object(v);\n    }\n    function ToInt32(v) { return v >> 0; }\n    function ToUint32(v) { return v >>> 0; }\n\n    // Snapshot intrinsics\n    var LN2 = Math.LN2,\n        abs = Math.abs,\n        floor = Math.floor,\n        log = Math.log,\n        max = Math.max,\n        min = Math.min,\n        pow = Math.pow,\n        round = Math.round;\n\n    // emulate ES5 getter/setter API using legacy APIs\n    // http://blogs.msdn.com/b/ie/archive/2010/09/07/transitioning-existing-code-to-the-es5-getter-setter-apis.aspx\n    // (second clause tests for Object.defineProperty() in IE<9 that only supports extending DOM prototypes, but\n    // note that IE<9 does not support __defineGetter__ or __defineSetter__ so it just renders the method harmless)\n\n    (function() {\n        var orig = Object.defineProperty;\n        var dom_only = !(function(){try{return Object.defineProperty({},'x',{});}catch(_){return false;}}());\n\n        if (!orig || dom_only) {\n            Object.defineProperty = function (o, prop, desc) {\n                // In IE8 try built-in implementation for defining properties on DOM prototypes.\n                if (orig)\n                    try { return orig(o, prop, desc); } catch (_) {}\n                if (o !== Object(o))\n                    throw TypeError('Object.defineProperty called on non-object');\n                if (Object.prototype.__defineGetter__ && ('get' in desc))\n                    Object.prototype.__defineGetter__.call(o, prop, desc.get);\n                if (Object.prototype.__defineSetter__ && ('set' in desc))\n                    Object.prototype.__defineSetter__.call(o, prop, desc.set);\n                if ('value' in desc)\n                    o[prop] = desc.value;\n                return o;\n            };\n        }\n    }());\n\n    // ES5: Make obj[index] an alias for obj._getter(index)/obj._setter(index, value)\n    // for index in 0 ... obj.length\n    function makeArrayAccessors(obj) {\n        if ('TYPED_ARRAY_POLYFILL_NO_ARRAY_ACCESSORS' in global)\n            return;\n\n        if (obj.length > MAX_ARRAY_LENGTH) throw RangeError('Array too large for polyfill');\n\n        function makeArrayAccessor(index) {\n            Object.defineProperty(obj, index, {\n                'get': function() { return obj._getter(index); },\n                'set': function(v) { obj._setter(index, v); },\n                enumerable: true,\n                configurable: false\n            });\n        }\n\n        var i;\n        for (i = 0; i < obj.length; i += 1) {\n            makeArrayAccessor(i);\n        }\n    }\n\n    // Internal conversion functions:\n    //    pack<Type>()   - take a number (interpreted as Type), output a byte array\n    //    unpack<Type>() - take a byte array, output a Type-like number\n\n    function as_signed(value, bits) { var s = 32 - bits; return (value << s) >> s; }\n    function as_unsigned(value, bits) { var s = 32 - bits; return (value << s) >>> s; }\n\n    function packI8(n) { return [n & 0xff]; }\n    function unpackI8(bytes) { return as_signed(bytes[0], 8); }\n\n    function packU8(n) { return [n & 0xff]; }\n    function unpackU8(bytes) { return as_unsigned(bytes[0], 8); }\n\n    function packU8Clamped(n) { n = round(Number(n)); return [n < 0 ? 0 : n > 0xff ? 0xff : n & 0xff]; }\n\n    function packI16(n) { return [n & 0xff, (n >> 8) & 0xff]; }\n    function unpackI16(bytes) { return as_signed(bytes[1] << 8 | bytes[0], 16); }\n\n    function packU16(n) { return [n & 0xff, (n >> 8) & 0xff]; }\n    function unpackU16(bytes) { return as_unsigned(bytes[1] << 8 | bytes[0], 16); }\n\n    function packI32(n) { return [n & 0xff, (n >> 8) & 0xff, (n >> 16) & 0xff, (n >> 24) & 0xff]; }\n    function unpackI32(bytes) { return as_signed(bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0], 32); }\n\n    function packU32(n) { return [n & 0xff, (n >> 8) & 0xff, (n >> 16) & 0xff, (n >> 24) & 0xff]; }\n    function unpackU32(bytes) { return as_unsigned(bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0], 32); }\n\n    function packIEEE754(v, ebits, fbits) {\n\n        var bias = (1 << (ebits - 1)) - 1;\n\n        function roundToEven(n) {\n            var w = floor(n), f = n - w;\n            if (f < 0.5)\n                return w;\n            if (f > 0.5)\n                return w + 1;\n            return w % 2 ? w + 1 : w;\n        }\n\n        // Compute sign, exponent, fraction\n        var s, e, f;\n        if (v !== v) {\n            // NaN\n            // http://dev.w3.org/2006/webapi/WebIDL/#es-type-mapping\n            e = (1 << ebits) - 1; f = pow(2, fbits - 1); s = 0;\n        } else if (v === Infinity || v === -Infinity) {\n            e = (1 << ebits) - 1; f = 0; s = (v < 0) ? 1 : 0;\n        } else if (v === 0) {\n            e = 0; f = 0; s = (1 / v === -Infinity) ? 1 : 0;\n        } else {\n            s = v < 0;\n            v = abs(v);\n\n            if (v >= pow(2, 1 - bias)) {\n                // Normalized\n                e = min(floor(log(v) / LN2), 1023);\n                var significand = v / pow(2, e);\n                if (significand < 1) {\n                    e -= 1;\n                    significand *= 2;\n                }\n                if (significand >= 2) {\n                    e += 1;\n                    significand /= 2;\n                }\n                var d = pow(2, fbits);\n                f = roundToEven(significand * d) - d;\n                e += bias;\n                if (f / d >= 1) {\n                    e += 1;\n                    f = 0;\n                }\n                if (e > 2 * bias) {\n                    // Overflow\n                    e = (1 << ebits) - 1;\n                    f = 0;\n                }\n            } else {\n                // Denormalized\n                e = 0;\n                f = roundToEven(v / pow(2, 1 - bias - fbits));\n            }\n        }\n\n        // Pack sign, exponent, fraction\n        var bits = [], i;\n        for (i = fbits; i; i -= 1) { bits.push(f % 2 ? 1 : 0); f = floor(f / 2); }\n        for (i = ebits; i; i -= 1) { bits.push(e % 2 ? 1 : 0); e = floor(e / 2); }\n        bits.push(s ? 1 : 0);\n        bits.reverse();\n        var str = bits.join('');\n\n        // Bits to bytes\n        var bytes = [];\n        while (str.length) {\n            bytes.unshift(parseInt(str.substring(0, 8), 2));\n            str = str.substring(8);\n        }\n        return bytes;\n    }\n\n    function unpackIEEE754(bytes, ebits, fbits) {\n        // Bytes to bits\n        var bits = [], i, j, b, str,\n            bias, s, e, f;\n\n        for (i = 0; i < bytes.length; ++i) {\n            b = bytes[i];\n            for (j = 8; j; j -= 1) {\n                bits.push(b % 2 ? 1 : 0); b = b >> 1;\n            }\n        }\n        bits.reverse();\n        str = bits.join('');\n\n        // Unpack sign, exponent, fraction\n        bias = (1 << (ebits - 1)) - 1;\n        s = parseInt(str.substring(0, 1), 2) ? -1 : 1;\n        e = parseInt(str.substring(1, 1 + ebits), 2);\n        f = parseInt(str.substring(1 + ebits), 2);\n\n        // Produce number\n        if (e === (1 << ebits) - 1) {\n            return f !== 0 ? NaN : s * Infinity;\n        } else if (e > 0) {\n            // Normalized\n            return s * pow(2, e - bias) * (1 + f / pow(2, fbits));\n        } else if (f !== 0) {\n            // Denormalized\n            return s * pow(2, -(bias - 1)) * (f / pow(2, fbits));\n        } else {\n            return s < 0 ? -0 : 0;\n        }\n    }\n\n    function unpackF64(b) { return unpackIEEE754(b, 11, 52); }\n    function packF64(v) { return packIEEE754(v, 11, 52); }\n    function unpackF32(b) { return unpackIEEE754(b, 8, 23); }\n    function packF32(v) { return packIEEE754(v, 8, 23); }\n\n    //\n    // 3 The ArrayBuffer Type\n    //\n\n    (function() {\n\n        function ArrayBuffer(length) {\n            length = ToInt32(length);\n            if (length < 0) throw RangeError('ArrayBuffer size is not a small enough positive integer.');\n            Object.defineProperty(this, 'byteLength', {value: length});\n            Object.defineProperty(this, '_bytes', {value: Array(length)});\n\n            for (var i = 0; i < length; i += 1)\n                this._bytes[i] = 0;\n        }\n\n        global.ArrayBuffer = global.ArrayBuffer || ArrayBuffer;\n\n        //\n        // 5 The Typed Array View Types\n        //\n\n        function $TypedArray$() {\n\n            // %TypedArray% ( length )\n            if (!arguments.length || typeof arguments[0] !== 'object') {\n                return (function(length) {\n                    length = ToInt32(length);\n                    if (length < 0) throw RangeError('length is not a small enough positive integer.');\n                    Object.defineProperty(this, 'length', {value: length});\n                    Object.defineProperty(this, 'byteLength', {value: length * this.BYTES_PER_ELEMENT});\n                    Object.defineProperty(this, 'buffer', {value: new ArrayBuffer(this.byteLength)});\n                    Object.defineProperty(this, 'byteOffset', {value: 0});\n\n                }).apply(this, arguments);\n            }\n\n            // %TypedArray% ( typedArray )\n            if (arguments.length >= 1 &&\n                Type(arguments[0]) === 'object' &&\n                arguments[0] instanceof $TypedArray$) {\n                return (function(typedArray){\n                    if (this.constructor !== typedArray.constructor) throw TypeError();\n\n                    var byteLength = typedArray.length * this.BYTES_PER_ELEMENT;\n                    Object.defineProperty(this, 'buffer', {value: new ArrayBuffer(byteLength)});\n                    Object.defineProperty(this, 'byteLength', {value: byteLength});\n                    Object.defineProperty(this, 'byteOffset', {value: 0});\n                    Object.defineProperty(this, 'length', {value: typedArray.length});\n\n                    for (var i = 0; i < this.length; i += 1)\n                        this._setter(i, typedArray._getter(i));\n\n                }).apply(this, arguments);\n            }\n\n            // %TypedArray% ( array )\n            if (arguments.length >= 1 &&\n                Type(arguments[0]) === 'object' &&\n                !(arguments[0] instanceof $TypedArray$) &&\n                !(arguments[0] instanceof ArrayBuffer || Class(arguments[0]) === 'ArrayBuffer')) {\n                return (function(array) {\n\n                    var byteLength = array.length * this.BYTES_PER_ELEMENT;\n                    Object.defineProperty(this, 'buffer', {value: new ArrayBuffer(byteLength)});\n                    Object.defineProperty(this, 'byteLength', {value: byteLength});\n                    Object.defineProperty(this, 'byteOffset', {value: 0});\n                    Object.defineProperty(this, 'length', {value: array.length});\n\n                    for (var i = 0; i < this.length; i += 1) {\n                        var s = array[i];\n                        this._setter(i, Number(s));\n                    }\n                }).apply(this, arguments);\n            }\n\n            // %TypedArray% ( buffer, byteOffset=0, length=undefined )\n            if (arguments.length >= 1 &&\n                Type(arguments[0]) === 'object' &&\n                (arguments[0] instanceof ArrayBuffer || Class(arguments[0]) === 'ArrayBuffer')) {\n                return (function(buffer, byteOffset, length) {\n\n                    byteOffset = ToUint32(byteOffset);\n                    if (byteOffset > buffer.byteLength)\n                        throw RangeError('byteOffset out of range');\n\n                    // The given byteOffset must be a multiple of the element\n                    // size of the specific type, otherwise an exception is raised.\n                    if (byteOffset % this.BYTES_PER_ELEMENT)\n                        throw RangeError('buffer length minus the byteOffset is not a multiple of the element size.');\n\n                    if (length === undefined) {\n                        var byteLength = buffer.byteLength - byteOffset;\n                        if (byteLength % this.BYTES_PER_ELEMENT)\n                            throw RangeError('length of buffer minus byteOffset not a multiple of the element size');\n                        length = byteLength / this.BYTES_PER_ELEMENT;\n\n                    } else {\n                        length = ToUint32(length);\n                        byteLength = length * this.BYTES_PER_ELEMENT;\n                    }\n\n                    if ((byteOffset + byteLength) > buffer.byteLength)\n                        throw RangeError('byteOffset and length reference an area beyond the end of the buffer');\n\n                    Object.defineProperty(this, 'buffer', {value: buffer});\n                    Object.defineProperty(this, 'byteLength', {value: byteLength});\n                    Object.defineProperty(this, 'byteOffset', {value: byteOffset});\n                    Object.defineProperty(this, 'length', {value: length});\n\n                }).apply(this, arguments);\n            }\n\n            // %TypedArray% ( all other argument combinations )\n            throw TypeError();\n        }\n\n        // Properties of the %TypedArray Instrinsic Object\n\n        // %TypedArray%.from ( source , mapfn=undefined, thisArg=undefined )\n        Object.defineProperty($TypedArray$, 'from', {value: function(iterable) {\n                return new this(iterable);\n            }});\n\n        // %TypedArray%.of ( ...items )\n        Object.defineProperty($TypedArray$, 'of', {value: function(/*...items*/) {\n                return new this(arguments);\n            }});\n\n        // %TypedArray%.prototype\n        var $TypedArrayPrototype$ = {};\n        $TypedArray$.prototype = $TypedArrayPrototype$;\n\n        // WebIDL: getter type (unsigned long index);\n        Object.defineProperty($TypedArray$.prototype, '_getter', {value: function(index) {\n                if (arguments.length < 1) throw SyntaxError('Not enough arguments');\n\n                index = ToUint32(index);\n                if (index >= this.length)\n                    return undefined;\n\n                var bytes = [], i, o;\n                for (i = 0, o = this.byteOffset + index * this.BYTES_PER_ELEMENT;\n                     i < this.BYTES_PER_ELEMENT;\n                     i += 1, o += 1) {\n                    bytes.push(this.buffer._bytes[o]);\n                }\n                return this._unpack(bytes);\n            }});\n\n        // NONSTANDARD: convenience alias for getter: type get(unsigned long index);\n        Object.defineProperty($TypedArray$.prototype, 'get', {value: $TypedArray$.prototype._getter});\n\n        // WebIDL: setter void (unsigned long index, type value);\n        Object.defineProperty($TypedArray$.prototype, '_setter', {value: function(index, value) {\n                if (arguments.length < 2) throw SyntaxError('Not enough arguments');\n\n                index = ToUint32(index);\n                if (index >= this.length)\n                    return;\n\n                var bytes = this._pack(value), i, o;\n                for (i = 0, o = this.byteOffset + index * this.BYTES_PER_ELEMENT;\n                     i < this.BYTES_PER_ELEMENT;\n                     i += 1, o += 1) {\n                    this.buffer._bytes[o] = bytes[i];\n                }\n            }});\n\n        // get %TypedArray%.prototype.buffer\n        // get %TypedArray%.prototype.byteLength\n        // get %TypedArray%.prototype.byteOffset\n        // -- applied directly to the object in the constructor\n\n        // %TypedArray%.prototype.constructor\n        Object.defineProperty($TypedArray$.prototype, 'constructor', {value: $TypedArray$});\n\n        // %TypedArray%.prototype.copyWithin (target, start, end = this.length )\n        Object.defineProperty($TypedArray$.prototype, 'copyWithin', {value: function(target, start) {\n                var end = arguments[2];\n\n                var o = ToObject(this);\n                var lenVal = o.length;\n                var len = ToUint32(lenVal);\n                len = max(len, 0);\n                var relativeTarget = ToInt32(target);\n                var to;\n                if (relativeTarget < 0)\n                    to = max(len + relativeTarget, 0);\n                else\n                    to = min(relativeTarget, len);\n                var relativeStart = ToInt32(start);\n                var from;\n                if (relativeStart < 0)\n                    from = max(len + relativeStart, 0);\n                else\n                    from = min(relativeStart, len);\n                var relativeEnd;\n                if (end === undefined)\n                    relativeEnd = len;\n                else\n                    relativeEnd = ToInt32(end);\n                var final;\n                if (relativeEnd < 0)\n                    final = max(len + relativeEnd, 0);\n                else\n                    final = min(relativeEnd, len);\n                var count = min(final - from, len - to);\n                var direction;\n                if (from < to && to < from + count) {\n                    direction = -1;\n                    from = from + count - 1;\n                    to = to + count - 1;\n                } else {\n                    direction = 1;\n                }\n                while (count > 0) {\n                    o._setter(to, o._getter(from));\n                    from = from + direction;\n                    to = to + direction;\n                    count = count - 1;\n                }\n                return o;\n            }});\n\n        // %TypedArray%.prototype.entries ( )\n        // -- defined in es6.js to shim browsers w/ native TypedArrays\n\n        // %TypedArray%.prototype.every ( callbackfn, thisArg = undefined )\n        Object.defineProperty($TypedArray$.prototype, 'every', {value: function(callbackfn) {\n                if (this === undefined || this === null) throw TypeError();\n                var t = Object(this);\n                var len = ToUint32(t.length);\n                if (!IsCallable(callbackfn)) throw TypeError();\n                var thisArg = arguments[1];\n                for (var i = 0; i < len; i++) {\n                    if (!callbackfn.call(thisArg, t._getter(i), i, t))\n                        return false;\n                }\n                return true;\n            }});\n\n        // %TypedArray%.prototype.fill (value, start = 0, end = this.length )\n        Object.defineProperty($TypedArray$.prototype, 'fill', {value: function(value) {\n                var start = arguments[1],\n                    end = arguments[2];\n\n                var o = ToObject(this);\n                var lenVal = o.length;\n                var len = ToUint32(lenVal);\n                len = max(len, 0);\n                var relativeStart = ToInt32(start);\n                var k;\n                if (relativeStart < 0)\n                    k = max((len + relativeStart), 0);\n                else\n                    k = min(relativeStart, len);\n                var relativeEnd;\n                if (end === undefined)\n                    relativeEnd = len;\n                else\n                    relativeEnd = ToInt32(end);\n                var final;\n                if (relativeEnd < 0)\n                    final = max((len + relativeEnd), 0);\n                else\n                    final = min(relativeEnd, len);\n                while (k < final) {\n                    o._setter(k, value);\n                    k += 1;\n                }\n                return o;\n            }});\n\n        // %TypedArray%.prototype.filter ( callbackfn, thisArg = undefined )\n        Object.defineProperty($TypedArray$.prototype, 'filter', {value: function(callbackfn) {\n                if (this === undefined || this === null) throw TypeError();\n                var t = Object(this);\n                var len = ToUint32(t.length);\n                if (!IsCallable(callbackfn)) throw TypeError();\n                var res = [];\n                var thisp = arguments[1];\n                for (var i = 0; i < len; i++) {\n                    var val = t._getter(i); // in case fun mutates this\n                    if (callbackfn.call(thisp, val, i, t))\n                        res.push(val);\n                }\n                return new this.constructor(res);\n            }});\n\n        // %TypedArray%.prototype.find (predicate, thisArg = undefined)\n        Object.defineProperty($TypedArray$.prototype, 'find', {value: function(predicate) {\n                var o = ToObject(this);\n                var lenValue = o.length;\n                var len = ToUint32(lenValue);\n                if (!IsCallable(predicate)) throw TypeError();\n                var t = arguments.length > 1 ? arguments[1] : undefined;\n                var k = 0;\n                while (k < len) {\n                    var kValue = o._getter(k);\n                    var testResult = predicate.call(t, kValue, k, o);\n                    if (Boolean(testResult))\n                        return kValue;\n                    ++k;\n                }\n                return undefined;\n            }});\n\n        // %TypedArray%.prototype.findIndex ( predicate, thisArg = undefined )\n        Object.defineProperty($TypedArray$.prototype, 'findIndex', {value: function(predicate) {\n                var o = ToObject(this);\n                var lenValue = o.length;\n                var len = ToUint32(lenValue);\n                if (!IsCallable(predicate)) throw TypeError();\n                var t = arguments.length > 1 ? arguments[1] : undefined;\n                var k = 0;\n                while (k < len) {\n                    var kValue = o._getter(k);\n                    var testResult = predicate.call(t, kValue, k, o);\n                    if (Boolean(testResult))\n                        return k;\n                    ++k;\n                }\n                return -1;\n            }});\n\n        // %TypedArray%.prototype.forEach ( callbackfn, thisArg = undefined )\n        Object.defineProperty($TypedArray$.prototype, 'forEach', {value: function(callbackfn) {\n                if (this === undefined || this === null) throw TypeError();\n                var t = Object(this);\n                var len = ToUint32(t.length);\n                if (!IsCallable(callbackfn)) throw TypeError();\n                var thisp = arguments[1];\n                for (var i = 0; i < len; i++)\n                    callbackfn.call(thisp, t._getter(i), i, t);\n            }});\n\n        // %TypedArray%.prototype.indexOf (searchElement, fromIndex = 0 )\n        Object.defineProperty($TypedArray$.prototype, 'indexOf', {value: function(searchElement) {\n                if (this === undefined || this === null) throw TypeError();\n                var t = Object(this);\n                var len = ToUint32(t.length);\n                if (len === 0) return -1;\n                var n = 0;\n                if (arguments.length > 0) {\n                    n = Number(arguments[1]);\n                    if (n !== n) {\n                        n = 0;\n                    } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {\n                        n = (n > 0 || -1) * floor(abs(n));\n                    }\n                }\n                if (n >= len) return -1;\n                var k = n >= 0 ? n : max(len - abs(n), 0);\n                for (; k < len; k++) {\n                    if (t._getter(k) === searchElement) {\n                        return k;\n                    }\n                }\n                return -1;\n            }});\n\n        // %TypedArray%.prototype.join ( separator )\n        Object.defineProperty($TypedArray$.prototype, 'join', {value: function(separator) {\n                if (this === undefined || this === null) throw TypeError();\n                var t = Object(this);\n                var len = ToUint32(t.length);\n                var tmp = Array(len);\n                for (var i = 0; i < len; ++i)\n                    tmp[i] = t._getter(i);\n                return tmp.join(separator === undefined ? ',' : separator); // Hack for IE7\n            }});\n\n        // %TypedArray%.prototype.keys ( )\n        // -- defined in es6.js to shim browsers w/ native TypedArrays\n\n        // %TypedArray%.prototype.lastIndexOf ( searchElement, fromIndex = this.length-1 )\n        Object.defineProperty($TypedArray$.prototype, 'lastIndexOf', {value: function(searchElement) {\n                if (this === undefined || this === null) throw TypeError();\n                var t = Object(this);\n                var len = ToUint32(t.length);\n                if (len === 0) return -1;\n                var n = len;\n                if (arguments.length > 1) {\n                    n = Number(arguments[1]);\n                    if (n !== n) {\n                        n = 0;\n                    } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {\n                        n = (n > 0 || -1) * floor(abs(n));\n                    }\n                }\n                var k = n >= 0 ? min(n, len - 1) : len - abs(n);\n                for (; k >= 0; k--) {\n                    if (t._getter(k) === searchElement)\n                        return k;\n                }\n                return -1;\n            }});\n\n        // get %TypedArray%.prototype.length\n        // -- applied directly to the object in the constructor\n\n        // %TypedArray%.prototype.map ( callbackfn, thisArg = undefined )\n        Object.defineProperty($TypedArray$.prototype, 'map', {value: function(callbackfn) {\n                if (this === undefined || this === null) throw TypeError();\n                var t = Object(this);\n                var len = ToUint32(t.length);\n                if (!IsCallable(callbackfn)) throw TypeError();\n                var res = []; res.length = len;\n                var thisp = arguments[1];\n                for (var i = 0; i < len; i++)\n                    res[i] = callbackfn.call(thisp, t._getter(i), i, t);\n                return new this.constructor(res);\n            }});\n\n        // %TypedArray%.prototype.reduce ( callbackfn [, initialValue] )\n        Object.defineProperty($TypedArray$.prototype, 'reduce', {value: function(callbackfn) {\n                if (this === undefined || this === null) throw TypeError();\n                var t = Object(this);\n                var len = ToUint32(t.length);\n                if (!IsCallable(callbackfn)) throw TypeError();\n                // no value to return if no initial value and an empty array\n                if (len === 0 && arguments.length === 1) throw TypeError();\n                var k = 0;\n                var accumulator;\n                if (arguments.length >= 2) {\n                    accumulator = arguments[1];\n                } else {\n                    accumulator = t._getter(k++);\n                }\n                while (k < len) {\n                    accumulator = callbackfn.call(undefined, accumulator, t._getter(k), k, t);\n                    k++;\n                }\n                return accumulator;\n            }});\n\n        // %TypedArray%.prototype.reduceRight ( callbackfn [, initialValue] )\n        Object.defineProperty($TypedArray$.prototype, 'reduceRight', {value: function(callbackfn) {\n                if (this === undefined || this === null) throw TypeError();\n                var t = Object(this);\n                var len = ToUint32(t.length);\n                if (!IsCallable(callbackfn)) throw TypeError();\n                // no value to return if no initial value, empty array\n                if (len === 0 && arguments.length === 1) throw TypeError();\n                var k = len - 1;\n                var accumulator;\n                if (arguments.length >= 2) {\n                    accumulator = arguments[1];\n                } else {\n                    accumulator = t._getter(k--);\n                }\n                while (k >= 0) {\n                    accumulator = callbackfn.call(undefined, accumulator, t._getter(k), k, t);\n                    k--;\n                }\n                return accumulator;\n            }});\n\n        // %TypedArray%.prototype.reverse ( )\n        Object.defineProperty($TypedArray$.prototype, 'reverse', {value: function() {\n                if (this === undefined || this === null) throw TypeError();\n                var t = Object(this);\n                var len = ToUint32(t.length);\n                var half = floor(len / 2);\n                for (var i = 0, j = len - 1; i < half; ++i, --j) {\n                    var tmp = t._getter(i);\n                    t._setter(i, t._getter(j));\n                    t._setter(j, tmp);\n                }\n                return t;\n            }});\n\n        // %TypedArray%.prototype.set(array, offset = 0 )\n        // %TypedArray%.prototype.set(typedArray, offset = 0 )\n        // WebIDL: void set(TypedArray array, optional unsigned long offset);\n        // WebIDL: void set(sequence<type> array, optional unsigned long offset);\n        Object.defineProperty($TypedArray$.prototype, 'set', {value: function(index, value) {\n                if (arguments.length < 1) throw SyntaxError('Not enough arguments');\n                var array, sequence, offset, len,\n                    i, s, d,\n                    byteOffset, byteLength, tmp;\n\n                if (typeof arguments[0] === 'object' && arguments[0].constructor === this.constructor) {\n                    // void set(TypedArray array, optional unsigned long offset);\n                    array = arguments[0];\n                    offset = ToUint32(arguments[1]);\n\n                    if (offset + array.length > this.length) {\n                        throw RangeError('Offset plus length of array is out of range');\n                    }\n\n                    byteOffset = this.byteOffset + offset * this.BYTES_PER_ELEMENT;\n                    byteLength = array.length * this.BYTES_PER_ELEMENT;\n\n                    if (array.buffer === this.buffer) {\n                        tmp = [];\n                        for (i = 0, s = array.byteOffset; i < byteLength; i += 1, s += 1) {\n                            tmp[i] = array.buffer._bytes[s];\n                        }\n                        for (i = 0, d = byteOffset; i < byteLength; i += 1, d += 1) {\n                            this.buffer._bytes[d] = tmp[i];\n                        }\n                    } else {\n                        for (i = 0, s = array.byteOffset, d = byteOffset;\n                             i < byteLength; i += 1, s += 1, d += 1) {\n                            this.buffer._bytes[d] = array.buffer._bytes[s];\n                        }\n                    }\n                } else if (typeof arguments[0] === 'object' && typeof arguments[0].length !== 'undefined') {\n                    // void set(sequence<type> array, optional unsigned long offset);\n                    sequence = arguments[0];\n                    len = ToUint32(sequence.length);\n                    offset = ToUint32(arguments[1]);\n\n                    if (offset + len > this.length) {\n                        throw RangeError('Offset plus length of array is out of range');\n                    }\n\n                    for (i = 0; i < len; i += 1) {\n                        s = sequence[i];\n                        this._setter(offset + i, Number(s));\n                    }\n                } else {\n                    throw TypeError('Unexpected argument type(s)');\n                }\n            }});\n\n        // %TypedArray%.prototype.slice ( start, end )\n        Object.defineProperty($TypedArray$.prototype, 'slice', {value: function(start, end) {\n                var o = ToObject(this);\n                var lenVal = o.length;\n                var len = ToUint32(lenVal);\n                var relativeStart = ToInt32(start);\n                var k = (relativeStart < 0) ? max(len + relativeStart, 0) : min(relativeStart, len);\n                var relativeEnd = (end === undefined) ? len : ToInt32(end);\n                var final = (relativeEnd < 0) ? max(len + relativeEnd, 0) : min(relativeEnd, len);\n                var count = final - k;\n                var c = o.constructor;\n                var a = new c(count);\n                var n = 0;\n                while (k < final) {\n                    var kValue = o._getter(k);\n                    a._setter(n, kValue);\n                    ++k;\n                    ++n;\n                }\n                return a;\n            }});\n\n        // %TypedArray%.prototype.some ( callbackfn, thisArg = undefined )\n        Object.defineProperty($TypedArray$.prototype, 'some', {value: function(callbackfn) {\n                if (this === undefined || this === null) throw TypeError();\n                var t = Object(this);\n                var len = ToUint32(t.length);\n                if (!IsCallable(callbackfn)) throw TypeError();\n                var thisp = arguments[1];\n                for (var i = 0; i < len; i++) {\n                    if (callbackfn.call(thisp, t._getter(i), i, t)) {\n                        return true;\n                    }\n                }\n                return false;\n            }});\n\n        // %TypedArray%.prototype.sort ( comparefn )\n        Object.defineProperty($TypedArray$.prototype, 'sort', {value: function(comparefn) {\n                if (this === undefined || this === null) throw TypeError();\n                var t = Object(this);\n                var len = ToUint32(t.length);\n                var tmp = Array(len);\n                for (var i = 0; i < len; ++i)\n                    tmp[i] = t._getter(i);\n                function sortCompare(x, y) {\n                    if (x !== x && y !== y) return +0;\n                    if (x !== x) return 1;\n                    if (y !== y) return -1;\n                    if (comparefn !== undefined) {\n                        return comparefn(x, y);\n                    }\n                    if (x < y) return -1;\n                    if (x > y) return 1;\n                    return +0;\n                }\n                tmp.sort(sortCompare);\n                for (i = 0; i < len; ++i)\n                    t._setter(i, tmp[i]);\n                return t;\n            }});\n\n        // %TypedArray%.prototype.subarray(begin = 0, end = this.length )\n        // WebIDL: TypedArray subarray(long begin, optional long end);\n        Object.defineProperty($TypedArray$.prototype, 'subarray', {value: function(start, end) {\n                function clamp(v, min, max) { return v < min ? min : v > max ? max : v; }\n\n                start = ToInt32(start);\n                end = ToInt32(end);\n\n                if (arguments.length < 1) { start = 0; }\n                if (arguments.length < 2) { end = this.length; }\n\n                if (start < 0) { start = this.length + start; }\n                if (end < 0) { end = this.length + end; }\n\n                start = clamp(start, 0, this.length);\n                end = clamp(end, 0, this.length);\n\n                var len = end - start;\n                if (len < 0) {\n                    len = 0;\n                }\n\n                return new this.constructor(\n                    this.buffer, this.byteOffset + start * this.BYTES_PER_ELEMENT, len);\n            }});\n\n        // %TypedArray%.prototype.toLocaleString ( )\n        // %TypedArray%.prototype.toString ( )\n        // %TypedArray%.prototype.values ( )\n        // %TypedArray%.prototype [ @@iterator ] ( )\n        // get %TypedArray%.prototype [ @@toStringTag ]\n        // -- defined in es6.js to shim browsers w/ native TypedArrays\n\n        function makeTypedArray(elementSize, pack, unpack) {\n            // Each TypedArray type requires a distinct constructor instance with\n            // identical logic, which this produces.\n            var TypedArray = function() {\n                Object.defineProperty(this, 'constructor', {value: TypedArray});\n                $TypedArray$.apply(this, arguments);\n                makeArrayAccessors(this);\n            };\n            if ('__proto__' in TypedArray) {\n                TypedArray.__proto__ = $TypedArray$;\n            } else {\n                TypedArray.from = $TypedArray$.from;\n                TypedArray.of = $TypedArray$.of;\n            }\n\n            TypedArray.BYTES_PER_ELEMENT = elementSize;\n\n            var TypedArrayPrototype = function() {};\n            TypedArrayPrototype.prototype = $TypedArrayPrototype$;\n\n            TypedArray.prototype = new TypedArrayPrototype();\n\n            Object.defineProperty(TypedArray.prototype, 'BYTES_PER_ELEMENT', {value: elementSize});\n            Object.defineProperty(TypedArray.prototype, '_pack', {value: pack});\n            Object.defineProperty(TypedArray.prototype, '_unpack', {value: unpack});\n\n            return TypedArray;\n        }\n\n        var Int8Array = makeTypedArray(1, packI8, unpackI8);\n        var Uint8Array = makeTypedArray(1, packU8, unpackU8);\n        var Uint8ClampedArray = makeTypedArray(1, packU8Clamped, unpackU8);\n        var Int16Array = makeTypedArray(2, packI16, unpackI16);\n        var Uint16Array = makeTypedArray(2, packU16, unpackU16);\n        var Int32Array = makeTypedArray(4, packI32, unpackI32);\n        var Uint32Array = makeTypedArray(4, packU32, unpackU32);\n        var Float32Array = makeTypedArray(4, packF32, unpackF32);\n        var Float64Array = makeTypedArray(8, packF64, unpackF64);\n\n        global.Int8Array = global.Int8Array || Int8Array;\n        global.Uint8Array = global.Uint8Array || Uint8Array;\n        global.Uint8ClampedArray = global.Uint8ClampedArray || Uint8ClampedArray;\n        global.Int16Array = global.Int16Array || Int16Array;\n        global.Uint16Array = global.Uint16Array || Uint16Array;\n        global.Int32Array = global.Int32Array || Int32Array;\n        global.Uint32Array = global.Uint32Array || Uint32Array;\n        global.Float32Array = global.Float32Array || Float32Array;\n        global.Float64Array = global.Float64Array || Float64Array;\n    }());\n\n    //\n    // 6 The DataView View Type\n    //\n\n    (function() {\n        function r(array, index) {\n            return IsCallable(array.get) ? array.get(index) : array[index];\n        }\n\n        var IS_BIG_ENDIAN = (function() {\n            var u16array = new Uint16Array([0x1234]),\n                u8array = new Uint8Array(u16array.buffer);\n            return r(u8array, 0) === 0x12;\n        }());\n\n        // DataView(buffer, byteOffset=0, byteLength=undefined)\n        // WebIDL: Constructor(ArrayBuffer buffer,\n        //                     optional unsigned long byteOffset,\n        //                     optional unsigned long byteLength)\n        function DataView(buffer, byteOffset, byteLength) {\n            if (!(buffer instanceof ArrayBuffer || Class(buffer) === 'ArrayBuffer')) throw TypeError();\n\n            byteOffset = ToUint32(byteOffset);\n            if (byteOffset > buffer.byteLength)\n                throw RangeError('byteOffset out of range');\n\n            if (byteLength === undefined)\n                byteLength = buffer.byteLength - byteOffset;\n            else\n                byteLength = ToUint32(byteLength);\n\n            if ((byteOffset + byteLength) > buffer.byteLength)\n                throw RangeError('byteOffset and length reference an area beyond the end of the buffer');\n\n            Object.defineProperty(this, 'buffer', {value: buffer});\n            Object.defineProperty(this, 'byteLength', {value: byteLength});\n            Object.defineProperty(this, 'byteOffset', {value: byteOffset});\n        };\n\n        // get DataView.prototype.buffer\n        // get DataView.prototype.byteLength\n        // get DataView.prototype.byteOffset\n        // -- applied directly to instances by the constructor\n\n        function makeGetter(arrayType) {\n            return function GetViewValue(byteOffset, littleEndian) {\n                byteOffset = ToUint32(byteOffset);\n\n                if (byteOffset + arrayType.BYTES_PER_ELEMENT > this.byteLength)\n                    throw RangeError('Array index out of range');\n\n                byteOffset += this.byteOffset;\n\n                var uint8Array = new Uint8Array(this.buffer, byteOffset, arrayType.BYTES_PER_ELEMENT),\n                    bytes = [];\n                for (var i = 0; i < arrayType.BYTES_PER_ELEMENT; i += 1)\n                    bytes.push(r(uint8Array, i));\n\n                if (Boolean(littleEndian) === Boolean(IS_BIG_ENDIAN))\n                    bytes.reverse();\n\n                return r(new arrayType(new Uint8Array(bytes).buffer), 0);\n            };\n        }\n\n        Object.defineProperty(DataView.prototype, 'getUint8', {value: makeGetter(Uint8Array)});\n        Object.defineProperty(DataView.prototype, 'getInt8', {value: makeGetter(Int8Array)});\n        Object.defineProperty(DataView.prototype, 'getUint16', {value: makeGetter(Uint16Array)});\n        Object.defineProperty(DataView.prototype, 'getInt16', {value: makeGetter(Int16Array)});\n        Object.defineProperty(DataView.prototype, 'getUint32', {value: makeGetter(Uint32Array)});\n        Object.defineProperty(DataView.prototype, 'getInt32', {value: makeGetter(Int32Array)});\n        Object.defineProperty(DataView.prototype, 'getFloat32', {value: makeGetter(Float32Array)});\n        Object.defineProperty(DataView.prototype, 'getFloat64', {value: makeGetter(Float64Array)});\n\n        function makeSetter(arrayType) {\n            return function SetViewValue(byteOffset, value, littleEndian) {\n                byteOffset = ToUint32(byteOffset);\n                if (byteOffset + arrayType.BYTES_PER_ELEMENT > this.byteLength)\n                    throw RangeError('Array index out of range');\n\n                // Get bytes\n                var typeArray = new arrayType([value]),\n                    byteArray = new Uint8Array(typeArray.buffer),\n                    bytes = [], i, byteView;\n\n                for (i = 0; i < arrayType.BYTES_PER_ELEMENT; i += 1)\n                    bytes.push(r(byteArray, i));\n\n                // Flip if necessary\n                if (Boolean(littleEndian) === Boolean(IS_BIG_ENDIAN))\n                    bytes.reverse();\n\n                // Write them\n                byteView = new Uint8Array(this.buffer, byteOffset, arrayType.BYTES_PER_ELEMENT);\n                byteView.set(bytes);\n            };\n        }\n\n        Object.defineProperty(DataView.prototype, 'setUint8', {value: makeSetter(Uint8Array)});\n        Object.defineProperty(DataView.prototype, 'setInt8', {value: makeSetter(Int8Array)});\n        Object.defineProperty(DataView.prototype, 'setUint16', {value: makeSetter(Uint16Array)});\n        Object.defineProperty(DataView.prototype, 'setInt16', {value: makeSetter(Int16Array)});\n        Object.defineProperty(DataView.prototype, 'setUint32', {value: makeSetter(Uint32Array)});\n        Object.defineProperty(DataView.prototype, 'setInt32', {value: makeSetter(Int32Array)});\n        Object.defineProperty(DataView.prototype, 'setFloat32', {value: makeSetter(Float32Array)});\n        Object.defineProperty(DataView.prototype, 'setFloat64', {value: makeSetter(Float64Array)});\n\n        global.DataView = global.DataView || DataView;\n\n    }());\n\n}(this));\n\n\n\n\n\nif (typeof Object.assign != 'function') {\n    Object.defineProperty(Object, \"assign\", {\n        value: function assign(target, varArgs) {\n            'use strict';\n            if (target == null) {\n                throw new TypeError('Cannot convert undefined or null to object');\n            }\n            var to = Object(target);\n            for (var index = 1; index < arguments.length; index++) {\n                var nextSource = arguments[index];\n                if (nextSource != null) {\n                    for (var nextKey in nextSource) {\n                        if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n                            to[nextKey] = nextSource[nextKey];\n                        }\n                    }\n                }\n            }\n            return to;\n        },\n        writable: true,\n        configurable: true\n    });\n};\n\n/* Code from package\\dist\\buffer-custom-shim.js */\n/**\n * Buffer override for browsers compatibility\n */\nfunction Buffer(string, encoding) {\n    return fromHexString(string);\n};\n/**\n * Buffer::from override for browsers compatibility\n */\nBuffer.from = function (string, encoding) {\n    return fromHexString(string);\n};\n/**\n * Buffer::alloc override for browsers compatibility\n */\nBuffer.alloc = function (length) {\n    return new Uint8Array(length);\n};\n/**\n * Uint8Array::readUInt16BE override for browsers compatibility\n */\nUint8Array.prototype.readUInt16BE = function (offset) {\n    var dataView = new DataView(this.buffer);\n    return dataView.getUint16(offset);\n};\n/**\n * Uint8Array::readInt16BE override for browsers compatibility\n */\nUint8Array.prototype.readInt16BE = function (offset) {\n    var dataView = new DataView(this.buffer);\n    return dataView.getInt16(offset);\n};\n/**\n * Uint8Array::readUInt8 override for browsers compatibility\n */\nUint8Array.prototype.readUInt8 = function (offset) {\n    var dataView = new DataView(this.buffer);\n    return dataView.getUint8(offset);\n};\n/**\n * Uint8Array::readUInt32BE override for browsers compatibility\n */\nUint8Array.prototype.readUInt32BE = function (offset) {\n    var dataView = new DataView(this.buffer);\n    return dataView.getUint32(offset);\n};\n/**\n * Uint8Array::writeUInt16BE override for browsers compatibility\n */\nUint8Array.prototype.writeUInt16BE = function (value, offset) {\n    var dataView = new DataView(this.buffer);\n    return dataView.setUint16(offset, value);\n};\n/**\n * Uint8Array::writeUInt8 override for browsers compatibility\n */\nUint8Array.prototype.writeUInt8 = function (value, offset) {\n    var dataView = new DataView(this.buffer);\n    return dataView.setUint8(offset, value);\n};\n/**\n * Uint8Array::writeUInt32BE override for browsers compatibility\n */\nUint8Array.prototype.writeUInt32BE = function (value, offset) {\n    var dataView = new DataView(this.buffer);\n    return dataView.setUint32(offset, value);\n};\n/**\n * From hex string\n * @param {string} hexString\n */\nfunction fromHexString(hexString) {\n    var matches = hexString.match(/.{1,2}/g);\n    if (!matches) {\n        return new Uint8Array();\n    }\n    return new Uint8Array(\n        matches.map(function (byte) {\n            return parseInt(byte, 16);\n        })\n    );\n};\n\n\n// >>> lib codec START\n\n/**\n *              _                  _     \n *     /\\      | |                (_)    \n *    /  \\   __| | ___ _   _ _ __  _ ___ \n *   / /\\ \\ / _` |/ _ \\ | | | '_ \\| / __|\n *  / ____ \\ (_| |  __/ |_| | | | | \\__ \\\n * /_/    \\_\\__,_|\\___|\\__,_|_| |_|_|___/\n *                                       \n * \n * JavaScript/Node.js library of Adeunis codecs v1.6.1\n * Supported products: ANALOG, BREATH, COMFORT, COMFORT 2, COMFORT CO2, DELTA P, DRY CONTACTS, DRY CONTACTS 2, MOTION, \n *   PULSE, PULSE 3, PULSE 4, PULSE 4 NB-IoT, REPEATER, TEMP, TEMP 3, TEMP 4, TIC CBE LINKY, TIC PME-PMI\n * \n * This source code is provided \"as-is\" and with no warranties. Adeunis is not responsible for its use.\n * \n */\n\n\"use strict\";\nvar __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n        if (ar || !(i in from)) {\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n            ar[i] = from[i];\n        }\n    }\n    return to.concat(ar || Array.prototype.slice.call(from));\n};\nvar codec;\n(function (codec) {\n    /**\n     * Decoder class.\n     *\n     * Main class for decoding purposes.\n     * Contains declaration of all required parsers and decode() method (API entry point).\n     *\n     * See below for explanations on parsers.\n     */\n    var Decoder = /** @class */ (function () {\n        /**\n         * Constructor\n         * @param options option object\n         *   option.codecStorage: implementation of CodecStorage to use for external storage, leave blank if unknown\n         */\n        function Decoder(options) {\n            /**\n             * Parsers declaration.\n             *\n             * Array of parser implementations that can be used by the library.\n             *\n             * Parsers are specific handlers for parsing frame of a device type and a frame code.\n             */\n            this.parsers = [\n                // 1. Generic parsers not used for REPEATER\n                // 2. GenericStatusByteParser() must be allocated only by custom parser.\n                // => Default status byte parser must be GenericStatusByteExtParser()\n                // new GenericStatusByteParser(),\n                new codec.GenericStatusByteExtParser(),\n                new codec.Generic0x1fParser(),\n                new codec.Generic0x20Parser(),\n                new codec.Generic0x2fParser(),\n                new codec.Generic0x30Parser(),\n                new codec.Generic0x33Parser(),\n                new codec.Generic0x36Parser(),\n                new codec.Generic0x37Parser(),\n                new codec.Generic0x51Parser(),\n                new codec.Generic0x52Parser(),\n                // DRYCONTACTS product\n                new codec.DrycontactsStatusByteParser(),\n                new codec.Drycontacts0x10Parser(),\n                new codec.Drycontacts0x40Parser(),\n                // DRYCONTACTS 2 product\n                new codec.Drycontacts2StatusByteParser(),\n                new codec.Drycontacts20x10Parser(),\n                new codec.Drycontacts20x30Parser(),\n                new codec.Drycontacts20x40Parser(),\n                new codec.Drycontacts20x41Parser(),\n                new codec.Drycontacts20x59Parser(),\n                // PULSE product\n                new codec.PulseStatusByteParser(),\n                new codec.Pulse0x10Parser(),\n                new codec.Pulse0x11Parser(),\n                new codec.Pulse0x12Parser(),\n                new codec.Pulse0x30Parser(),\n                new codec.Pulse0x46Parser(),\n                new codec.Pulse0x47Parser(),\n                new codec.Pulse0x48Parser(),\n                // Pulse 3 product\n                new codec.PulseV30x10Parser(),\n                new codec.PulseV30x11Parser(),\n                new codec.PulseV30x12Parser(),\n                new codec.PulseV30x30Parser(),\n                new codec.PulseV30x46Parser(),\n                new codec.PulseV30x47Parser(),\n                new codec.PulseV30x5aParser(),\n                new codec.PulseV30x5bParser(),\n                // Pulse 4 product\n                new codec.PulseV4StatusByteParser(),\n                new codec.PulseV40x10Parser(),\n                new codec.PulseV40x11Parser(),\n                new codec.PulseV40x12Parser(),\n                new codec.PulseV40x30Parser(),\n                new codec.PulseV40x46Parser(),\n                new codec.PulseV40x47Parser(),\n                new codec.PulseV40x5aParser(),\n                new codec.PulseV40x5bParser(),\n                // Pulse 4 NB-IoT product\n                new codec.PulseV4NbIotStatusByteParser(),\n                new codec.PulseV4NbIot0x10Parser(),\n                new codec.PulseV4NbIot0x20Parser(),\n                new codec.PulseV4NbIot0x30Parser(),\n                new codec.PulseV4NbIot0x33Parser(),\n                new codec.PulseV4NbIot0x46Parser(),\n                new codec.PulseV4NbIot0x47Parser(),\n                new codec.PulseV4NbIot0x5aParser(),\n                new codec.PulseV4NbIot0x5bParser(),\n                // TEMP product\n                new codec.TempStatusByteParser(),\n                new codec.Temp0x10Parser(),\n                new codec.Temp0x11Parser(),\n                new codec.Temp0x12Parser(),\n                new codec.Temp0x30Parser(),\n                new codec.Temp0x43Parser(),\n                // Temp 3 product\n                new codec.TempV3StatusByteParser(),\n                new codec.TempV30x10Parser(),\n                new codec.TempV30x30Parser(),\n                new codec.TempV30x57Parser(),\n                new codec.TempV30x58Parser(),\n                // temp 4 product\n                new codec.TempV4StatusByteParser(),\n                new codec.TempV40x10Parser(),\n                new codec.TempV40x30Parser(),\n                new codec.TempV40x57Parser(),\n                new codec.TempV40x58Parser(),\n                // COMFORT product\n                new codec.Comfort0x10Parser(),\n                new codec.Comfort0x4cParser(),\n                new codec.Comfort0x4dParser(),\n                // COMFORT 2 product\n                new codec.Comfort2StatusByteParser(),\n                new codec.Comfort20x10Parser(),\n                new codec.Comfort20x4cParser(),\n                new codec.Comfort20x4dParser(),\n                // COMFORT Co2 product\n                new codec.ComfortCo2StatusByteParser(),\n                new codec.ComfortCo20x10Parser(),\n                new codec.ComfortCo20x6aParser(),\n                new codec.ComfortCo20x6bParser(),\n                new codec.ComfortCo20x30Parser(),\n                // MOTION product\n                new codec.Motion0x10Parser(),\n                new codec.Motion0x4eParser(),\n                new codec.Motion0x4fParser(),\n                new codec.Motion0x50Parser(),\n                new codec.Motion0x5cParser(),\n                new codec.Motion0x5dParser(),\n                // REPEATER product\n                new codec.RepeaterStatusByteParser(),\n                new codec.Repeater0x01Parser(),\n                new codec.Repeater0x02Parser(),\n                new codec.Repeater0x03Parser(),\n                new codec.Repeater0x04Parser(),\n                // DELTAP product\n                new codec.Deltap0x10Parser(),\n                new codec.Deltap0x11Parser(),\n                new codec.Deltap0x2fParser(),\n                new codec.Deltap0x53Parser(),\n                new codec.Deltap0x54Parser(),\n                new codec.Deltap0x55Parser(),\n                new codec.Deltap0x56Parser(),\n                // Analog product\n                new codec.AnalogStatusByteParser(),\n                new codec.Analog0x10Parser(),\n                new codec.Analog0x11Parser(),\n                new codec.Analog0x12Parser(),\n                new codec.Analog0x13Parser(),\n                new codec.Analog0x14Parser(),\n                new codec.Analog0x30Parser(),\n                new codec.Analog0x42Parser(),\n                // TIC product\n                new codec.TicStatusByteParser(),\n                new codec.Tic0x10Parser(),\n                new codec.Tic0x49Parser(),\n                new codec.Tic0x4aParser(),\n                // Breath product\n                new codec.BreathStatusByteParser(),\n                new codec.Breath0x6dParser(),\n                new codec.Breath0x6eParser(),\n                new codec.Breath0x10Parser(),\n                new codec.Breath0x30Parser(),\n            ];\n            if (options && options.codecStorage) {\n                // External storage: Node-RED...\n                this.codecStorage = options.codecStorage;\n            }\n            else if (typeof localStorage !== 'undefined') {\n                // Local storage: browser\n                this.codecStorage = localStorage;\n            }\n            else {\n                // Default (JS object)\n                this.codecStorage = new codec.InternalCodecStorage();\n            }\n            // TODO: check parsers uniqueness\n        }\n        /**\n         * Get supported device types and frame codes.\n         *\n         * The returned pairs are available for decoding.\n         */\n        Decoder.prototype.getSupported = function () {\n            var list = [];\n            this.parsers\n                .map(function (p) { return (p.deviceType.split('|').map(function (q) { return list.push({\n                deviceType: q,\n                frameCode: p.frameCode\n            }); })); });\n            return list;\n        };\n        /**\n         * Find device types\n         * @param payloadString payload as hexadecimal string\n         */\n        Decoder.prototype.findDeviceTypes = function (payloadString) {\n            // Check arguments\n            if (!/^(?:[0-9a-f]{2}){2,}$/gi.test(payloadString)) {\n                return [];\n            }\n            // Get buffer and frame code\n            var payload = Buffer.from(payloadString, 'hex');\n            var frameCode = payload[0];\n            var deviceTypesFull = this.parsers\n                .filter(function (p) { return p.frameCode === frameCode; })\n                .map(function (p) { return p.deviceType; });\n            return Array.from(new Set(deviceTypesFull));\n        };\n        /**\n         * Decode given payload.\n         * @param payloadString payload as hexadecimal string\n         * @param devId device ID: LoRa device EUI or Sigfox ID, leave blank if unknown\n         * @param network network: lora868 or sigfox\n         * @returns decoded data as JSON object\n         */\n        Decoder.prototype.decode = function (payloadString, devId, network) {\n            if (devId === void 0) { devId = 'tmpDevId'; }\n            if (network === void 0) { network = 'unknown'; }\n            // Check arguments\n            if (!/^(?:[0-9a-f]{2}){2,}$/gi.test(payloadString)) {\n                return { type: 'Invalid' };\n            }\n            // Get buffer and frame code\n            var payload = Buffer.from(payloadString, 'hex');\n            var frameCode = payload[0];\n            // Handle device type\n            var deviceType = this.fetchDeviceType(devId);\n            // Specific hook for NB-IoT products that have an additional header (13 bytes) before classic frame content\n            if (deviceType === 'pulse4nbiot') {\n                frameCode = payload[13 + 0];\n            }\n            // Handle configuration\n            var configuration;\n            if (frameCode === 0x10) {\n                configuration = payload;\n                this.storeConfiguration(configuration, devId);\n            }\n            else {\n                configuration = this.fetchConfiguration(devId);\n            }\n            // Handle specific parsing\n            var activeParsers = this.getActiveParsers(deviceType, frameCode);\n            var partialContents = activeParsers.map(function (p) {\n                var partialContent;\n                try {\n                    partialContent = p.parseFrame(payload, configuration, network, deviceType);\n                }\n                catch (error) {\n                    partialContent = { 'error': error.toString() };\n                }\n                return partialContent;\n            });\n            // Handle unsupported\n            if (activeParsers.every(function (p) { return p.frameCode < 0; })) {\n                partialContents.push({ type: 'Unsupported' });\n            }\n            // Merge partial contents\n            var content = Object.assign.apply(Object, __spreadArray([{}], partialContents, false));\n            // Put 'type' at first position\n            var typestr = content['type'];\n            delete content['type'];\n            content = Object.assign({ type: typestr }, content);\n            return content;\n        };\n        /**\n         * Set device type for given device ID.\n         *\n         * Gives additional information to the library to provide better decoding.\n         * The library can also guess device type from passed frames in decode() method. Use this method when the frame\n         * to decode does not refer to a single device type (example: 0x10 frames).\n         *\n         * @param deviceType device type, must be a value from getSupported() method\n         * @param devId device ID: LoRa device EUI or Sigfox ID\n         */\n        Decoder.prototype.setDeviceType = function (deviceType, devId) {\n            if (devId === void 0) { devId = 'tmpDevId'; }\n            this.codecStorage.setItem(devId + \".deviceType\", deviceType);\n        };\n        /**\n         * Clear stored data for a device ID:\n         *   - Device type\n         *   - Configuration\n         * @param devId device ID: LoRa device EUI or Sigfox ID, leave blank if unknown\n         */\n        Decoder.prototype.clearStoredData = function (devId) {\n            var _this = this;\n            if (!devId) {\n                devId = 'tmpDevId';\n            }\n            ['deviceType', 'configuration']\n                .map(function (suffix) { return devId + \".\" + suffix; })\n                .forEach(function (key) { return _this.codecStorage.removeItem(key); });\n        };\n        /**\n         * Fetch configuration frame\n         * @param devId device ID\n         */\n        Decoder.prototype.fetchConfiguration = function (devId) {\n            if (!devId) {\n                return Buffer.from('');\n            }\n            var value = this.codecStorage.getItem(devId + \".configuration\");\n            return Buffer.from(value || '', 'hex');\n        };\n        /**\n         * Store configuration frame\n         * @param payload payload\n         * @param devId device ID\n         */\n        Decoder.prototype.storeConfiguration = function (payload, devId) {\n            if (!devId) {\n                return payload;\n            }\n            this.codecStorage.setItem(devId + \".configuration\", payload.toString('hex'));\n            return payload;\n        };\n        /**\n         * Fetch device type\n         * @param devId device ID\n         */\n        Decoder.prototype.fetchDeviceType = function (devId) {\n            if (!devId) {\n                return '';\n            }\n            return this.codecStorage.getItem(devId + \".deviceType\") || '';\n        };\n        /**\n         * Store device type\n         * @param frameCode frame code\n         * @param devId device ID\n         */\n        Decoder.prototype.storeDeviceType = function (frameCode, devId) {\n            var deviceType = '';\n            if (!devId) {\n                return deviceType;\n            }\n            var matchingParsers = this.parsers.filter(function (p) { return p.deviceType !== 'any' && p.frameCode === frameCode; });\n            if (matchingParsers.length === 1) {\n                deviceType = matchingParsers[0].deviceType;\n                this.codecStorage.setItem(devId + \".deviceType\", deviceType);\n            }\n            return deviceType;\n        };\n        /**\n         * Analyze deviceType string of the specified parser and check if it's compatible\n         * @param parser parser to check\n         * @param deviceType deviceType to check\n         */\n        Decoder.prototype.isCompatibleDeviceType = function (parser, deviceType) {\n            // A parser may supported a list of devices (string split with '|'). Do not include 'any' parsers (managed later)\n            var list = parser.deviceType.split('|').filter(function (q) { return q === deviceType; });\n            return (list.length > 0) ? true : false;\n        };\n        /**\n         * Get active parsers\n         * @param deviceType device type\n         * @param frameCode frame code\n         */\n        Decoder.prototype.getActiveParsers = function (deviceType, frameCode) {\n            var _this = this;\n            var activeParsers = [];\n            // Behavior: find if a specific parser exists for this deviceType\n            //           otherwise try to find a ganeric parser\n            //           if at least one parser has been found, add a status byte parser (specific or generic)\n            // Device type is known, get parsers for given device type AND frame code\n            var dataParser = this.parsers.filter(function (p) { return _this.isCompatibleDeviceType(p, deviceType) &&\n                (p.frameCode < 0 || p.frameCode === frameCode); });\n            // If not custom decoder found, use a generic one\n            // Repeater has only specific parsers. Do not add generic ones\n            if (dataParser.length === 0 && deviceType !== 'repeater') {\n                var genericParsers = this.parsers.filter(function (p) { return p.deviceType === 'any' &&\n                    (p.frameCode < 0 || p.frameCode === frameCode); });\n                dataParser = activeParsers.concat(genericParsers);\n            }\n            // Find the status byte parser: only if the frame is managed\n            if (dataParser.length > 0) {\n                var statusByteParsers = this.parsers.filter(function (p) { return _this.isCompatibleDeviceType(p, deviceType)\n                    && p.frameCode === 0; });\n                activeParsers = activeParsers.concat(statusByteParsers);\n                if (statusByteParsers.length === 0) {\n                    var genericStatusByteParsers = this.parsers.filter(function (p) { return p.deviceType === 'any' && p.frameCode === 0; });\n                    activeParsers = activeParsers.concat(genericStatusByteParsers);\n                }\n            }\n            // Status parser must be first in list for a better display\n            activeParsers = activeParsers.concat(dataParser);\n            // Return active parser\n            return activeParsers;\n        };\n        return Decoder;\n    }());\n    codec.Decoder = Decoder;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Encoder class.\n     *\n     * Main class for encoding purposes.\n     * Contains declaration of all required builders and encode() method (API entry point).\n     *\n     * See below for explanations on builders.\n     */\n    var Encoder = /** @class */ (function () {\n        function Encoder() {\n            /**\n             * Builders declaration.\n             *\n             * Array of builder implementations that can be used by the library.\n             *\n             * Builders are specific handlers for encoding frame of a device type and a frame code.\n             */\n            this.builders = [\n                new codec.Repeater0x01Builder(),\n                new codec.Repeater0x02Builder(),\n                new codec.Repeater0x03Builder(),\n                new codec.Repeater0x04Builder(),\n                new codec.Repeater0x05Builder()\n            ];\n        }\n        /**\n         * Get supported device types and frame codes.\n         *\n         * The returned pairs are available for encoding.\n         */\n        Encoder.prototype.getSupported = function () {\n            return this.builders\n                .map(function (p) { return ({\n                deviceType: p.deviceType,\n                frameCode: p.frameCode\n            }); });\n        };\n        /**\n         * Get input data types.\n         * @param deviceType device type\n         * @param frameCode frame code\n         * @returns a map of available input data and associated types\n         */\n        Encoder.prototype.getInputDataTypes = function (deviceType, frameCode) {\n            var builder = this.builders.find(function (b) { return b.deviceType === deviceType && b.frameCode === frameCode; });\n            if (!builder) {\n                return {};\n            }\n            var inputdataTypes = {};\n            var inputData = new builder.inputDataClass();\n            for (var key in inputData) {\n                if (inputData.hasOwnProperty(key)) {\n                    inputdataTypes[key] = typeof inputData[key];\n                }\n            }\n            return inputdataTypes;\n        };\n        /**\n         * Encode given arguments.\n         *\n         * Generates a string payload from given arguments. Data object members and associated types can be known using\n         * getInputDataTypes() method.\n         *\n         * @param deviceType device type\n         * @param frameCode frame code\n         * @param network network: lora868 or sigfox\n         * @param data data object: map of available input data and values\n         * @returns encoded data as string\n         */\n        Encoder.prototype.encode = function (deviceType, frameCode, network, data) {\n            if (network === void 0) { network = 'unknown'; }\n            var builder = this.builders.find(function (b) { return b.deviceType === deviceType && b.frameCode === frameCode; });\n            if (!builder) {\n                return '';\n            }\n            var payload = builder.buildFrame(data || new builder.inputDataClass(), network);\n            return payload.toString('hex');\n        };\n        return Encoder;\n    }());\n    codec.Encoder = Encoder;\n})(codec || (codec = {}));\n// CommonJS\nif (typeof module !== 'undefined') {\n    module.exports = codec;\n}\n// Test (Mocha)\nif (typeof process !== 'undefined' && process.env.NODE_ENV === 'test') {\n    global.codec = codec;\n}\nvar codec;\n(function (codec) {\n    /**\n     * Internal codec storage\n     */\n    var InternalCodecStorage = /** @class */ (function () {\n        function InternalCodecStorage() {\n            this.store = {};\n        }\n        InternalCodecStorage.prototype.getItem = function (key) {\n            return this.store[key];\n        };\n        InternalCodecStorage.prototype.removeItem = function (key) {\n            delete this.store[key];\n        };\n        InternalCodecStorage.prototype.setItem = function (key, value) {\n            this.store[key] = value;\n        };\n        return InternalCodecStorage;\n    }());\n    codec.InternalCodecStorage = InternalCodecStorage;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Analog 0x10 (configuration) frame parser\n     */\n    var Analog0x10Parser = /** @class */ (function () {\n        function Analog0x10Parser() {\n            this.deviceType = 'analog';\n            this.frameCode = 0x10;\n        }\n        Analog0x10Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x10 Analog configuration' };\n            var ch1 = { 'name': 'channel A' };\n            var ch2 = { 'name': 'channel B' };\n            if (payload[8] === 2) {\n                // TEST mode => period = value * 20sec\n                appContent['transmissionPeriodKeepAlive'] = { 'unit': 's', 'value': payload[2] * 20 };\n                appContent['transmissionPeriodData'] = { 'unit': 's', 'value': payload[3] * 20 };\n            }\n            else {\n                // PRODUCTION mode => period = value * 10min\n                appContent['transmissionPeriodKeepAlive'] = { 'unit': 'm', 'value': payload[2] * 10 };\n                appContent['transmissionPeriodData'] = { 'unit': 'm', 'value': payload[3] * 10 };\n            }\n            var debounce = this.getDebounceText(payload[5] >> 4);\n            ch1['id'] = (payload[4] & 0xf0) >> 4;\n            ch1['type'] = this.getSensorTypeText(payload[4] & 0x0f);\n            if (payload[4] & 0x0f) {\n                ch1['threshold'] = this.getThresholdTriggeringText(payload[5] & 0x03);\n                ch1['externalTrigger'] = {\n                    'type': this.getThresholdTriggeringText((payload[5] >> 2) & 0x03),\n                    'debounceDuration': { 'unit': debounce[1], 'value': debounce[0] }\n                };\n            }\n            debounce = this.getDebounceText(payload[7] >> 4);\n            ch2['id'] = (payload[6] & 0xf0) >> 4;\n            ch2['type'] = this.getSensorTypeText(payload[6] & 0x0f);\n            if (payload[6] & 0x0f) {\n                ch2['threshold'] = this.getThresholdTriggeringText(payload[7] & 0x03);\n                ch2['externalTrigger'] = {\n                    'type': this.getThresholdTriggeringText((payload[7] >> 2) & 0x03),\n                    'debounceDuration': { 'unit': debounce[1], 'value': debounce[0] }\n                };\n            }\n            appContent['channels'] = [ch1, ch2];\n            // Product mode\n            appContent['productMode'] = codec.PlateformCommonUtils.getProductModeText(payload[8]);\n            return appContent;\n        };\n        /**\n         * Get Sensor type text\n         * @param value value\n         */\n        Analog0x10Parser.prototype.getSensorTypeText = function (value) {\n            switch (value) {\n                case 0:\n                    return 'deactivated';\n                case 1:\n                    return '0-10V';\n                case 2:\n                    return '4-20mA';\n                default:\n                    return '';\n            }\n        };\n        /**\n         * Get Threshold Triggering text\n         * @param value value\n         */\n        Analog0x10Parser.prototype.getThresholdTriggeringText = function (value) {\n            switch (value) {\n                case 0:\n                    return 'none';\n                case 1:\n                    return 'low';\n                case 2:\n                    return 'high';\n                case 3:\n                    return 'both';\n                default:\n                    return '';\n            }\n        };\n        /**\n         * Get Waiting Period Duration text\n         * @param value value\n         */\n        Analog0x10Parser.prototype.getDebounceText = function (value) {\n            switch (value) {\n                case 0:\n                    return [0, 's'];\n                case 1:\n                    return [10, 'ms'];\n                case 2:\n                    return [20, 'ms'];\n                case 3:\n                    return [50, 'ms'];\n                case 4:\n                    return [100, 'ms'];\n                case 5:\n                    return [200, 'ms'];\n                case 6:\n                    return [500, 'ms'];\n                case 7:\n                    return [1, 's'];\n                case 8:\n                    return [2, 's'];\n                case 9:\n                    return [5, 's'];\n                case 10:\n                    return [10, 's'];\n                case 11:\n                    return [20, 's'];\n                case 12:\n                    return [40, 's'];\n                case 13:\n                    return [60, 's'];\n                case 14:\n                    return [5, 'm'];\n                default:\n                    return [0, 's'];\n            }\n        };\n        return Analog0x10Parser;\n    }());\n    codec.Analog0x10Parser = Analog0x10Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Analog 0x11 (configuration) frame parser\n     */\n    var Analog0x11Parser = /** @class */ (function () {\n        function Analog0x11Parser() {\n            this.deviceType = 'analog';\n            this.frameCode = 0x11;\n        }\n        Analog0x11Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x11 Analog configuration' };\n            // channel A high threshold configuration\n            appContent['threshold'] = {\n                'name': 'channel A',\n                'unit': '\\u00B5' + 'V or 10 nA',\n                'high': {\n                    'value': payload.readUInt32BE(1) & 0x00ffffff,\n                    'hysteresis': payload.readUInt32BE(4) & 0x00ffffff,\n                }\n            };\n            return appContent;\n        };\n        return Analog0x11Parser;\n    }());\n    codec.Analog0x11Parser = Analog0x11Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Analog 0x12 (configuration) frame parser\n     */\n    var Analog0x12Parser = /** @class */ (function () {\n        function Analog0x12Parser() {\n            this.deviceType = 'analog';\n            this.frameCode = 0x12;\n        }\n        Analog0x12Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x12 Analog configuration' };\n            // channel A high threshold configuration\n            appContent['threshold'] = {\n                'name': 'channel A',\n                'unit': '\\u00B5' + 'V or 10 nA',\n                'low': {\n                    'value': payload.readUInt32BE(1) & 0x00ffffff,\n                    'hysteresis': payload.readUInt32BE(4) & 0x00ffffff,\n                }\n            };\n            return appContent;\n        };\n        return Analog0x12Parser;\n    }());\n    codec.Analog0x12Parser = Analog0x12Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Analog 0x13 (configuration) frame parser\n     */\n    var Analog0x13Parser = /** @class */ (function () {\n        function Analog0x13Parser() {\n            this.deviceType = 'analog';\n            this.frameCode = 0x13;\n        }\n        Analog0x13Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x13 Analog configuration' };\n            // channel B high threshold configuration\n            appContent['threshold'] = {\n                'name': 'channel B',\n                'unit': '\\u00B5' + 'V or 10 nA',\n                'high': {\n                    'value': payload.readUInt32BE(1) & 0x00ffffff,\n                    'hysteresis': payload.readUInt32BE(4) & 0x00ffffff,\n                }\n            };\n            return appContent;\n        };\n        return Analog0x13Parser;\n    }());\n    codec.Analog0x13Parser = Analog0x13Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Analog 0x14 (configuration) frame parser\n     */\n    var Analog0x14Parser = /** @class */ (function () {\n        function Analog0x14Parser() {\n            this.deviceType = 'analog';\n            this.frameCode = 0x14;\n        }\n        Analog0x14Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x14 Analog configuration' };\n            // channel B high threshold configuration\n            appContent['threshold'] = {\n                'name': 'channel B',\n                'unit': '\\u00B5' + 'V or 10 nA',\n                'low': {\n                    'value': payload.readUInt32BE(1) & 0x00ffffff,\n                    'hysteresis': payload.readUInt32BE(4) & 0x00ffffff,\n                }\n            };\n            return appContent;\n        };\n        return Analog0x14Parser;\n    }());\n    codec.Analog0x14Parser = Analog0x14Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Analog 0x30 (keep alive) frame parser\n     */\n    var Analog0x30Parser = /** @class */ (function () {\n        function Analog0x30Parser() {\n            this.deviceType = 'analog';\n            this.frameCode = 0x30;\n            this.parser = new codec.Analog0x42Parser();\n        }\n        Analog0x30Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = this.parser.parseFrame(payload, configuration, network);\n            appContent['type'] = '0x30 Analog keep alive';\n            return appContent;\n        };\n        return Analog0x30Parser;\n    }());\n    codec.Analog0x30Parser = Analog0x30Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Analog 0x42 (data) frame parser\n     */\n    var Analog0x42Parser = /** @class */ (function () {\n        function Analog0x42Parser() {\n            this.deviceType = 'analog';\n            this.frameCode = 0x42;\n        }\n        Analog0x42Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x42 Analog data' };\n            var ch1 = { 'name': 'channel A' };\n            var ch2 = { 'name': 'channel B' };\n            // channel A\n            var type = payload[2] & 0x0f;\n            var rawValue = payload.readUInt32BE(2) & 0x00ffffff;\n            if (type === 1) {\n                ch1['unit'] = 'V';\n                // convert µV into V (with 3 fraction digits)\n                ch1['value'] = parseFloat((rawValue / (1000 * 1000)).toFixed(3));\n            }\n            else if (type === 2) {\n                ch1['unit'] = 'mA';\n                // convert 10nA into mA (with 3 fraction digits)\n                ch1['value'] = parseFloat((rawValue / (100 * 1000)).toFixed(3));\n            }\n            else {\n                ch1['state'] = 'deactivated';\n            }\n            // channel A\n            type = payload[6] & 0x0f;\n            rawValue = payload.readUInt32BE(6) & 0x00ffffff;\n            if (type === 1) {\n                ch2['unit'] = 'V';\n                // convert µV into V (with 3 fraction digits)\n                ch2['value'] = parseFloat((rawValue / (1000 * 1000)).toFixed(3));\n            }\n            else if (type === 2) {\n                ch2['unit'] = 'mA';\n                // convert 10nA into mA (with 3 fraction digits)\n                ch2['value'] = parseFloat((rawValue / (100 * 1000)).toFixed(3));\n            }\n            else {\n                ch2['state'] = 'deactivated';\n            }\n            appContent['channels'] = [ch1, ch2];\n            return appContent;\n        };\n        return Analog0x42Parser;\n    }());\n    codec.Analog0x42Parser = Analog0x42Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Analog status byte parser\n     */\n    var AnalogStatusByteParser = /** @class */ (function () {\n        function AnalogStatusByteParser() {\n            this.deviceType = 'analog';\n            this.frameCode = 0;\n        }\n        AnalogStatusByteParser.prototype.parseFrame = function (payload, configuration, network) {\n            var statusContent = {};\n            var parser = new codec.GenericStatusByteParser();\n            statusContent = parser.parseFrame(payload, configuration);\n            // Status byte, applicative flags\n            statusContent['alarmChannelA'] = Boolean((payload[1] & 0x08));\n            statusContent['alarmChannelB'] = Boolean((payload[1] & 0x10));\n            return { 'status': statusContent };\n        };\n        return AnalogStatusByteParser;\n    }());\n    codec.AnalogStatusByteParser = AnalogStatusByteParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Breath 0x10 (configuration) frame parser\n     */\n    var Breath0x10Parser = /** @class */ (function () {\n        function Breath0x10Parser() {\n            this.deviceType = 'breath';\n            this.frameCode = 0x10;\n        }\n        Breath0x10Parser.prototype.parseFrame = function (payload, configuration, network) {\n            // register 300: Keep Alive frame TX 0: Disable or 1: Enable H24 frame\n            // register 301: Issue period, value betwenn 0 and 65535, 0: disabling periodic transmission\n            // register 320: value between 1 and 65535\n            // register 321: value between 0 and 65535, 0: no scanning, X2s\n            // register 323: value between 1 and 255 : Number of additional (redundant) samples per frame\n            var appContent = { type: '0x10 Breath configuration' };\n            appContent['dailyFrameActivated'] = (Boolean)((payload.readUInt8(2) === 0) ? false : true),\n                appContent['numberOfHistorizationBeforeSending'] = payload.readUInt16BE(3),\n                appContent['historyPeriod'] = { 'unit': 's', 'value': payload.readUInt16BE(5) },\n                appContent['alarmRepeatActivated'] = (Boolean)((payload.readUInt8(7) === 0) ? false : true),\n                appContent['alarmRepeatPeriod'] = { 'unit': 's', 'value': payload.readUInt16BE(8) },\n                appContent['redundantSamples'] = payload.readUInt8(10);\n            return appContent;\n        };\n        return Breath0x10Parser;\n    }());\n    codec.Breath0x10Parser = Breath0x10Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Breath 0x30 Keep alive / daily frame parser\n     */\n    var Breath0x30Parser = /** @class */ (function () {\n        function Breath0x30Parser() {\n            this.deviceType = 'breath';\n            this.frameCode = 0x30;\n        }\n        Breath0x30Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x30 Daily frame' };\n            if (payload.byteLength >= 11) {\n                appContent['tvoc'] = {\n                    'min': { 'unit': 'µg/m3', 'value': payload.readUInt16BE(2) },\n                    'max': { 'unit': 'µg/m3', 'value': payload.readUInt16BE(4) },\n                    'average': { 'unit': 'µg/m3', 'value': payload.readUInt16BE(6) },\n                    'duration': { 'unit': 'min', 'value': payload.readUInt16BE(8) }\n                };\n                appContent['pm10'] = {\n                    'min': { 'unit': 'µg/m3', 'value': payload.readUInt16BE(10) },\n                    'max': { 'unit': 'µg/m3', 'value': payload.readUInt16BE(12) },\n                    'average': { 'unit': 'µg/m3', 'value': payload.readUInt16BE(14) },\n                    'duration': { 'unit': 'min', 'value': payload.readUInt16BE(16) }\n                };\n                appContent['pm25'] = {\n                    'min': { 'unit': 'µg/m3', 'value': payload.readUInt16BE(18) },\n                    'max': { 'unit': 'µg/m3', 'value': payload.readUInt16BE(20) },\n                    'average': { 'unit': 'µg/m3', 'value': payload.readUInt16BE(22) },\n                    'duration': { 'unit': 'min', 'value': payload.readUInt16BE(24) }\n                };\n                appContent['pm1'] = {\n                    'min': { 'unit': 'µg/m3', 'value': payload.readUInt16BE(26) },\n                    'max': { 'unit': 'µg/m3', 'value': payload.readUInt16BE(28) },\n                    'average': { 'unit': 'µg/m3', 'value': payload.readUInt16BE(30) }\n                };\n            }\n            else {\n                appContent['tvoc'] = { 'max': { 'unit': 'µg/m3', 'value': payload.readUInt16BE(2) } };\n                appContent['pm10'] = { 'max': { 'unit': 'µg/m3', 'value': payload.readUInt16BE(4) } };\n                appContent['pm25'] = { 'max': { 'unit': 'µg/m3', 'value': payload.readUInt16BE(6) } };\n                appContent['pm1'] = { 'max': { 'unit': 'µg/m3', 'value': payload.readUInt16BE(8) } };\n            }\n            return appContent;\n        };\n        return Breath0x30Parser;\n    }());\n    codec.Breath0x30Parser = Breath0x30Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Breath 0X6D (data) frame parser\n     */\n    var Breath0x6dParser = /** @class */ (function () {\n        function Breath0x6dParser() {\n            this.deviceType = 'breath';\n            this.frameCode = 0x6d;\n        }\n        Breath0x6dParser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x6d Breath periodic data' };\n            var rawValue;\n            var pm10 = [], pm25 = [], pm1 = [], tvoc = [];\n            var payloadLength = payload.byteLength;\n            // Loop through historic data [t=0, t-1, t-2,...]\n            for (var offset = 2; offset < payloadLength; offset += 8) {\n                rawValue = payload.readUInt16BE(offset);\n                tvoc.push(rawValue);\n                rawValue = payload.readUInt16BE(offset + 2);\n                pm10.push(rawValue);\n                rawValue = payload.readUInt16BE(offset + 4);\n                pm25.push(rawValue);\n                rawValue = payload.readUInt16BE(offset + 6);\n                pm1.push(rawValue);\n            }\n            appContent['decodingInfo'] = 'values: [t=0, t-1, t-2, ...]';\n            appContent['tvoc'] = { 'unit': 'µg/m3', 'values': tvoc };\n            appContent['pm10'] = { 'unit': 'µg/m3', 'values': pm10 };\n            appContent['pm25'] = { 'unit': 'µg/m3', 'values': pm25 };\n            appContent['pm1'] = { 'unit': 'µg/m3', 'values': pm1 };\n            return appContent;\n        };\n        return Breath0x6dParser;\n    }());\n    codec.Breath0x6dParser = Breath0x6dParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Breath 0x6e (alarm) frame parser\n     */\n    var Breath0x6eParser = /** @class */ (function () {\n        function Breath0x6eParser() {\n            this.deviceType = 'breath';\n            this.frameCode = 0x6e;\n        }\n        Breath0x6eParser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x6e Breath alarm' };\n            appContent['tvoc'] = {\n                'alarmStatus': Boolean(payload[2] & 0x01) ? 'active' : 'inactive',\n                'unit': 'µg/m3',\n                'value': payload.readUInt16BE(3)\n            };\n            appContent['pm10'] = {\n                'alarmStatus': Boolean(payload[2] & 0x02) ? 'active' : 'inactive',\n                'unit': 'µg/m3',\n                'value': payload.readUInt16BE(5)\n            };\n            appContent['pm25'] = {\n                'alarmStatus': Boolean(payload[2] & 0x04) ? 'active' : 'inactive',\n                'unit': 'µg/m3',\n                'value': payload.readUInt16BE(7)\n            };\n            appContent['pm1'] = {\n                'alarmStatus': Boolean(payload[2] & 0x08) ? 'active' : 'inactive',\n                'unit': 'µg/m3',\n                'value': payload.readUInt16BE(9)\n            };\n            return appContent;\n        };\n        return Breath0x6eParser;\n    }());\n    codec.Breath0x6eParser = Breath0x6eParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Breath status byte parser\n     */\n    var BreathStatusByteParser = /** @class */ (function () {\n        function BreathStatusByteParser() {\n            this.deviceType = 'breath';\n            this.frameCode = 0;\n        }\n        BreathStatusByteParser.prototype.parseFrame = function (payload, configuration, network) {\n            var statusContent = {};\n            var parser = new codec.GenericStatusByteParser();\n            statusContent = parser.parseFrame(payload, configuration);\n            // Status byte, applicative flags\n            statusContent['configurationInconsistency'] = Boolean(payload[1] & 0x08);\n            statusContent['sensorError'] = Boolean(payload[1] & 0x16);\n            return { 'status': statusContent };\n        };\n        return BreathStatusByteParser;\n    }());\n    codec.BreathStatusByteParser = BreathStatusByteParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Comfort 0x10 (configuration) frame parser\n     */\n    var Comfort0x10Parser = /** @class */ (function () {\n        function Comfort0x10Parser() {\n            this.deviceType = 'comfort';\n            this.frameCode = 0x10;\n        }\n        Comfort0x10Parser.prototype.parseFrame = function (payload, configuration, network) {\n            // register 300: Emission period of the life frame X 10s\n            // register 301: Issue period, value betwenn 0 and 65535, 0: disabling periodic transmission\n            // register 320: value between 1 and 65535\n            // register 321: value between 0 and 65535, 0: no scanning, X2s\n            // reading_frequency = S321 * S320\n            // sending_frequency = S321 * S320 * S301\n            var appContent = { type: '0x10 Comfort configuration' };\n            appContent['transmissionPeriodKeepAlive'] = { 'unit': 's', 'value': payload.readUInt16BE(2) * 10 },\n                appContent['numberOfHistorizationBeforeSending'] = payload.readUInt16BE(4),\n                appContent['numberOfSamplingBeforeHistorization'] = payload.readUInt16BE(6),\n                appContent['samplingPeriod'] = { 'unit': 's', 'value': payload.readUInt16BE(8) * 2 },\n                appContent['calculatedPeriodRecording'] = { 'unit': 's',\n                    'value': payload.readUInt16BE(8) * payload.readUInt16BE(6) * 2 },\n                appContent['calculatedSendingPeriod'] = { 'unit': 's',\n                    'value': payload.readUInt16BE(8) * payload.readUInt16BE(6) * payload.readUInt16BE(4) * 2 };\n            return appContent;\n        };\n        return Comfort0x10Parser;\n    }());\n    codec.Comfort0x10Parser = Comfort0x10Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Comfort 0x4c (historic data) frame parser\n     */\n    var Comfort0x4cParser = /** @class */ (function () {\n        function Comfort0x4cParser() {\n            this.deviceType = 'comfort';\n            this.frameCode = 0x4c;\n        }\n        Comfort0x4cParser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x4c Comfort data' };\n            var rawValue;\n            var temp = [], humidity = [];\n            // Loop through historic data [t=0, t-1, t-2,...]\n            for (var offset = 2; offset < payload.byteLength; offset += 3) {\n                rawValue = payload.readInt16BE(offset);\n                temp.push(rawValue / 10);\n                rawValue = payload.readUInt8(offset + 2);\n                humidity.push(rawValue);\n            }\n            appContent['decodingInfo'] = 'values: [t=0, t-1, t-2, ...]';\n            appContent['temperature'] = { 'unit': '\\u00B0' + 'C', 'values': temp };\n            appContent['humidity'] = { 'unit': '\\u0025', 'values': humidity };\n            return appContent;\n        };\n        return Comfort0x4cParser;\n    }());\n    codec.Comfort0x4cParser = Comfort0x4cParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Comfort 0x4d (alarm) frame parser\n     */\n    var Comfort0x4dParser = /** @class */ (function () {\n        function Comfort0x4dParser() {\n            this.deviceType = 'comfort';\n            this.frameCode = 0x4d;\n        }\n        Comfort0x4dParser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x4d Comfort alarm' };\n            appContent['alarmTemperature'] = {\n                'alarmStatus': (payload.readUInt8(2) >> 4) ? 'active' : 'inactive',\n                'temperature': { 'unit': '\\u00B0' + 'C', 'value': payload.readInt16BE(3) / 10 }\n            };\n            appContent['alarmHumidity'] = {\n                'alarmStatus': (payload.readUInt8(2) & 1) ? 'active' : 'inactive',\n                'humidity': { 'unit': '\\u0025', 'value': payload.readUInt8(5) }\n            };\n            return appContent;\n        };\n        return Comfort0x4dParser;\n    }());\n    codec.Comfort0x4dParser = Comfort0x4dParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Comfort CO2 0x10 (configuration) frame parser\n     */\n    var ComfortCo20x10Parser = /** @class */ (function () {\n        function ComfortCo20x10Parser() {\n            this.deviceType = 'comfortCo2';\n            this.frameCode = 0x10;\n        }\n        ComfortCo20x10Parser.prototype.parseFrame = function (payload, configuration, network) {\n            // register 300: Keep Alive frame TX 0: Disable or 1: Enable H24 frame\n            // register 301: Issue period, value betwenn 0 and 65535, 0: disabling periodic transmission\n            // register 320: value between 1 and 65535\n            // register 321: value between 0 and 65535, 0: no scanning, X2s\n            // register 323: value between 1 and 255 : Number of additional (redundant) samples per frame\n            // reading_frequency = S321 * S320\n            // sending_frequency = S321 * S320 * S301\n            var appContent = { type: '0x10 Comfort CO2 configuration' };\n            appContent['dailyFrameActivated'] = (Boolean)((payload.readUInt16BE(2) === 0) ? false : true),\n                appContent['numberOfHistorizationBeforeSending'] = payload.readUInt16BE(4),\n                appContent['numberOfSamplingBeforeHistorization'] = payload.readUInt16BE(6),\n                appContent['samplingPeriod'] = { 'unit': 's', 'value': payload.readUInt16BE(8) * 2 },\n                appContent['redundantSamples'] = payload.readUInt8(10),\n                appContent['calculatedPeriodRecording'] = { 'unit': 's',\n                    'value': payload.readUInt16BE(8) * payload.readUInt16BE(6) * 2 },\n                appContent['calculatedSendingPeriod'] = { 'unit': 's',\n                    'value': payload.readUInt16BE(8) * payload.readUInt16BE(6) * payload.readUInt16BE(4) * 2 };\n            // Content depends on network\n            if (payload.byteLength >= 12) {\n                appContent['blackOutDuration'] = { 'unit': 'h', 'value': payload.readUInt8(11) };\n                appContent['blackOutStartTime'] = { 'unit': 'h', 'value': payload.readUInt8(12) };\n            }\n            return appContent;\n        };\n        return ComfortCo20x10Parser;\n    }());\n    codec.ComfortCo20x10Parser = ComfortCo20x10Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Comfort CO2 0x30 Keep alive / daily frame parser\n     */\n    var ComfortCo20x30Parser = /** @class */ (function () {\n        function ComfortCo20x30Parser() {\n            this.deviceType = 'comfortCo2';\n            this.frameCode = 0x30;\n        }\n        ComfortCo20x30Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x30 Comfort CO2 Daily frame' };\n            if (payload[1] & 0x04) {\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(19) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            appContent['icone'] = payload.readUInt8(2);\n            appContent['qaiRedDuration'] = { 'unit': 'min', 'value': (payload.readUInt8(3) * 10) };\n            appContent['temperatureMax'] = { 'unit': '\\u00B0' + 'C', 'value': payload.readInt16BE(4) / 10 };\n            appContent['co2Max'] = { 'unit': 'ppm', 'value': payload.readUInt16BE(6) };\n            appContent['humidityMax'] = { 'unit': '%', 'value': payload.readUInt8(8) };\n            appContent['temperatureMin'] = { 'unit': '\\u00B0' + 'C', 'value': payload.readInt16BE(9) / 10 };\n            // Content depends on network\n            switch (payload.byteLength) {\n                case 11:\n                    break;\n                case 19:\n                case 23:\n                    appContent['co2Min'] = { 'unit': 'ppm', 'value': payload.readUInt16BE(11) };\n                    appContent['humidityMin'] = { 'unit': '%', 'value': payload.readUInt8(13) };\n                    appContent['temperatureAverage'] = { 'unit': '\\u00B0' + 'C', 'value': payload.readInt16BE(14) / 10 };\n                    appContent['co2Average'] = { 'unit': 'ppm', 'value': payload.readUInt16BE(16) };\n                    appContent['humidityAverage'] = { 'unit': '%', 'value': payload.readUInt8(18) };\n                    break;\n                default:\n                    appContent.partialDecoding = codec.PartialDecodingReason.MISSING_NETWORK;\n                    break;\n            }\n            return appContent;\n        };\n        return ComfortCo20x30Parser;\n    }());\n    codec.ComfortCo20x30Parser = ComfortCo20x30Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Comfort CO2 0x6a (historic data) frame parser\n     */\n    var ComfortCo20x6aParser = /** @class */ (function () {\n        function ComfortCo20x6aParser() {\n            this.deviceType = 'comfortCo2';\n            this.frameCode = 0x6a;\n        }\n        ComfortCo20x6aParser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x6a Comfort CO2 data' };\n            var payloadLength = (payload[1] & 0x04) ? payload.byteLength - 4 : payload.byteLength;\n            if (payload[1] & 0x04) {\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(payloadLength) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            var rawValue;\n            var temp = [], humidity = [], CO2 = [];\n            // Loop through historic data [t=0, t-1, t-2,...]\n            for (var offset = 2; offset < payloadLength; offset += 5) {\n                rawValue = payload.readInt16BE(offset);\n                temp.push(rawValue / 10);\n                rawValue = payload.readUInt8(offset + 2);\n                humidity.push(rawValue);\n                rawValue = payload.readUInt16BE(offset + 3);\n                CO2.push(rawValue);\n            }\n            appContent['decodingInfo'] = 'values: [t=0, t-1, t-2, ...]';\n            appContent['temperature'] = { 'unit': '\\u00B0' + 'C', 'values': temp };\n            appContent['humidity'] = { 'unit': '%', 'values': humidity };\n            appContent['co2'] = { 'unit': 'ppm', 'values': CO2 };\n            return appContent;\n        };\n        return ComfortCo20x6aParser;\n    }());\n    codec.ComfortCo20x6aParser = ComfortCo20x6aParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Comfort CO2 0x6b (alarm) frame parser\n     */\n    var ComfortCo20x6bParser = /** @class */ (function () {\n        function ComfortCo20x6bParser() {\n            this.deviceType = 'comfortCo2';\n            this.frameCode = 0x6b;\n        }\n        ComfortCo20x6bParser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x6b Comfort CO2 alarm' };\n            var payloadLength = (payload[1] & 0x04) ? payload.byteLength - 4 : payload.byteLength;\n            if (payload[1] & 0x04) {\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(payloadLength) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            appContent['alarmTemperature'] = {\n                'alarmStatus': (Boolean(payload[2] & 0x10)) ? 'active' : 'inactive',\n                'temperature': { 'unit': '\\u00B0' + 'C', 'value': payload.readInt16BE(3) / 10 }\n            };\n            appContent['alarmHumidity'] = {\n                'alarmStatus': (Boolean(payload[2] & 0x01)) ? 'active' : 'inactive',\n                'humidity': { 'unit': '%', 'value': payload.readUInt8(5) }\n            };\n            appContent['alarmCo2'] = {\n                'alarmStatus': (Boolean(payload[2] & 0x20)) ? 'active' : 'inactive',\n                'co2': { 'unit': 'ppm', 'value': payload.readInt16BE(6) }\n            };\n            return appContent;\n        };\n        return ComfortCo20x6bParser;\n    }());\n    codec.ComfortCo20x6bParser = ComfortCo20x6bParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Comfort CO2 status byte parser\n     */\n    var ComfortCo2StatusByteParser = /** @class */ (function () {\n        function ComfortCo2StatusByteParser() {\n            this.deviceType = 'comfortCo2';\n            this.frameCode = 0;\n        }\n        ComfortCo2StatusByteParser.prototype.parseFrame = function (payload, configuration, network) {\n            var statusContent = {};\n            var parser = new codec.GenericStatusByteParser();\n            statusContent = parser.parseFrame(payload, configuration);\n            // Status byte, applicative flags\n            statusContent['configurationInconsistency'] = Boolean(payload[1] & 0x08);\n            statusContent['timestamp'] = Boolean(payload[1] & 0x04);\n            return { 'status': statusContent };\n        };\n        return ComfortCo2StatusByteParser;\n    }());\n    codec.ComfortCo2StatusByteParser = ComfortCo2StatusByteParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Comfort 2 0x10 (configuration) frame parser\n     */\n    var Comfort20x10Parser = /** @class */ (function () {\n        function Comfort20x10Parser() {\n            this.deviceType = 'comfort2';\n            this.frameCode = 0x10;\n        }\n        Comfort20x10Parser.prototype.parseFrame = function (payload, configuration, network) {\n            // register 300: Emission period of the life frame X 10s\n            // register 301: Issue period, value betwenn 0 and 65535, 0: disabling periodic transmission\n            // register 320: value between 1 and 65535\n            // register 321: value between 0 and 65535, 0: no scanning, X2s\n            // register 323: value between 1 and 255 : Number of additional (redundant) samples per frame\n            // reading_frequency = S321 * S320\n            // sending_frequency = S321 * S320 * S301\n            var appContent = { type: '0x10 Comfort 2 configuration' };\n            appContent['transmissionPeriodKeepAlive'] = { 'unit': 's', 'value': payload.readUInt16BE(2) * 10 },\n                appContent['numberOfHistorizationBeforeSending'] = payload.readUInt16BE(4),\n                appContent['numberOfSamplingBeforeHistorization'] = payload.readUInt16BE(6),\n                appContent['samplingPeriod'] = { 'unit': 's', 'value': payload.readUInt16BE(8) * 2 },\n                appContent['redundantSamples'] = payload.readUInt8(10),\n                appContent['calculatedPeriodRecording'] = { 'unit': 's',\n                    'value': payload.readUInt16BE(8) * payload.readUInt16BE(6) * 2 },\n                appContent['calculatedSendingPeriod'] = { 'unit': 's',\n                    'value': payload.readUInt16BE(8) * payload.readUInt16BE(6) * payload.readUInt16BE(4) * 2 };\n            return appContent;\n        };\n        return Comfort20x10Parser;\n    }());\n    codec.Comfort20x10Parser = Comfort20x10Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Comfort 2 0x4c (historic data) frame parser\n     */\n    var Comfort20x4cParser = /** @class */ (function () {\n        function Comfort20x4cParser() {\n            this.deviceType = 'comfort2';\n            this.frameCode = 0x4c;\n        }\n        Comfort20x4cParser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x4c Comfort 2 data' };\n            var payloadLength = (payload[1] & 0x04) ? payload.byteLength - 4 : payload.byteLength;\n            if (payload[1] & 0x04) {\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(payloadLength) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            var rawValue;\n            var temp = [], humidity = [];\n            // Loop through historic data [t=0, t-1, t-2,...]\n            for (var offset = 2; offset < payloadLength; offset += 3) {\n                rawValue = payload.readInt16BE(offset);\n                temp.push(rawValue / 10);\n                rawValue = payload.readUInt8(offset + 2);\n                humidity.push(rawValue);\n            }\n            appContent['decodingInfo'] = 'values: [t=0, t-1, t-2, ...]';\n            appContent['temperature'] = { 'unit': '\\u00B0' + 'C', 'values': temp };\n            appContent['humidity'] = { 'unit': '\\u0025', 'values': humidity };\n            return appContent;\n        };\n        return Comfort20x4cParser;\n    }());\n    codec.Comfort20x4cParser = Comfort20x4cParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Comfort 2 0x4d (alarm) frame parser\n     */\n    var Comfort20x4dParser = /** @class */ (function () {\n        function Comfort20x4dParser() {\n            this.deviceType = 'comfort2';\n            this.frameCode = 0x4d;\n        }\n        Comfort20x4dParser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x4d Comfort 2 alarm' };\n            if (payload[1] & 0x04) {\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(6) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            appContent['alarmTemperature'] = {\n                'alarmStatus': (payload.readUInt8(2) >> 4) ? 'active' : 'inactive',\n                'temperature': { 'unit': '\\u00B0' + 'C', 'value': payload.readInt16BE(3) / 10 }\n            };\n            appContent['alarmHumidity'] = {\n                'alarmStatus': (payload.readUInt8(2) & 1) ? 'active' : 'inactive',\n                'humidity': { 'unit': '\\u0025', 'value': payload.readUInt8(5) }\n            };\n            return appContent;\n        };\n        return Comfort20x4dParser;\n    }());\n    codec.Comfort20x4dParser = Comfort20x4dParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Comfort 2 status byte parser\n     */\n    var Comfort2StatusByteParser = /** @class */ (function () {\n        function Comfort2StatusByteParser() {\n            this.deviceType = 'comfort2';\n            this.frameCode = 0;\n        }\n        Comfort2StatusByteParser.prototype.parseFrame = function (payload, configuration, network) {\n            var statusContent = {};\n            var parser = new codec.GenericStatusByteParser();\n            statusContent = parser.parseFrame(payload, configuration);\n            // Status byte, applicative flags\n            statusContent['configurationInconsistency'] = Boolean(payload[1] & 0x08);\n            statusContent['timestamp'] = Boolean(payload[1] & 0x04);\n            return { 'status': statusContent };\n        };\n        return Comfort2StatusByteParser;\n    }());\n    codec.Comfort2StatusByteParser = Comfort2StatusByteParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Delta P 0x10 (configuration) frame parser\n     */\n    var Deltap0x10Parser = /** @class */ (function () {\n        function Deltap0x10Parser() {\n            this.deviceType = 'deltap';\n            this.frameCode = 0x10;\n        }\n        Deltap0x10Parser.prototype.parseFrame = function (payload, configuration, network) {\n            // register 300: Emission period of the life frame\n            // register 301: Issue period, value between 0 and 65535, 0: disabling periodic transmission\n            // register 320: value betwenn 1 and 65535\n            // register 321: value betwenn 0 and 65535, 0: no scanning, X2s\n            // reading_frequency = S321 * S320\n            // sending_frequency = S321 * S320 * S301\n            var appContent = { type: '0x10 Delta P configuration' };\n            appContent['transmissionPeriodKeepAlive'] = { 'unit': 's', 'value': payload.readUInt16BE(2) * 10 },\n                appContent['numberOfHistorizationBeforeSending'] = payload.readUInt16BE(4),\n                appContent['numberOfSamplingBeforeHistorization'] = payload.readUInt16BE(6),\n                appContent['samplingPeriod'] = { 'unit': 's', 'value': payload.readUInt16BE(8) * 2 },\n                appContent['calculatedPeriodRecording'] = { 'unit': 's',\n                    'value': payload.readUInt16BE(8) * payload.readUInt16BE(6) * 2 },\n                appContent['calculatedSendingPeriod'] = { 'unit': 's',\n                    'value': payload.readUInt16BE(8) * payload.readUInt16BE(6) * payload.readUInt16BE(4) * 2 };\n            return appContent;\n        };\n        return Deltap0x10Parser;\n    }());\n    codec.Deltap0x10Parser = Deltap0x10Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Delta P 0x11 (0-10V configuration) frame parser\n     */\n    var Deltap0x11Parser = /** @class */ (function () {\n        function Deltap0x11Parser() {\n            this.deviceType = 'deltap';\n            this.frameCode = 0x11;\n        }\n        Deltap0x11Parser.prototype.parseFrame = function (payload, configuration, network) {\n            // register 322: value between 1 and 65535\n            // register 323: value between 0 and 65535, 0: no scanning, X2s\n            // register 324: Issue period, value between 0 and 65535, 0: disabling periodic transmission\n            // reading_frequency = S322 * S323\n            // sending_frequency = S322 * S323 * S324\n            var appContent = { type: '0x11 Delta P 0-10V configuration' };\n            appContent['numberOfHistorizationBeforeSending'] = payload.readUInt16BE(6);\n            appContent['numberOfSamplingBeforeHistorization'] = payload.readUInt16BE(2);\n            appContent['samplingPeriod'] = { 'unit': 's', 'value': payload.readUInt16BE(4) * 2 };\n            appContent['calculatedPeriodRecording'] = { 'unit': 's',\n                'value': payload.readUInt16BE(2) * payload.readUInt16BE(4) * 2 };\n            appContent['calculatedSendingPeriod'] = { 'unit': 's',\n                'value': payload.readUInt16BE(2) * payload.readUInt16BE(4) * payload.readUInt16BE(6) * 2 };\n            return appContent;\n        };\n        return Deltap0x11Parser;\n    }());\n    codec.Deltap0x11Parser = Deltap0x11Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Generic 0x2f (downlink ACK) frame parser\n     */\n    var Deltap0x2fParser = /** @class */ (function () {\n        function Deltap0x2fParser() {\n            this.deviceType = 'deltap';\n            this.frameCode = 0x2f;\n        }\n        Deltap0x2fParser.prototype.parseFrame = function (payload, configuration) {\n            var appContent = { type: '0x2f Delta P Downlink ack' };\n            appContent['requestStatus'] = this.getRequestStatusText(payload[2]);\n            return appContent;\n        };\n        /**\n         * Get Type text\n         * @param value value\n         */\n        Deltap0x2fParser.prototype.getRequestStatusText = function (value) {\n            switch (value) {\n                case 1:\n                    return 'success';\n                case 2:\n                    return 'errorGeneric';\n                case 3:\n                    return 'errorWrongState';\n                case 4:\n                    return 'errorInvalidRequest';\n                default:\n                    return 'errorOtherReason';\n            }\n        };\n        return Deltap0x2fParser;\n    }());\n    codec.Deltap0x2fParser = Deltap0x2fParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Delta P 0x53 (Delta P periodic) frame parser\n     */\n    var Deltap0x53Parser = /** @class */ (function () {\n        function Deltap0x53Parser() {\n            this.deviceType = 'deltap';\n            this.frameCode = 0x53;\n        }\n        Deltap0x53Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x53 Delta P periodic data' };\n            var pressures = [];\n            // Loop through historic data [t=0, t-1, t-2,...]\n            for (var offset = 2; offset < payload.byteLength; offset += 2) {\n                pressures.push(payload.readInt16BE(offset));\n            }\n            appContent['decodingInfo'] = 'values: [t=0, t-1, t-2, ...]';\n            appContent['deltaPressure'] = { 'unit': 'pa', 'values': pressures };\n            return appContent;\n        };\n        return Deltap0x53Parser;\n    }());\n    codec.Deltap0x53Parser = Deltap0x53Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Delta P 0x54 (pressure alarm) frame parser\n     */\n    var Deltap0x54Parser = /** @class */ (function () {\n        function Deltap0x54Parser() {\n            this.deviceType = 'deltap';\n            this.frameCode = 0x54;\n        }\n        Deltap0x54Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x54 Delta P alarm' };\n            // Bit 0: alarm pressure state (0: inactive, 1: active)\n            appContent['alarmStatus'] = payload.readUInt8(2) ? 'active' : 'inactive';\n            // Pressure value\n            appContent['deltaPressure'] = { 'unit': 'pa', 'value': payload.readInt16BE(3) };\n            return appContent;\n        };\n        return Deltap0x54Parser;\n    }());\n    codec.Deltap0x54Parser = Deltap0x54Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Delta P 0x55 (periodic 0-10 V) frame parser\n     */\n    var Deltap0x55Parser = /** @class */ (function () {\n        function Deltap0x55Parser() {\n            this.deviceType = 'deltap';\n            this.frameCode = 0x55;\n        }\n        Deltap0x55Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x55 Delta P - periodic 0-10 V' };\n            var voltages = [];\n            // Loop through historic data [t=0, t-1, t-2,...]\n            for (var offset = 2; offset < payload.byteLength; offset += 2) {\n                voltages.push(payload.readInt16BE(offset));\n            }\n            appContent['decodingInfo'] = 'values: [t=0, t-1, t-2, ...]';\n            appContent['voltage'] = { 'unit': 'mV', 'values': voltages };\n            return appContent;\n        };\n        return Deltap0x55Parser;\n    }());\n    codec.Deltap0x55Parser = Deltap0x55Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Delta P 0x56 (alarm 0-10 V) frame parser\n     */\n    var Deltap0x56Parser = /** @class */ (function () {\n        function Deltap0x56Parser() {\n            this.deviceType = 'deltap';\n            this.frameCode = 0x56;\n        }\n        Deltap0x56Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x56 Delta P - alarm 0-10 V' };\n            // Bit 0: alarm state (0: inactive, 1:active)\n            appContent['alarmStatus'] = payload.readUInt8(2) ? 'active' : 'inactive';\n            // Voltage value (in mV)\n            appContent['voltage'] = { 'unit': 'mV', 'value': payload.readInt16BE(3) };\n            return appContent;\n        };\n        return Deltap0x56Parser;\n    }());\n    codec.Deltap0x56Parser = Deltap0x56Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Dry Contacts 0x10 (configuration) frame parser\n     */\n    var Drycontacts0x10Parser = /** @class */ (function () {\n        function Drycontacts0x10Parser() {\n            this.deviceType = 'drycontacts';\n            this.frameCode = 0x10;\n        }\n        Drycontacts0x10Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x10 Dry Contacts configuration' };\n            // Product mode\n            appContent['productMode'] = codec.PlateformCommonUtils.getProductModeText(payload[8]);\n            if (payload[8] === 1) {\n                appContent['keepAlivePeriod'] = { 'unit': 'm', 'value': payload.readUInt8(2) * 10 };\n                appContent['transmitPeriod'] = { 'unit': 'm', 'value': payload.readUInt8(3) * 10 };\n            }\n            else {\n                appContent['keepAlivePeriod'] = { 'unit': 's', 'value': payload.readUInt8(2) * 20 };\n                appContent['transmitPeriod'] = { 'unit': 's', 'value': payload.readUInt8(3) * 20 };\n            }\n            // Channel x configuration\n            // payload[y]<3:0> => type\n            // payload[y]<7:4> => waiting period duration\n            // Channel A configuration\n            var debounce = this.getDebounceText(payload[4] >> 4);\n            var type = this.getTypeText(payload[4] & 0x0f);\n            if (type[0] === 'disabled') {\n                appContent['channelA'] = { 'type': type[0] };\n            }\n            else {\n                appContent['channelA'] = { 'type': type[0], 'edge': type[1],\n                    'debounceDuration': { 'unit': debounce[1], 'value': debounce[0] } };\n            }\n            // Channel B configuration\n            debounce = this.getDebounceText(payload[5] >> 4);\n            type = this.getTypeText(payload[5] & 0x0f);\n            if (type[0] === 'disabled') {\n                appContent['channelB'] = { 'type': type[0] };\n            }\n            else {\n                appContent['channelB'] = { 'type': type[0], 'edge': type[1],\n                    'debounceDuration': { 'unit': debounce[1], 'value': debounce[0] } };\n            }\n            // Channel C configuration\n            debounce = this.getDebounceText(payload[6] >> 4);\n            type = this.getTypeText(payload[6] & 0x0f);\n            if (type[0] === 'disabled') {\n                appContent['channelC'] = { 'type': type[0] };\n            }\n            else {\n                appContent['channelC'] = { 'type': type[0], 'edge': type[1],\n                    'debounceDuration': { 'unit': debounce[1], 'value': debounce[0] } };\n            }\n            // Channel D configuration\n            debounce = this.getDebounceText(payload[7] >> 4);\n            type = this.getTypeText(payload[7] & 0x0f);\n            if (type[0] === 'disabled') {\n                appContent['channelD'] = { 'type': type[0] };\n            }\n            else {\n                appContent['channelD'] = { 'type': type[0], 'edge': type[1],\n                    'debounceDuration': { 'unit': debounce[1], 'value': debounce[0] } };\n            }\n            return appContent;\n        };\n        /**\n         * Get Type text\n         * @param value value\n         */\n        Drycontacts0x10Parser.prototype.getTypeText = function (value) {\n            switch (value) {\n                case 0:\n                    return ['disabled', ''];\n                case 1:\n                    return ['inputPeriodic', 'high'];\n                case 2:\n                    return ['inputPeriodic', 'low'];\n                case 3:\n                    return ['inputPeriodic', 'both'];\n                case 4:\n                    return ['inputEvent', 'high'];\n                case 5:\n                    return ['inputEvent', 'low'];\n                case 6:\n                    return ['inputEvent', 'both'];\n                case 7:\n                    return ['output', 'high'];\n                case 8:\n                    return ['output', 'low'];\n                default:\n                    return ['disabled', ''];\n            }\n        };\n        /**\n         * Get Waiting Period Duration text\n         * @param value value\n         */\n        Drycontacts0x10Parser.prototype.getDebounceText = function (value) {\n            switch (value) {\n                case 0:\n                    return [0, 's'];\n                case 1:\n                    return [10, 'ms'];\n                case 2:\n                    return [20, 'ms'];\n                case 3:\n                    return [50, 'ms'];\n                case 4:\n                    return [100, 'ms'];\n                case 5:\n                    return [200, 'ms'];\n                case 6:\n                    return [500, 'ms'];\n                case 7:\n                    return [1, 's'];\n                case 8:\n                    return [2, 's'];\n                case 9:\n                    return [5, 's'];\n                case 10:\n                    return [10, 's'];\n                case 11:\n                    return [20, 's'];\n                case 12:\n                    return [40, 's'];\n                case 13:\n                    return [60, 's'];\n                case 14:\n                    return [5, 'm'];\n                case 15:\n                    return [10, 'm'];\n                default:\n                    return [0, 's'];\n            }\n        };\n        return Drycontacts0x10Parser;\n    }());\n    codec.Drycontacts0x10Parser = Drycontacts0x10Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Dry Contacts 0x40 (data) frame parser\n     */\n    var Drycontacts0x40Parser = /** @class */ (function () {\n        function Drycontacts0x40Parser() {\n            this.deviceType = 'drycontacts';\n            this.frameCode = 0x40;\n        }\n        Drycontacts0x40Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x40 Dry Contacts data' };\n            appContent['decodingInfo'] = 'true: ON/CLOSED, false: OFF/OPEN';\n            appContent['channelA'] = { 'value': payload.readUInt16BE(2), 'currentState': Boolean(payload[10] & 0x01),\n                'previousFrameState': Boolean(payload[10] & 0x02) };\n            appContent['channelB'] = { 'value': payload.readUInt16BE(4), 'currentState': Boolean(payload[10] & 0x04),\n                'previousFrameState': Boolean(payload[10] & 0x08) };\n            appContent['channelC'] = { 'value': payload.readUInt16BE(6), 'currentState': Boolean(payload[10] & 0x10),\n                'previousFrameState': Boolean(payload[10] & 0x20) };\n            appContent['channelD'] = { 'value': payload.readUInt16BE(8), 'currentState': Boolean(payload[10] & 0x40),\n                'previousFrameState': Boolean(payload[10] & 0x80) };\n            return appContent;\n        };\n        return Drycontacts0x40Parser;\n    }());\n    codec.Drycontacts0x40Parser = Drycontacts0x40Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * DRYCONTACTS status byte parser\n     */\n    var DrycontactsStatusByteParser = /** @class */ (function () {\n        function DrycontactsStatusByteParser() {\n            this.deviceType = 'drycontacts';\n            this.frameCode = 0;\n        }\n        DrycontactsStatusByteParser.prototype.parseFrame = function (payload, configuration) {\n            var statusContent = {};\n            var parser = new codec.GenericStatusByteParser();\n            statusContent = parser.parseFrame(payload, configuration);\n            return { 'status': statusContent };\n        };\n        return DrycontactsStatusByteParser;\n    }());\n    codec.DrycontactsStatusByteParser = DrycontactsStatusByteParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Dry Contacts 2 0x10 (configuration) frame parser\n     */\n    var Drycontacts20x10Parser = /** @class */ (function () {\n        function Drycontacts20x10Parser() {\n            this.deviceType = 'drycontacts2';\n            this.frameCode = 0x10;\n        }\n        Drycontacts20x10Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x10 Dry Contacts 2 configuration' };\n            appContent['keepAlivePeriod'] = { 'unit': 's', 'value': payload.readUInt16BE(2) * 10 };\n            appContent['transmitPeriod'] = { 'unit': 's', 'value': payload.readUInt16BE(4) * 10 };\n            // Channel x configuration\n            // payload[y]<3:0> => type\n            // payload[y]<7:4> => waiting period duration\n            // Channel A configuration\n            var debounce = this.getDebounceText(payload[6] >> 4);\n            var type = this.getTypeText(payload[6] & 0x0f);\n            if (type[0] === 'disabled' || type[0] === 'output') {\n                appContent['channelA'] = { 'type': type[0] };\n            }\n            else {\n                appContent['channelA'] = {\n                    'type': type[0], 'edge': type[1],\n                    'debounceDuration': { 'unit': debounce[1], 'value': debounce[0] }\n                };\n            }\n            // Channel B configuration\n            debounce = this.getDebounceText(payload[7] >> 4);\n            type = this.getTypeText(payload[7] & 0x0f);\n            if (type[0] === 'disabled' || type[0] === 'output') {\n                appContent['channelB'] = { 'type': type[0] };\n            }\n            else {\n                appContent['channelB'] = {\n                    'type': type[0], 'edge': type[1],\n                    'debounceDuration': { 'unit': debounce[1], 'value': debounce[0] }\n                };\n            }\n            // Channel C configuration\n            debounce = this.getDebounceText(payload[8] >> 4);\n            type = this.getTypeText(payload[8] & 0x0f);\n            if (type[0] === 'disabled' || type[0] === 'output') {\n                appContent['channelC'] = { 'type': type[0] };\n            }\n            else {\n                appContent['channelC'] = {\n                    'type': type[0], 'edge': type[1],\n                    'debounceDuration': { 'unit': debounce[1], 'value': debounce[0] }\n                };\n            }\n            // Channel D configuration\n            debounce = this.getDebounceText(payload[9] >> 4);\n            type = this.getTypeText(payload[9] & 0x0f);\n            if (type[0] === 'disabled' || type[0] === 'output') {\n                appContent['channelD'] = { 'type': type[0] };\n            }\n            else {\n                appContent['channelD'] = {\n                    'type': type[0], 'edge': type[1],\n                    'debounceDuration': { 'unit': debounce[1], 'value': debounce[0] }\n                };\n            }\n            return appContent;\n        };\n        /**\n         * Get Type text\n         * @param value value\n         */\n        Drycontacts20x10Parser.prototype.getTypeText = function (value) {\n            switch (value) {\n                case 0:\n                    return ['disabled', ''];\n                case 1:\n                    return ['input', 'high'];\n                case 2:\n                    return ['input', 'low'];\n                case 3:\n                    return ['input', 'both'];\n                case 4:\n                    return ['output', ''];\n                default:\n                    return ['disabled', ''];\n            }\n        };\n        /**\n         * Get Waiting Period Duration text\n         * @param value value\n         */\n        Drycontacts20x10Parser.prototype.getDebounceText = function (value) {\n            switch (value) {\n                case 0:\n                    return [0, 's'];\n                case 1:\n                    return [10, 'ms'];\n                case 2:\n                    return [20, 'ms'];\n                case 3:\n                    return [50, 'ms'];\n                case 4:\n                    return [100, 'ms'];\n                case 5:\n                    return [200, 'ms'];\n                case 6:\n                    return [500, 'ms'];\n                case 7:\n                    return [1, 's'];\n                case 8:\n                    return [2, 's'];\n                case 9:\n                    return [5, 's'];\n                case 10:\n                    return [10, 's'];\n                case 11:\n                    return [20, 's'];\n                case 12:\n                    return [40, 's'];\n                case 13:\n                    return [60, 's'];\n                case 14:\n                    return [5, 'm'];\n                case 15:\n                    return [10, 'm'];\n                default:\n                    return [0, 's'];\n            }\n        };\n        return Drycontacts20x10Parser;\n    }());\n    codec.Drycontacts20x10Parser = Drycontacts20x10Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Dry Contacts 0x30 (keep alive) frame parser\n     */\n    var Drycontacts20x30Parser = /** @class */ (function () {\n        function Drycontacts20x30Parser() {\n            this.deviceType = 'drycontacts2';\n            this.frameCode = 0x30;\n        }\n        Drycontacts20x30Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x30 Dry Contacts 2 keep alive' };\n            if (payload[1] & 0x04) {\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(11) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            appContent['channelA'] = { 'value': payload.readUInt16BE(2), 'state': Boolean(payload[10] & 0x01) };\n            appContent['channelB'] = { 'value': payload.readUInt16BE(4), 'state': Boolean(payload[10] & 0x02) };\n            appContent['channelC'] = { 'value': payload.readUInt16BE(6), 'state': Boolean(payload[10] & 0x04) };\n            appContent['channelD'] = { 'value': payload.readUInt16BE(8), 'state': Boolean(payload[10] & 0x08) };\n            return appContent;\n        };\n        return Drycontacts20x30Parser;\n    }());\n    codec.Drycontacts20x30Parser = Drycontacts20x30Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Dry Contacts 0x40 (data) frame parser\n     */\n    var Drycontacts20x40Parser = /** @class */ (function () {\n        function Drycontacts20x40Parser() {\n            this.deviceType = 'drycontacts2';\n            this.frameCode = 0x40;\n        }\n        Drycontacts20x40Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x40 Dry Contacts 2 data' };\n            if (payload[1] & 0x04) {\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(11) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            appContent['decodingInfo'] = 'true: ON/CLOSED, false: OFF/OPEN';\n            appContent['channelA'] = {\n                'value': payload.readUInt16BE(2), 'currentState': Boolean(payload[10] & 0x01),\n                'previousFrameState': Boolean(payload[10] & 0x02)\n            };\n            appContent['channelB'] = {\n                'value': payload.readUInt16BE(4), 'currentState': Boolean(payload[10] & 0x04),\n                'previousFrameState': Boolean(payload[10] & 0x08)\n            };\n            appContent['channelC'] = {\n                'value': payload.readUInt16BE(6), 'currentState': Boolean(payload[10] & 0x10),\n                'previousFrameState': Boolean(payload[10] & 0x20)\n            };\n            appContent['channelD'] = {\n                'value': payload.readUInt16BE(8), 'currentState': Boolean(payload[10] & 0x40),\n                'previousFrameState': Boolean(payload[10] & 0x80)\n            };\n            return appContent;\n        };\n        return Drycontacts20x40Parser;\n    }());\n    codec.Drycontacts20x40Parser = Drycontacts20x40Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Dry Contacts 0x41 (duration alarm ) frame parser\n     */\n    var Drycontacts20x41Parser = /** @class */ (function () {\n        function Drycontacts20x41Parser() {\n            this.deviceType = 'drycontacts2';\n            this.frameCode = 0x41;\n        }\n        Drycontacts20x41Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x41 Dry Contacts 2 duration alarm' };\n            if (payload[1] & 0x04) {\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(5) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            appContent['channel'] = payload.readUInt8(2);\n            appContent['durationThreshold'] = { 'unit': 'min', 'value': payload.readUInt16BE(3) };\n            return appContent;\n        };\n        return Drycontacts20x41Parser;\n    }());\n    codec.Drycontacts20x41Parser = Drycontacts20x41Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Dry Contacts 2 0x59 time counting data frame parser\n     */\n    var Drycontacts20x59Parser = /** @class */ (function () {\n        function Drycontacts20x59Parser() {\n            this.deviceType = 'drycontacts2';\n            this.frameCode = 0x59;\n        }\n        Drycontacts20x59Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x59 Dry Contacts 2 time counting data' };\n            // Concerns only Lora products\n            if (payload[1] & 0x04) {\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(payload.length - 4) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            var offset = 3;\n            if (payload[2] & 0x01) {\n                appContent['channelATimeCounter'] = { 'unit': 's', 'value': payload.readUInt32BE(offset) };\n                offset += 4;\n            }\n            if (payload[2] & 0x02) {\n                appContent['channelBTimeCounter'] = { 'unit': 's', 'value': payload.readUInt32BE(offset) };\n                offset += 4;\n            }\n            if (payload[2] & 0x04) {\n                appContent['channelCTimeCounter'] = { 'unit': 's', 'value': payload.readUInt32BE(offset) };\n                offset += 4;\n            }\n            if (payload[2] & 0x08) {\n                appContent['channelDTimeCounter'] = { 'unit': 's', 'value': payload.readUInt32BE(offset) };\n            }\n            return appContent;\n        };\n        return Drycontacts20x59Parser;\n    }());\n    codec.Drycontacts20x59Parser = Drycontacts20x59Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Temp 3 status byte parser\n     */\n    var Drycontacts2StatusByteParser = /** @class */ (function () {\n        function Drycontacts2StatusByteParser() {\n            this.deviceType = 'drycontacts2';\n            this.frameCode = 0;\n        }\n        Drycontacts2StatusByteParser.prototype.parseFrame = function (payload, configuration, network) {\n            var statusContent = {};\n            var parser = new codec.GenericStatusByteParser();\n            statusContent = parser.parseFrame(payload, configuration);\n            // Status byte, applicative flags\n            statusContent['timestamp'] = Boolean(payload[1] & 0x04);\n            return { 'status': statusContent };\n        };\n        return Drycontacts2StatusByteParser;\n    }());\n    codec.Drycontacts2StatusByteParser = Drycontacts2StatusByteParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Smart Building 0x1f (TOR configuration) frame parser\n     */\n    var Generic0x1fParser = /** @class */ (function () {\n        function Generic0x1fParser() {\n            this.deviceType = 'motion|comfort|comfort2|comfortCo2|deltap|breath';\n            this.frameCode = 0x1f;\n        }\n        Generic0x1fParser.prototype.parseFrame = function (payload, configuration, network) {\n            // register 380: Configuration digital input 1\n            // register 381: Alarm threshold digital input 1\n            // register 382: Configuration digital input 2\n            // register 383: Alarm threshold digital input 2\n            var appContent = { type: '0x1f digital input configuration' };\n            var input1 = {};\n            var input2 = {};\n            input1['type'] = this.getTypeText(payload[2] & 0x0f);\n            input1['debouncingPeriod'] = {\n                'unit': 'ms', 'value': this.getDebouncingPeriodText((payload[2] & 0xf0) >> 4)\n            };\n            input1['threshold'] = payload.readUInt16BE(3);\n            input2['type'] = this.getTypeText(payload[5] & 0x0f);\n            input2['debouncingPeriod'] = {\n                'unit': 'ms', 'value': this.getDebouncingPeriodText((payload[5] & 0xf0) >> 4)\n            };\n            input2['threshold'] = payload.readUInt16BE(6);\n            appContent['digitalInput1'] = input1;\n            appContent['digitalInput2'] = input2;\n            return appContent;\n        };\n        /**\n         * Get debounce duration text\n         * @param value value\n         */\n        Generic0x1fParser.prototype.getDebouncingPeriodText = function (value) {\n            switch (value) {\n                case 0:\n                    return 0;\n                case 1:\n                    return 10;\n                case 2:\n                    return 20;\n                case 3:\n                    return 500;\n                case 4:\n                    return 100;\n                case 5:\n                    return 200;\n                case 6:\n                    return 500;\n                case 7:\n                    return 1000;\n                case 8:\n                    return 2000;\n                case 9:\n                    return 5000;\n                case 10:\n                    return 10000;\n                case 11:\n                    return 20000;\n                case 12:\n                    return 40000;\n                case 13:\n                    return 60000;\n                case 14:\n                    return 300000;\n                case 15:\n                    return 600000;\n                default:\n                    return 0;\n            }\n        };\n        /**\n         * Get type text\n         * @param value value\n         */\n        Generic0x1fParser.prototype.getTypeText = function (value) {\n            switch (value) {\n                case 0x0:\n                    return 'deactivated';\n                case 0x1:\n                    return 'highEdge';\n                case 0x2:\n                    return 'lowEdge';\n                case 0x3:\n                    return 'bothEdges';\n                default:\n                    return '';\n            }\n        };\n        return Generic0x1fParser;\n    }());\n    codec.Generic0x1fParser = Generic0x1fParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Generic 0x20 (configuration) frame parser\n     */\n    var Generic0x20Parser = /** @class */ (function () {\n        function Generic0x20Parser() {\n            this.deviceType = 'any';\n            this.frameCode = 0x20;\n        }\n        Generic0x20Parser.prototype.parseFrame = function (payload, configuration, network, deviceType) {\n            var appContent = { type: '0x20 Configuration' };\n            // Content depends on network\n            switch (payload.byteLength) {\n                case 4:\n                    appContent['loraAdr'] = Boolean(payload[2] & 0x01);\n                    appContent['loraProvisioningMode'] = (payload[3] === 0) ? 'ABP' : 'OTAA';\n                    // TEMP3 , TEMP4 and PULSE3 use FW 2.0.0 . In that case byte 2 contains the entire S220 register\n                    if (deviceType !== 'analog' && deviceType !== 'drycontacts'\n                        && deviceType !== 'pulse' && deviceType !== 'temp') {\n                        appContent['loraDutycyle'] = (payload[2] & 0x04) ? 'activated' : 'deactivated';\n                        appContent['loraClassMode'] = (payload[2] & 0x20) ? 'CLASS C' : 'CLASS A';\n                    }\n                    break;\n                case 3:\n                case 5:\n                    appContent['sigfoxRetry'] = (payload[2] & 0x03);\n                    if (payload.byteLength === 5) {\n                        appContent['sigfoxDownlinkPeriod'] = { 'unit': 'm', 'value': payload.readInt16BE(3) };\n                    }\n                    break;\n                default:\n                    appContent.partialDecoding = codec.PartialDecodingReason.MISSING_NETWORK;\n                    break;\n            }\n            return appContent;\n        };\n        return Generic0x20Parser;\n    }());\n    codec.Generic0x20Parser = Generic0x20Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Generic 0x2f (downlink ACK) frame parser\n     */\n    var Generic0x2fParser = /** @class */ (function () {\n        function Generic0x2fParser() {\n            this.deviceType = 'drycontacts|drycontacts2|temp4';\n            this.frameCode = 0x2f;\n        }\n        Generic0x2fParser.prototype.parseFrame = function (payload, configuration) {\n            var appContent = { type: '0x2f Downlink ack' };\n            appContent['downlinkFramecode'] = '0x' + payload[2].toString(16);\n            appContent['requestStatus'] = this.getRequestStatusText(payload[3]);\n            return appContent;\n        };\n        /**\n         * Get Type text\n         * @param value value\n         */\n        Generic0x2fParser.prototype.getRequestStatusText = function (value) {\n            switch (value) {\n                case 1:\n                    return 'success';\n                case 2:\n                    return 'errorGeneric';\n                case 3:\n                    return 'errorWrongState';\n                case 4:\n                    return 'errorInvalidRequest';\n                default:\n                    return 'errorOtherReason';\n            }\n        };\n        return Generic0x2fParser;\n    }());\n    codec.Generic0x2fParser = Generic0x2fParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Generic 0x30 (keep alive) frame parser\n     */\n    var Generic0x30Parser = /** @class */ (function () {\n        function Generic0x30Parser() {\n            this.deviceType = 'any';\n            this.frameCode = 0x30;\n        }\n        Generic0x30Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x30 Keep alive' };\n            return appContent;\n        };\n        return Generic0x30Parser;\n    }());\n    codec.Generic0x30Parser = Generic0x30Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Generic 0x33 (Response to Set Register downlink) frame parser\n     */\n    var Generic0x33Parser = /** @class */ (function () {\n        function Generic0x33Parser() {\n            this.deviceType = 'drycontacts|drycontacts2|pulse3|pulse4|' +\n                'temp3|temp4|comfort|comfort2|comfortCo2|motion|deltap|breath';\n            this.frameCode = 0x33;\n        }\n        Generic0x33Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x33 Set register status' };\n            appContent['requestStatus'] = this.getRequestStatusText(payload[2]);\n            appContent['registerId'] = payload.readUInt16BE(3);\n            return appContent;\n        };\n        /**\n         * Get Type text\n         * @param value value\n         */\n        Generic0x33Parser.prototype.getRequestStatusText = function (value) {\n            switch (value) {\n                case 1:\n                    return 'success';\n                case 2:\n                    return 'successNoUpdate';\n                case 3:\n                    return 'errorCoherency';\n                case 4:\n                    return 'errorInvalidRegister';\n                case 5:\n                    return 'errorInvalidValue';\n                case 6:\n                    return 'errorTruncatedValue';\n                case 7:\n                    return 'errorAccesNotAllowed';\n                default:\n                    return 'errorOtherReason';\n            }\n        };\n        return Generic0x33Parser;\n    }());\n    codec.Generic0x33Parser = Generic0x33Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Generic 0x36 alert message frame parser\n     */\n    var Generic0x36Parser = /** @class */ (function () {\n        function Generic0x36Parser() {\n            this.deviceType = 'temp4';\n            this.frameCode = 0x36;\n        }\n        Generic0x36Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x36 Alert message' };\n            switch (payload[2]) {\n                case 0x00:\n                    appContent['alertCode'] = 'normalState';\n                    break;\n                case 0x01:\n                    appContent['alertCode'] = 'uplinkDownlinkForbidden';\n                    break;\n                default:\n                    break;\n            }\n            return appContent;\n        };\n        return Generic0x36Parser;\n    }());\n    codec.Generic0x36Parser = Generic0x36Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Generic 0x37 Software version' frame parser\n     */\n    var Generic0x37Parser = /** @class */ (function () {\n        function Generic0x37Parser() {\n            this.deviceType = 'temp4|comfort2|comfortCo2|breath';\n            this.frameCode = 0x37;\n        }\n        Generic0x37Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x37 Software version' };\n            appContent['appVersion'] = payload.readUInt8(2) + '.' + payload.readUInt8(3) + '.' + payload.readUInt8(4);\n            appContent['rtuVersion'] = payload.readUInt8(5) + '.' + payload.readUInt8(6) + '.' + payload.readUInt8(7);\n            return appContent;\n        };\n        return Generic0x37Parser;\n    }());\n    codec.Generic0x37Parser = Generic0x37Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Smart digital input 1 alarm frame parser\n     */\n    var Generic0x51Parser = /** @class */ (function () {\n        function Generic0x51Parser() {\n            this.deviceType = 'motion|comfort|comfort2|comfortCo2|deltap|breath';\n            this.frameCode = 0x51;\n        }\n        Generic0x51Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x51 digital input 1 alarm' };\n            if (payload[1] & 0x04) {\n                // retrieval of the frame date timestamp value,\n                // then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(9) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            appContent['state'] = {\n                'previousFrame': Boolean(payload.readUInt8(2) >> 1 & 1),\n                'current': Boolean(payload.readUInt8(2) >> 0 & 1)\n            };\n            appContent['counter'] = {\n                'global': payload.readUInt32BE(3),\n                'instantaneous': payload.readUInt16BE(7)\n            };\n            return appContent;\n        };\n        return Generic0x51Parser;\n    }());\n    codec.Generic0x51Parser = Generic0x51Parser;\n})(codec || (codec = {}));\nvar __assign = (this && this.__assign) || function () {\n    __assign = Object.assign || function(t) {\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\n            s = arguments[i];\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n                t[p] = s[p];\n        }\n        return t;\n    };\n    return __assign.apply(this, arguments);\n};\nvar codec;\n(function (codec) {\n    /**\n     * 0x52 digital input 2 alarm frame parser\n     */\n    var Generic0x52Parser = /** @class */ (function () {\n        function Generic0x52Parser() {\n            this.deviceType = 'motion|comfort|comfort2|comfortCo2|deltap|breath';\n            this.frameCode = 0x52;\n            this.parser = new codec.Generic0x51Parser();\n        }\n        Generic0x52Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = __assign(__assign({}, this.parser.parseFrame(payload, configuration, network)), { type: '0x52 digital input 2 alarm' });\n            return appContent;\n        };\n        return Generic0x52Parser;\n    }());\n    codec.Generic0x52Parser = Generic0x52Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Extended status byte parser\n     */\n    var GenericStatusByteExtParser = /** @class */ (function () {\n        function GenericStatusByteExtParser() {\n            this.deviceType = 'any';\n            this.frameCode = 0;\n        }\n        GenericStatusByteExtParser.prototype.parseFrame = function (payload, configuration) {\n            var statusContent = {};\n            var parser = new codec.GenericStatusByteParser();\n            statusContent = parser.parseFrame(payload, configuration);\n            // Status byte, applicative flags\n            statusContent['configurationInconsistency'] = Boolean(payload[1] & 0x08);\n            return { 'status': statusContent };\n        };\n        return GenericStatusByteExtParser;\n    }());\n    codec.GenericStatusByteExtParser = GenericStatusByteExtParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Generic status byte parser\n     */\n    var GenericStatusByteParser = /** @class */ (function () {\n        function GenericStatusByteParser() {\n            this.deviceType = 'any';\n            this.frameCode = 0;\n        }\n        GenericStatusByteParser.prototype.parseFrame = function (payload, configuration) {\n            var statusContent = {};\n            statusContent['frameCounter'] = (payload[1] & 0xe0) >> 5;\n            // hardwareError not used anymore. Currently used for timestamp activation\n            statusContent['hardwareError'] = false;\n            statusContent['lowBattery'] = Boolean(payload[1] & 0x02);\n            statusContent['configurationDone'] = Boolean(payload[1] & 0x01);\n            return statusContent;\n        };\n        return GenericStatusByteParser;\n    }());\n    codec.GenericStatusByteParser = GenericStatusByteParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Motion 0x10 (configuration) frame parser\n     */\n    var Motion0x10Parser = /** @class */ (function () {\n        function Motion0x10Parser() {\n            this.deviceType = 'motion';\n            this.frameCode = 0x10;\n        }\n        Motion0x10Parser.prototype.parseFrame = function (payload, configuration, network) {\n            // register 300: Emission period of the life frame X 10s\n            // register 301: Issue period, value betwenn 0 and 65535, 0: disabling periodic transmission\n            // register 320: value between 1 and 65535\n            // register 321: value between 0 and 65535, 0: no scanning, X2s\n            // register 322: presence inhibition period X 10s\n            // reading_frequency = S321 * S320\n            // sending_frequency = S321 * S320 * S301\n            var appContent = { type: '0x10 Motion configuration' };\n            appContent['transmissionPeriodKeepAlive'] = { 'unit': 's', 'value': payload.readUInt16BE(2) * 10 },\n                appContent['numberOfHistorizationBeforeSending'] = payload.readUInt16BE(4),\n                appContent['numberOfSamplingBeforeHistorization'] = payload.readUInt16BE(6),\n                appContent['samplingPeriod'] = { 'unit': 's', 'value': payload.readUInt16BE(8) * 2 },\n                appContent['presenceDetectorInhibition'] = { 'unit': 's', 'value': payload.readUInt16BE(10) * 10 },\n                appContent['calculatedPeriodRecording'] = { 'unit': 's',\n                    'value': payload.readUInt16BE(8) * payload.readUInt16BE(6) * 2 },\n                appContent['calculatedSendingPeriod'] = { 'unit': 's',\n                    'value': payload.readUInt16BE(8) * payload.readUInt16BE(6) * payload.readUInt16BE(4) * 2 };\n            return appContent;\n        };\n        return Motion0x10Parser;\n    }());\n    codec.Motion0x10Parser = Motion0x10Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Motion 0x4e (historic data) frame parser\n     */\n    var Motion0x4eParser = /** @class */ (function () {\n        function Motion0x4eParser() {\n            this.deviceType = 'motion';\n            this.frameCode = 0x4e;\n        }\n        Motion0x4eParser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x4e Motion data' };\n            var counters = [], luminosities = [];\n            appContent['globalCounterValue'] = payload.readUInt16BE(2);\n            // Loop through historic data [t=0, t-1, t-2,...]\n            for (var offset = 4; offset < payload.byteLength; offset += 3) {\n                counters.push(payload.readInt16BE(offset));\n                luminosities.push(payload.readUInt8(offset + 2));\n            }\n            appContent['decodingInfo'] = 'counterValues/values: [t=0, t-1, t-2, ...]';\n            appContent['counterValues'] = counters;\n            appContent['luminosity'] = { 'unit': '\\u0025', 'values': luminosities };\n            return appContent;\n        };\n        return Motion0x4eParser;\n    }());\n    codec.Motion0x4eParser = Motion0x4eParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Motion 0x4f (presence alarm) frame parser\n     */\n    var Motion0x4fParser = /** @class */ (function () {\n        function Motion0x4fParser() {\n            this.deviceType = 'motion';\n            this.frameCode = 0x4f;\n        }\n        Motion0x4fParser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x4f Motion presence alarm' };\n            appContent['alarmPresence'] = {\n                'globalCounterValue': payload.readUInt16BE(2),\n                'counterValue': payload.readUInt16BE(4),\n            };\n            return appContent;\n        };\n        return Motion0x4fParser;\n    }());\n    codec.Motion0x4fParser = Motion0x4fParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Motion 0x50 (luminosity alarm) frame parser\n     */\n    var Motion0x50Parser = /** @class */ (function () {\n        function Motion0x50Parser() {\n            this.deviceType = 'motion';\n            this.frameCode = 0x50;\n        }\n        Motion0x50Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x50 Motion luminosity alarm' };\n            appContent['alarmLuminosity'] = {\n                'alarmStatus': payload[2] ? 'active' : 'inactive',\n                'luminosity': { 'unit': '\\u0025', 'value': payload[3] }\n            };\n            return appContent;\n        };\n        return Motion0x50Parser;\n    }());\n    codec.Motion0x50Parser = Motion0x50Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Motion 0x5c (historic data) frame parser\n     */\n    var Motion0x5cParser = /** @class */ (function () {\n        function Motion0x5cParser() {\n            this.deviceType = 'motion';\n            this.frameCode = 0x5c;\n        }\n        Motion0x5cParser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x5c Motion data' };\n            var presences = [], luminosities = [];\n            appContent['presenceDetectedWhenSending'] = Boolean(payload[2]);\n            // Loop through historic data [t=0, t-1, t-2,...]\n            for (var offset = 3; offset < payload.byteLength; offset += 2) {\n                presences.push(payload[offset]);\n                luminosities.push(payload[offset + 1]);\n            }\n            appContent['decodingInfo'] = 'values: [t=0, t-1, t-2, ...]';\n            appContent['presence'] = { 'unit': '\\u0025', 'values': presences };\n            appContent['luminosity'] = { 'unit': '\\u0025', 'values': luminosities };\n            return appContent;\n        };\n        return Motion0x5cParser;\n    }());\n    codec.Motion0x5cParser = Motion0x5cParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Motion 0x4f (presence alarm) frame parser\n     */\n    var Motion0x5dParser = /** @class */ (function () {\n        function Motion0x5dParser() {\n            this.deviceType = 'motion';\n            this.frameCode = 0x5d;\n        }\n        Motion0x5dParser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = {\n                type: '0x5d Motion presence alarm'\n            };\n            appContent['alarmPresence'] = {\n                'alarmStatus': payload[2] ? 'active' : 'inactive',\n                'luminosity': { 'unit': '\\u0025', 'value': payload[3] }\n            };\n            return appContent;\n        };\n        return Motion0x5dParser;\n    }());\n    codec.Motion0x5dParser = Motion0x5dParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 0x10 (configuration) frame parser\n     */\n    var Pulse0x10Parser = /** @class */ (function () {\n        function Pulse0x10Parser() {\n            this.deviceType = 'pulse';\n            this.frameCode = 0x10;\n            this.pulse0x11Parser = new codec.Pulse0x11Parser();\n            this.pulse0x12Parser = new codec.Pulse0x12Parser();\n        }\n        Pulse0x10Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x10 Pulse configuration' };\n            var chA = { 'name': 'channel A' };\n            var chB = { 'name': 'channel B' };\n            // Product mode\n            appContent['productMode'] = codec.PlateformCommonUtils.getProductModeText(payload[2]);\n            // Resolve known network\n            var knownNetwork = this.inferNetwork(payload.byteLength);\n            // Transmission period\n            var offset = 0;\n            if (payload[8] === 2) {\n                // TEST mode => period = value * 20sec\n                if (knownNetwork === 'sigfox') {\n                    appContent['transmissionPeriod'] = { 'unit': 's', 'value': payload[3] * 20 };\n                    offset = -1; // value is on 1 byte for Sigfox, shift further payload reading\n                }\n                else {\n                    appContent['transmissionPeriod'] = { 'unit': 's', 'value': payload.readUInt16BE(3) * 20 };\n                }\n            }\n            else {\n                // PRODUCTION mode\n                if (knownNetwork === 'sigfox') {\n                    // Sigfox: period = value * 10min\n                    appContent['transmissionPeriod'] = { 'unit': 'm', 'value': payload[3] * 10 };\n                    offset = -1; // value is on 1 byte for Sigfox, shift further payload reading\n                }\n                else {\n                    // LoRa 868: period = value * 1min\n                    appContent['transmissionPeriod'] = { 'unit': 'm', 'value': payload.readUInt16BE(3) };\n                }\n            }\n            // Flow calculation period\n            if (payload[2] === 2) {\n                // TEST mode => period = value * 20sec\n                appContent['flowCalculationPeriod'] = { 'unit': 's', 'value': payload.readUInt16BE(offset + 8) * 20 };\n            }\n            else {\n                // PRODUCTION mode => period = value * 1min\n                appContent['flowCalculationPeriod'] = { 'unit': 'm', 'value': payload.readUInt16BE(offset + 8) };\n            }\n            // Historic mode\n            appContent['historicMode'] = this.getHistoricModeText(payload[offset + 6]);\n            // Channels A configuration\n            chA['state'] = this.getStateText(Boolean(payload[offset + 5] & 0x01));\n            chA['type'] = this.getTypeText(Boolean(payload[offset + 5] & 0x02));\n            chA['tamperActivated'] = Boolean(payload[offset + 5] & 0x08);\n            chA['debouncingPeriod'] = {\n                'unit': 'ms', 'value': this.getDebouncingPeriod(payload[offset + 7] & 0x0f)\n            };\n            if (knownNetwork === 'lora868') {\n                chA['leakageDetection'] = {\n                    'overflowAlarmTriggerThreshold': payload.readUInt16BE(10),\n                    'threshold': payload.readUInt16BE(14),\n                    'dailyPeriodsBelowWhichLeakageAlarmTriggered': payload.readUInt16BE(18)\n                };\n            }\n            // Channels B configuration\n            chB['state'] = this.getStateText(Boolean(payload[offset + 5] & 0x10));\n            chB['type'] = this.getTypeText(Boolean(payload[offset + 5] & 0x20));\n            chB['tamperActivated'] = Boolean(payload[offset + 5] & 0x80);\n            chB['debouncingPeriod'] = {\n                'unit': 'ms', 'value': this.getDebouncingPeriod((payload[offset + 7] & 0xf0) >> 4)\n            };\n            if (knownNetwork === 'lora868') {\n                chB['leakageDetection'] = {\n                    'overflowAlarmTriggerThreshold': payload.readUInt16BE(12),\n                    'threshold': payload.readUInt16BE(16),\n                    'dailyPeriodsBelowWhichLeakageAlarmTriggered': payload.readUInt16BE(20)\n                };\n            }\n            appContent['channels'] = [chA, chB];\n            return appContent;\n        };\n        /**\n         * Infer network\n         * @param length frame length\n         */\n        Pulse0x10Parser.prototype.inferNetwork = function (length) {\n            //            +--------------+\n            //            | Frame length |\n            // +----------+--------------+\n            // | LoRa 868 |           22 |\n            // | Sigfox   |            9 |\n            // +----------+--------------+\n            switch (length) {\n                case 22:\n                    return 'lora868';\n                case 9:\n                    return 'sigfox';\n                default:\n                    return 'unknown';\n            }\n        };\n        /**\n         * Get state text\n         * @param value value\n         */\n        Pulse0x10Parser.prototype.getStateText = function (value) {\n            return value ? 'enabled' : 'disabled';\n        };\n        /**\n         * Get type text\n         * @param value value\n         */\n        Pulse0x10Parser.prototype.getTypeText = function (value) {\n            return value ? 'gasPullUpOn' : 'otherPullUpOff';\n        };\n        /**\n         * Get historic mode text\n         * @param value value\n         */\n        Pulse0x10Parser.prototype.getHistoricModeText = function (value) {\n            switch (value) {\n                case 0:\n                    return 'noHistoric';\n                case 1:\n                    return 'historicLogEvery10min';\n                case 2:\n                    return 'historicLogEvery1h';\n                default:\n                    return '';\n            }\n        };\n        /**\n         * Get debouncing period text\n         * @param value value\n         */\n        Pulse0x10Parser.prototype.getDebouncingPeriod = function (value) {\n            switch (value) {\n                case 0:\n                    return 0;\n                case 1:\n                    return 1;\n                case 2:\n                    return 10;\n                case 3:\n                    return 20;\n                case 4:\n                    return 50;\n                case 5:\n                    return 100;\n                case 6:\n                    return 200;\n                case 7:\n                    return 500;\n                case 8:\n                    return 1000;\n                case 9:\n                    return 2000;\n                case 10:\n                    return 5000;\n                case 11:\n                    return 10000;\n                default:\n                    return 0;\n            }\n        };\n        return Pulse0x10Parser;\n    }());\n    codec.Pulse0x10Parser = Pulse0x10Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 0x11 (configuration) frame parser\n     */\n    var Pulse0x11Parser = /** @class */ (function () {\n        function Pulse0x11Parser() {\n            this.deviceType = 'pulse';\n            this.frameCode = 0x11;\n        }\n        Pulse0x11Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x11 Pulse configuration' };\n            var chA = { 'name': 'channel A' };\n            var chB = { 'name': 'channel B' };\n            chA['leakageDetection'] = {\n                'overflowAlarmTriggerThreshold': payload.readUInt16BE(2),\n                'threshold': payload.readUInt16BE(6)\n            };\n            chB['leakageDetection'] = {\n                'overflowAlarmTriggerThreshold': payload.readUInt16BE(4),\n                'threshold': payload.readUInt16BE(8)\n            };\n            appContent['channels'] = [chA, chB];\n            return appContent;\n        };\n        return Pulse0x11Parser;\n    }());\n    codec.Pulse0x11Parser = Pulse0x11Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 0x12 (configuration) frame parser\n     */\n    var Pulse0x12Parser = /** @class */ (function () {\n        function Pulse0x12Parser() {\n            this.deviceType = 'pulse';\n            this.frameCode = 0x12;\n        }\n        Pulse0x12Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x12 Pulse configuration' };\n            var chA = { 'name': 'channel A' };\n            var chB = { 'name': 'channel B' };\n            chA['leakageDetection'] = {\n                'dailyPeriodsBelowWhichLeakageAlarmTriggered': payload.readUInt16BE(2),\n            };\n            chB['leakageDetection'] = {\n                'dailyPeriodsBelowWhichLeakageAlarmTriggered': payload.readUInt16BE(4),\n            };\n            appContent['channels'] = [chA, chB];\n            return appContent;\n        };\n        return Pulse0x12Parser;\n    }());\n    codec.Pulse0x12Parser = Pulse0x12Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 0x30 (keep alive) frame parser\n     */\n    var Pulse0x30Parser = /** @class */ (function () {\n        function Pulse0x30Parser() {\n            this.deviceType = 'pulse';\n            this.frameCode = 0x30;\n        }\n        Pulse0x30Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x30 Pulse keep alive' };\n            var chA = { 'name': 'channel A' };\n            var chB = { 'name': 'channel B' };\n            chA['flow'] = {\n                'alarm': Boolean(payload[2] & 0x01),\n                'last24hMin': payload.readUInt16BE(7),\n                'last24hMax': payload.readUInt16BE(3)\n            };\n            chA['tamperAlarm'] = Boolean(payload[2] & 0x04);\n            chA['leakageAlarm'] = Boolean(payload[2] & 0x10);\n            chB['flow'] = {\n                'alarm': Boolean(payload[2] & 0x02),\n                'last24hMin': payload.readUInt16BE(9),\n                'last24hMax': payload.readUInt16BE(5)\n            };\n            chB['tamperAlarm'] = Boolean(payload[2] & 0x08);\n            chB['leakageAlarm'] = Boolean(payload[2] & 0x20);\n            appContent['channels'] = [chA, chB];\n            return appContent;\n        };\n        return Pulse0x30Parser;\n    }());\n    codec.Pulse0x30Parser = Pulse0x30Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 0x46 (data) frame parser\n     */\n    var Pulse0x46Parser = /** @class */ (function () {\n        function Pulse0x46Parser() {\n            this.deviceType = 'pulse';\n            this.frameCode = 0x46;\n        }\n        Pulse0x46Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x46 Pulse data' };\n            appContent['decodingInfo'] = 'counterValues: [Channel A, Channel B]';\n            // Current indexes [Channel A, Channel B]\n            appContent['counterValues'] = [payload.readUInt32BE(2), payload.readUInt32BE(6)];\n            return appContent;\n        };\n        return Pulse0x46Parser;\n    }());\n    codec.Pulse0x46Parser = Pulse0x46Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 0x47 (alarm) frame parser\n     */\n    var Pulse0x47Parser = /** @class */ (function () {\n        function Pulse0x47Parser() {\n            this.deviceType = 'pulse';\n            this.frameCode = 0x47;\n        }\n        Pulse0x47Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x47 Pulse alarm' };\n            appContent['decodingInfo'] = 'flowValues: [Channel A, Channel B]';\n            // Flows when overflow has occured [Channel A, Channel B]\n            appContent['flowValues'] = [payload.readUInt16BE(2), payload.readUInt16BE(4)];\n            return appContent;\n        };\n        return Pulse0x47Parser;\n    }());\n    codec.Pulse0x47Parser = Pulse0x47Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 0x48 (historic data) frame parser\n     */\n    var Pulse0x48Parser = /** @class */ (function () {\n        function Pulse0x48Parser() {\n            this.deviceType = 'pulse';\n            this.frameCode = 0x48;\n        }\n        Pulse0x48Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x48 Pulse historic data' };\n            var deltasA = [];\n            var deltasB = [];\n            var chA = { 'name': 'channel A' };\n            var chB = { 'name': 'channel B' };\n            // Frame index\n            var frameIndex = payload[2];\n            appContent['frameIndex'] = frameIndex;\n            if (frameIndex === 0) {\n                // Index values\n                chA['index'] = payload.readUInt32BE(3);\n                chB['index'] = payload.readUInt32BE(7);\n            }\n            // Delta values\n            var start = frameIndex === 0 ? 11 : 3;\n            var base = this.getBase(frameIndex, payload.byteLength);\n            for (var offset = start; offset < payload.byteLength; offset += 4) {\n                deltasA.push(payload.readUInt16BE(offset));\n                deltasB.push(payload.readUInt16BE(offset + 2));\n            }\n            if (deltasA.length > 0) {\n                appContent['baseTime'] = base;\n                appContent['decodingInfo'] = \"deltaValues: [t=\" + base + \" to t=\" + (base + 1) + \", t=\" + (base + 1) + \" to t=\" + (base + 2) + \", ...]\";\n                chA['deltaValues'] = deltasA;\n                chB['deltaValues'] = deltasB;\n            }\n            appContent['channels'] = [chA, chB];\n            return appContent;\n        };\n        /**\n         * Based on frameIndex and payload length this routine determines the basetime (different in lora and SFX)\n         * @param payload payload\n         * @param configuration configuration\n         */\n        Pulse0x48Parser.prototype.getBase = function (frameIndex, byteLength) {\n            if ((byteLength === 31) || (byteLength === 51)) {\n                return [1, 11][frameIndex];\n            }\n            else if ((frameIndex === 2 && byteLength === 7) || (frameIndex === 12 && byteLength === 7)) {\n                return 23;\n            }\n            else if (frameIndex === 3 && byteLength === 7) {\n                return 5;\n            }\n            else if (byteLength === 11) {\n                return [1, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23][frameIndex];\n            }\n            else {\n                // Unknown\n                return 0;\n            }\n        };\n        return Pulse0x48Parser;\n    }());\n    codec.Pulse0x48Parser = Pulse0x48Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse status byte parser\n     */\n    var PulseStatusByteParser = /** @class */ (function () {\n        function PulseStatusByteParser() {\n            this.deviceType = 'pulse';\n            this.frameCode = 0;\n        }\n        PulseStatusByteParser.prototype.parseFrame = function (payload, configuration) {\n            var statusContent = {};\n            var parser = new codec.GenericStatusByteParser();\n            statusContent = parser.parseFrame(payload, configuration);\n            return { 'status': statusContent };\n        };\n        return PulseStatusByteParser;\n    }());\n    codec.PulseStatusByteParser = PulseStatusByteParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 3 0x10 (configuration) frame parser\n     */\n    var PulseV30x10Parser = /** @class */ (function () {\n        function PulseV30x10Parser() {\n            this.deviceType = 'pulse3';\n            this.frameCode = 0x10;\n        }\n        PulseV30x10Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x10 Pulse 3 configuration' };\n            var chA = { 'name': 'channel A' };\n            var chB = { 'name': 'channel B' };\n            // Product mode\n            appContent['productMode'] = codec.PlateformCommonUtils.getProductModeText(payload[2]);\n            // Resolve known network\n            var knownNetwork = this.inferNetwork(payload.byteLength);\n            // Transmission period\n            appContent['numberOfHistorizationBeforeSending'] = payload.readUInt16BE(3);\n            appContent['samplingPeriod'] = { 'unit': 's', 'value': payload.readUInt16BE(6) * 2 };\n            appContent['calculatedSendingPeriod'] = { 'unit': 's',\n                'value': payload.readUInt16BE(3) * payload.readUInt16BE(6) * 2 };\n            // Flow calculation period\n            if (payload[2] === 2) {\n                // TEST mode => period = value * 20sec\n                appContent['flowCalculationPeriod'] = { 'unit': 's', 'value': payload.readUInt16BE(9) * 20 };\n            }\n            else {\n                // PRODUCTION mode => period = value * 1min\n                appContent['flowCalculationPeriod'] = { 'unit': 'm', 'value': payload.readUInt16BE(9) };\n            }\n            if (knownNetwork === 'lora868') {\n                appContent['redundantSamples'] = payload.readUInt8(27);\n            }\n            // Channels A configuration\n            chA['state'] = this.getStateText(Boolean(payload[5] & 0x01));\n            chA['type'] = this.getTypeText(Boolean(payload[5] & 0x02));\n            chA['debouncingPeriod'] = {\n                'unit': 'ms', 'value': this.getDebouncingPeriodText(payload[8] & 0x0f)\n            };\n            if (knownNetwork === 'lora868') {\n                chA['leakageDetection'] = {\n                    'overflowAlarmTriggerThreshold': payload.readUInt16BE(11),\n                    'threshold': payload.readUInt16BE(15),\n                    'dailyPeriodsBelowWhichLeakageAlarmTriggered': payload.readUInt16BE(19)\n                };\n                chA['tamper'] = {\n                    'activated': Boolean(payload[5] & 0x08),\n                    'samplePeriodForDetection': { 'unit': 's', 'value': payload.readUInt8(23) * 10 },\n                    'threshold': payload.readUInt8(24)\n                };\n            }\n            else if (knownNetwork === 'sigfox') {\n                chA['tamper'] = { 'activated': Boolean(payload[5] & 0x08) };\n            }\n            // Channel B configuration\n            chB['state'] = this.getStateText(Boolean(payload[5] & 0x10));\n            chB['type'] = this.getTypeText(Boolean(payload[5] & 0x20));\n            chB['debouncingPeriod'] = {\n                'unit': 'ms', 'value': this.getDebouncingPeriodText((payload[8] & 0xf0) >> 4)\n            };\n            if (knownNetwork === 'lora868') {\n                chB['leakageDetection'] = {\n                    'overflowAlarmTriggerThreshold': payload.readUInt16BE(13),\n                    'threshold': payload.readUInt16BE(17),\n                    'dailyPeriodsBelowWhichLeakageAlarmTriggered': payload.readUInt16BE(21)\n                };\n                chB['tamper'] = {\n                    'activated': Boolean(payload[5] & 0x80),\n                    'samplePeriodForDetection': { 'unit': 's', 'value': payload.readUInt8(25) * 10 },\n                    'threshold': payload.readUInt8(26)\n                };\n            }\n            else if (knownNetwork === 'sigfox') {\n                chB['tamper'] = { 'activated': Boolean(payload[5] & 0x80) };\n            }\n            appContent['channels'] = [chA, chB];\n            return appContent;\n        };\n        /**\n         * Infer network\n         * @param length frame length\n         */\n        PulseV30x10Parser.prototype.inferNetwork = function (length) {\n            //            +--------------+\n            //            | Frame length |\n            // +----------+--------------+\n            // | LoRa 868 |           22 |\n            // | Sigfox   |            9 |\n            // +----------+--------------+\n            switch (length) {\n                case 28:\n                    return 'lora868';\n                case 11:\n                    return 'sigfox';\n                default:\n                    return 'unknown';\n            }\n        };\n        /**\n         * Get state text\n         * @param value value\n         */\n        PulseV30x10Parser.prototype.getStateText = function (value) {\n            return value ? 'enabled' : 'disabled';\n        };\n        /**\n         * Get type text\n         * @param value value\n         */\n        PulseV30x10Parser.prototype.getTypeText = function (value) {\n            return value ? 'gasPullUpOn' : 'otherPullUpOff';\n        };\n        /**\n         * Get debouncing period text\n         * @param value value\n         */\n        PulseV30x10Parser.prototype.getDebouncingPeriodText = function (value) {\n            switch (value) {\n                case 0:\n                    return 0;\n                case 1:\n                    return 1;\n                case 2:\n                    return 10;\n                case 3:\n                    return 20;\n                case 4:\n                    return 50;\n                case 5:\n                    return 100;\n                case 6:\n                    return 200;\n                case 7:\n                    return 500;\n                case 8:\n                    return 1000;\n                case 9:\n                    return 2000;\n                case 10:\n                    return 5000;\n                case 11:\n                    return 10000;\n                default:\n                    return 0;\n            }\n        };\n        return PulseV30x10Parser;\n    }());\n    codec.PulseV30x10Parser = PulseV30x10Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 0x11 (configuration) frame parser\n     */\n    var PulseV30x11Parser = /** @class */ (function () {\n        function PulseV30x11Parser() {\n            this.deviceType = 'pulse3';\n            this.frameCode = 0x11;\n        }\n        PulseV30x11Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x11 Pulse 3 configuration' };\n            var chA = { 'name': 'channel A' };\n            var chB = { 'name': 'channel B' };\n            chA['leakageDetection'] = {\n                'overflowAlarmTriggerThreshold': payload.readUInt16BE(2),\n                'threshold': payload.readUInt16BE(6)\n            };\n            chB['leakageDetection'] = {\n                'overflowAlarmTriggerThreshold': payload.readUInt16BE(4),\n                'threshold': payload.readUInt16BE(8)\n            };\n            appContent['channels'] = [chA, chB];\n            return appContent;\n        };\n        return PulseV30x11Parser;\n    }());\n    codec.PulseV30x11Parser = PulseV30x11Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 3 0x12 (configuration) frame parser\n     */\n    var PulseV30x12Parser = /** @class */ (function () {\n        function PulseV30x12Parser() {\n            this.deviceType = 'pulse3';\n            this.frameCode = 0x12;\n        }\n        PulseV30x12Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x12 Pulse 3 configuration' };\n            var chA = { 'name': 'channel A' };\n            var chB = { 'name': 'channel B' };\n            chA['leakageDetection'] = {\n                'dailyPeriodsBelowWhichLeakageAlarmTriggered': payload.readUInt16BE(2),\n            };\n            chA['tamper'] = {\n                'samplePeriodForDetection': { 'unit': 's', 'value': payload.readUInt8(6) * 10 },\n                'threshold': payload.readUInt8(7)\n            };\n            chB['leakageDetection'] = {\n                'dailyPeriodsBelowWhichLeakageAlarmTriggered': payload.readUInt16BE(4),\n            };\n            chB['tamper'] = {\n                'samplePeriodForDetection': { 'unit': 's', 'value': payload.readUInt8(8) * 10 },\n                'threshold': payload.readUInt8(9)\n            };\n            appContent['channels'] = [chA, chB];\n            return appContent;\n        };\n        return PulseV30x12Parser;\n    }());\n    codec.PulseV30x12Parser = PulseV30x12Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 3 0x30 (keep alive) frame parser\n     */\n    var PulseV30x30Parser = /** @class */ (function () {\n        function PulseV30x30Parser() {\n            this.deviceType = 'pulse3';\n            this.frameCode = 0x30;\n        }\n        PulseV30x30Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x30 Pulse 3 keep alive' };\n            var chA = { 'name': 'channel A' };\n            var chB = { 'name': 'channel B' };\n            chA['flow'] = {\n                'alarm': Boolean(payload[2] & 0x01),\n                'last24hMin': payload.readUInt16BE(7),\n                'last24hMax': payload.readUInt16BE(3)\n            };\n            chA['tamperAlarm'] = Boolean(payload[2] & 0x04);\n            chA['leakageAlarm'] = Boolean(payload[2] & 0x10);\n            chB['flow'] = {\n                'alarm': Boolean(payload[2] & 0x02),\n                'last24hMin': payload.readUInt16BE(9),\n                'last24hMax': payload.readUInt16BE(5)\n            };\n            chB['tamperAlarm'] = Boolean(payload[2] & 0x08);\n            chB['leakageAlarm'] = Boolean(payload[2] & 0x20);\n            appContent['channels'] = [chA, chB];\n            return appContent;\n        };\n        return PulseV30x30Parser;\n    }());\n    codec.PulseV30x30Parser = PulseV30x30Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 3 0x46 (data) frame parser\n     */\n    var PulseV30x46Parser = /** @class */ (function () {\n        function PulseV30x46Parser() {\n            this.deviceType = 'pulse3';\n            this.frameCode = 0x46;\n        }\n        PulseV30x46Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x46 Pulse 3 data' };\n            appContent['decodingInfo'] = 'counterValues: [Channel A, Channel B]';\n            // Current indexes [Channel A, Channel B]\n            appContent['counterValues'] = [payload.readUInt32BE(2), payload.readUInt32BE(6)];\n            return appContent;\n        };\n        return PulseV30x46Parser;\n    }());\n    codec.PulseV30x46Parser = PulseV30x46Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 3 0x47 (alarm) frame parser\n     */\n    var PulseV30x47Parser = /** @class */ (function () {\n        function PulseV30x47Parser() {\n            this.deviceType = 'pulse3';\n            this.frameCode = 0x47;\n        }\n        PulseV30x47Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x47 Pulse 3 alarm' };\n            appContent['decodingInfo'] = 'flowValues: [Channel A, Channel B]';\n            // Flows when overflow occured [Channel A, Channel B]\n            appContent['flowValues'] = [payload.readUInt16BE(2), payload.readUInt16BE(4)];\n            return appContent;\n        };\n        return PulseV30x47Parser;\n    }());\n    codec.PulseV30x47Parser = PulseV30x47Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 3 periodic data  frame parser\n     */\n    var PulseV30x5aParser = /** @class */ (function () {\n        function PulseV30x5aParser() {\n            this.deviceType = 'pulse3';\n            this.frameCode = 0x5a;\n        }\n        PulseV30x5aParser.prototype.parseFrame = function (payload, configuration, network) {\n            var absCounterValue = payload.readUInt32BE(2);\n            var appContent = { type: '0x5a Pulse 3 data - channel A' };\n            var values = [absCounterValue];\n            // Loop through historic data [t=0, t-1, t-2,...]\n            for (var offset = 6; offset < payload.byteLength; offset += 2) {\n                absCounterValue -= payload.readUInt16BE(offset);\n                values.push(absCounterValue);\n            }\n            appContent['decodingInfo'] = 'counterValues: [t=0, t-1, t-2, ...]';\n            appContent['counterValues'] = values;\n            return appContent;\n        };\n        /**\n         * Get reading frequency\n         * @param configuration configuration\n         */\n        PulseV30x5aParser.prototype.getReadingFrequency = function (configuration) {\n            return configuration.byteLength > 0 ? configuration.readUInt16BE(8) * configuration.readUInt16BE(6) * 2 : null;\n        };\n        return PulseV30x5aParser;\n    }());\n    codec.PulseV30x5aParser = PulseV30x5aParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 3 periodic data frame parser\n     */\n    var PulseV30x5bParser = /** @class */ (function () {\n        function PulseV30x5bParser() {\n            this.deviceType = 'pulse3';\n            this.frameCode = 0x5b;\n        }\n        PulseV30x5bParser.prototype.parseFrame = function (payload, configuration, network) {\n            var absCounterValue = payload.readUInt32BE(2);\n            var appContent = { type: '0x5b Pulse 3 data - channel B' };\n            var values = [absCounterValue];\n            // Loop through historic data [t=0, t-1, t-2,...]\n            for (var offset = 6; offset < payload.byteLength; offset += 2) {\n                absCounterValue -= payload.readUInt16BE(offset);\n                values.push(absCounterValue);\n            }\n            appContent['decodingInfo'] = 'counterValues: [t=0, t-1, t-2, ...]';\n            appContent['counterValues'] = values;\n            return appContent;\n        };\n        /**\n         * Get reading frequency\n         * @param configuration configuration\n         */\n        PulseV30x5bParser.prototype.getReadingFrequency = function (configuration) {\n            return configuration.byteLength > 0 ? configuration.readUInt16BE(8) * configuration.readUInt16BE(6) * 2 : null;\n        };\n        return PulseV30x5bParser;\n    }());\n    codec.PulseV30x5bParser = PulseV30x5bParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 4 0x10 (configuration) frame parser\n     */\n    var PulseV40x10Parser = /** @class */ (function () {\n        function PulseV40x10Parser() {\n            this.deviceType = 'pulse4';\n            this.frameCode = 0x10;\n        }\n        PulseV40x10Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x10 Pulse 4 configuration' };\n            var chA = { 'name': 'channel A' };\n            var chB = { 'name': 'channel B' };\n            // Product mode\n            appContent['productMode'] = codec.PlateformCommonUtils.getProductModeText(payload[2]);\n            // Resolve known network\n            var knownNetwork = this.inferNetwork(payload.byteLength);\n            // Transmission period\n            appContent['numberOfHistorizationBeforeSending'] = payload.readUInt16BE(3);\n            appContent['samplingPeriod'] = { 'unit': 's', 'value': payload.readUInt16BE(6) * 2 };\n            appContent['calculatedSendingPeriod'] = { 'unit': 's',\n                'value': payload.readUInt16BE(3) * payload.readUInt16BE(6) * 2 };\n            // Flow calculation period\n            if (payload[2] === 2) {\n                // TEST mode => period = value * 20sec\n                appContent['flowCalculationPeriod'] = { 'unit': 's', 'value': payload.readUInt16BE(9) * 20 };\n            }\n            else {\n                // PRODUCTION mode => period = value * 1min\n                appContent['flowCalculationPeriod'] = { 'unit': 'm', 'value': payload.readUInt16BE(9) };\n            }\n            if (knownNetwork === 'lora868') {\n                appContent['redundantSamples'] = payload.readUInt8(27);\n            }\n            // Channels A configuration\n            chA['state'] = this.getStateText(Boolean(payload[5] & 0x01));\n            chA['type'] = this.getTypeText(Boolean(payload[5] & 0x02));\n            chA['debouncingPeriod'] = {\n                'unit': 'ms', 'value': this.getDebouncingPeriodText(payload[8] & 0x0f)\n            };\n            if (knownNetwork === 'lora868') {\n                chA['leakageDetection'] = {\n                    'overflowAlarmTriggerThreshold': payload.readUInt16BE(11),\n                    'threshold': payload.readUInt16BE(15),\n                    'dailyPeriodsBelowWhichLeakageAlarmTriggered': payload.readUInt16BE(19)\n                };\n                chA['tamper'] = {\n                    'activated': Boolean(payload[5] & 0x08),\n                    'samplePeriodForDetection': { 'unit': 's', 'value': payload.readUInt8(23) * 10 },\n                    'threshold': payload.readUInt8(24)\n                };\n            }\n            else if (knownNetwork === 'sigfox') {\n                chA['tamper'] = { 'activated': Boolean(payload[5] & 0x08) };\n            }\n            // Channel B configuration\n            chB['state'] = this.getStateText(Boolean(payload[5] & 0x10));\n            chB['type'] = this.getTypeText(Boolean(payload[5] & 0x20));\n            chB['debouncingPeriod'] = {\n                'unit': 'ms', 'value': this.getDebouncingPeriodText((payload[8] & 0xf0) >> 4)\n            };\n            if (knownNetwork === 'lora868') {\n                chB['leakageDetection'] = {\n                    'overflowAlarmTriggerThreshold': payload.readUInt16BE(13),\n                    'threshold': payload.readUInt16BE(17),\n                    'dailyPeriodsBelowWhichLeakageAlarmTriggered': payload.readUInt16BE(21)\n                };\n                chB['tamper'] = {\n                    'activated': Boolean(payload[5] & 0x80),\n                    'samplePeriodForDetection': { 'unit': 's', 'value': payload.readUInt8(25) * 10 },\n                    'threshold': payload.readUInt8(26)\n                };\n            }\n            else if (knownNetwork === 'sigfox') {\n                chB['tamper'] = { 'activated': Boolean(payload[5] & 0x80) };\n            }\n            appContent['channels'] = [chA, chB];\n            return appContent;\n        };\n        /**\n         * Infer network\n         * @param length frame length\n         */\n        PulseV40x10Parser.prototype.inferNetwork = function (length) {\n            //            +--------------+\n            //            | Frame length |\n            // +----------+--------------+\n            // | LoRa 868 |           22 |\n            // | Sigfox   |            9 |\n            // +----------+--------------+\n            switch (length) {\n                case 28:\n                    return 'lora868';\n                case 11:\n                    return 'sigfox';\n                default:\n                    return 'unknown';\n            }\n        };\n        /**\n         * Get state text\n         * @param value value\n         */\n        PulseV40x10Parser.prototype.getStateText = function (value) {\n            return value ? 'enabled' : 'disabled';\n        };\n        /**\n         * Get type text\n         * @param value value\n         */\n        PulseV40x10Parser.prototype.getTypeText = function (value) {\n            return value ? 'gasPullUpOn' : 'otherPullUpOff';\n        };\n        /**\n         * Get debouncing period text\n         * @param value value\n         */\n        PulseV40x10Parser.prototype.getDebouncingPeriodText = function (value) {\n            switch (value) {\n                case 0:\n                    return 0;\n                case 1:\n                    return 1;\n                case 2:\n                    return 10;\n                case 3:\n                    return 20;\n                case 4:\n                    return 50;\n                case 5:\n                    return 100;\n                case 6:\n                    return 200;\n                case 7:\n                    return 500;\n                case 8:\n                    return 1000;\n                case 9:\n                    return 2000;\n                case 10:\n                    return 5000;\n                case 11:\n                    return 10000;\n                default:\n                    return 0;\n            }\n        };\n        return PulseV40x10Parser;\n    }());\n    codec.PulseV40x10Parser = PulseV40x10Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 0x11 (configuration) frame parser\n     */\n    var PulseV40x11Parser = /** @class */ (function () {\n        function PulseV40x11Parser() {\n            this.deviceType = 'pulse4';\n            this.frameCode = 0x11;\n        }\n        PulseV40x11Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x11 Pulse 4 configuration' };\n            var chA = { 'name': 'channel A' };\n            var chB = { 'name': 'channel B' };\n            chA['leakageDetection'] = {\n                'overflowAlarmTriggerThreshold': payload.readUInt16BE(2),\n                'threshold': payload.readUInt16BE(6)\n            };\n            chB['leakageDetection'] = {\n                'overflowAlarmTriggerThreshold': payload.readUInt16BE(4),\n                'threshold': payload.readUInt16BE(8)\n            };\n            appContent['channels'] = [chA, chB];\n            return appContent;\n        };\n        return PulseV40x11Parser;\n    }());\n    codec.PulseV40x11Parser = PulseV40x11Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 4 0x12 (configuration) frame parser\n     */\n    var PulseV40x12Parser = /** @class */ (function () {\n        function PulseV40x12Parser() {\n            this.deviceType = 'pulse4';\n            this.frameCode = 0x12;\n        }\n        PulseV40x12Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x12 Pulse 4 configuration' };\n            var chA = { 'name': 'channel A' };\n            var chB = { 'name': 'channel B' };\n            chA['leakageDetection'] = {\n                'dailyPeriodsBelowWhichLeakageAlarmTriggered': payload.readUInt16BE(2),\n            };\n            chA['tamper'] = {\n                'samplePeriodForDetection': { 'unit': 's', 'value': payload.readUInt8(6) * 10 },\n                'threshold': payload.readUInt8(7)\n            };\n            chB['leakageDetection'] = {\n                'dailyPeriodsBelowWhichLeakageAlarmTriggered': payload.readUInt16BE(4),\n            };\n            chB['tamper'] = {\n                'samplePeriodForDetection': { 'unit': 's', 'value': payload.readUInt8(8) * 10 },\n                'threshold': payload.readUInt8(9)\n            };\n            appContent['channels'] = [chA, chB];\n            return appContent;\n        };\n        return PulseV40x12Parser;\n    }());\n    codec.PulseV40x12Parser = PulseV40x12Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 4 0x30 (keep alive) frame parser\n     */\n    var PulseV40x30Parser = /** @class */ (function () {\n        function PulseV40x30Parser() {\n            this.deviceType = 'pulse4';\n            this.frameCode = 0x30;\n        }\n        PulseV40x30Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x30 Pulse 4 keep alive' };\n            if (payload[1] & 0x04) {\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(11) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            var chA = { 'name': 'channel A' };\n            var chB = { 'name': 'channel B' };\n            chA['flow'] = {\n                'alarm': Boolean(payload[2] & 0x01),\n                'last24hMin': payload.readUInt16BE(7),\n                'last24hMax': payload.readUInt16BE(3)\n            };\n            chA['tamperAlarm'] = Boolean(payload[2] & 0x04);\n            chA['leakageAlarm'] = Boolean(payload[2] & 0x10);\n            chB['flow'] = {\n                'alarm': Boolean(payload[2] & 0x02),\n                'last24hMin': payload.readUInt16BE(9),\n                'last24hMax': payload.readUInt16BE(5)\n            };\n            chB['tamperAlarm'] = Boolean(payload[2] & 0x08);\n            chB['leakageAlarm'] = Boolean(payload[2] & 0x20);\n            appContent['channels'] = [chA, chB];\n            return appContent;\n        };\n        return PulseV40x30Parser;\n    }());\n    codec.PulseV40x30Parser = PulseV40x30Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 4 0x46 (data) frame parser\n     */\n    var PulseV40x46Parser = /** @class */ (function () {\n        function PulseV40x46Parser() {\n            this.deviceType = 'pulse4';\n            this.frameCode = 0x46;\n        }\n        PulseV40x46Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x46 Pulse 4 data' };\n            if (payload[1] & 0x04) {\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(10) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            appContent['decodingInfo'] = 'counterValues: [Channel A, Channel B]';\n            // Current indexes [Channel A, Channel B]\n            appContent['counterValues'] = [payload.readUInt32BE(2), payload.readUInt32BE(6)];\n            return appContent;\n        };\n        return PulseV40x46Parser;\n    }());\n    codec.PulseV40x46Parser = PulseV40x46Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 4 0x47 (alarm) frame parser\n     */\n    var PulseV40x47Parser = /** @class */ (function () {\n        function PulseV40x47Parser() {\n            this.deviceType = 'pulse4';\n            this.frameCode = 0x47;\n        }\n        PulseV40x47Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x47 Pulse 4 alarm' };\n            if (payload[1] & 0x04) {\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(6) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            appContent['decodingInfo'] = 'flowValues: [Channel A, Channel B]';\n            // Flows when overflow occured [Channel A, Channel B]\n            appContent['flowValues'] = [payload.readUInt16BE(2), payload.readUInt16BE(4)];\n            return appContent;\n        };\n        return PulseV40x47Parser;\n    }());\n    codec.PulseV40x47Parser = PulseV40x47Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 4 periodic data  frame parser\n     */\n    var PulseV40x5aParser = /** @class */ (function () {\n        function PulseV40x5aParser() {\n            this.deviceType = 'pulse4';\n            this.frameCode = 0x5a;\n        }\n        PulseV40x5aParser.prototype.parseFrame = function (payload, configuration, network) {\n            var absCounterValue = payload.readUInt32BE(2);\n            var appContent = { type: '0x5a Pulse 4 data - channel A' };\n            var values = [absCounterValue];\n            var payloadLength = (payload[1] & 0x04) ? payload.byteLength - 4 : payload.byteLength;\n            if (payload[1] & 0x04) {\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(payload.byteLength - 4) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            // Loop through historic data [t=0, t-1, t-2,...]\n            for (var offset = 6; offset < payloadLength; offset += 2) {\n                absCounterValue -= payload.readUInt16BE(offset);\n                values.push(absCounterValue);\n            }\n            appContent['decodingInfo'] = 'counterValues: [t=0, t-1, t-2, ...]';\n            appContent['counterValues'] = values;\n            return appContent;\n        };\n        /**\n         * Get reading frequency\n         * @param configuration configuration\n         */\n        PulseV40x5aParser.prototype.getReadingFrequency = function (configuration) {\n            return configuration.byteLength > 0 ? configuration.readUInt16BE(8) * configuration.readUInt16BE(6) * 2 : null;\n        };\n        return PulseV40x5aParser;\n    }());\n    codec.PulseV40x5aParser = PulseV40x5aParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 4 periodic data frame parser\n     */\n    var PulseV40x5bParser = /** @class */ (function () {\n        function PulseV40x5bParser() {\n            this.deviceType = 'pulse4';\n            this.frameCode = 0x5b;\n        }\n        PulseV40x5bParser.prototype.parseFrame = function (payload, configuration, network) {\n            var absCounterValue = payload.readUInt32BE(2);\n            var appContent = { type: '0x5b Pulse 4 data - channel B' };\n            var values = [absCounterValue];\n            var payloadLength = (payload[1] & 0x04) ? payload.byteLength - 4 : payload.byteLength;\n            if (payload[1] & 0x04) {\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(payload.byteLength - 4) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            // Loop through historic data [t=0, t-1, t-2,...]\n            for (var offset = 6; offset < payloadLength; offset += 2) {\n                absCounterValue -= payload.readUInt16BE(offset);\n                values.push(absCounterValue);\n            }\n            appContent['decodingInfo'] = 'counterValues: [t=0, t-1, t-2, ...]';\n            appContent['counterValues'] = values;\n            return appContent;\n        };\n        /**\n         * Get reading frequency\n         * @param configuration configuration\n         */\n        PulseV40x5bParser.prototype.getReadingFrequency = function (configuration) {\n            return configuration.byteLength > 0 ? configuration.readUInt16BE(8) * configuration.readUInt16BE(6) * 2 : null;\n        };\n        return PulseV40x5bParser;\n    }());\n    codec.PulseV40x5bParser = PulseV40x5bParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse V4 status byte parser\n     */\n    var PulseV4StatusByteParser = /** @class */ (function () {\n        function PulseV4StatusByteParser() {\n            this.deviceType = 'pulse4';\n            this.frameCode = 0;\n        }\n        PulseV4StatusByteParser.prototype.parseFrame = function (payload, configuration, network) {\n            var statusContent = {};\n            var parser = new codec.GenericStatusByteParser();\n            statusContent = parser.parseFrame(payload, configuration);\n            // Status byte, applicative flags\n            statusContent['timestamp'] = Boolean(payload[1] & 0x04);\n            return { 'status': statusContent };\n        };\n        return PulseV4StatusByteParser;\n    }());\n    codec.PulseV4StatusByteParser = PulseV4StatusByteParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 4 0x10 (configuration) frame parser\n     */\n    var PulseV4NbIot0x10Parser = /** @class */ (function () {\n        function PulseV4NbIot0x10Parser() {\n            this.deviceType = 'pulse4nbiot';\n            this.frameCode = 0x10;\n            // Offset to add in order to jump NB-Iot additional header\n            this.hOffset = 13;\n        }\n        PulseV4NbIot0x10Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x10 Pulse 4 NB-IoT configuration' };\n            var chA = { 'name': 'channel A' };\n            var chB = { 'name': 'channel B' };\n            // Product mode\n            appContent['productMode'] = codec.PlateformCommonUtils.getProductModeText(payload[this.hOffset + 2]);\n            // Transmission period\n            appContent['numberOfHistorizationBeforeSending'] = payload.readUInt16BE(this.hOffset + 3);\n            appContent['samplingPeriod'] = { 'unit': 's', 'value': payload.readUInt16BE(this.hOffset + 6) * 2 };\n            appContent['calculatedSendingPeriod'] = {\n                'unit': 's',\n                'value': payload.readUInt16BE(this.hOffset + 3) * payload.readUInt16BE(this.hOffset + 6) * 2\n            };\n            // Flow calculation period\n            if (payload[this.hOffset + 2] === 2) {\n                // TEST mode => period = value * 20sec\n                appContent['flowCalculationPeriod'] = { 'unit': 's', 'value': payload.readUInt16BE(this.hOffset + 9) * 20 };\n            }\n            else {\n                // PRODUCTION mode => period = value * 1min\n                appContent['flowCalculationPeriod'] = { 'unit': 'm', 'value': payload.readUInt16BE(this.hOffset + 9) };\n            }\n            appContent['redundantSamples'] = payload.readUInt8(this.hOffset + 27);\n            // Channels A configuration\n            chA['state'] = this.getStateText(Boolean(payload[this.hOffset + 5] & 0x01));\n            chA['type'] = this.getTypeText(Boolean(payload[this.hOffset + 5] & 0x02));\n            chA['debouncingPeriod'] = {\n                'unit': 'ms', 'value': this.getDebouncingPeriodText(payload[this.hOffset + 8] & 0x0f)\n            };\n            chA['leakageDetection'] = {\n                'overflowAlarmTriggerThreshold': payload.readUInt16BE(this.hOffset + 11),\n                'threshold': payload.readUInt16BE(this.hOffset + 15),\n                'dailyPeriodsBelowWhichLeakageAlarmTriggered': payload.readUInt16BE(this.hOffset + 19)\n            };\n            chA['tamper'] = {\n                'activated': Boolean(payload[this.hOffset + 5] & 0x08),\n                'samplePeriodForDetection': { 'unit': 's', 'value': payload.readUInt8(this.hOffset + 23) * 10 },\n                'threshold': payload.readUInt8(this.hOffset + 24)\n            };\n            // Channel B configuration\n            chB['state'] = this.getStateText(Boolean(payload[this.hOffset + 5] & 0x10));\n            chB['type'] = this.getTypeText(Boolean(payload[this.hOffset + 5] & 0x20));\n            chB['debouncingPeriod'] = {\n                'unit': 'ms', 'value': this.getDebouncingPeriodText((payload[this.hOffset + 8] & 0xf0) >> 4)\n            };\n            chB['leakageDetection'] = {\n                'overflowAlarmTriggerThreshold': payload.readUInt16BE(this.hOffset + 13),\n                'threshold': payload.readUInt16BE(this.hOffset + 17),\n                'dailyPeriodsBelowWhichLeakageAlarmTriggered': payload.readUInt16BE(this.hOffset + 21)\n            };\n            chB['tamper'] = {\n                'activated': Boolean(payload[this.hOffset + 5] & 0x80),\n                'samplePeriodForDetection': { 'unit': 's', 'value': payload.readUInt8(this.hOffset + 25) * 10 },\n                'threshold': payload.readUInt8(this.hOffset + 26)\n            };\n            appContent['channels'] = [chA, chB];\n            return appContent;\n        };\n        /**\n         * Get state text\n         * @param value value\n         */\n        PulseV4NbIot0x10Parser.prototype.getStateText = function (value) {\n            return value ? 'enabled' : 'disabled';\n        };\n        /**\n         * Get type text\n         * @param value value\n         */\n        PulseV4NbIot0x10Parser.prototype.getTypeText = function (value) {\n            return value ? 'gasPullUpOn' : 'otherPullUpOff';\n        };\n        /**\n         * Get debouncing period text\n         * @param value value\n         */\n        PulseV4NbIot0x10Parser.prototype.getDebouncingPeriodText = function (value) {\n            switch (value) {\n                case 0:\n                    return 0;\n                case 1:\n                    return 1;\n                case 2:\n                    return 10;\n                case 3:\n                    return 20;\n                case 4:\n                    return 50;\n                case 5:\n                    return 100;\n                case 6:\n                    return 200;\n                case 7:\n                    return 500;\n                case 8:\n                    return 1000;\n                case 9:\n                    return 2000;\n                case 10:\n                    return 5000;\n                case 11:\n                    return 10000;\n                default:\n                    return 0;\n            }\n        };\n        return PulseV4NbIot0x10Parser;\n    }());\n    codec.PulseV4NbIot0x10Parser = PulseV4NbIot0x10Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Generic 0x20 (configuration) frame parser\n     */\n    var PulseV4NbIot0x20Parser = /** @class */ (function () {\n        function PulseV4NbIot0x20Parser() {\n            this.deviceType = 'pulse4nbiot';\n            this.frameCode = 0x20;\n            // Offset to add in order to jump NB-Iot additional header\n            this.hOffset = 13;\n        }\n        PulseV4NbIot0x20Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x20 Pulse 4 NB-IoT Configuration' };\n            appContent['remoteServerIpAddress'] = this.payloadToString(payload, this.hOffset + 2, this.hOffset + 2 + 30);\n            appContent['remoteServerPort'] = payload.readUInt16BE(this.hOffset + 33);\n            appContent['localPort'] = payload.readUInt16BE(this.hOffset + 35);\n            appContent['apn'] = this.payloadToString(payload, this.hOffset + 37, this.hOffset + 37 + 30);\n            return appContent;\n        };\n        PulseV4NbIot0x20Parser.prototype.payloadToString = function (payload, start, end) {\n            var charCode = [];\n            for (var i = start; i < end; i++) {\n                if (payload[i] !== 0x00) {\n                    charCode.push(payload[i]);\n                }\n            }\n            return String.fromCharCode.apply(String, charCode);\n        };\n        return PulseV4NbIot0x20Parser;\n    }());\n    codec.PulseV4NbIot0x20Parser = PulseV4NbIot0x20Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 4 0x30 (keep alive) frame parser\n     */\n    var PulseV4NbIot0x30Parser = /** @class */ (function () {\n        function PulseV4NbIot0x30Parser() {\n            this.deviceType = 'pulse4nbiot';\n            this.frameCode = 0x30;\n            // Offset to add in order to jump NB-Iot additional header\n            this.hOffset = 13;\n        }\n        PulseV4NbIot0x30Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x30 Pulse 4 NB-IoT keep alive' };\n            if (payload[this.hOffset + 1] & 0x04) {\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(this.hOffset + 11) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            var chA = { 'name': 'channel A' };\n            var chB = { 'name': 'channel B' };\n            chA['flow'] = {\n                'alarm': Boolean(payload[this.hOffset + 2] & 0x01),\n                'last24hMin': payload.readUInt16BE(this.hOffset + 7),\n                'last24hMax': payload.readUInt16BE(this.hOffset + 3)\n            };\n            chA['tamperAlarm'] = Boolean(payload[this.hOffset + 2] & 0x04);\n            chA['leakageAlarm'] = Boolean(payload[this.hOffset + 2] & 0x10);\n            chB['flow'] = {\n                'alarm': Boolean(payload[this.hOffset + 2] & 0x02),\n                'last24hMin': payload.readUInt16BE(this.hOffset + 9),\n                'last24hMax': payload.readUInt16BE(this.hOffset + 5)\n            };\n            chB['tamperAlarm'] = Boolean(payload[this.hOffset + 2] & 0x08);\n            chB['leakageAlarm'] = Boolean(payload[this.hOffset + 2] & 0x20);\n            appContent['channels'] = [chA, chB];\n            return appContent;\n        };\n        return PulseV4NbIot0x30Parser;\n    }());\n    codec.PulseV4NbIot0x30Parser = PulseV4NbIot0x30Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Generic 0x33 (Response to Set Register downlink) frame parser\n     */\n    var PulseV4NbIot0x33Parser = /** @class */ (function () {\n        function PulseV4NbIot0x33Parser() {\n            this.deviceType = 'pulse4nbiot';\n            this.frameCode = 0x33;\n            // Offset to add in order to jump NB-Iot additional header\n            this.hOffset = 13;\n        }\n        PulseV4NbIot0x33Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x33 Set register status' };\n            appContent['requestStatus'] = this.getRequestStatusText(payload[this.hOffset + 2]);\n            appContent['registerId'] = payload.readUInt16BE(this.hOffset + 3);\n            return appContent;\n        };\n        /**\n         * Get Type text\n         * @param value value\n         */\n        PulseV4NbIot0x33Parser.prototype.getRequestStatusText = function (value) {\n            switch (value) {\n                case 1:\n                    return 'success';\n                case 2:\n                    return 'successNoUpdate';\n                case 3:\n                    return 'errorCoherency';\n                case 4:\n                    return 'errorInvalidRegister';\n                case 5:\n                    return 'errorInvalidValue';\n                case 6:\n                    return 'errorTruncatedValue';\n                case 7:\n                    return 'errorAccesNotAllowed';\n                default:\n                    return 'errorOtherReason';\n            }\n        };\n        return PulseV4NbIot0x33Parser;\n    }());\n    codec.PulseV4NbIot0x33Parser = PulseV4NbIot0x33Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 4 0x46 (data) frame parser\n     */\n    var PulseV4NbIot0x46Parser = /** @class */ (function () {\n        function PulseV4NbIot0x46Parser() {\n            this.deviceType = 'pulse4nbiot';\n            this.frameCode = 0x46;\n            // Offset to add in order to jump NB-Iot additional header\n            this.hOffset = 13;\n        }\n        PulseV4NbIot0x46Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x46 Pulse 4 NB-IoT data' };\n            if (payload[this.hOffset + 1] & 0x04) {\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(this.hOffset + 10) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            appContent['decodingInfo'] = 'counterValues: [Channel A, Channel B]';\n            // Current indexes [Channel A, Channel B]\n            appContent['counterValues'] = [payload.readUInt32BE(this.hOffset + 2), payload.readUInt32BE(this.hOffset + 6)];\n            return appContent;\n        };\n        return PulseV4NbIot0x46Parser;\n    }());\n    codec.PulseV4NbIot0x46Parser = PulseV4NbIot0x46Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 4 0x47 (alarm) frame parser\n     */\n    var PulseV4NbIot0x47Parser = /** @class */ (function () {\n        function PulseV4NbIot0x47Parser() {\n            this.deviceType = 'pulse4nbiot';\n            this.frameCode = 0x47;\n            // Offset to add in order to jump NB-Iot additional header\n            this.hOffset = 13;\n        }\n        PulseV4NbIot0x47Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x47 Pulse 4 NB-IoT alarm' };\n            if (payload[this.hOffset + 1] & 0x04) {\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(this.hOffset + 6) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            appContent['decodingInfo'] = 'flowValues: [Channel A, Channel B]';\n            // Flows when overflow occured [Channel A, Channel B]\n            appContent['flowValues'] = [payload.readUInt16BE(this.hOffset + 2), payload.readUInt16BE(this.hOffset + 4)];\n            return appContent;\n        };\n        return PulseV4NbIot0x47Parser;\n    }());\n    codec.PulseV4NbIot0x47Parser = PulseV4NbIot0x47Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 4 periodic data  frame parser\n     */\n    var PulseV4NbIot0x5aParser = /** @class */ (function () {\n        function PulseV4NbIot0x5aParser() {\n            this.deviceType = 'pulse4nbiot';\n            this.frameCode = 0x5a;\n            // Offset to add in order to jump NB-Iot additional header\n            this.hOffset = 13;\n        }\n        PulseV4NbIot0x5aParser.prototype.parseFrame = function (payload, configuration, network) {\n            var absCounterValue = payload.readUInt32BE(this.hOffset + 2);\n            var appContent = { type: '0x5a Pulse 4 NB-IoT data - channel A' };\n            var values = [absCounterValue];\n            var payloadLength = (payload[this.hOffset + 1] & 0x04) ? payload.byteLength - 4 : payload.byteLength;\n            if (payload[this.hOffset + 1] & 0x04) {\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(payload.byteLength - 4) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            // Loop through historic data [t=0, t-1, t-2,...]\n            for (var offset = this.hOffset + 6; offset < payloadLength; offset += 2) {\n                absCounterValue -= payload.readUInt16BE(offset);\n                values.push(absCounterValue);\n            }\n            appContent['decodingInfo'] = 'counterValues: [t=0, t-1, t-2, ...]';\n            appContent['counterValues'] = values;\n            return appContent;\n        };\n        /**\n         * Get reading frequency\n         * @param configuration configuration\n         */\n        PulseV4NbIot0x5aParser.prototype.getReadingFrequency = function (configuration) {\n            return configuration.byteLength > 0 ? configuration.readUInt16BE(8) * configuration.readUInt16BE(6) * 2 : null;\n        };\n        return PulseV4NbIot0x5aParser;\n    }());\n    codec.PulseV4NbIot0x5aParser = PulseV4NbIot0x5aParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse 4 periodic data frame parser\n     */\n    var PulseV4NbIot0x5bParser = /** @class */ (function () {\n        function PulseV4NbIot0x5bParser() {\n            this.deviceType = 'pulse4nbiot';\n            this.frameCode = 0x5b;\n            // Offset to add in order to jump NB-Iot additional header\n            this.hOffset = 13;\n        }\n        PulseV4NbIot0x5bParser.prototype.parseFrame = function (payload, configuration, network) {\n            var absCounterValue = payload.readUInt32BE(this.hOffset + 2);\n            var appContent = { type: '0x5b Pulse 4 NB-IoT data - channel B' };\n            var values = [absCounterValue];\n            var payloadLength = (payload[this.hOffset + 1] & 0x04) ? payload.byteLength - 4 : payload.byteLength;\n            if (payload[this.hOffset + 1] & 0x04) {\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(payload.byteLength - 4) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            // Loop through historic data [t=0, t-1, t-2,...]\n            for (var offset = this.hOffset + 6; offset < payloadLength; offset += 2) {\n                absCounterValue -= payload.readUInt16BE(offset);\n                values.push(absCounterValue);\n            }\n            appContent['decodingInfo'] = 'counterValues: [t=0, t-1, t-2, ...]';\n            appContent['counterValues'] = values;\n            return appContent;\n        };\n        /**\n         * Get reading frequency\n         * @param configuration configuration\n         */\n        PulseV4NbIot0x5bParser.prototype.getReadingFrequency = function (configuration) {\n            return configuration.byteLength > 0 ? configuration.readUInt16BE(8) * configuration.readUInt16BE(6) * 2 : null;\n        };\n        return PulseV4NbIot0x5bParser;\n    }());\n    codec.PulseV4NbIot0x5bParser = PulseV4NbIot0x5bParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Pulse V4 status byte parser\n     */\n    var PulseV4NbIotStatusByteParser = /** @class */ (function () {\n        function PulseV4NbIotStatusByteParser() {\n            this.deviceType = 'pulse4nbiot';\n            this.frameCode = 0;\n            // Offset to add in order to jump NB-Iot additional header\n            this.hOffset = 13;\n        }\n        PulseV4NbIotStatusByteParser.prototype.parseFrame = function (payload, configuration, network) {\n            var headerContent = {};\n            var statusContent = {};\n            // Include in status byte parser also NB-IoT header (13 bytes length):\n            // 0-7\tIMEI\tInternational Mobile Equipment Identity (IMEI) of the product (15 digits in BCD format).\n            // 8\tRadio Signal quality\tValue from 0 to 5.\n            // 9-12\tFrame counter\tFrame counter since product reset.\n            headerContent['imei'] = payload.slice(0, 8).toString('hex');\n            headerContent['signalQuality'] = payload[8];\n            headerContent['globalFrameCounter'] = payload.readUInt32BE(9);\n            // Status byte, applicative flags\n            statusContent['frameCounter'] = (payload[this.hOffset + 1] & 0xe0) >> 5;\n            statusContent['lowBattery'] = Boolean(payload[this.hOffset + 1] & 0x02);\n            statusContent['configurationDone'] = Boolean(payload[this.hOffset + 1] & 0x01);\n            statusContent['timestamp'] = Boolean(payload[this.hOffset + 1] & 0x04);\n            return { 'nbIot': headerContent, 'status': statusContent };\n        };\n        return PulseV4NbIotStatusByteParser;\n    }());\n    codec.PulseV4NbIotStatusByteParser = PulseV4NbIotStatusByteParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    var Repeater0x01InputData = /** @class */ (function () {\n        function Repeater0x01InputData() {\n            // Accepted values are:\n            // 0 retour en mode PARK\n            // 1 retour en mode installation auto\n            // 2 retour en mode opération, WL vide, rafraichissement de la WL à chaque trame OoB\n            this.return_mode = 0;\n        }\n        return Repeater0x01InputData;\n    }());\n    codec.Repeater0x01InputData = Repeater0x01InputData;\n    /**\n     * Repeater 0x01 frame builder\n     */\n    var Repeater0x01Builder = /** @class */ (function () {\n        function Repeater0x01Builder() {\n            this.deviceType = 'repeater';\n            this.frameCode = 0x01;\n            this.inputDataClass = Repeater0x01InputData;\n        }\n        Repeater0x01Builder.prototype.buildFrame = function (inputData, network) {\n            var payload = Buffer.alloc(8);\n            payload[0] = this.frameCode;\n            payload.writeUInt8(inputData.return_mode, 1);\n            return payload;\n        };\n        return Repeater0x01Builder;\n    }());\n    codec.Repeater0x01Builder = Repeater0x01Builder;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Repeater 0x01 frame parser\n     */\n    var Repeater0x01Parser = /** @class */ (function () {\n        function Repeater0x01Parser() {\n            this.deviceType = 'repeater';\n            this.frameCode = 0x01;\n        }\n        Repeater0x01Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = __assign({ type: '0x01 Repeater WL add' }, this.getDataFromPayload(payload));\n            return appContent;\n        };\n        Repeater0x01Parser.prototype.getDataFromPayload = function (payload) {\n            var appContent = {};\n            codec.RepeaterHelper.getUPStatusFromPayload(payload, appContent);\n            return appContent;\n        };\n        return Repeater0x01Parser;\n    }());\n    codec.Repeater0x01Parser = Repeater0x01Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    var Repeater0x02InputData = /** @class */ (function () {\n        function Repeater0x02InputData() {\n            // wl_activation accepted values are 0x00 or 0x01\n            this.wl_activation = 0x00;\n            this.id = 0;\n        }\n        return Repeater0x02InputData;\n    }());\n    codec.Repeater0x02InputData = Repeater0x02InputData;\n    /**\n     * Repeater 0x02 frame builder\n     */\n    var Repeater0x02Builder = /** @class */ (function () {\n        function Repeater0x02Builder() {\n            this.deviceType = 'repeater';\n            this.frameCode = 0x02;\n            this.inputDataClass = Repeater0x02InputData;\n        }\n        Repeater0x02Builder.prototype.buildFrame = function (inputData, network) {\n            var payload = Buffer.alloc(8);\n            payload[0] = this.frameCode;\n            payload.writeUInt8(inputData.wl_activation, 1);\n            payload.writeUInt32BE(inputData.id, 1);\n            return payload;\n        };\n        return Repeater0x02Builder;\n    }());\n    codec.Repeater0x02Builder = Repeater0x02Builder;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Repeater 0x02 frame parser\n     */\n    var Repeater0x02Parser = /** @class */ (function () {\n        function Repeater0x02Parser() {\n            this.deviceType = 'repeater';\n            this.frameCode = 0x02;\n        }\n        Repeater0x02Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = __assign({ type: '0x02 Repeater WL modification' }, this.getDataFromPayload(payload));\n            return appContent;\n        };\n        Repeater0x02Parser.prototype.getDataFromPayload = function (payload) {\n            var appContent = {};\n            codec.RepeaterHelper.getUPStatusFromPayload(payload, appContent);\n            appContent['numberOfIdInWl'] = payload.readUInt8(2);\n            return appContent;\n        };\n        return Repeater0x02Parser;\n    }());\n    codec.Repeater0x02Parser = Repeater0x02Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    var Repeater0x03InputData = /** @class */ (function () {\n        function Repeater0x03InputData() {\n            // wl_validation accepted values are 0x00 or 0x01\n            this.wl_validation = 0x00;\n            this.id = 0;\n        }\n        return Repeater0x03InputData;\n    }());\n    codec.Repeater0x03InputData = Repeater0x03InputData;\n    /**\n     * Repeater 0x03 frame builder\n     */\n    var Repeater0x03Builder = /** @class */ (function () {\n        function Repeater0x03Builder() {\n            this.deviceType = 'repeater';\n            this.frameCode = 0x03;\n            this.inputDataClass = Repeater0x03InputData;\n        }\n        Repeater0x03Builder.prototype.buildFrame = function (inputData, network) {\n            var payload = Buffer.alloc(8);\n            payload[0] = this.frameCode;\n            payload.writeUInt8(inputData.wl_validation, 1);\n            payload.writeUInt32BE(inputData.id, 2);\n            return payload;\n        };\n        return Repeater0x03Builder;\n    }());\n    codec.Repeater0x03Builder = Repeater0x03Builder;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Repeater 0x02 frame parser\n     */\n    var Repeater0x03Parser = /** @class */ (function () {\n        function Repeater0x03Parser() {\n            this.deviceType = 'repeater';\n            this.frameCode = 0x03;\n        }\n        Repeater0x03Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = __assign({ type: '0x03 Repeater DL confirmation' }, this.getDataFromPayload(payload));\n            return appContent;\n        };\n        Repeater0x03Parser.prototype.getDataFromPayload = function (payload) {\n            var appContent = {};\n            codec.RepeaterHelper.getUPStatusFromPayload(payload, appContent);\n            appContent['downlinkCode'] = codec.RepeaterHelper.getDownlinkDescriptionForCode(payload.readUInt8(2));\n            appContent['downlinkErrorCode'] = codec.RepeaterHelper.getErrorDescriptionForCode(payload.readUInt8(3));\n            return appContent;\n        };\n        return Repeater0x03Parser;\n    }());\n    codec.Repeater0x03Parser = Repeater0x03Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    var Repeater0x04InputData = /** @class */ (function () {\n        function Repeater0x04InputData() {\n            this.S300 = 1; // 01- 31\n            this.S303 = 0; // 00 ou 02\n            this.S304 = 0; // 00/01/02\n            this.S306 = 0; // 00 ou 02\n        }\n        return Repeater0x04InputData;\n    }());\n    codec.Repeater0x04InputData = Repeater0x04InputData;\n    /**\n     * Repeater 0x04 frame builder\n     */\n    var Repeater0x04Builder = /** @class */ (function () {\n        function Repeater0x04Builder() {\n            this.deviceType = 'repeater';\n            this.frameCode = 0x04;\n            this.inputDataClass = Repeater0x04InputData;\n        }\n        Repeater0x04Builder.prototype.buildFrame = function (inputData, network) {\n            var payload = Buffer.alloc(8);\n            payload[0] = this.frameCode;\n            payload.writeUInt8(inputData.S300, 1);\n            payload.writeUInt8(inputData.S303, 2);\n            payload.writeUInt8(inputData.S304, 3);\n            payload.writeUInt8(inputData.S306, 4);\n            return payload;\n        };\n        Repeater0x04Builder.prototype.getFirstIds = function (ids) {\n            return ids.filter(function (id) { return id >= 8; });\n        };\n        Repeater0x04Builder.prototype.getLastIds = function (ids) {\n            return ids.filter(function (id) { return id < 8; });\n        };\n        Repeater0x04Builder.prototype.getByteFromIdsList = function (ids) {\n            var intArray = Buffer.alloc(8);\n            ids.forEach(function (id, idx) { return intArray[idx] = id; });\n            return intArray.readUInt8(0);\n        };\n        return Repeater0x04Builder;\n    }());\n    codec.Repeater0x04Builder = Repeater0x04Builder;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Repeater 0x04 frame parser\n     */\n    var Repeater0x04Parser = /** @class */ (function () {\n        function Repeater0x04Parser() {\n            this.deviceType = 'repeater';\n            this.frameCode = 0x04;\n        }\n        Repeater0x04Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = __assign({ type: '0x04 White List confirmation' }, this.getDataFromPayload(payload));\n            return appContent;\n        };\n        Repeater0x04Parser.prototype.getDataFromPayload = function (payload) {\n            var appContent = {};\n            codec.RepeaterHelper.getUPStatusFromPayload(payload, appContent);\n            appContent['numberOfIdInWl'] = payload.readUInt8(2);\n            return appContent;\n        };\n        return Repeater0x04Parser;\n    }());\n    codec.Repeater0x04Parser = Repeater0x04Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    var Repeater0x05InputData = /** @class */ (function () {\n        function Repeater0x05InputData() {\n        }\n        return Repeater0x05InputData;\n    }());\n    codec.Repeater0x05InputData = Repeater0x05InputData;\n    /**\n     * Repeater 0x05 frame builder\n     */\n    var Repeater0x05Builder = /** @class */ (function () {\n        function Repeater0x05Builder() {\n            this.deviceType = 'repeater';\n            this.frameCode = 0x05;\n            this.inputDataClass = Repeater0x05InputData;\n        }\n        Repeater0x05Builder.prototype.buildFrame = function (inputData, network) {\n            var payload = Buffer.alloc(8);\n            payload[0] = this.frameCode;\n            return payload;\n        };\n        return Repeater0x05Builder;\n    }());\n    codec.Repeater0x05Builder = Repeater0x05Builder;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    var errorCode = {\n        0x00: '0x00 The action has been correctly realized',\n        0x0A: '0x0A Uplink code is invalid',\n        0x0B: '0x0B Harware error, please contact adeunis support',\n        0x0C: '0x0C Callback error',\n        0x0D: '0x0D Generic error',\n        0x01: '0x01 White List already empty',\n        0x02: '0x02 White List not erased',\n        0x03: '0x03 White List is empty, repeater switch into OPERATION with “auto-record” mode',\n        0x04: '0x04 ID not found in the White List',\n        0x05: '0x05 White List is full, “add an ID” not possible',\n        0x06: '0x06 ID already existing in the White List',\n        0x07: '0x07 No ID repeated, repeater stay into OPERATION with “auto-record” mode',\n        0x08: '0x08 A White List is already existing, use “Suppress all IDs from White List” frame before',\n        0x11: '0x11 Error with S300 configuration',\n        0x12: '0x12 Error with S303 configuration',\n        0x13: '0x13 Error with S300, S303 configuration',\n        0x14: '0x14 Error with S304 configuration',\n        0x15: '0x15 Error with S300, S304 configuration',\n        0x16: '0x16 Error with S303, S304 configuration',\n        0x17: '0x17 Error with S300, S303, S304 configuration',\n        0x18: '0x18 Error with S306 configuration',\n        0x19: '0x19 Error with S300, S306 configuration',\n        0x1A: '0x1A Error with S303, S306 configuration',\n        0x1B: '0x1B Error with S300, S303, S306 configuration',\n        0x1C: '0x1C Error with S304, S306 configuration',\n        0x1D: '0x1D Error with S300, S304, S306 configuration',\n        0x1E: '0x1E Error with S303, S304, S306 configuration',\n        0x1F: '0x1F Error with S300, S303, S304, S306 configuration'\n    };\n    var dlCode = {\n        0x01: '0x01 Suppress all IDs from White List',\n        0x02: '0x02 Delete an ID from White List',\n        0x03: '0x03 Add an ID into White List',\n        0x05: '0x05 Freeze the list of devices repeated in auto-record mode into the White List',\n        0x04: '0x04 Modify Repeater configuration'\n    };\n    var RepeaterHelper = /** @class */ (function () {\n        function RepeaterHelper() {\n        }\n        RepeaterHelper.hex2bin = function (hex) {\n            return (parseInt(hex, 16).toString(2)).padStart(8, '0');\n        };\n        RepeaterHelper.getUPStatusFromPayload = function (payload, appContent) {\n            var byte = payload[1];\n            var charLb = 1;\n            if (/^\\d$/.test('' + byte)) {\n                // one digit\n                appContent['frameCounter'] = 0;\n                charLb = 0;\n            }\n            else {\n                appContent['frameCounter'] = parseInt(payload.readUInt8(1).toString(16).charAt(0), 16);\n            }\n            var hexLb = payload.readUInt8(1).toString(16);\n            var binLb = RepeaterHelper.hex2bin(hexLb);\n            var bitLb = binLb[binLb.length - 1];\n            appContent['lowBattery'] = (bitLb === '1') ? true : false;\n            return appContent;\n        };\n        RepeaterHelper.getDownlinkDescriptionForCode = function (code) {\n            return dlCode[code] || code;\n        };\n        RepeaterHelper.getErrorDescriptionForCode = function (code) {\n            return errorCode[code] || code;\n        };\n        return RepeaterHelper;\n    }());\n    codec.RepeaterHelper = RepeaterHelper;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Extended status byte parser\n     */\n    var RepeaterStatusByteParser = /** @class */ (function () {\n        function RepeaterStatusByteParser() {\n            this.deviceType = 'repeater';\n            this.frameCode = 0;\n        }\n        RepeaterStatusByteParser.prototype.parseFrame = function (payload, configuration) {\n            // Skip generic status byte parser\n            return {};\n        };\n        return RepeaterStatusByteParser;\n    }());\n    codec.RepeaterStatusByteParser = RepeaterStatusByteParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Temperature 0x10 (configuration) frame parser\n     */\n    var Temp0x10Parser = /** @class */ (function () {\n        function Temp0x10Parser() {\n            this.deviceType = 'temp';\n            this.frameCode = 0x10;\n        }\n        Temp0x10Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x10 Temperature configuration' };\n            var temp1 = { 'name': 'probe 1' };\n            var temp2 = { 'name': 'probe 2' };\n            if (payload[8] === 2) {\n                // TEST mode => period = value * 20sec\n                appContent['transmissionPeriodKeepAlive'] = { 'unit': 's', 'value': payload[2] * 20 };\n                appContent['transmissionPeriodData'] = { 'unit': 's', 'value': payload[3] * 20 };\n                appContent['samplingPeriod'] = { 'unit': 's', 'value': payload[10] * 10 };\n            }\n            else {\n                // PRODUCTION mode => period = value * 10min\n                appContent['transmissionPeriodKeepAlive'] = { 'unit': 'm', 'value': payload[2] * 10 };\n                appContent['transmissionPeriodData'] = { 'unit': 'm', 'value': payload[3] * 10 };\n                appContent['samplingPeriod'] = { 'unit': 'm', 'value': payload[10] };\n            }\n            // Internal sensor input states\n            temp1['id'] = (payload[4] & 0xf0) >> 4;\n            temp1['threshold'] = this.getThresholdTriggeringText(payload[5] & 0x03);\n            // Concerns only FW >= 1.3.8\n            temp1['state'] = (payload[9] & 0x01) ? 'activated' : 'deactivated';\n            // External sensor input states\n            temp2['id'] = (payload[6] & 0xf0) >> 4;\n            temp2['threshold'] = this.getThresholdTriggeringText(payload[7] & 0x03);\n            // Concerns only FW >= 1.3.8\n            temp2['state'] = (payload[9] & 0x02) ? 'activated' : 'deactivated';\n            appContent['probes'] = [temp1, temp2];\n            // Product mode\n            appContent['productMode'] = codec.PlateformCommonUtils.getProductModeText(payload[8]);\n            return appContent;\n        };\n        /**\n         * Get Threshold Triggering text\n         * @param value value\n         */\n        Temp0x10Parser.prototype.getThresholdTriggeringText = function (value) {\n            switch (value) {\n                case 0:\n                    return 'none';\n                case 1:\n                    return 'low';\n                case 2:\n                    return 'high';\n                case 3:\n                    return 'both';\n                default:\n                    return '';\n            }\n        };\n        return Temp0x10Parser;\n    }());\n    codec.Temp0x10Parser = Temp0x10Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Temperature 0x11 (configuration) frame parser\n     */\n    var Temp0x11Parser = /** @class */ (function () {\n        function Temp0x11Parser() {\n            this.deviceType = 'temp';\n            this.frameCode = 0x11;\n        }\n        Temp0x11Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x11 Temperature configuration' };\n            // Internal sensor high threshold configuration\n            appContent['threshold'] = {\n                'name': 'probe 1',\n                'unit': '\\u00B0' + 'C',\n                'high': {\n                    'value': payload.readInt16BE(2) / 10,\n                    'hysteresis': payload[4] / 10\n                },\n                'low': {\n                    'value': payload.readInt16BE(5) / 10,\n                    'hysteresis': payload[7] / 10\n                }\n            };\n            appContent['superSamplingFactor'] = payload[8];\n            return appContent;\n        };\n        return Temp0x11Parser;\n    }());\n    codec.Temp0x11Parser = Temp0x11Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Temperature 0x12 (configuration) frame parser\n     */\n    var Temp0x12Parser = /** @class */ (function () {\n        function Temp0x12Parser() {\n            this.deviceType = 'temp';\n            this.frameCode = 0x12;\n        }\n        Temp0x12Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x12 Temperature configuration' };\n            appContent['threshold'] = {\n                'name': 'probe 2',\n                'unit': '\\u00B0' + 'C',\n                'high': {\n                    'value': payload.readInt16BE(2) / 10,\n                    'hysteresis': payload[4] / 10\n                },\n                'low': {\n                    'value': payload.readInt16BE(5) / 10,\n                    'hysteresis': payload[7] / 10\n                }\n            };\n            return appContent;\n        };\n        return Temp0x12Parser;\n    }());\n    codec.Temp0x12Parser = Temp0x12Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Temperature 0x30 (keep alive) frame parser\n     */\n    var Temp0x30Parser = /** @class */ (function () {\n        function Temp0x30Parser() {\n            this.deviceType = 'temp';\n            this.frameCode = 0x30;\n            this.temp0x43Parser = new codec.Temp0x43Parser();\n        }\n        Temp0x30Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = this.temp0x43Parser.parseFrame(payload, configuration, network);\n            appContent['type'] = '0x30 Temperature keep alive';\n            return appContent;\n        };\n        return Temp0x30Parser;\n    }());\n    codec.Temp0x30Parser = Temp0x30Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Temperature 0x43 (data) frame parser\n     */\n    var Temp0x43Parser = /** @class */ (function () {\n        function Temp0x43Parser() {\n            this.deviceType = 'temp';\n            this.frameCode = 0x43;\n        }\n        Temp0x43Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x43 Temperature data' };\n            var temp1 = { 'name': 'probe 1' };\n            var temp2 = { 'name': 'probe 2' };\n            // Internal sensor input states\n            temp1['id'] = (payload[2] & 0xf0) >> 4;\n            temp1['unit'] = '\\u00B0' + 'C';\n            // value@-3276.8 must be considered as an invalid measure (probe disconnected for instance)\n            temp1['value'] = payload.readInt16BE(3) / 10;\n            // External sensor input states\n            temp2['id'] = (payload[5] & 0xf0) >> 4;\n            temp2['unit'] = '\\u00B0' + 'C';\n            // value@-3276.8 must be considered as an invalid measure (probe disconnected for instance)\n            temp2['value'] = payload.readInt16BE(6) / 10;\n            // With FW > 1.3.8 we are able to activate or not a probe : detect these FW thanks to a specific value\n            // sent by old FW\n            if ((payload[5] & 0x0F) !== 2) {\n                temp1['state'] = (payload[2] & 0x01) ? 'activated' : 'deactivated';\n                temp2['state'] = (payload[5] & 0x01) ? 'activated' : 'deactivated';\n            }\n            appContent['temperatures'] = [temp1, temp2];\n            return appContent;\n        };\n        return Temp0x43Parser;\n    }());\n    codec.Temp0x43Parser = Temp0x43Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Temperature status byte parser\n     */\n    var TempStatusByteParser = /** @class */ (function () {\n        function TempStatusByteParser() {\n            this.deviceType = 'temp';\n            this.frameCode = 0;\n        }\n        TempStatusByteParser.prototype.parseFrame = function (payload, configuration, network) {\n            var statusContent = {};\n            var parser = new codec.GenericStatusByteParser();\n            statusContent = parser.parseFrame(payload, configuration);\n            // Status byte, applicative flags\n            statusContent['probe1Alarm'] = Boolean((payload[1] & 0x08));\n            statusContent['probe2Alarm'] = Boolean((payload[1] & 0x10));\n            return { 'status': statusContent };\n        };\n        return TempStatusByteParser;\n    }());\n    codec.TempStatusByteParser = TempStatusByteParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Temp 3 0x10 (configuration) frame parser\n     */\n    var TempV30x10Parser = /** @class */ (function () {\n        function TempV30x10Parser() {\n            this.deviceType = 'temp3';\n            this.frameCode = 0x10;\n        }\n        TempV30x10Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x10 Temp 3 configuration' };\n            appContent['transmissionPeriodKeepAlive'] = { 'unit': 's', 'value': payload.readUInt16BE(2) * 10 },\n                appContent['numberOfHistorizationBeforeSending'] = payload.readUInt16BE(4),\n                appContent['numberOfSamplingBeforeHistorization'] = payload.readUInt16BE(6),\n                appContent['samplingPeriod'] = { 'unit': 's', 'value': payload.readUInt16BE(8) * 2 },\n                appContent['redundantSamples'] = payload.readUInt8(10),\n                appContent['calculatedPeriodRecording'] = { 'unit': 's',\n                    'value': payload.readUInt16BE(8) * payload.readUInt16BE(6) * 2 },\n                appContent['calculatedSendingPeriod'] = { 'unit': 's',\n                    'value': payload.readUInt16BE(8) * payload.readUInt16BE(6) * payload.readUInt16BE(4) * 2 };\n            return appContent;\n        };\n        return TempV30x10Parser;\n    }());\n    codec.TempV30x10Parser = TempV30x10Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Temp 3 0x30 (keep alive) frame parser\n     */\n    var TempV30x30Parser = /** @class */ (function () {\n        function TempV30x30Parser() {\n            this.deviceType = 'temp3';\n            this.frameCode = 0x30;\n        }\n        TempV30x30Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x30 Temp 3 keep alive' };\n            var nbSensors = (payload[1] & 0x10) ? 2 : 1;\n            var temperatures = [];\n            // value@-3276.8 must be considered as an invalid measure (probe disconnected for instance)\n            temperatures.push({ 'name': 'temperature 1', 'unit': '\\u00B0' + 'C', 'value': payload.readInt16BE(2) / 10 });\n            if (nbSensors === 2) {\n                temperatures.push({ 'name': 'temperature 2', 'unit': '\\u00B0' + 'C', 'value': payload.readInt16BE(4) / 10 });\n            }\n            appContent['temperatures'] = temperatures;\n            return appContent;\n        };\n        return TempV30x30Parser;\n    }());\n    codec.TempV30x30Parser = TempV30x30Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Temp 3 0x57 (data) frame parser\n     */\n    var TempV30x57Parser = /** @class */ (function () {\n        function TempV30x57Parser() {\n            this.deviceType = 'temp3';\n            this.frameCode = 0x57;\n        }\n        TempV30x57Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x57 Temp 3 periodic data' };\n            var nbSensors = (payload[1] & 0x10) ? 2 : 1;\n            var rawValue;\n            var temperatures = [];\n            var ch1Temp = [], ch2Temp = [];\n            // Loop through historic data [t=0, t-1, t-2,...]\n            // value@-3276.8 must be considered as an invalid measure (probe disconnected for instance)\n            for (var offset = 2; offset < payload.byteLength; offset += 2 * nbSensors) {\n                rawValue = payload.readInt16BE(offset);\n                ch1Temp.push(rawValue / 10);\n                if (nbSensors === 2) {\n                    rawValue = payload.readInt16BE(offset + 2);\n                    ch2Temp.push(rawValue / 10);\n                }\n            }\n            appContent['decodingInfo'] = 'values: [t=0, t-1, t-2, ...]';\n            // value@-3276.8 must be considered as an invalid measure (probe disconnected for instance)\n            temperatures.push({ 'name': 'temperature 1', 'unit': '\\u00B0' + 'C', 'values': ch1Temp });\n            if (nbSensors === 2) {\n                temperatures.push({ 'name': 'temperature 2', 'unit': '\\u00B0' + 'C', 'values': ch2Temp });\n            }\n            appContent['temperatures'] = temperatures;\n            return appContent;\n        };\n        return TempV30x57Parser;\n    }());\n    codec.TempV30x57Parser = TempV30x57Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Temp 3 0x58 (alarm) frame parser\n     */\n    var TempV30x58Parser = /** @class */ (function () {\n        function TempV30x58Parser() {\n            this.deviceType = 'temp3';\n            this.frameCode = 0x58;\n        }\n        TempV30x58Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x58 Temp 3 alarm' };\n            var alarms = [];\n            var nbSensors = (payload[1] & 0x10) ? 2 : 1;\n            alarms.push({\n                'name': 'temperature 1',\n                'alarmStatus': this.getAlarmStatusText(payload.readUInt8(2)),\n                'temperature': { 'unit': '\\u00B0' + 'C', 'value': payload.readInt16BE(3) / 10 }\n            });\n            if (nbSensors === 2) {\n                alarms.push({\n                    'name': 'temperature 2',\n                    'alarmStatus': this.getAlarmStatusText(payload.readUInt8(5)),\n                    'temperature': { 'unit': '\\u00B0' + 'C', 'value': payload.readInt16BE(6) / 10 }\n                });\n            }\n            appContent['alarms'] = alarms;\n            return appContent;\n        };\n        /**\n         * Get Alarm status text\n         * @param value value\n         */\n        TempV30x58Parser.prototype.getAlarmStatusText = function (value) {\n            switch (value) {\n                case 1:\n                    return 'highThreshold';\n                case 2:\n                    return 'lowThreshold';\n                default:\n                    return 'none';\n            }\n        };\n        return TempV30x58Parser;\n    }());\n    codec.TempV30x58Parser = TempV30x58Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Temp 3 status byte parser\n     */\n    var TempV3StatusByteParser = /** @class */ (function () {\n        function TempV3StatusByteParser() {\n            this.deviceType = 'temp3';\n            this.frameCode = 0;\n        }\n        TempV3StatusByteParser.prototype.parseFrame = function (payload, configuration, network) {\n            var statusContent = {};\n            var parser = new codec.GenericStatusByteParser();\n            statusContent = parser.parseFrame(payload, configuration);\n            // Status byte, applicative flags\n            statusContent['configurationInconsistency'] = Boolean(payload[1] & 0x08);\n            statusContent['configuration2ChannelsActivated'] = Boolean(payload[1] & 0x10);\n            return { 'status': statusContent };\n        };\n        return TempV3StatusByteParser;\n    }());\n    codec.TempV3StatusByteParser = TempV3StatusByteParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Temp 4 0x10 (configuration) frame parser\n     */\n    var TempV40x10Parser = /** @class */ (function () {\n        function TempV40x10Parser() {\n            this.deviceType = 'temp4';\n            this.frameCode = 0x10;\n        }\n        TempV40x10Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x10 Temp 4 configuration' };\n            appContent['transmissionPeriodKeepAlive'] = { 'unit': 's', 'value': payload.readUInt16BE(2) * 10 },\n                appContent['numberOfHistorizationBeforeSending'] = payload.readUInt16BE(4),\n                appContent['numberOfSamplingBeforeHistorization'] = payload.readUInt16BE(6),\n                appContent['samplingPeriod'] = { 'unit': 's', 'value': payload.readUInt16BE(8) * 2 },\n                appContent['redundantSamples'] = payload.readUInt8(10),\n                appContent['calculatedPeriodRecording'] = { 'unit': 's',\n                    'value': payload.readUInt16BE(8) * payload.readUInt16BE(6) * 2 },\n                appContent['calculatedSendingPeriod'] = { 'unit': 's',\n                    'value': payload.readUInt16BE(8) * payload.readUInt16BE(6) * payload.readUInt16BE(4) * 2 };\n            return appContent;\n        };\n        return TempV40x10Parser;\n    }());\n    codec.TempV40x10Parser = TempV40x10Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Temp 4 0x30 (keep alive) frame parser\n     */\n    var TempV40x30Parser = /** @class */ (function () {\n        function TempV40x30Parser() {\n            this.deviceType = 'temp4';\n            this.frameCode = 0x30;\n        }\n        TempV40x30Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x30 Temp 4 keep alive' };\n            var nbSensors = (payload[1] & 0x10) ? 2 : 1;\n            if (payload[1] & 0x04) {\n                // offsetType for date timestamp position\n                var offsetType = (nbSensors === 2) ? 6 : 4;\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(offsetType) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            var temperatures = [];\n            // value@-3276.8 must be considered as an invalid measure (probe disconnected for instance)\n            temperatures.push({ 'name': 'temperature 1', 'unit': '\\u00B0' + 'C', 'value': payload.readInt16BE(2) / 10 });\n            if (nbSensors === 2) {\n                temperatures.push({ 'name': 'temperature 2', 'unit': '\\u00B0' + 'C', 'value': payload.readInt16BE(4) / 10 });\n            }\n            appContent['temperatures'] = temperatures;\n            return appContent;\n        };\n        return TempV40x30Parser;\n    }());\n    codec.TempV40x30Parser = TempV40x30Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Temp 4 0x57 (data) frame parser\n     */\n    var TempV40x57Parser = /** @class */ (function () {\n        function TempV40x57Parser() {\n            this.deviceType = 'temp4';\n            this.frameCode = 0x57;\n        }\n        TempV40x57Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x57 Temp 4 periodic data' };\n            var nbSensors = (payload[1] & 0x10) ? 2 : 1;\n            var rawValue;\n            var temperatures = [];\n            var ch1Temp = [], ch2Temp = [];\n            var payloadLength = (payload[1] & 0x04) ? payload.byteLength - 4 : payload.byteLength;\n            // if the timestamp flag is true or false\n            // if (payload[1] & 0x04) {\n            // Loop through historic data [t=0, t-1, t-2,...]\n            // value@-3276.8 must be considered as an invalid measure (probe disconnected for instance)\n            // we subtract 4 bytes from the total length of the frame to deduce the timestamp\n            for (var offset = 2; offset < payloadLength; offset += 2 * nbSensors) {\n                rawValue = payload.readInt16BE(offset);\n                ch1Temp.push(rawValue / 10);\n                if (nbSensors === 2) {\n                    rawValue = payload.readInt16BE(offset + 2);\n                    ch2Temp.push(rawValue / 10);\n                }\n            }\n            if (payload[1] & 0x04) {\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(payload.byteLength - 4) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            appContent['decodingInfo'] = 'values: [t=0, t-1, t-2, ...]';\n            // value@-3276.8 must be considered as an invalid measure (probe disconnected for instance)\n            temperatures.push({ 'name': 'temperature 1', 'unit': '\\u00B0' + 'C', 'values': ch1Temp });\n            if (nbSensors === 2) {\n                temperatures.push({ 'name': 'temperature 2', 'unit': '\\u00B0' + 'C', 'values': ch2Temp });\n            }\n            appContent['temperatures'] = temperatures;\n            return appContent;\n        };\n        return TempV40x57Parser;\n    }());\n    codec.TempV40x57Parser = TempV40x57Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Temp 4 0x58 (alarm) frame parser\n     */\n    var TempV40x58Parser = /** @class */ (function () {\n        function TempV40x58Parser() {\n            this.deviceType = 'temp4';\n            this.frameCode = 0x58;\n        }\n        TempV40x58Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x58 Temp 4 alarm' };\n            var alarms = [];\n            var nbSensors = (payload[1] & 0x10) ? 2 : 1;\n            // offsetType for date timestamp position\n            var offsetType = (nbSensors === 2) ? 8 : 5;\n            alarms.push({\n                'name': 'temperature 1',\n                'alarmStatus': this.getAlarmStatusText(payload.readUInt8(2)),\n                'temperature': { 'unit': '\\u00B0' + 'C', 'value': payload.readInt16BE(3) / 10 },\n            });\n            if (nbSensors === 2) {\n                alarms.push({\n                    'name': 'temperature 2',\n                    'alarmStatus': this.getAlarmStatusText(payload.readUInt8(5)),\n                    'temperature': { 'unit': '\\u00B0' + 'C', 'value': payload.readInt16BE(6) / 10 }\n                });\n            }\n            if (payload[1] & 0x04) {\n                // retrieval of the frame date timestamp value, then conversion to epoch 2013 (+1356998400), then in second\n                var myDate = new Date((payload.readUInt32BE(offsetType) + 1356998400) * 1000);\n                // As we do not know if timestamp is locale or UTC , do remove 'UTC' indication\n                appContent['timestamp'] = myDate.toJSON().replace('Z', '');\n            }\n            appContent['alarms'] = alarms;\n            return appContent;\n        };\n        /**\n         * Get Alarm status text\n         * @param value value\n         */\n        TempV40x58Parser.prototype.getAlarmStatusText = function (value) {\n            switch (value) {\n                case 1:\n                    return 'highThreshold';\n                case 2:\n                    return 'lowThreshold';\n                default:\n                    return 'none';\n            }\n        };\n        return TempV40x58Parser;\n    }());\n    codec.TempV40x58Parser = TempV40x58Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Temp 4 status byte parser\n     */\n    var TempV4StatusByteParser = /** @class */ (function () {\n        function TempV4StatusByteParser() {\n            this.deviceType = 'temp4';\n            this.frameCode = 0;\n        }\n        TempV4StatusByteParser.prototype.parseFrame = function (payload, configuration, network) {\n            var statusContent = {};\n            var parser = new codec.GenericStatusByteParser();\n            statusContent = parser.parseFrame(payload, configuration);\n            // Status byte, applicative flags\n            statusContent['configurationInconsistency'] = Boolean(payload[1] & 0x08);\n            statusContent['configuration2ChannelsActivated'] = Boolean(payload[1] & 0x10);\n            statusContent['timestamp'] = Boolean(payload[1] & 0x04);\n            return { 'status': statusContent };\n        };\n        return TempV4StatusByteParser;\n    }());\n    codec.TempV4StatusByteParser = TempV4StatusByteParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Tic 0x10 (configuration) frame parser\n     */\n    var Tic0x10Parser = /** @class */ (function () {\n        function Tic0x10Parser() {\n            this.deviceType = 'ticPmePmi|ticCbeLinkyMono|ticCbeLinkyTri';\n            this.frameCode = 0x10;\n        }\n        Tic0x10Parser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x10 TIC configuration' };\n            if (payload[5] === 2) {\n                // TEST mode => period = value * 20sec\n                appContent['transmissionPeriodKeepAlive'] = { 'unit': 's', 'value': payload[2] * 20 };\n                appContent['samplingPeriod'] = { 'unit': 's', 'value': payload.readUInt16BE(6) * 20 };\n            }\n            else {\n                // PRODUCTION mode => period = value * 10min\n                appContent['transmissionPeriodKeepAlive'] = { 'unit': 'm', 'value': payload[2] * 10 };\n                appContent['samplingPeriod'] = { 'unit': 'm', 'value': payload.readUInt16BE(6) };\n            }\n            appContent['transmissionPeriodData'] = payload.readUInt16BE(3);\n            // Product mode\n            appContent['productMode'] = codec.PlateformCommonUtils.getProductModeText(payload[5]);\n            return appContent;\n        };\n        return Tic0x10Parser;\n    }());\n    codec.Tic0x10Parser = Tic0x10Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * TIC 0x49 (data) frame parser\n     */\n    var Tic0x49Parser = /** @class */ (function () {\n        function Tic0x49Parser() {\n            this.deviceType = 'ticPmePmi|ticCbeLinkyMono|ticCbeLinkyTri';\n            this.frameCode = 0x49;\n        }\n        Tic0x49Parser.prototype.parseFrame = function (payload, configuration, network, deviceType) {\n            var appContent = { type: '0x49 TIC data' };\n            if (deviceType === 'ticCbeLinkyMono') {\n                appContent = this.payloadToString(payload, 2, 2 + 12, appContent, 'ADCO');\n                appContent = this.payloadToString(payload, 14, 14 + 4, appContent, 'OPTARIF');\n                appContent = this.payloadToValue(payload, 18, 'Wh', appContent, 'BASE');\n                appContent = this.payloadToValue(payload, 22, 'A', appContent, 'ISOUSC');\n                appContent = this.payloadToValue(payload, 26, 'A', appContent, 'IINST');\n                appContent = this.payloadToValue(payload, 30, 'A', appContent, 'IMAX');\n                appContent = this.payloadToValue(payload, 34, 'VA', appContent, 'PAPP');\n                appContent = this.payloadToValue(payload, 38, 'Wh', appContent, 'HCHC');\n                appContent = this.payloadToValue(payload, 42, 'Wh', appContent, 'HCHP');\n                appContent = this.payloadToString(payload, 46, 46 + 4, appContent, 'PTEC');\n            }\n            else if (deviceType === 'ticCbeLinkyTri') {\n                appContent = this.payloadToString(payload, 2, 2 + 12, appContent, 'ADCO');\n                appContent = this.payloadToValue(payload, 14, 'Wh', appContent, 'BASE');\n                appContent = this.payloadToValue(payload, 18, 'A', appContent, 'IINST1');\n                appContent = this.payloadToValue(payload, 22, 'A', appContent, 'IINST2');\n                appContent = this.payloadToValue(payload, 26, 'A', appContent, 'IINST3');\n                appContent = this.payloadToValue(payload, 30, 'A', appContent, 'IMAX1');\n                appContent = this.payloadToValue(payload, 34, 'A', appContent, 'IMAX2');\n                appContent = this.payloadToValue(payload, 38, 'A', appContent, 'IMAX3');\n                appContent = this.payloadToValue(payload, 42, 'W', appContent, 'PMAX');\n                appContent = this.payloadToValue(payload, 46, 'VA', appContent, 'PAPP');\n            }\n            else if (deviceType === 'ticPmePmi') {\n                appContent = this.payloadToDate(payload, 2, deviceType, appContent, 'DATE');\n                appContent = this.payloadToValue(payload, 8, 'Wh', appContent, 'EA_s');\n                appContent = this.payloadToValue(payload, 12, 'varh', appContent, 'ER+_s');\n                appContent = this.payloadToValue(payload, 16, 'varh', appContent, 'ER-_s');\n                appContent = this.payloadToValue(payload, 20, 'VAh', appContent, 'EAPP_s');\n                appContent = this.payloadToString(payload, 24, 24 + 3, appContent, 'PTCOUR1');\n                appContent = this.payloadToValue(payload, 27, 'kWh', appContent, 'EAP_s');\n                appContent = this.payloadToValue(payload, 31, 'kvarh', appContent, 'ER+P_s');\n                appContent = this.payloadToValue(payload, 35, 'kvarh', appContent, 'ER-P_s');\n                appContent = this.payloadToValue(payload, 39, 'kWh', appContent, 'EaP-1_s');\n                appContent = this.payloadToValue(payload, 43, 'kvarh', appContent, 'ER+P-1_s');\n                appContent = this.payloadToValue(payload, 47, 'kvarh', appContent, 'ER-P-1_s');\n            }\n            return appContent;\n        };\n        Tic0x49Parser.prototype.payloadToString = function (payload, start, end, appContent, label) {\n            var charCode = [];\n            for (var i = start; i < end; i++) {\n                if (payload[i] !== 0x00) {\n                    charCode.push(payload[i]);\n                }\n            }\n            var str = String.fromCharCode.apply(String, charCode);\n            if (str.length > 0) {\n                appContent[\"\" + label] = str;\n            }\n            else {\n                appContent[label + \"status\"] = 'notFound';\n            }\n            return appContent;\n        };\n        Tic0x49Parser.prototype.payloadToValue = function (payload, start, unit, appContent, label) {\n            var val = payload.readUInt32BE(start);\n            if (val !== 0x80000000) {\n                appContent[\"\" + label] = { 'unit': unit, 'value': val };\n            }\n            else {\n                appContent[label + \"status\"] = 'notFound';\n            }\n            return appContent;\n        };\n        Tic0x49Parser.prototype.p2d = function (val) {\n            return ('0' + val).slice(-2);\n        };\n        Tic0x49Parser.prototype.payloadToDate = function (payload, start, deviceType, appContent, label) {\n            var str = '2000-01-01T00:00:00';\n            if (deviceType === 'ticPmePmi') {\n                // format iso8601 : 2020-4-21T13:43:5\n                str = 2000 + payload[start + 2] + '-' + this.p2d(payload[start + 1])\n                    + '-' + this.p2d(payload[start + 0]) + 'T' + this.p2d(payload[start + 3])\n                    + ':' + this.p2d(payload[start + 4]) + ':' + this.p2d(payload[start + 5]);\n            }\n            if (str !== '2000-01-01T00:00:00') {\n                appContent[\"\" + label] = str;\n            }\n            else {\n                appContent[label + \"status\"] = 'notFound';\n            }\n            return appContent;\n        };\n        return Tic0x49Parser;\n    }());\n    codec.Tic0x49Parser = Tic0x49Parser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Tic 0x4a (alarm) frame parser\n     */\n    var Tic0x4aParser = /** @class */ (function () {\n        function Tic0x4aParser() {\n            this.deviceType = 'ticPmePmi|ticCbeLinkyMono|ticCbeLinkyTri';\n            this.frameCode = 0x4a;\n        }\n        Tic0x4aParser.prototype.parseFrame = function (payload, configuration, network) {\n            var appContent = { type: '0x4a TIC alarm' };\n            appContent['label'] = this.payloadToString(payload, 2, 12);\n            appContent['alarmType'] = this.getAlarmTypeText(payload[12]);\n            appContent['value'] = this.payloadToString(payload, 13, payload.length);\n            return appContent;\n        };\n        /**\n         * Get Threshold Triggering text\n         * @param value value\n         */\n        Tic0x4aParser.prototype.getAlarmTypeText = function (value) {\n            switch (value) {\n                case 0:\n                    return 'manualTrigger';\n                case 1:\n                    return 'labelAppearance';\n                case 2:\n                    return 'labelDisappearance';\n                case 3:\n                    return 'highTreshold';\n                case 4:\n                    return 'lowTreshold';\n                case 5:\n                    return 'endThresholdAlarm';\n                case 6:\n                    return 'deltaPositive';\n                case 7:\n                    return 'deltaNegative';\n                default:\n                    return '';\n            }\n        };\n        Tic0x4aParser.prototype.payloadToString = function (payload, start, end) {\n            var charCode = [];\n            for (var i = start; i < end; i++) {\n                if (payload[i] !== 0x00) {\n                    charCode.push(payload[i]);\n                }\n            }\n            var str = String.fromCharCode.apply(String, charCode);\n            return (str.length > 0) ? str : 'notFound';\n        };\n        return Tic0x4aParser;\n    }());\n    codec.Tic0x4aParser = Tic0x4aParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    /**\n     * Tic status byte parser\n     */\n    var TicStatusByteParser = /** @class */ (function () {\n        function TicStatusByteParser() {\n            this.deviceType = 'ticPmePmi|ticCbeLinkyMono|ticCbeLinkyTri';\n            this.frameCode = 0;\n        }\n        TicStatusByteParser.prototype.parseFrame = function (payload, configuration, network) {\n            var statusContent;\n            var parser = new codec.GenericStatusByteParser();\n            statusContent = parser.parseFrame(payload, configuration);\n            // Status byte, applicative flags\n            statusContent['configurationInconsistency'] = Boolean((payload[1] & 0x08));\n            statusContent['readError'] = Boolean((payload[1] & 0x10));\n            return { 'status': statusContent };\n        };\n        return TicStatusByteParser;\n    }());\n    codec.TicStatusByteParser = TicStatusByteParser;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    var PartialDecodingReason;\n    (function (PartialDecodingReason) {\n        PartialDecodingReason[PartialDecodingReason[\"NONE\"] = 0] = \"NONE\";\n        PartialDecodingReason[PartialDecodingReason[\"MISSING_NETWORK\"] = 1] = \"MISSING_NETWORK\";\n        PartialDecodingReason[PartialDecodingReason[\"MISSING_CONFIGURATION\"] = 2] = \"MISSING_CONFIGURATION\";\n    })(PartialDecodingReason = codec.PartialDecodingReason || (codec.PartialDecodingReason = {}));\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    var ContentImpl = /** @class */ (function () {\n        function ContentImpl(type) {\n            if (type === void 0) { type = 'Unknown'; }\n            this.type = type;\n            this.partialDecoding = codec.PartialDecodingReason.NONE;\n        }\n        ContentImpl.merge = function () {\n            var contents = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                contents[_i] = arguments[_i];\n            }\n            if (!contents || contents.length === 0) {\n                return null;\n            }\n            return Object.assign.apply(Object, __spreadArray([new ContentImpl(contents[0].type)], contents, false));\n        };\n        ContentImpl.prototype.merge = function () {\n            var contents = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                contents[_i] = arguments[_i];\n            }\n            return ContentImpl.merge.apply(ContentImpl, __spreadArray([this], contents, false));\n        };\n        return ContentImpl;\n    }());\n    codec.ContentImpl = ContentImpl;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    var PlateformCommonUtils = /** @class */ (function () {\n        function PlateformCommonUtils() {\n        }\n        /**\n         * Get Product Mode text\n         * @param value value\n         */\n        PlateformCommonUtils.getProductModeText = function (value) {\n            switch (value) {\n                case 0:\n                    return 'PARK';\n                case 1:\n                    return 'PRODUCTION';\n                case 2:\n                    return 'TEST';\n                case 3:\n                    return 'DEAD';\n                default:\n                    return '';\n            }\n        };\n        return PlateformCommonUtils;\n    }());\n    codec.PlateformCommonUtils = PlateformCommonUtils;\n})(codec || (codec = {}));\nvar codec;\n(function (codec) {\n    var DecoderProducts;\n    (function (DecoderProducts) {\n        DecoderProducts[\"analog\"] = \"Analog\";\n        DecoderProducts[\"breath\"] = \"Breath\";\n        DecoderProducts[\"comfort\"] = \"Comfort\";\n        DecoderProducts[\"comfort2\"] = \"Comfort 2\";\n        DecoderProducts[\"comfortCo2\"] = \"Comfort CO2\";\n        DecoderProducts[\"drycontacts\"] = \"Dry Contacts\";\n        DecoderProducts[\"drycontacts2\"] = \"Dry Contacts 2\";\n        DecoderProducts[\"deltap\"] = \"Delta P\";\n        DecoderProducts[\"motion\"] = \"Motion\";\n        DecoderProducts[\"pulse\"] = \"Pulse\";\n        DecoderProducts[\"pulse3\"] = \"Pulse 3\";\n        DecoderProducts[\"pulse4\"] = \"Pulse 4\";\n        DecoderProducts[\"pulse4nbiot\"] = \"Pulse 4 NB-IoT\";\n        DecoderProducts[\"repeater\"] = \"Repeater\";\n        DecoderProducts[\"temp\"] = \"Temp\";\n        DecoderProducts[\"temp3\"] = \"Temp 3\";\n        DecoderProducts[\"temp4\"] = \"Temp 4\";\n        DecoderProducts[\"ticCbeLinkyMono\"] = \"TIC CBE/LINKY MONO\";\n        DecoderProducts[\"ticCbeLinkyTri\"] = \"TIC CBE/LINKY TRI\";\n        DecoderProducts[\"ticPmePmi\"] = \"TIC PME-PMI\";\n    })(DecoderProducts = codec.DecoderProducts || (codec.DecoderProducts = {}));\n})(codec || (codec = {}));\n//# sourceMappingURL=lib.js.map\n\n// >>> lib codec END\n\n\nvar decoder = new codec.Decoder();\n\n// Select the wanted decoder\nmsg.raw = msg.payload;\n\nvar decoder = new codec.Decoder();\n// Configure the decoder for the appropriate device\ndecoder.setDeviceType(msg.productType);\n// Decode the given payload\nmsg.payload = decoder.decode(msg.raw);\n\n\nreturn msg;\n","outputs":1,"noerr":0,"x":981.8571395874023,"y":432.99999618530273,"wires":[["7376e41b.e528c4","81840921.4405e"]]},{"id":"7376e41b.e528c4","type":"debug","z":"60ab02a0.152ae4","name":"","active":true,"console":"false","complete":"true","x":1261.8571395874023,"y":432.99999618530273,"wires":[]},{"id":"e60d4f4b.694368","type":"inject","z":"60ab02a0.152ae4","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":377.8570976257324,"y":434.99999046325684,"wires":[["a5a728b7.8433f8"]]},{"id":"a5a728b7.8433f8","type":"function","z":"60ab02a0.152ae4","name":"script 04 - manual test","func":"// Configure the decoder for the appropriate device\n// Possible values are :\n// * `analog` => 'Analog device'\n// * `comfort` => 'Comfort device'\n// * `comfort2` => 'Comfort 2 device'\n// * `comfortCo2` => 'Comfort CO2 device'\n// * `drycontacts` => 'Dry Contacts device'\n// * `drycontacts2` => 'Dry Contacts 2 device'\n// * `deltap` => 'Delta P device'\n// * `motion` => 'Motion device'\n// * `pulse` => 'Pulse device'\n// * `pulse3` => 'Pulse 3 device'\n// * `pulse4` => 'Pulse 4 device'\n// * `pulse4nbiot` => 'Pulse 4 NB-IoT device'\n// * `repeater` => 'Repeater device'\n// * `temp` => 'Temp device'\n// * `temp3` => 'Temp 3 device'\n// * `temp4` => 'Temp 4 device'\n// * `ticCbeLinkyMono` => 'TIC CBE/LINKY MONO device'\n// * `ticCbeLinkyTri` => 'TIC CBE/LINKY TRI device'\n// * `ticPmePmi` => 'TIC PME-PMI device'\nmsg.productType=\"analog\";\nmsg.eui=\"aa-bb-cc-dd-ee-ff-00-00\"\nmsg.payload = \"42500110000002100000\";\nreturn msg;\n","outputs":1,"noerr":0,"x":573.8570976257324,"y":434.99999046325684,"wires":[["6f998f8.9ef41f"]]},{"id":"695fdfd1.82932","type":"lora in","z":"60ab02a0.152ae4","name":"","datatype":"bytes","x":306.85711669921875,"y":231,"wires":[["cc217ec3.078148"]]},{"id":"1ed38cd7.70da6b","type":"function","z":"60ab02a0.152ae4","name":"script 02 - Payload Formating","func":"// Convert array into hex string\n\nvar payload_=\"\";\nvar hex_value=0;\nfor(var i= 0; i <msg.payload.length; i++)\n{   \n    hex_value=msg.payload[i].toString(16);\n    if (hex_value.length==1)\n    {\n        hex_value=\"0\"+hex_value;\n    }\n    payload_+=hex_value;\n}\n\nmsg.payload = payload_;\n\nreturn msg;","outputs":1,"noerr":0,"x":1192.8571395874023,"y":218.00000762939453,"wires":[["6f998f8.9ef41f"]]},{"id":"cc217ec3.078148","type":"switch","z":"60ab02a0.152ae4","name":"Select productType from eui","property":"eui","propertyType":"msg","rules":[{"t":"eq","v":"00-18-b2-20-00-00-01-9b","vt":"str"},{"t":"eq","v":"00-18-b2-00-00-00-13-cf","vt":"str"},{"t":"eq","v":"00-18-b2-10-00-00-c5-10","vt":"str"}],"checkall":"false","outputs":3,"x":566.8571243286133,"y":230.9999885559082,"wires":[["b868b019.74a568"],["260f55dc.39a0e2"],["1f3a46c3.5c5991"]]},{"id":"260f55dc.39a0e2","type":"function","z":"60ab02a0.152ae4","name":"script 01 - DRYCONTACTS","func":"// Configure the decoder for the appropriate device\n// Possible values are :\n// * `analog` => 'Analog device'\n// * `comfort` => 'Comfort device'\n// * `comfort2` => 'Comfort 2 device'\n// * `comfortCo2` => 'Comfort CO2 device'\n// * `drycontacts` => 'Dry Contacts device'\n// * `drycontacts2` => 'Dry Contacts 2 device'\n// * `deltap` => 'Delta P device'\n// * `motion` => 'Motion device'\n// * `pulse` => 'Pulse device'\n// * `pulse3` => 'Pulse 3 device'\n// * `pulse4` => 'Pulse 4 device'\n// * `pulse4nbiot` => 'Pulse 4 NB-IoT device'\n// * `repeater` => 'Repeater device'\n// * `temp` => 'Temp device'\n// * `temp3` => 'Temp 3 device'\n// * `temp4` => 'Temp 4 device'\n// * `ticCbeLinkyMono` => 'TIC CBE/LINKY MONO device'\n// * `ticCbeLinkyTri` => 'TIC CBE/LINKY TRI device'\n// * `ticPmePmi` => 'TIC PME-PMI device'\nmsg.productType=\"drycontacts\";\n\nreturn msg;","outputs":1,"noerr":0,"x":888.8571319580078,"y":241.99999237060547,"wires":[["1ed38cd7.70da6b"]]},{"id":"b868b019.74a568","type":"function","z":"60ab02a0.152ae4","name":"script 01 - TEMP","func":"// Configure the decoder for the appropriate device\n// Possible values are :\n// * `analog` => 'Analog device'\n// * `comfort` => 'Comfort device'\n// * `comfort2` => 'Comfort 2 device'\n// * `comfortCo2` => 'Comfort CO2 device'\n// * `drycontacts` => 'Dry Contacts device'\n// * `drycontacts2` => 'Dry Contacts 2 device'\n// * `deltap` => 'Delta P device'\n// * `motion` => 'Motion device'\n// * `pulse` => 'Pulse device'\n// * `pulse3` => 'Pulse 3 device'\n// * `pulse4` => 'Pulse 4 device'\n// * `pulse4nbiot` => 'Pulse 4 NB-IoT device'\n// * `repeater` => 'Repeater device'\n// * `temp` => 'Temp device'\n// * `temp3` => 'Temp 3 device'\n// * `temp4` => 'Temp 4 device'\n// * `ticCbeLinkyMono` => 'TIC CBE/LINKY MONO device'\n// * `ticCbeLinkyTri` => 'TIC CBE/LINKY TRI device'\n// * `ticPmePmi` => 'TIC PME-PMI device'\nmsg.productType=\"temp\";\n\nreturn msg;","outputs":1,"noerr":0,"x":862.8571319580078,"y":197.99999237060547,"wires":[["1ed38cd7.70da6b"]]},{"id":"353b01e8.449abe","type":"debug","z":"60ab02a0.152ae4","name":"","active":true,"console":"false","complete":"eui","x":536.8571166992188,"y":143,"wires":[]},{"id":"81840921.4405e","type":"change","z":"60ab02a0.152ae4","name":"Topic","rules":[{"t":"set","p":"topic","pt":"msg","to":"eui","tot":"msg"},{"t":"set","p":"payload.time","pt":"msg","to":"time","tot":"msg"},{"t":"set","p":"payload.rssi","pt":"msg","to":"rssi","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":1256.8571395874023,"y":536.7499923706055,"wires":[["4cf3a7ef.c6b3e8"]]},{"id":"4cf3a7ef.c6b3e8","type":"mqtt out","z":"60ab02a0.152ae4","name":"MQTT","topic":"","qos":"1","retain":"true","broker":"aac632b8.bb555","x":1474.8571395874023,"y":535.9999923706055,"wires":[]},{"id":"8125c086.9442a8","type":"inject","z":"60ab02a0.152ae4","name":"","topic":"","payload":"{\"tmst\":2434986524,\"time\":\"2022-12-11T19:50:09.215804Z\",\"chan\":6,\"rfch\":1,\"freq\":867.7,\"stat\":1,\"modu\":\"LORA\",\"datr\":\"SF12BW125\",\"codr\":\"4/5\",\"lsnr\":10.2,\"rssi\":-59,\"opts\":\"\",\"size\":11,\"fcnt\":1,\"cls\":0,\"port\":1,\"mhdr\":\"40e47bca00800100\",\"appeui\":\"18-b2-44-00-52-49-43-29\",\"deveui\":\"00-18-b2-20-00-00-01-9b\",\"devaddr\":\"00ca7be4\",\"ack\":false,\"adr\":true,\"gweui\":\"00-80-00-00-a0-00-0e-0e\",\"seqn\":1,\"payload\":[16,0,24,6,0,3,16,3,1,2,5],\"eui\":\"00-18-b2-20-00-00-01-9b\",\"_msgid\":\"ada35cd8.525ca\"}","payloadType":"str","repeat":"","crontab":"","once":false,"x":359.85713958740234,"y":142.24999237060547,"wires":[["cc217ec3.078148","353b01e8.449abe"]]},{"id":"1f3a46c3.5c5991","type":"function","z":"60ab02a0.152ae4","name":"script 01 - COMFORT","func":"// Configure the decoder for the appropriate device\n// Possible values are :\n// * `analog` => 'Analog device'\n// * `comfort` => 'Comfort device'\n// * `comfort2` => 'Comfort 2 device'\n// * `comfortCo2` => 'Comfort CO2 device'\n// * `drycontacts` => 'Dry Contacts device'\n// * `drycontacts2` => 'Dry Contacts 2 device'\n// * `deltap` => 'Delta P device'\n// * `motion` => 'Motion device'\n// * `pulse` => 'Pulse device'\n// * `pulse3` => 'Pulse 3 device'\n// * `pulse4` => 'Pulse 4 device'\n// * `pulse4nbiot` => 'Pulse 4 NB-IoT device'\n// * `repeater` => 'Repeater device'\n// * `temp` => 'Temp device'\n// * `temp3` => 'Temp 3 device'\n// * `temp4` => 'Temp 4 device'\n// * `ticCbeLinkyMono` => 'TIC CBE/LINKY MONO device'\n// * `ticCbeLinkyTri` => 'TIC CBE/LINKY TRI device'\n// * `ticPmePmi` => 'TIC PME-PMI device'\nmsg.productType=\"comfort\";\n\nreturn msg;","outputs":1,"noerr":0,"x":877,"y":295,"wires":[["1ed38cd7.70da6b"]]},{"id":"aac632b8.bb555","type":"mqtt-broker","z":"","broker":"10.239.2.10","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willPayload":"","birthTopic":"","birthQos":"0","birthPayload":""}]