UNPKG

docx4js-fork

Version:
430 lines (387 loc) 52.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _officeDocument = require("../officeDocument"); var _officeDocument2 = _interopRequireDefault(_officeDocument); var _drawml = require("../drawml"); var _drawml2 = _interopRequireDefault(_drawml); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var _class = function (_Base) { _inherits(_class, _Base); function _class() { _classCallCheck(this, _class); return _possibleConstructorReturn(this, (_class.__proto__ || Object.getPrototypeOf(_class)).apply(this, arguments)); } _createClass(_class, [{ key: "_init", value: function _init() { _get(_class.prototype.__proto__ || Object.getPrototypeOf(_class.prototype), "_init", this).call(this); this._assignRel("styles,numbering,settings".split(",")); var $ = this.styles; this.styles.prototype.basest = function (selector) { var current = this; while (current.length > 0) { if (current.is(selector)) { return $(current); } current = $.root().find("w\\:style[w\\:styleId=\"" + current.children("w\\:basedOn").attr("w:val") + "\"]"); } return this.not(this); }; } }, { key: "render", value: function render(createElement) { var identify = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.constructor.identify.bind(this.constructor); var styles = void 0, numbering = void 0; if (this.styles) styles = this.renderNode(this.styles("w\\:styles").get(0), createElement, identify); if (this.numbering) numbering = this.renderNode(this.numbering("w\\:numbering").get(0), createElement, identify); return this.renderNode(this.content("w\\:document").get(0), createElement, identify, { styles: styles, numbering: numbering }); } }, { key: "parse", value: function parse(domHandler) { var identify = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.constructor.identify.bind(this.constructor); var doc = {}; var createElement = domHandler.createElement.bind(domHandler); function _identify() { var model = identify.apply(undefined, arguments); if (model && (typeof model === "undefined" ? "undefined" : _typeof(model)) == "object") { domHandler.emit.apply(domHandler, ["*", model].concat(Array.prototype.slice.call(arguments))); domHandler.emit.apply(domHandler, [model.type, model].concat(Array.prototype.slice.call(arguments))); if (domHandler["on" + model.type]) domHandler["on" + model.type].apply(domHandler, [model].concat(Array.prototype.slice.call(arguments))); } return model; } if (this.styles) doc.styles = this.renderNode(this.styles("w\\:styles").get(0), createElement, _identify); if (this.numbering) doc.numbering = this.renderNode(this.numbering("w\\:numbering").get(0), createElement, _identify); doc.document = this.renderNode(this.content("w\\:document").get(0), createElement, _identify); return doc; } }]); return _class; }(_officeDocument2.default); _class.identities = { document: function document(wXml, officeDocument) { var $ = officeDocument.content; var current = null; var children = $("w\\:sectPr").each(function (i, sect) { var end = $(sect).closest('w\\:body>*'); sect.content = end.prevUntil(current).toArray().reverse(); if (!end.is(sect)) sect.content.push(end.get(0)); current = end; }).toArray(); return { type: "document", children: children }; }, sectPr: function sectPr(wXml, officeDocument) { var hf = function hf(type) { return wXml.children.filter(function (a) { return a.name == "w:" + type + "Reference"; }).reduce(function (headers, a) { headers.set(a.attribs["w:type"], officeDocument.getRel(a.attribs["r:id"])); return headers; }, new Map()); }; return { type: "section", children: wXml.content, headers: hf("header"), footers: hf("footer"), hasTitlePage: !!wXml.children.find(function (a) { return a.name == "w:titlePg"; }) }; }, p: function p(wXml, officeDocument) { var $ = officeDocument.content(wXml); var type = "p"; var identity = { type: type, pr: wXml.children.find(function (_ref) { var name = _ref.name; return name == "w:pPr"; }), children: wXml.children.filter(function (_ref2) { var name = _ref2.name; return name != "w:pPr"; }) }; var pPr = $.find("w\\:pPr"); if (pPr.length) { var styleId = pPr.find("w\\:pStyle").attr("w:val"); var numPr = pPr.children("w\\:numPr"); if (!numPr.length && styleId) { numPr = officeDocument.styles("w\\:style[w\\:styleId=\"" + styleId + "\"]").basest(":has(w\\:numPr)").find("w\\:numPr"); } if (numPr.length) { identity.type = "list"; identity.numId = numPr.find("w\\:numId").attr("w:val"); identity.level = parseInt(numPr.find("w\\:ilvl").attr("w:val") || 0); } if (styleId && styleId.startsWith("Heading")) { var outlineLvl = officeDocument.styles("w\\:style[w\\:styleId=\"" + styleId + "\"]").basest(":has(w\\:outlineLvl)").find("w\\:outlineLvl").attr("w:val"); if (outlineLvl) { identity.type = "heading"; identity.outline = parseInt(outlineLvl) + 1; } } } return identity; }, r: function r(wXml) { return { type: "r", pr: wXml.children.find(function (_ref3) { var name = _ref3.name; return name == "w:rPr"; }), children: wXml.children.filter(function (_ref4) { var name = _ref4.name; return name != "w:rPr"; }) }; }, fldChar: function fldChar(wXml) { return wXml.attribs["w:fldCharType"]; }, inline: function inline(wXml, officeDocument) { var $ = officeDocument.content(wXml); return { type: "drawing.inline", children: $.find('a\\:graphic>a\\:graphicData').children().toArray() }; }, anchor: function anchor(wXml, officeDocument) { var $ = officeDocument.content(wXml); var graphicData = $.find('>a\\:graphic>a\\:graphicData'); var type = graphicData.attr("uri").split("/").pop(); var children = graphicData.children().toArray(); if (type == "wordprocessingGroup") children = children[0].children.filter(function (a) { return a.name.split(":")[0] != "wpg"; }); return { type: "drawing.anchor", children: children }; }, pic: function pic(wXml, officeDocument) { var $ = officeDocument.$(wXml); var props = $.props(_extends({}, (0, _drawml2.default)(officeDocument), { tidy: function tidy(_ref5) { var spPr = _ref5.spPr, _ref5$nvPicPr = _ref5.nvPicPr, _ref5$nvPicPr$cNvPr = _ref5$nvPicPr.cNvPr, cNvPr = _ref5$nvPicPr$cNvPr === undefined ? {} : _ref5$nvPicPr$cNvPr, _ref5$nvPicPr$cNvSpPr = _ref5$nvPicPr.cNvSpPr, cNvSpPr = _ref5$nvPicPr$cNvSpPr === undefined ? {} : _ref5$nvPicPr$cNvSpPr, _ref5$nvPicPr$nvPr = _ref5$nvPicPr.nvPr, nvPr = _ref5$nvPicPr$nvPr === undefined ? {} : _ref5$nvPicPr$nvPr, _ref5$style = _ref5.style; _ref5$style = _ref5$style === undefined ? {} : _ref5$style; var _ref5$style$lnRef = _ref5$style.lnRef, lnRef = _ref5$style$lnRef === undefined ? {} : _ref5$style$lnRef, _ref5$style$fillRef = _ref5$style.fillRef, fillRef = _ref5$style$fillRef === undefined ? {} : _ref5$style$fillRef, _ref5$style$effectRef = _ref5$style.effectRef, effectRef = _ref5$style$effectRef === undefined ? {} : _ref5$style$effectRef, others = _objectWithoutProperties(_ref5, ["spPr", "nvPicPr", "style"]); return _extends({}, lnRef, fillRef, effectRef, spPr, cNvPr, cNvSpPr, nvPr, others); } })); return _extends({}, props, { type: "picture" }); }, wsp: function wsp(wXml, officeDocument) { var content = "wps\\:txbx"; var $ = officeDocument.$(wXml); var children = $.children(content).children("w\\:txbxContent").children().toArray(); var same = function same(keys, fx) { return keys.reduce(function (fs, k) { return fs[k] = fx, fs; }, {}); }; var props = $.props(_extends({}, (0, _drawml2.default)(officeDocument), same("r,t,l,b".split(",").map(function (a) { return a + "Ins"; }), function (v) { return officeDocument.doc.emu2Px(v); }), { __filter: ":not(" + content + ")", tidy: function tidy(_ref6) { var _ref6$cNvSpPr = _ref6.cNvSpPr, cNvSpPr = _ref6$cNvSpPr === undefined ? {} : _ref6$cNvSpPr, _ref6$spPr = _ref6.spPr, spPr = _ref6$spPr === undefined ? {} : _ref6$spPr, _ref6$style = _ref6.style; _ref6$style = _ref6$style === undefined ? {} : _ref6$style; var _ref6$style$lnRef = _ref6$style.lnRef, lnRef = _ref6$style$lnRef === undefined ? {} : _ref6$style$lnRef, _ref6$style$fillRef = _ref6$style.fillRef, fillRef = _ref6$style$fillRef === undefined ? {} : _ref6$style$fillRef, _ref6$style$effectRef = _ref6$style.effectRef, effectRef = _ref6$style$effectRef === undefined ? {} : _ref6$style$effectRef, _ref6$style$fontRef = _ref6$style.fontRef, fontRef = _ref6$style$fontRef === undefined ? {} : _ref6$style$fontRef, others = _objectWithoutProperties(_ref6, ["cNvSpPr", "spPr", "style"]); return _extends({}, cNvSpPr, lnRef, fillRef, effectRef, spPr, { textStyle: fontRef }, others); } })); return _extends({}, props, { type: "shape", children: children }); }, Fallback: function Fallback() { return null; }, sdt: function sdt(wXml, officeDocument) { var $ = officeDocument.content(wXml); var pr = $.find('>w\\:sdtPr'); var content = $.find('>w\\:sdtContent'); var children = content.children().toArray(); var elBinding = pr.find('w\\:dataBinding').get(0); if (elBinding) { //properties var path = elBinding.attribs['w:xpath'], d = path.split(/[\/\:\[]/), name = (d.pop(), d.pop()); var value = content.text(); return { type: "property", name: name, value: value, children: children }; } else { var _ret = function () { //controls var prChildren = pr.get(0).children; var elType = prChildren[prChildren.length - 1]; var name = elType.name.split(":").pop(); var type = "text,picture,docPartList,docPartObj,comboBox,dropDownList,date,checkbox,repeatingSection,repeatingSectionItem".split(",").find(function (a) { return a == name; }); var model = { children: children }; if (type) { model.type = "control." + type; } else { //container if (content.find("w\\:p,w\\:tbl,w\\:tr,w\\:tc").length) { model.type = "block"; } else { model.type = "inline"; } } $ = officeDocument.content; switch (model.type) { case "control.dropDownList": case "control.comboBox": { var _ret2 = function () { var selected = $(content).text(); model.options = $(elType).find("w\\:listItem").map(function (i, li) { return { displayText: li.attribs["w:displayText"], value: li.attribs["w:value"] }; }).get(); model.value = (model.options.find(function (a) { return a.displayText == selected; }) || {}).value; return "break"; }(); if (_ret2 === "break") break; } case "control.checkbox": { var ns = elType.name.split(":")[0]; model.checked = $(elType).find(ns + "\\:checked").attr(ns + ":val") == "1"; break; } case "control.text": if (content.find('w\\:r [w\\:val~=Placeholder]').length == 0) model.value = content.text(); break; case "control.date": model.value = new Date($(elType).attr("w:fullDate")); model.format = $(elType).find("w\\:dateFormat").attr("w:val"); model.locale = $(elType).find("w\\:lid").attr("w:val"); break; } return { v: model }; }(); if ((typeof _ret === "undefined" ? "undefined" : _typeof(_ret)) === "object") return _ret.v; } }, hyperlink: function hyperlink(wXml, officeDocument) { if (wXml.attribs["r:id"]) { var url = officeDocument.getRel(wXml.attribs["r:id"]); return { type: "hyperlink", url: url }; } else if (wXml.attribs["w:anchor"]) { return { type: "hyperlink", url: "#" + wXml.attribs["w:anchor"] }; } }, tbl: function tbl(wXml) { return wXml.children.reduce(function (state, node) { switch (node.name) { case "w:tblPr": state.pr = node; break; case "w:tblGrid": state.cols = node.children; break; default: state.children.push(node); } return state; }, { type: "tbl", children: [], pr: null, cols: [] }); }, tr: function tr(wXml) { return wXml.children.reduce(function (state, node) { switch (node.name) { case "w:trPr": state.pr = node; state.isHeader = !!node.children.find(function (a) { return a.name == "w:tblHeader"; }); break; default: state.children.push(node); } return state; }, { type: "tr", children: [], pr: null }); }, tc: function tc(wXml) { return wXml.children.reduce(function (state, node) { switch (node.name) { case "w:tcPr": state.pr = node; break; default: state.children.push(node); } return state; }, { type: "tc", children: [], pr: null }); }, altChunk: function altChunk(wXml, officeDocument) { var rId = wXml.attribs['r:id']; var data = officeDocument.getRel(rId); var partName = officeDocument.folder + officeDocument.rels("[Id=" + rId + "]").attr("Target"); var contentType = officeDocument.doc.contentTypes("Override[PartName='" + partName + "']").attr("ContentType"); return { type: "chunk", data: data, contentType: contentType }; }, docDefaults: function docDefaults(wXml) { return { type: "style" }; }, style: function style(wXml) { return { type: "style", id: wXml.attribs['w:styleId'] }; }, abstractNum: function abstractNum(wXml) { return { type: "abstractNum", id: wXml.attribs["w:abstractNumId"] }; }, num: function num(wXml) { return { type: "num", id: wXml.attribs["w:numId"], abstractNum: wXml.children.find(function (a) { return a.name == "w:abstractNumId"; }).attribs["w:val"] }; }, latentStyles: function latentStyles() { return null; }, object: function object(wXml, officeDocument) { var ole = officeDocument.content(wXml).find("o\\:OLEObject"); var type = ole.attr("ProgID"); var embed = ole.attr("Type") === "Embed"; var rId = ole.attr("r:id"); return { type: "object", embed: embed, prog: type, data: officeDocument.getRelOleObject(rId) }; } }; exports.default = _class; module.exports = exports['default']; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vcGVueG1sL2RvY3gvb2ZmaWNlRG9jdW1lbnQuanMiXSwibmFtZXMiOlsiX2Fzc2lnblJlbCIsInNwbGl0IiwiJCIsInN0eWxlcyIsInByb3RvdHlwZSIsImJhc2VzdCIsInNlbGVjdG9yIiwiY3VycmVudCIsImxlbmd0aCIsImlzIiwicm9vdCIsImZpbmQiLCJjaGlsZHJlbiIsImF0dHIiLCJub3QiLCJjcmVhdGVFbGVtZW50IiwiaWRlbnRpZnkiLCJjb25zdHJ1Y3RvciIsImJpbmQiLCJudW1iZXJpbmciLCJyZW5kZXJOb2RlIiwiZ2V0IiwiY29udGVudCIsImRvbUhhbmRsZXIiLCJkb2MiLCJfaWRlbnRpZnkiLCJtb2RlbCIsImFyZ3VtZW50cyIsImVtaXQiLCJ0eXBlIiwiZG9jdW1lbnQiLCJpZGVudGl0aWVzIiwid1htbCIsIm9mZmljZURvY3VtZW50IiwiZWFjaCIsImkiLCJzZWN0IiwiZW5kIiwiY2xvc2VzdCIsInByZXZVbnRpbCIsInRvQXJyYXkiLCJyZXZlcnNlIiwicHVzaCIsInNlY3RQciIsImhmIiwiZmlsdGVyIiwiYSIsIm5hbWUiLCJyZWR1Y2UiLCJoZWFkZXJzIiwic2V0IiwiYXR0cmlicyIsImdldFJlbCIsIk1hcCIsImZvb3RlcnMiLCJoYXNUaXRsZVBhZ2UiLCJwIiwiaWRlbnRpdHkiLCJwciIsInBQciIsInN0eWxlSWQiLCJudW1QciIsIm51bUlkIiwibGV2ZWwiLCJwYXJzZUludCIsInN0YXJ0c1dpdGgiLCJvdXRsaW5lTHZsIiwib3V0bGluZSIsInIiLCJmbGRDaGFyIiwiaW5saW5lIiwiYW5jaG9yIiwiZ3JhcGhpY0RhdGEiLCJwb3AiLCJwaWMiLCJwcm9wcyIsInRpZHkiLCJzcFByIiwibnZQaWNQciIsImNOdlByIiwiY052U3BQciIsIm52UHIiLCJzdHlsZSIsImxuUmVmIiwiZmlsbFJlZiIsImVmZmVjdFJlZiIsIm90aGVycyIsIndzcCIsInNhbWUiLCJrZXlzIiwiZngiLCJmcyIsImsiLCJtYXAiLCJlbXUyUHgiLCJ2IiwiX19maWx0ZXIiLCJmb250UmVmIiwidGV4dFN0eWxlIiwiRmFsbGJhY2siLCJzZHQiLCJlbEJpbmRpbmciLCJwYXRoIiwiZCIsInZhbHVlIiwidGV4dCIsInByQ2hpbGRyZW4iLCJlbFR5cGUiLCJzZWxlY3RlZCIsIm9wdGlvbnMiLCJsaSIsImRpc3BsYXlUZXh0IiwibnMiLCJjaGVja2VkIiwiRGF0ZSIsImZvcm1hdCIsImxvY2FsZSIsImh5cGVybGluayIsInVybCIsInRibCIsInN0YXRlIiwibm9kZSIsImNvbHMiLCJ0ciIsImlzSGVhZGVyIiwidGMiLCJhbHRDaHVuayIsInJJZCIsImRhdGEiLCJwYXJ0TmFtZSIsImZvbGRlciIsInJlbHMiLCJjb250ZW50VHlwZSIsImNvbnRlbnRUeXBlcyIsImRvY0RlZmF1bHRzIiwiaWQiLCJhYnN0cmFjdE51bSIsIm51bSIsImxhdGVudFN0eWxlcyIsIm9iamVjdCIsIm9sZSIsImVtYmVkIiwicHJvZyIsImdldFJlbE9sZU9iamVjdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7OztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQUdRO0FBQ047QUFDQSxRQUFLQSxVQUFMLENBQWdCLDRCQUE0QkMsS0FBNUIsQ0FBa0MsR0FBbEMsQ0FBaEI7O0FBRUEsT0FBSUMsSUFBRSxLQUFLQyxNQUFYO0FBQ0EsUUFBS0EsTUFBTCxDQUFZQyxTQUFaLENBQXNCQyxNQUF0QixHQUE2QixVQUFTQyxRQUFULEVBQWtCO0FBQzlDLFFBQUlDLFVBQVEsSUFBWjtBQUNBLFdBQU1BLFFBQVFDLE1BQVIsR0FBZSxDQUFyQixFQUF1QjtBQUN0QixTQUFHRCxRQUFRRSxFQUFSLENBQVdILFFBQVgsQ0FBSCxFQUF3QjtBQUN2QixhQUFPSixFQUFFSyxPQUFGLENBQVA7QUFDQTtBQUNEQSxlQUFRTCxFQUFFUSxJQUFGLEdBQVNDLElBQVQsOEJBQXdDSixRQUFRSyxRQUFSLENBQWlCLGFBQWpCLEVBQWdDQyxJQUFoQyxDQUFxQyxPQUFy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Q0EsRUFwUGdCO0FBcVBqQnNGLElBclBpQixlQXFQYnpHLElBclBhLEVBcVBSO0FBQ1IsU0FBTyxFQUFDSCxNQUFLLEtBQU4sRUFBWTBHLElBQUd2RyxLQUFLbUIsT0FBTCxDQUFhLFNBQWIsQ0FBZixFQUF1Q3FGLGFBQVl4RyxLQUFLcEIsUUFBTCxDQUFjRCxJQUFkLENBQW1CO0FBQUEsV0FBR21DLEVBQUVDLElBQUYsSUFBUSxpQkFBWDtBQUFBLElBQW5CLEVBQWlESSxPQUFqRCxDQUF5RCxPQUF6RCxDQUFuRCxFQUFQO0FBQ0EsRUF2UGdCO0FBd1BqQnVGLGFBeFBpQiwwQkF3UEg7QUFDYixTQUFPLElBQVA7QUFDQSxFQTFQZ0I7QUEyUGpCQyxPQTNQaUIsa0JBMlBWM0csSUEzUFUsRUEyUExDLGNBM1BLLEVBMlBVO0FBQzFCLE1BQUkyRyxNQUFJM0csZUFBZVgsT0FBZixDQUF1QlUsSUFBdkIsRUFBNkJyQixJQUE3QixDQUFrQyxlQUFsQyxDQUFSO0FBQ0EsTUFBSWtCLE9BQUsrRyxJQUFJL0gsSUFBSixDQUFTLFFBQVQsQ0FBVDtBQUNBLE1BQUlnSSxRQUFNRCxJQUFJL0gsSUFBSixDQUFTLE1BQVQsTUFBbUIsT0FBN0I7QUFDQSxNQUFJa0gsTUFBSWEsSUFBSS9ILElBQUosQ0FBUyxNQUFULENBQVI7QUFDQSxTQUFPLEVBQUNnQixNQUFLLFFBQU4sRUFBZWdILFlBQWYsRUFBc0JDLE1BQU1qSCxJQUE1QixFQUFrQ21HLE1BQUsvRixlQUFlOEcsZUFBZixDQUErQmhCLEdBQS9CLENBQXZDLEVBQVA7QUFDQTtBQWpRZ0IsQyIsImZpbGUiOiJvZmZpY2VEb2N1bWVudC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCYXNlIGZyb20gXCIuLi9vZmZpY2VEb2N1bWVudFwiXHJcbmltcG9ydCBkcmF3bWwgZnJvbSBcIi4uL2RyYXdtbFwiXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBleHRlbmRzIEJhc2V7XHJcblx0X2luaXQoKXtcclxuXHRcdHN1cGVyLl9pbml0KClcclxuXHRcdHRoaXMuX2Fzc2lnblJlbChcInN0eWxlcyxudW1iZXJpbmcsc2V0dGluZ3NcIi5zcGxpdChcIixcIikpXHJcblxyXG5cdFx0dmFyICQ9dGhpcy5zdHlsZXNcclxuXHRcdHRoaXMuc3R5bGVzLnByb3RvdHlwZS5iYXNlc3Q9ZnVuY3Rpb24oc2VsZWN0b3Ipe1xyXG5cdFx0XHRsZXQgY3VycmVudD10aGlzXHJcblx0XHRcdHdoaWxlKGN1cnJlbnQubGVuZ3RoPjApe1xyXG5cdFx0XHRcdGlmKGN1cnJlbnQuaXMoc2VsZWN0b3IpKXtcclxuXHRcdFx0XHRcdHJldHVybiAkKGN1cnJlbnQpXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGN1cnJlbnQ9JC5yb290KCkuZmluZChgd1xcXFw6c3R5bGVbd1xcXFw6c3R5bGVJZD1cIiR7Y3VycmVudC5jaGlsZHJlbihcIndcXFxcOmJhc2VkT25cIikuYXR0cihcInc6dmFsXCIpfVwiXWApXHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHRoaXMubm90KHRoaXMpXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZW5kZXIoY3JlYXRlRWxlbWVudCwgaWRlbnRpZnk9dGhpcy5jb25zdHJ1Y3Rvci5pZGVudGlmeS5iaW5kKHRoaXMuY29uc3RydWN0b3IpKXtcclxuXHRcdGxldCBzdHlsZXMsIG51bWJlcmluZ1xyXG5cdFx0aWYodGhpcy5zdHlsZXMpXHJcblx0XHRcdHN0eWxlcz10aGlzLnJlbmRlck5vZGUodGhpcy5zdHlsZXMoXCJ3XFxcXDpzdHlsZXNcIikuZ2V0KDApLGNyZWF0ZUVsZW1lbnQsaWRlbnRpZnkpXHJcblx0XHRpZih0aGlzLm51bWJlcmluZylcclxuXHRcdFx0bnVtYmVyaW5nPXRoaXMucmVuZGVyTm9kZSh0aGlzLm51bWJlcmluZyhcIndcXFxcOm51bWJlcmluZ1wiKS5nZXQoMCksY3JlYXRlRWxlbWVudCxpZGVudGlmeSlcclxuXHRcdHJldHVybiB0aGlzLnJlbmRlck5vZGUodGhpcy5jb250ZW50KFwid1xcXFw6ZG9jdW1lbnRcIikuZ2V0KDApLGNyZWF0ZUVsZW1lbnQsIGlkZW50aWZ5LCB7c3R5bGVzLG51bWJlcmluZ30pXHJcblx0fVxyXG5cclxuXHRwYXJzZShkb21IYW5kbGVyLGlkZW50aWZ5PXRoaXMuY29uc3RydWN0b3IuaWRlbnRpZnkuYmluZCh0aGlzLmNvbnN0cnVjdG9yKSl7XHJcblx0XHRjb25zdCBkb2M9e31cclxuXHRcdGNvbnN0IGNyZWF0ZUVsZW1lbnQ9ZG9tSGFuZGxlci5jcmVhdGVFbGVtZW50LmJpbmQoZG9tSGFuZGxlcilcclxuXHRcdGZ1bmN0aW9uIF9pZGVudGlmeSgpe1xyXG5cdFx0XHRsZXQgbW9kZWw9aWRlbnRpZnkoLi4uYXJndW1lbnRzKVxyXG5cdFx0XHRpZihtb2RlbCAmJiB0eXBlb2YobW9kZWwpPT1cIm9iamVjdFwiKXtcclxuXHRcdFx0XHRkb21IYW5kbGVyLmVtaXQoXCIqXCIsbW9kZWwsLi4uYXJndW1lbnRzKVxyXG5cdFx0XHRcdGRvbUhhbmRsZXIuZW1pdChtb2RlbC50eXBlLCBtb2RlbCwuLi5hcmd1bWVudHMpXHJcblx0XHRcdFx0aWYoZG9tSGFuZGxlcltgb24ke21vZGVsLnR5cGV9YF0pXHJcblx0XHRcdFx0XHRkb21IYW5kbGVyW2BvbiR7bW9kZWwudHlwZX1gXShtb2RlbCwuLi5hcmd1bWVudHMpXHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIG1vZGVsXHJcblx0XHR9XHJcblxyXG5cdFx0aWYodGhpcy5zdHlsZXMpXHJcblx0XHRcdGRvYy5zdHlsZXM9dGhpcy5yZW5kZXJOb2RlKHRoaXMuc3R5bGVzKFwid1xcXFw6c3R5bGVzXCIpLmdldCgwKSxjcmVhdGVFbGVtZW50LF9pZGVudGlmeSlcclxuXHRcdGlmKHRoaXMubnVtYmVyaW5nKVxyXG5cdFx0XHRkb2MubnVtYmVyaW5nPXRoaXMucmVuZGVyTm9kZSh0aGlzLm51bWJlcmluZyhcIndcXFxcOm51bWJlcmluZ1wiKS5nZXQoMCksY3JlYXRlRWxlbWVudCxfaWRlbnRpZnkpXHJcblx0XHRkb2MuZG9jdW1lbnQ9dGhpcy5yZW5kZXJOb2RlKHRoaXMuY29udGVudChcIndcXFxcOmRvY3VtZW50XCIpLmdldCgwKSxjcmVhdGVFbGVtZW50LF9pZGVudGlmeSlcclxuXHRcdHJldHVybiBkb2NcclxuXHR9XHJcblxyXG5cdHN0YXRpYyBpZGVudGl0aWVzPXtcclxuXHRcdGRvY3VtZW50KHdYbWwsb2ZmaWNlRG9jdW1lbnQpe1xyXG5cdFx0XHRsZXQgJD1vZmZpY2VEb2N1bWVudC5jb250ZW50XHJcblx0XHRcdGxldCBjdXJyZW50PW51bGxcclxuXHRcdFx0bGV0IGNoaWxkcmVuPSQoXCJ3XFxcXDpzZWN0UHJcIikuZWFjaCgoaSxzZWN0KT0+e1xyXG5cdFx0XHRcdGxldCBlbmQ9JChzZWN0KS5jbG9zZXN0KCd3XFxcXDpib2R5PionKVxyXG5cdFx0XHRcdHNlY3QuY29udGVudD1lbmQucHJldlVudGlsKGN1cnJlbnQpLnRvQXJyYXkoKS5yZXZlcnNlKClcclxuXHRcdFx0XHRpZighZW5kLmlzKHNlY3QpKVxyXG5cdFx0XHRcdFx0c2VjdC5jb250ZW50LnB1c2goZW5kLmdldCgwKSlcclxuXHRcdFx0XHRjdXJyZW50PWVuZFxyXG5cdFx0XHR9KS50b0FycmF5KClcclxuXHRcdFx0cmV0dXJuIHt0eXBlOlwiZG9jdW1lbnRcIiwgY2hpbGRyZW59XHJcblx0XHR9LFxyXG5cdFx0c2VjdFByKHdYbWwsb2ZmaWNlRG9jdW1lbnQpe1xyXG5cdFx0XHRjb25zdCBoZj10eXBlPT53WG1sLmNoaWxkcmVuLmZpbHRlcihhPT5hLm5hbWU9PWB3OiR7dHlwZX1SZWZlcmVuY2VgKS5yZWR1Y2UoKGhlYWRlcnMsYSk9PntcclxuXHRcdFx0XHRcdGhlYWRlcnMuc2V0KGEuYXR0cmlic1tcInc6dHlwZVwiXSxvZmZpY2VEb2N1bWVudC5nZXRSZWwoYS5hdHRyaWJzW1wicjppZFwiXSkpXHJcblx0XHRcdFx0XHRyZXR1cm4gaGVhZGVyc1xyXG5cdFx0XHRcdH0sbmV3IE1hcCgpKVxyXG5cclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHR0eXBlOlwic2VjdGlvblwiLFxyXG5cdFx0XHRcdGNoaWxkcmVuOndYbWwuY29udGVudCxcclxuXHRcdFx0XHRoZWFkZXJzOmhmKFwiaGVhZGVyXCIpLFxyXG5cdFx0XHRcdGZvb3RlcnM6aGYoXCJmb290ZXJcIiksXHJcblx0XHRcdFx0aGFzVGl0bGVQYWdlOiAhIXdYbWwuY2hpbGRyZW4uZmluZChhPT5hLm5hbWU9PVwidzp0aXRsZVBnXCIpXHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0XHRwKHdYbWwsb2ZmaWNlRG9jdW1lbnQpe1xyXG5cdFx0XHRsZXQgJD1vZmZpY2VEb2N1bWVudC5jb250ZW50KHdYbWwpXHJcblx0XHRcdGxldCB0eXBlPVwicFwiXHJcblxyXG5cdFx0XHRsZXQgaWRlbnRpdHk9e3R5cGUscHI6d1htbC5jaGlsZHJlbi5maW5kKCh7bmFtZX0pPT5uYW1lPT1cInc6cFByXCIpLGNoaWxkcmVuOndYbWwuY2hpbGRyZW4uZmlsdGVyKCh7bmFtZX0pPT5uYW1lIT1cInc6cFByXCIpfVxyXG5cclxuXHRcdFx0bGV0IHBQcj0kLmZpbmQoXCJ3XFxcXDpwUHJcIilcclxuXHRcdFx0aWYocFByLmxlbmd0aCl7XHJcblx0XHRcdFx0bGV0IHN0eWxlSWQ9cFByLmZpbmQoXCJ3XFxcXDpwU3R5bGVcIikuYXR0cihcInc6dmFsXCIpXHJcblxyXG5cdFx0XHRcdGxldCBudW1Qcj1wUHIuY2hpbGRyZW4oXCJ3XFxcXDpudW1QclwiKVxyXG5cdFx0XHRcdGlmKCFudW1Qci5sZW5ndGggJiYgc3R5bGVJZCl7XHJcblx0XHRcdFx0XHRudW1Qcj1vZmZpY2VEb2N1bWVudFxyXG5cdFx0XHRcdFx0XHQuc3R5bGVzKGB3XFxcXDpzdHlsZVt3XFxcXDpzdHlsZUlkPVwiJHtzdHlsZUlkfVwiXWApXHJcblx0XHRcdFx0XHRcdC5iYXNlc3QoYDpoYXMod1xcXFw6bnVtUHIpYClcclxuXHRcdFx0XHRcdFx0LmZpbmQoXCJ3XFxcXDpudW1QclwiKVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYobnVtUHIubGVuZ3RoKXtcclxuXHRcdFx0XHRcdGlkZW50aXR5LnR5cGU9XCJsaXN0XCJcclxuXHRcdFx0XHRcdGlkZW50aXR5Lm51bUlkPW51bVByLmZpbmQoXCJ3XFxcXDpudW1JZFwiKS5hdHRyKFwidzp2YWxcIilcclxuXHRcdFx0XHRcdGlkZW50aXR5LmxldmVsPXBhcnNlSW50KG51bVByLmZpbmQoXCJ3XFxcXDppbHZsXCIpLmF0dHIoXCJ3OnZhbFwiKXx8MClcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmKHN0eWxlSWQgJiYgc3R5bGVJZC5zdGFydHNXaXRoKFwiSGVhZGluZ1wiKSl7XHJcblx0XHRcdFx0XHRsZXQgb3V0bGluZUx2bD1vZmZpY2VEb2N1bWVudFxyXG5cdFx0XHRcdFx0XHQuc3R5bGVzKGB3XFxcXDpzdHlsZVt3XFxcXDpzdHlsZUlkPVwiJHtzdHlsZUlkfVwiXWApXHJcblx0XHRcdFx0XHRcdC5iYXNlc3QoXCI6aGFzKHdcXFxcOm91dGxpbmVMdmwpXCIpXHJcblx0XHRcdFx0XHRcdC5maW5kKFwid1xcXFw6b3V0bGluZUx2bFwiKVxyXG5cdFx0XHRcdFx0XHQuYXR0cihcInc6dmFsXCIpXHJcblx0XHRcdFx0XHRpZihvdXRsaW5lTHZsKXtcclxuXHRcdFx0XHRcdFx0aWRlbnRpdHkudHlwZT1cImhlYWRpbmdcIlxyXG5cdFx0XHRcdFx0XHRpZGVudGl0eS5vdXRsaW5lPXBhcnNlSW50KG91dGxpbmVMdmwpKzFcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBpZGVudGl0eVxyXG5cdFx0fSxcclxuXHRcdHIod1htbCl7XHJcblx0XHRcdHJldHVybiB7dHlwZTpcInJcIiwgcHI6IHdYbWwuY2hpbGRyZW4uZmluZCgoe25hbWV9KT0+bmFtZT09XCJ3OnJQclwiKSwgY2hpbGRyZW46IHdYbWwuY2hpbGRyZW4uZmlsdGVyKCh7bmFtZX0pPT5uYW1lIT1cInc6clByXCIpfVxyXG5cdFx0fSxcclxuXHRcdGZsZENoYXIod1htbCl7XHJcblx0XHRcdHJldHVybiB3WG1sLmF0dHJpYnNbXCJ3OmZsZENoYXJUeXBlXCJdXHJcblx0XHR9LFxyXG5cclxuXHRcdGlubGluZSh3WG1sLG9mZmljZURvY3VtZW50KXtcclxuXHRcdFx0bGV0ICQ9b2ZmaWNlRG9jdW1lbnQuY29udGVudCh3WG1sKVxyXG5cdFx0XHRyZXR1cm4ge3R5cGU6YGRyYXdpbmcuaW5saW5lYCwgY2hpbGRyZW46JC5maW5kKCdhXFxcXDpncmFwaGljPmFcXFxcOmdyYXBoaWNEYXRhJykuY2hpbGRyZW4oKS50b0FycmF5KCl9XHJcblx0XHR9LFxyXG5cdFx0YW5jaG9yKHdYbWwsIG9mZmljZURvY3VtZW50KXtcclxuXHRcdFx0bGV0ICQ9b2ZmaWNlRG9jdW1lbnQuY29udGVudCh3WG1sKVxyXG5cdFx0XHRsZXQgZ3JhcGhpY0RhdGE9JC5maW5kKCc+YVxcXFw6Z3JhcGhpYz5hXFxcXDpncmFwaGljRGF0YScpXHJcblx0XHRcdGxldCB0eXBlPWdyYXBoaWNEYXRhLmF0dHIoXCJ1cmlcIikuc3BsaXQoXCIvXCIpLnBvcCgpXHJcblx0XHRcdGxldCBjaGlsZHJlbj1ncmFwaGljRGF0YS5jaGlsZHJlbigpLnRvQXJyYXkoKVxyXG5cdFx0XHRpZih0eXBlPT1cIndvcmRwcm9jZXNzaW5nR3JvdXBcIilcclxuXHRcdFx0XHRjaGlsZHJlbj1jaGlsZHJlblswXS5jaGlsZHJlbi5maWx0ZXIoYT0+YS5uYW1lLnNwbGl0KFwiOlwiKVswXSE9XCJ3cGdcIilcclxuXHJcblx0XHRcdHJldHVybiB7dHlwZTpcImRyYXdpbmcuYW5jaG9yXCIsY2hpbGRyZW59XHJcblx0XHR9LFxyXG5cclxuXHRcdHBpYyh3WG1sLCBvZmZpY2VEb2N1bWVudCl7XHJcblx0XHRcdGNvbnN0ICQ9b2ZmaWNlRG9jdW1lbnQuJCh3WG1sKVxyXG4gICAgICAgICAgICBjb25zdCBwcm9wcz0kLnByb3BzKHtcclxuICAgICAgICAgICAgICAgIC4uLmRyYXdtbChvZmZpY2VEb2N1bWVudCksXHJcbiAgICAgICAgICAgICAgICB0aWR5Oih7c3BQciwgbnZQaWNQcjp7Y052UHI9e30sY052U3BQcj17fSxudlByPXt9fSwgc3R5bGU6e2xuUmVmPXt9LGZpbGxSZWY9e30sZWZmZWN0UmVmPXt9fT17fSwuLi5vdGhlcnN9KT0+KHsuLi5sblJlZiwuLi5maWxsUmVmLCAuLi5lZmZlY3RSZWYsLi4uc3BQciwgLi4uY052UHIsLi4uY052U3BQciwuLi5udlByLC4uLm90aGVyc30pXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHJldHVybiB7Li4ucHJvcHMsdHlwZTpcInBpY3R1cmVcIn1cclxuICAgICAgICB9LFxyXG5cclxuXHRcdHdzcCh3WG1sLCBvZmZpY2VEb2N1bWVudCl7XHJcblx0XHRcdGNvbnN0IGNvbnRlbnQ9XCJ3cHNcXFxcOnR4YnhcIlxyXG5cdFx0XHRjb25zdCAkPW9mZmljZURvY3VtZW50LiQod1htbClcclxuXHRcdFx0Y29uc3QgY2hpbGRyZW49JC5jaGlsZHJlbihjb250ZW50KS5jaGlsZHJlbihcIndcXFxcOnR4YnhDb250ZW50XCIpLmNoaWxkcmVuKCkudG9BcnJheSgpXHJcblx0XHRcdGNvbnN0IHNhbWU9KGtleXMsZngpPT5rZXlzLnJlZHVjZSgoZnMsIGspPT4oZnNba109ZngsIGZzKSx7fSlcclxuXHJcblx0XHRcdGNvbnN0IHByb3BzPSQucHJvcHMoe1xyXG5cdFx0XHRcdC4uLmRyYXdtbChvZmZpY2VEb2N1bWVudCksXHJcblx0XHRcdFx0Li4uc2FtZShcInIsdCxsLGJcIi5zcGxpdChcIixcIikubWFwKGE9PmAke2F9SW5zYCksIHY9Pm9mZmljZURvY3VtZW50LmRvYy5lbXUyUHgodikpLFxyXG5cdFx0XHRcdF9fZmlsdGVyOmA6bm90KCR7Y29udGVudH0pYCxcclxuXHRcdFx0XHR0aWR5Oih7Y052U3BQcj17fSwgc3BQcj17fSwgc3R5bGU6e2xuUmVmPXt9LGZpbGxSZWY9e30sZWZmZWN0UmVmPXt9LGZvbnRSZWY9e319PXt9LC4uLm90aGVyc30pPT4oey4uLmNOdlNwUHIsIC4uLmxuUmVmLC4uLmZpbGxSZWYsIC4uLmVmZmVjdFJlZiwgLi4uc3BQciwgdGV4dFN0eWxlOiBmb250UmVmLCAuLi5vdGhlcnN9KVxyXG5cdFx0XHR9KVxyXG5cdFx0XHRyZXR1cm4gey4uLnByb3BzLCB0eXBlOlwic2hhcGVcIiwgY2hpbGRyZW59XHJcblx0XHR9LFxyXG5cdFx0RmFsbGJhY2soKXtcclxuXHRcdFx0cmV0dXJuIG51bGxcclxuXHRcdH0sXHJcblx0XHRzZHQod1htbCxvZmZpY2VEb2N1bWVudCl7XHJcblx0XHRcdGxldCAkPW9mZmljZURvY3VtZW50LmNvbnRlbnQod1htbClcclxuXHRcdFx0bGV0IHByPSQuZmluZCgnPndcXFxcOnNkdFByJylcclxuXHRcdFx0bGV0IGNvbnRlbnQ9JC5maW5kKCc+d1xcXFw6c2R0Q29udGVudCcpXHJcblx0XHRcdGxldCBjaGlsZHJlbj1jb250ZW50LmNoaWxkcmVuKCkudG9BcnJheSgpXHJcblxyXG5cdFx0XHRsZXQgZWxCaW5kaW5nPXByLmZpbmQoJ3dcXFxcOmRhdGFCaW5kaW5nJykuZ2V0KDApXHJcblx0XHRcdGlmKGVsQmluZGluZyl7Ly9wcm9wZXJ0aWVzXHJcblx0XHRcdFx0bGV0IHBhdGg9ZWxCaW5kaW5nLmF0dHJpYnNbJ3c6eHBhdGgnXSxcclxuXHRcdFx0XHRcdGQ9cGF0aC5zcGxpdCgvW1xcL1xcOlxcW10vKSxcclxuXHRcdFx0XHRcdG5hbWU9KGQucG9wKCksZC5wb3AoKSk7XHJcblx0XHRcdFx0bGV0IHZhbHVlPWNvbnRlbnQudGV4dCgpXHJcblxyXG5cdFx0XHRcdHJldHVybiB7dHlwZTpcInByb3BlcnR5XCIsIG5hbWUsIHZhbHVlLCBjaGlsZHJlbn1cclxuXHRcdFx0fWVsc2V7Ly9jb250cm9sc1xyXG5cdFx0XHRcdGxldCBwckNoaWxkcmVuPXByLmdldCgwKS5jaGlsZHJlblxyXG5cdFx0XHRcdGxldCBlbFR5cGU9cHJDaGlsZHJlbltwckNoaWxkcmVuLmxlbmd0aC0xXVxyXG5cdFx0XHRcdGxldCBuYW1lPWVsVHlwZS5uYW1lLnNwbGl0KFwiOlwiKS5wb3AoKVxyXG5cdFx0XHRcdGxldCB0eXBlPVwidGV4dCxwaWN0dXJlLGRvY1BhcnRMaXN0LGRvY1BhcnRPYmosY29tYm9Cb3gsZHJvcERvd25MaXN0LGRhdGUsY2hlY2tib3gscmVwZWF0aW5nU2VjdGlvbixyZXBlYXRpbmdTZWN0aW9uSXRlbVwiLnNwbGl0KFwiLFwiKVxyXG5cdFx0XHRcdFx0LmZpbmQoYT0+YT09bmFtZSlcclxuXHRcdFx0XHRsZXQgbW9kZWw9e2NoaWxkcmVufVxyXG5cdFx0XHRcdGlmKHR5cGUpe1xyXG5cdFx0XHRcdFx0bW9kZWwudHlwZT1gY29udHJvbC4ke3R5cGV9YFxyXG5cdFx0XHRcdH1lbHNley8vY29udGFpbmVyXHJcblx0XHRcdFx0XHRpZihjb250ZW50LmZpbmQoXCJ3XFxcXDpwLHdcXFxcOnRibCx3XFxcXDp0cix3XFxcXDp0Y1wiKS5sZW5ndGgpe1xyXG5cdFx0XHRcdFx0XHRtb2RlbC50eXBlPVwiYmxvY2tcIlxyXG5cdFx0XHRcdFx0fWVsc2V7XHJcblx0XHRcdFx0XHRcdG1vZGVsLnR5cGU9XCJpbmxpbmVcIlxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0JD1vZmZpY2VEb2N1bWVudC5jb250ZW50XHJcblx0XHRcdFx0c3dpdGNoKG1vZGVsLnR5cGUpe1xyXG5cdFx0XHRcdFx0Y2FzZSBcImNvbnRyb2wuZHJvcERvd25MaXN0XCI6XHJcblx0XHRcdFx0XHRjYXNlIFwiY29udHJvbC5jb21ib0JveFwiOntcclxuXHRcdFx0XHRcdFx0bGV0IHNlbGVjdGVkPSQoY29udGVudCkudGV4dCgpXHJcblx0XHRcdFx0XHRcdG1vZGVsLm9wdGlvbnM9JChlbFR5cGUpXHJcblx0XHRcdFx0XHRcdFx0LmZpbmQoXCJ3XFxcXDpsaXN0SXRlbVwiKVxyXG5cdFx0XHRcdFx0XHRcdC5tYXAoKGksbGkpPT57XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRkaXNwbGF5VGV4dDogbGkuYXR0cmlic1tcInc6ZGlzcGxheVRleHRcIl0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlOiBsaS5hdHRyaWJzW1widzp2YWx1ZVwiXVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHRcdFx0LmdldCgpXHJcblx0XHRcdFx0XHRcdG1vZGVsLnZhbHVlPShtb2RlbC5vcHRpb25zLmZpbmQoYT0+YS5kaXNwbGF5VGV4dD09c2VsZWN0ZWQpfHx7fSkudmFsdWVcclxuXHRcdFx0XHRcdFx0YnJlYWtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGNhc2UgXCJjb250cm9sLmNoZWNrYm94XCI6e1xyXG5cdFx0XHRcdFx0XHRsZXQgbnM9ZWxUeXBlLm5hbWUuc3BsaXQoXCI6XCIpWzBdXHJcblx0XHRcdFx0XHRcdG1vZGVsLmNoZWNrZWQ9JChlbFR5cGUpLmZpbmQoYCR7bnN9XFxcXDpjaGVja2VkYCkuYXR0cihgJHtuc306dmFsYCk9PVwiMVwiXHJcblx0XHRcdFx0XHRcdGJyZWFrXHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRjYXNlIFwiY29udHJvbC50ZXh0XCI6XHJcblx0XHRcdFx0XHRcdGlmKGNvbnRlbnQuZmluZCgnd1xcXFw6ciBbd1xcXFw6dmFsfj1QbGFjZWhvbGRlcl0nKS5sZW5ndGg9PTApXHJcblx0XHRcdFx0XHRcdFx0bW9kZWwudmFsdWU9Y29udGVudC50ZXh0KClcclxuXHRcdFx0XHRcdFx0YnJlYWtcclxuXHRcdFx0XHRcdGNhc2UgXCJjb250cm9sLmRhdGVcIjpcclxuXHRcdFx0XHRcdFx0bW9kZWwudmFsdWU9bmV3IERhdGUoJChlbFR5cGUpLmF0dHIoXCJ3OmZ1bGxEYXRlXCIpKVxyXG5cdFx0XHRcdFx0XHRtb2RlbC5mb3JtYXQ9JChlbFR5cGUpLmZpbmQoXCJ3XFxcXDpkYXRlRm9ybWF0XCIpLmF0dHIoXCJ3OnZhbFwiKVxyXG5cdFx0XHRcdFx0XHRtb2RlbC5sb2NhbGU9JChlbFR5cGUpLmZpbmQoXCJ3XFxcXDpsaWRcIikuYXR0cihcInc6dmFsXCIpXHJcblx0XHRcdFx0XHRcdGJyZWFrXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybiBtb2RlbFxyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cdFx0aHlwZXJsaW5rKHdYbWwsb2ZmaWNlRG9jdW1lbnQpe1xyXG5cdFx0XHRpZih3WG1sLmF0dHJpYnNbXCJyOmlkXCJdKXtcclxuXHRcdFx0XHRsZXQgdXJsPW9mZmljZURvY3VtZW50LmdldFJlbCh3WG1sLmF0dHJpYnNbXCJyOmlkXCJdKVxyXG5cdFx0XHRcdHJldHVybiB7dHlwZTpcImh5cGVybGlua1wiLCB1cmx9XHJcblx0XHRcdH1lbHNlIGlmKHdYbWwuYXR0cmlic1tcInc6YW5jaG9yXCJdKXtcclxuXHRcdFx0XHRyZXR1cm4ge3R5cGU6XCJoeXBlcmxpbmtcIiwgdXJsOmAjJHt3WG1sLmF0dHJpYnNbXCJ3OmFuY2hvclwiXX1gfVxyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cdFx0dGJsKHdYbWwpe1xyXG5cdFx0XHRyZXR1cm4gd1htbC5jaGlsZHJlbi5yZWR1Y2UoKHN0YXRlLG5vZGUpPT57XHJcblx0XHRcdFx0c3dpdGNoKG5vZGUubmFtZSl7XHJcblx0XHRcdFx0Y2FzZSBcInc6dGJsUHJcIjpcclxuXHRcdFx0XHRcdHN0YXRlLnByPW5vZGVcclxuXHRcdFx0XHRicmVha1xyXG5cdFx0XHRcdGNhc2UgXCJ3OnRibEdyaWRcIjpcclxuXHRcdFx0XHRcdHN0YXRlLmNvbHM9bm9kZS5jaGlsZHJlblxyXG5cdFx0XHRcdGJyZWFrXHJcblx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdHN0YXRlLmNoaWxkcmVuLnB1c2gobm9kZSlcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIHN0YXRlXHJcblx0XHRcdH0se3R5cGU6XCJ0YmxcIixjaGlsZHJlbjpbXSxwcjpudWxsLGNvbHM6W119KVxyXG5cdFx0fSxcclxuXHRcdHRyKHdYbWwpe1xyXG5cdFx0XHRyZXR1cm4gd1htbC5jaGlsZHJlbi5yZWR1Y2UoKHN0YXRlLG5vZGUpPT57XHJcblx0XHRcdFx0c3dpdGNoKG5vZGUubmFtZSl7XHJcblx0XHRcdFx0Y2FzZSBcInc6dHJQclwiOlxyXG5cdFx0XHRcdFx0c3RhdGUucHI9bm9kZVxyXG5cdFx0XHRcdFx0c3RhdGUuaXNIZWFkZXI9ISFub2RlLmNoaWxkcmVuLmZpbmQoYT0+YS5uYW1lPT1cInc6dGJsSGVhZGVyXCIpXHJcblx0XHRcdFx0YnJlYWtcclxuXHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0c3RhdGUuY2hpbGRyZW4ucHV