UNPKG

docx2html

Version:

a javascript docx converter to html based on docx4js

314 lines (271 loc) 28.6 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _get2 = require('babel-runtime/helpers/get'); var _get3 = _interopRequireDefault(_get2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _converter = require('./converter'); var _converter2 = _interopRequireDefault(_converter); var _converter3 = require('./style/converter'); var _converter4 = _interopRequireDefault(_converter3); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var AZ = /[A-Z]/g, r = function r(a) { return '-' + a.toLowerCase(); }, clozed = /Z$/gi; function asStyle(x) { var a = []; for (var i in x) { !$.isFunction(x[i]) && a.push(i.replace(AZ, r) + ':' + x[i]); }return a.join(';'); } var Shape = function (_Converter) { (0, _inherits3.default)(Shape, _Converter); function Shape() { (0, _classCallCheck3.default)(this, Shape); return (0, _possibleConstructorReturn3.default)(this, (Shape.__proto__ || (0, _getPrototypeOf2.default)(Shape)).apply(this, arguments)); } (0, _createClass3.default)(Shape, [{ key: 'convertStyle', value: function convertStyle(el) { el.style.position = 'absolute'; el.style.overflow = 'hidden'; var pathStyle = { stroke: 'black', strokeWidth: 2, fillOpacity: 0 }, bgStyle = this.makeBackgroundStyle(); (0, _get3.default)(Shape.prototype.__proto__ || (0, _getPrototypeOf2.default)(Shape.prototype), 'convertStyle', this).apply(this, arguments); var style = this.wordModel.getDirectStyle(), propConverter = new this.constructor.Properties(el.style, this, pathStyle, bgStyle); style && style.parse([propConverter]); if (this.path) { if (el.style.background) pathStyle.fillOpacity = 0; var bgImage = el.style.background, grad = pathStyle.grad; delete pathStyle.grad; var svg = '<svg xmlns="http://www.w3.org/2000/svg">' + (grad ? '<defs>' + grad + '</defs>' : '') + this.path + ' style="' + asStyle(pathStyle) + '" /></svg>'; var svgImage = 'url(' + this.doc.asImageURL(svg) + ')'; bgStyle.backgroundImage = svgImage; bgStyle.backgroundSize = '100% 100%'; } } }, { key: 'makeBackgroundStyle', value: function makeBackgroundStyle() { //make background el to hold svg background var id = 'shape' + this.doc.uid(); this.content.setAttribute('id', id); var style = this.doc.createStyle('#' + id + '::before'); style.content = '""'; style.zIndex = -1; style.position = 'absolute'; style.width = '100%'; style.height = '100%'; style.left = 0; style.top = 0; return style; } }, { key: 'tag', get: function get() { return 'div'; } }]); return Shape; }(_converter2.default); exports.default = Shape; Shape.Properties = function (_Style$Properties) { (0, _inherits3.default)(Properties, _Style$Properties); function Properties(style, parent, pathStyle, bgStyle) { (0, _classCallCheck3.default)(this, Properties); var _this2 = (0, _possibleConstructorReturn3.default)(this, (Properties.__proto__ || (0, _getPrototypeOf2.default)(Properties)).apply(this, arguments)); _this2.pathStyle = pathStyle; _this2.bgStyle = bgStyle; return _this2; } (0, _createClass3.default)(Properties, [{ key: 'xfrm', value: function xfrm(x) { this.style.width = x.width + 'px'; this.style.height = x.height + 'px'; x.x && (this.style.left = x.x + 'px'); x.y && (this.style.top = x.y + 'px'); x.rotation && this.styless('transform', 'rotate(' + x.rotation + 'deg)'); this.world = x; } }, { key: 'ln', value: function ln(x) { x.color && (this.pathStyle.stroke = x.color); x.width != undefined && (this.pathStyle.strokeWidth = x.width + 'px'); switch (x.cap) { case 'rnd': this.pathStyle.strokeLinecap = 'round'; break; default: } if (x.dash) { switch (this.lineStyle(x.dash)) { case 'dotted': this.pathStyle.strokeDasharray = "5,5"; break; break; case 'dashed': this.pathStyle.strokeDasharray = "10,10"; break; } } } }, { key: 'solidFill', value: function solidFill(x) { this.pathStyle.fill = x; this.pathStyle.fillOpacity = 1; } }, { key: 'gradFill', value: function gradFill(x) { if (this.style.backgroundImage) return; var grad = []; switch (x.path) { case 'linear': grad.push('<linearGradient id="grad"'); switch (x.angel) { case 0: grad.push('x1="0%" y1="0%" x2="100%" y2="0%">'); break; case 90: grad.push('x1="0%" y1="0%" x2="0%" y2="100%">'); break; case 180: grad.push('x1="100%" y1="0%" x2="0%" y2="0%">'); break; case 270: grad.push('x1="0%" y1="100%" x2="0%" y2="0%">'); break; } grad.push('</linearGradient>'); break; case 'circle': grad.push('<radialGradient id="grad"'); grad.push('cx="50%" cy="50%" r="50%" fx="50%" fy="50%">'); grad.push('</radialGradient>'); break; } var end = grad.pop(); for (var i = 0, len = x.stops.length, a; i < len; i++) { grad.push('<stop offset="' + (a = x.stops[i]).position + '%" style="stop-opacity:1;stop-color:' + a.color + '"/>'); }grad.push(end); this.pathStyle.grad = grad.join(' '); this.pathStyle.fill = 'url(#grad)'; this.pathStyle.fillOpacity = 1; } }, { key: 'blipFill', value: function blipFill(x) { this.style.background = 'url(' + this.doc.asImageURL(x) + ')'; this.style.backgroundSize = '100% 100%'; this.noFill(); } }, { key: 'noFill', value: function noFill(x) { this.pathStyle.fillOpacity = 0; } }, { key: 'lnRef', value: function lnRef(x) { this.ln(x); } }, { key: 'fillRef', value: function fillRef(x) { if (this.style.backgroundImage) return; if (typeof x.path != 'undefined') return this.gradFill(x); if (typeof x == 'string') this.pathStyle.fill = x;else if (typeof x.color != 'undefined') this.pathStyle.fill = x.color;else return; this.pathStyle.fillOpacity = 1; } }, { key: 'fontRef', value: function fontRef(x) { x.color && (this.style.color = x.color); x.family && (this.style.fontFamily = x.family); } }, { key: 'path', value: function path(x, t) { switch (x.shape) { case 'line': this.parent.path = '<line x1="0" y1="0" x2="' + this.world.width + 'pt" y2="' + this.world.height + 'pt"'; break; case 'rect': this.parent.path = '<rect width="' + this.world.width + 'pt" height="' + this.world.height + 'pt"'; break; case 'roundRect': this.parent.path = '<rect rx="' + (t = Math.min(this.world.width, this.world.height) / 12) + 'pt" ry="' + t + 'pt" width="' + this.world.width + 'pt" height="' + this.world.height + 'pt"'; break; case 'ellipse': this.parent.path = '<ellipse cx="' + this.world.width / 2 + 'pt" cy="' + this.world.height / 2 + 'pt" rx="' + this.world.width / 2 + 'pt" ry="' + this.world.height / 2 + 'pt"'; break; case 'path': this.parent.path = '<path d="' + x.path + '"'; if (!clozed.test(x.path)) this.noFill(); break; } } }, { key: 'spAutoFit', value: function spAutoFit() { this.style.height = 'auto'; } }, { key: 'lIns', value: function lIns(x) { this.style.paddingLeft = x + 'px'; } }, { key: 'tIns', value: function tIns(x) { this.style.paddingTop = x + 'px'; } }, { key: 'rIns', value: function rIns(x) { this.style.paddingRight = x + 'px'; } }, { key: 'bIns', value: function bIns(x) { this.style.paddingBottom = x + 'px'; } }, { key: 'anchor', value: function anchor(x) { this.style.display = 'table-cell'; this.style.verticalAlign = x; } }, { key: 'vert', value: function vert(x) { this.style.height = this.world.width + 'px'; this.style.width = this.world.height + 'px'; var delta = (this.world.width - this.world.height) / 2; this.bgStyle.height = this.world.height + 'px'; this.bgStyle.width = this.world.width + 'px'; this.styless('transform', 'translate(-' + delta + 'pt,' + delta + 'pt) rotate(-' + x + 'deg) ', this.bgStyle); this.styless('transform', 'translate(' + delta + 'pt,-' + delta + 'pt) rotate(' + (x + this.world.rotation || 0) + 'deg)'); } }]); return Properties; }(_converter4.default.Properties); module.exports = exports['default']; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kb2N4L2h0bWwvc2hhcGUuanMiXSwibmFtZXMiOlsiQVoiLCJyIiwiYSIsInRvTG93ZXJDYXNlIiwiY2xvemVkIiwiYXNTdHlsZSIsIngiLCJpIiwiJCIsImlzRnVuY3Rpb24iLCJwdXNoIiwicmVwbGFjZSIsImpvaW4iLCJTaGFwZSIsImVsIiwic3R5bGUiLCJwb3NpdGlvbiIsIm92ZXJmbG93IiwicGF0aFN0eWxlIiwic3Ryb2tlIiwic3Ryb2tlV2lkdGgiLCJmaWxsT3BhY2l0eSIsImJnU3R5bGUiLCJtYWtlQmFja2dyb3VuZFN0eWxlIiwiYXJndW1lbnRzIiwid29yZE1vZGVsIiwiZ2V0RGlyZWN0U3R5bGUiLCJwcm9wQ29udmVydGVyIiwiY29uc3RydWN0b3IiLCJQcm9wZXJ0aWVzIiwicGFyc2UiLCJwYXRoIiwiYmFja2dyb3VuZCIsImJnSW1hZ2UiLCJncmFkIiwic3ZnIiwic3ZnSW1hZ2UiLCJkb2MiLCJhc0ltYWdlVVJMIiwiYmFja2dyb3VuZEltYWdlIiwiYmFja2dyb3VuZFNpemUiLCJpZCIsInVpZCIsImNvbnRlbnQiLCJzZXRBdHRyaWJ1dGUiLCJjcmVhdGVTdHlsZSIsInpJbmRleCIsIndpZHRoIiwiaGVpZ2h0IiwibGVmdCIsInRvcCIsIkNvbnZlcnRlciIsInBhcmVudCIsInkiLCJyb3RhdGlvbiIsInN0eWxlc3MiLCJ3b3JsZCIsImNvbG9yIiwidW5kZWZpbmVkIiwiY2FwIiwic3Ryb2tlTGluZWNhcCIsImRhc2giLCJsaW5lU3R5bGUiLCJzdHJva2VEYXNoYXJyYXkiLCJmaWxsIiwiYW5nZWwiLCJlbmQiLCJwb3AiLCJsZW4iLCJzdG9wcyIsImxlbmd0aCIsIm5vRmlsbCIsImxuIiwiZ3JhZEZpbGwiLCJmYW1pbHkiLCJmb250RmFtaWx5IiwidCIsInNoYXBlIiwiTWF0aCIsIm1pbiIsInRlc3QiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdUb3AiLCJwYWRkaW5nUmlnaHQiLCJwYWRkaW5nQm90dG9tIiwiZGlz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bUIsTUFBbkIsR0FBMEJBLEtBQTFCLEdBQWdDLGFBQWhDLElBQStDakYsSUFBRSxLQUFLa0QsS0FBTCxDQUFXRixRQUFiLElBQXVCLENBQXRFLElBQXlFLE1BQWxHO0FBQ0E7QUFwS0Y7QUFBQTtBQUFBLEVBQTBDa0Msb0JBQU0zRCxVQUFoRCIsImZpbGUiOiJzaGFwZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDb252ZXJ0ZXIgZnJvbSAnLi9jb252ZXJ0ZXInXG5pbXBvcnQgU3R5bGUgZnJvbSAnLi9zdHlsZS9jb252ZXJ0ZXInXG5cbnZhciBBWj0vW0EtWl0vZywgXG5cdHI9ZnVuY3Rpb24oYSl7cmV0dXJuICctJythLnRvTG93ZXJDYXNlKCl9LFxuXHRjbG96ZWQ9L1okL2dpO1xuXHRcbmZ1bmN0aW9uIGFzU3R5bGUoeCl7XG5cdHZhciBhPVtdXG5cdGZvcih2YXIgaSBpbiB4KVxuXHRcdCEkLmlzRnVuY3Rpb24oeFtpXSkgJiYgYS5wdXNoKGkucmVwbGFjZShBWixyKSsnOicreFtpXSlcblx0cmV0dXJuIGEuam9pbignOycpXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoYXBlIGV4dGVuZHMgQ29udmVydGVye1xuXHRnZXQgdGFnKCl7cmV0dXJuICdkaXYnfVxuXHRcblx0Y29udmVydFN0eWxlKGVsKXtcblx0XHRlbC5zdHlsZS5wb3NpdGlvbj0nYWJzb2x1dGUnXG5cdFx0ZWwuc3R5bGUub3ZlcmZsb3c9J2hpZGRlbidcblxuXHRcdHZhciBwYXRoU3R5bGU9e3N0cm9rZTonYmxhY2snLCBzdHJva2VXaWR0aDoyLCBmaWxsT3BhY2l0eTowfSxcblx0XHRcdGJnU3R5bGU9dGhpcy5tYWtlQmFja2dyb3VuZFN0eWxlKCk7XG5cdFx0c3VwZXIuY29udmVydFN0eWxlKC4uLmFyZ3VtZW50cylcblx0XHR2YXIgc3R5bGU9dGhpcy53b3JkTW9kZWwuZ2V0RGlyZWN0U3R5bGUoKSxcblx0XHRcdHByb3BDb252ZXJ0ZXI9bmV3IHRoaXMuY29uc3RydWN0b3IuUHJvcGVydGllcyhlbC5zdHlsZSx0aGlzLCBwYXRoU3R5bGUsIGJnU3R5bGUpO1xuXHRcdHN0eWxlICYmIHN0eWxlLnBhcnNlKFtwcm9wQ29udmVydGVyXSlcblx0XHRpZih0aGlzLnBhdGgpe1xuXHRcdFx0aWYoZWwuc3R5bGUuYmFja2dyb3VuZClcblx0XHRcdFx0cGF0aFN0eWxlLmZpbGxPcGFjaXR5PTBcblx0XHRcdHZhciBiZ0ltYWdlPWVsLnN0eWxlLmJhY2tncm91bmQsXG5cdFx0XHRcdGdyYWQ9cGF0aFN0eWxlLmdyYWQ7XG5cdFx0XHRkZWxldGUgcGF0aFN0eWxlLmdyYWQ7XHRcdFx0XHRcblx0XHRcdFxuXHRcdFx0dmFyIHN2Zz0nPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+J1xuXHRcdFx0XHRcdCsoZ3JhZCA/ICc8ZGVmcz4nK2dyYWQrJzwvZGVmcz4nIDogJycpXG5cdFx0XHRcdFx0K3RoaXMucGF0aCsnIHN0eWxlPVwiJythc1N0eWxlKHBhdGhTdHlsZSkrJ1wiIC8+PC9zdmc+Jztcblx0XHRcdHZhciBzdmdJbWFnZT0ndXJsKCcrdGhpcy5kb2MuYXNJbWFnZVVSTChzdmcpKycpJztcblx0XHRcdGJnU3R5bGUuYmFja2dyb3VuZEltYWdlPXN2Z0ltYWdlXG5cdFx0XHRiZ1N0eWxlLmJhY2tncm91bmRTaXplPScxMDAlIDEwMCUnXG5cdFx0fVxuXHR9XG5cdG1ha2VCYWNrZ3JvdW5kU3R5bGUoKXtcblx0XHQvL21ha2UgYmFja2dyb3VuZCBlbCB0byBob2xkIHN2ZyBiYWNrZ3JvdW5kXG5cdFx0dmFyIGlkPSdzaGFwZScrdGhpcy5kb2MudWlkKClcblx0XHR0aGlzLmNvbnRlbnQuc2V0QXR0cmlidXRlKCdpZCcsaWQpXG5cdFx0dmFyIHN0eWxlPXRoaXMuZG9jLmNyZWF0ZVN0eWxlKCcjJytpZCsnOjpiZWZvcmUnKVxuXHRcdHN0eWxlLmNvbnRlbnQ9J1wiXCInXG5cdFx0c3R5bGUuekluZGV4PS0xXG5cdFx0c3R5bGUucG9zaXRpb249J2Fic29sdXRlJ1xuXHRcdHN0eWxlLndpZHRoPScxMDAlJ1xuXHRcdHN0eWxlLmhlaWdodD0nMTAwJSdcblx0XHRzdHlsZS5sZWZ0PTBcblx0XHRzdHlsZS50b3A9MFxuXHRcdHJldHVybiBzdHlsZVxuXHR9XG59XG5cblNoYXBlLlByb3BlcnRpZXM9Y2xhc3MgUHJvcGVydGllcyBleHRlbmRzIFN0eWxlLlByb3BlcnRpZXN7XG5cdGNvbnN0cnVjdG9yKHN0eWxlLHBhcmVudCwgcGF0aFN0eWxlLCBiZ1N0eWxlKXtcblx0XHRzdXBlciguLi5hcmd1bWVudHMpXG5cdFx0dGhpcy5wYXRoU3R5bGU9cGF0aFN0eWxlXG5cdFx0dGhpcy5iZ1N0eWxlPWJnU3R5bGVcblx0fVxuXG5cdHhmcm0oeCl7XG5cdFx0dGhpcy5zdHlsZS53aWR0aD14LndpZHRoKydweCdcblx0XHR0aGlzLnN0eWxlLmhlaWdodD14LmhlaWdodCsncHgnXG5cdFx0eC54ICYmICh0aGlzLnN0eWxlLmxlZnQ9eC54KydweCcpXG5cdFx0eC55ICYmICh0aGlzLnN0eWxlLnRvcD14LnkrJ3B4Jylcblx0XHRcblx0XHR4LnJvdGF0aW9uICYmIHRoaXMuc3R5bGVzcygndHJhbnNmb3JtJywncm90YXRlKCcreC5yb3RhdGlvbisnZGVnKScpXG5cdFx0XG5cdFx0dGhpcy53b3JsZD14XG5cdH1cblx0bG4oeCl7XG5cdFx0eC5jb2xvciAmJiAodGhpcy5wYXRoU3R5bGUuc3Ryb2tlPXguY29sb3IpO1xuXHRcdHgud2lkdGghPXVuZGVmaW5lZCAmJiAodGhpcy5wYXRoU3R5bGUuc3Ryb2tlV2lkdGg9eC53aWR0aCsncHgnKTtcblx0XHRcblx0XHRzd2l0Y2goeC5jYXApe1xuXHRcdGNhc2UgJ3JuZCc6XG5cdFx0XHR0aGlzLnBhdGhTdHlsZS5zdHJva2VMaW5lY2FwPSdyb3VuZCdcblx0XHRcdGJyZWFrXG5cdFx0ZGVmYXVsdDpcblx0XHRcdFxuXHRcdH1cblx0XHRcblx0XHRpZih4LmRhc2gpe1xuXHRcdFx0c3dpdGNoKHRoaXMubGluZVN0eWxlKHguZGFzaCkpe1xuXHRcdFx0Y2FzZSAnZG90dGVkJzpcblx0XHRcdFx0dGhpcy5wYXRoU3R5bGUuc3Ryb2tlRGFzaGFycmF5PVwiNSw1XCJcblx0XHRcdFx0YnJlYWtcblx0XHRcdGJyZWFrXG5cdFx0XHRjYXNlICdkYXNoZWQnOlxuXHRcdFx0XHR0aGlzLnBhdGhTdHlsZS5zdHJva2VEYXNoYXJyYXk9XCIxMCwxMFwiXG5cdFx0XHRicmVha1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRzb2xpZEZpbGwoeCl7XG5cdFx0dGhpcy5wYXRoU3R5bGUuZmlsbD14XG5cdFx0dGhpcy5wYXRoU3R5bGUuZmlsbE9wYWNpdHk9MVxuXHR9XG5cdGdyYWRGaWxsKHgpe1xuXHRcdGlmKHRoaXMuc3R5bGUuYmFja2dyb3VuZEltYWdlKVxuXHRcdFx0cmV0dXJuXG5cdFx0XHRcblx0XHR2YXIgZ3JhZD1bXVxuXHRcdHN3aXRjaCh4LnBhdGgpe1xuXHRcdGNhc2UgJ2xpbmVhcic6XG5cdFx0XHRncmFkLnB1c2goJzxsaW5lYXJHcmFkaWVudCBpZD1cImdyYWRcIicpXG5cdFx0XHRzd2l0Y2goeC5hbmdlbCl7XG5cdFx0XHRjYXNlIDA6XG5cdFx0XHRcdGdyYWQucHVzaCgneDE9XCIwJVwiIHkxPVwiMCVcIiB4Mj1cIjEwMCVcIiB5Mj1cIjAlXCI+Jylcblx0XHRcdFx0YnJlYWtcblx0XHRcdGNhc2UgOTA6XG5cdFx0XHRcdGdyYWQucHVzaCgneDE9XCIwJVwiIHkxPVwiMCVcIiB4Mj1cIjAlXCIgeTI9XCIxMDAlXCI+Jylcblx0XHRcdFx0YnJlYWtcblx0XHRcdGNhc2UgMTgwOlxuXHRcdFx0XHRncmFkLnB1c2goJ3gxPVwiMTAwJVwiIHkxPVwiMCVcIiB4Mj1cIjAlXCIgeTI9XCIwJVwiPicpXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHRjYXNlIDI3MDpcblx0XHRcdFx0Z3JhZC5wdXNoKCd4MT1cIjAlXCIgeTE9XCIxMDAlXCIgeDI9XCIwJVwiIHkyPVwiMCVcIj4nKVxuXHRcdFx0XHRicmVha1xuXHRcdFx0fVxuXHRcdFx0Z3JhZC5wdXNoKCc8L2xpbmVhckdyYWRpZW50PicpXG5cdFx0XHRicmVha1xuXHRcdGNhc2UgJ2NpcmNsZSc6XG5cdFx0XHRncmFkLnB1c2goJzxyYWRpYWxHcmFkaWVudCAgaWQ9XCJncmFkXCInKVxuXHRcdFx0Z3JhZC5wdXNoKCdjeD1cIjUwJVwiIGN5PVwiNTAlXCIgcj1cIjUwJVwiIGZ4PVwiNTAlXCIgZnk9XCI1MCVcIj4nKVxuXHRcdFx0Z3JhZC5wdXNoKCc8L3JhZGlhbEdyYWRpZW50PicpXG5cdFx0XHRicmVha1xuXHRcdH1cblx0XHR2YXIgZW5kPWdyYWQucG9wKClcblx0XHRmb3IodmFyIGk9MCxsZW49eC5zdG9wcy5sZW5ndGgsYTtpPGxlbjtpKyspXG5cdFx0XHRncmFkLnB1c2goJzxzdG9wIG9mZnNldD1cIicrKGE9eC5zdG9wc1tpXSkucG9zaXRpb24rJyVcIiBzdHlsZT1cInN0b3Atb3BhY2l0eToxO3N0b3AtY29sb3I6JythLmNvbG9yKydcIi8+Jylcblx0XHRncmFkLnB1c2goZW5kKVxuXHRcdFxuXHRcdHRoaXMucGF0aFN0eWxlLmdyYWQ9Z3JhZC5qb2luKCcgJylcblx0XHR0aGlzLnBhdGhTdHlsZS5maWxsPSd1cmwoI2dyYWQpJ1xuXHRcdHRoaXMucGF0aFN0eWxlLmZpbGxPcGFjaXR5PTFcblx0fVxuXHRibGlwRmlsbCh4KXtcblx0XHR0aGlzLnN0eWxlLmJhY2tncm91bmQ9J3VybCgnK3RoaXMuZG9jLmFzSW1hZ2VVUkwoeCkrJyknXG5cdFx0dGhpcy5zdHlsZS5iYWNrZ3JvdW5kU2l6ZT0nMTAwJSAxMDAlJ1xuXHRcdHRoaXMubm9GaWxsKClcblx0fVxuXHRub0ZpbGwoeCl7XG5cdFx0dGhpcy5wYXRoU3R5bGUuZmlsbE9wYWNpdHk9MFxuXHR9XG5cdGxuUmVmKHgpe1xuXHRcdHRoaXMubG4oeClcblx0fVxuXHRmaWxsUmVmKHgpe1xuXHRcdGlmKHRoaXMuc3R5bGUuYmFja2dyb3VuZEltYWdlKVxuXHRcdFx0cmV0dXJuXG5cdFx0XG5cdFx0aWYodHlwZW9mKHgucGF0aCkhPSd1bmRlZmluZWQnKVxuXHRcdFx0cmV0dXJuIHRoaXMuZ3JhZEZpbGwoeCk7XG5cdFx0XHRcblx0XHRpZih0eXBlb2YoeCk9PSdzdHJpbmcnKVxuXHRcdFx0dGhpcy5wYXRoU3R5bGUuZmlsbD14XG5cdFx0ZWxzZSBpZih0eXBlb2YoeC5jb2xvcikhPSd1bmRlZmluZWQnKVxuXHRcdFx0dGhpcy5wYXRoU3R5bGUuZmlsbD14LmNvbG9yXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuO1xuXHRcdHRoaXMucGF0aFN0eWxlLmZpbGxPcGFjaXR5PTFcblx0fVxuXHRmb250UmVmKHgpe1xuXHRcdHguY29sb3IgJiYgKHRoaXMuc3R5bGUuY29sb3I9eC5jb2xvcik7XG5cdFx0eC5mYW1pbHkgJiYgKHRoaXMuc3R5bGUuZm9udEZhbWlseT14LmZhbWlseSk7XG5cdH1cblx0cGF0aCh4LCB0KXtcblx0XHRzd2l0Y2goeC5zaGFwZSl7XG5cdFx0Y2FzZSAnbGluZSc6XG5cdFx0XHR0aGlzLnBhcmVudC5wYXRoPSc8bGluZSB4MT1cIjBcIiB5MT1cIjBcIiB4Mj1cIicrdGhpcy53b3JsZC53aWR0aCsncHRcIiB5Mj1cIicrdGhpcy53b3JsZC5oZWlnaHQrJ3B0XCInXG5cdFx0XHRicmVha1xuXHRcdGNhc2UgJ3JlY3QnOlxuXHRcdFx0dGhpcy5wYXJlbnQucGF0aD0nPHJlY3Qgd2lkdGg9XCInK3RoaXMud29ybGQud2lkdGgrJ3B0XCIgaGVpZ2h0PVwiJyt0aGlzLndvcmxkLmhlaWdodCsncHRcIidcblx0XHRcdGJyZWFrO1x0XG5cdFx0Y2FzZSAncm91bmRSZWN0Jzpcblx0XHRcdHRoaXMucGFyZW50LnBhdGg9JzxyZWN0IHJ4PVwiJysodD1NYXRoLm1pbih0aGlzLndvcmxkLndpZHRoLCB0aGlzLndvcmxkLmhlaWdodCkvMTIpKydwdFwiIHJ5PVwiJyt0KydwdFwiIHdpZHRoPVwiJyt0aGlzLndvcmxkLndpZHRoKydwdFwiIGhlaWdodD1cIicrdGhpcy53b3JsZC5oZWlnaHQrJ3B0XCInXG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdlbGxpcHNlJzpcblx0XHRcdHRoaXMucGFyZW50LnBhdGg9JzxlbGxpcHNlIGN4PVwiJyt0aGlzLndvcmxkLndpZHRoLzIrJ3B0XCIgY3k9XCInK3RoaXMud29ybGQuaGVpZ2h0LzIrJ3B0XCIgcng9XCInK3RoaXMud29ybGQud2lkdGgvMisncHRcIiByeT1cIicrdGhpcy53b3JsZC5oZWlnaHQvMisncHRcIidcblx0XHRcdGJyZWFrXG5cdFx0Y2FzZSAncGF0aCc6XG5cdFx0XHR0aGlzLnBhcmVudC5wYXRoPSc8cGF0aCBkPVwiJyt4LnBhdGgrJ1wiJ1xuXHRcdFx0aWYoIWNsb3plZC50ZXN0KHgucGF0aCkpXG5cdFx0XHRcdHRoaXMubm9GaWxsKClcblx0XHRcdGJyZWFrXG5cdFx0fVxuXHR9XG5cdHNwQXV0b0ZpdCgpe1xuXHRcdHRoaXMuc3R5bGUuaGVpZ2h0PSdhdXRvJ1xuXHR9XG5cdGxJbnMoeCl7XG5cdFx0dGhpcy5zdHlsZS5wYWRkaW5nTGVmdD14KydweCdcblx0fVxuXHR0SW5zKHgpe1xuXHRcdHRoaXMuc3R5bGUucGFkZGluZ1RvcD14KydweCdcblx0fVxuXHRySW5zKHgpe1xuXHRcdHRoaXMuc3R5bGUucGFkZGluZ1JpZ2h0PXgrJ3B4J1xuXHR9XG5cdGJJbnMoeCl7XG5cdFx0dGhpcy5zdHlsZS5wYWRkaW5nQm90dG9tPXgrJ3B4J1xuXHR9XG5cdGFuY2hvcih4KXtcblx0XHR0aGlzLnN0eWxlLmRpc3BsYXk9J3RhYmxlLWNlbGwnXG5cdFx0dGhpcy5zdHlsZS52ZXJ0aWNhbEFsaWduPXhcblx0fVxuXHR2ZXJ0KHgpe1xuXHRcdHRoaXMuc3R5bGUuaGVpZ2h0PXRoaXMud29ybGQud2lkdGgrJ3B4J1xuXHRcdHRoaXMuc3R5bGUud2lkdGg9dGhpcy53b3JsZC5oZWlnaHQrJ3B4J1xuXHRcdHZhciBkZWx0YT0odGhpcy53b3JsZC53aWR0aC10aGlzLndvcmxkLmhlaWdodCkvMlxuXHRcdFx0XHRcdFx0XG5cdFx0dGhpcy5iZ1N0eWxlLmhlaWdodD10aGlzLndvcmxkLmhlaWdodCsncHgnXG5cdFx0dGhpcy5iZ1N0eWxlLndpZHRoPXRoaXMud29ybGQud2lkdGgrJ3B4J1xuXHRcdHRoaXMuc3R5bGVzcygndHJhbnNmb3JtJywndHJhbnNsYXRlKC0nK2RlbHRhKydwdCwnK2RlbHRhKydwdCkgcm90YXRlKC0nK3grJ2RlZykgJywgdGhpcy5iZ1N0eWxlKVxuXG5cdFx0dGhpcy5zdHlsZXNzKCd0cmFuc2Zvcm0nLCd0cmFuc2xhdGUoJytkZWx0YSsncHQsLScrZGVsdGErJ3B0KSByb3RhdGUoJysoeCt0aGlzLndvcmxkLnJvdGF0aW9ufHwwKSsnZGVnKScpXG5cdH1cbn0iXX0=