mirror of
https://gitee.com/x-extends/vxe-table-plugin-export-xlsx.git
synced 2026-01-21 05:21:33 +08:00
283 lines
28 KiB
JavaScript
283 lines
28 KiB
JavaScript
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports["default"] = exports.VXETablePluginExportXLSX = void 0;
|
|
|
|
var _xeUtils = _interopRequireDefault(require("xe-utils/methods/xe-utils"));
|
|
|
|
var _xlsx = _interopRequireDefault(require("xlsx"));
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
|
|
function toBuffer(wbout) {
|
|
var buf = new ArrayBuffer(wbout.length);
|
|
var view = new Uint8Array(buf);
|
|
|
|
for (var index = 0; index !== wbout.length; ++index) {
|
|
view[index] = wbout.charCodeAt(index) & 0xFF;
|
|
}
|
|
|
|
return buf;
|
|
}
|
|
|
|
function exportXLSX(params) {
|
|
var $table = params.$table,
|
|
options = params.options,
|
|
columns = params.columns,
|
|
datas = params.datas;
|
|
var sheetName = options.sheetName,
|
|
type = options.type,
|
|
isHeader = options.isHeader,
|
|
isFooter = options.isFooter,
|
|
original = options.original,
|
|
message = options.message,
|
|
footerFilterMethod = options.footerFilterMethod;
|
|
var colHead = {};
|
|
var footList = [];
|
|
|
|
if (isHeader) {
|
|
columns.forEach(function (column) {
|
|
colHead[column.id] = _xeUtils["default"].toString(original ? column.property : column.getTitle());
|
|
});
|
|
}
|
|
|
|
var rowList = datas.map(function (row, rowIndex) {
|
|
var item = {};
|
|
columns.forEach(function (column, columnIndex) {
|
|
var cellValue;
|
|
var property = column.property;
|
|
var isIndex = column.type === 'index';
|
|
|
|
if (!original || isIndex) {
|
|
cellValue = isIndex ? column.indexMethod ? column.indexMethod({
|
|
row: row,
|
|
rowIndex: rowIndex,
|
|
column: column,
|
|
columnIndex: columnIndex
|
|
}) : rowIndex + 1 : row[column.id];
|
|
} else {
|
|
cellValue = _xeUtils["default"].get(row, property);
|
|
}
|
|
|
|
item[column.id] = cellValue;
|
|
});
|
|
return item;
|
|
});
|
|
|
|
if (isFooter) {
|
|
var footerData = $table.footerData;
|
|
var footers = footerFilterMethod ? footerData.filter(footerFilterMethod) : footerData;
|
|
footers.forEach(function (rows) {
|
|
var item = {};
|
|
columns.forEach(function (column) {
|
|
item[column.id] = rows[$table.getColumnIndex(column)] || '';
|
|
});
|
|
footList.push(item);
|
|
});
|
|
}
|
|
|
|
var book = _xlsx["default"].utils.book_new();
|
|
|
|
var sheet = _xlsx["default"].utils.json_to_sheet((isHeader ? [colHead] : []).concat(rowList).concat(footList), {
|
|
skipHeader: true
|
|
}); // 转换数据
|
|
|
|
|
|
_xlsx["default"].utils.book_append_sheet(book, sheet, sheetName);
|
|
|
|
var wbout = _xlsx["default"].write(book, {
|
|
bookType: type,
|
|
bookSST: false,
|
|
type: 'binary'
|
|
});
|
|
|
|
var blob = new Blob([toBuffer(wbout)], {
|
|
type: 'application/octet-stream'
|
|
}); // 保存导出
|
|
|
|
downloadFile(blob, options);
|
|
|
|
if (message !== false) {
|
|
$table.$XModal.message({
|
|
message: i18n('vxe.table.expSuccess'),
|
|
status: 'success'
|
|
});
|
|
}
|
|
}
|
|
|
|
function downloadFile(blob, options) {
|
|
if (window.Blob) {
|
|
var filename = options.filename,
|
|
type = options.type;
|
|
|
|
if (navigator.msSaveBlob) {
|
|
navigator.msSaveBlob(blob, "".concat(filename, ".").concat(type));
|
|
} else {
|
|
var linkElem = document.createElement('a');
|
|
linkElem.target = '_blank';
|
|
linkElem.download = "".concat(filename, ".").concat(type);
|
|
linkElem.href = URL.createObjectURL(blob);
|
|
document.body.appendChild(linkElem);
|
|
linkElem.click();
|
|
document.body.removeChild(linkElem);
|
|
}
|
|
} else {
|
|
console.error(i18n('vxe.error.notExp'));
|
|
}
|
|
}
|
|
|
|
function replaceDoubleQuotation(val) {
|
|
return val.replace(/^"/, '').replace(/"$/, '');
|
|
}
|
|
|
|
function parseCsv(columns, content) {
|
|
var list = content.split('\n');
|
|
var fields = [];
|
|
var rows = [];
|
|
|
|
if (list.length) {
|
|
var rList = list.slice(1);
|
|
list[0].split(',').forEach(function (val) {
|
|
var field = replaceDoubleQuotation(val);
|
|
|
|
if (field) {
|
|
fields.push(field);
|
|
}
|
|
});
|
|
rList.forEach(function (r) {
|
|
if (r) {
|
|
var item = {};
|
|
r.split(',').forEach(function (val, colIndex) {
|
|
item[fields[colIndex]] = replaceDoubleQuotation(val);
|
|
});
|
|
rows.push(item);
|
|
}
|
|
});
|
|
}
|
|
|
|
return {
|
|
fields: fields,
|
|
rows: rows
|
|
};
|
|
}
|
|
|
|
function checkImportData(columns, fields, rows) {
|
|
var tableFields = [];
|
|
columns.forEach(function (column) {
|
|
var field = column.property;
|
|
|
|
if (field) {
|
|
tableFields.push(field);
|
|
}
|
|
});
|
|
return tableFields.every(function (field) {
|
|
return fields.includes(field);
|
|
});
|
|
}
|
|
|
|
function importXLSX(params) {
|
|
var $table = params.$table,
|
|
columns = params.columns,
|
|
options = params.options,
|
|
file = params.file;
|
|
var _importCallback = $table._importCallback,
|
|
_importResolve = $table._importResolve;
|
|
var fileReader = new FileReader();
|
|
|
|
fileReader.onload = function (e) {
|
|
var workbook = _xlsx["default"].read(e.target.result, {
|
|
type: 'binary'
|
|
});
|
|
|
|
var csvData = _xlsx["default"].utils.sheet_to_csv(workbook.Sheets.Sheet1);
|
|
|
|
var rest = parseCsv(columns, csvData);
|
|
var fields = rest.fields,
|
|
rows = rest.rows;
|
|
var status = checkImportData(columns, fields, rows);
|
|
|
|
if (status) {
|
|
$table.createData(rows).then(function (data) {
|
|
if (options.mode === 'append') {
|
|
$table.insertAt(data, -1);
|
|
} else {
|
|
$table.reloadData(data);
|
|
}
|
|
});
|
|
|
|
if (options.message !== false) {
|
|
$table.$XModal.message({
|
|
message: i18n('vxe.table.impSuccess'),
|
|
status: 'success'
|
|
});
|
|
}
|
|
} else if (options.message !== false) {
|
|
$table.$XModal.message({
|
|
message: i18n('vxe.error.impFields'),
|
|
status: 'error'
|
|
});
|
|
}
|
|
|
|
if (_importResolve) {
|
|
_importResolve(status);
|
|
|
|
$table._importResolve = null;
|
|
} else if (_importCallback) {
|
|
// 已废弃
|
|
_importCallback(status);
|
|
|
|
$table._importCallback = null;
|
|
}
|
|
};
|
|
|
|
fileReader.readAsBinaryString(file);
|
|
}
|
|
|
|
function handleImportEvent(params) {
|
|
if (params.options.type === 'xlsx') {
|
|
importXLSX(params);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function handleExportEvent(params) {
|
|
if (params.options.type === 'xlsx') {
|
|
exportXLSX(params);
|
|
return false;
|
|
}
|
|
}
|
|
/**
|
|
* 基于 vxe-table 表格的增强插件,支持导出 xlsx 格式
|
|
*/
|
|
|
|
|
|
var VXETablePluginExportXLSX = {
|
|
install: function install(xtable) {
|
|
Object.assign(xtable.types, {
|
|
xlsx: 1
|
|
});
|
|
xtable.interceptor.mixin({
|
|
'event.import': handleImportEvent,
|
|
'event.export': handleExportEvent
|
|
});
|
|
VXETablePluginExportXLSX.t = xtable.t;
|
|
}
|
|
};
|
|
exports.VXETablePluginExportXLSX = VXETablePluginExportXLSX;
|
|
|
|
function i18n(key) {
|
|
if (VXETablePluginExportXLSX.t) {
|
|
return VXETablePluginExportXLSX.t(key);
|
|
}
|
|
}
|
|
|
|
if (typeof window !== 'undefined' && window.VXETable) {
|
|
window.VXETable.use(VXETablePluginExportXLSX);
|
|
}
|
|
|
|
var _default = VXETablePluginExportXLSX;
|
|
exports["default"] = _default;
|
|
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LnRzIl0sIm5hbWVzIjpbInRvQnVmZmVyIiwid2JvdXQiLCJidWYiLCJBcnJheUJ1ZmZlciIsImxlbmd0aCIsInZpZXciLCJVaW50OEFycmF5IiwiaW5kZXgiLCJjaGFyQ29kZUF0IiwiZXhwb3J0WExTWCIsInBhcmFtcyIsIiR0YWJsZSIsIm9wdGlvbnMiLCJjb2x1bW5zIiwiZGF0YXMiLCJzaGVldE5hbWUiLCJ0eXBlIiwiaXNIZWFkZXIiLCJpc0Zvb3RlciIsIm9yaWdpbmFsIiwibWVzc2FnZSIsImZvb3RlckZpbHRlck1ldGhvZCIsImNvbEhlYWQiLCJmb290TGlzdCIsImZvckVhY2giLCJjb2x1bW4iLCJpZCIsIlhFVXRpbHMiLCJ0b1N0cmluZyIsInByb3BlcnR5IiwiZ2V0VGl0bGUiLCJyb3dMaXN0IiwibWFwIiwicm93Iiwicm93SW5kZXgiLCJpdGVtIiwiY29sdW1uSW5kZXgiLCJjZWxsVmFsdWUiLCJpc0luZGV4IiwiaW5kZXhNZXRob2QiLCJnZXQiLCJmb290ZXJEYXRhIiwiZm9vdGVycyIsImZpbHRlciIsInJvd3MiLCJnZXRDb2x1bW5JbmRleCIsInB1c2giLCJib29rIiwiWExTWCIsInV0aWxzIiwiYm9va19uZXciLCJzaGVldCIsImpzb25fdG9fc2hlZXQiLCJjb25jYXQiLCJza2lwSGVhZGVyIiwiYm9va19hcHBlbmRfc2hlZXQiLCJ3cml0ZSIsImJvb2tUeXBlIiwiYm9va1NTVCIsImJsb2IiLCJCbG9iIiwiZG93bmxvYWRGaWxlIiwiJFhNb2RhbCIsImkxOG4iLCJzdGF0dXMiLCJ3aW5kb3ciLCJmaWxlbmFtZSIsIm5hdmlnYXRvciIsIm1zU2F2ZUJsb2IiLCJsaW5rRWxlbSIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInRhcmdldCIsImRvd25sb2FkIiwiaHJlZiIsIlVSTCIsImNyZWF0ZU9iamVjdFVSTCIsImJvZHkiLCJhcHBlbmRDaGlsZCIsImNsaWNrIiwicmVtb3ZlQ2hpbGQiLCJjb25zb2xlIiwiZXJyb3IiLCJyZXBsYWNlRG91YmxlUXVvdGF0aW9uIiwidmFsIiwicmVwbGFjZSIsInBhcnNlQ3N2IiwiY29udGVudCIsImxpc3QiLCJzcGxpdCIsImZpZWxkcyIsInJMaXN0Iiwic2xpY2UiLCJmaWVsZCIsInIiLCJjb2xJbmRleCIsImNoZWNrSW1wb3J0RGF0YSIsInRhYmxlRmllbGRzIiwiZXZlcnkiLCJpbmNsdWRlcyIsImltcG9ydFhMU1giLCJmaWxlIiwiX2ltcG9ydENhbGxiYWNrIiwiX2ltcG9ydFJlc29sdmUiLCJmaWxlUmVhZGVyIiwiRmlsZVJlYWRlciIsIm9ubG9hZCIsImUiLCJ3b3JrYm9vayIsInJlYWQiLCJyZXN1bHQiLCJjc3ZEYXRhIiwic2hlZXRfdG9fY3N2IiwiU2hlZXRzIiwiU2hlZXQxIiwicmVzdCIsImNyZWF0ZURhdGEiLCJ0aGVuIiwiZGF0YSIsIm1vZGUiLCJpbnNlcnRBdCIsInJlbG9hZERhdGEiLCJyZWFkQXNCaW5hcnlTdHJpbmciLCJoYW5kbGVJbXBvcnRFdmVudCIsImhhbmRsZUV4cG9ydEV2ZW50IiwiVlhFVGFibGVQbHVnaW5FeHBvcnRYTFNYIiwiaW5zdGFsbCIsInh0YWJsZSIsIk9iamVjdCIsImFzc2lnbiIsInR5cGVzIiwieGxzeCIsImludGVyY2VwdG9yIiwibWl4aW4iLCJ0Iiwia2V5IiwiVlhFVGFibGUiLCJ1c2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFFQTs7OztBQUVBLFNBQVNBLFFBQVQsQ0FBa0JDLEtBQWxCLEVBQTRCO0FBQzFCLE1BQUlDLEdBQUcsR0FBRyxJQUFJQyxXQUFKLENBQWdCRixLQUFLLENBQUNHLE1BQXRCLENBQVY7QUFDQSxNQUFJQyxJQUFJLEdBQUcsSUFBSUMsVUFBSixDQUFlSixHQUFmLENBQVg7O0FBQ0EsT0FBSyxJQUFJSyxLQUFLLEdBQUcsQ0FBakIsRUFBb0JBLEtBQUssS0FBS04sS0FBSyxDQUFDRyxNQUFwQyxFQUE0QyxFQUFFRyxLQUE5QztBQUFxREYsSUFBQUEsSUFBSSxDQUFDRSxLQUFELENBQUosR0FBY04s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LENBQUNHLEtBQXJCLEVBQTRCO0FBQUVDLE1BQUFBLElBQUksRUFBRTtBQUFSLEtBQTVCO0FBQ0FKLElBQUFBLE1BQU0sQ0FBQ0ssV0FBUCxDQUFtQkMsS0FBbkIsQ0FBeUI7QUFDdkIsc0JBQWdCVixpQkFETztBQUV2QixzQkFBZ0JDO0FBRk8sS0FBekI7QUFJQUMsSUFBQUEsd0JBQXdCLENBQUNTLENBQXpCLEdBQTZCUCxNQUFNLENBQUNPLENBQXBDO0FBQ0Q7QUFSMEMsQ0FBdEM7OztBQVdQLFNBQVN2RSxJQUFULENBQWN3RSxHQUFkLEVBQXlCO0FBQ3ZCLE1BQUlWLHdCQUF3QixDQUFDUyxDQUE3QixFQUFnQztBQUM5QixXQUFPVCx3QkFBd0IsQ0FBQ1MsQ0FBekIsQ0FBMkJDLEdBQTNCLENBQVA7QUFDRDtBQUNGOztBQUVELElBQUksT0FBT3RFLE1BQVAsS0FBa0IsV0FBbEIsSUFBaUNBLE1BQU0sQ0FBQ3VFLFFBQTVDLEVBQXNEO0FBQ3BEdkUsRUFBQUEsTUFBTSxDQUFDdUUsUUFBUCxDQUFnQkMsR0FBaEIsQ0FBb0JaLHdCQUFwQjtBQUNEOztlQUVjQSx3QiIsImZpbGUiOiJpbmRleC5jb21tb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgWEVVdGlscyBmcm9tICd4ZS11dGlscy9tZXRob2RzL3hlLXV0aWxzJ1xyXG5pbXBvcnQgVlhFVGFibGUgZnJvbSAndnhlLXRhYmxlL2xpYi92eGUtdGFibGUnXHJcbmltcG9ydCBYTFNYIGZyb20gJ3hsc3gnXHJcblxyXG5mdW5jdGlvbiB0b0J1ZmZlcih3Ym91dDogYW55KSB7XHJcbiAgbGV0IGJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcih3Ym91dC5sZW5ndGgpXHJcbiAgbGV0IHZpZXcgPSBuZXcgVWludDhBcnJheShidWYpXHJcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCAhPT0gd2JvdXQubGVuZ3RoOyArK2luZGV4KSB2aWV3W2luZGV4XSA9IHdib3V0LmNoYXJDb2RlQXQoaW5kZXgpICYgMHhGRlxyXG4gIHJldHVybiBidWZcclxufVxyXG5cclxuZnVuY3Rpb24gZXhwb3J0WExTWChwYXJhbXM6IGFueSkge1xyXG4gIGNvbnN0IHsgJHRhYmxlLCBvcHRpb25zLCBjb2x1bW5zLCBkYXRhcyB9ID0gcGFyYW1zXHJcbiAgY29uc3QgeyBzaGVldE5hbWUsIHR5cGUsIGlzSGVhZGVyLCBpc0Zvb3Rlciwgb3JpZ2luYWwsIG1lc3NhZ2UsIGZvb3RlckZpbHRlck1ldGhvZCB9ID0gb3B0aW9uc1xyXG4gIGNvbnN0IGNvbEhlYWQ6IGFueSA9IHt9XHJcbiAgY29uc3QgZm9vdExpc3Q6IGFueVtdID0gW11cclxuICBpZiAoaXNIZWFkZXIpIHtcclxuICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBhbnkpID0+IHtcclxuICAgICAgY29sSGVhZFtjb2x1bW4uaWRdID0gWEVVdGlscy50b1N0cmluZyhvcmlnaW5hbCA/IGNvbHVtbi5wcm9wZXJ0eSA6IGNvbHVtbi5nZXRUaXRsZSgpKVxyXG4gICAgfSlcclxuICB9XHJcbiAgY29uc3Qgcm93TGlzdDogYW55W10gPSBkYXRhcy5tYXAoKHJvdzogYW55LCByb3dJbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICBjb25zdCBpdGVtOiBhbnkgPSB7fVxyXG4gICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IGFueSwgY29sdW1uSW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICBsZXQgY2VsbFZhbHVlXHJcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gY29sdW1uLnByb3BlcnR5XHJcbiAgICAgIGNvbnN0IGlzSW5kZXggPSBjb2x1bW4udHlwZSA9PT0gJ2luZGV4J1xyXG4gICAgICBpZiAoIW9yaWdpbmFsIHx8IGlzSW5kZXgpIHtcclxuICAgICAgICBjZWxsVmFsdWUgPSBpc0luZGV4ID8gKGNvbHVtbi5pbmRleE1ldGhvZCA/IGNvbHVtbi5pbmRleE1ldGhvZCh7IHJvdywgcm93SW5kZXgsIGNvbHVtbiwgY29sdW1uSW5kZXggfSkgOiByb3dJbmRleCArIDEpIDogcm93W2NvbHVtbi5pZF1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjZWxsVmFsdWUgPSBYRVV0aWxzLmdldChyb3csIHByb3BlcnR5KVxyXG4gICAgICB9XHJcbiAgICAgIGl0ZW1bY29sdW1uLmlkXSA9IGNlbGxWYWx1ZVxyXG4gICAgfSlcclxuICAgIHJldHVybiBpdGVtXHJcbiAgfSlcclxuICBpZiAoaXNGb290ZXIpIHtcclxuICAgIGNvbnN0IGZvb3RlckRhdGE6IGFueVtdID0gJHRhYmxlLmZvb3RlckRhdGFcclxuICAgIGNvbnN0IGZvb3RlcnM6IGFueVtdID0gZm9vdGVyRmlsdGVyTWV0aG9kID8gZm9vdGVyRGF0YS5maWx0ZXIoZm9vdGVyRmlsdGVyTWV0aG9kKSA6IGZvb3RlckRhdGFcclxuICAgIGZvb3RlcnMuZm9yRWFjaCgocm93czogYW55W10pID0+IHtcclxuICAgICAgY29uc3QgaXRlbTogYW55ID0ge31cclxuICAgICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW46IGFueSkgPT4ge1xyXG4gICAgICAgIGl0ZW1bY29sdW1uLmlkXSA9IHJvd3NbJHRhYmxlLmdldENvbHVtbkluZGV4KGNvbHVtbildIHx8ICcnXHJcbiAgICAgIH0pXHJcbiAgICAgIGZvb3RMaXN0LnB1c2goaXRlbSlcclxuICAgIH0pXHJcbiAgfVxyXG4gIGNvbnN0IGJvb2sgPSBYTFNYLnV0aWxzLmJvb2tfbmV3KClcclxuICBjb25zdCBzaGVldCA9IFhMU1gudXRpbHMuanNvbl90b19zaGVldCgoaXNIZWFkZXIgPyBbY29sSGVhZF0gOiBbXSkuY29uY2F0KHJvd0xpc3QpLmNvbmNhdChmb290TGlzdCksIHsgc2tpcEhlYWRlcjogdHJ1ZSB9KVxyXG4gIC8vIOi9rOaNouaVsOaNrlxyXG4gIFhMU1gudXRpbHMuYm9va19hcHBlbmRfc2hlZXQoYm9vaywgc2hlZXQsIHNoZWV0TmFtZSlcclxuICBjb25zdCB3Ym91dCA9IFhMU1gud3JpdGUoYm9vaywgeyBib29rVHlwZTogdHlwZSwgYm9va1NTVDogZmFsc2UsIHR5cGU6ICdiaW5hcnknIH0pXHJcbiAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFt0b0J1ZmZlcih3Ym91dCldLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0pXHJcbiAgLy8g5L+d5a2Y5a+85Ye6XHJcbiAgZG93bmxvYWRGaWxlKGJsb2IsIG9wdGlvbnMpXHJcbiAgaWYgKG1lc3NhZ2UgIT09IGZhbHNlKSB7XHJcbiAgICAkdGFibGUuJFhNb2RhbC5tZXNzYWdlKHsgbWVzc2FnZTogaTE4bigndnhlLnRhYmxlLmV4cFN1Y2Nlc3MnKSwgc3RhdHVzOiAnc3VjY2VzcycgfSlcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRvd25sb2FkRmlsZShibG9iOiBCbG9iLCBvcHRpb25zOiBhbnkpIHtcclxuICBpZiAod2luZG93LkJsb2IpIHtcclxuICAgIGNvbnN0IHsgZmlsZW5hbWUsIHR5cGUgfSA9IG9wdGlvbnNcclxuICAgIGlmIChuYXZpZ2F0b3IubXNTYXZlQmxvYikge1xyXG4gICAgICBuYXZpZ2F0b3IubXNTYXZlQmxvYihibG9iLCBgJHtmaWxlbmFtZX0uJHt0eXBlfWApXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YXIgbGlua0VsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcclxuICAgICAgbGlua0VsZW0udGFyZ2V0ID0gJ19ibGFuaydcclxuICAgICAgbGlua0VsZW0uZG93bmxvYWQgPSBgJHtmaWxlbmFtZX0uJHt0eXBlfWBcclxuICAgICAgbGlua0VsZW0uaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYilcclxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rRWxlbSlcclxuICAgICAgbGlua0VsZW0uY2xpY2soKVxyXG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmtFbGVtKVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjb25zb2xlLmVycm9yKGkxOG4oJ3Z4ZS5lcnJvci5ub3RFeHAnKSlcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlcGxhY2VEb3VibGVRdW90YXRpb24odmFsOiBzdHJpbmcpIHtcclxuICByZXR1cm4gdmFsLnJlcGxhY2UoL15cIi8sICcnKS5yZXBsYWNlKC9cIiQvLCAnJylcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VDc3YoY29sdW1uczogYW55W10sIGNvbnRlbnQ6IHN0cmluZykge1xyXG4gIGNvbnN0IGxpc3Q6IHN0cmluZ1tdID0gY29udGVudC5zcGxpdCgnXFxuJylcclxuICBjb25zdCBmaWVsZHM6IGFueVtdID0gW11cclxuICBjb25zdCByb3dzOiBhbnlbXSA9IFtdXHJcbiAgaWYgKGxpc3QubGVuZ3RoKSB7XHJcbiAgICBjb25zdCByTGlzdDogc3RyaW5nW10gPSBsaXN0LnNsaWNlKDEpXHJcbiAgICBsaXN0WzBdLnNwbGl0KCcsJykuZm9yRWFjaCgodmFsOiBzdHJpbmcpID0+IHtcclxuICAgICAgY29uc3QgZmllbGQ6IHN0cmluZyA9IHJlcGxhY2VEb3VibGVRdW90YXRpb24odmFsKVxyXG4gICAgICBpZiAoZmllbGQpIHtcclxuICAgICAgICBmaWVsZHMucHVzaChmaWVsZClcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIHJMaXN0LmZvckVhY2goKHI6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAocikge1xyXG4gICAgICAgIGNvbnN0IGl0ZW06IGFueSA9IHt9XHJcbiAgICAgICAgci5zcGxpdCgnLCcpLmZvckVhY2goKHZhbDogc3RyaW5nLCBjb2xJbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICBpdGVtW2ZpZWxkc1tjb2xJbmRleF1dID0gcmVwbGFjZURvdWJsZVF1b3RhdGlvbih2YWwpXHJcbiAgICAgICAgfSlcclxuICAgICAgICByb3dzLnB1c2goaXRlbSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbiAgcmV0dXJuIHsgZmllbGRzLCByb3dzIH1cclxufVxyXG5cclxuZnVuY3Rpb24gY2hlY2tJbXBvcnREYXRhKGNvbHVtbnM6IGFueVtdLCBmaWVsZHM6IHN0cmluZ1tdLCByb3dzOiBhbnlbXSkge1xyXG4gIGxldCB0YWJsZUZpZWxkczogc3RyaW5nW10gPSBbXVxyXG4gIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uOiBhbnkpID0+IHtcclxuICAgIGxldCBmaWVsZDogc3RyaW5nID0gY29sdW1uLnByb3BlcnR5XHJcbiAgICBpZiAoZmllbGQpIHtcclxuICAgICAgdGFibGVGaWVsZHMucHVzaChmaWVsZClcclxuICAgIH1cclxuICB9KVxyXG4gIHJldHVybiB0YWJsZUZpZWxkcy5ldmVyeSgoZmllbGQ6IHN0cmluZykgPT4gZmllbGRzLmluY2x1ZGVzKGZpZWxkKSlcclxufVxyXG5cclxuZnVuY3Rpb24gaW1wb3J0WExTWChwYXJhbXM6IGFueSkge1xyXG4gIGNvbnN0IHsgJHRhYmxlLCBjb2x1bW5zLCBvcHRpb25zLCBmaWxlIH0gPSBwYXJhbXNcclxuICBjb25zdCB7IF9pbXBvcnRDYWxsYmFjaywgX2ltcG9ydFJlc29sdmUgfSA9ICR0YWJsZVxyXG4gIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXHJcbiAgZmlsZVJlYWRlci5vbmxvYWQgPSAoZTogYW55KSA9PiB7XHJcbiAgICBjb25zdCB3b3JrYm9vayA9IFhMU1gucmVhZChlLnRhcmdldC5yZXN1bHQsIHsgdHlwZTogJ2JpbmFyeScgfSlcclxuICAgIGNvbnN0IGNzdkRhdGE6IHN0cmluZyA9IFhMU1gudXRpbHMuc2hlZXRfdG9fY3N2KHdvcmtib29rLlNoZWV0cy5TaGVldDEpXHJcbiAgICBjb25zdCByZXN0OiBhbnkgPSBwYXJzZUNzdihjb2x1bW5zLCBjc3ZEYXRhKVxyXG4gICAgY29uc3QgeyBmaWVsZHMsIHJvd3MgfSA9IHJlc3RcclxuICAgIGNvbnN0IHN0YXR1cyA9IGNoZWNrSW1wb3J0RGF0YShjb2x1bW5zLCBmaWVsZHMsIHJvd3MpXHJcbiAgICBpZiAoc3RhdHVzKSB7XHJcbiAgICAgICR0YWJsZS5jcmVhdGVEYXRhKHJvd3MpXHJcbiAgICAgICAgLnRoZW4oKGRhdGE6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgICBpZiAob3B0aW9ucy5tb2RlID09PSAnYXBwZW5kJykge1xyXG4gICAgICAgICAgICAkdGFibGUuaW5zZXJ0QXQoZGF0YSwgLTEpXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkdGFibGUucmVsb2FkRGF0YShkYXRhKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgIGlmIChvcHRpb25zLm1lc3NhZ2UgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgJHRhYmxlLiRYTW9kYWwubWVzc2FnZSh7IG1lc3NhZ2U6IGkxOG4oJ3Z4ZS50YWJsZS5pbXBTdWNjZXNzJyksIHN0YXR1czogJ3N1Y2Nlc3MnIH0pXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5tZXNzYWdlICE9PSBmYWxzZSkge1xyXG4gICAgICAkdGFibGUuJFhNb2RhbC5tZXNzYWdlKHsgbWVzc2FnZTogaTE4bigndnhlLmVycm9yLmltcEZpZWxkcycpLCBzdGF0dXM6ICdlcnJvcicgfSlcclxuICAgIH1cclxuICAgIGlmIChfaW1wb3J0UmVzb2x2ZSkge1xyXG4gICAgICBfaW1wb3J0UmVzb2x2ZShzdGF0dXMpXHJcbiAgICAgICR0YWJsZS5faW1wb3J0UmVzb2x2ZSA9IG51bGxcclxuICAgIH0gZWxzZSBpZiAoX2ltcG9ydENhbGxiYWNrKSB7XHJcbiAgICAgIC8vIOW3suW6n+W8g1xyXG4gICAgICBfaW1wb3J0Q2FsbGJhY2soc3RhdHVzKVxyXG4gICAgICAkdGFibGUuX2ltcG9ydENhbGxiYWNrID0gbnVsbFxyXG4gICAgfVxyXG4gIH1cclxuICBmaWxlUmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyhmaWxlKVxyXG59XHJcblxyXG5mdW5jdGlvbiBoYW5kbGVJbXBvcnRFdmVudChwYXJhbXM6IGFueSkge1xyXG4gIGlmIChwYXJhbXMub3B0aW9ucy50eXBlID09PSAneGxzeCcpIHtcclxuICAgIGltcG9ydFhMU1gocGFyYW1zKVxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBoYW5kbGVFeHBvcnRFdmVudChwYXJhbXM6IGFueSkge1xyXG4gIGlmIChwYXJhbXMub3B0aW9ucy50eXBlID09PSAneGxzeCcpIHtcclxuICAgIGV4cG9ydFhMU1gocGFyYW1zKVxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICog5Z+65LqOIHZ4ZS10YWJsZSDooajmoLznmoTlop7lvLrmj5Lku7bvvIzmlK/mjIHlr7zlh7ogeGxzeCDmoLzlvI9cclxuICovXHJcbmV4cG9ydCBjb25zdCBWWEVUYWJsZVBsdWdpbkV4cG9ydFhMU1g6IGFueSA9IHtcclxuICBpbnN0YWxsKHh0YWJsZTogdHlwZW9mIFZYRVRhYmxlKSB7XHJcbiAgICBPYmplY3QuYXNzaWduKHh0YWJsZS50eXBlcywgeyB4bHN4OiAxIH0pXHJcbiAgICB4dGFibGUuaW50ZXJjZXB0b3IubWl4aW4oe1xyXG4gICAgICAnZXZlbnQuaW1wb3J0JzogaGFuZGxlSW1wb3J0RXZlbnQsXHJcbiAgICAgICdldmVudC5leHBvcnQnOiBoYW5kbGVFeHBvcnRFdmVudFxyXG4gICAgfSlcclxuICAgIFZYRVRhYmxlUGx1Z2luRXhwb3J0WExTWC50ID0geHRhYmxlLnRcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGkxOG4oa2V5OiBzdHJpbmcpIHtcclxuICBpZiAoVlhFVGFibGVQbHVnaW5FeHBvcnRYTFNYLnQpIHtcclxuICAgIHJldHVybiBWWEVUYWJsZVBsdWdpbkV4cG9ydFhMU1gudChrZXkpXHJcbiAgfVxyXG59XHJcblxyXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LlZYRVRhYmxlKSB7XHJcbiAgd2luZG93LlZYRVRhYmxlLnVzZShWWEVUYWJsZVBsdWdpbkV4cG9ydFhMU1gpXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFZYRVRhYmxlUGx1Z2luRXhwb3J0WExTWFxyXG4iXX0=
|