ant-design-vue/components/upload/UploadList.jsx

273 lines
8.1 KiB
Vue
Raw Normal View History

2019-01-12 03:33:27 +00:00
import BaseMixin from '../_util/BaseMixin';
import { getOptionProps, initDefaultProps } from '../_util/props-util';
import getTransitionProps from '../_util/getTransitionProps';
2019-03-28 11:51:27 +00:00
import { ConfigConsumerProps } from '../config-provider';
2019-01-12 03:33:27 +00:00
import Icon from '../icon';
import Tooltip from '../tooltip';
import Progress from '../progress';
import classNames from 'classnames';
import { UploadListProps } from './interface';
2018-04-13 08:19:50 +00:00
2019-04-07 01:05:54 +00:00
const imageTypes = ['image', 'webp', 'png', 'svg', 'gif', 'jpg', 'jpeg', 'bmp', 'dpg', 'ico'];
2018-04-13 08:19:50 +00:00
// https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL
const previewFile = (file, callback) => {
2018-12-05 10:31:58 +00:00
if (file.type && !imageTypes.includes(file.type)) {
2019-01-12 03:33:27 +00:00
callback('');
2018-12-05 10:31:58 +00:00
}
2019-01-12 03:33:27 +00:00
const reader = new window.FileReader();
reader.onloadend = () => callback(reader.result);
reader.readAsDataURL(file);
};
2018-04-13 08:19:50 +00:00
2019-01-12 03:33:27 +00:00
const extname = url => {
update to antd3.8.3 (#159) * refactor: align * feat: update align to 2.4.3 * feat: update trigger 2.5.4 * feat: update tooltip 3.7.2 * fix: align * feat: update vc-calendar to 9.6.2 * feat: update vc-checkbox to 2.1.5 * feat: update vc-dialog to 7.1.8 * feat: update vc-from to 2.2.1 * feat: update vc-notification to 3.1.1 * test: update snapshots * feat: update vc-tree to 1.12.6 * feat: update vc-table to 6.2.8 * feat: update vc-upload to 2.5.1 * feat: update vc-input-number to 4.0.12 * feat: update vc-tabs to 9.2.6 * refactor: vc-menu * refactor: update vc-menu to 7.0.5 * style: remove unused * feat: update pagination to 1.16.5 * feat: add vc-progress 2.2.5 tag * feat: add vc-rate 2.4.0 tag * feat: update vc-slider to 8.6.1 * fix: tooltip error * style: delete conosle * feat: update vc-steps to 3.1.1 * add vc-switch tag 1.6.0 * feat: update upload to 2.5.1 * fix: update vc-menu * fix: update store * fix: add ref dir * fix: trigger mock shouldComponentUpdate * fix: update vc-select * revert: trigger lazyrenderbox * fix: update vc-select * fix: update vc-select * fix: update vc-select * fix: update vc-menu * fix: update vc-slick ref * update style to 3.8.2 * test: update snapshots * update vc-select * update util & affix * feat: add drawer * fix: support title add slot mode * test: update affix test * update alert * update anchor * update snapshots * fix: doc and vc-drawer * update select & auto-complete * update back-top & grid * feractor: avatar * test: add drawer test * update badge * update button * update card * update divider * feat: update vc-tabs to 9.3.6 and tabs * add afterEnter callback * update form * fix: update drawer * test: update snapshots * update modal & notification * test: update snapshots * update message * update locale-provider * update dropdown * update layout popconfirm popover * update time-picker * update menu * update date-picker * docs: update input docs * update input * update snapshots * update table * update test snapshots * feat: update progress * update checkbox * feat: update spin * update radio * docs: slider steps timeline * update list * update transfer * update collapse * update cascader * update upload
2018-09-05 13:28:54 +00:00
if (!url) {
2019-01-12 03:33:27 +00:00
return '';
update to antd3.8.3 (#159) * refactor: align * feat: update align to 2.4.3 * feat: update trigger 2.5.4 * feat: update tooltip 3.7.2 * fix: align * feat: update vc-calendar to 9.6.2 * feat: update vc-checkbox to 2.1.5 * feat: update vc-dialog to 7.1.8 * feat: update vc-from to 2.2.1 * feat: update vc-notification to 3.1.1 * test: update snapshots * feat: update vc-tree to 1.12.6 * feat: update vc-table to 6.2.8 * feat: update vc-upload to 2.5.1 * feat: update vc-input-number to 4.0.12 * feat: update vc-tabs to 9.2.6 * refactor: vc-menu * refactor: update vc-menu to 7.0.5 * style: remove unused * feat: update pagination to 1.16.5 * feat: add vc-progress 2.2.5 tag * feat: add vc-rate 2.4.0 tag * feat: update vc-slider to 8.6.1 * fix: tooltip error * style: delete conosle * feat: update vc-steps to 3.1.1 * add vc-switch tag 1.6.0 * feat: update upload to 2.5.1 * fix: update vc-menu * fix: update store * fix: add ref dir * fix: trigger mock shouldComponentUpdate * fix: update vc-select * revert: trigger lazyrenderbox * fix: update vc-select * fix: update vc-select * fix: update vc-select * fix: update vc-menu * fix: update vc-slick ref * update style to 3.8.2 * test: update snapshots * update vc-select * update util & affix * feat: add drawer * fix: support title add slot mode * test: update affix test * update alert * update anchor * update snapshots * fix: doc and vc-drawer * update select & auto-complete * update back-top & grid * feractor: avatar * test: add drawer test * update badge * update button * update card * update divider * feat: update vc-tabs to 9.3.6 and tabs * add afterEnter callback * update form * fix: update drawer * test: update snapshots * update modal & notification * test: update snapshots * update message * update locale-provider * update dropdown * update layout popconfirm popover * update time-picker * update menu * update date-picker * docs: update input docs * update input * update snapshots * update table * update test snapshots * feat: update progress * update checkbox * feat: update spin * update radio * docs: slider steps timeline * update list * update transfer * update collapse * update cascader * update upload
2018-09-05 13:28:54 +00:00
}
2019-01-12 03:33:27 +00:00
const temp = url.split('/');
const filename = temp[temp.length - 1];
const filenameWithoutSuffix = filename.split(/#|\?/)[0];
return (/\.[^./\\]*$/.exec(filenameWithoutSuffix) || [''])[0];
};
2018-12-05 10:31:58 +00:00
2019-01-12 03:33:27 +00:00
const isImageUrl = file => {
update to antd3.8.3 (#159) * refactor: align * feat: update align to 2.4.3 * feat: update trigger 2.5.4 * feat: update tooltip 3.7.2 * fix: align * feat: update vc-calendar to 9.6.2 * feat: update vc-checkbox to 2.1.5 * feat: update vc-dialog to 7.1.8 * feat: update vc-from to 2.2.1 * feat: update vc-notification to 3.1.1 * test: update snapshots * feat: update vc-tree to 1.12.6 * feat: update vc-table to 6.2.8 * feat: update vc-upload to 2.5.1 * feat: update vc-input-number to 4.0.12 * feat: update vc-tabs to 9.2.6 * refactor: vc-menu * refactor: update vc-menu to 7.0.5 * style: remove unused * feat: update pagination to 1.16.5 * feat: add vc-progress 2.2.5 tag * feat: add vc-rate 2.4.0 tag * feat: update vc-slider to 8.6.1 * fix: tooltip error * style: delete conosle * feat: update vc-steps to 3.1.1 * add vc-switch tag 1.6.0 * feat: update upload to 2.5.1 * fix: update vc-menu * fix: update store * fix: add ref dir * fix: trigger mock shouldComponentUpdate * fix: update vc-select * revert: trigger lazyrenderbox * fix: update vc-select * fix: update vc-select * fix: update vc-select * fix: update vc-menu * fix: update vc-slick ref * update style to 3.8.2 * test: update snapshots * update vc-select * update util & affix * feat: add drawer * fix: support title add slot mode * test: update affix test * update alert * update anchor * update snapshots * fix: doc and vc-drawer * update select & auto-complete * update back-top & grid * feractor: avatar * test: add drawer test * update badge * update button * update card * update divider * feat: update vc-tabs to 9.3.6 and tabs * add afterEnter callback * update form * fix: update drawer * test: update snapshots * update modal & notification * test: update snapshots * update message * update locale-provider * update dropdown * update layout popconfirm popover * update time-picker * update menu * update date-picker * docs: update input docs * update input * update snapshots * update table * update test snapshots * feat: update progress * update checkbox * feat: update spin * update radio * docs: slider steps timeline * update list * update transfer * update collapse * update cascader * update upload
2018-09-05 13:28:54 +00:00
if (imageTypes.includes(file.type)) {
2019-01-12 03:33:27 +00:00
return true;
update to antd3.8.3 (#159) * refactor: align * feat: update align to 2.4.3 * feat: update trigger 2.5.4 * feat: update tooltip 3.7.2 * fix: align * feat: update vc-calendar to 9.6.2 * feat: update vc-checkbox to 2.1.5 * feat: update vc-dialog to 7.1.8 * feat: update vc-from to 2.2.1 * feat: update vc-notification to 3.1.1 * test: update snapshots * feat: update vc-tree to 1.12.6 * feat: update vc-table to 6.2.8 * feat: update vc-upload to 2.5.1 * feat: update vc-input-number to 4.0.12 * feat: update vc-tabs to 9.2.6 * refactor: vc-menu * refactor: update vc-menu to 7.0.5 * style: remove unused * feat: update pagination to 1.16.5 * feat: add vc-progress 2.2.5 tag * feat: add vc-rate 2.4.0 tag * feat: update vc-slider to 8.6.1 * fix: tooltip error * style: delete conosle * feat: update vc-steps to 3.1.1 * add vc-switch tag 1.6.0 * feat: update upload to 2.5.1 * fix: update vc-menu * fix: update store * fix: add ref dir * fix: trigger mock shouldComponentUpdate * fix: update vc-select * revert: trigger lazyrenderbox * fix: update vc-select * fix: update vc-select * fix: update vc-select * fix: update vc-menu * fix: update vc-slick ref * update style to 3.8.2 * test: update snapshots * update vc-select * update util & affix * feat: add drawer * fix: support title add slot mode * test: update affix test * update alert * update anchor * update snapshots * fix: doc and vc-drawer * update select & auto-complete * update back-top & grid * feractor: avatar * test: add drawer test * update badge * update button * update card * update divider * feat: update vc-tabs to 9.3.6 and tabs * add afterEnter callback * update form * fix: update drawer * test: update snapshots * update modal & notification * test: update snapshots * update message * update locale-provider * update dropdown * update layout popconfirm popover * update time-picker * update menu * update date-picker * docs: update input docs * update input * update snapshots * update table * update test snapshots * feat: update progress * update checkbox * feat: update spin * update radio * docs: slider steps timeline * update list * update transfer * update collapse * update cascader * update upload
2018-09-05 13:28:54 +00:00
}
2019-01-12 03:33:27 +00:00
const url = file.thumbUrl || file.url;
const extension = extname(url);
2019-04-07 01:05:54 +00:00
if (/^data:image\//.test(url) || /(webp|svg|png|gif|jpg|jpeg|bmp|dpg|ico)$/i.test(extension)) {
2019-01-12 03:33:27 +00:00
return true;
} else if (/^data:/.test(url)) {
// other file types of base64
return false;
} else if (extension) {
// other file types which have extension
return false;
update to antd3.8.3 (#159) * refactor: align * feat: update align to 2.4.3 * feat: update trigger 2.5.4 * feat: update tooltip 3.7.2 * fix: align * feat: update vc-calendar to 9.6.2 * feat: update vc-checkbox to 2.1.5 * feat: update vc-dialog to 7.1.8 * feat: update vc-from to 2.2.1 * feat: update vc-notification to 3.1.1 * test: update snapshots * feat: update vc-tree to 1.12.6 * feat: update vc-table to 6.2.8 * feat: update vc-upload to 2.5.1 * feat: update vc-input-number to 4.0.12 * feat: update vc-tabs to 9.2.6 * refactor: vc-menu * refactor: update vc-menu to 7.0.5 * style: remove unused * feat: update pagination to 1.16.5 * feat: add vc-progress 2.2.5 tag * feat: add vc-rate 2.4.0 tag * feat: update vc-slider to 8.6.1 * fix: tooltip error * style: delete conosle * feat: update vc-steps to 3.1.1 * add vc-switch tag 1.6.0 * feat: update upload to 2.5.1 * fix: update vc-menu * fix: update store * fix: add ref dir * fix: trigger mock shouldComponentUpdate * fix: update vc-select * revert: trigger lazyrenderbox * fix: update vc-select * fix: update vc-select * fix: update vc-select * fix: update vc-menu * fix: update vc-slick ref * update style to 3.8.2 * test: update snapshots * update vc-select * update util & affix * feat: add drawer * fix: support title add slot mode * test: update affix test * update alert * update anchor * update snapshots * fix: doc and vc-drawer * update select & auto-complete * update back-top & grid * feractor: avatar * test: add drawer test * update badge * update button * update card * update divider * feat: update vc-tabs to 9.3.6 and tabs * add afterEnter callback * update form * fix: update drawer * test: update snapshots * update modal & notification * test: update snapshots * update message * update locale-provider * update dropdown * update layout popconfirm popover * update time-picker * update menu * update date-picker * docs: update input docs * update input * update snapshots * update table * update test snapshots * feat: update progress * update checkbox * feat: update spin * update radio * docs: slider steps timeline * update list * update transfer * update collapse * update cascader * update upload
2018-09-05 13:28:54 +00:00
}
2019-01-12 03:33:27 +00:00
return true;
};
2018-04-13 08:19:50 +00:00
export default {
name: 'AUploadList',
mixins: [BaseMixin],
props: initDefaultProps(UploadListProps, {
listType: 'text', // or picture
progressAttr: {
strokeWidth: 2,
showInfo: false,
},
showRemoveIcon: true,
showPreviewIcon: true,
}),
2019-03-28 11:51:27 +00:00
inject: {
2019-09-11 14:35:25 +00:00
configProvider: { default: () => ConfigConsumerProps },
2019-03-28 11:51:27 +00:00
},
2019-01-12 03:33:27 +00:00
updated() {
2018-04-13 08:19:50 +00:00
this.$nextTick(() => {
if (this.listType !== 'picture' && this.listType !== 'picture-card') {
2019-01-12 03:33:27 +00:00
return;
2018-04-13 08:19:50 +00:00
}
(this.items || []).forEach(file => {
2019-01-12 03:33:27 +00:00
if (
typeof document === 'undefined' ||
typeof window === 'undefined' ||
!window.FileReader ||
!window.File ||
!(file.originFileObj instanceof window.File) ||
file.thumbUrl !== undefined
) {
return;
2018-04-13 08:19:50 +00:00
}
/*eslint-disable */
file.thumbUrl = '';
/*eslint -enable */
2019-01-12 03:33:27 +00:00
previewFile(file.originFileObj, previewDataUrl => {
2018-04-13 08:19:50 +00:00
/*eslint-disable */
file.thumbUrl = previewDataUrl;
/*eslint -enable todo */
// this.forceUpdate()
2019-01-12 03:33:27 +00:00
});
});
});
2018-04-13 08:19:50 +00:00
},
methods: {
2019-01-12 03:33:27 +00:00
handleClose(file) {
this.$emit('remove', file);
2018-04-13 08:19:50 +00:00
},
2019-01-12 03:33:27 +00:00
handlePreview(file, e) {
const { preview } = this.$listeners;
if (!preview) {
return;
2018-07-03 02:22:03 +00:00
}
2019-01-12 03:33:27 +00:00
e.preventDefault();
return this.$emit('preview', file);
2018-04-13 08:19:50 +00:00
},
},
2019-01-12 03:33:27 +00:00
render() {
const {
2019-03-28 11:51:27 +00:00
prefixCls: customizePrefixCls,
2019-01-12 03:33:27 +00:00
items = [],
listType,
showPreviewIcon,
showRemoveIcon,
locale,
} = getOptionProps(this);
2019-09-11 14:35:25 +00:00
const getPrefixCls = this.configProvider.getPrefixCls;
2019-03-28 11:51:27 +00:00
const prefixCls = getPrefixCls('upload', customizePrefixCls);
2018-04-13 08:19:50 +00:00
const list = items.map(file => {
2019-01-12 03:33:27 +00:00
let progress;
let icon = <Icon type={file.status === 'uploading' ? 'loading' : 'paper-clip'} />;
2018-04-13 08:19:50 +00:00
if (listType === 'picture' || listType === 'picture-card') {
if (listType === 'picture-card' && file.status === 'uploading') {
2019-01-12 03:33:27 +00:00
icon = <div class={`${prefixCls}-list-item-uploading-text`}>{locale.uploading}</div>;
2018-04-13 08:19:50 +00:00
} else if (!file.thumbUrl && !file.url) {
2019-01-12 03:33:27 +00:00
icon = <Icon class={`${prefixCls}-list-item-thumbnail`} type="picture" theme="twoTone" />;
2018-04-13 08:19:50 +00:00
} else {
update to antd3.8.3 (#159) * refactor: align * feat: update align to 2.4.3 * feat: update trigger 2.5.4 * feat: update tooltip 3.7.2 * fix: align * feat: update vc-calendar to 9.6.2 * feat: update vc-checkbox to 2.1.5 * feat: update vc-dialog to 7.1.8 * feat: update vc-from to 2.2.1 * feat: update vc-notification to 3.1.1 * test: update snapshots * feat: update vc-tree to 1.12.6 * feat: update vc-table to 6.2.8 * feat: update vc-upload to 2.5.1 * feat: update vc-input-number to 4.0.12 * feat: update vc-tabs to 9.2.6 * refactor: vc-menu * refactor: update vc-menu to 7.0.5 * style: remove unused * feat: update pagination to 1.16.5 * feat: add vc-progress 2.2.5 tag * feat: add vc-rate 2.4.0 tag * feat: update vc-slider to 8.6.1 * fix: tooltip error * style: delete conosle * feat: update vc-steps to 3.1.1 * add vc-switch tag 1.6.0 * feat: update upload to 2.5.1 * fix: update vc-menu * fix: update store * fix: add ref dir * fix: trigger mock shouldComponentUpdate * fix: update vc-select * revert: trigger lazyrenderbox * fix: update vc-select * fix: update vc-select * fix: update vc-select * fix: update vc-menu * fix: update vc-slick ref * update style to 3.8.2 * test: update snapshots * update vc-select * update util & affix * feat: add drawer * fix: support title add slot mode * test: update affix test * update alert * update anchor * update snapshots * fix: doc and vc-drawer * update select & auto-complete * update back-top & grid * feractor: avatar * test: add drawer test * update badge * update button * update card * update divider * feat: update vc-tabs to 9.3.6 and tabs * add afterEnter callback * update form * fix: update drawer * test: update snapshots * update modal & notification * test: update snapshots * update message * update locale-provider * update dropdown * update layout popconfirm popover * update time-picker * update menu * update date-picker * docs: update input docs * update input * update snapshots * update table * update test snapshots * feat: update progress * update checkbox * feat: update spin * update radio * docs: slider steps timeline * update list * update transfer * update collapse * update cascader * update upload
2018-09-05 13:28:54 +00:00
const thumbnail = isImageUrl(file) ? (
2018-04-13 08:19:50 +00:00
<img src={file.thumbUrl || file.url} alt={file.name} />
) : (
<Icon type="file" class={`${prefixCls}-list-item-icon`} theme="twoTone" />
2019-01-12 03:33:27 +00:00
);
2018-04-13 08:19:50 +00:00
icon = (
<a
class={`${prefixCls}-list-item-thumbnail`}
onClick={e => this.handlePreview(file, e)}
href={file.url || file.thumbUrl}
2019-01-12 03:33:27 +00:00
target="_blank"
rel="noopener noreferrer"
2018-04-13 08:19:50 +00:00
>
{thumbnail}
</a>
2019-01-12 03:33:27 +00:00
);
2018-04-13 08:19:50 +00:00
}
}
if (file.status === 'uploading') {
const progressProps = {
props: {
...this.progressAttr,
type: 'line',
percent: file.percent,
2019-01-12 03:33:27 +00:00
},
};
2018-04-13 08:19:50 +00:00
// show loading icon if upload progress listener is disabled
2019-01-12 03:33:27 +00:00
const loadingProgress = 'percent' in file ? <Progress {...progressProps} /> : null;
2018-04-13 08:19:50 +00:00
progress = (
2019-01-12 03:33:27 +00:00
<div class={`${prefixCls}-list-item-progress`} key="progress">
2018-04-13 08:19:50 +00:00
{loadingProgress}
</div>
2019-01-12 03:33:27 +00:00
);
2018-04-13 08:19:50 +00:00
}
const infoUploadingClass = classNames({
[`${prefixCls}-list-item`]: true,
[`${prefixCls}-list-item-${file.status}`]: true,
2019-01-12 03:33:27 +00:00
});
const linkProps =
typeof file.linkProps === 'string' ? JSON.parse(file.linkProps) : file.linkProps;
2018-04-13 08:19:50 +00:00
const preview = file.url ? (
<a
2019-01-12 03:33:27 +00:00
target="_blank"
rel="noopener noreferrer"
2018-04-13 08:19:50 +00:00
class={`${prefixCls}-list-item-name`}
title={file.name}
2018-12-05 10:31:58 +00:00
{...linkProps}
href={file.url}
onClick={e => this.handlePreview(file, e)}
2018-04-13 08:19:50 +00:00
>
{file.name}
</a>
) : (
<span
class={`${prefixCls}-list-item-name`}
onClick={e => this.handlePreview(file, e)}
title={file.name}
>
{file.name}
</span>
2019-01-12 03:33:27 +00:00
);
const style =
file.url || file.thumbUrl
? undefined
: {
pointerEvents: 'none',
opacity: 0.5,
};
2018-04-13 08:19:50 +00:00
const previewIcon = showPreviewIcon ? (
<a
href={file.url || file.thumbUrl}
2019-01-12 03:33:27 +00:00
target="_blank"
rel="noopener noreferrer"
2018-04-13 08:19:50 +00:00
style={style}
onClick={e => this.handlePreview(file, e)}
title={locale.previewFile}
>
2019-01-12 03:33:27 +00:00
<Icon type="eye-o" />
2018-04-13 08:19:50 +00:00
</a>
2019-01-12 03:33:27 +00:00
) : null;
2018-04-13 08:19:50 +00:00
const iconProps = {
props: {
type: 'delete',
title: locale.removeFile,
},
on: {
click: () => {
2019-01-12 03:33:27 +00:00
this.handleClose(file);
},
2018-04-13 08:19:50 +00:00
},
2019-01-12 03:33:27 +00:00
};
const iconProps1 = { ...iconProps, ...{ props: { type: 'close' } } };
const removeIcon = showRemoveIcon ? <Icon {...iconProps} /> : null;
const removeIconClose = showRemoveIcon ? <Icon {...iconProps1} /> : null;
const actions =
listType === 'picture-card' && file.status !== 'uploading' ? (
<span class={`${prefixCls}-list-item-actions`}>
{previewIcon}
{removeIcon}
</span>
) : (
removeIconClose
);
let message;
2018-04-13 08:19:50 +00:00
if (file.response && typeof file.response === 'string') {
2019-01-12 03:33:27 +00:00
message = file.response;
2018-04-13 08:19:50 +00:00
} else {
2019-01-12 03:33:27 +00:00
message = (file.error && file.error.statusText) || locale.uploadError;
2018-04-13 08:19:50 +00:00
}
2019-01-12 03:33:27 +00:00
const iconAndPreview =
file.status === 'error' ? (
<Tooltip title={message}>
{icon}
{preview}
</Tooltip>
) : (
<span>
{icon}
{preview}
</span>
);
const transitionProps = getTransitionProps('fade');
2018-04-13 08:19:50 +00:00
return (
<div class={infoUploadingClass} key={file.uid}>
2019-01-12 03:33:27 +00:00
<div class={`${prefixCls}-list-item-info`}>{iconAndPreview}</div>
2018-04-13 08:19:50 +00:00
{actions}
2019-01-12 03:33:27 +00:00
<transition {...transitionProps}>{progress}</transition>
2018-04-13 08:19:50 +00:00
</div>
2019-01-12 03:33:27 +00:00
);
});
2018-04-13 08:19:50 +00:00
const listClassNames = classNames({
[`${prefixCls}-list`]: true,
[`${prefixCls}-list-${listType}`]: true,
2019-01-12 03:33:27 +00:00
});
const animationDirection = listType === 'picture-card' ? 'animate-inline' : 'animate';
const transitionGroupProps = getTransitionProps(`${prefixCls}-${animationDirection}`);
2018-04-13 08:19:50 +00:00
return (
2019-01-12 03:33:27 +00:00
<transition-group {...transitionGroupProps} tag="div" class={listClassNames}>
2018-04-13 08:19:50 +00:00
{list}
</transition-group>
2019-01-12 03:33:27 +00:00
);
2018-04-13 08:19:50 +00:00
},
2019-01-12 03:33:27 +00:00
};