/**
 * @description 链接地址是否为视频
 * @param path
 * @return {boolean}
 */
const isVideo = (path) => {
    return /\.(mp4|avi|wmv|mpg|mpeg|mov|rm|ram|swf|flv)/.test(path);
}
/**
 * @description 图片预览
 * @param url data-url="{url}"
 */
const previewImage = ({currentTarget: {dataset: { url }}}) => {
    if (!url) return;
    if (url.indexOf('http') === -1 || url.indexOf('https') === -1) {
        url = 'https://oss.flossom.com' + url;
    }
    wx.previewImage({
        urls: [url]
    })
};
const formatTime = (date) => {
    const year = date.getFullYear();
    const month = date.getMonth() + 1;
    const day = date.getDate();
    const hour = date.getHours();
    const minute = date.getMinutes();
    const second = date.getSeconds();

    return `${[year, month, day].map(formatNumber).join("/")} ${[
        hour,
        minute,
        second,
    ]
      .map(formatNumber)
      .join(":")}`;
};

const formatNumber = (n) => {
    n = n.toString();
    return n[1] ? n : `0${n}`;
};

const setdata = (that, key, value) => {
    that.setData({
        [key]: value,
    });
};

const filertext = (text) => {
    return text.replace(/{/g, "").replace(/}/, "").replace(/"/g, "");
};

/**
 * 处理富文本里的图片宽度自适应
 * 1.去掉img标签里的style、width、height属性
 * 2.img标签添加style属性：max-width:100%;height:auto
 * 3.修改所有style里的width属性为max-width:100%
 * 4.去掉<br/>标签
 * @param html
 * @returns {void|string|*}
 */
const formatRichText = (html) => {
    let newContent = html.replace(/<img[^>]*>/gi, (match) => {
        match = match.replace(/style="[^"]+"/gi, '')
        return match;
    });
    newContent = newContent.replace(/style="[^"]+"/gi, (match) => {
        match = match.replace(/width:[^;]+;/gi, 'max-width:100%!important;')
        return match;
    });
    newContent = newContent.replace(/\<img/gi, '<img style="max-width:100%!important;height:auto!important;display:block;margin-top:0;margin-bottom:0;"');
    return newContent;
}

const date = () => {
    const year = new Date().getFullYear();
    const month = new Date().getMonth() + 1;
    const day = new Date().getDate();
    return (
      year +
      "-" +
      String(month).padStart("2", 0) +
      "-" +
      String(day).padStart("2", 0)
    );
};

const getdates = (date) => {
	date = date.replace(/-/g, '/');  // 部分iphone new Date不兼容[2023-01-01]格式，需要转换
    const year = new Date(date).getFullYear();
    const month = new Date(date).getMonth() + 1;
    const day = new Date(date).getDate();
    const hour = new Date(date).getHours();
    const minute = new Date(date).getMinutes();
    const second = new Date(date).getSeconds();

    // return `${[year, month, day].map(formatNumber).join('-')} ${[hour, minute, second].map(formatNumber).join(':')}`
    return `${[year, month, day].map(formatNumber).join("-")}`;
};

/**
 * 获取当前年份的第一天和最后一天
 * @returns {string} 例如 2019-01-01~2019-12-31
 */
const getYearFirstLastDay = () => {
    let firstDay = new Date();
    firstDay.setDate(1);
    firstDay.setMonth(0);
    let lastDay = new Date();
    lastDay.setFullYear(lastDay.getFullYear() + 2);
    lastDay.setDate(0);
    lastDay.setMonth(-1);
    firstDay = firstDay.Format("yyyy-MM-dd");
    lastDay = lastDay.Format("yyyy-MM-dd");
    return lastDay;
};

//日期格式化方法Format()方法

// 对Date的扩展，将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
// 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子：
// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2018-07-02 08:09:04.423
// (new Date()).Format("yyyy-M-d h:m:s.S")      ==> 2018-7-2 8:9:4.18
Date.prototype.Format = function (fmt) {
    var o = {
        "M+": this.getMonth() + 1, //月份
        "d+": this.getDate(), //日
        "h+": this.getHours(), //小时
        "m+": this.getMinutes(), //分
        "s+": this.getSeconds(), //秒
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度
        S: this.getMilliseconds(), //毫秒
    };
    if (/(y+)/.test(fmt))
        fmt = fmt.replace(
          RegExp.$1,
          (this.getFullYear() + "").substr(4 - RegExp.$1.length)
        );
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt))
            fmt = fmt.replace(
              RegExp.$1,
              RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length)
            );
    return fmt;
};

/**
 *
 * ArrayBuffer转16进制字符串
 */
const ab2hex = (buffer) => {
    var hexArr = Array.prototype.map.call(new Uint8Array(buffer), function (bit) {
        return ("00" + bit.toString(16)).slice(-2);
    });
    return hexArr.join("");
};

/**
 *
 *
 */
const hex2int = (hex) => {
    var len = hex.length,
      a = new Array(len),
      code;
    for (var i = 0; i < len; i++) {
        code = hex.charCodeAt(i);
        if (48 <= code && code < 58) {
            code -= 48;
        } else {
            code = (code & 0xdf) - 65 + 10;
        }
        a[i] = code;
    }

    return a.reduce(function (acc, c) {
        acc = 16 * acc + c;
        return acc;
    }, 0);
};

const keywordTofilter = (str) => {
    let arr = [];
    for (let i = 0, len = str.length; i < len; i += 2) {
        arr.push(str.slice(i, i + 2));
    }
    for (let i = 0; i < arr.length; i++) {
        if (i == 0 || i == arr.length - 1) {
            continue;
        }
        if (arr[i] == "db") {
            arr[i] = "dccb";
        }
        if (arr[i] == "dc") {
            arr[i] = "dccc";
        }
        if (arr[i] == "de") {
            arr[i] = "dcce";
        }
    }
    return arr.join("");
};

const filterData = (str) => {
    let data = str
      .replace(/dccc/g, "dc")
      .replace(/dccb/g, "db")
      .replace(/dcce/g, "de");
    return data;
};

const filterBleData = (str) => {
    let arr = [];
    let arr2 = [];
    let arr3 = [];
    for (let i = 0, len = str.length; i < len; i += 2) {
        arr.push(str.slice(i, i + 2));
    }
    let index = 0;
    arr.map((item, i) => {
        if (item == "dc") {
            if (i + 1 !== arr.length - 1) {
                arr2[index].push("d" + arr[i + 1].substring(1, 2));
            }
            return false;
        }
        if (item == "de") {
            arr2[index] = arr2[index].join("");
            index += 1;
        } else {
            if (!Array.isArray(arr2[index])) {
                arr2[index] = [];
            }
            if (i !== 0) {
                if (arr[i - 1] !== "dc") {
                    arr2[index].push(item);
                }
            }
        }
    });
    arr2.map((item) => {
        // console.log(ccrc8('db'+item.substring(0,item.length-2)) , item.substring(item.length-2,item.length))
        if (
          ccrc8("db" + item.substring(0, item.length - 2)) ==
          item.substring(item.length - 2, item.length)
        ) {
            arr3.push("db" + item + "de");
        }
    });
    return arr3;
};

const ccrc8 = (str) => {
    let arr = [];
    for (let i = 0, len = str.length; i < len; i += 2) {
        arr.push("0x" + str.slice(i, i + 2));
    }
    const crc8_854_table = [
        0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 157,
        195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 35, 125,
        159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 190, 224, 2,
        92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, 70, 24, 250, 164,
        39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, 219, 133, 103, 57,
        186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4,
        90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 248, 166, 68, 26, 153,
        199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237,
        179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 17, 79, 173, 243, 112, 46,
        204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206, 144,
        114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 50, 108, 142, 208, 83, 13,
        239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 202, 148, 118, 40, 171, 245,
        23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 87, 9, 235, 181, 54, 104, 138,
        212, 149, 203, 41, 119, 244, 170, 72, 22, 233, 183, 85, 11, 136, 214, 52,
        106, 43, 117, 151, 201, 74, 20, 246, 168, 116, 42, 200, 150, 21, 75, 169,
        247, 182, 232, 10, 84, 215, 137, 107, 53,
    ];
    let crc = new Uint8Array(1);
    crc = 0;
    for (let i = 0; i < arr.length; i++) {
        crc = crc8_854_table[crc ^ (arr[i] & 0xff & 0xff)];
    }
    return (crc & 0xff).toString(16).padStart("2", 0);
};

const s_to_hs = (s) => {
    //计算分钟
    //算法：将秒数除以60，然后下舍入，既得到分钟数
    var h;
    h = Math.floor(s / 60);
    //计算秒
    //算法：取得秒%60的余数，既得到秒数
    s = s % 60;
    //将变量转换为字符串
    h += "";
    s += "";
    //如果只有一位数，前面增加一个0
    h = h.length == 1 ? "0" + h : h;
    s = s.length == 1 ? "0" + s : s;
    return h + ":" + s;
};

const s_to_h = (s) => {
    //计算分钟
    //算法：将秒数除以60，然后下舍入，既得到分钟数
    var h;
    h = Math.floor(s / 60);
    //计算秒
    //算法：取得秒%60的余数，既得到秒数
    s = s % 60;
    //将变量转换为字符串
    h += "";
    s += "";
    //如果只有一位数，前面增加一个0
    h = h.length == 1 ? "0" + h : h;
    s = s.length == 1 ? "0" + s : s;
    return h;
};

const s_to_s = (s) => {
    //计算分钟
    //算法：将秒数除以60，然后下舍入，既得到分钟数
    var h;
    h = Math.floor(s / 60);
    //计算秒
    //算法：取得秒%60的余数，既得到秒数
    s = s % 60;
    //将变量转换为字符串
    h += "";
    s += "";
    //如果只有一位数，前面增加一个0
    h = h.length == 1 ? "0" + h : h;
    s = s.length == 1 ? "0" + s : s;
    return s;
};

// 分秒转换成秒
const minSecToS = (minSecStr) => {
    if (!minSecStr) return 0;
    let strArr = minSecStr.split(":");
    console.info(strArr, 'strArr')
    return strArr.length ? parseInt(strArr[0]) * 60 + parseInt(strArr[1]) : 0;
}

// 将字符串转换成ArrayBufer
const string2buffer = (str) => {
    let val = "";
    if (!str) return;
    let length = str.length;
    let index = 0;
    let array = [];
    while (index < length) {
        array.push(str.substring(index, index + 2));
        index = index + 2;
    }
    val = array.join(",");
    // 将16进制转化为ArrayBuffer
    return new Uint8Array(
      val.match(/[\da-f]{2}/gi).map(function (h) {
          return parseInt(h, 16);
      })
    ).buffer;
};

const checkEnd = (str) => {
    let itotal = 0,
      len = str.length,
      num = 0;
    while (num < len) {
        let s = str.substring(num, num + 2);
        itotal += parseInt(s, 16);
        num = num + 2;
    }
    let mode = itotal % 256;
    let shex = mode.toString(16);
    let iLen = shex.length;
    if (iLen < 2) {
        shex = "0" + shex;
    }
    return shex.toUpperCase();
};

const getofflineData = () => {
    //获取近7天的离线记录
    let arr = [];
    for (let i = 0; i <= 6; i++) {
        let str1 = "dbf0a00201";
        let num16 = i.toString(16).padStart("2", 0);
        let str2 = ccrc8(`${str1}${num16}`);
        arr.push(`${str1}${num16}${str2}de`);
    }
    return arr;
};

const getUpgradeData = (info) => {
    //解析获取升级包更新数据
    console.log(info);
    let arr = [];
    for (let i = 0, len = info.data.length; i < len; i += 480) {
        arr.push({
            i: info.data.slice(i, i + 480),
        });
    }
    arr.map((item, index) => {
        let num = Number(index + 1)
          .toString(16)
          .padStart("4", 0);
        let baohaodiwei = num.substring(2, 4);
        let baohaogaowei = num.substring(0, 2);
        let data = `dbf0ab01F7${info.length_low.padStart('2',0)}${info.length_high.padStart('2',0)}${info.bao_low.padStart('2',0)}${
          info.bao_high.padStart('2',0)
        }${baohaodiwei.padStart('2',0)}${baohaogaowei.padStart('2',0)}${
          index == arr.length - 1
            ? (arr[index].i.length / 2).toString(16).padStart("2", 0)
            : "F0"
        }${item.i}`;
        item.i = `${data}${ccrc8(data)}de`;
    });
    return arr;
};

const checkEnd2 = (str) => {
    const crc8_854_table = [
        0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 157,
        195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 35, 125,
        159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 190, 224, 2,
        92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, 70, 24, 250, 164,
        39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, 219, 133, 103, 57,
        186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4,
        90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 248, 166, 68, 26, 153,
        199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237,
        179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 17, 79, 173, 243, 112, 46,
        204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206, 144,
        114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 50, 108, 142, 208, 83, 13,
        239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 202, 148, 118, 40, 171, 245,
        23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 87, 9, 235, 181, 54, 104, 138,
        212, 149, 203, 41, 119, 244, 170, 72, 22, 233, 183, 85, 11, 136, 214, 52,
        106, 43, 117, 151, 201, 74, 20, 246, 168, 116, 42, 200, 150, 21, 75, 169,
        247, 182, 232, 10, 84, 215, 137, 107, 53,
    ];
    let crc = new Uint8Array(1);
    crc = 0;
    for (let i = 0; i < str.length; i++) {
        crc = crc8_854_table[crc ^ (str[i] & 0xff & 0xff)];
    }
    return (crc & 0xff).toString(16).toUpperCase().padStart("2", 0);
};

const checkEnd3 = (str) => {
    let arr = [];
    for (let i = 0, len = str.length; i < len; i += 2) {
        arr.push("0x" + str.slice(i, i + 2));
    }
    const crc8_854_table = [
        0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 157,
        195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 35, 125,
        159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 190, 224, 2,
        92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, 70, 24, 250, 164,
        39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, 219, 133, 103, 57,
        186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 101, 59, 217, 135, 4,
        90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 248, 166, 68, 26, 153,
        199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 140, 210, 48, 110, 237,
        179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 17, 79, 173, 243, 112, 46,
        204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206, 144,
        114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 50, 108, 142, 208, 83, 13,
        239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 202, 148, 118, 40, 171, 245,
        23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 87, 9, 235, 181, 54, 104, 138,
        212, 149, 203, 41, 119, 244, 170, 72, 22, 233, 183, 85, 11, 136, 214, 52,
        106, 43, 117, 151, 201, 74, 20, 246, 168, 116, 42, 200, 150, 21, 75, 169,
        247, 182, 232, 10, 84, 215, 137, 107, 53,
    ];
    let crc = new Uint8Array(1);
    crc = 0;
    for (let i = 0; i < arr.length; i++) {
        crc = crc8_854_table[crc ^ (arr[i] & 0xff & 0xff)];
    }
    return (crc & 0xff).toString(16).toUpperCase().padStart("2", 0);
};

const chulidata = (str) => {
    let data = str
      .replace(/dccc/g, "dc")
      .replace(/dccb/g, "db")
      .replace(/dcce/g, "de");
    return data;
};

const chulidata2 = (str) => {
    let data = str
      .replace(/DCCC/g, "dc")
      .replace(/DCCB/g, "db")
      .replace(/DCCE/g, "de");
    return data;
};

const getimpedanceList = () => {
    let arr = [];
    for(let i = 1;i<=10;i++){
        arr.push({
            num: 0,
            time: `00:${String(i).padStart('2',0)}`
        })
    }
    return arr;
};


/**
 * 处理上报数据，转换成对象
 */
const getreportData = (str) =>{
    let data = {};
    data.status = hex2int(str.substring(10,12));//工作状态
    data.quantity = hex2int(str.substring(20,22));//电量
    data.impedance1 = hex2int(str.substring(24,26));//阻抗低位数据
    data.impedance2 = hex2int(str.substring(26,28));//阻抗低位数据
    data.jiaoer1 = hex2int(str.substring(28,30));//每秒能量N*10 焦耳（N: 0~25.5
    data.mode = hex2int(str.substring(12,14));//模式
    data.position = hex2int(str.substring(14,16));//档位
    //TOREAD 当模式为水份模式
    if(data.mode == 6){
        data.waterLevel =   hex2int(str.substring(16,18))
        data.waterPercent =   hex2int(str.substring(18,20))
        //模式为水份测试时  档位1~3对应  0x01：测试成功  0x02: 测试中 0x03: 测试错误
        const testResultMap = ['TEST_UNKNOW_STATUS','TEST_SUCCESS','TEST_PROCESSING','TEST_FAIL'];
        data.testResult = testResultMap[data.position]||'TEST_UNKNOW_STATUS'
    }
    return data;
}

/**
 *  height 高位
 *  low 低位
 *  阻抗算法
 *  阻抗低位数据 + 阻抗高位数据 * 256
 *  如果以上公式 >=701 固定 701
 *  <=200 1档
 *  <=280 2挡
 *  <=360 3档
 *  <=440 4挡
 *  <=520 5挡
 *  <=600 6挡
 *  <=700 7挡
 *  >=701 8挡
 */
const DYNAMIC_BONES_OFFSETS = (height,low) =>{
    let total = Number(low)+Number(height)*256;
    if(total<=200){
        return 1
    }
    if(total<=280){
        return 2
    }
    if(total<=360){
        return 3
    }
    if(total<=440){
        return 4
    }
    if(total<=520){
        return 5
    }
    if(total<=600){
        return 6
    }
    if(total<=700){
        return 7
    }
    if(total>=701){
        return 8
    }
}

const getTimeCode = () =>{
    let year = new Date().getFullYear();
    let month = String(new Date().getMonth() + 1).padStart("2", 0);
    let day = String(new Date().getDate()).padStart("2", 0);
    let hour = String(new Date().getHours()).padStart("2", 0);
    let points = String(new Date().getMinutes()).padStart("2", 0);
    let seconds = String(new Date().getSeconds()).padStart("2", 0);
    let value = `dbf0a0010b${Number(String(year).substring(0, 2)).toString(16)}${Number(String(year).substring(2, 4)).toString(16)}${Number(month).toString(16).padStart("2", 0)}${Number(day).toString(16).padStart("2", 0)}${Number(hour).toString(16).padStart("2", 0)}${Number(points).toString(16).padStart("2", 0)}${Number(seconds).toString(16).padStart("2", 0)}00000000`;
    value = `${value}${ccrc8(value)}de`;
    return value;
}
/**
 * @param currentVersionNo
 * @param latestVersionNo
 * @returns needToUpdate
 */
const isNeedToUpdate = (currentVersionNo,latestVersionNo)=>{
    if (!currentVersionNo || !latestVersionNo) return false;
    let needToUpdate = false;
    //硬件版本号相同
    let sameHardwareNo = latestVersionNo.substring(0, 2) == currentVersionNo.substring(0, 2);
    //软件版本号当前版本比最新版的旧
    let latestValue = parseInt(latestVersionNo.substring(2, 6), 16);
    let currentValue = parseInt(currentVersionNo.substring(2, 6), 16);

    let solftwareNoNeedToUpdate = latestValue > currentValue;
    needToUpdate = sameHardwareNo && solftwareNoNeedToUpdate
    return needToUpdate
}

/**
 * @param compareVersion
 * @returns result  1:SDKVersion > version  0:SDKVersion == version   -1:SDKVersion < version
 */
const compareVersion = (version)=>{
    const systemInfo = wx.getSystemInfoSync();
    let SDKVersion = systemInfo.SDKVersion.split('.');
    version = version.split('.');
    const len = Math.max(SDKVersion.length, version.length)

    while (SDKVersion.length < len) {
        SDKVersion.push('0')
    }
    while (version.length < len) {
        version.push('0')
    }

    for (let i = 0; i < len; i++) {
        const num1 = parseInt(SDKVersion[i])
        const num2 = parseInt(version[i])

        if (num1 > num2) {
            return 1
        } else if (num1 < num2) {
            return -1
        }
    }
    return 0
}

/**
 * @param checkSameKey
 * @returns boolean
 */
const checkSameKey = (array1, array2, key)=>{
    for (var i = 0; i < array1.length; i++) {
        for (var j = 0; j < array2.length; j++) {
            if (array1[i][key] === array2[j][key]) {
                return true;
            }
        }
    }
    return false;
}

module.exports = {
    isVideo,
    previewImage,
    formatTime,
    setdata,
    filertext,
    formatRichText,
    date,
    getdates,
    getYearFirstLastDay,
    ab2hex,
    hex2int,
    filterData,
    ccrc8, //crc8校验位
    string2buffer, //将字符串转换成ArrayBufer
    s_to_hs, //秒转换成分秒
    checkEnd, //相加和
    filterBleData,
    getofflineData,
    getUpgradeData,
    keywordTofilter,
    checkEnd2,
    checkEnd3,
    chulidata,
    chulidata2,
    getimpedanceList,
    DYNAMIC_BONES_OFFSETS,  //阻抗获取值
    getreportData,  //解析上报数据
    s_to_h,
    s_to_s,
    minSecToS,
    getTimeCode,    //同步时间指令
    isNeedToUpdate,
    compareVersion,
    checkSameKey
};
