Commit 2c523f99 authored by 何虹's avatar 何虹 💬

升级程序

parent 9a65bf39
......@@ -23,7 +23,7 @@
"element-ui": "^2.15.1",
"umy-ui": "^1.1.6",
"file-saver": "^2.0.5",
"hs-util-js": "^1.0.33",
"hs-util-js": "^1.0.34",
"i": "^0.3.6",
"jsoneditor": "^8.6.5",
"lodash": "^4.17.15",
......
import uButton from './src/button'
uButton.install = function(Vue) {
Vue.component(uButton.name, uButton)
uButton.install = function (Vue) {
Vue.component(uButton.name, uButton)
}
export default uButton
<template>
<button class="u-button"
:class="[[`icon-${position}`],
<button class="u-button"
:class="[[`icon-${position}`],
typeStyle,sizeStyle,plainStyle,dangerStyle,dashedStyle,loadingStyle,circleStyle]
"
:disabled="disabled||loading"
ref="button"
:style="roundStyle"
@click="onClick"
@focus="focusOn"
@blur="blurIt"
>
:disabled="disabled||loading"
ref="button"
:style="roundStyle"
@click="onClick"
@focus="focusOn"
@blur="blurIt">
<u-icon :name="loading?'loading':icon"
:color="color"
:style="disabledStyle"
v-if="icon || loading" :class="{loading:loading}">
</u-icon>
<span class="u-button-content"
:style="disabledStyle"
>
<slot>
</slot>
</span>
</button>
<u-icon :name="loading?'loading':icon"
:color="color"
:style="disabledStyle"
v-if="icon || loading"
:class="{loading:loading}">
</u-icon>
<span class="u-button-content"
:style="disabledStyle">
<slot>
</slot>
</span>
</button>
</template>
<script>
import Icon from '../../icon/src/icon.vue'
import Icon from '../../icon/src/icon.vue'
export default {
name: 'u-button',
components: {
'u-icon': Icon
},
methods: {
onClick() {
this.$emit('click')
this.dangerAnimation()
},
dangerAnimation() {
let arr = this.$refs.button.classList
arr.remove('loop')
arr.add('loop')
setTimeout(() => {
arr.remove('loop')
}, 300)
},
focusOn() {
},
blurIt() {
}
},
computed: {
disabledStyle() {
if (this.disabled)return 'pointer-events: none;'
},
typeStyle() {
if (!this.type) return
return `type-${this.type}`
},
sizeStyle() {
if (!this.size) return
return `size-${this.size}`
},
roundStyle() {
if (this.round) {
return 'border-radius:21px;'
}
},
circleStyle() {
if (this.circle) {
return 'circle'
}
},
plainStyle() {
if (this.plain) {
return 'plain'
}
},
dangerStyle() {
if (this.danger) {
return 'danger'
}
},
dashedStyle() {
if (this.dashed) {
return 'dashed'
}
},
loadingStyle() {
if (this.loading) {
return 'loadingCloak'
}
}
},
props: {
icon: {
type: String
},
disabled: {
type: Boolean,
default: false
},
type: {
type: String,
validator:(val)=>['primary', 'success', 'warn', 'error', 'info'].indexOf(val) > -1
},
plain: {
type: Boolean,
default: false
},
dashed:{
type: Boolean,
default: false
},
size: {
type: String,
default: 'medium',
validator(val) {
return ['big', 'medium', 'small', 'mini'].indexOf(val) > -1
}
},
round: {
type: Boolean,
default: false
},
color: {
type: String,
default() {
if (this.type) {
return 'white'
} else {
return 'black'
}
}
},
loading: {
type: Boolean,
default: false
},
danger: {
type: Boolean,
default: false
},
position: {
type: String,
default: 'left',
validator(value) {
return !(value !== 'left' && value !== 'right');
}
},
circle: {
type: Boolean,
default: false
}
export default {
name: 'u-button',
components: {
'u-icon': Icon
},
methods: {
onClick () {
this.$emit('click')
this.dangerAnimation()
},
dangerAnimation () {
const arr = this.$refs.button.classList
arr.remove('loop')
arr.add('loop')
setTimeout(() => {
arr.remove('loop')
}, 300)
},
focusOn () {},
blurIt () {}
},
computed: {
disabledStyle () {
if (this.disabled) return 'pointer-events: none;'
},
typeStyle () {
if (!this.type) return
return `type-${this.type}`
},
sizeStyle () {
if (!this.size) return
return `size-${this.size}`
},
roundStyle () {
if (this.round) {
return 'border-radius:21px;'
}
},
circleStyle () {
if (this.circle) {
return 'circle'
}
},
plainStyle () {
if (this.plain) {
return 'plain'
}
},
dangerStyle () {
if (this.danger) {
return 'danger'
}
},
dashedStyle () {
if (this.dashed) {
return 'dashed'
}
},
loadingStyle () {
if (this.loading) {
return 'loadingCloak'
}
}
},
props: {
icon: {
type: String
},
disabled: {
type: Boolean,
default: false
},
type: {
type: String,
validator: val =>
['primary', 'success', 'warn', 'error', 'info'].indexOf(val) > -1
},
plain: {
type: Boolean,
default: false
},
dashed: {
type: Boolean,
default: false
},
size: {
type: String,
default: 'medium',
validator (val) {
return ['big', 'medium', 'small', 'mini'].indexOf(val) > -1
}
},
round: {
type: Boolean,
default: false
},
color: {
type: String,
default () {
if (this.type) {
return 'white'
} else {
return 'black'
}
}
},
loading: {
type: Boolean,
default: false
},
danger: {
type: Boolean,
default: false
},
position: {
type: String,
default: 'left',
validator (value) {
return !(value !== 'left' && value !== 'right')
}
},
circle: {
type: Boolean,
default: false
}
}
}
</script>
<style>
a{
size: 1;
a {
size: 1;
}
</style>
This diff is collapsed.
// dialog.js
import Vue from 'vue'
function makeDialog(option) {
function makeDialog (option) {
var dom = document.createElement('div')
document.getElementsByTagName('body')[0].appendChild(dom)
const tpl = `
......@@ -16,7 +16,7 @@ function makeDialog(option) {
</el-dialog>`
var vue = new Vue({
el: dom,
data: function() {
data: function () {
return {
title: option.title,
size: option.size || 'small',
......@@ -26,28 +26,28 @@ function makeDialog(option) {
},
template: tpl,
computed: {
customClass() {
customClass () {
return `el-dialog--width-${option.size || 'auto'}`
}
},
methods: {
handleClose(done) {
handleClose (done) {
if (option.beforeClose) {
option.beforeClose(done)
} else {
done()
}
},
close() {
close () {
if (option.close) {
option.close()
}
},
closeDialog() {
closeDialog () {
this.show = false
},
confirmDialog(result) {
confirmDialog (result) {
this.show = false
option.confirm && option.confirm(result)
}
......@@ -60,7 +60,7 @@ function makeDialog(option) {
}
export default {
open(options) {
open (options) {
return makeDialog(options)
}
}
<template>
<el-dialog
title="导入"
:visible.sync="dialogVisible"
width="90%"
:before-close="handleClose"
:close-on-click-modal='false'
@open='open'
:append-to-body='true'
>
<iframe
name="zi"
:src='pageSrc'
style="width:100%;height:500px;padding-top:10px"
sandbox="allow-same-origin allow-scripts allow-forms allow-top-navigation allow-popups"
></iframe>
<el-dialog title="导入"
:visible.sync="dialogVisible"
width="90%"
:before-close="handleClose"
:close-on-click-modal='false'
@open='open'
:append-to-body='true'>
<iframe name="zi"
:src='pageSrc'
style="width:100%;height:500px;padding-top:10px"
sandbox="allow-same-origin allow-scripts allow-forms allow-top-navigation allow-popups"></iframe>
</el-dialog>
</template>
<script>
......@@ -33,32 +29,28 @@ export default {
entityManger: {}
},
watch: {
value(val) {
value (val) {
this.dialogVisible = val
},
dialogVisible(val) {
dialogVisible (val) {
this.$emit('input', val)
}
},
data() {
data () {
return {
dialogVisiblePage: false,
pageSrc: '',
dialogVisible: false
}
},
beforeDestroy() {
beforeDestroy () {
window.removeEventListener('message', this.listenerMessageFun, false)
},
mounted() {
window.addEventListener(
'message',
this.listenerMessageFun,
false
)
mounted () {
window.addEventListener('message', this.listenerMessageFun, false)
},
methods: {
listenerMessageFun(event) {
listenerMessageFun (event) {
const data_ = event.data
const { innerType, data, main, close } = data_
if (close) {
......@@ -78,17 +70,19 @@ export default {
}
},
// 参照弹出选择
selectPlugin(data) {
selectPlugin (data) {
this.$emit('linkBtnUiBack', data)
},
// 单一列表的数据导入
async dataImport(data, config, main) {
async dataImport (data, config, main) {
if (!config) return
const type = this.entityManger.type // 实体类型
const restful_appcode = this.entityManger.config.restful_appcode
if (type === 'mainDtl') { // 详情的导入
if (type === 'mainDtl') {
// 详情的导入
this.dtlImport(data, config, main)
} else { // 列表上的导入
} else {
// 列表上的导入
const ids = data.reduce((prve, curr) => {
prve.push(curr.id)
return prve
......@@ -119,7 +113,7 @@ export default {
}
},
// 详情中的导入
async dtlImport(data, config, main) {
async dtlImport (data, config, main) {
if (!config) return
const mainEntity = this.entityManger.mainEntity
const config_ = mainEntity.config
......@@ -164,10 +158,10 @@ export default {
})
}
},
open() {
open () {
this.pageSrc = this.src
},
handleClose() {
handleClose () {
this.dialogVisible = false
}
}
......
<template>
<el-dialog
title="导入"
:visible.sync="dialogVisible"
width="40%"
:before-close="handleClose"
:close-on-click-modal='false'
@open='open'
:append-to-body='true'
>
<el-upload
class="upload-demo"
:drag='false'
ref='uploadEl'
action="https://jsonplaceholder.typicode.com/posts/"
:auto-upload="false"
:on-change="handleChange"
:accept='accept'
:multiple='false'
:on-remove="handleRemove"
>
<!-- <i class="el-icon-upload"></i> -->
<!-- <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div> -->
<el-button size="small" type="primary">选择文件</el-button>
<div class="el-upload__tip" slot="tip">只能上传xlsx/xls文件</div>
</el-upload>
<span slot="footer" class="dialog-footer">
<el-button size='mini' @click="dialogVisible = false">取 消</el-button>
<el-button size='mini' type="primary" @click="submit">确 定</el-button>
</span>
<el-dialog title="导入"
:visible.sync="dialogVisible"
width="40%"
:before-close="handleClose"
:close-on-click-modal='false'
@open='open'
:append-to-body='true'>
<el-upload class="upload-demo"
:drag='false'
ref='uploadEl'
action="https://jsonplaceholder.typicode.com/posts/"
:auto-upload="false"
:on-change="handleChange"
:accept='accept'
:multiple='false'
:on-remove="handleRemove">
<!-- <i class="el-icon-upload"></i> -->
<!-- <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div> -->
<el-button size="small"
type="primary">选择文件</el-button>
<div class="el-upload__tip"
slot="tip">只能上传xlsx/xls文件</div>
</el-upload>
<span slot="footer"
class="dialog-footer">
<el-button size='mini'
@click="dialogVisible = false">取 消</el-button>
<el-button size='mini'
type="primary"
@click="submit">确 定</el-button>
</span>
</el-dialog>
</template>
<script>
......@@ -38,49 +39,50 @@ export default {
value: {
type: Boolean,
default: false
},
entityConfig: {},
currentImportItem: {}
},
watch: {
value(val) {
value (val) {
this.dialogVisible = val
},
dialogVisible(val) {
dialogVisible (val) {
this.$emit('input', val)
}
},
data() {
data () {
return {
dialogVisible: false,
fileList: [],
accept: 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
accept:
'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
}
},
methods: {
handleRemove(file, fileList) {
handleRemove (file, fileList) {
if (!fileList.length) {
this.fileList = []
}
},
handleChange(file, fileList) {
handleChange (file, fileList) {
const uploadFiles = this.$refs.uploadEl.uploadFiles.pop()
this.$refs.uploadEl.uploadFiles = [uploadFiles]
const file_ = [file]
this.fileList = file_
},
open() {
open () {
const r = this.$refs.uploadEl
this.fileList = []
if (r) { // 清空上传列表
if (r) {
// 清空上传列表
r.clearFiles()
}
},
handleClose() {
handleClose () {
this.dialogVisible = false
},
submit() {
submit () {
if (!this.fileList.length) {
this.$message.error('请选择文件')
return
......@@ -91,7 +93,7 @@ export default {
}
</script>
<style scoped>
.upload-demo{
text-align: center
.upload-demo {
text-align: center;
}
</style>
This diff is collapsed.
......@@ -1480,7 +1480,8 @@ const hsPageConfigImport = {
'version': '2.0',
'ui': {
main: {
tableHeightAdaption: false
tableHeightAdaption: false,
showImportExtraParamForm: false
}
},
'entity': {
......@@ -2460,6 +2461,111 @@ const hsButton = {
label: '测试'
}
}
const hsPopoverHtml = {
config: {
width: 400,
height: 400
}
}
const hsCalculator = {
config: {},
data: []
}
const hsTextLinks = {
config: {
linkList: [{
'label': '...'
}]
},
data: []
}
const hsGroupCheckbox = {
config: {
label: 'name',
value: 'id',
group: 'group'
},
data: []
}
const hsPageConfigCheckbox = {
config: {
'restful_appcode': '', // appcode
'isInitMenuParam': false, // 是否初始化menuParam
pageMode: true,
'version': '2.0',
ui: {
main: {
isTabsForm: false,
tableHeightAdaption: false,
mainControlType: 1
},
index: {
showQueryComponent: false
}
},
'entity': { // 实体节点
'index': {
'isInitNewDefault': false, // 初始化新增默认值
'initNewDefaultOnce': true, // 是否只调用一次
'width': '220px',
'group': 'Tree',
'isShowTreeHeader': false, // 是否显示树的头部
'table_name': '', // 表名
'primaryKey': 'id', // 主键
'saveIncludeFields': '', // 保存时一定会传入到后台的字段,无论这些字段是否有修改,多字段时逗号串联
'saveExcludeFields': '', // 保存时不传给后端的字段,无论这些字段是否有修改,多字段时逗号串联
'dyncQueryParms': {}, // 动态查询参数
'queryOneDyncQueryParms': {},
'indexTitle': '', // 标题
'saveDyncParms': {},
'check': {} // 修改或者新增时 数据校验
},
'main': {
'refreshIndex': false, // 单行修改后 是否刷新左侧
'isInitNewDefault': false, // 初始化新增默认值
'initNewDefaultOnce': true, // 是否只调用一次
'check': {}, // 修改时数据校验
'enableBillFlow': true, // 是否开启审核流程
'queryDefault': {}, // 查询默认值
'isHideQueryZone': false, // 是否隐藏搜索区域
'group': '', // 分组
'table_name': '', // 表名
'primaryKey': 'id', // 主键
'saveIncludeFields': '', // 保存时一定会传入到后台的字段,无论这些字段是否有修改,多字段时逗号串联
'saveExcludeFields': '', // 保存时不传给后端的字段,无论这些字段是否有修改,多字段时逗号串联
'dyncQueryParms': { // 动态查询参数
},
'saveDyncParms': {},
'queryOneDyncQueryParms': {},
'importInfo': []
}
},
'new_default': {// 新增默认值
'main': {
'columns': {
}
},
'index': {
'columns': {
}
}
}
},
data: []
}
const hsTreeCheckbox = {
config: {
label: 'name',
parentId: 'parent_id',
nodeKey: 'id',
showCheckbox: true,
checkOnClickNode: true,
defaultExpandAll: true,
columns: [],
showHeader: false
},
data: []
}
const mockData = {
hsLineBar: hsLineBar,
hsPie: initPie,
......@@ -2524,6 +2630,12 @@ const mockData = {
hsInputSelect,
hsTabsTable,
hsPageConfigQueryBi,
hsButton
hsButton,
hsPopoverHtml,
hsCalculator,
hsTextLinks,
hsGroupCheckbox,
hsPageConfigCheckbox,
hsTreeCheckbox
}
export default mockData
<template>
<div>
<el-table
:data="gridData"
max-height="350"
>
<el-table-column
property="app_code"
label="appCode"
width="150"
></el-table-column>
<el-table-column
property="page_name"
label="pageName"
width="200"
></el-table-column>
<el-table-column
property="control_name"
label="controlName"
></el-table-column>
<el-table-column
property="query_sql"
label="querySql"
:show-overflow-tooltip='true'
></el-table-column>
<el-table-column
property="version"
label="version"
></el-table-column>
<el-table :data="gridData"
max-height="350">
<el-table-column property="app_code"
label="appCode"
width="150"></el-table-column>
<el-table-column property="page_name"
label="pageName"
width="200"></el-table-column>
<el-table-column property="control_name"
label="controlName"></el-table-column>
<el-table-column property="query_sql"
label="querySql"
:show-overflow-tooltip='true'></el-table-column>
<el-table-column property="version"
label="version"></el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
size="mini"
type="danger"
@click="revertVersion(scope.$index, scope.row)"
>回滚</el-button>
<el-button
type="success"
size="mini"
@click="showView(scope.$index, scope.row)"
>查看效果</el-button>
<el-button size="mini"
type="danger"
@click="revertVersion(scope.$index, scope.row)">回滚</el-button>
<el-button type="success"
size="mini"
@click="showView(scope.$index, scope.row)">查看效果</el-button>
</template>
</el-table-column>
</el-table>
......@@ -50,7 +34,7 @@ export default {
props: {
elInfo: {
type: Object,
default() {
default () {
return {
dialogVisible: false
}
......@@ -61,7 +45,7 @@ export default {
default: false
}
},
data() {
data () {
return {
pageTitle: '',
dialogVisible: false,
......@@ -69,15 +53,15 @@ export default {
}
},
watch: {
isrequest(value) {
isrequest (value) {
this.dialogOpen()
}
},
mounted() {
mounted () {
this.dialogOpen()
},
methods: {
revertVersion(index, item) {
revertVersion (index, item) {
const parm = {
appCode: item.app_code,
pageName: item.page_name,
......@@ -100,7 +84,7 @@ export default {
})
})
},
async dialogOpen() {
async dialogOpen () {
const params = {
appCode: '',
pageName: this.elInfo.page,
......@@ -108,10 +92,12 @@ export default {
dbName: '',
dbCode: ''
}
const res = await this.$httpClient.WebChartConfigModule.webChartConfigQueryLog(params)
const res = await this.$httpClient.WebChartConfigModule.webChartConfigQueryLog(
params
)
this.gridData = res.data || []
},
showView(index, item) {
showView (index, item) {
const data = {
config: JSON.parse(item.json_config),
sourceData: JSON.parse(item.json_data),
......
This diff is collapsed.
<template>
<el-dialog
@opened="dialogOpen"
title="系统布局配置"
:visible.sync="dialogVisible"
@closed="dialogClose" width="95%"
:append-to-body='true'
:close-on-click-modal='false'>
<div class="drawer-container">
<div>
<div class="drawer-item">
<span class="itemColor">系统主题颜色:</span>
<theme-picker @changeColor="themeChange" />
<el-dialog @opened="dialogOpen"
title="系统布局配置"
:visible.sync="dialogVisible"
@closed="dialogClose"
width="95%"
:append-to-body='true'
:close-on-click-modal='false'>
<div class="drawer-container">
<div>
<div class="drawer-item">
<span class="itemColor">系统主题颜色:</span>
<theme-picker @changeColor="themeChange" />
</div>
</div>
</div>
</div>
</el-dialog>
</el-dialog>
</template>
<script>
......@@ -25,20 +25,20 @@ export default {
value: Boolean
},
watch: {
value(val) {
value (val) {
this.dialogVisible = val
},
dialogVisible(val) {
dialogVisible (val) {
this.$emit('input', val)
}
},
data() {
data () {
return {
dialogVisible: false
}
},
methods: {
themeChange(val) {
themeChange (val) {
// this.$store.dispatch('setting/changeSetting', {
// key: 'theme',
// value: val
......@@ -51,7 +51,7 @@ export default {
})
},
// 保存queryBIView页面的配置信息
savePageConfig(data) {
savePageConfig (data) {
const parms = {
sControl: 'systemSetting',
sConfig: {},
......@@ -59,10 +59,10 @@ export default {
}
return this.$API.runSave(parms)
},
dialogOpen() {
dialogOpen () {
this.$store.commit('change_viewStatus', true)
},
dialogClose() {
dialogClose () {
this.$store.commit('change_viewStatus', false)
this.dialogVisible = false
}
......@@ -76,22 +76,21 @@ export default {
font-size: 14px;
line-height: 1.5;
word-wrap: break-word;
}
.drawer-title {
margin-bottom: 12px;
color: rgba(0, 0, 0, .85);
font-size: 14px;
line-height: 22px;
}
margin-bottom: 12px;
color: rgba(0, 0, 0, 0.85);
font-size: 14px;
line-height: 22px;
}
.drawer-item {
display: flex;
justify-content: start;
color: rgba(0, 0, 0, .65);
font-size: 14px;
padding: 12px 0;
}
.itemColor{
margin-right: 10px;
}
display: flex;
justify-content: start;
color: rgba(0, 0, 0, 0.65);
font-size: 14px;
padding: 12px 0;
}
.itemColor {
margin-right: 10px;
}
</style>
This diff is collapsed.
const data = {
exportToExcel(columnList = [], dataList = [], fileName = 'data') {
exportToExcel (columnList = [], dataList = [], fileName = 'data') {
const tHeader = []
const filterVal = []
for (const item of columnList) {
......@@ -13,10 +13,10 @@ const data = {
export_json_to_excel(tHeader, data, fileName)
})
},
formatJson(filterVal, jsonData) {
formatJson (filterVal, jsonData) {
return jsonData.map(v => filterVal.map(j => v[j]))
},
exportJsonToExcelMuilt(dataList = [], fileName = 'data') {
exportJsonToExcelMuilt (dataList = [], fileName = 'data') {
require.ensure([], () => {
const { export_json_to_excel_muilt } = require('./Export2Excel.js')
export_json_to_excel_muilt(dataList, fileName)
......
import { EleResize } from './ezresize'
import echarts from 'echarts'
export default function drawEcharts(id, option) { // id: chart所在块id, option: 配置项
export default function drawEcharts (id, option) { // id: chart所在块id, option: 配置项
const dom = document.getElementById(id)
const chart = echarts.init(dom)
chart.setOption(option)
......
import index from './src/index.vue'
index.install = function(Vue) {
index.install = function (Vue) {
Vue.component(index.name, index)
}
export default index
This diff is collapsed.
This diff is collapsed.
import index from './src/index.vue'
index.install = function(Vue) {
index.install = function (Vue) {
Vue.component(index.name, index)
}
export default index
This diff is collapsed.
<template>
<hs-component-shell
v-bind="$attrs"
v-on="$listeners"
>
<child
v-bind="$attrs"
v-on="$listeners"
></child>
<hs-component-shell v-bind="$attrs"
v-on="$listeners">
<child v-bind="$attrs"
v-on="$listeners"></child>
</hs-component-shell>
</template>
<script>
......
import index from './src/index.vue'
index.install = function(Vue) {
index.install = function (Vue) {
Vue.component(index.name, index)
}
export default index
This diff is collapsed.
<template>
<hs-component-shell
v-bind="$attrs"
v-on="$listeners"
>
<child
v-bind="$attrs"
v-on="$listeners"
></child>
<hs-component-shell v-bind="$attrs"
v-on="$listeners">
<child v-bind="$attrs"
v-on="$listeners"></child>
</hs-component-shell>
</template>
<script>
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment