Sfoglia il codice sorgente

1、添加视频流转化类型
2. 局部风机字段调整

hongrunxia 3 settimane fa
parent
commit
64b1126178

+ 4 - 2
src/hooks/system/useCamera.ts

@@ -55,10 +55,12 @@ export function useCamera() {
     if (cameras.length > 0) {
       for (let i = 0; i < cameras.length; i++) {
         const item = cameras[i];
-        if (item['devicekind'] === 'toHKRtsp') {
+        if (item['devicekind'] === 'toHKRtsp' || item['devicekind'] === 'toHKHLs') {
           // 从海康平台接口获取视频流
+          const videoType = item['devicekind'] === 'toHKRtsp' ? 'rtsp' : '';
+
           try {
-            const data = await cameraAddr({ cameraCode: item['addr'] });
+            const data = await cameraAddr({ cameraCode: item['addr'], videoType });
             if (data && data['url']) {
               cameraAddrs.push({ name: item['name'], addr: data['url'], cameraRate: item['cameraRate'] });
             }

+ 45 - 28
src/hooks/system/useMethods.ts

@@ -1,6 +1,7 @@
 import { defHttp } from '/@/utils/http/axios';
 import { useMessage } from '/@/hooks/web/useMessage';
 import { useGlobSetting } from '/@/hooks/setting';
+import { message } from 'ant-design-vue';
 
 const { createMessage, createWarningModal } = useMessage();
 const glob = useGlobSetting();
@@ -21,7 +22,7 @@ export function useMethods() {
    * @param url
    */
   async function exportXls(name, url, params, isXlsx = false) {
-    const data = await defHttp.get({ url: url, params: params, responseType: 'blob' }, { isTransformResponse: false });
+    const data = await defHttp.get({ url: url, params: params, responseType: 'blob', timeout: 1000 * 1000 }, { isTransformResponse: false });
     if (!data) {
       createMessage.warning('文件下载失败');
       return;
@@ -56,33 +57,49 @@ export function useMethods() {
    * @param url
    */
   async function exportXlsPost(name, url, params, isXlsx = false) {
-    const data = await defHttp.post({ url: url, params: params, responseType: 'blob' }, { isTransformResponse: false });
-    if (!data) {
-      createMessage.warning('文件下载失败');
-      return;
-    }
-    if (!name || typeof name != 'string') {
-      name = '导出文件';
-    }
-    const blobOptions = { type: 'application/vnd.ms-excel' };
-    let fileSuffix = '.xls';
-    if (isXlsx === true) {
-      blobOptions['type'] = XLSX_MIME_TYPE;
-      fileSuffix = XLSX_FILE_SUFFIX;
-    }
-    if (typeof window.navigator.msSaveBlob !== 'undefined') {
-      window.navigator.msSaveBlob(new Blob([data], blobOptions), name + fileSuffix);
-    } else {
-      const url = window.URL.createObjectURL(new Blob([data], blobOptions));
-      const link = document.createElement('a');
-      link.style.display = 'none';
-      link.href = url;
-      link.setAttribute('download', name + fileSuffix);
-      document.body.appendChild(link);
-      link.click();
-      document.body.removeChild(link); //下载完成移除元素
-      window.URL.revokeObjectURL(url); //释放掉blob对象
-    }
+    // message.loading({ content: 'Loading...', key });
+
+    // message
+    //   .loading('正在导出,请稍等..', 2.5)
+    //   .then(
+    //     () => message.success('Loading finished', 2.5),
+    //     // eslint-disable-next-line @typescript-eslint/no-empty-function
+    //     () => {}
+    //   )
+    //   .then(() => message.info('Loading finished is finished', 2.5));
+    const key = 'updatable';
+    message.loading({ content: '正在导出,请稍等...', key });
+    defHttp
+      .post({ url: url, params: params, timeout: 1000 * 1000 }, { isTransformResponse: false })
+      .then((data) => {
+        if (data.code == 200 && data.result) {
+          const messageArr = data.result.split('/');
+          const fileUrl = messageArr[messageArr.length - 1];
+          if (fileUrl) {
+            const baseApiUrl = glob.domainUrl;
+            // 下载文件
+            const a = document.createElement('a');
+            // 定义下载名称
+            a.download = name;
+            // 隐藏标签
+            a.style.display = 'none';
+            // 设置文件路径
+            a.href = `${baseApiUrl}/sys/common/static/${fileUrl}`;
+            // 将创建的标签插入dom
+            document.body.appendChild(a);
+            // 点击标签,执行下载
+            a.click();
+            // 将标签从dom移除
+            document.body.removeChild(a);
+            message.success({ content: '导出成功!', key, duration: 1 });
+          }
+        } else {
+          message.error({ content: '下载失败!', key, duration: 1 });
+        }
+      })
+      .catch(() => {
+        message.error({ content: '下载失败!', key, duration: 1 });
+      });
   }
 
   /**

File diff suppressed because it is too large
+ 3 - 3
src/utils/common/renderUtils.ts


+ 5 - 1
src/views/vent/deviceManager/comment/cameraTabel/camera.data.ts

@@ -35,9 +35,13 @@ export const columns: BasicColumn[] = [
           value: 'flv',
         },
         {
-          label: '海康平台转换',
+          label: '海康平台转换rtsp',
           value: 'toHKRtsp',
         },
+        {
+          label: '海康平台转换hls',
+          value: 'toHKHLs',
+        },
       ],
     },
   },

+ 1 - 0
src/views/vent/deviceManager/ledTabel/led.data.ts

@@ -60,6 +60,7 @@ export const searchFormSchema: FormSchema[] = [
       labelField: 'strname',
       valueField: 'id',
     },
+    colProps: { span: 6 },
   },
 ];
 

+ 3 - 3
src/views/vent/deviceManager/substationTabel/substation.data.ts

@@ -155,7 +155,7 @@ export const formSchema: FormSchema[] = [
   {
     label: '分站端口',
     field: 'nport',
-    component: 'InputNumber',
+    component: 'Input',
   },
   {
     label: 'PLC类型',
@@ -169,8 +169,8 @@ export const formSchema: FormSchema[] = [
   },
   {
     label: '分站站号',
-    field: 'code   ',
-    component: 'Input',
+    field: 'code',
+    component: 'InputNumber',
   },
   {
     label: '系统缓存点表下标',

+ 4 - 4
src/views/vent/home/clique/components/scene-key.vue

@@ -99,10 +99,10 @@
           selectVal.value = selectList.value[0].value;
           changeSelect(selectVal.value);
         } else {
-          // 向下寻找一个新选项以实现轮播
-          const options = selectList.value;
-          const val = _.get(options, [(selectIndex.value + 1) % options.length, 'value']);
-          changeSelect(val);
+          // 向下寻找一个新选项以实现轮播(业务需求不加滚动)
+          // const options = selectList.value;
+          // const val = _.get(options, [(selectIndex.value + 1) % options.length, 'value']);
+          // changeSelect(val);
         }
       }
     },

+ 6 - 4
src/views/vent/monitorManager/camera/index.vue

@@ -201,10 +201,11 @@ async function getVideoAddrs() {
     for (let i = 0; i < cameras.length; i++) {
       const item = cameras[i];
 
-      if (item['devicekind'] === 'toHKRtsp') {
+      if (item['devicekind'] === 'toHKRtsp' || item['devicekind'] === 'toHKHLs') {
         // 从海康平台接口获取视频流
+        const videoType = item['devicekind'] === 'toHKRtsp' ? 'rtsp' : '';
         try {
-          const data = await cameraAddr({ cameraCode: item['addr'] });
+          const data = await cameraAddr({ cameraCode: item['addr'], videoType });
           if (data) {
             cameraList.push({ name: item['name'], addr: data['url'], cameraRate: item['cameraRate'] });
           }
@@ -238,10 +239,11 @@ async function getVideoAddrsSon(Id) {
     for (let i = 0; i < cameras.length; i++) {
       const item = cameras[i];
 
-      if (item['devicekind'] === 'toHKRtsp') {
+      if (item['devicekind'] === 'toHKRtsp' || item['devicekind'] === 'toHKHLs') {
         // 从海康平台接口获取视频流
+        const videoType = item['devicekind'] === 'toHKRtsp' ? 'rtsp' : '';
         try {
-          const data = await cameraAddr({ cameraCode: item['addr'] });
+          const data = await cameraAddr({ cameraCode: item['addr'], videoType });
           if (data && data['url']) {
             cameraList.push({ name: item['name'], addr: data['url'], cameraRate: item['cameraRate'] });
           }

+ 0 - 504
src/views/vent/monitorManager/deviceMonitorWarn/index.vue

@@ -1,504 +0,0 @@
-<template>
-    <div class="deviceMonitorWarn">
-        <customHeader>设备监测预警</customHeader>
-        <a-button preIcon="ant-design:rollback-outlined" type="text" size="small"
-            style="position: absolute; left: 15px; top: -66px; color: #fff" @click="getBack">返回</a-button>
-        <div class="content">
-            <div class="left-box">
-                <div class="left-box-content">
-                    <div :class="activeIndex == index ? 'card-box1' : 'card-box'" v-for="(item, index) in cardList"
-                        :key="index" @click="cardClick(item, index)">
-                        <div class="card-item">
-                            <div class="item-title">
-                                {{ item.title }}
-                            </div>
-                            <div class="item-sum">
-                                <span>总数:</span>
-                                <span> {{ item.sumVal }}</span>
-                            </div>
-                            <div class="item-warn">
-                                <span>报警数:</span>
-                                <span> {{ item.warnVal }}</span>
-
-                            </div>
-                            <div class="item-close">
-                                <span>断开数:</span>
-                                <span> {{ item.closeVal }}</span>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="right-box">
-                <div class="right-box-content">
-                    <div class="alarm-history-table">
-                        <BasicTable :key="isShow" ref="alarmHistory" @register="registerTable"
-                            :scroll="{ x: 0, y: 590 }">
-                            <template #form-onExportXls>
-                                <a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls()">
-                                    导出</a-button>
-                            </template>
-                        </BasicTable>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-</template>
-
-<script setup lang="ts">
-import { ref, nextTick, reactive, onMounted, onUnmounted } from 'vue';
-import customHeader from '/@/components/vent/customHeader.vue';
-import { getTotalList, getAlarmLogList } from './deviceMonitorWarn.api'
-import {cardList} from './deviceMonitorWarn.data'
-import { BasicTable } from '/@/components/Table';
-import { useListPage } from '/@/hooks/system/useListPage';
-import { getTableHeaderColumns } from '/@/hooks/web/useWebColumns';
-import { getAutoScrollContainer } from '/@/utils/common/compUtils';
-import { useRouter } from 'vue-router';
-
-const props = defineProps({
-    formConfig: {
-        type: Object as PropType<FormProps> | undefined,
-        default: undefined,
-    },
-});
-
-let router = useRouter();
-let activeIndex = ref(0)
-let devicekindType = ref('modelsensor')
-let isShow = ref(0)
-const deviceColumns = getTableHeaderColumns('alarm_history') as [];
-const dataColumns = ref(deviceColumns);
-
-// 列表页面公共参数、方法
-const { tableContext, onExportXls } = useListPage({
-    tableProps: {
-        api: getAlarmLogList,
-        columns: dataColumns,
-        canResize: true,
-        showTableSetting: false,
-        showActionColumn: false,
-        bordered: false,
-        size: 'small',
-        formConfig: {
-            labelAlign: 'left',
-            showAdvancedButton: false,
-            actionColOptions: { xs: 24, sm: 12, md: 12, lg: 12, xl: 12, xxl: 12 },
-            schemas: [
-                {
-                    label: '是否解决',
-                    // field: 'isok',
-                    field: 'isOk',
-                    defaultValue: false,
-                    component: 'Select',
-                    componentProps: {
-                        options: [
-                            {
-                                label: '未解决',
-                                value: false,
-                            },
-                            {
-                                label: '已解决',
-                                value: true,
-                            },
-                        ],
-                    },
-                    colProps: { span: 8, },
-                },
-                {
-                    label: '所属系统',
-                    // field: 'kindtype',systemType
-                    field: 'systemType',
-                    component: 'Select',
-                    componentProps: {
-                        options: [
-                            {
-                                label: '通风',
-                                value: 'ventS',
-                            },
-                            {
-                                label: '防灭火',
-                                value: 'fireS',
-                            },
-                            {
-                                label: '防尘',
-                                value: 'dustS',
-                            },
-                            {
-                                label: '瓦斯',
-                                value: 'gasS',
-                            },
-                        ],
-                    },
-                    colProps: { span: 8 },
-                },
-                // {
-                //     label: '设备类型',
-                //     field: 'deviceKind',
-                //     component: 'MTreeSelect',
-                //     componentProps: {
-                //         virtual: false,
-                //     },
-                //     colProps: { span: 8 },
-                // },
-                {
-                    field: 'starttime',
-                    label: '开始时间',
-                    component: 'DatePicker',
-                    componentProps: {
-                        showTime: true,
-                        valueFormat: 'YYYY-MM-DD HH:mm:ss',
-                        getPopupContainer: getAutoScrollContainer,
-                    },
-                    colProps: {
-                        span: 8,
-                    },
-                },
-            ],
-        },
-        fetchSetting: {
-            listField: 'records',
-        },
-        pagination: {
-            current: 1,
-            pageSize: 10,
-            pageSizeOptions: ['10', '30', '50', '100'],
-        },
-        beforeFetch(params) {
-            params['deviceKind'] = devicekindType.value;
-            return params;
-        },
-    },
-    exportConfig: {
-        name: '预警历史列表',
-        url: '/safety/ventanalyAlarmLog/exportXls',
-    },
-});
-//注册table数据
-const [registerTable, { reload, setLoading, getForm }] = tableContext;
-
-//返回上一级
-function getBack() {
-    router.push('/monitorChannel/monitor-alarm-home');
-}
-//选项切换
-function cardClick(item, index) {
-    activeIndex.value = index
-    devicekindType.value = item.devicekind
-    isShow.value = new Date().getTime()
-}
-//获取左侧选项数据
-async function getDeviceCard() {
-    let res = await getTotalList({})
-    console.log(res, '左侧选项数据----------')
-    cardList.forEach(el => {
-        if (res.info.devicekindInfo[el.name]) {
-            el.sumVal = res.info.devicekindInfo[el.name].totalcount || 0
-            el.warnVal = res.info.devicekindInfo[el.name].count || 0
-            el.closeVal = res.info.devicekindInfo[el.name].netstatus || 0
-            el.devicekind = res.info.devicekindInfo[el.name].code || ''
-        }
-    })
-}
-
-onMounted(() => {
-    getDeviceCard()
-})
-defineExpose({ setLoading });
-
-
-</script>
-
-<style lang="less" scoped>
-.deviceMonitorWarn {
-    position: relative;
-    width: calc(100% - 20px);
-    height: calc(100% - 90px);
-    position: relative;
-    margin: 80px 10px 10px 10px;
-
-    .content {
-        position: relative;
-        width: 100%;
-        height: 100%;
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-
-        .left-box {
-            width: 45%;
-            height: 100%;
-            // margin-right: 15px;
-            padding: 10px;
-            box-sizing: border-box;
-            // background: url('@/assets/images/fire/bj1.png') no-repeat center;
-            // background-size: 100% 100%;
-
-            .left-box-content {
-                height: 100%;
-                display: flex;
-                justify-content: flex-start;
-                align-items: flex-start;
-                flex-wrap: wrap;
-                overflow-y: auto;
-
-                .card-box {
-                    width: 265px;
-                    height: 112px;
-                    margin: 0px 5px;
-
-                    &:nth-child(1) {
-                        background: url('../../../../assets/images/device/cgq.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-                    &:nth-child(2) {
-                        background: url('../../../../assets/images/device/zhufengji.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(3) {
-                        background: url('../../../../assets/images/device/jubufengji.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(4) {
-                        background: url('../../../../assets/images/device/fengmen.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(5) {
-                        background: url('../../../../assets/images/device/fengchuang.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(6) {
-                        background: url('../../../../assets/images/device/cefeng.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(7) {
-                        background: url('../../../../assets/images/device/yafeng.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(8) {
-                        background: url('../../../../assets/images/device/penling.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(9) {
-                        background: url('../../../../assets/images/device/penfen.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(10) {
-                        background: url('../../../../assets/images/device/zhudan.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(11) {
-                        background: url('../../../../assets/images/device/zhujiang.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(12) {
-                        background: url('../../../../assets/images/device/penwu.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(13) {
-                        background: url('../../../../assets/images/device/chuchen.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(14) {
-                        background: url('../../../../assets/images/device/wsgl.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(15) {
-                        background: url('../../../../assets/images/device/wsb.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    .card-item {
-                        position: relative;
-                        width: 100%;
-                        height: 100%;
-                        color: #fff;
-
-                        .item-title {
-                            position: absolute;
-                            left: 130px;
-                            top: 20px;
-                            font-size: 12px;
-                            font-family: 'douyuFont';
-                            color: #01fefc;
-                        }
-
-                        .item-sum {
-                            position: absolute;
-                            left: 130px;
-                            top: 40px;
-                        }
-
-                        .item-warn {
-                            position: absolute;
-                            left: 130px;
-                            top: 60px;
-                        }
-
-                        .item-close {
-                            position: absolute;
-                            left: 130px;
-                            top: 80px;
-                        }
-                    }
-                }
-
-                .card-box1 {
-                    width: 265px;
-                    height: 112px;
-                    margin: 0px 5px;
-
-                    &:nth-child(1) {
-                        background: url('../../../../assets/images/device/cgq-1.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-                    &:nth-child(2) {
-                        background: url('../../../../assets/images/device/zhufengji-1.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(3) {
-                        background: url('../../../../assets/images/device/jubufengji-1.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(4) {
-                        background: url('../../../../assets/images/device/fengmen-1.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(5) {
-                        background: url('../../../../assets/images/device/fengchuang-1.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(6) {
-                        background: url('../../../../assets/images/device/cefeng-1.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(7) {
-                        background: url('../../../../assets/images/device/yafeng-1.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(8) {
-                        background: url('../../../../assets/images/device/penling-1.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(9) {
-                        background: url('../../../../assets/images/device/penfen-1.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(10) {
-                        background: url('../../../../assets/images/device/zhudan-1.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(11) {
-                        background: url('../../../../assets/images/device/zhujiang-1.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(12) {
-                        background: url('../../../../assets/images/device/penwu-1.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(13) {
-                        background: url('../../../../assets/images/device/chuchen-1.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(14) {
-                        background: url('../../../../assets/images/device/wsgl-1.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-
-                    &:nth-child(15) {
-                        background: url('../../../../assets/images/device/wsb-1.png') no-repeat center;
-                        background-size: 100% 100%;
-                    }
-                    .card-item {
-                        position: relative;
-                        width: 100%;
-                        height: 100%;
-                        color: #fff;
-
-                        .item-title {
-                            position: absolute;
-                            left: 130px;
-                            top: 20px;
-                            font-size: 12px;
-                            font-family: 'douyuFont';
-                            color: #01fefc;
-                        }
-
-                        .item-sum {
-                            position: absolute;
-                            left: 130px;
-                            top: 40px;
-                        }
-
-                        .item-warn {
-                            position: absolute;
-                            left: 130px;
-                            top: 60px;
-                        }
-
-                        .item-close {
-                            position: absolute;
-                            left: 130px;
-                            top: 80px;
-                        }
-                    }
-                }
-            }
-
-        }
-
-        .right-box {
-            width: 55%;
-            height: 100%;
-            background: url('../../../../assets/images/fire/border.png') no-repeat center;
-            background-size: 100% 100%;
-
-            .right-box-content {
-                height: 100%;
-
-                .alarm-history-table {
-                    width: 100%;
-                    position: relative;
-
-                    &::after {
-                        position: absolute;
-                        content: '';
-                        width: calc(100% + 10px);
-                        height: 2px;
-                        top: 0px;
-                        left: -10px;
-                        border-bottom: 1px solid #0efcff44;
-                    }
-                }
-            }
-
-        }
-    }
-}
-</style>

+ 1 - 1
src/views/vent/monitorManager/fanLocalMonitor1/index.vue

@@ -9,7 +9,7 @@
     <div id="fanLocal3DCSS" class="threejs-Object-CSS" style="width: 100%; height: 100%; position: absolute; overflow: hidden; pointer-events: none">
       <div style="z-index: -1; position: relative" v-if="hasPermission('show:sensorMonitor')">
         <div class="elementTag" id="inputBox1">
-          <div class="elementContent" v-if="selectData.windSpeed1 || selectData.gas3 || selectData.windSpeed_merge">
+          <div class="elementContent" v-if="selectData.windSpeed1 || selectData.gas3 || selectData.windSpeed_merge || selectData.windQuantity1">
             <p v-if="selectData.windSpeed1 || selectData.windSpeed_merge"
               >风筒入口风速:<span class="value">{{
                 selectData.windSpeed1 ? selectData.windSpeed1 : selectData.windSpeed_merge ? selectData.windSpeed_merge : '-'

+ 4 - 4
src/views/vent/monitorManager/fanlocalPage/index.vue

@@ -94,15 +94,15 @@
             },
             {
               label: '风量',
-              value: el.readData.windQuantity ? el.readData.windQuantity : '-',
+              value: el.readData.windQuantity2 ? el.readData.windQuantity2 : '-',
               dw: 'm³/min',
             },
             {
               label: '风速',
-              value: el.readData.windSpeed ? el.readData.windSpeed : '-',
+              value: el.readData.windSpeed2 ? el.readData.windSpeed2 : '-',
               dw: 'm/s',
             },
-         
+
             { label: '时间', value: el.readTime, dw: '' },
           ],
         });
@@ -170,7 +170,7 @@
         position: relative;
         width: 417px;
         height: 380px;
-        margin: 0px  15px 15px 0px;
+        margin: 0px 15px 15px 0px;
         background: url(/src/assets/images/vent/fanlocal-page/card.png) no-repeat center;
         background-size: 100% 100%;
 

Some files were not shown because too many files changed in this diff