\").append(html).html();\r\n }\r\n\r\n sandbox[0].innerHTML = html;\r\n\r\n container.append(sandbox.children(\"script, style\"));\r\n\r\n views = this._hideViews(sandbox);\r\n view = views.first();\r\n\r\n // Generic HTML content found as remote view - no remote view markers\r\n if (!view.length) {\r\n views = view = sandbox.wrapInner(\"
\").children(); // one element\r\n }\r\n\r\n if (urlPath) {\r\n view.hide().attr(attr(\"url\"), urlPath);\r\n }\r\n\r\n container.append(views);\r\n\r\n html = null; // Garbage collection.\r\n return this._createView(view);\r\n },\r\n\r\n _locate: function(selectors) {\r\n return roleSelector(selectors);\r\n },\r\n\r\n _findViewElement: function(url) {\r\n var element,\r\n urlPath = url.split(\"?\")[0];\r\n\r\n if (!urlPath) {\r\n return this.rootView;\r\n }\r\n\r\n element = this.container.children(\"[\" + attr(\"url\") + \"='\" + urlPath + \"']\");\r\n\r\n // do not try to search for \"#/foo/bar\" id, jQuery throws error\r\n if (!element[0] && urlPath.indexOf(\"/\") === -1) {\r\n element = this.container.children(urlPath.charAt(0) === \"#\" ? urlPath : \"#\" + urlPath);\r\n }\r\n\r\n if (!element[0]) {\r\n element = this._findViewElementById(url);\r\n }\r\n\r\n return element;\r\n },\r\n\r\n _findViewElementById: function(id) {\r\n var element = this.container.children(\"[id='\" + id + \"']\");\r\n return element;\r\n },\r\n\r\n _createView: function(element) {\r\n //return this._createMobileView(element);\r\n return this._createSpaView(element);\r\n },\r\n\r\n _createMobileView: function(element) {\r\n return kendo.initWidget(element, {\r\n defaultTransition: this.transition,\r\n loader: this.loader,\r\n container: this.container,\r\n getLayout: this.getLayoutProxy,\r\n modelScope: this.modelScope,\r\n reload: attrValue(element, \"reload\")\r\n }, ui.roles);\r\n },\r\n\r\n _createSpaView: function(element) {\r\n var viewOptions = (this.options || {}).viewOptions || {};\r\n return new kendo.View(element, {\r\n renderOnInit: viewOptions.renderOnInit,\r\n wrap: viewOptions.wrap || false,\r\n wrapInSections: viewOptions.wrapInSections,\r\n detachOnHide: viewOptions.detachOnHide,\r\n detachOnDestroy: viewOptions.detachOnDestroy\r\n });\r\n },\r\n\r\n _hideViews: function(container) {\r\n return container.children(this._locate(\"view\")).hide();\r\n }\r\n });\r\n\r\n kendo.ViewEngine = ViewEngine;\r\n\r\n kendo.ViewContainer = ViewContainer;\r\n kendo.Fragment = Fragment;\r\n kendo.Layout = Layout;\r\n kendo.View = View;\r\n kendo.ViewClone = ViewClone;\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$2u = kendo;\r\n\r\n var __meta__$2y = {\r\n id: \"dom\",\r\n name: \"Virtual DOM\",\r\n category: \"framework\",\r\n depends: [ \"core\" ],\r\n advanced: true\r\n };\r\n\r\n (function(kendo) {\r\n function Node() {\r\n this.node = null;\r\n }\r\n\r\n Node.prototype = {\r\n remove: function() {\r\n if (this.node.parentNode) {\r\n this.node.parentNode.removeChild(this.node);\r\n }\r\n this.attr = {};\r\n },\r\n attr: {},\r\n text: function() {\r\n return \"\";\r\n }\r\n };\r\n\r\n function NullNode() {\r\n }\r\n\r\n NullNode.prototype = {\r\n nodeName: \"#null\",\r\n attr: { style: {} },\r\n children: [],\r\n remove: function() {\r\n }\r\n };\r\n\r\n var NULL_NODE = new NullNode();\r\n\r\n function Element(nodeName, attr, children) {\r\n this.nodeName = nodeName;\r\n\r\n this.attr = attr || {};\r\n\r\n this.children = children || [];\r\n }\r\n\r\n Element.prototype = new Node();\r\n\r\n Element.prototype.appendTo = function(parent) {\r\n var node = typeof(this.nodeName) === \"string\" ? document.createElement(this.nodeName) : this.nodeName;\r\n\r\n var children = this.children;\r\n\r\n for (var index = 0; index < children.length; index++) {\r\n children[index].render(node, NULL_NODE);\r\n }\r\n\r\n parent.appendChild(node);\r\n\r\n return node;\r\n };\r\n\r\n Element.prototype.render = function(parent, cached) {\r\n var node;\r\n\r\n if (cached.nodeName !== this.nodeName) {\r\n cached.remove();\r\n\r\n node = this.appendTo(parent);\r\n } else {\r\n node = cached.node;\r\n\r\n var index;\r\n\r\n var children = this.children;\r\n\r\n var length = children.length;\r\n\r\n var cachedChildren = cached.children;\r\n\r\n var cachedLength = cachedChildren.length;\r\n\r\n if (Math.abs(cachedLength - length) > 2) {\r\n this.render({\r\n appendChild: function(node) {\r\n parent.replaceChild(node, cached.node);\r\n }\r\n }, NULL_NODE);\r\n\r\n return;\r\n }\r\n\r\n for (index = 0; index < length; index++) {\r\n children[index].render(node, cachedChildren[index] || NULL_NODE);\r\n }\r\n\r\n for (index = length; index < cachedLength; index++) {\r\n cachedChildren[index].remove();\r\n }\r\n }\r\n\r\n this.node = node;\r\n\r\n this.syncAttributes(cached.attr);\r\n\r\n this.removeAttributes(cached.attr);\r\n };\r\n\r\n Element.prototype.syncAttributes = function(cachedAttr) {\r\n var attr = this.attr;\r\n\r\n for (var name in attr) {\r\n var value = attr[name];\r\n\r\n var cachedValue = cachedAttr[name];\r\n\r\n if (name === \"style\") {\r\n this.setStyle(value, cachedValue);\r\n } else if (value !== cachedValue) {\r\n this.setAttribute(name, value, cachedValue);\r\n }\r\n }\r\n };\r\n\r\n Element.prototype.setStyle = function(style, cachedValue) {\r\n var node = this.node;\r\n var key;\r\n\r\n if (cachedValue) {\r\n for (key in style) {\r\n if (style[key] !== cachedValue[key]) {\r\n node.style[key] = style[key];\r\n }\r\n }\r\n } else {\r\n for (key in style) {\r\n node.style[key] = style[key];\r\n }\r\n }\r\n };\r\n\r\n Element.prototype.removeStyle = function(cachedStyle) {\r\n var style = this.attr.style || {};\r\n var node = this.node;\r\n\r\n for (var key in cachedStyle) {\r\n if (style[key] === undefined) {\r\n node.style[key] = \"\";\r\n }\r\n }\r\n };\r\n\r\n Element.prototype.removeAttributes = function(cachedAttr) {\r\n var attr = this.attr;\r\n\r\n for (var name in cachedAttr) {\r\n if (name === \"style\") {\r\n this.removeStyle(cachedAttr.style);\r\n } else if (attr[name] === undefined) {\r\n this.removeAttribute(name);\r\n }\r\n }\r\n };\r\n\r\n Element.prototype.removeAttribute = function(name) {\r\n var node = this.node;\r\n\r\n if (name === \"style\") {\r\n node.style.cssText = \"\";\r\n } else if (name === \"className\") {\r\n node.className = \"\";\r\n } else {\r\n node.removeAttribute(name);\r\n }\r\n };\r\n\r\n Element.prototype.setAttribute = function(name, value) {\r\n var node = this.node;\r\n\r\n if (node[name] !== undefined) {\r\n node[name] = value;\r\n } else {\r\n node.setAttribute(name, value);\r\n }\r\n };\r\n\r\n Element.prototype.text = function() {\r\n var str = \"\";\r\n for (var i = 0; i < this.children.length; ++i) {\r\n str += this.children[i].text();\r\n }\r\n return str;\r\n };\r\n\r\n function TextNode(nodeValue, force) {\r\n this.nodeValue = String(nodeValue);\r\n this.force = force;\r\n }\r\n\r\n TextNode.prototype = new Node();\r\n\r\n TextNode.prototype.nodeName = \"#text\";\r\n\r\n TextNode.prototype.render = function(parent, cached) {\r\n var node;\r\n\r\n if (cached.nodeName !== this.nodeName || this.force) {\r\n cached.remove();\r\n\r\n node = document.createTextNode(this.nodeValue);\r\n\r\n parent.appendChild(node);\r\n } else {\r\n node = cached.node;\r\n\r\n if (this.nodeValue !== cached.nodeValue) {\r\n if (node.parentNode) {\r\n // sometimes in IE parentNode is null (reason unknown),\r\n // and IE throws an error when you try to set a\r\n // parentless' nodeValue, because why not.\r\n node.nodeValue = this.nodeValue;\r\n }\r\n }\r\n }\r\n\r\n this.node = node;\r\n };\r\n\r\n TextNode.prototype.text = function() {\r\n return this.nodeValue;\r\n };\r\n\r\n function HtmlNode(html, replace) {\r\n this.html = html;\r\n this.replace = replace;\r\n }\r\n\r\n HtmlNode.prototype = {\r\n nodeName: \"#html\",\r\n attr: {},\r\n remove: function() {\r\n for (var index = 0; index < this.nodes.length; index++) {\r\n var el = this.nodes[index];\r\n if (el.parentNode) {\r\n el.parentNode.removeChild(el);\r\n }\r\n }\r\n },\r\n render: function(parent, cached) {\r\n var lastChild, replacedNode;\r\n if (cached.nodeName !== this.nodeName || cached.html !== this.html || this.replace) {\r\n if (this.replace && cached.replace && cached.nodes && cached.nodes.length && cached.nodes[0].outerHTML) {\r\n // This could be changed to a for loop that replaces several nodes instead of the first one. Presently, there is no use-case scenario for that.\r\n replacedNode = replaceNode(parent, cached.nodes[0], this.html);\r\n lastChild = parent.lastChild;\r\n } else {\r\n cached.remove();\r\n lastChild = parent.lastChild;\r\n insertHtml(parent, this.html);\r\n }\r\n this.nodes = [];\r\n\r\n if (replacedNode) {\r\n this.nodes.push(replacedNode);\r\n }\r\n\r\n for (var child = lastChild ? lastChild.nextSibling : parent.firstChild; child; child = child.nextSibling) {\r\n this.nodes.push(child);\r\n }\r\n } else {\r\n this.nodes = cached.nodes.slice(0);\r\n }\r\n }\r\n };\r\n\r\n var HTML_CONTAINER = document.createElement(\"div\");\r\n\r\n function insertHtml(node, html) {\r\n HTML_CONTAINER.innerHTML = html;\r\n\r\n while (HTML_CONTAINER.firstChild) {\r\n node.appendChild(HTML_CONTAINER.firstChild);\r\n }\r\n }\r\n\r\n function replaceNode(parent, node, html) {\r\n var firstChild;\r\n\r\n HTML_CONTAINER.innerHTML = html;\r\n firstChild = HTML_CONTAINER.firstChild;\r\n\r\n parent.replaceChild(firstChild, node);\r\n\r\n return firstChild;\r\n }\r\n\r\n function html(value, force) {\r\n return new HtmlNode(value, force);\r\n }\r\n\r\n function element(nodeName, attrs, children) {\r\n return new Element(nodeName, attrs, children);\r\n }\r\n\r\n function text(value, force) {\r\n return new TextNode(value, force);\r\n }\r\n\r\n function Tree(root) {\r\n this.root = root;\r\n this.children = [];\r\n }\r\n\r\n Tree.prototype = {\r\n html: html,\r\n element: element,\r\n text: text,\r\n render: function(children) {\r\n var cachedChildren = this.children;\r\n\r\n var index;\r\n\r\n var length;\r\n\r\n for (index = 0, length = children.length; index < length; index++) {\r\n var cached = cachedChildren[index];\r\n if (!cached) {\r\n cached = NULL_NODE;\r\n } else if (!cached.node || !cached.node.parentNode) {\r\n cached.remove();\r\n cached = NULL_NODE;\r\n }\r\n children[index].render(this.root, cached);\r\n }\r\n\r\n for (index = length; index < cachedChildren.length; index++) {\r\n cachedChildren[index].remove();\r\n }\r\n\r\n this.children = children;\r\n }\r\n };\r\n\r\n kendo.dom = {\r\n html: html,\r\n text: text,\r\n element: element,\r\n Tree: Tree,\r\n Node: Node\r\n };\r\n })(window.kendo);\r\n\r\n (function () {\r\n\r\n /* global JSZip */\r\n\r\n kendo.ooxml = kendo.ooxml || {};\r\n\r\n kendo.ooxml.createZip = function() {\r\n if (typeof JSZip === \"undefined\") {\r\n throw new Error(\"JSZip not found. Check http://docs.telerik.com/kendo-ui/framework/excel/introduction#requirements for more details.\");\r\n }\r\n\r\n return new JSZip();\r\n };\r\n\r\n })();\r\n\r\n /***********************************************************************\r\n * WARNING: this file is auto-generated. If you change it directly,\r\n * your modifications will eventually be lost. The source code is in\r\n * `kendo-ooxml` repository, you should make your changes there and\r\n * run `src-modules/sync.sh` in this repository.\r\n */\r\n\r\n (function($) {\r\n /* eslint-disable space-before-blocks, space-before-function-paren */\r\n\r\n window.kendo.ooxml = window.kendo.ooxml || {};\r\n var ooxml = kendo.ooxml;\r\n\r\n var map = $.map;\r\n var createZip = ooxml.createZip;\r\n\r\n var current = {\r\n toString: function (value) { return value; }\r\n };\r\n\r\n var IntlService = kendo.Class.extend({\r\n\r\n });\r\n\r\n IntlService.register = function(userImplementation) {\r\n current = userImplementation;\r\n };\r\n\r\n IntlService.toString = function(value, format) {\r\n return current.toString(value, format);\r\n };\r\n\r\n // date packing utilities from Kendo Spreadsheet\r\n\r\n // Julian days algorithms from http://www.hermetic.ch/cal_stud/jdn.htm#comp\r\n function dateToJulianDays(y, m, d) {\r\n return ((1461 * (y + 4800 + ((m - 13) / 12 | 0))) / 4 | 0) +\r\n ((367 * (m - 1 - 12 * ((m - 13) / 12 | 0))) / 12 | 0) -\r\n ((3 * (((y + 4900 + ((m - 13) / 12 | 0)) / 100 | 0))) / 4 | 0) +\r\n d - 32075;\r\n }\r\n\r\n // This uses the Google Spreadsheet approach: treat 1899-12-31 as day 1, allowing to avoid\r\n // implementing the \"Leap Year Bug\" yet still be Excel compatible for dates starting 1900-03-01.\r\n var BASE_DATE = dateToJulianDays(1900, 0, -1);\r\n\r\n function packDate(year, month, date) {\r\n return dateToJulianDays(year, month, date) - BASE_DATE;\r\n }\r\n\r\n function packTime(hh, mm, ss, ms) {\r\n return (hh + (mm + (ss + ms / 1000) / 60) / 60) / 24;\r\n }\r\n\r\n function dateToSerial(date) {\r\n var time = packTime(date.getHours(),\r\n date.getMinutes(),\r\n date.getSeconds(),\r\n date.getMilliseconds());\r\n var serial = packDate(date.getFullYear(),\r\n date.getMonth(),\r\n date.getDate());\r\n return serial < 0 ? serial - 1 + time : serial + time;\r\n }\r\n\r\n var MIME_TYPE = \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\";\r\n var DATA_URL_PREFIX = \"data:\" + MIME_TYPE + \";base64,\";\r\n var DATA_URL_OPTIONS = { compression: \"DEFLATE\", type: \"base64\" };\r\n var BLOB_OPTIONS = { compression: \"DEFLATE\", type: \"blob\" };\r\n var ARRAYBUFFER_OPTIONS = { compression: \"DEFLATE\", type: \"arraybuffer\" };\r\n\r\n /* eslint-disable key-spacing, no-confusing-arrow, no-constant-condition, indent, no-nested-ternary, consistent-return */\r\n\r\n function toDataURI(content) {\r\n return DATA_URL_PREFIX + content;\r\n }\r\n\r\n function indexOf(thing, array) {\r\n return array.indexOf(thing);\r\n }\r\n\r\n var parseJSON = JSON.parse.bind(JSON);\r\n\r\n function ESC(val) {\r\n return String(val)\r\n .replace(/&/g, \"&\")\r\n .replace(//g, \">\")\r\n .replace(/\\\"/g, \""\")\r\n .replace(/\\'/g, \"'\");\r\n }\r\n\r\n function repeat(count, func) {\r\n var str = \"\";\r\n for (var i = 0; i < count; ++i) {\r\n str += func(i);\r\n }\r\n return str;\r\n }\r\n\r\n function foreach(arr, func) {\r\n var str = \"\";\r\n if (arr != null) {\r\n if (Array.isArray(arr)) {\r\n for (var i = 0; i < arr.length; ++i) {\r\n str += func(arr[i], i);\r\n }\r\n } else if (typeof arr == \"object\") {\r\n Object.keys(arr).forEach(function (key, i) {\r\n str += func(arr[key], key, i);\r\n });\r\n }\r\n }\r\n return str;\r\n }\r\n\r\n var XMLHEAD = '\\r';\r\n\r\n var RELS = XMLHEAD + \"\\n
\\n \\n \\n \\n \";\r\n\r\n var CORE = function (ref) {\r\n var creator = ref.creator;\r\n var lastModifiedBy = ref.lastModifiedBy;\r\n var created = ref.created;\r\n var modified = ref.modified;\r\n\r\n return (XMLHEAD + \"\\n
\\n \" + (ESC(creator)) + \"\\n \" + (ESC(lastModifiedBy)) + \"\\n \" + (ESC(created)) + \"\\n \" + (ESC(modified)) + \"\\n\");\r\n };\r\n\r\n var APP = function (ref) {\r\n var sheets = ref.sheets;\r\n\r\n return (XMLHEAD + \"\\n
\\n Microsoft Excel\\n 0\\n false\\n \\n \\n \\n Worksheets\\n \\n \\n \" + (sheets.length) + \"\\n \\n \\n \\n \\n \" + (foreach(sheets, function (sheet, i) { return sheet.options.title\r\n ? (\"\" + (ESC(sheet.options.title)) + \"\")\r\n : (\"Sheet\" + (i + 1) + \"\"); }\r\n )) + \"\\n \\n false\\n false\\n false\\n 14.0300\\n\");\r\n };\r\n\r\n var CONTENT_TYPES = function (ref) {\r\n var sheetCount = ref.sheetCount;\r\n var commentFiles = ref.commentFiles;\r\n var drawingFiles = ref.drawingFiles;\r\n\r\n return (XMLHEAD + \"\\n
\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \" + (repeat(sheetCount, function (idx) { return (\"\"); })) + \"\\n \" + (foreach(commentFiles, function (filename) { return (\"\"); })) + \"\\n \" + (foreach(drawingFiles, function (filename) { return (\"\"); })) + \"\\n \\n \\n\");\r\n };\r\n\r\n var WORKBOOK = function (ref) {\r\n var sheets = ref.sheets;\r\n var filterNames = ref.filterNames;\r\n var userNames = ref.userNames;\r\n\r\n return (XMLHEAD + \"\\n
\\n \\n \\n \\n \\n \\n \\n \" + (foreach(sheets, function (ref, i) {\r\n var options = ref.options;\r\n\r\n var name = options.name || options.title || (\"Sheet\" + (i + 1));\r\n var state = options.state || 'visible';\r\n return (\"\");\r\n })) + \"\\n \\n \" + (filterNames.length || userNames.length ? (\"\\n \\n \" + (foreach(filterNames, function (f) { return (\"\\n \" + (ESC(quoteSheet(f.name))) + \"!\" + (ESC(f.from)) + \":\" + (ESC(f.to)) + \"\"); })) + \"\\n \" + (foreach(userNames, function (f) { return (\"\\n \" + (ESC(f.value)) + \"\"); })) + \"\\n \") : '') + \"\\n \\n\");\r\n };\r\n\r\n var WORKSHEET = function (ref$1) {\r\n var frozenColumns = ref$1.frozenColumns;\r\n var frozenRows = ref$1.frozenRows;\r\n var columns = ref$1.columns;\r\n var defaults = ref$1.defaults;\r\n var data = ref$1.data;\r\n var index = ref$1.index;\r\n var mergeCells = ref$1.mergeCells;\r\n var autoFilter = ref$1.autoFilter;\r\n var filter = ref$1.filter;\r\n var showGridLines = ref$1.showGridLines;\r\n var hyperlinks = ref$1.hyperlinks;\r\n var validations = ref$1.validations;\r\n var defaultCellStyleId = ref$1.defaultCellStyleId;\r\n var rtl = ref$1.rtl;\r\n var legacyDrawing = ref$1.legacyDrawing;\r\n var drawing = ref$1.drawing;\r\n var lastRow = ref$1.lastRow;\r\n var lastCol = ref$1.lastCol;\r\n var hasDisabledCells = ref$1.hasDisabledCells;\r\n\r\n return (XMLHEAD + \"\\n
\\n \" + (lastRow && lastCol ? (\"\") : \"\") + \"\\n\\n \\n \\n \" + (frozenRows || frozenColumns ? (\"\\n \") : '') + \"\\n \\n \\n\\n \\n\\n \" + (defaultCellStyleId != null || (columns && columns.length > 0) ? (\"\\n \\n \" + (!columns || !columns.length ? (\"\\n \") : '') + \"\\n \" + (foreach(columns, function (column, ci) {\r\n var columnIndex = typeof column.index === \"number\" ? column.index + 1 : (ci + 1);\r\n if (column.width === 0) {\r\n return (\"\");\r\n }\r\n return (\"\");\r\n })) + \"\\n \") : '') + \"\\n\\n \\n \" + (foreach(data, function (row, ri) {\r\n var rowIndex = typeof row.index === \"number\" ? row.index + 1 : (ri + 1);\r\n return (\"\\n \\n \" + (foreach(row.data, function (cell) { return (\"\\n \\n \" + (cell.formula != null ? writeFormula(cell.formula) : '') + \"\\n \" + (cell.value != null ? (\"\" + (ESC(cell.value)) + \"\") : '') + \"\\n \"); })) + \"\\n
\\n \");})) + \"\\n \\n\\n \" + (hasDisabledCells ? \"\" : '') + \"\\n\\n \" + (autoFilter ? (\"\")\r\n : filter ? spreadsheetFilters(filter) : '') + \"\\n\\n \" + (mergeCells.length ? (\"\\n \\n \" + (foreach(mergeCells, function (ref) { return (\"\"); })) + \"\\n \") : '') + \"\\n\\n \" + (validations.length ? (\"\\n \\n \" + (foreach(validations, function (val) { return (\"\\n \\n \" + (val.formula1 ? (\"\" + (ESC(val.formula1)) + \"\") : '') + \"\\n \" + (val.formula2 ? (\"\" + (ESC(val.formula2)) + \"\") : '') + \"\\n \"); })) + \"\\n \") : '') + \"\\n\\n \" + (hyperlinks.length ? (\"\\n \\n \" + (foreach(hyperlinks, function (link) { return (\"\\n \"); })) + \"\\n \") : '') + \"\\n\\n \\n \" + (drawing ? (\"\") : '') + \"\\n \" + (legacyDrawing ? (\"\") : '') + \"\\n\");\r\n };\r\n\r\n var WORKBOOK_RELS = function (ref) {\r\n var count = ref.count;\r\n\r\n return (XMLHEAD + \"\\n
\\n \" + (repeat(count, function (idx) { return (\"\\n \"); })) + \"\\n \\n \\n\");\r\n };\r\n\r\n var WORKSHEET_RELS = function (ref) {\r\n var hyperlinks = ref.hyperlinks;\r\n var comments = ref.comments;\r\n var sheetIndex = ref.sheetIndex;\r\n var drawings = ref.drawings;\r\n\r\n return (XMLHEAD + \"\\n
\\n \" + (foreach(hyperlinks, function (link) { return (\"\\n \"); })) + \"\\n \" + (!comments.length ? '' : (\"\\n \\n \")) + \"\\n \" + (!drawings.length ? '' : (\"\\n \")) + \"\\n\");\r\n };\r\n\r\n var COMMENTS_XML = function (ref) {\r\n var comments = ref.comments;\r\n\r\n return (XMLHEAD + \"\\n
\\n \\n \\n \\n \\n \" + (foreach(comments, function (comment) { return (\"\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \" + (ESC(comment.text)) + \"\\n \\n \\n \"); })) + \"\\n \\n\");\r\n };\r\n\r\n var LEGACY_DRAWING = function (ref) {\r\n var comments = ref.comments;\r\n\r\n return (\"
\\n \\n \\n \\n \\n \" + (foreach(comments, function (comment) { return (\"\\n \\n \\n \\n \\n \\n \" + (comment.anchor) + \"\\n False\\n \" + (comment.row) + \"\\n \" + (comment.col) + \"\\n \\n \"); })) + \"\\n\");\r\n };\r\n\r\n var DRAWINGS_XML = function (drawings) { return (XMLHEAD + \"\\n
\\n \" + (foreach(drawings, function (drawing, index) { return (\"\\n \\n \\n \" + (drawing.col) + \"\\n \" + (drawing.colOffset) + \"\\n \" + (drawing.row) + \"\\n \" + (drawing.rowOffset) + \"\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \"); })) + \"\\n\"); };\r\n\r\n var DRAWINGS_RELS_XML = function (rels) { return (XMLHEAD + \"\\n
\\n \" + (foreach(rels, function (rel) { return (\"\\n \"); })) + \"\\n\"); };\r\n\r\n var SHARED_STRINGS = function (ref) {\r\n var count = ref.count;\r\n var uniqueCount = ref.uniqueCount;\r\n var indexes = ref.indexes;\r\n\r\n return (XMLHEAD + \"\\n
\\n \" + (foreach(Object.keys(indexes), function (index) { return (\"\\n \" + (ESC(index.substring(1))) + \"\"); })) + \"\\n\");\r\n };\r\n\r\n var STYLES = function (ref) {\r\n var formats = ref.formats;\r\n var fonts = ref.fonts;\r\n var fills = ref.fills;\r\n var borders = ref.borders;\r\n var styles = ref.styles;\r\n\r\n return (XMLHEAD + \"\\n
\\n \\n \" + (foreach(formats, function (format, fi) { return (\"\\n \"); })) + \"\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \" + (foreach(fonts, function (font) { return (\"\\n \\n \" + (font.bold ? '' : '') + \"\\n \" + (font.italic ? '' : '') + \"\\n \" + (font.underline ? '' : '') + \"\\n \\n \" + (font.color ? (\"\") : '') + \"\\n \" + (font.fontFamily ? (\"\\n \\n \\n \") : \"\\n \\n \\n \\n \") + \"\\n \"); })) + \"\\n \\n \\n \\n \\n \" + (foreach(fills, function (fill) { return (\"\\n \" + (fill.background ? (\"\\n \\n \\n \\n \\n \\n \") : '')); })) + \"\\n \\n \\n \\n \" + (foreach(borders, borderTemplate)) + \"\\n \\n \\n \\n \\n \\n \\n \" + (foreach(styles, function (style) { return (\"\\n \\n \" + (style.textAlign || style.verticalAlign || style.wrap ? (\"\\n \\n \") : '') + \"\\n \" + (style.disabled != null ? (\"\\n \\n \") : '') + \"\\n \\n \"); })) + \"\\n \\n \\n \\n \\n \\n \\n\");\r\n };\r\n\r\n function writeFormula(formula) {\r\n if (typeof formula == \"string\") {\r\n return (\"
\" + (ESC(formula)) + \"\");\r\n }\r\n // array formulas\r\n return (\"
\" + (ESC(formula.src)) + \"\");\r\n }\r\n\r\n function numChar(colIndex) {\r\n var letter = Math.floor(colIndex / 26) - 1;\r\n\r\n return (letter >= 0 ? numChar(letter) : \"\") + String.fromCharCode(65 + (colIndex % 26));\r\n }\r\n\r\n function ref(rowIndex, colIndex) {\r\n return numChar(colIndex) + (rowIndex + 1);\r\n }\r\n\r\n function $ref(rowIndex, colIndex) {\r\n return \"$\" + numChar(colIndex) + \"$\" + (rowIndex + 1);\r\n }\r\n\r\n function filterRowIndex(options) {\r\n var frozenRows = options.frozenRows || (options.freezePane || {}).rowSplit || 1;\r\n return frozenRows - 1;\r\n }\r\n\r\n function toWidth(px) {\r\n var maximumDigitWidth = 7;\r\n return (px / maximumDigitWidth) - (Math.floor(128 / maximumDigitWidth) / 256);\r\n }\r\n\r\n function toHeight(px) {\r\n return px * 0.75;\r\n }\r\n\r\n function stripFunnyChars(value) {\r\n return String(value)\r\n .replace(/[\\x00-\\x09\\x0B\\x0C\\x0E-\\x1F]/g, \"\") // leave CRLF in\r\n .replace(/\\r?\\n/g, \"\\r\\n\"); // make sure LF is preceded by CR\r\n }\r\n\r\n var Worksheet = kendo.Class.extend({\r\n init: function(options, sharedStrings, styles, borders) {\r\n this.options = options;\r\n this._strings = sharedStrings;\r\n this._styles = styles;\r\n this._borders = borders;\r\n this._validations = {};\r\n this._comments = [];\r\n this._drawings = options.drawings || [];\r\n this._hyperlinks = (this.options.hyperlinks || []).map(\r\n function (link, i) { return $.extend({}, link, { rId: (\"link\" + i) }); });\r\n },\r\n\r\n relsToXML: function() {\r\n var hyperlinks = this._hyperlinks;\r\n var comments = this._comments;\r\n var drawings = this._drawings;\r\n\r\n if (hyperlinks.length || comments.length || drawings.length) {\r\n return WORKSHEET_RELS({\r\n hyperlinks : hyperlinks,\r\n comments : comments,\r\n sheetIndex : this.options.sheetIndex,\r\n drawings : drawings\r\n });\r\n }\r\n },\r\n\r\n toXML: function(index) {\r\n var this$1$1 = this;\r\n\r\n var mergeCells = this.options.mergedCells || [];\r\n var rows = this.options.rows || [];\r\n var data = inflate(rows, mergeCells);\r\n\r\n this._readCells(data);\r\n\r\n var autoFilter = this.options.filter;\r\n var filter;\r\n if (autoFilter && (typeof autoFilter.from === \"number\") && (typeof autoFilter.to === \"number\")) {\r\n // Grid enables auto filter\r\n autoFilter = {\r\n from: ref(filterRowIndex(this.options), autoFilter.from),\r\n to: ref(filterRowIndex(this.options), autoFilter.to)\r\n };\r\n } else if (autoFilter && autoFilter.ref && autoFilter.columns) {\r\n // this is probably from the Spreadsheet\r\n filter = autoFilter;\r\n autoFilter = null;\r\n }\r\n\r\n var validations = [];\r\n for (var i in this._validations) {\r\n if (Object.prototype.hasOwnProperty.call(this$1$1._validations, i)) {\r\n validations.push(this$1$1._validations[i]);\r\n }\r\n }\r\n\r\n var defaultCellStyleId = null;\r\n var defaultCellStyle = this.options.defaultCellStyle;\r\n if (this._hasDisabledCells) {\r\n if (!defaultCellStyle) {\r\n defaultCellStyle = { disabled: false };\r\n } else {\r\n defaultCellStyle = $.extend({ disabled: false }, defaultCellStyle);\r\n }\r\n }\r\n if (defaultCellStyle) {\r\n defaultCellStyleId = this._lookupStyle(defaultCellStyle);\r\n }\r\n\r\n var freezePane = this.options.freezePane || {};\r\n var defaults = this.options.defaults || {};\r\n var lastRow = this.options.rows ? this._getLastRow() : 1;\r\n var lastCol = this.options.rows ? this._getLastCol() : 1;\r\n\r\n return WORKSHEET({\r\n frozenColumns: this.options.frozenColumns || freezePane.colSplit,\r\n frozenRows: this.options.frozenRows || freezePane.rowSplit,\r\n columns: this.options.columns,\r\n defaults: defaults,\r\n data: data,\r\n index: index,\r\n mergeCells: mergeCells,\r\n autoFilter: autoFilter,\r\n filter: filter,\r\n showGridLines: this.options.showGridLines,\r\n hyperlinks: this._hyperlinks,\r\n validations: validations,\r\n defaultCellStyleId: defaultCellStyleId,\r\n rtl: this.options.rtl !== undefined ? this.options.rtl : defaults.rtl,\r\n legacyDrawing: this._comments.length ? (\"vml\" + (this.options.sheetIndex)) : null,\r\n drawing: this._drawings.length ? (\"drw\" + (this.options.sheetIndex)) : null,\r\n lastRow: lastRow,\r\n lastCol: lastCol,\r\n hasDisabledCells: this._hasDisabledCells,\r\n });\r\n },\r\n\r\n commentsXML: function() {\r\n if (this._comments.length) {\r\n return COMMENTS_XML({ comments: this._comments });\r\n }\r\n },\r\n\r\n drawingsXML: function(images) {\r\n if (this._drawings.length) {\r\n var rels = {};\r\n var main = this._drawings.map(function (drw) {\r\n var ref = parseRef(drw.topLeftCell);\r\n var img = rels[drw.image];\r\n if (!img) {\r\n img = rels[drw.image] = {\r\n rId: (\"img\" + (drw.image)),\r\n target: images[drw.image].target\r\n };\r\n }\r\n return {\r\n col : ref.col,\r\n colOffset : pixelsToExcel(drw.offsetX),\r\n row : ref.row,\r\n rowOffset : pixelsToExcel(drw.offsetY),\r\n width : pixelsToExcel(drw.width),\r\n height : pixelsToExcel(drw.height),\r\n imageId : img.rId\r\n };\r\n });\r\n return {\r\n main: DRAWINGS_XML(main),\r\n rels: DRAWINGS_RELS_XML(rels)\r\n };\r\n }\r\n },\r\n\r\n legacyDrawing: function() {\r\n if (this._comments.length) {\r\n return LEGACY_DRAWING({ comments: this._comments });\r\n }\r\n },\r\n\r\n _lookupString: function(value) {\r\n var key = \"$\" + value;\r\n var index = this._strings.indexes[key];\r\n var result;\r\n\r\n if (index !== undefined) {\r\n result = index;\r\n } else {\r\n result = this._strings.indexes[key] = this._strings.uniqueCount;\r\n this._strings.uniqueCount ++;\r\n }\r\n\r\n this._strings.count ++;\r\n\r\n return result;\r\n },\r\n\r\n _lookupStyle: function(style) {\r\n var json = JSON.stringify(style);\r\n\r\n if (json === \"{}\") {\r\n return 0;\r\n }\r\n\r\n var index = indexOf(json, this._styles);\r\n\r\n if (index < 0) {\r\n index = this._styles.push(json) - 1;\r\n }\r\n\r\n // There is one default style\r\n return index + 1;\r\n },\r\n\r\n _lookupBorder: function(border) {\r\n var json = JSON.stringify(border);\r\n if (json === \"{}\") {\r\n return;\r\n }\r\n\r\n var index = indexOf(json, this._borders);\r\n if (index < 0) {\r\n index = this._borders.push(json) - 1;\r\n }\r\n\r\n // There is one default border\r\n return index + 1;\r\n },\r\n\r\n _readCells: function(rowData) {\r\n var this$1$1 = this;\r\n\r\n for (var i = 0; i < rowData.length; i++) {\r\n var row = rowData[i];\r\n var cells = row.cells;\r\n\r\n row.data = [];\r\n\r\n for (var j = 0; j < cells.length; j++) {\r\n var cellData = this$1$1._cell(cells[j], row.index, j);\r\n if (cellData) {\r\n row.data.push(cellData);\r\n }\r\n }\r\n }\r\n },\r\n\r\n _cell: function(data, rowIndex, cellIndex) {\r\n var this$1$1 = this;\r\n\r\n if (!data || data === EMPTY_CELL) {\r\n return null;\r\n }\r\n\r\n var value = data.value;\r\n\r\n var border = {};\r\n\r\n if (data.borderLeft) {\r\n border.left = data.borderLeft;\r\n }\r\n\r\n if (data.borderRight) {\r\n border.right = data.borderRight;\r\n }\r\n\r\n if (data.borderTop) {\r\n border.top = data.borderTop;\r\n }\r\n\r\n if (data.borderBottom) {\r\n border.bottom = data.borderBottom;\r\n }\r\n\r\n if (data.dBorders) {\r\n border.diagonal = data.dBorders;\r\n }\r\n\r\n border = this._lookupBorder(border);\r\n\r\n var defStyle = this.options.defaultCellStyle || {};\r\n var style = { borderId: border };\r\n\r\n (function (add) {\r\n add(\"color\");\r\n add(\"background\");\r\n add(\"bold\");\r\n add(\"italic\");\r\n add(\"underline\");\r\n if (!add(\"fontFamily\")) { add(\"fontName\", \"fontFamily\"); }\r\n add(\"fontSize\");\r\n add(\"format\");\r\n if (!add(\"textAlign\")) { add(\"hAlign\", \"textAlign\"); }\r\n if (!add(\"verticalAlign\")) { add(\"vAlign\", \"verticalAlign\"); }\r\n add(\"wrap\");\r\n add(\"indent\");\r\n if (!add(\"disabled\")) {\r\n if (add(\"enable\")) {\r\n style.disabled = !style.enable;\r\n delete style.enable;\r\n }\r\n }\r\n if (style.disabled) {\r\n this$1$1._hasDisabledCells = true;\r\n }\r\n })(function (prop, target) {\r\n var val = data[prop];\r\n if (val === undefined) {\r\n val = defStyle[prop];\r\n }\r\n if (val !== undefined) {\r\n style[target || prop] = val;\r\n return true;\r\n }\r\n });\r\n\r\n var columns = this.options.columns || [];\r\n\r\n var column = columns[cellIndex];\r\n var type = typeof value;\r\n\r\n if (column && column.autoWidth && (!data.colSpan || data.colSpan === 1)) {\r\n var displayValue = value;\r\n\r\n // XXX: let's not bring kendo.toString in only for this.\r\n // better wait until the spreadsheet engine is available as a separate\r\n // component, then we can use a real Excel-like formatter.\r\n //\r\n if (type === \"number\") {\r\n // kendo.toString will not behave exactly like the Excel format\r\n // Still, it's the best we have available for estimating the character count.\r\n displayValue = IntlService.toString(value, data.format);\r\n }\r\n\r\n column.width = Math.max(column.width || 0, String(displayValue).length);\r\n }\r\n\r\n if (type === \"string\") {\r\n value = stripFunnyChars(value);\r\n value = this._lookupString(value);\r\n type = \"s\";\r\n } else if (type === \"number\") {\r\n type = \"n\";\r\n } else if (type === \"boolean\") {\r\n type = \"b\";\r\n value = Number(value);\r\n } else if (value && value.getTime) {\r\n type = null;\r\n value = dateToSerial(value);\r\n if (!style.format) {\r\n style.format = \"mm-dd-yy\";\r\n }\r\n } else {\r\n type = null;\r\n value = null;\r\n }\r\n\r\n style = this._lookupStyle(style);\r\n\r\n var cellName = ref(rowIndex, cellIndex);\r\n\r\n if (data.validation) {\r\n this._addValidation(data.validation, cellName);\r\n }\r\n\r\n if (data.comment) {\r\n var anchor = [\r\n cellIndex + 1, // start column\r\n 15, // start column offset\r\n rowIndex, // start row\r\n 10, // start row offset\r\n cellIndex + 3, // end column\r\n 15, // end column offset\r\n rowIndex + 3, // end row\r\n 4 // end row offset\r\n ];\r\n this._comments.push({\r\n ref : cellName,\r\n text : data.comment,\r\n row : rowIndex,\r\n col : cellIndex,\r\n anchor : anchor.join(\", \")\r\n });\r\n }\r\n\r\n return {\r\n value: value,\r\n formula: data.formula,\r\n type: type,\r\n style: style,\r\n ref: cellName\r\n };\r\n },\r\n\r\n _addValidation: function(v, ref) {\r\n var tmp = {\r\n showErrorMessage : v.type === \"reject\" ? 1 : 0,\r\n formula1 : v.from,\r\n formula2 : v.to,\r\n type : MAP_EXCEL_TYPE[v.dataType] || v.dataType,\r\n operator : MAP_EXCEL_OPERATOR[v.comparerType] || v.comparerType,\r\n allowBlank : v.allowNulls ? 1 : 0,\r\n showDropDown : v.showButton ? 0 : 1, // LOL, Excel!\r\n error : v.messageTemplate,\r\n errorTitle : v.titleTemplate\r\n };\r\n var json = JSON.stringify(tmp);\r\n if (!this._validations[json]) {\r\n this._validations[json] = tmp;\r\n tmp.sqref = [];\r\n }\r\n this._validations[json].sqref.push(ref);\r\n },\r\n\r\n _getLastRow: function() {\r\n return countData(this.options.rows);\r\n },\r\n\r\n _getLastCol: function() {\r\n var last = 0;\r\n this.options.rows.forEach(function(row) {\r\n if (row.cells) {\r\n last = Math.max(last, countData(row.cells));\r\n }\r\n });\r\n return last;\r\n }\r\n });\r\n\r\n function countData(data) {\r\n var last = data.length;\r\n data.forEach(function(el) {\r\n if (el.index && el.index >= last) {\r\n last = el.index + 1;\r\n }\r\n });\r\n return last;\r\n }\r\n\r\n var MAP_EXCEL_OPERATOR = {\r\n // includes only what differs; key is our operator, value is Excel\r\n // operator.\r\n greaterThanOrEqualTo : \"greaterThanOrEqual\",\r\n lessThanOrEqualTo : \"lessThanOrEqual\"\r\n };\r\n\r\n var MAP_EXCEL_TYPE = {\r\n // eslint-disable-next-line id-denylist\r\n number: \"decimal\"\r\n };\r\n\r\n var defaultFormats = {\r\n \"General\": 0,\r\n \"0\": 1,\r\n \"0.00\": 2,\r\n \"#,##0\": 3,\r\n \"#,##0.00\": 4,\r\n \"0%\": 9,\r\n \"0.00%\": 10,\r\n \"0.00E+00\": 11,\r\n \"# ?/?\": 12,\r\n \"# ??/??\": 13,\r\n \"mm-dd-yy\": 14,\r\n \"d-mmm-yy\": 15,\r\n \"d-mmm\": 16,\r\n \"mmm-yy\": 17,\r\n \"h:mm AM/PM\": 18,\r\n \"h:mm:ss AM/PM\": 19,\r\n \"h:mm\": 20,\r\n \"h:mm:ss\": 21,\r\n \"m/d/yy h:mm\": 22,\r\n \"#,##0 ;(#,##0)\": 37,\r\n \"#,##0 ;[Red](#,##0)\": 38,\r\n \"#,##0.00;(#,##0.00)\": 39,\r\n \"#,##0.00;[Red](#,##0.00)\": 40,\r\n \"mm:ss\": 45,\r\n \"[h]:mm:ss\": 46,\r\n \"mmss.0\": 47,\r\n \"##0.0E+0\": 48,\r\n \"@\": 49,\r\n \"[$-404]e/m/d\": 27,\r\n \"m/d/yy\": 30,\r\n \"t0\": 59,\r\n \"t0.00\": 60,\r\n \"t#,##0\": 61,\r\n \"t#,##0.00\": 62,\r\n \"t0%\": 67,\r\n \"t0.00%\": 68,\r\n \"t# ?/?\": 69,\r\n \"t# ??/??\": 70\r\n };\r\n\r\n function maybeRGB(value) {\r\n function hex(val) {\r\n var x = parseInt(val, 10).toString(16);\r\n return x.length < 2 ? \"0\" + x : x;\r\n }\r\n\r\n var m = /^rgba?\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([0-9.]+)\\s*)?\\)/i.exec(value.trim());\r\n if (m) {\r\n var opacity = (m[4] ? parseFloat(m[4]) : 1) * 255 | 0;\r\n return \"#\" + hex(opacity) + hex(m[1]) + hex(m[2]) + hex(m[3]);\r\n }\r\n return value;\r\n }\r\n\r\n function convertColor(value) {\r\n var color = maybeRGB(value);\r\n if (color.length < 6) {\r\n color = color.replace(/(\\w)/g, function($0, $1) {\r\n return $1 + $1;\r\n });\r\n }\r\n\r\n color = color.substring(1).toUpperCase();\r\n\r\n if (color.length < 8) {\r\n color = \"FF\" + color;\r\n }\r\n\r\n return color;\r\n }\r\n\r\n var Workbook = kendo.Class.extend({\r\n init: function(options) {\r\n var this$1$1 = this;\r\n\r\n this.options = options || {};\r\n this._strings = {\r\n indexes: {},\r\n count: 0,\r\n uniqueCount: 0\r\n };\r\n this._styles = [];\r\n this._borders = [];\r\n this._images = this.options.images;\r\n this._imgId = 0;\r\n\r\n this._sheets = map(this.options.sheets || [], function (options, i) {\r\n options.defaults = this$1$1.options;\r\n options.sheetIndex = i + 1;\r\n return new Worksheet(options, this$1$1._strings, this$1$1._styles, this$1$1._borders);\r\n });\r\n },\r\n\r\n imageFilename: function(mimeType) {\r\n var id = ++this._imgId;\r\n switch (mimeType) {\r\n case \"image/jpg\":\r\n case \"image/jpeg\":\r\n return (\"image\" + id + \".jpg\");\r\n case \"image/png\":\r\n return (\"image\" + id + \".png\");\r\n case \"image/gif\":\r\n return (\"image\" + id + \".gif\");\r\n default:\r\n return (\"image\" + id + \".bin\"); // XXX: anything better to do here?\r\n }\r\n },\r\n\r\n toZIP: function() {\r\n var this$1$1 = this;\r\n\r\n var zip = createZip();\r\n\r\n var docProps = zip.folder(\"docProps\");\r\n\r\n docProps.file(\"core.xml\", CORE({\r\n creator: this.options.creator || \"Kendo UI\",\r\n lastModifiedBy: this.options.creator || \"Kendo UI\",\r\n created: this.options.date || new Date().toJSON(),\r\n modified: this.options.date || new Date().toJSON()\r\n }));\r\n\r\n var sheetCount = this._sheets.length;\r\n\r\n docProps.file(\"app.xml\", APP({ sheets: this._sheets }));\r\n\r\n var rels = zip.folder(\"_rels\");\r\n rels.file(\".rels\", RELS);\r\n\r\n var xl = zip.folder(\"xl\");\r\n\r\n var xlRels = xl.folder(\"_rels\");\r\n xlRels.file(\"workbook.xml.rels\", WORKBOOK_RELS({ count: sheetCount }));\r\n\r\n if (this._images) {\r\n var media = xl.folder(\"media\");\r\n Object.keys(this._images).forEach(function (id) {\r\n var img = this$1$1._images[id];\r\n var filename = this$1$1.imageFilename(img.type);\r\n media.file(filename, img.data);\r\n img.target = \"../media/\" + filename;\r\n });\r\n }\r\n\r\n var sheetIds = {};\r\n xl.file(\"workbook.xml\", WORKBOOK({\r\n sheets: this._sheets,\r\n filterNames: map(this._sheets, function(sheet, index) {\r\n var options = sheet.options;\r\n var sheetName = (options.name || options.title || \"Sheet\" + (index + 1));\r\n sheetIds[sheetName.toLowerCase()] = index;\r\n var filter = options.filter;\r\n if (filter) {\r\n if (filter.ref) {\r\n // spreadsheet provides `ref`\r\n var a = filter.ref.split(\":\");\r\n var from = parseRef(a[0]);\r\n var to = parseRef(a[1]);\r\n return {\r\n localSheetId: index,\r\n name: sheetName,\r\n from: $ref(from.row, from.col),\r\n to: $ref(to.row, to.col)\r\n };\r\n } else if (typeof filter.from !== \"undefined\" && typeof filter.to !== \"undefined\") {\r\n // grid does this\r\n return {\r\n localSheetId: index,\r\n name: sheetName,\r\n from: $ref(filterRowIndex(options), filter.from),\r\n to: $ref(filterRowIndex(options), filter.to)\r\n };\r\n }\r\n }\r\n }),\r\n userNames: map(this.options.names || [], function(def) {\r\n return {\r\n name: def.localName,\r\n localSheetId: def.sheet ? sheetIds[def.sheet.toLowerCase()] : null,\r\n value: def.value,\r\n hidden: def.hidden\r\n };\r\n })\r\n }));\r\n\r\n var worksheets = xl.folder(\"worksheets\");\r\n var drawings = xl.folder(\"drawings\");\r\n var drawingsRels = drawings.folder(\"_rels\");\r\n var sheetRels = worksheets.folder(\"_rels\");\r\n var commentFiles = [];\r\n var drawingFiles = [];\r\n\r\n for (var idx = 0; idx < sheetCount; idx++) {\r\n var sheet = this$1$1._sheets[idx];\r\n var sheetName = \"sheet\" + (idx + 1) + \".xml\";\r\n var sheetXML = sheet.toXML(idx); // must be called before relsToXML\r\n var relsXML = sheet.relsToXML();\r\n var commentsXML = sheet.commentsXML();\r\n var legacyDrawing = sheet.legacyDrawing();\r\n var drawingsXML = sheet.drawingsXML(this$1$1._images);\r\n\r\n if (relsXML) {\r\n sheetRels.file(sheetName + \".rels\", relsXML);\r\n }\r\n if (commentsXML) {\r\n var name = \"comments\" + (sheet.options.sheetIndex) + \".xml\";\r\n xl.file(name, commentsXML);\r\n commentFiles.push(name);\r\n }\r\n if (legacyDrawing) {\r\n drawings.file((\"vmlDrawing\" + (sheet.options.sheetIndex) + \".vml\"), legacyDrawing);\r\n }\r\n if (drawingsXML) {\r\n var name$1 = \"drawing\" + (sheet.options.sheetIndex) + \".xml\";\r\n drawings.file(name$1, drawingsXML.main);\r\n drawingsRels.file((name$1 + \".rels\"), drawingsXML.rels);\r\n drawingFiles.push(name$1);\r\n }\r\n\r\n worksheets.file(sheetName, sheetXML);\r\n }\r\n\r\n var borders = map(this._borders, parseJSON);\r\n\r\n var styles = map(this._styles, parseJSON);\r\n\r\n var hasFont = function(style) {\r\n return style.underline || style.bold || style.italic || style.color || style.fontFamily || style.fontSize;\r\n };\r\n\r\n var convertFontSize = function(value) {\r\n var fontInPx = Number(value);\r\n var fontInPt;\r\n\r\n if (fontInPx) {\r\n fontInPt = fontInPx * 3 / 4;\r\n }\r\n\r\n return fontInPt;\r\n };\r\n\r\n var fonts = map(styles, function(style) {\r\n if (style.fontSize) {\r\n style.fontSize = convertFontSize(style.fontSize);\r\n }\r\n\r\n if (style.color) {\r\n style.color = convertColor(style.color);\r\n }\r\n\r\n if (hasFont(style)) {\r\n return style;\r\n }\r\n });\r\n\r\n var formats = map(styles, function(style) {\r\n if (style.format && defaultFormats[style.format] === undefined) {\r\n return style;\r\n }\r\n });\r\n\r\n var fills = map(styles, function(style) {\r\n if (style.background) {\r\n style.background = convertColor(style.background);\r\n return style;\r\n }\r\n });\r\n\r\n xl.file(\"styles.xml\", STYLES({\r\n fonts: fonts,\r\n fills: fills,\r\n formats: formats,\r\n borders: borders,\r\n styles: map(styles, function(style) {\r\n var result = {};\r\n\r\n if (hasFont(style)) {\r\n result.fontId = indexOf(style, fonts) + 1;\r\n }\r\n\r\n if (style.background) {\r\n result.fillId = indexOf(style, fills) + 2;\r\n }\r\n\r\n result.textAlign = style.textAlign;\r\n result.indent = style.indent;\r\n result.verticalAlign = style.verticalAlign;\r\n result.wrap = style.wrap;\r\n result.borderId = style.borderId;\r\n\r\n if (style.format) {\r\n if (defaultFormats[style.format] !== undefined) {\r\n result.numFmtId = defaultFormats[style.format];\r\n } else {\r\n result.numFmtId = 165 + indexOf(style, formats);\r\n }\r\n }\r\n\r\n if (style.disabled != null) {\r\n result.disabled = style.disabled;\r\n }\r\n\r\n return result;\r\n })\r\n }));\r\n\r\n xl.file(\"sharedStrings.xml\", SHARED_STRINGS(this._strings));\r\n\r\n zip.file(\"[Content_Types].xml\", CONTENT_TYPES({\r\n sheetCount: sheetCount,\r\n commentFiles: commentFiles,\r\n drawingFiles: drawingFiles\r\n }));\r\n\r\n return zip;\r\n },\r\n\r\n toDataURL: function() {\r\n var zip = this.toZIP();\r\n\r\n return zip.generateAsync ? zip.generateAsync(DATA_URL_OPTIONS).then(toDataURI) : toDataURI(zip.generate(DATA_URL_OPTIONS));\r\n },\r\n\r\n toBlob: function() {\r\n var zip = this.toZIP();\r\n if (zip.generateAsync) {\r\n return zip.generateAsync(BLOB_OPTIONS);\r\n }\r\n return new Blob([ zip.generate(ARRAYBUFFER_OPTIONS) ], { type: MIME_TYPE });\r\n }\r\n });\r\n\r\n function borderStyle(width) {\r\n var alias = \"thin\";\r\n\r\n if (width === 2) {\r\n alias = \"medium\";\r\n } else if (width === 3) {\r\n alias = \"thick\";\r\n }\r\n\r\n return alias;\r\n }\r\n\r\n function borderSideTemplate(name, style) {\r\n var result = \"\";\r\n\r\n if (style) {\r\n result += \"<\" + name + \" style=\\\"\" + borderStyle(style.size) + \"\\\">\";\r\n if (style.color) {\r\n result += \"
\";\r\n }\r\n result += \"\" + name + \">\";\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function borderTemplate(border) {\r\n var diag = border.diagonal ? border.diagonal.type : 0;\r\n return (\"
\\n \" + (borderSideTemplate(\"left\", border.left)) + \"\\n \" + (borderSideTemplate(\"right\", border.right)) + \"\\n \" + (borderSideTemplate(\"top\", border.top)) + \"\\n \" + (borderSideTemplate(\"bottom\", border.bottom)) + \"\\n \" + (borderSideTemplate(\"diagonal\", border.diagonal)) + \"\\n \");\r\n }\r\n\r\n var EMPTY_CELL = {};\r\n function inflate(rows, mergedCells) {\r\n var rowData = [];\r\n var rowsByIndex = [];\r\n\r\n indexRows(rows, function(row, index) {\r\n var data = {\r\n _source: row,\r\n index: index,\r\n height: row.height,\r\n level: row.level,\r\n cells: []\r\n };\r\n\r\n rowData.push(data);\r\n rowsByIndex[index] = data;\r\n });\r\n\r\n var sorted = sortByIndex(rowData).slice(0);\r\n var ctx = {\r\n rowData: rowData,\r\n rowsByIndex: rowsByIndex,\r\n mergedCells: mergedCells\r\n };\r\n\r\n for (var i = 0; i < sorted.length; i++) {\r\n fillCells(sorted[i], ctx);\r\n delete sorted[i]._source;\r\n }\r\n\r\n return sortByIndex(rowData);\r\n }\r\n\r\n function indexRows(rows, callback) {\r\n for (var i = 0; i < rows.length; i++) {\r\n var row = rows[i];\r\n if (!row) {\r\n continue;\r\n }\r\n\r\n var index = row.index;\r\n if (typeof index !== \"number\") {\r\n index = i;\r\n }\r\n\r\n callback(row, index);\r\n }\r\n }\r\n\r\n function sortByIndex(items) {\r\n return items.sort(function(a, b) {\r\n return a.index - b.index;\r\n });\r\n }\r\n\r\n function pushUnique(array, el) {\r\n if (array.indexOf(el) < 0) {\r\n array.push(el);\r\n }\r\n }\r\n\r\n function getSpan(mergedCells, ref) {\r\n for (var i = 0; i < mergedCells.length; ++i) {\r\n var range = mergedCells[i];\r\n var a = range.split(\":\");\r\n var topLeft = a[0];\r\n if (topLeft === ref) {\r\n var bottomRight = a[1];\r\n topLeft = parseRef(topLeft);\r\n bottomRight = parseRef(bottomRight);\r\n return {\r\n rowSpan: bottomRight.row - topLeft.row + 1,\r\n colSpan: bottomRight.col - topLeft.col + 1\r\n };\r\n }\r\n }\r\n }\r\n\r\n function parseRef(ref) {\r\n function getcol(str) {\r\n var upperStr = str.toUpperCase();\r\n var col = 0;\r\n for (var i = 0; i < upperStr.length; ++i) {\r\n col = col * 26 + upperStr.charCodeAt(i) - 64;\r\n }\r\n return col - 1;\r\n }\r\n\r\n function getrow(str) {\r\n return parseInt(str, 10) - 1;\r\n }\r\n\r\n var m = /^([a-z]+)(\\d+)$/i.exec(ref);\r\n return {\r\n row: getrow(m[2]),\r\n col: getcol(m[1])\r\n };\r\n }\r\n\r\n function pixelsToExcel(px) {\r\n return Math.round(px * 9525);\r\n }\r\n\r\n function fillCells(data, ctx) {\r\n var row = data._source;\r\n var rowIndex = data.index;\r\n var cells = row.cells;\r\n var cellData = data.cells;\r\n\r\n if (!cells) {\r\n return;\r\n }\r\n\r\n for (var i = 0; i < cells.length; i++) {\r\n var cell = cells[i] || EMPTY_CELL;\r\n\r\n var rowSpan = cell.rowSpan || 1;\r\n var colSpan = cell.colSpan || 1;\r\n\r\n var cellIndex = insertCell(cellData, cell);\r\n var topLeftRef = ref(rowIndex, cellIndex);\r\n\r\n if (rowSpan === 1 && colSpan === 1) {\r\n // could still be merged: the spreadsheet does not send\r\n // rowSpan/colSpan, but mergedCells is already populated.\r\n // https://github.com/telerik/kendo-ui-core/issues/2401\r\n var tmp = getSpan(ctx.mergedCells, topLeftRef);\r\n if (tmp) {\r\n colSpan = tmp.colSpan;\r\n rowSpan = tmp.rowSpan;\r\n }\r\n }\r\n\r\n spanCell(cell, cellData, cellIndex, colSpan);\r\n\r\n if (rowSpan > 1 || colSpan > 1) {\r\n pushUnique(ctx.mergedCells,\r\n topLeftRef + \":\" + ref(rowIndex + rowSpan - 1,\r\n cellIndex + colSpan - 1));\r\n }\r\n\r\n if (rowSpan > 1) {\r\n for (var ri = rowIndex + 1; ri < rowIndex + rowSpan; ri++) {\r\n var nextRow = ctx.rowsByIndex[ri];\r\n if (!nextRow) {\r\n nextRow = ctx.rowsByIndex[ri] = { index: ri, cells: [] };\r\n ctx.rowData.push(nextRow);\r\n }\r\n\r\n spanCell(cell, nextRow.cells, cellIndex - 1, colSpan + 1);\r\n }\r\n }\r\n }\r\n }\r\n\r\n function insertCell(data, cell) {\r\n var index;\r\n\r\n if (typeof cell.index === \"number\") {\r\n index = cell.index;\r\n insertCellAt(data, cell, cell.index);\r\n } else {\r\n index = appendCell(data, cell);\r\n }\r\n\r\n return index;\r\n }\r\n\r\n function insertCellAt(data, cell, index) {\r\n data[index] = cell;\r\n }\r\n\r\n function appendCell(data, cell) {\r\n var index = data.length;\r\n\r\n for (var i = 0; i < data.length + 1; i++) {\r\n if (!data[i]) {\r\n data[i] = cell;\r\n index = i;\r\n break;\r\n }\r\n }\r\n\r\n return index;\r\n }\r\n\r\n function spanCell(cell, row, startIndex, colSpan) {\r\n for (var i = 1; i < colSpan; i++) {\r\n var tmp = {\r\n borderTop : cell.borderTop,\r\n borderRight : cell.borderRight,\r\n borderBottom : cell.borderBottom,\r\n borderLeft : cell.borderLeft\r\n };\r\n insertCellAt(row, tmp, startIndex + i);\r\n }\r\n }\r\n\r\n var SPREADSHEET_FILTERS = function (ref$1) {\r\n var ref = ref$1.ref;\r\n var columns = ref$1.columns;\r\n var generators = ref$1.generators;\r\n\r\n return (\"\\n
\\n \" + (foreach(columns, function (col) { return (\"\\n \\n \" + (generators[col.filter](col)) + \"\\n \\n \"); })) + \"\\n\");\r\n };\r\n\r\n var SPREADSHEET_CUSTOM_FILTER = function (ref) {\r\n var logic = ref.logic;\r\n var criteria = ref.criteria;\r\n\r\n return (\"\\n
\\n\" + (foreach(criteria, function (f) {\r\n var op = spreadsheetFilters.customOperator(f);\r\n var val = spreadsheetFilters.customValue(f);\r\n return (\"\");\r\n })) + \"\\n\");\r\n };\r\n\r\n var SPREADSHEET_DYNAMIC_FILTER = function (ref) {\r\n var type = ref.type;\r\n\r\n return (\"
\");\r\n };\r\n\r\n var SPREADSHEET_TOP_FILTER = function (ref) {\r\n var type = ref.type;\r\n var value = ref.value;\r\n\r\n return (\"
\");\r\n };\r\n\r\n var SPREADSHEET_VALUE_FILTER = function (ref) {\r\n var blanks = ref.blanks;\r\n var values = ref.values;\r\n\r\n return (\"
\\n \" + (foreach(values, function (value) { return (\"\\n \"); })) + \"\\n \");\r\n };\r\n\r\n function spreadsheetFilters(filter) {\r\n return SPREADSHEET_FILTERS({\r\n ref: filter.ref,\r\n columns: filter.columns,\r\n generators: {\r\n custom : SPREADSHEET_CUSTOM_FILTER,\r\n dynamic : SPREADSHEET_DYNAMIC_FILTER,\r\n top : SPREADSHEET_TOP_FILTER,\r\n value : SPREADSHEET_VALUE_FILTER\r\n }\r\n });\r\n }\r\n\r\n spreadsheetFilters.customOperator = function(f) {\r\n return {\r\n eq : \"equal\",\r\n gt : \"greaterThan\",\r\n gte : \"greaterThanOrEqual\",\r\n lt : \"lessThan\",\r\n lte : \"lessThanOrEqual\",\r\n ne : \"notEqual\",\r\n\r\n // These are not in the spec, but seems to be how Excel does\r\n // it (see customValue below). For the non-negated versions,\r\n // the operator attribute is missing completely.\r\n doesnotstartwith: \"notEqual\",\r\n doesnotendwith: \"notEqual\",\r\n doesnotcontain: \"notEqual\",\r\n doesnotmatch: \"notEqual\"\r\n }[f.operator.toLowerCase()];\r\n };\r\n\r\n function quoteSheet(name) {\r\n if (/^\\'/.test(name)) { // assume already quoted, the Spreadsheet does it.\r\n return name;\r\n }\r\n if (/^[a-z_][a-z0-9_]*$/i.test(name)) {\r\n return name; // no need to quote it\r\n }\r\n return \"'\" + name.replace(/\\x27/g, \"\\\\'\") + \"'\";\r\n }\r\n\r\n spreadsheetFilters.customValue = function(f) {\r\n function esc(str) {\r\n return str.replace(/([*?])/g, \"~$1\");\r\n }\r\n\r\n switch (f.operator.toLowerCase()) {\r\n case \"startswith\":\r\n case \"doesnotstartwith\":\r\n return esc(f.value) + \"*\";\r\n\r\n case \"endswith\":\r\n case \"doesnotendwith\":\r\n return \"*\" + esc(f.value);\r\n\r\n case \"contains\":\r\n case \"doesnotcontain\":\r\n return \"*\" + esc(f.value) + \"*\";\r\n\r\n default:\r\n return f.value;\r\n }\r\n };\r\n\r\n spreadsheetFilters.dynamicFilterType = function(type) {\r\n return {\r\n quarter1 : \"Q1\",\r\n quarter2 : \"Q2\",\r\n quarter3 : \"Q3\",\r\n quarter4 : \"Q4\",\r\n january : \"M1\",\r\n february : \"M2\",\r\n march : \"M3\",\r\n april : \"M4\",\r\n may : \"M5\",\r\n june : \"M6\",\r\n july : \"M7\",\r\n august : \"M8\",\r\n september : \"M9\",\r\n october : \"M10\",\r\n november : \"M11\",\r\n december : \"M12\"\r\n }[type.toLowerCase()] || type;\r\n };\r\n\r\n kendo.deepExtend(kendo.ooxml, {\r\n IntlService: IntlService,\r\n Workbook: Workbook,\r\n Worksheet: Worksheet\r\n });\r\n\r\n })(window.kendo.jQuery);\r\n\r\n // import * as ooxml from \"/kendo-ooxml/src/main.js\";\r\n // kendo.ooxml = ooxml;\r\n\r\n (function ($) {\r\n\r\n var Workbook = kendo.ooxml.Workbook;\r\n\r\n kendo.ooxml.IntlService.register({\r\n toString: kendo.toString\r\n });\r\n\r\n var toDataURL = Workbook.prototype.toDataURL;\r\n\r\n Object.assign(Workbook.prototype, {\r\n toDataURL: function() {\r\n var result = toDataURL.call(this);\r\n if (typeof result !== 'string') {\r\n throw new Error('The toDataURL method can be used only with jsZip 2. Either include jsZip 2 or use the toDataURLAsync method.');\r\n }\r\n\r\n return result;\r\n },\r\n\r\n toDataURLAsync: function() {\r\n var deferred = $.Deferred();\r\n var result = toDataURL.call(this);\r\n if (typeof result === 'string') {\r\n result = deferred.resolve(result);\r\n } else if (result && result.then){\r\n result.then(function(dataURI) {\r\n deferred.resolve(dataURI);\r\n }, function() {\r\n deferred.reject();\r\n });\r\n }\r\n\r\n return deferred.promise();\r\n }\r\n });\r\n\r\n })(window.kendo.jQuery);\r\n\r\n var __meta__$2x = {\r\n id: \"ooxml\",\r\n name: \"XLSX generation\",\r\n category: \"framework\",\r\n advanced: true,\r\n depends: [ \"core\" ]\r\n };\r\n\r\n /***********************************************************************\r\n * WARNING: this file is auto-generated. If you change it directly,\r\n * your modifications will eventually be lost. The source code is in\r\n * `kendo-ooxml` repository, you should make your changes there and\r\n * run `src-modules/sync.sh` in this repository.\r\n */\r\n\r\n (function($) {\r\n /* eslint-disable space-before-blocks, space-before-function-paren */\r\n\r\n window.kendo.excel = window.kendo.excel || {};\r\n\r\n var getter = kendo.getter;\r\n var map = $.map;\r\n\r\n var current = {\r\n compile: function(template) {\r\n return template;\r\n }\r\n };\r\n\r\n var TemplateService = kendo.Class.extend({\r\n\r\n });\r\n\r\n TemplateService.register = function(userImplementation) {\r\n current = userImplementation;\r\n };\r\n\r\n TemplateService.compile = function(template) {\r\n return current.compile(template);\r\n };\r\n\r\n function defaultGroupHeaderTemplate(data) {\r\n return ((data.title) + \": \" + (data.value));\r\n }\r\n\r\n function createArray(length, callback) {\r\n var result = [];\r\n\r\n for (var idx = 0; idx < length; idx++) {\r\n result.push(callback(idx));\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function defaultItemId(item) {\r\n return item.id;\r\n }\r\n\r\n var ExcelExporter = kendo.Class.extend({\r\n init: function(options) {\r\n options.columns = this._trimColumns(options.columns || []);\r\n\r\n this.allColumns = map(this._leafColumns(options.columns || []), this._prepareColumn);\r\n\r\n this.columns = this._visibleColumns(this.allColumns);\r\n\r\n this.options = options;\r\n this.data = options.data || [];\r\n this.aggregates = options.aggregates || {};\r\n this.groups = [].concat(options.groups || []);\r\n this.hasGroups = this.groups.length > 0;\r\n this.hierarchy = options.hierarchy;\r\n this.hasGroupHeaderColumn = this.columns.some(function (column) { return column.groupHeaderColumnTemplate; });\r\n this.collapsible = this.options.collapsible;\r\n },\r\n\r\n workbook: function() {\r\n var workbook = {\r\n sheets: [ {\r\n columns: this._columns(),\r\n rows: this.hierarchy ? this._hierarchyRows() : this._rows(),\r\n freezePane: this._freezePane(),\r\n filter: this._filter()\r\n } ]\r\n };\r\n\r\n return workbook;\r\n },\r\n\r\n _trimColumns: function(columns) {\r\n var this$1$1 = this;\r\n\r\n return columns.filter(function (column) {\r\n var result = Boolean(column.field);\r\n\r\n if (!result && column.columns) {\r\n result = this$1$1._trimColumns(column.columns).length > 0;\r\n }\r\n\r\n return result;\r\n });\r\n },\r\n\r\n _leafColumns: function(columns) {\r\n var this$1$1 = this;\r\n\r\n var result = [];\r\n\r\n for (var idx = 0; idx < columns.length; idx++) {\r\n if (!columns[idx].columns) {\r\n result.push(columns[idx]);\r\n } else {\r\n result = result.concat(this$1$1._leafColumns(columns[idx].columns));\r\n }\r\n }\r\n\r\n return result;\r\n },\r\n\r\n _prepareColumn: function(column) {\r\n if (!column.field) {\r\n return null;\r\n }\r\n\r\n var value = function(dataItem) {\r\n return getter(column.field, true)(dataItem);\r\n };\r\n\r\n var values = null;\r\n\r\n if (column.values) {\r\n values = {};\r\n\r\n column.values.forEach(function(item) {\r\n values[item.value] = item.text;\r\n });\r\n\r\n value = function(dataItem) {\r\n return values[getter(column.field, true)(dataItem)];\r\n };\r\n }\r\n\r\n return $.extend({}, column, {\r\n value: value,\r\n values: values,\r\n groupHeaderTemplate: column.groupHeaderTemplate ? TemplateService.compile(column.groupHeaderTemplate) : defaultGroupHeaderTemplate,\r\n groupHeaderColumnTemplate: column.groupHeaderColumnTemplate ? TemplateService.compile(column.groupHeaderColumnTemplate) : null,\r\n groupFooterTemplate: column.groupFooterTemplate ? TemplateService.compile(column.groupFooterTemplate) : null,\r\n footerTemplate: column.footerTemplate ? TemplateService.compile(column.footerTemplate) : null\r\n });\r\n },\r\n\r\n _filter: function() {\r\n if (!this.options.filterable) {\r\n return null;\r\n }\r\n\r\n var depth = this._depth();\r\n\r\n return {\r\n from: depth,\r\n to: depth + this.columns.length - 1\r\n };\r\n },\r\n\r\n _createPaddingCells: function(length) {\r\n var this$1$1 = this;\r\n\r\n return createArray(length, function () { return $.extend({\r\n background: \"#dfdfdf\",\r\n color: \"#333\"\r\n }, this$1$1.options.paddingCellOptions); });\r\n },\r\n\r\n _dataRow: function(dataItem, level, depth) {\r\n var this$1$1 = this;\r\n\r\n var cells = this._createPaddingCells(level);\r\n\r\n // grouped\r\n if (this.hasGroups && depth && dataItem.items) {\r\n cells = cells.concat(this._groupHeaderCells(dataItem, level, depth));\r\n var rows = this._dataRows(dataItem.items, level + 1);\r\n\r\n rows.unshift({\r\n type: \"group-header\",\r\n cells: cells,\r\n level: this.collapsible ? level : null\r\n });\r\n\r\n return rows.concat(this._footer(dataItem, level));\r\n }\r\n\r\n var dataCells = [];\r\n\r\n for (var cellIdx = 0; cellIdx < this.columns.length; cellIdx++) {\r\n dataCells[cellIdx] = this$1$1._cell(dataItem, this$1$1.columns[cellIdx]);\r\n }\r\n\r\n if (this.hierarchy) {\r\n dataCells[0].colSpan = depth - level + 1;\r\n }\r\n\r\n return [ {\r\n type: \"data\",\r\n cells: cells.concat(dataCells),\r\n level: this.collapsible ? level : null\r\n } ];\r\n },\r\n\r\n _groupHeaderCells: function(dataItem, level, depth) {\r\n var cells = [];\r\n\r\n var column = this.allColumns.filter(function(column) {\r\n return column.field === dataItem.field;\r\n })[0] || {};\r\n\r\n var title = column && column.title ? column.title : dataItem.field;\r\n var template = column ? column.groupHeaderTemplate || column.groupHeaderColumnTemplate : null;\r\n var group = $.extend({\r\n title: title,\r\n field: dataItem.field,\r\n value: column && column.values ? column.values[dataItem.value] : dataItem.value,\r\n aggregates: dataItem.aggregates,\r\n items: dataItem.items\r\n }, dataItem.aggregates[dataItem.field]);\r\n\r\n var value = template ? template(group) : (title + \": \" + (dataItem.value));\r\n\r\n cells.push($.extend({\r\n value: value,\r\n background: \"#dfdfdf\",\r\n color: \"#333\",\r\n colSpan: (this.hasGroupHeaderColumn ? 1 : this.columns.length) + depth - level\r\n }, column.groupHeaderCellOptions));\r\n\r\n if (this.hasGroupHeaderColumn) {\r\n this.columns.forEach(function(column, index) {\r\n if (index > 0) {\r\n cells.push($.extend({\r\n background: \"#dfdfdf\",\r\n color: \"#333\",\r\n value: column.groupHeaderColumnTemplate ?\r\n column.groupHeaderColumnTemplate($.extend({ group: group }, group, dataItem.aggregates[column.field])) :\r\n undefined\r\n }, column.groupHeaderCellOptions));\r\n }\r\n });\r\n }\r\n\r\n return cells;\r\n },\r\n\r\n _dataRows: function(dataItems, level) {\r\n var this$1$1 = this;\r\n\r\n var depth = this._depth();\r\n var rows = [];\r\n\r\n for (var idx = 0; idx < dataItems.length; idx++) {\r\n rows.push.apply(rows, this$1$1._dataRow(dataItems[idx], level, depth));\r\n }\r\n\r\n return rows;\r\n },\r\n\r\n _hierarchyRows: function() {\r\n var this$1$1 = this;\r\n\r\n var depth = this._depth();\r\n var data = this.data;\r\n var itemLevel = this.hierarchy.itemLevel;\r\n var itemId = this.hierarchy.itemId || defaultItemId;\r\n var hasFooter = this._hasFooterTemplate();\r\n var rows = [];\r\n var parents = [];\r\n var previousLevel = 0;\r\n var previousItemId;\r\n\r\n if (!hasFooter) {\r\n this.collapsible = false;\r\n }\r\n\r\n for (var idx = 0; idx < data.length; idx++) {\r\n var item = data[idx];\r\n var level = itemLevel(item, idx);\r\n\r\n if (hasFooter) {\r\n if (level > previousLevel) {\r\n parents.push({ id: previousItemId, level: previousLevel });\r\n } else if (level < previousLevel) {\r\n rows.push.apply(rows, this$1$1._hierarchyFooterRows(parents, level, depth));\r\n }\r\n\r\n previousLevel = level;\r\n previousItemId = itemId(item, idx);\r\n }\r\n\r\n rows.push.apply(rows, this$1$1._dataRow(item, level + 1, depth));\r\n }\r\n\r\n if (hasFooter) {\r\n rows.push.apply(rows, this._hierarchyFooterRows(parents, 0, depth));\r\n\r\n var rootAggregate = data.length ? this.aggregates[data[0].parentId] : {};\r\n rows.push(this._hierarchyFooter(rootAggregate, 0, depth));\r\n }\r\n\r\n this._prependHeaderRows(rows);\r\n\r\n return rows;\r\n },\r\n\r\n _hierarchyFooterRows: function(parents, currentLevel, depth) {\r\n var this$1$1 = this;\r\n\r\n var rows = [];\r\n while (parents.length && parents[parents.length - 1].level >= currentLevel) {\r\n var parent = parents.pop();\r\n rows.push(this$1$1._hierarchyFooter(this$1$1.aggregates[parent.id], parent.level + 1, depth));\r\n }\r\n\r\n return rows;\r\n },\r\n\r\n _hasFooterTemplate: function() {\r\n var columns = this.columns;\r\n for (var idx = 0; idx < columns.length; idx++) {\r\n if (columns[idx].footerTemplate) {\r\n return true;\r\n }\r\n }\r\n },\r\n\r\n _hierarchyFooter: function(aggregates, level, depth) {\r\n var cells = this.columns.map(function(column, index) {\r\n var colSpan = index ? 1 : depth - level + 1;\r\n if (column.footerTemplate) {\r\n var fieldAggregates = (aggregates || {})[column.field];\r\n return $.extend({\r\n background: \"#dfdfdf\",\r\n color: \"#333\",\r\n colSpan: colSpan,\r\n value: column.footerTemplate($.extend({ aggregates: aggregates }, fieldAggregates))\r\n }, column.footerCellOptions);\r\n }\r\n\r\n return $.extend({\r\n background: \"#dfdfdf\",\r\n color: \"#333\",\r\n colSpan: colSpan\r\n }, column.footerCellOptions);\r\n });\r\n\r\n return {\r\n type: \"footer\",\r\n cells: this._createPaddingCells(level).concat(cells),\r\n level: this.collapsible ? level : null\r\n };\r\n },\r\n\r\n _footer: function(dataItem, level) {\r\n var rows = [];\r\n var footer = this.columns.some(function (column) { return column.groupFooterTemplate; });\r\n\r\n var templateData, group;\r\n if (footer) {\r\n group = {\r\n group: { items: dataItem.items,\r\n field: dataItem.field,\r\n value: dataItem.value }\r\n };\r\n templateData = {};\r\n Object.keys(dataItem.aggregates).forEach(function (key) {\r\n templateData[key] = $.extend({}, dataItem.aggregates[key], group);\r\n });\r\n }\r\n\r\n var cells = this.columns.map(function (column) {\r\n if (column.groupFooterTemplate) {\r\n var data = $.extend({}, templateData, dataItem.aggregates[column.field], group);\r\n return $.extend({\r\n background: \"#dfdfdf\",\r\n color: \"#333\",\r\n value: column.groupFooterTemplate(data)\r\n }, column.groupFooterCellOptions);\r\n }\r\n\r\n return $.extend({\r\n background: \"#dfdfdf\",\r\n color: \"#333\"\r\n }, column.groupFooterCellOptions);\r\n });\r\n\r\n if (footer) {\r\n rows.push({\r\n type: \"group-footer\",\r\n cells: this._createPaddingCells(this.groups.length).concat(cells),\r\n level: this.collapsible ? level : null\r\n });\r\n }\r\n\r\n return rows;\r\n },\r\n\r\n _isColumnVisible: function(column) {\r\n return this._visibleColumns([ column ]).length > 0 && (column.field || column.columns);\r\n },\r\n\r\n _visibleColumns: function(columns) {\r\n var this$1$1 = this;\r\n\r\n return columns.filter(function (column) {\r\n var exportable = column.exportable;\r\n if (typeof exportable === 'object') {\r\n exportable = column.exportable.excel;\r\n }\r\n\r\n var visibleInExport = !column.hidden && exportable !== false;\r\n var visibleInExportOnly = column.hidden && exportable === true;\r\n var visible = visibleInExport || visibleInExportOnly;\r\n if (visible && column.columns) {\r\n visible = this$1$1._visibleColumns(column.columns).length > 0;\r\n }\r\n return visible;\r\n });\r\n },\r\n\r\n _headerRow: function(row, groups) {\r\n var this$1$1 = this;\r\n\r\n var headers = row.cells.map(function(cell) {\r\n return $.extend(cell, {\r\n colSpan: cell.colSpan > 1 ? cell.colSpan : 1,\r\n rowSpan: row.rowSpan > 1 && !cell.colSpan ? row.rowSpan : 1\r\n });\r\n });\r\n\r\n if (this.hierarchy && headers[0].firstCell) {\r\n headers[0].colSpan += this._depth();\r\n }\r\n\r\n return {\r\n type: \"header\",\r\n cells: createArray(groups.length, function () { return $.extend({\r\n background: \"#7a7a7a\",\r\n color: \"#fff\"\r\n }, this$1$1.options.headerPaddingCellOptions); }).concat(headers)\r\n };\r\n },\r\n\r\n _prependHeaderRows: function(rows) {\r\n var this$1$1 = this;\r\n\r\n var groups = this.groups;\r\n\r\n var headerRows = [ { rowSpan: 1, cells: [], index: 0 } ];\r\n\r\n this._prepareHeaderRows(headerRows, this.options.columns);\r\n\r\n for (var idx = headerRows.length - 1; idx >= 0; idx--) {\r\n rows.unshift(this$1$1._headerRow(headerRows[idx], groups));\r\n }\r\n },\r\n\r\n _prepareHeaderRows: function(rows, columns, parentCell, parentRow) {\r\n var this$1$1 = this;\r\n\r\n var row = parentRow || rows[rows.length - 1];\r\n var childRow = rows[row.index + 1];\r\n var totalColSpan = 0;\r\n\r\n for (var idx = 0; idx < columns.length; idx++) {\r\n var column = columns[idx];\r\n if (this$1$1._isColumnVisible(column)) {\r\n\r\n var cell = $.extend({\r\n background: \"#7a7a7a\",\r\n color: \"#fff\",\r\n value: column.title || column.field,\r\n colSpan: 0,\r\n firstCell: idx === 0 && (!parentCell || parentCell.firstCell)\r\n }, column.headerCellOptions);\r\n row.cells.push(cell);\r\n\r\n if (column.columns && column.columns.length) {\r\n if (!childRow) {\r\n childRow = { rowSpan: 0, cells: [], index: rows.length };\r\n rows.push(childRow);\r\n }\r\n cell.colSpan = this$1$1._trimColumns(this$1$1._visibleColumns(column.columns)).length;\r\n this$1$1._prepareHeaderRows(rows, column.columns, cell, childRow);\r\n totalColSpan += cell.colSpan - 1;\r\n row.rowSpan = rows.length - row.index;\r\n }\r\n }\r\n }\r\n\r\n if (parentCell) {\r\n parentCell.colSpan += totalColSpan;\r\n }\r\n },\r\n\r\n _rows: function() {\r\n var this$1$1 = this;\r\n\r\n var rows = this._dataRows(this.data, 0);\r\n\r\n if (this.columns.length) {\r\n this._prependHeaderRows(rows);\r\n var footer = false;\r\n\r\n var cells = this.columns.map(function (column) {\r\n if (column.footerTemplate) {\r\n footer = true;\r\n\r\n return $.extend({\r\n background: \"#dfdfdf\",\r\n color: \"#333\",\r\n value: column.footerTemplate($.extend({}, this$1$1.aggregates, this$1$1.aggregates[column.field]))\r\n }, column.footerCellOptions);\r\n }\r\n\r\n return $.extend({\r\n background: \"#dfdfdf\",\r\n color: \"#333\"\r\n }, column.footerCellOptions);\r\n });\r\n\r\n if (footer) {\r\n rows.push({\r\n type: \"footer\",\r\n cells: this._createPaddingCells(this.groups.length).concat(cells)\r\n });\r\n }\r\n }\r\n\r\n return rows;\r\n },\r\n\r\n _headerDepth: function(columns) {\r\n var this$1$1 = this;\r\n\r\n var result = 1;\r\n var max = 0;\r\n\r\n for (var idx = 0; idx < columns.length; idx++) {\r\n if (columns[idx].columns) {\r\n var temp = this$1$1._headerDepth(columns[idx].columns);\r\n if (temp > max) {\r\n max = temp;\r\n }\r\n }\r\n }\r\n return result + max;\r\n },\r\n\r\n _freezePane: function() {\r\n var columns = this._visibleColumns(this.options.columns || []);\r\n\r\n var colSplit = this._visibleColumns(this._trimColumns(this._leafColumns(columns.filter(function(column) {\r\n return column.locked;\r\n })))).length;\r\n\r\n return {\r\n rowSplit: this._headerDepth(columns),\r\n colSplit: colSplit ? colSplit + this.groups.length : 0\r\n };\r\n },\r\n\r\n _cell: function(dataItem, column) {\r\n return $.extend({\r\n value: column.value(dataItem)\r\n }, column.cellOptions);\r\n },\r\n\r\n _depth: function() {\r\n var depth = 0;\r\n\r\n if (this.hierarchy) {\r\n depth = this.hierarchy.depth;\r\n } else {\r\n depth = this.groups.length;\r\n }\r\n\r\n return depth;\r\n },\r\n\r\n _columns: function() {\r\n var depth = this._depth();\r\n var columns = createArray(depth, function () { return ({ width: 20 }); });\r\n\r\n return columns.concat(this.columns.map(function(column) {\r\n return {\r\n width: parseInt(column.width, 10),\r\n autoWidth: column.width ? false : true\r\n };\r\n }));\r\n }\r\n });\r\n\r\n kendo.deepExtend(kendo.excel, {\r\n ExcelExporter: ExcelExporter,\r\n TemplateService: TemplateService\r\n });\r\n\r\n })(window.kendo.jQuery);\r\n\r\n (function($, kendo) {\r\n\r\n var ExcelExporter = kendo.excel.ExcelExporter;\r\n\r\n var extend = $.extend;\r\n\r\n kendo.excel.TemplateService.register({\r\n compile: kendo.template\r\n });\r\n\r\n kendo.ExcelExporter = kendo.Class.extend({\r\n init: function(options) {\r\n this.options = options;\r\n var dataSource = options.dataSource;\r\n\r\n if (dataSource instanceof kendo.data.DataSource) {\r\n\r\n if (!dataSource.filter()) {\r\n dataSource.options.filter = undefined;\r\n }\r\n\r\n this.dataSource = new dataSource.constructor(extend(\r\n {},\r\n dataSource.options,\r\n {\r\n page: options.allPages ? 0 : dataSource.page(),\r\n filter: dataSource.filter(),\r\n pageSize: (options.allPages || options.groupPaging) ? dataSource.total() : dataSource.pageSize() || dataSource.total(),\r\n sort: dataSource.sort(),\r\n group: dataSource.group(),\r\n aggregate: dataSource.aggregate(),\r\n isExcelExportRequest: true\r\n }));\r\n\r\n var data = dataSource.data();\r\n\r\n if (data.length > 0) {\r\n if (options.hierarchy) {\r\n for (var i = 0; i < data.length; i++) {\r\n if (data[i].expanded === false || data[i].expanded === undefined) {\r\n data[i].expanded = true;\r\n data[i].shouldRestoreExpandedState = true;\r\n }\r\n }\r\n }\r\n // Avoid toJSON() for perf and avoid data() to prevent reparenting.\r\n this.dataSource._data = data;\r\n\r\n var transport = this.dataSource.transport;\r\n if (dataSource._isServerGrouped() && transport.options && transport.options.data) { // clear the transport data when using aspnet-mvc transport\r\n transport.options.data = null;\r\n }\r\n }\r\n\r\n } else {\r\n this.dataSource = kendo.data.DataSource.create(dataSource);\r\n }\r\n },\r\n\r\n _hierarchy: function() {\r\n var hierarchy = this.options.hierarchy;\r\n var dataSource = this.dataSource;\r\n\r\n if (hierarchy && dataSource.level) {\r\n hierarchy = {\r\n itemLevel: function(item) {\r\n return dataSource.level(item);\r\n }\r\n };\r\n\r\n var view = dataSource.view();\r\n var depth = 0;\r\n var level;\r\n\r\n for (var idx = 0; idx < view.length; idx++) {\r\n level = dataSource.level(view[idx]);\r\n\r\n if (level > depth) {\r\n depth = level;\r\n }\r\n }\r\n\r\n hierarchy.depth = depth + 1;\r\n } else {\r\n hierarchy = false;\r\n }\r\n\r\n return {\r\n hierarchy: hierarchy\r\n };\r\n },\r\n\r\n _restoreExpandedState: function() {\r\n var options = this.options,\r\n dataSource = options.dataSource,\r\n data = dataSource.data(),\r\n hierarchy = options.hierarchy;\r\n\r\n if (data.length > 0) {\r\n if (hierarchy) {\r\n for (var i = 0; i < data.length; i++) {\r\n if (data[i].shouldRestoreExpandedState) {\r\n data[i].expanded = false;\r\n delete data[i].shouldRestoreExpandedState;\r\n }\r\n }\r\n }\r\n }\r\n },\r\n\r\n workbook: function() {\r\n return $.Deferred((function(d) {\r\n this.dataSource.fetch()\r\n .then((function() {\r\n\r\n var workbook = new ExcelExporter(extend({}, this.options, this._hierarchy(), {\r\n data: this.dataSource.view(),\r\n groups: this.dataSource.group(),\r\n aggregates: this.dataSource.aggregates()\r\n })).workbook();\r\n\r\n d.resolve(workbook, this.dataSource.view());\r\n }).bind(this));\r\n }).bind(this)).promise();\r\n }\r\n });\r\n\r\n\r\n })(kendo.jQuery, kendo);\r\n\r\n (function($, kendo) {\r\n\r\n\r\n kendo.ExcelMixin = {\r\n extend: function(proto) {\r\n proto.events.push(\"excelExport\");\r\n proto.options.excel = $.extend(proto.options.excel, this.options);\r\n proto.saveAsExcel = this.saveAsExcel;\r\n },\r\n options: {\r\n proxyURL: \"\",\r\n allPages: false,\r\n filterable: false,\r\n fileName: \"Export.xlsx\",\r\n collapsible: false\r\n },\r\n saveAsExcel: function(deferred) {\r\n var excel = this.options.excel || {};\r\n\r\n var exporter = new kendo.ExcelExporter({\r\n columns: this.columns,\r\n dataSource: this.dataSource,\r\n allPages: excel.allPages,\r\n filterable: excel.filterable,\r\n hierarchy: excel.hierarchy,\r\n collapsible: excel.collapsible\r\n });\r\n\r\n exporter.workbook().then((function(book, data) {\r\n if (!this.trigger(\"excelExport\", { workbook: book, data: data })) {\r\n var workbook = new kendo.ooxml.Workbook(book);\r\n\r\n if (!workbook.options) {\r\n workbook.options = {};\r\n }\r\n workbook.options.skipCustomHeight = true;\r\n\r\n workbook.toDataURLAsync().then(function(dataURI) {\r\n kendo.saveAs({\r\n dataURI: dataURI,\r\n fileName: book.fileName || excel.fileName,\r\n proxyURL: excel.proxyURL,\r\n forceProxy: excel.forceProxy\r\n });\r\n\r\n exporter._restoreExpandedState();\r\n if (deferred) {\r\n deferred.resolve();\r\n }\r\n });\r\n }\r\n }).bind(this));\r\n }\r\n };\r\n\r\n })(kendo.jQuery, kendo);\r\n\r\n var __meta__$2w = {\r\n id: \"excel\",\r\n name: \"Excel export\",\r\n category: \"framework\",\r\n advanced: true,\r\n mixin: true,\r\n depends: [ \"data\", \"ooxml\" ]\r\n };\r\n\r\n var __meta__$2v = {\r\n id: \"data.signalr\",\r\n name: \"SignalR\",\r\n category: \"framework\",\r\n depends: [ \"data\" ],\r\n hidden: true\r\n };\r\n\r\n (function($) {\r\n var kendo = window.kendo;\r\n var isFunction = kendo.isFunction;\r\n\r\n function isJQueryPromise(promise) {\r\n return promise && isFunction(promise.done) && isFunction(promise.fail);\r\n }\r\n\r\n function isNativePromise(promise) {\r\n return promise && isFunction(promise.then) && isFunction(promise.catch);\r\n }\r\n\r\n var transport = kendo.data.RemoteTransport.extend({\r\n init: function(options) {\r\n var signalr = options && options.signalr ? options.signalr : {};\r\n\r\n var promise = signalr.promise;\r\n\r\n if (!promise) {\r\n throw new Error('The \"promise\" option must be set.');\r\n }\r\n\r\n if (!isJQueryPromise(promise) && !isNativePromise(promise)) {\r\n throw new Error('The \"promise\" option must be a Promise.');\r\n }\r\n\r\n this.promise = promise;\r\n\r\n var hub = signalr.hub;\r\n\r\n if (!hub) {\r\n throw new Error('The \"hub\" option must be set.');\r\n }\r\n\r\n if (typeof hub.on != \"function\" || typeof hub.invoke != \"function\") {\r\n throw new Error('The \"hub\" option is not a valid SignalR hub proxy.');\r\n }\r\n\r\n this.hub = hub;\r\n\r\n kendo.data.RemoteTransport.fn.init.call(this, options);\r\n },\r\n\r\n push: function(callbacks) {\r\n var client = this.options.signalr.client || {};\r\n\r\n if (client.create) {\r\n this.hub.on(client.create, callbacks.pushCreate);\r\n }\r\n\r\n if (client.update) {\r\n this.hub.on(client.update, callbacks.pushUpdate);\r\n }\r\n\r\n if (client.destroy) {\r\n this.hub.on(client.destroy, callbacks.pushDestroy);\r\n }\r\n },\r\n\r\n _crud: function(options, type) {\r\n var hub = this.hub;\r\n var promise = this.promise;\r\n var server = this.options.signalr.server;\r\n\r\n if (!server || !server[type]) {\r\n throw new Error(kendo.format('The \"server.{0}\" option must be set.', type));\r\n }\r\n\r\n var args = [server[type]];\r\n\r\n var data = this.parameterMap(options.data, type);\r\n\r\n if (!$.isEmptyObject(data)) {\r\n args.push(data);\r\n }\r\n\r\n if (isJQueryPromise(promise)) {\r\n promise.done(function() {\r\n hub.invoke.apply(hub, args)\r\n .done(options.success)\r\n .fail(options.error);\r\n });\r\n } else if (isNativePromise(promise)) {\r\n promise.then(function() {\r\n hub.invoke.apply(hub, args)\r\n .then(options.success)\r\n .catch(options.error);\r\n });\r\n }\r\n },\r\n\r\n read: function(options) {\r\n this._crud(options, \"read\");\r\n },\r\n\r\n create: function(options) {\r\n this._crud(options, \"create\");\r\n },\r\n\r\n update: function(options) {\r\n this._crud(options, \"update\");\r\n },\r\n\r\n destroy: function(options) {\r\n this._crud(options, \"destroy\");\r\n }\r\n });\r\n\r\n $.extend(true, kendo.data, {\r\n transports: {\r\n signalr: transport\r\n }\r\n });\r\n\r\n })(window.kendo.jQuery);\r\n var kendo$2t = kendo;\r\n\r\n (function($) {\r\n\r\n function createPromise() {\r\n return $.Deferred();\r\n }\r\n\r\n function promiseAll(promises) {\r\n return $.when.apply($, promises);\r\n }\r\n\r\n function extendStatic(dest, src) {\r\n if (!src) {\r\n return;\r\n }\r\n\r\n if (typeof src.__proto__ === 'function') {\r\n dest.__proto__ = src;\r\n } else {\r\n for (var member in src) {\r\n if (src.hasOwnProperty(member)) {\r\n dest[member] = src[member];\r\n }\r\n }\r\n }\r\n }\r\n\r\n kendo.drawing.util = kendo.drawing.util || {};\r\n kendo.deepExtend(kendo.drawing.util, {\r\n createPromise: createPromise,\r\n promiseAll: promiseAll,\r\n extendStatic: extendStatic\r\n });\r\n\r\n })(window.kendo.jQuery);\r\n\r\n /***********************************************************************\r\n * WARNING: this file is auto-generated. If you change it directly,\r\n * your modifications will eventually be lost. The source code is in\r\n * `kendo-drawing` repository, you should make your changes there and\r\n * run `src-modules/sync.sh` in this repository.\r\n */\r\n /* eslint-disable space-before-blocks, space-before-function-paren, no-multi-spaces */\r\n\r\n var __meta__$2u = {\r\n id: \"color\",\r\n name: \"Color utils\",\r\n category: \"framework\",\r\n advanced: true,\r\n description: \"Color utilities used across components\",\r\n depends: [ \"core\" ]\r\n };\r\n\r\n window.kendo = window.kendo || {};\r\n\r\n var Class$3 = kendo.Class;\r\n var support = kendo.support;\r\n\r\n var namedColors = {\r\n aliceblue: \"f0f8ff\", antiquewhite: \"faebd7\", aqua: \"00ffff\",\r\n aquamarine: \"7fffd4\", azure: \"f0ffff\", beige: \"f5f5dc\",\r\n bisque: \"ffe4c4\", black: \"000000\", blanchedalmond: \"ffebcd\",\r\n blue: \"0000ff\", blueviolet: \"8a2be2\", brown: \"a52a2a\",\r\n burlywood: \"deb887\", cadetblue: \"5f9ea0\", chartreuse: \"7fff00\",\r\n chocolate: \"d2691e\", coral: \"ff7f50\", cornflowerblue: \"6495ed\",\r\n cornsilk: \"fff8dc\", crimson: \"dc143c\", cyan: \"00ffff\",\r\n darkblue: \"00008b\", darkcyan: \"008b8b\", darkgoldenrod: \"b8860b\",\r\n darkgray: \"a9a9a9\", darkgrey: \"a9a9a9\", darkgreen: \"006400\",\r\n darkkhaki: \"bdb76b\", darkmagenta: \"8b008b\", darkolivegreen: \"556b2f\",\r\n darkorange: \"ff8c00\", darkorchid: \"9932cc\", darkred: \"8b0000\",\r\n darksalmon: \"e9967a\", darkseagreen: \"8fbc8f\", darkslateblue: \"483d8b\",\r\n darkslategray: \"2f4f4f\", darkslategrey: \"2f4f4f\", darkturquoise: \"00ced1\",\r\n darkviolet: \"9400d3\", deeppink: \"ff1493\", deepskyblue: \"00bfff\",\r\n dimgray: \"696969\", dimgrey: \"696969\", dodgerblue: \"1e90ff\",\r\n firebrick: \"b22222\", floralwhite: \"fffaf0\", forestgreen: \"228b22\",\r\n fuchsia: \"ff00ff\", gainsboro: \"dcdcdc\", ghostwhite: \"f8f8ff\",\r\n gold: \"ffd700\", goldenrod: \"daa520\", gray: \"808080\",\r\n grey: \"808080\", green: \"008000\", greenyellow: \"adff2f\",\r\n honeydew: \"f0fff0\", hotpink: \"ff69b4\", indianred: \"cd5c5c\",\r\n indigo: \"4b0082\", ivory: \"fffff0\", khaki: \"f0e68c\",\r\n lavender: \"e6e6fa\", lavenderblush: \"fff0f5\", lawngreen: \"7cfc00\",\r\n lemonchiffon: \"fffacd\", lightblue: \"add8e6\", lightcoral: \"f08080\",\r\n lightcyan: \"e0ffff\", lightgoldenrodyellow: \"fafad2\", lightgray: \"d3d3d3\",\r\n lightgrey: \"d3d3d3\", lightgreen: \"90ee90\", lightpink: \"ffb6c1\",\r\n lightsalmon: \"ffa07a\", lightseagreen: \"20b2aa\", lightskyblue: \"87cefa\",\r\n lightslategray: \"778899\", lightslategrey: \"778899\", lightsteelblue: \"b0c4de\",\r\n lightyellow: \"ffffe0\", lime: \"00ff00\", limegreen: \"32cd32\",\r\n linen: \"faf0e6\", magenta: \"ff00ff\", maroon: \"800000\",\r\n mediumaquamarine: \"66cdaa\", mediumblue: \"0000cd\", mediumorchid: \"ba55d3\",\r\n mediumpurple: \"9370d8\", mediumseagreen: \"3cb371\", mediumslateblue: \"7b68ee\",\r\n mediumspringgreen: \"00fa9a\", mediumturquoise: \"48d1cc\", mediumvioletred: \"c71585\",\r\n midnightblue: \"191970\", mintcream: \"f5fffa\", mistyrose: \"ffe4e1\",\r\n moccasin: \"ffe4b5\", navajowhite: \"ffdead\", navy: \"000080\",\r\n oldlace: \"fdf5e6\", olive: \"808000\", olivedrab: \"6b8e23\",\r\n orange: \"ffa500\", orangered: \"ff4500\", orchid: \"da70d6\",\r\n palegoldenrod: \"eee8aa\", palegreen: \"98fb98\", paleturquoise: \"afeeee\",\r\n palevioletred: \"d87093\", papayawhip: \"ffefd5\", peachpuff: \"ffdab9\",\r\n peru: \"cd853f\", pink: \"ffc0cb\", plum: \"dda0dd\",\r\n powderblue: \"b0e0e6\", purple: \"800080\", red: \"ff0000\",\r\n rosybrown: \"bc8f8f\", royalblue: \"4169e1\", saddlebrown: \"8b4513\",\r\n salmon: \"fa8072\", sandybrown: \"f4a460\", seagreen: \"2e8b57\",\r\n seashell: \"fff5ee\", sienna: \"a0522d\", silver: \"c0c0c0\",\r\n skyblue: \"87ceeb\", slateblue: \"6a5acd\", slategray: \"708090\",\r\n slategrey: \"708090\", snow: \"fffafa\", springgreen: \"00ff7f\",\r\n steelblue: \"4682b4\", tan: \"d2b48c\", teal: \"008080\",\r\n thistle: \"d8bfd8\", tomato: \"ff6347\", turquoise: \"40e0d0\",\r\n violet: \"ee82ee\", wheat: \"f5deb3\", white: \"ffffff\",\r\n whitesmoke: \"f5f5f5\", yellow: \"ffff00\", yellowgreen: \"9acd32\"\r\n };\r\n\r\n var browser = support.browser;\r\n\r\n var matchNamedColor = function (color) {\r\n var colorNames = Object.keys(namedColors);\r\n colorNames.push(\"transparent\");\r\n\r\n var regexp = new RegExp(\"^(\" + colorNames.join(\"|\") + \")(\\\\W|$)\", \"i\");\r\n matchNamedColor = function (color) { return regexp.exec(color); };\r\n\r\n return regexp.exec(color);\r\n };\r\n\r\n var BaseColor = Class$3.extend({\r\n init: function() { },\r\n\r\n toHSV: function() { return this; },\r\n\r\n toRGB: function() { return this; },\r\n\r\n toHex: function(options) { return this.toBytes().toHex(options); },\r\n\r\n toBytes: function() { return this; },\r\n\r\n toCss: function(options) { return \"#\" + this.toHex(options); },\r\n\r\n toCssRgba: function() {\r\n var rgb = this.toBytes();\r\n return (\"rgba(\" + (rgb.r) + \", \" + (rgb.g) + \", \" + (rgb.b) + \", \" + (parseFloat((Number(this.a)).toFixed(3))) + \")\");\r\n },\r\n\r\n toDisplay: function() {\r\n if (browser.msie && browser.version < 9) {\r\n return this.toCss(); // no RGBA support; does it support any opacity in colors?\r\n }\r\n return this.toCssRgba();\r\n },\r\n\r\n equals: function(c) {\r\n return c === this || ((c !== null && c !== undefined) && this.toCssRgba() === parseColor(c).toCssRgba());\r\n },\r\n\r\n diff: function(other) {\r\n if (other === null) {\r\n return NaN;\r\n }\r\n\r\n var c1 = this.toBytes();\r\n var c2 = other.toBytes();\r\n\r\n return Math.sqrt(Math.pow((c1.r - c2.r) * 0.30, 2) +\r\n Math.pow((c1.g - c2.g) * 0.59, 2) +\r\n Math.pow((c1.b - c2.b) * 0.11, 2));\r\n },\r\n\r\n clone: function() {\r\n var c = this.toBytes();\r\n if (c === this) {\r\n c = new Bytes(c.r, c.g, c.b, c.a);\r\n }\r\n\r\n return c;\r\n }\r\n });\r\n\r\n var RGB = BaseColor.extend({\r\n init: function(r, g, b, a) {\r\n BaseColor.fn.init.call(this);\r\n\r\n this.r = r;\r\n this.g = g;\r\n this.b = b;\r\n this.a = a;\r\n },\r\n\r\n toHSV: function() {\r\n var ref = this;\r\n var r = ref.r;\r\n var g = ref.g;\r\n var b = ref.b;\r\n var min = Math.min(r, g, b);\r\n var max = Math.max(r, g, b);\r\n var delta = max - min;\r\n var v = max;\r\n var h, s;\r\n\r\n if (delta === 0) {\r\n return new HSV(0, 0, v, this.a);\r\n }\r\n\r\n if (max !== 0) {\r\n s = delta / max;\r\n if (r === max) {\r\n h = (g - b) / delta;\r\n } else if (g === max) {\r\n h = 2 + (b - r) / delta;\r\n } else {\r\n h = 4 + (r - g) / delta;\r\n }\r\n\r\n h *= 60;\r\n if (h < 0) {\r\n h += 360;\r\n }\r\n } else {\r\n s = 0;\r\n h = -1;\r\n }\r\n\r\n return new HSV(h, s, v, this.a);\r\n },\r\n\r\n toHSL: function() {\r\n var ref = this;\r\n var r = ref.r;\r\n var g = ref.g;\r\n var b = ref.b;\r\n var max = Math.max(r, g, b);\r\n var min = Math.min(r, g, b);\r\n var h, s, l = (max + min) / 2;\r\n\r\n if (max === min) {\r\n h = s = 0;\r\n } else {\r\n var d = max - min;\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n switch (max) {\r\n case r: h = (g - b) / d + (g < b ? 6 : 0); break;\r\n case g: h = (b - r) / d + 2; break;\r\n case b: h = (r - g) / d + 4; break;\r\n default: break;\r\n }\r\n }\r\n\r\n return new HSL(h * 60, s * 100, l * 100, this.a);\r\n },\r\n\r\n toBytes: function() {\r\n return new Bytes(this.r * 255, this.g * 255, this.b * 255, this.a);\r\n }\r\n });\r\n\r\n var Bytes = RGB.extend({\r\n init: function(r, g, b, a) {\r\n RGB.fn.init.call(this, Math.round(r), Math.round(g), Math.round(b), a);\r\n },\r\n\r\n toRGB: function() {\r\n return new RGB(this.r / 255, this.g / 255, this.b / 255, this.a);\r\n },\r\n\r\n toHSV: function() {\r\n return this.toRGB().toHSV();\r\n },\r\n\r\n toHSL: function() {\r\n return this.toRGB().toHSL();\r\n },\r\n\r\n toHex: function(options) {\r\n var value = hex(this.r, 2) + hex(this.g, 2) + hex(this.b, 2);\r\n\r\n if (options && options.alpha) {\r\n value += hex(Math.round(this.a * 255), 2);\r\n }\r\n\r\n return value;\r\n },\r\n\r\n toBytes: function() {\r\n return this;\r\n }\r\n });\r\n\r\n function hex(n, width, pad) {\r\n if (pad === void 0) { pad = \"0\"; }\r\n\r\n var result = n.toString(16);\r\n while (width > result.length) {\r\n result = pad + result;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n var HSV = BaseColor.extend({\r\n init: function(h, s, v, a) {\r\n BaseColor.fn.init.call(this);\r\n\r\n this.h = h;\r\n this.s = s;\r\n this.v = v;\r\n this.a = a;\r\n },\r\n\r\n toRGB: function() {\r\n var ref = this;\r\n var h = ref.h;\r\n var s = ref.s;\r\n var v = ref.v;\r\n var r, g, b;\r\n\r\n if (s === 0) {\r\n r = g = b = v;\r\n } else {\r\n h /= 60;\r\n\r\n var i = Math.floor(h);\r\n var f = h - i;\r\n var p = v * (1 - s);\r\n var q = v * (1 - s * f);\r\n var t = v * (1 - s * (1 - f));\r\n\r\n switch (i) {\r\n case 0: r = v; g = t; b = p; break;\r\n case 1: r = q; g = v; b = p; break;\r\n case 2: r = p; g = v; b = t; break;\r\n case 3: r = p; g = q; b = v; break;\r\n case 4: r = t; g = p; b = v; break;\r\n default: r = v; g = p; b = q; break;\r\n }\r\n }\r\n\r\n return new RGB(r, g, b, this.a);\r\n },\r\n\r\n toHSL: function() {\r\n return this.toRGB().toHSL();\r\n },\r\n\r\n toBytes: function() {\r\n return this.toRGB().toBytes();\r\n }\r\n });\r\n\r\n var HSL = BaseColor.extend({\r\n init: function(h, s, l, a) {\r\n BaseColor.fn.init.call(this);\r\n\r\n this.h = h;\r\n this.s = s;\r\n this.l = l;\r\n this.a = a;\r\n },\r\n\r\n toRGB: function() {\r\n var h = this.h / 360;\r\n var s = this.s / 100;\r\n var l = this.l / 100;\r\n var r, g, b;\r\n\r\n if (s === 0) {\r\n r = g = b = l; // achromatic\r\n } else {\r\n var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\r\n var p = 2 * l - q;\r\n r = hue2rgb(p, q, h + 1 / 3);\r\n g = hue2rgb(p, q, h);\r\n b = hue2rgb(p, q, h - 1 / 3);\r\n }\r\n\r\n return new RGB(r, g, b, this.a);\r\n },\r\n\r\n toHSV: function() {\r\n return this.toRGB().toHSV();\r\n },\r\n\r\n toBytes: function() {\r\n return this.toRGB().toBytes();\r\n }\r\n });\r\n\r\n function hue2rgb(p, q, s) {\r\n var t = s;\r\n\r\n if (t < 0) {\r\n t += 1;\r\n }\r\n\r\n if (t > 1) {\r\n t -= 1;\r\n }\r\n\r\n if (t < 1 / 6) {\r\n return p + (q - p) * 6 * t;\r\n }\r\n\r\n if (t < 1 / 2) {\r\n return q;\r\n }\r\n\r\n if (t < 2 / 3) {\r\n return p + (q - p) * (2 / 3 - t) * 6;\r\n }\r\n\r\n return p;\r\n }\r\n\r\n function alphaFromHex(a) {\r\n return parseFloat(parseFloat(parseInt(a, 16) / 255 ).toFixed(3));\r\n }\r\n\r\n function parseColor(value, safe) {\r\n var m, ret;\r\n\r\n if (value == null || value === \"none\" || value == \"\") {\r\n return null;\r\n }\r\n\r\n if (value instanceof BaseColor) {\r\n return value;\r\n }\r\n\r\n var color = value.toLowerCase();\r\n if ((m = matchNamedColor(color))) {\r\n if (m[1] === \"transparent\") {\r\n color = new RGB(1, 1, 1, 0);\r\n } else {\r\n color = parseColor(namedColors[m[1]], safe);\r\n }\r\n color.match = [ m[1] ];\r\n return color;\r\n }\r\n if ((m = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})\\b/i.exec(color))) {\r\n ret = new Bytes(parseInt(m[1], 16),\r\n parseInt(m[2], 16),\r\n parseInt(m[3], 16), 1);\r\n } else if ((m = /^#?([0-9a-f])([0-9a-f])([0-9a-f])\\b/i.exec(color))) {\r\n ret = new Bytes(parseInt(m[1] + m[1], 16),\r\n parseInt(m[2] + m[2], 16),\r\n parseInt(m[3] + m[3], 16), 1);\r\n } else if ((m = /^#?([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])\\b/i.exec(color))) { // Parse 4 digit hex color\r\n ret = new Bytes(parseInt(m[1] + m[1], 16),\r\n parseInt(m[2] + m[2], 16),\r\n parseInt(m[3] + m[3], 16),\r\n alphaFromHex(m[4] + m[4]));\r\n } else if ((m = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})\\b/i.exec(color))) { // Parse 8 digit hex color\r\n ret = new Bytes(parseInt(m[1], 16),\r\n parseInt(m[2], 16),\r\n parseInt(m[3], 16),\r\n alphaFromHex(m[4]));\r\n } else if ((m = /^rgb\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*\\)/.exec(color))) {\r\n ret = new Bytes(parseInt(m[1], 10),\r\n parseInt(m[2], 10),\r\n parseInt(m[3], 10), 1);\r\n } else if ((m = /^rgba\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9.]+)\\s*\\)/.exec(color))) {\r\n ret = new Bytes(parseInt(m[1], 10),\r\n parseInt(m[2], 10),\r\n parseInt(m[3], 10), parseFloat(m[4]));\r\n } else if ((m = /^rgb\\(\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*\\)/.exec(color))) {\r\n ret = new RGB(parseFloat(m[1]) / 100,\r\n parseFloat(m[2]) / 100,\r\n parseFloat(m[3]) / 100, 1);\r\n } else if ((m = /^rgba\\(\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9.]+)\\s*\\)/.exec(color))) {\r\n ret = new RGB(parseFloat(m[1]) / 100,\r\n parseFloat(m[2]) / 100,\r\n parseFloat(m[3]) / 100, parseFloat(m[4]));\r\n } else if ((m = /^color\\(\\s*srgb\\s*([0-9]*\\.?[0-9]+)\\s+([0-9]*\\.?[0-9]+)\\s+([0-9]*\\.?[0-9]+)\\s*(\\/\\s+([0-9]*\\.?[0-9]+))?\\)/.exec(color))) {\r\n ret = new RGB(\r\n parseFloat(m[1]),\r\n parseFloat(m[2]),\r\n parseFloat(m[3]),\r\n parseFloat(m[5] || '1'));\r\n }\r\n\r\n if (ret) {\r\n ret.match = m;\r\n } else if (!safe) {\r\n throw new Error(\"Cannot parse color: \" + color);\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n var DARK_TRESHOLD = 180;\r\n\r\n var Color = Class$3.extend({\r\n init: function(value) {\r\n var this$1$1 = this;\r\n\r\n if (arguments.length === 1) {\r\n var formats = Color.formats;\r\n var resolvedColor = this.resolveColor(value);\r\n\r\n for (var idx = 0; idx < formats.length; idx++) {\r\n var formatRegex = formats[idx].re;\r\n var processor = formats[idx].process;\r\n var parts = formatRegex.exec(resolvedColor);\r\n\r\n if (parts) {\r\n var channels = processor(parts);\r\n this$1$1.r = channels[0];\r\n this$1$1.g = channels[1];\r\n this$1$1.b = channels[2];\r\n }\r\n }\r\n } else {\r\n this.r = arguments[0];\r\n this.g = arguments[1];\r\n this.b = arguments[2];\r\n }\r\n\r\n this.r = this.normalizeByte(this.r);\r\n this.g = this.normalizeByte(this.g);\r\n this.b = this.normalizeByte(this.b);\r\n },\r\n\r\n toHex: function() {\r\n var pad = this.padDigit;\r\n var r = this.r.toString(16);\r\n var g = this.g.toString(16);\r\n var b = this.b.toString(16);\r\n\r\n return \"#\" + pad(r) + pad(g) + pad(b);\r\n },\r\n\r\n resolveColor: function(value) {\r\n var color = value || \"black\";\r\n\r\n if (color.charAt(0) === \"#\") {\r\n color = color.substr(1, 6);\r\n }\r\n\r\n color = color.replace(/ /g, \"\");\r\n color = color.toLowerCase();\r\n color = Color.namedColors[color] || color;\r\n\r\n return color;\r\n },\r\n\r\n normalizeByte: function(value) {\r\n if (value < 0 || isNaN(value)) {\r\n return 0;\r\n }\r\n\r\n return value > 255 ? 255 : value;\r\n },\r\n\r\n padDigit: function(value) {\r\n return (value.length === 1) ? \"0\" + value : value;\r\n },\r\n\r\n brightness: function(value) {\r\n var round = Math.round;\r\n\r\n this.r = round(this.normalizeByte(this.r * value));\r\n this.g = round(this.normalizeByte(this.g * value));\r\n this.b = round(this.normalizeByte(this.b * value));\r\n\r\n return this;\r\n },\r\n\r\n percBrightness: function() {\r\n return Math.sqrt(0.241 * this.r * this.r + 0.691 * this.g * this.g + 0.068 * this.b * this.b);\r\n },\r\n\r\n isDark: function() {\r\n return this.percBrightness() < DARK_TRESHOLD;\r\n }\r\n });\r\n\r\n Color.fromBytes = function(r, g, b, a) {\r\n return new Bytes(r, g, b, a != null ? a : 1);\r\n };\r\n\r\n Color.fromRGB = function(r, g, b, a) {\r\n return new RGB(r, g, b, a != null ? a : 1);\r\n };\r\n\r\n Color.fromHSV = function(h, s, v, a) {\r\n return new HSV(h, s, v, a != null ? a : 1);\r\n };\r\n\r\n Color.fromHSL = function(h, s, l, a) {\r\n return new HSL(h, s, l, a != null ? a : 1);\r\n };\r\n\r\n Color.formats = [ {\r\n re: /^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/,\r\n process: function(parts) {\r\n return [\r\n parseInt(parts[1], 10), parseInt(parts[2], 10), parseInt(parts[3], 10)\r\n ];\r\n }\r\n }, {\r\n re: /^(\\w{2})(\\w{2})(\\w{2})$/,\r\n process: function(parts) {\r\n return [\r\n parseInt(parts[1], 16), parseInt(parts[2], 16), parseInt(parts[3], 16)\r\n ];\r\n }\r\n }, {\r\n re: /^(\\w{1})(\\w{1})(\\w{1})$/,\r\n process: function(parts) {\r\n return [\r\n parseInt(parts[1] + parts[1], 16),\r\n parseInt(parts[2] + parts[2], 16),\r\n parseInt(parts[3] + parts[3], 16)\r\n ];\r\n }\r\n } ];\r\n\r\n Color.namedColors = namedColors;\r\n\r\n kendo.deepExtend(kendo, {\r\n parseColor: parseColor,\r\n namedColors: namedColors,\r\n Color: Color\r\n });\r\n\r\n /***********************************************************************\r\n * WARNING: this file is auto-generated. If you change it directly,\r\n * your modifications will eventually be lost. The source code is in\r\n * `kendo-drawing` repository, you should make your changes there and\r\n * run `src-modules/sync.sh` in this repository.\r\n */\r\n\r\n (function($) {\r\n /* eslint-disable space-before-blocks, space-before-function-paren */\r\n\r\n window.kendo.util = window.kendo.util || {};\r\n\r\n var LRUCache = kendo.Class.extend({\r\n init: function(size) {\r\n\r\n this._size = size;\r\n this._length = 0;\r\n this._map = {};\r\n },\r\n\r\n put: function(key, value) {\r\n var map = this._map;\r\n var entry = { key: key, value: value };\r\n\r\n map[key] = entry;\r\n\r\n if (!this._head) {\r\n this._head = this._tail = entry;\r\n } else {\r\n this._tail.newer = entry;\r\n entry.older = this._tail;\r\n this._tail = entry;\r\n }\r\n\r\n if (this._length >= this._size) {\r\n map[this._head.key] = null;\r\n this._head = this._head.newer;\r\n this._head.older = null;\r\n } else {\r\n this._length++;\r\n }\r\n },\r\n\r\n get: function(key) {\r\n var entry = this._map[key];\r\n\r\n if (entry) {\r\n if (entry === this._head && entry !== this._tail) {\r\n this._head = entry.newer;\r\n this._head.older = null;\r\n }\r\n\r\n if (entry !== this._tail) {\r\n if (entry.older) {\r\n entry.older.newer = entry.newer;\r\n entry.newer.older = entry.older;\r\n }\r\n\r\n entry.older = this._tail;\r\n entry.newer = null;\r\n\r\n this._tail.newer = entry;\r\n this._tail = entry;\r\n }\r\n\r\n return entry.value;\r\n }\r\n }\r\n });\r\n\r\n var REPLACE_REGEX = /\\r?\\n|\\r|\\t/g;\r\n var SPACE = ' ';\r\n\r\n function normalizeText(text) {\r\n return String(text).replace(REPLACE_REGEX, SPACE);\r\n }\r\n\r\n function objectKey(object) {\r\n var parts = [];\r\n for (var key in object) {\r\n parts.push(key + object[key]);\r\n }\r\n\r\n return parts.sort().join(\"\");\r\n }\r\n\r\n // Computes FNV-1 hash\r\n // See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function\r\n function hashKey(str) {\r\n // 32-bit FNV-1 offset basis\r\n // See http://isthe.com/chongo/tech/comp/fnv/#FNV-param\r\n var hash = 0x811C9DC5;\r\n\r\n for (var i = 0; i < str.length; ++i) {\r\n hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);\r\n hash ^= str.charCodeAt(i);\r\n }\r\n\r\n return hash >>> 0;\r\n }\r\n\r\n function zeroSize() {\r\n return { width: 0, height: 0, baseline: 0 };\r\n }\r\n\r\n var DEFAULT_OPTIONS = {\r\n baselineMarkerSize: 1\r\n };\r\n\r\n var defaultMeasureBox;\r\n\r\n if (typeof document !== \"undefined\") {\r\n defaultMeasureBox = document.createElement(\"div\");\r\n defaultMeasureBox.style.cssText = \"position: absolute !important; top: -4000px !important; width: auto !important; height: auto !important;\" +\r\n \"padding: 0 !important; margin: 0 !important; border: 0 !important;\" +\r\n \"line-height: normal !important; visibility: hidden !important; white-space: pre!important;\";\r\n }\r\n\r\n var TextMetrics = kendo.Class.extend({\r\n init: function(options) {\r\n\r\n this._cache = new LRUCache(1000);\r\n this.options = $.extend({}, DEFAULT_OPTIONS, options);\r\n },\r\n\r\n measure: function(text, style, options) {\r\n if (options === void 0) { options = {}; }\r\n\r\n if (typeof text === 'undefined' || text === null) {\r\n return zeroSize();\r\n }\r\n\r\n var styleKey = objectKey(style);\r\n var cacheKey = hashKey(text + styleKey);\r\n var cachedResult = this._cache.get(cacheKey);\r\n\r\n if (cachedResult) {\r\n return cachedResult;\r\n }\r\n\r\n var size = zeroSize();\r\n var measureBox = options.box || defaultMeasureBox;\r\n var baselineMarker = this._baselineMarker().cloneNode(false);\r\n\r\n for (var key in style) {\r\n var value = style[key];\r\n if (typeof value !== \"undefined\") {\r\n measureBox.style[key] = value;\r\n }\r\n }\r\n\r\n var textStr = options.normalizeText !== false ? normalizeText(text) : String(text);\r\n\r\n measureBox.textContent = textStr;\r\n measureBox.appendChild(baselineMarker);\r\n document.body.appendChild(measureBox);\r\n\r\n if (textStr.length) {\r\n size.width = measureBox.offsetWidth - this.options.baselineMarkerSize;\r\n size.height = measureBox.offsetHeight;\r\n size.baseline = baselineMarker.offsetTop + this.options.baselineMarkerSize;\r\n }\r\n\r\n if (size.width > 0 && size.height > 0) {\r\n this._cache.put(cacheKey, size);\r\n }\r\n\r\n measureBox.parentNode.removeChild(measureBox);\r\n\r\n return size;\r\n },\r\n\r\n _baselineMarker: function() {\r\n var marker = document.createElement(\"div\");\r\n marker.style.cssText = \"display: inline-block; vertical-align: baseline;width: \" +\r\n this.options.baselineMarkerSize + \"px; height: \" + this.options.baselineMarkerSize + \"px;overflow: hidden;\";\r\n\r\n return marker;\r\n }\r\n });\r\n\r\n TextMetrics.current = new TextMetrics();\r\n\r\n function measureText(text, style, measureBox) {\r\n return TextMetrics.current.measure(text, style, measureBox);\r\n }\r\n\r\n kendo.deepExtend(kendo.util, {\r\n LRUCache: LRUCache,\r\n TextMetrics: TextMetrics,\r\n measureText: measureText,\r\n objectKey: objectKey,\r\n hashKey: hashKey,\r\n normalizeText: normalizeText\r\n });\r\n\r\n })(window.kendo.jQuery);\r\n\r\n /***********************************************************************\r\n * WARNING: this file is auto-generated. If you change it directly,\r\n * your modifications will eventually be lost. The source code is in\r\n * `kendo-drawing` repository, you should make your changes there and\r\n * run `src-modules/sync.sh` in this repository.\r\n */\r\n\r\n (function($) {\r\n /* eslint-disable space-before-blocks, space-before-function-paren */\r\n\r\n window.kendo = window.kendo || {};\r\n var kendoDrawing = kendo.drawing;\r\n var kendoDrawingUtil = kendoDrawing.util;\r\n var extendStatic = kendoDrawingUtil.extendStatic;\r\n var Class = kendo.Class;\r\n var kendoUtil = kendo.util;\r\n var support = kendo.support;\r\n var supportBrowser = support.browser;\r\n var htmlEncode = kendo.htmlEncode;\r\n\r\n var createPromise = kendoDrawingUtil.createPromise;\r\n var promiseAll = kendoDrawingUtil.promiseAll;\r\n\r\n var HasObservers = (function (Class$$1) {\r\n function HasObservers () {\r\n Class$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(HasObservers, Class$$1);\r\n HasObservers.prototype = Object.create( Class$$1 && Class$$1.prototype );\r\n HasObservers.prototype.constructor = HasObservers;\r\n HasObservers.fn = HasObservers.prototype;\r\n HasObservers.fn.init = HasObservers.fn.constructor;\r\n\r\n HasObservers.prototype.observers = function observers () {\r\n this._observers = this._observers || [];\r\n return this._observers;\r\n };\r\n\r\n HasObservers.prototype.addObserver = function addObserver (element) {\r\n if (!this._observers) {\r\n this._observers = [ element ];\r\n } else {\r\n this._observers.push(element);\r\n }\r\n return this;\r\n };\r\n\r\n HasObservers.prototype.removeObserver = function removeObserver (element) {\r\n var observers = this.observers();\r\n var index = observers.indexOf(element);\r\n if (index !== -1) {\r\n observers.splice(index, 1);\r\n }\r\n return this;\r\n };\r\n\r\n HasObservers.prototype.trigger = function trigger (methodName, event) {\r\n var observers = this._observers;\r\n\r\n if (observers && !this._suspended) {\r\n for (var idx = 0; idx < observers.length; idx++) {\r\n var observer = observers[idx];\r\n if (observer[methodName]) {\r\n observer[methodName](event);\r\n }\r\n }\r\n }\r\n return this;\r\n };\r\n\r\n HasObservers.prototype.optionsChange = function optionsChange (e) {\r\n if (e === void 0) { e = {}; }\r\n\r\n e.element = this;\r\n this.trigger(\"optionsChange\", e);\r\n };\r\n\r\n HasObservers.prototype.geometryChange = function geometryChange () {\r\n this.trigger(\"geometryChange\", {\r\n element: this\r\n });\r\n };\r\n\r\n HasObservers.prototype.suspend = function suspend () {\r\n this._suspended = (this._suspended || 0) + 1;\r\n return this;\r\n };\r\n\r\n HasObservers.prototype.resume = function resume () {\r\n this._suspended = Math.max((this._suspended || 0) - 1, 0);\r\n return this;\r\n };\r\n\r\n HasObservers.prototype._observerField = function _observerField (field, value) {\r\n if (this[field]) {\r\n this[field].removeObserver(this);\r\n }\r\n this[field] = value;\r\n value.addObserver(this);\r\n };\r\n\r\n return HasObservers;\r\n }(Class));\r\n\r\n function append$1$1(first, second) {\r\n first.push.apply(first, second);\r\n return first;\r\n }\r\n\r\n /* eslint-disable key-spacing,no-multi-spaces,no-param-reassign */\r\n\r\n var literals = {\r\n 1 : \"i\", 10 : \"x\", 100 : \"c\",\r\n 2 : \"ii\", 20 : \"xx\", 200 : \"cc\",\r\n 3 : \"iii\", 30 : \"xxx\", 300 : \"ccc\",\r\n 4 : \"iv\", 40 : \"xl\", 400 : \"cd\",\r\n 5 : \"v\", 50 : \"l\", 500 : \"d\",\r\n 6 : \"vi\", 60 : \"lx\", 600 : \"dc\",\r\n 7 : \"vii\", 70 : \"lxx\", 700 : \"dcc\",\r\n 8 : \"viii\", 80 : \"lxxx\", 800 : \"dccc\",\r\n 9 : \"ix\", 90 : \"xc\", 900 : \"cm\",\r\n 1000 : \"m\"\r\n };\r\n\r\n function arabicToRoman(n) {\r\n var values = [ 1000,\r\n 900 , 800, 700, 600, 500, 400, 300, 200, 100,\r\n 90 , 80 , 70 , 60 , 50 , 40 , 30 , 20 , 10 ,\r\n 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 ];\r\n\r\n var roman = \"\";\r\n while (n > 0) {\r\n if (n < values[0]) {\r\n values.shift();\r\n } else {\r\n roman += literals[values[0]];\r\n n -= values[0];\r\n }\r\n }\r\n return roman;\r\n }\r\n\r\n var UNDEFINED = \"undefined\";\r\n\r\n function defined(value) {\r\n return typeof value !== UNDEFINED;\r\n }\r\n\r\n var defId = 1;\r\n\r\n function definitionId() {\r\n return \"kdef\" + defId++;\r\n }\r\n\r\n var DEG_TO_RAD = Math.PI / 180;\r\n var MAX_NUM = Number.MAX_VALUE;\r\n var MIN_NUM = -Number.MAX_VALUE;\r\n\r\n function deg(radians) {\r\n return radians / DEG_TO_RAD;\r\n }\r\n\r\n var fromCharCode = String.fromCharCode;\r\n\r\n // Encodes a string as UTF-8\r\n function encodeUTF8(input) {\r\n var output = \"\";\r\n\r\n for (var i = 0; i < input.length; i++) {\r\n var code = input.charCodeAt(i);\r\n\r\n if (0xD800 <= code && code <= 0xDBFF) {\r\n var hi = code;\r\n var low = input.charCodeAt(++i);\r\n\r\n if (!isNaN(low)) {\r\n // Combine high and low surrogate\r\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt\r\n code = (hi - 0xD800) * 0x400 +\r\n (low - 0xDC00) + 0x10000;\r\n }\r\n }\r\n\r\n if (code < 0x80) {\r\n // One byte\r\n output += fromCharCode(code);\r\n } else if (code < 0x800) {\r\n // Two bytes\r\n output += fromCharCode(0xC0 | (code >>> 6));\r\n output += fromCharCode(0x80 | (code & 0x3f));\r\n } else if (code < 0x10000) {\r\n // Three bytes\r\n output += fromCharCode(0xE0 | (code >>> 12));\r\n output += fromCharCode(0x80 | (code >>> 6 & 0x3f));\r\n output += fromCharCode(0x80 | (code & 0x3f));\r\n } else if (code < 0x10FFFF) {\r\n // Four bytes\r\n output += fromCharCode(0xF0 | (code >>> 18));\r\n output += fromCharCode(0x80 | (code >>> 12 & 0x3f));\r\n output += fromCharCode(0x80 | (code >>> 6 & 0x3f));\r\n output += fromCharCode(0x80 | (code & 0x3f));\r\n }\r\n }\r\n\r\n return output;\r\n }\r\n\r\n // Encodes a string as UTF-16 big-endian\r\n\r\n var KEY_STR = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\r\n\r\n function encodeBase64(input) {\r\n var output = \"\";\r\n var i = 0;\r\n\r\n var utfInput = encodeUTF8(input);\r\n\r\n while (i < utfInput.length) {\r\n var chr1 = utfInput.charCodeAt(i++);\r\n var chr2 = utfInput.charCodeAt(i++);\r\n var chr3 = utfInput.charCodeAt(i++);\r\n\r\n var enc1 = chr1 >> 2;\r\n var enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\r\n var enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\r\n var enc4 = chr3 & 63;\r\n\r\n if (isNaN(chr2)) {\r\n enc3 = enc4 = 64;\r\n } else if (isNaN(chr3)) {\r\n enc4 = 64;\r\n }\r\n\r\n output = output +\r\n KEY_STR.charAt(enc1) + KEY_STR.charAt(enc2) +\r\n KEY_STR.charAt(enc3) + KEY_STR.charAt(enc4);\r\n }\r\n\r\n return output;\r\n }\r\n\r\n function eventCoordinates(e) {\r\n if (defined((e.x || {}).location)) {\r\n return {\r\n x: e.x.location,\r\n y: e.y.location\r\n };\r\n }\r\n\r\n return {\r\n x: e.pageX || e.clientX || 0,\r\n y: e.pageY || e.clientY || 0\r\n };\r\n }\r\n\r\n function eventElement(e) {\r\n if (e === void 0) { e = {}; }\r\n\r\n return e.touch ? e.touch.initialTouch : e.target;\r\n }\r\n\r\n function isTransparent(color) {\r\n return color === \"\" || color === null || color === \"none\" || color === \"transparent\" || !defined(color);\r\n }\r\n\r\n function last(array) {\r\n if (array) {\r\n return array[array.length - 1];\r\n }\r\n }\r\n\r\n function limitValue(value, min, max) {\r\n return Math.max(Math.min(value, max), min);\r\n }\r\n\r\n /* eslint-disable no-multi-spaces, key-spacing, indent, camelcase, space-before-blocks, eqeqeq, brace-style */\r\n /* eslint-disable space-infix-ops, space-before-function-paren, array-bracket-spacing, object-curly-spacing */\r\n /* eslint-disable no-nested-ternary, max-params, default-case, no-else-return, no-empty */\r\n /* eslint-disable no-param-reassign, no-var, block-scoped-var */\r\n\r\n // mergeSort is stable.\r\n function mergeSort(a, cmp) {\r\n if (a.length < 2) {\r\n return a.slice();\r\n }\r\n function merge(a, b) {\r\n var r = [], ai = 0, bi = 0, i = 0;\r\n while (ai < a.length && bi < b.length) {\r\n if (cmp(a[ai], b[bi]) <= 0) {\r\n r[i++] = a[ai++];\r\n } else {\r\n r[i++] = b[bi++];\r\n }\r\n }\r\n if (ai < a.length) {\r\n r.push.apply(r, a.slice(ai));\r\n }\r\n if (bi < b.length) {\r\n r.push.apply(r, b.slice(bi));\r\n }\r\n return r;\r\n }\r\n return (function sort(a) {\r\n if (a.length <= 1) {\r\n return a;\r\n }\r\n var m = Math.floor(a.length / 2);\r\n var left = a.slice(0, m);\r\n var right = a.slice(m);\r\n left = sort(left);\r\n right = sort(right);\r\n return merge(left, right);\r\n })(a);\r\n }\r\n\r\n var now = Date.now || function() {\r\n return new Date().getTime();\r\n };\r\n\r\n function rad(degrees) {\r\n return degrees * DEG_TO_RAD;\r\n }\r\n\r\n function pow(p) {\r\n if (p) {\r\n return Math.pow(10, p);\r\n }\r\n\r\n return 1;\r\n }\r\n\r\n function round(value, precision) {\r\n var power = pow(precision);\r\n return Math.round(value * power) / power;\r\n }\r\n\r\n function valueOrDefault(value, defaultValue) {\r\n return defined(value) ? value : defaultValue;\r\n }\r\n\r\n function bindEvents(element, events) {\r\n for (var eventName in events) {\r\n var eventNames = eventName.trim().split(\" \");\r\n for (var idx = 0; idx < eventNames.length; idx++) {\r\n element.addEventListener(eventNames[idx], events[eventName], false);\r\n }\r\n }\r\n }\r\n\r\n function elementOffset(element) {\r\n var box = element.getBoundingClientRect();\r\n\r\n var documentElement = document.documentElement;\r\n\r\n return {\r\n top: box.top + (window.pageYOffset || documentElement.scrollTop) - (documentElement.clientTop || 0),\r\n left: box.left + (window.pageXOffset || documentElement.scrollLeft) - (documentElement.clientLeft || 0)\r\n };\r\n }\r\n\r\n function elementStyles(element, styles) {\r\n var result = {};\r\n var style = window.getComputedStyle(element) || {};\r\n var stylesArray = Array.isArray(styles) ? styles : [ styles ];\r\n\r\n for (var idx = 0; idx < stylesArray.length; idx++) {\r\n var field = stylesArray[idx];\r\n result[field] = style[field];\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function getPixels(value) {\r\n if (isNaN(value)) {\r\n return value;\r\n }\r\n return value + \"px\";\r\n }\r\n\r\n function elementSize(element, size) {\r\n if (size) {\r\n var width = size.width;\r\n var height = size.height;\r\n\r\n if (defined(width)) {\r\n element.style.width = getPixels(width);\r\n }\r\n\r\n if (defined(height)) {\r\n element.style.height = getPixels(height);\r\n }\r\n\r\n } else {\r\n var size$1 = elementStyles(element, [ 'width', 'height' ]);\r\n\r\n return {\r\n width: parseInt(size$1.width, 10),\r\n height: parseInt(size$1.height, 10)\r\n };\r\n }\r\n }\r\n\r\n function unbindEvents(element, events) {\r\n if (events === void 0) { events = {}; }\r\n\r\n for (var name in events) {\r\n var eventNames = name.trim().split(\" \");\r\n for (var idx = 0; idx < eventNames.length; idx++) {\r\n element.removeEventListener(eventNames[idx], events[name], false);\r\n }\r\n }\r\n }\r\n\r\n function elementPadding(element) {\r\n var ref = elementStyles(element, [ \"paddingLeft\", \"paddingTop\" ]);\r\n var paddingLeft = ref.paddingLeft;\r\n var paddingTop = ref.paddingTop;\r\n return {\r\n top: parseFloat(paddingTop),\r\n left: parseFloat(paddingLeft)\r\n };\r\n }\r\n\r\n var Matrix = (function (Class$$1) {\r\n function Matrix(a, b, c, d, e, f) {\r\n if (a === void 0) { a = 0; }\r\n if (b === void 0) { b = 0; }\r\n if (c === void 0) { c = 0; }\r\n if (d === void 0) { d = 0; }\r\n if (e === void 0) { e = 0; }\r\n if (f === void 0) { f = 0; }\r\n\r\n Class$$1.call(this);\r\n\r\n this.a = a;\r\n this.b = b;\r\n this.c = c;\r\n this.d = d;\r\n this.e = e;\r\n this.f = f;\r\n }\r\n\r\n extendStatic(Matrix, Class$$1);\r\n Matrix.prototype = Object.create( Class$$1 && Class$$1.prototype );\r\n Matrix.prototype.constructor = Matrix;\r\n Matrix.fn = Matrix.prototype;\r\n Matrix.fn.init = Matrix.fn.constructor;\r\n\r\n Matrix.prototype.multiplyCopy = function multiplyCopy (matrix) {\r\n return new Matrix(\r\n this.a * matrix.a + this.c * matrix.b,\r\n this.b * matrix.a + this.d * matrix.b,\r\n this.a * matrix.c + this.c * matrix.d,\r\n this.b * matrix.c + this.d * matrix.d,\r\n this.a * matrix.e + this.c * matrix.f + this.e,\r\n this.b * matrix.e + this.d * matrix.f + this.f\r\n );\r\n };\r\n\r\n Matrix.prototype.invert = function invert () {\r\n var ref = this;\r\n var a = ref.a;\r\n var b = ref.b;\r\n var d = ref.c;\r\n var e = ref.d;\r\n var g = ref.e;\r\n var h = ref.f;\r\n var det = a * e - b * d;\r\n\r\n if (det === 0) {\r\n return null;\r\n }\r\n\r\n return new Matrix(e / det, -b / det, -d / det, a / det,\r\n (d * h - e * g) / det, (b * g - a * h) / det);\r\n };\r\n\r\n Matrix.prototype.clone = function clone () {\r\n return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\r\n };\r\n\r\n Matrix.prototype.equals = function equals (other) {\r\n if (!other) {\r\n return false;\r\n }\r\n\r\n return this.a === other.a && this.b === other.b &&\r\n this.c === other.c && this.d === other.d &&\r\n this.e === other.e && this.f === other.f;\r\n };\r\n\r\n Matrix.prototype.round = function round$1 (precision) {\r\n this.a = round(this.a, precision);\r\n this.b = round(this.b, precision);\r\n this.c = round(this.c, precision);\r\n this.d = round(this.d, precision);\r\n this.e = round(this.e, precision);\r\n this.f = round(this.f, precision);\r\n\r\n return this;\r\n };\r\n\r\n Matrix.prototype.toArray = function toArray (precision) {\r\n var result = [ this.a, this.b, this.c, this.d, this.e, this.f ];\r\n\r\n if (defined(precision)) {\r\n for (var i = 0; i < result.length; i++) {\r\n result[i] = round(result[i], precision);\r\n }\r\n }\r\n\r\n return result;\r\n };\r\n\r\n Matrix.prototype.toString = function toString (precision, separator) {\r\n if (separator === void 0) { separator = \",\"; }\r\n\r\n return this.toArray(precision).join(separator);\r\n };\r\n\r\n Matrix.translate = function translate (x, y) {\r\n return new Matrix(1, 0, 0, 1, x, y);\r\n };\r\n\r\n Matrix.unit = function unit () {\r\n return new Matrix(1, 0, 0, 1, 0, 0);\r\n };\r\n\r\n Matrix.rotate = function rotate (angle, x, y) {\r\n var matrix = new Matrix();\r\n matrix.a = Math.cos(rad(angle));\r\n matrix.b = Math.sin(rad(angle));\r\n matrix.c = -matrix.b;\r\n matrix.d = matrix.a;\r\n matrix.e = (x - x * matrix.a + y * matrix.b) || 0;\r\n matrix.f = (y - y * matrix.a - x * matrix.b) || 0;\r\n\r\n return matrix;\r\n };\r\n\r\n Matrix.scale = function scale (scaleX, scaleY) {\r\n return new Matrix(scaleX, 0, 0, scaleY, 0, 0);\r\n };\r\n\r\n return Matrix;\r\n }(Class));\r\n\r\n Matrix.IDENTITY = Matrix.unit();\r\n\r\n var matrixRegexp = /matrix\\((.*)\\)/;\r\n\r\n function parseMatrix(matrixString) {\r\n var match = matrixString.match(matrixRegexp);\r\n if (match === null || match.length !== 2) {\r\n return Matrix.unit();\r\n }\r\n\r\n var members = match[1].split(',').map(function (x) { return parseFloat(x); });\r\n return new (Function.prototype.bind.apply( Matrix, [ null ].concat( members) ));\r\n }\r\n\r\n function transformMatrix(element) {\r\n var transform = getComputedStyle(element).transform;\r\n\r\n if (transform === 'none') {\r\n return Matrix.unit();\r\n }\r\n\r\n return parseMatrix(transform);\r\n }\r\n\r\n function elementScale(element) {\r\n if (!element) {\r\n return Matrix.unit();\r\n }\r\n\r\n var matrix = transformMatrix(element);\r\n var parent = element.parentElement;\r\n while (parent) {\r\n var parentMatrix = transformMatrix(parent);\r\n matrix = matrix.multiplyCopy(parentMatrix);\r\n parent = parent.parentElement;\r\n }\r\n\r\n matrix.b = matrix.c = matrix.e = matrix.f = 0;\r\n return matrix;\r\n }\r\n\r\n var util = {\r\n \tappend: append$1$1,\r\n \tarabicToRoman: arabicToRoman,\r\n \tcreatePromise: createPromise,\r\n \tdefined: defined,\r\n \tdefinitionId: definitionId,\r\n \tdeg: deg,\r\n \tencodeBase64: encodeBase64,\r\n \teventCoordinates: eventCoordinates,\r\n \teventElement: eventElement,\r\n \tisTransparent: isTransparent,\r\n \tlast: last,\r\n \tlimitValue: limitValue,\r\n \tmergeSort: mergeSort,\r\n \tnow: now,\r\n \tpromiseAll: promiseAll,\r\n \trad: rad,\r\n \tround: round,\r\n \tvalueOrDefault: valueOrDefault,\r\n \tbindEvents: bindEvents,\r\n \telementOffset: elementOffset,\r\n \telementSize: elementSize,\r\n \telementStyles: elementStyles,\r\n \tunbindEvents: unbindEvents,\r\n \telementPadding: elementPadding,\r\n \telementScale: elementScale,\r\n \tDEG_TO_RAD: DEG_TO_RAD,\r\n \tMAX_NUM: MAX_NUM,\r\n \tMIN_NUM: MIN_NUM\r\n };\r\n\r\n var toString$1 = {}.toString;\r\n\r\n var OptionsStore = (function (HasObservers$$1) {\r\n function OptionsStore(options, prefix) {\r\n var this$1$1 = this;\r\n if (prefix === void 0) { prefix = \"\"; }\r\n\r\n HasObservers$$1.call(this);\r\n\r\n this.prefix = prefix;\r\n\r\n for (var field in options) {\r\n var member = options[field];\r\n member = this$1$1._wrap(member, field);\r\n this$1$1[field] = member;\r\n }\r\n }\r\n\r\n extendStatic(OptionsStore, HasObservers$$1);\r\n OptionsStore.prototype = Object.create( HasObservers$$1 && HasObservers$$1.prototype );\r\n OptionsStore.prototype.constructor = OptionsStore;\r\n OptionsStore.fn = OptionsStore.prototype;\r\n OptionsStore.fn.init = OptionsStore.fn.constructor;\r\n\r\n OptionsStore.prototype.get = function get (field) {\r\n var parts = field.split(\".\");\r\n var result = this;\r\n\r\n while (parts.length && result) {\r\n var part = parts.shift();\r\n result = result[part];\r\n }\r\n\r\n return result;\r\n };\r\n\r\n OptionsStore.prototype.set = function set (field, value) {\r\n var current = this.get(field);\r\n\r\n if (current !== value) {\r\n this._set(field, this._wrap(value, field));\r\n this.optionsChange({\r\n field: this.prefix + field,\r\n value: value\r\n });\r\n }\r\n };\r\n\r\n OptionsStore.prototype._set = function _set (field, value) {\r\n var this$1$1 = this;\r\n\r\n var composite = field.indexOf(\".\") >= 0;\r\n var parentObj = this;\r\n var fieldName = field;\r\n\r\n if (composite) {\r\n var parts = fieldName.split(\".\");\r\n var prefix = this.prefix;\r\n\r\n while (parts.length > 1) {\r\n fieldName = parts.shift();\r\n prefix += fieldName + \".\";\r\n\r\n var obj = parentObj[fieldName];\r\n\r\n if (!obj) {\r\n obj = new OptionsStore({}, prefix);\r\n obj.addObserver(this$1$1);\r\n parentObj[fieldName] = obj;\r\n }\r\n parentObj = obj;\r\n }\r\n fieldName = parts[0];\r\n }\r\n\r\n parentObj._clear(fieldName);\r\n parentObj[fieldName] = value;\r\n };\r\n\r\n OptionsStore.prototype._clear = function _clear (field) {\r\n var current = this[field];\r\n if (current && current.removeObserver) {\r\n current.removeObserver(this);\r\n }\r\n };\r\n\r\n OptionsStore.prototype._wrap = function _wrap (object, field) {\r\n var type = toString$1.call(object);\r\n var wrapped = object;\r\n\r\n if (wrapped !== null && defined(wrapped) && type === \"[object Object]\") {\r\n if (!(object instanceof OptionsStore) && !(object instanceof Class)) {\r\n wrapped = new OptionsStore(wrapped, this.prefix + field + \".\");\r\n }\r\n\r\n wrapped.addObserver(this);\r\n }\r\n\r\n return wrapped;\r\n };\r\n\r\n return OptionsStore;\r\n }(HasObservers));\r\n\r\n function setAccessor(field) {\r\n return function(value) {\r\n if (this[field] !== value) {\r\n this[field] = value;\r\n this.geometryChange();\r\n }\r\n\r\n return this;\r\n };\r\n }\r\n\r\n function getAccessor(field) {\r\n return function() {\r\n return this[field];\r\n };\r\n }\r\n\r\n function defineAccessors(fn, fields) {\r\n for (var i = 0; i < fields.length; i++) {\r\n var name = fields[i];\r\n var capitalized = name.charAt(0).toUpperCase() +\r\n name.substring(1, name.length);\r\n\r\n fn[\"set\" + capitalized] = setAccessor(name);\r\n fn[\"get\" + capitalized] = getAccessor(name);\r\n }\r\n }\r\n\r\n var withAccessors = function (TBase, names) {\r\n var result = (function (TBase) {\r\n function result () {\r\n TBase.apply(this, arguments);\r\n }extendStatic(result, TBase);\r\n result.prototype = Object.create( TBase && TBase.prototype );\r\n result.prototype.constructor = result;\r\n result.fn = result.prototype;\r\n result.fn.init = result.fn.constructor;\r\n\r\n return result;\r\n }(TBase));\r\n defineAccessors(result.prototype, names);\r\n\r\n return result;\r\n };\r\n\r\n function toMatrix(transformation) {\r\n if (transformation && typeof transformation.matrix === \"function\") {\r\n return transformation.matrix();\r\n }\r\n\r\n return transformation;\r\n }\r\n\r\n var Point = (function (superclass) {\r\n function Point(x, y) {\r\n superclass.call(this);\r\n\r\n this.x = x || 0;\r\n this.y = y || 0;\r\n }\r\n\r\n extendStatic(Point, superclass);\r\n Point.prototype = Object.create( superclass && superclass.prototype );\r\n Point.prototype.constructor = Point;\r\n Point.fn = Point.prototype;\r\n Point.fn.init = Point.fn.constructor;\r\n\r\n var staticAccessors = { ZERO: {} };\r\n\r\n Point.prototype.equals = function equals (other) {\r\n return other && other.x === this.x && other.y === this.y;\r\n };\r\n\r\n Point.prototype.clone = function clone () {\r\n return new Point(this.x, this.y);\r\n };\r\n\r\n Point.prototype.rotate = function rotate (angle, origin) {\r\n var originPoint = Point.create(origin) || Point.ZERO;\r\n\r\n return this.transform(Matrix.rotate(angle, originPoint.x, originPoint.y));\r\n };\r\n\r\n Point.prototype.translate = function translate (x, y) {\r\n this.x += x;\r\n this.y += y;\r\n\r\n this.geometryChange();\r\n\r\n return this;\r\n };\r\n\r\n Point.prototype.translateWith = function translateWith (point) {\r\n return this.translate(point.x, point.y);\r\n };\r\n\r\n Point.prototype.move = function move (x, y) {\r\n this.x = this.y = 0;\r\n return this.translate(x, y);\r\n };\r\n\r\n Point.prototype.scale = function scale (scaleX, scaleY) {\r\n if (scaleY === void 0) { scaleY = scaleX; }\r\n\r\n this.x *= scaleX;\r\n this.y *= scaleY;\r\n\r\n this.geometryChange();\r\n\r\n return this;\r\n };\r\n\r\n Point.prototype.scaleCopy = function scaleCopy (scaleX, scaleY) {\r\n return this.clone().scale(scaleX, scaleY);\r\n };\r\n\r\n Point.prototype.transform = function transform (transformation) {\r\n var matrix = toMatrix(transformation);\r\n var ref = this;\r\n var x = ref.x;\r\n var y = ref.y;\r\n\r\n this.x = matrix.a * x + matrix.c * y + matrix.e;\r\n this.y = matrix.b * x + matrix.d * y + matrix.f;\r\n\r\n this.geometryChange();\r\n\r\n return this;\r\n };\r\n\r\n Point.prototype.transformCopy = function transformCopy (transformation) {\r\n var point = this.clone();\r\n\r\n if (transformation) {\r\n point.transform(transformation);\r\n }\r\n\r\n return point;\r\n };\r\n\r\n Point.prototype.distanceTo = function distanceTo (point) {\r\n var dx = this.x - point.x;\r\n var dy = this.y - point.y;\r\n\r\n return Math.sqrt(dx * dx + dy * dy);\r\n };\r\n\r\n Point.prototype.round = function round$1 (digits) {\r\n this.x = round(this.x, digits);\r\n this.y = round(this.y, digits);\r\n\r\n this.geometryChange();\r\n\r\n return this;\r\n };\r\n\r\n Point.prototype.toArray = function toArray (digits) {\r\n var doRound = defined(digits);\r\n var x = doRound ? round(this.x, digits) : this.x;\r\n var y = doRound ? round(this.y, digits) : this.y;\r\n\r\n return [ x, y ];\r\n };\r\n\r\n Point.prototype.toString = function toString (digits, separator) {\r\n if (separator === void 0) { separator = \" \"; }\r\n\r\n var ref = this;\r\n var x = ref.x;\r\n var y = ref.y;\r\n\r\n if (defined(digits)) {\r\n x = round(x, digits);\r\n y = round(y, digits);\r\n }\r\n\r\n return x + separator + y;\r\n };\r\n\r\n Point.create = function create (arg0, arg1) {\r\n if (defined(arg0)) {\r\n if (arg0 instanceof Point) {\r\n return arg0;\r\n } else if (arguments.length === 1 && arg0.length === 2) {\r\n return new Point(arg0[0], arg0[1]);\r\n }\r\n\r\n return new Point(arg0, arg1);\r\n }\r\n };\r\n\r\n Point.min = function min () {\r\n var arguments$1 = arguments;\r\n\r\n var minX = MAX_NUM;\r\n var minY = MAX_NUM;\r\n\r\n for (var i = 0; i < arguments.length; i++) {\r\n var point = arguments$1[i];\r\n minX = Math.min(point.x, minX);\r\n minY = Math.min(point.y, minY);\r\n }\r\n\r\n return new Point(minX, minY);\r\n };\r\n\r\n Point.max = function max () {\r\n var arguments$1 = arguments;\r\n\r\n var maxX = MIN_NUM;\r\n var maxY = MIN_NUM;\r\n\r\n for (var i = 0; i < arguments.length; i++) {\r\n var point = arguments$1[i];\r\n maxX = Math.max(point.x, maxX);\r\n maxY = Math.max(point.y, maxY);\r\n }\r\n\r\n return new Point(maxX, maxY);\r\n };\r\n\r\n Point.minPoint = function minPoint () {\r\n return new Point(MIN_NUM, MIN_NUM);\r\n };\r\n\r\n Point.maxPoint = function maxPoint () {\r\n return new Point(MAX_NUM, MAX_NUM);\r\n };\r\n\r\n staticAccessors.ZERO.get = function () {\r\n return new Point(0, 0);\r\n };\r\n\r\n Object.defineProperties( Point, staticAccessors );\r\n\r\n return Point;\r\n }(withAccessors(HasObservers, [ \"x\", \"y\" ])));\r\n\r\n var Size = (function (superclass) {\r\n function Size(width, height) {\r\n superclass.call(this);\r\n\r\n this.width = width || 0;\r\n this.height = height || 0;\r\n }\r\n\r\n extendStatic(Size, superclass);\r\n Size.prototype = Object.create( superclass && superclass.prototype );\r\n Size.prototype.constructor = Size;\r\n Size.fn = Size.prototype;\r\n Size.fn.init = Size.fn.constructor;\r\n\r\n var staticAccessors = { ZERO: {} };\r\n\r\n Size.prototype.equals = function equals (other) {\r\n return other && other.width === this.width && other.height === this.height;\r\n };\r\n\r\n Size.prototype.clone = function clone () {\r\n return new Size(this.width, this.height);\r\n };\r\n\r\n Size.prototype.toArray = function toArray (digits) {\r\n var doRound = defined(digits);\r\n var width = doRound ? round(this.width, digits) : this.width;\r\n var height = doRound ? round(this.height, digits) : this.height;\r\n\r\n return [ width, height ];\r\n };\r\n\r\n Size.create = function create (arg0, arg1) {\r\n if (defined(arg0)) {\r\n if (arg0 instanceof Size) {\r\n return arg0;\r\n } else if (arguments.length === 1 && arg0.length === 2) {\r\n return new Size(arg0[0], arg0[1]);\r\n }\r\n\r\n return new Size(arg0, arg1);\r\n }\r\n };\r\n\r\n staticAccessors.ZERO.get = function () {\r\n return new Size(0, 0);\r\n };\r\n\r\n Object.defineProperties( Size, staticAccessors );\r\n\r\n return Size;\r\n }(withAccessors(HasObservers, [ \"width\", \"height\" ])));\r\n\r\n var Rect = (function (HasObservers$$1) {\r\n function Rect(origin, size, cornerRadius) {\r\n if (origin === void 0) { origin = new Point(); }\r\n if (size === void 0) { size = new Size(); }\r\n if (cornerRadius === void 0) { cornerRadius = 0; }\r\n\r\n HasObservers$$1.call(this);\r\n\r\n this.setOrigin(origin);\r\n this.setSize(size);\r\n this.setCornerRadius(cornerRadius);\r\n }\r\n\r\n extendStatic(Rect, HasObservers$$1);\r\n Rect.prototype = Object.create( HasObservers$$1 && HasObservers$$1.prototype );\r\n Rect.prototype.constructor = Rect;\r\n Rect.fn = Rect.prototype;\r\n Rect.fn.init = Rect.fn.constructor;\r\n\r\n Rect.prototype.clone = function clone () {\r\n return new Rect(\r\n this.origin.clone(),\r\n this.size.clone()\r\n );\r\n };\r\n\r\n Rect.prototype.equals = function equals (other) {\r\n return other &&\r\n other.origin.equals(this.origin) &&\r\n other.size.equals(this.size);\r\n };\r\n\r\n Rect.prototype.setOrigin = function setOrigin (value) {\r\n this._observerField(\"origin\", Point.create(value));\r\n this.geometryChange();\r\n return this;\r\n };\r\n\r\n Rect.prototype.getOrigin = function getOrigin () {\r\n return this.origin;\r\n };\r\n\r\n Rect.prototype.setCornerRadius = function setCornerRadius (radius) {\r\n this.cornerRadius = Array.isArray(radius) ? radius : [ radius, radius ];\r\n\r\n this.geometryChange();\r\n return this;\r\n };\r\n\r\n Rect.prototype.getCornerRadius = function getCornerRadius () {\r\n return this.cornerRadius;\r\n };\r\n\r\n Rect.prototype.setSize = function setSize (value) {\r\n this._observerField(\"size\", Size.create(value));\r\n this.geometryChange();\r\n return this;\r\n };\r\n\r\n Rect.prototype.getSize = function getSize () {\r\n return this.size;\r\n };\r\n\r\n Rect.prototype.width = function width () {\r\n return this.size.width;\r\n };\r\n\r\n Rect.prototype.height = function height () {\r\n return this.size.height;\r\n };\r\n\r\n Rect.prototype.topLeft = function topLeft () {\r\n return this.origin.clone();\r\n };\r\n\r\n Rect.prototype.bottomRight = function bottomRight () {\r\n return this.origin.clone().translate(this.width(), this.height());\r\n };\r\n\r\n Rect.prototype.topRight = function topRight () {\r\n return this.origin.clone().translate(this.width(), 0);\r\n };\r\n\r\n Rect.prototype.bottomLeft = function bottomLeft () {\r\n return this.origin.clone().translate(0, this.height());\r\n };\r\n\r\n Rect.prototype.center = function center () {\r\n return this.origin.clone().translate(this.width() / 2, this.height() / 2);\r\n };\r\n\r\n Rect.prototype.bbox = function bbox (matrix) {\r\n var tl = this.topLeft().transformCopy(matrix);\r\n var tr = this.topRight().transformCopy(matrix);\r\n var br = this.bottomRight().transformCopy(matrix);\r\n var bl = this.bottomLeft().transformCopy(matrix);\r\n\r\n return Rect.fromPoints(tl, tr, br, bl);\r\n };\r\n\r\n Rect.prototype.transformCopy = function transformCopy (m) {\r\n return Rect.fromPoints(\r\n this.topLeft().transform(m),\r\n this.bottomRight().transform(m)\r\n );\r\n };\r\n\r\n Rect.prototype.expand = function expand (x, y) {\r\n if (y === void 0) { y = x; }\r\n\r\n this.size.width += 2 * x;\r\n this.size.height += 2 * y;\r\n\r\n this.origin.translate(-x, -y);\r\n\r\n return this;\r\n };\r\n\r\n Rect.prototype.expandCopy = function expandCopy (x, y) {\r\n return this.clone().expand(x, y);\r\n };\r\n\r\n Rect.prototype.containsPoint = function containsPoint (point) {\r\n var origin = this.origin;\r\n var bottomRight = this.bottomRight();\r\n return !(point.x < origin.x || point.y < origin.y || bottomRight.x < point.x || bottomRight.y < point.y);\r\n };\r\n\r\n Rect.prototype._isOnPath = function _isOnPath (point, width) {\r\n var rectOuter = this.expandCopy(width, width);\r\n var rectInner = this.expandCopy(-width, -width);\r\n\r\n return rectOuter.containsPoint(point) && !rectInner.containsPoint(point);\r\n };\r\n\r\n Rect.fromPoints = function fromPoints () {\r\n var topLeft = Point.min.apply(null, arguments);\r\n var bottomRight = Point.max.apply(null, arguments);\r\n var size = new Size(\r\n bottomRight.x - topLeft.x,\r\n bottomRight.y - topLeft.y\r\n );\r\n\r\n return new Rect(topLeft, size);\r\n };\r\n\r\n Rect.union = function union (a, b) {\r\n return Rect.fromPoints(\r\n Point.min(a.topLeft(), b.topLeft()),\r\n Point.max(a.bottomRight(), b.bottomRight())\r\n );\r\n };\r\n\r\n Rect.intersect = function intersect (a, b) {\r\n var rect1 = {\r\n left: a.topLeft().x,\r\n top: a.topLeft().y,\r\n right: a.bottomRight().x,\r\n bottom: a.bottomRight().y\r\n };\r\n\r\n var rect2 = {\r\n left: b.topLeft().x,\r\n top: b.topLeft().y,\r\n right: b.bottomRight().x,\r\n bottom: b.bottomRight().y\r\n };\r\n\r\n if (rect1.left <= rect2.right &&\r\n rect2.left <= rect1.right &&\r\n rect1.top <= rect2.bottom &&\r\n rect2.top <= rect1.bottom) {\r\n return Rect.fromPoints(\r\n new Point(Math.max(rect1.left, rect2.left), Math.max(rect1.top, rect2.top)),\r\n new Point(Math.min(rect1.right, rect2.right), Math.min(rect1.bottom, rect2.bottom))\r\n );\r\n }\r\n };\r\n\r\n return Rect;\r\n }(HasObservers));\r\n\r\n var Transformation = (function (HasObservers$$1) {\r\n function Transformation(matrix) {\r\n if (matrix === void 0) { matrix = Matrix.unit(); }\r\n\r\n HasObservers$$1.call(this);\r\n\r\n this._matrix = matrix;\r\n }\r\n\r\n extendStatic(Transformation, HasObservers$$1);\r\n Transformation.prototype = Object.create( HasObservers$$1 && HasObservers$$1.prototype );\r\n Transformation.prototype.constructor = Transformation;\r\n Transformation.fn = Transformation.prototype;\r\n Transformation.fn.init = Transformation.fn.constructor;\r\n\r\n Transformation.prototype.clone = function clone () {\r\n return new Transformation(\r\n this._matrix.clone()\r\n );\r\n };\r\n\r\n Transformation.prototype.equals = function equals (other) {\r\n return other &&\r\n other._matrix.equals(this._matrix);\r\n };\r\n\r\n Transformation.prototype.translate = function translate (x, y) {\r\n this._matrix = this._matrix.multiplyCopy(Matrix.translate(x, y));\r\n\r\n this._optionsChange();\r\n return this;\r\n };\r\n\r\n Transformation.prototype.scale = function scale (scaleX, scaleY, origin) {\r\n if (scaleY === void 0) { scaleY = scaleX; }\r\n if (origin === void 0) { origin = null; }\r\n\r\n var originPoint = origin;\r\n\r\n if (originPoint) {\r\n originPoint = Point.create(originPoint);\r\n this._matrix = this._matrix.multiplyCopy(Matrix.translate(originPoint.x, originPoint.y));\r\n }\r\n\r\n this._matrix = this._matrix.multiplyCopy(Matrix.scale(scaleX, scaleY));\r\n\r\n if (originPoint) {\r\n this._matrix = this._matrix.multiplyCopy(Matrix.translate(-originPoint.x, -originPoint.y));\r\n }\r\n\r\n this._optionsChange();\r\n return this;\r\n };\r\n\r\n Transformation.prototype.rotate = function rotate (angle, origin) {\r\n var originPoint = Point.create(origin) || Point.ZERO;\r\n\r\n this._matrix = this._matrix.multiplyCopy(Matrix.rotate(angle, originPoint.x, originPoint.y));\r\n\r\n this._optionsChange();\r\n return this;\r\n };\r\n\r\n Transformation.prototype.multiply = function multiply (transformation) {\r\n var matrix = toMatrix(transformation);\r\n\r\n this._matrix = this._matrix.multiplyCopy(matrix);\r\n\r\n this._optionsChange();\r\n return this;\r\n };\r\n\r\n Transformation.prototype.matrix = function matrix (value) {\r\n if (value) {\r\n this._matrix = value;\r\n this._optionsChange();\r\n return this;\r\n }\r\n\r\n return this._matrix;\r\n };\r\n\r\n Transformation.prototype._optionsChange = function _optionsChange () {\r\n this.optionsChange({\r\n field: \"transform\",\r\n value: this\r\n });\r\n };\r\n\r\n return Transformation;\r\n }(HasObservers));\r\n\r\n function transform$1(matrix) {\r\n if (matrix === null) {\r\n return null;\r\n }\r\n\r\n if (matrix instanceof Transformation) {\r\n return matrix;\r\n }\r\n\r\n return new Transformation(matrix);\r\n }\r\n\r\n var Element$1 = (function (HasObservers$$1) {\r\n function Element(options) {\r\n HasObservers$$1.call(this);\r\n\r\n this._initOptions(options);\r\n }\r\n\r\n extendStatic(Element, HasObservers$$1);\r\n Element.prototype = Object.create( HasObservers$$1 && HasObservers$$1.prototype );\r\n Element.prototype.constructor = Element;\r\n Element.fn = Element.prototype;\r\n Element.fn.init = Element.fn.constructor;\r\n\r\n var prototypeAccessors = { nodeType: {} };\r\n\r\n prototypeAccessors.nodeType.get = function () {\r\n return \"Rect\";\r\n };\r\n\r\n Element.prototype._initOptions = function _initOptions (options) {\r\n if (options === void 0) { options = {}; }\r\n\r\n var clip = options.clip;\r\n var transform = options.transform;\r\n\r\n if (transform) {\r\n options.transform = transform$1(transform);\r\n }\r\n\r\n if (clip && !clip.id) {\r\n clip.id = definitionId();\r\n }\r\n\r\n this.options = new OptionsStore(options);\r\n this.options.addObserver(this);\r\n };\r\n\r\n Element.prototype.transform = function transform (value) {\r\n if (defined(value)) {\r\n this.options.set(\"transform\", transform$1(value));\r\n } else {\r\n return this.options.get(\"transform\");\r\n }\r\n };\r\n\r\n Element.prototype.parentTransform = function parentTransform () {\r\n var element = this;\r\n var parentMatrix;\r\n\r\n while (element.parent) {\r\n element = element.parent;\r\n var transformation = element.transform();\r\n if (transformation) {\r\n parentMatrix = transformation.matrix().multiplyCopy(parentMatrix || Matrix.unit());\r\n }\r\n }\r\n\r\n if (parentMatrix) {\r\n return transform$1(parentMatrix);\r\n }\r\n };\r\n\r\n Element.prototype.currentTransform = function currentTransform (parentTransform) {\r\n if (parentTransform === void 0) { parentTransform = this.parentTransform(); }\r\n\r\n var elementTransform = this.transform();\r\n var elementMatrix = toMatrix(elementTransform);\r\n\r\n var parentMatrix = toMatrix(parentTransform);\r\n var combinedMatrix;\r\n\r\n if (elementMatrix && parentMatrix) {\r\n combinedMatrix = parentMatrix.multiplyCopy(elementMatrix);\r\n } else {\r\n combinedMatrix = elementMatrix || parentMatrix;\r\n }\r\n\r\n if (combinedMatrix) {\r\n return transform$1(combinedMatrix);\r\n }\r\n };\r\n\r\n Element.prototype.visible = function visible (value) {\r\n if (defined(value)) {\r\n this.options.set(\"visible\", value);\r\n return this;\r\n }\r\n\r\n return this.options.get(\"visible\") !== false;\r\n };\r\n\r\n Element.prototype.clip = function clip (value) {\r\n var options = this.options;\r\n if (defined(value)) {\r\n if (value && !value.id) {\r\n value.id = definitionId();\r\n }\r\n options.set(\"clip\", value);\r\n return this;\r\n }\r\n\r\n return options.get(\"clip\");\r\n };\r\n\r\n Element.prototype.opacity = function opacity (value) {\r\n if (defined(value)) {\r\n this.options.set(\"opacity\", value);\r\n return this;\r\n }\r\n\r\n return valueOrDefault(this.options.get(\"opacity\"), 1);\r\n };\r\n\r\n Element.prototype.className = function className (value) {\r\n if (defined(value)) {\r\n this.options.set(\"className\", value);\r\n return this;\r\n }\r\n\r\n return this.options.get(\"className\");\r\n };\r\n\r\n Element.prototype.clippedBBox = function clippedBBox (transformation) {\r\n var bbox = this._clippedBBox(transformation);\r\n if (bbox) {\r\n var clip = this.clip();\r\n return clip ? Rect.intersect(bbox, clip.bbox(transformation)) : bbox;\r\n }\r\n };\r\n\r\n Element.prototype.containsPoint = function containsPoint (point, parentTransform) {\r\n if (this.visible()) {\r\n var transform = this.currentTransform(parentTransform);\r\n var transformedPoint = point;\r\n if (transform) {\r\n transformedPoint = point.transformCopy(transform.matrix().invert());\r\n }\r\n return (this._hasFill() && this._containsPoint(transformedPoint)) || (this._isOnPath && this._hasStroke() && this._isOnPath(transformedPoint));\r\n }\r\n return false;\r\n };\r\n\r\n Element.prototype._hasFill = function _hasFill () {\r\n var fill = this.options.fill;\r\n return fill && !isTransparent(fill.color);\r\n };\r\n\r\n Element.prototype._hasStroke = function _hasStroke () {\r\n var stroke = this.options.stroke;\r\n return stroke && stroke.width > 0 && !isTransparent(stroke.color);\r\n };\r\n\r\n Element.prototype._clippedBBox = function _clippedBBox (transformation) {\r\n return this.bbox(transformation);\r\n };\r\n\r\n Object.defineProperties( Element.prototype, prototypeAccessors );\r\n\r\n return Element;\r\n }(HasObservers));\r\n\r\n function ellipseExtremeAngles(center, rx, ry, matrix) {\r\n var extremeX = 0;\r\n var extremeY = 0;\r\n\r\n if (matrix) {\r\n extremeX = Math.atan2(matrix.c * ry, matrix.a * rx);\r\n if (matrix.b !== 0) {\r\n extremeY = Math.atan2(matrix.d * ry, matrix.b * rx);\r\n }\r\n }\r\n\r\n return {\r\n x: extremeX,\r\n y: extremeY\r\n };\r\n }\r\n\r\n var PI_DIV_2 = Math.PI / 2;\r\n\r\n var Circle$2 = (function (superclass) {\r\n function Circle(center, radius) {\r\n if (center === void 0) { center = new Point(); }\r\n if (radius === void 0) { radius = 0; }\r\n\r\n superclass.call(this);\r\n\r\n this.setCenter(center);\r\n this.setRadius(radius);\r\n }\r\n\r\n extendStatic(Circle, superclass);\r\n Circle.prototype = Object.create( superclass && superclass.prototype );\r\n Circle.prototype.constructor = Circle;\r\n Circle.fn = Circle.prototype;\r\n Circle.fn.init = Circle.fn.constructor;\r\n\r\n Circle.prototype.setCenter = function setCenter (value) {\r\n this._observerField(\"center\", Point.create(value));\r\n this.geometryChange();\r\n return this;\r\n };\r\n\r\n Circle.prototype.getCenter = function getCenter () {\r\n return this.center;\r\n };\r\n\r\n Circle.prototype.equals = function equals (other) {\r\n return other &&\r\n other.center.equals(this.center) &&\r\n other.radius === this.radius;\r\n };\r\n\r\n Circle.prototype.clone = function clone () {\r\n return new Circle(this.center.clone(), this.radius);\r\n };\r\n\r\n Circle.prototype.pointAt = function pointAt (angle) {\r\n return this._pointAt(rad(angle));\r\n };\r\n\r\n Circle.prototype.bbox = function bbox (matrix) {\r\n var this$1$1 = this;\r\n\r\n var extremeAngles = ellipseExtremeAngles(this.center, this.radius, this.radius, matrix);\r\n var minPoint = Point.maxPoint();\r\n var maxPoint = Point.minPoint();\r\n\r\n for (var i = 0; i < 4; i++) {\r\n var currentPointX = this$1$1._pointAt(extremeAngles.x + i * PI_DIV_2).transformCopy(matrix);\r\n var currentPointY = this$1$1._pointAt(extremeAngles.y + i * PI_DIV_2).transformCopy(matrix);\r\n var currentPoint = new Point(currentPointX.x, currentPointY.y);\r\n\r\n minPoint = Point.min(minPoint, currentPoint);\r\n maxPoint = Point.max(maxPoint, currentPoint);\r\n }\r\n\r\n return Rect.fromPoints(minPoint, maxPoint);\r\n };\r\n\r\n Circle.prototype._pointAt = function _pointAt (angle) {\r\n var ref = this;\r\n var center = ref.center;\r\n var radius = ref.radius;\r\n\r\n return new Point(\r\n center.x + radius * Math.cos(angle),\r\n center.y + radius * Math.sin(angle)\r\n );\r\n };\r\n\r\n Circle.prototype.containsPoint = function containsPoint (point) {\r\n var ref = this;\r\n var center = ref.center;\r\n var radius = ref.radius;\r\n var inCircle = Math.pow(point.x - center.x, 2) +\r\n Math.pow(point.y - center.y, 2) <= Math.pow(radius, 2);\r\n return inCircle;\r\n };\r\n\r\n Circle.prototype._isOnPath = function _isOnPath (point, width) {\r\n var ref = this;\r\n var center = ref.center;\r\n var radius = ref.radius;\r\n var pointDistance = center.distanceTo(point);\r\n\r\n return radius - width <= pointDistance && pointDistance <= radius + width;\r\n };\r\n\r\n return Circle;\r\n }(withAccessors(HasObservers, [ \"radius\" ])));\r\n\r\n var GRADIENT = \"Gradient\";\r\n\r\n var paintable = function (TBase) { return (\r\n (function (TBase) {\r\n function anonymous () {\r\n TBase.apply(this, arguments);\r\n }\r\n\r\n extendStatic(anonymous, TBase);\r\n anonymous.prototype = Object.create( TBase && TBase.prototype );\r\n anonymous.prototype.constructor = anonymous;\r\n anonymous.fn = anonymous.prototype;\r\n anonymous.fn.init = anonymous.fn.constructor;\r\n\r\n anonymous.prototype.fill = function fill (color, opacity) {\r\n var options = this.options;\r\n\r\n if (defined(color)) {\r\n if (color && color.nodeType !== GRADIENT) {\r\n var newFill = {\r\n color: color\r\n };\r\n if (defined(opacity)) {\r\n newFill.opacity = opacity;\r\n }\r\n options.set(\"fill\", newFill);\r\n } else {\r\n options.set(\"fill\", color);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n return options.get(\"fill\");\r\n };\r\n\r\n anonymous.prototype.stroke = function stroke (color, width, opacity) {\r\n if (defined(color)) {\r\n this.options.set(\"stroke.color\", color);\r\n\r\n if (defined(width)) {\r\n this.options.set(\"stroke.width\", width);\r\n }\r\n\r\n if (defined(opacity)) {\r\n this.options.set(\"stroke.opacity\", opacity);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n return this.options.get(\"stroke\");\r\n };\r\n\r\n return anonymous;\r\n }(TBase))\r\n ); };\r\n\r\n var IDENTITY_MATRIX_HASH = Matrix.IDENTITY.toString();\r\n\r\n var measurable = function (TBase) { return (\r\n (function (TBase) {\r\n function anonymous () {\r\n TBase.apply(this, arguments);\r\n }\r\n\r\n extendStatic(anonymous, TBase);\r\n anonymous.prototype = Object.create( TBase && TBase.prototype );\r\n anonymous.prototype.constructor = anonymous;\r\n anonymous.fn = anonymous.prototype;\r\n anonymous.fn.init = anonymous.fn.constructor;\r\n\r\n anonymous.prototype.bbox = function bbox (transformation) {\r\n var combinedMatrix = toMatrix(this.currentTransform(transformation));\r\n var matrixHash = combinedMatrix ? combinedMatrix.toString() : IDENTITY_MATRIX_HASH;\r\n var bbox;\r\n\r\n if (this._bboxCache && this._matrixHash === matrixHash) {\r\n bbox = this._bboxCache.clone();\r\n } else {\r\n bbox = this._bbox(combinedMatrix);\r\n this._bboxCache = bbox ? bbox.clone() : null;\r\n this._matrixHash = matrixHash;\r\n }\r\n\r\n var strokeWidth = this.options.get(\"stroke.width\");\r\n if (strokeWidth && bbox) {\r\n bbox.expand(strokeWidth / 2);\r\n }\r\n\r\n return bbox;\r\n };\r\n\r\n anonymous.prototype.geometryChange = function geometryChange () {\r\n delete this._bboxCache;\r\n this.trigger(\"geometryChange\", {\r\n element: this\r\n });\r\n };\r\n\r\n return anonymous;\r\n }(TBase))\r\n ); };\r\n\r\n function geometryAccessor(name) {\r\n var fieldName = \"_\" + name;\r\n return function(value) {\r\n if (defined(value)) {\r\n this._observerField(fieldName, value);\r\n this.geometryChange();\r\n return this;\r\n }\r\n\r\n return this[fieldName];\r\n };\r\n }\r\n\r\n function defineGeometryAccessors(fn, names) {\r\n for (var i = 0; i < names.length; i++) {\r\n fn[names[i]] = geometryAccessor(names[i]);\r\n }\r\n }\r\n\r\n var withGeometry = function (TBase, names) {\r\n if (names === void 0) { names = [ \"geometry\" ]; }\r\n\r\n var result = (function (TBase) {\r\n function result () {\r\n TBase.apply(this, arguments);\r\n }extendStatic(result, TBase);\r\n result.prototype = Object.create( TBase && TBase.prototype );\r\n result.prototype.constructor = result;\r\n result.fn = result.prototype;\r\n result.fn.init = result.fn.constructor;\r\n\r\n return result;\r\n }(TBase));\r\n defineGeometryAccessors(result.prototype, names);\r\n\r\n return result;\r\n };\r\n\r\n var DEFAULT_STROKE = \"#000\";\r\n\r\n var Circle = (function (superclass) {\r\n function Circle(geometry, options) {\r\n if (geometry === void 0) { geometry = new Circle$2(); }\r\n if (options === void 0) { options = {}; }\r\n\r\n superclass.call(this, options);\r\n\r\n this.geometry(geometry);\r\n\r\n if (!defined(this.options.stroke)) {\r\n this.stroke(DEFAULT_STROKE);\r\n }\r\n }\r\n\r\n extendStatic(Circle, superclass);\r\n Circle.prototype = Object.create( superclass && superclass.prototype );\r\n Circle.prototype.constructor = Circle;\r\n Circle.fn = Circle.prototype;\r\n Circle.fn.init = Circle.fn.constructor;\r\n\r\n var prototypeAccessors = { nodeType: {} };\r\n\r\n prototypeAccessors.nodeType.get = function () {\r\n return \"Circle\";\r\n };\r\n\r\n Circle.prototype.rawBBox = function rawBBox () {\r\n return this._geometry.bbox();\r\n };\r\n\r\n Circle.prototype._bbox = function _bbox (matrix) {\r\n return this._geometry.bbox(matrix);\r\n };\r\n\r\n Circle.prototype._containsPoint = function _containsPoint (point) {\r\n return this.geometry().containsPoint(point);\r\n };\r\n\r\n Circle.prototype._isOnPath = function _isOnPath (point) {\r\n return this.geometry()._isOnPath(point, this.options.stroke.width / 2);\r\n };\r\n\r\n Object.defineProperties( Circle.prototype, prototypeAccessors );\r\n\r\n return Circle;\r\n }(paintable(measurable(withGeometry(Element$1)))));\r\n\r\n var PRECISION = 10;\r\n\r\n function close$1(a, b, tolerance) {\r\n if (tolerance === void 0) { tolerance = PRECISION; }\r\n\r\n return round(Math.abs(a - b), tolerance) === 0;\r\n }\r\n\r\n function closeOrLess(a, b, tolerance) {\r\n return a < b || close$1(a, b, tolerance);\r\n }\r\n\r\n function lineIntersection(p0, p1, p2, p3) {\r\n var s1x = p1.x - p0.x;\r\n var s2x = p3.x - p2.x;\r\n var s1y = p1.y - p0.y;\r\n var s2y = p3.y - p2.y;\r\n var nx = p0.x - p2.x;\r\n var ny = p0.y - p2.y;\r\n var d = s1x * s2y - s2x * s1y;\r\n var s = (s1x * ny - s1y * nx) / d;\r\n var t = (s2x * ny - s2y * nx) / d;\r\n\r\n if (s >= 0 && s <= 1 && t >= 0 && t <= 1) {\r\n return new Point(p0.x + t * s1x, p0.y + t * s1y);\r\n }\r\n }\r\n\r\n var MAX_INTERVAL = 45;\r\n var pow$1 = Math.pow;\r\n var accessors = [ \"radiusX\", \"radiusY\", \"startAngle\", \"endAngle\", \"anticlockwise\" ];\r\n\r\n var Arc$2 = (function (superclass) {\r\n function Arc(center, options) {\r\n if (center === void 0) { center = new Point(); }\r\n if (options === void 0) { options = {}; }\r\n\r\n superclass.call(this);\r\n\r\n this.setCenter(center);\r\n\r\n this.radiusX = options.radiusX;\r\n this.radiusY = options.radiusY || options.radiusX;\r\n this.startAngle = options.startAngle;\r\n this.endAngle = options.endAngle;\r\n this.anticlockwise = options.anticlockwise || false;\r\n this.xRotation = options.xRotation;\r\n }\r\n\r\n extendStatic(Arc, superclass);\r\n Arc.prototype = Object.create( superclass && superclass.prototype );\r\n Arc.prototype.constructor = Arc;\r\n Arc.fn = Arc.prototype;\r\n Arc.fn.init = Arc.fn.constructor;\r\n\r\n Arc.prototype.clone = function clone () {\r\n return new Arc(this.center, {\r\n radiusX: this.radiusX,\r\n radiusY: this.radiusY,\r\n startAngle: this.startAngle,\r\n endAngle: this.endAngle,\r\n anticlockwise: this.anticlockwise\r\n });\r\n };\r\n\r\n Arc.prototype.setCenter = function setCenter (value) {\r\n this._observerField(\"center\", Point.create(value));\r\n this.geometryChange();\r\n return this;\r\n };\r\n\r\n Arc.prototype.getCenter = function getCenter () {\r\n return this.center;\r\n };\r\n\r\n Arc.prototype.pointAt = function pointAt (angle) {\r\n var center = this.center;\r\n var radian = rad(angle);\r\n\r\n return new Point(\r\n center.x + this.radiusX * Math.cos(radian),\r\n center.y + this.radiusY * Math.sin(radian)\r\n );\r\n };\r\n\r\n Arc.prototype.curvePoints = function curvePoints () {\r\n var this$1$1 = this;\r\n\r\n var startAngle = this.startAngle;\r\n var dir = this.anticlockwise ? -1 : 1;\r\n var curvePoints = [ this.pointAt(startAngle) ];\r\n var interval = this._arcInterval();\r\n var intervalAngle = interval.endAngle - interval.startAngle;\r\n var subIntervalsCount = Math.ceil(intervalAngle / MAX_INTERVAL);\r\n var subIntervalAngle = intervalAngle / subIntervalsCount;\r\n var currentAngle = startAngle;\r\n var transformation;\r\n if (this.xRotation) {\r\n transformation = transform$1().rotate(this.xRotation, this.center);\r\n }\r\n\r\n for (var i = 1; i <= subIntervalsCount; i++) {\r\n var nextAngle = currentAngle + dir * subIntervalAngle;\r\n var points = this$1$1._intervalCurvePoints(currentAngle, nextAngle, transformation);\r\n\r\n curvePoints.push(points.cp1, points.cp2, points.p2);\r\n currentAngle = nextAngle;\r\n }\r\n\r\n return curvePoints;\r\n };\r\n\r\n Arc.prototype.bbox = function bbox (matrix) {\r\n var this$1$1 = this;\r\n\r\n var interval = this._arcInterval();\r\n var startAngle = interval.startAngle;\r\n var endAngle = interval.endAngle;\r\n var extremeAngles = ellipseExtremeAngles(this.center, this.radiusX, this.radiusY, matrix);\r\n var extremeX = deg(extremeAngles.x);\r\n var extremeY = deg(extremeAngles.y);\r\n var endPoint = this.pointAt(endAngle).transformCopy(matrix);\r\n var currentAngleX = bboxStartAngle(extremeX, startAngle);\r\n var currentAngleY = bboxStartAngle(extremeY, startAngle);\r\n var currentPoint = this.pointAt(startAngle).transformCopy(matrix);\r\n var minPoint = Point.min(currentPoint, endPoint);\r\n var maxPoint = Point.max(currentPoint, endPoint);\r\n\r\n while (currentAngleX < endAngle || currentAngleY < endAngle) {\r\n var currentPointX = (void 0);\r\n if (currentAngleX < endAngle) {\r\n currentPointX = this$1$1.pointAt(currentAngleX).transformCopy(matrix);\r\n currentAngleX += 90;\r\n }\r\n\r\n var currentPointY = (void 0);\r\n if (currentAngleY < endAngle) {\r\n currentPointY = this$1$1.pointAt(currentAngleY).transformCopy(matrix);\r\n currentAngleY += 90;\r\n }\r\n\r\n currentPoint = new Point(currentPointX.x, currentPointY.y);\r\n minPoint = Point.min(minPoint, currentPoint);\r\n maxPoint = Point.max(maxPoint, currentPoint);\r\n }\r\n\r\n return Rect.fromPoints(minPoint, maxPoint);\r\n };\r\n\r\n Arc.prototype._arcInterval = function _arcInterval () {\r\n var ref = this;\r\n var startAngle = ref.startAngle;\r\n var endAngle = ref.endAngle;\r\n var anticlockwise = ref.anticlockwise;\r\n\r\n if (anticlockwise) {\r\n var oldStart = startAngle;\r\n startAngle = endAngle;\r\n endAngle = oldStart;\r\n }\r\n\r\n if (startAngle > endAngle || (anticlockwise && startAngle === endAngle)) {\r\n endAngle += 360;\r\n }\r\n\r\n return {\r\n startAngle: startAngle,\r\n endAngle: endAngle\r\n };\r\n };\r\n\r\n Arc.prototype._intervalCurvePoints = function _intervalCurvePoints (startAngle, endAngle, transformation) {\r\n var p1 = this.pointAt(startAngle);\r\n var p2 = this.pointAt(endAngle);\r\n var p1Derivative = this._derivativeAt(startAngle);\r\n var p2Derivative = this._derivativeAt(endAngle);\r\n var t = (rad(endAngle) - rad(startAngle)) / 3;\r\n var cp1 = new Point(p1.x + t * p1Derivative.x, p1.y + t * p1Derivative.y);\r\n var cp2 = new Point(p2.x - t * p2Derivative.x, p2.y - t * p2Derivative.y);\r\n if (transformation) {\r\n p1.transform(transformation);\r\n p2.transform(transformation);\r\n cp1.transform(transformation);\r\n cp2.transform(transformation);\r\n }\r\n\r\n return {\r\n p1: p1,\r\n cp1: cp1,\r\n cp2: cp2,\r\n p2: p2\r\n };\r\n };\r\n\r\n Arc.prototype._derivativeAt = function _derivativeAt (angle) {\r\n var radian = rad(angle);\r\n\r\n return new Point(-this.radiusX * Math.sin(radian), this.radiusY * Math.cos(radian));\r\n };\r\n\r\n Arc.prototype.containsPoint = function containsPoint (point) {\r\n var interval = this._arcInterval();\r\n var intervalAngle = interval.endAngle - interval.startAngle;\r\n var ref = this;\r\n var center = ref.center;\r\n var radiusX = ref.radiusX;\r\n var radiusY = ref.radiusY;\r\n var distance = center.distanceTo(point);\r\n var angleRad = Math.atan2(point.y - center.y, point.x - center.x);\r\n var pointRadius = (radiusX * radiusY) /\r\n Math.sqrt(pow$1(radiusX, 2) * pow$1(Math.sin(angleRad), 2) + pow$1(radiusY, 2) * pow$1(Math.cos(angleRad), 2));\r\n var startPoint = this.pointAt(this.startAngle).round(PRECISION);\r\n var endPoint = this.pointAt(this.endAngle).round(PRECISION);\r\n var intersection = lineIntersection(center, point.round(PRECISION), startPoint, endPoint);\r\n var containsPoint;\r\n\r\n if (intervalAngle < 180) {\r\n containsPoint = intersection && closeOrLess(center.distanceTo(intersection), distance) && closeOrLess(distance, pointRadius);\r\n } else {\r\n var angle = calculateAngle(center.x, center.y, radiusX, radiusY, point.x, point.y);\r\n if (angle !== 360) {\r\n angle = (360 + angle) % 360;\r\n }\r\n\r\n var inAngleRange = interval.startAngle <= angle && angle <= interval.endAngle;\r\n containsPoint = (inAngleRange && closeOrLess(distance, pointRadius)) || (!inAngleRange && (!intersection || intersection.equals(point)));\r\n }\r\n return containsPoint;\r\n };\r\n\r\n Arc.prototype._isOnPath = function _isOnPath (point, width) {\r\n var interval = this._arcInterval();\r\n var center = this.center;\r\n var angle = calculateAngle(center.x, center.y, this.radiusX, this.radiusY, point.x, point.y);\r\n if (angle !== 360) {\r\n angle = (360 + angle) % 360;\r\n }\r\n\r\n var inAngleRange = interval.startAngle <= angle && angle <= interval.endAngle;\r\n\r\n return inAngleRange && this.pointAt(angle).distanceTo(point) <= width;\r\n };\r\n\r\n Arc.fromPoints = function fromPoints (start, end, rx, ry, largeArc, swipe, rotation) {// eslint-disable-line max-params\r\n var arcParameters = normalizeArcParameters({\r\n x1: start.x,\r\n y1: start.y,\r\n x2: end.x,\r\n y2: end.y,\r\n rx: rx,\r\n ry: ry,\r\n largeArc: largeArc,\r\n swipe: swipe,\r\n rotation: rotation\r\n });\r\n\r\n return new Arc(arcParameters.center, {\r\n startAngle: arcParameters.startAngle,\r\n endAngle: arcParameters.endAngle,\r\n radiusX: arcParameters.radiusX,\r\n radiusY: arcParameters.radiusY,\r\n xRotation: arcParameters.xRotation,\r\n anticlockwise: swipe === 0\r\n });\r\n };\r\n\r\n return Arc;\r\n }(withAccessors(HasObservers, accessors)));\r\n\r\n function calculateAngle(cx, cy, rx, ry, x, y) {\r\n var cos = round((x - cx) / rx, 3);\r\n var sin = round((y - cy) / ry, 3);\r\n\r\n return round(deg(Math.atan2(sin, cos)));\r\n }\r\n\r\n function normalizeArcParameters(parameters) {\r\n var x1 = parameters.x1;\r\n var y1 = parameters.y1;\r\n var x2 = parameters.x2;\r\n var y2 = parameters.y2;\r\n var rx = parameters.rx;\r\n var ry = parameters.ry;\r\n var largeArc = parameters.largeArc;\r\n var swipe = parameters.swipe;\r\n var rotation = parameters.rotation; if (rotation === void 0) { rotation = 0; }\r\n\r\n var radians = rad(rotation);\r\n var cosine = Math.cos(radians);\r\n var sine = Math.sin(radians);\r\n\r\n var xT = cosine * (x1 - x2) / 2 + sine * (y1 - y2) / 2;\r\n var yT = -sine * (x1 - x2) / 2 + cosine * (y1 - y2) / 2;\r\n\r\n var sign = largeArc !== swipe ? 1 : -1;\r\n\r\n var xt2 = Math.pow(xT, 2);\r\n var yt2 = Math.pow(yT, 2);\r\n var rx2 = Math.pow(rx, 2);\r\n var ry2 = Math.pow(ry, 2);\r\n\r\n var delta = xt2 / rx2 + yt2 / ry2;\r\n\r\n if (delta > 1) {\r\n delta = Math.sqrt(xt2 / rx2 + yt2 / ry2);\r\n rx = delta * rx;\r\n rx2 = Math.pow(rx, 2);\r\n\r\n ry = delta * ry;\r\n ry2 = Math.pow(ry, 2);\r\n }\r\n\r\n var constT = sign * Math.sqrt((rx2 * ry2 - rx2 * yt2 - ry2 * xt2) / (rx2 * yt2 + ry2 * xt2));\r\n // due to rounding errors the value could become NaN even after radii correction\r\n if (isNaN(constT)) {\r\n constT = 0;\r\n }\r\n\r\n var cxT = constT * (rx * yT) / ry;\r\n var cyT = - constT * (ry * xT) / rx;\r\n\r\n var cx = cosine * cxT - sine * cyT + (x1 + x2) / 2;\r\n var cy = sine * cxT + cosine * cyT + (y1 + y2) / 2;\r\n\r\n var uX = (xT - cxT) / rx;\r\n var uY = (yT - cyT) / ry;\r\n var vX = -(xT + cxT) / rx;\r\n var vY = -(yT + cyT) / ry;\r\n\r\n var startAngle = (uY >= 0 ? 1 : -1) * deg(Math.acos(uX / Math.sqrt(uX * uX + uY * uY)));\r\n\r\n var angleCosine = round((uX * vX + uY * vY) / (Math.sqrt(uX * uX + uY * uY) * Math.sqrt(vX * vX + vY * vY)), 10);\r\n var angle = (uX * vY - uY * vX >= 0 ? 1 : -1) * deg(Math.acos(angleCosine));\r\n\r\n if (!swipe && angle > 0) {\r\n angle -= 360;\r\n }\r\n\r\n if (swipe && angle < 0) {\r\n angle += 360;\r\n }\r\n var endAngle = startAngle + angle;\r\n var signEndAngle = endAngle >= 0 ? 1 : -1;\r\n endAngle = (Math.abs(endAngle) % 360) * signEndAngle;\r\n\r\n return {\r\n center: new Point(cx, cy),\r\n startAngle: startAngle,\r\n endAngle: endAngle,\r\n radiusX: rx,\r\n radiusY: ry,\r\n xRotation: rotation\r\n };\r\n }\r\n\r\n function bboxStartAngle(angle, start) {\r\n var startAngle = angle;\r\n\r\n while (startAngle < start) {\r\n startAngle += 90;\r\n }\r\n\r\n return startAngle;\r\n }\r\n\r\n var push = [].push;\r\n var pop = [].pop;\r\n var splice = [].splice;\r\n var shift = [].shift;\r\n var slice = [].slice;\r\n var unshift = [].unshift;\r\n\r\n var ElementsArray = (function (HasObservers$$1) {\r\n function ElementsArray(array) {\r\n if (array === void 0) { array = []; }\r\n\r\n HasObservers$$1.call(this);\r\n\r\n this.length = 0;\r\n this._splice(0, array.length, array);\r\n }\r\n\r\n extendStatic(ElementsArray, HasObservers$$1);\r\n ElementsArray.prototype = Object.create( HasObservers$$1 && HasObservers$$1.prototype );\r\n ElementsArray.prototype.constructor = ElementsArray;\r\n ElementsArray.fn = ElementsArray.prototype;\r\n ElementsArray.fn.init = ElementsArray.fn.constructor;\r\n\r\n ElementsArray.prototype.elements = function elements (value) {\r\n if (value) {\r\n this._splice(0, this.length, value);\r\n\r\n this._change();\r\n return this;\r\n }\r\n\r\n return this.slice(0);\r\n };\r\n\r\n ElementsArray.prototype.push = function push$1 () {\r\n var elements = arguments;\r\n var result = push.apply(this, elements);\r\n\r\n this._add(elements);\r\n\r\n return result;\r\n };\r\n\r\n ElementsArray.prototype.slice = function slice$1 () {\r\n return slice.call(this);\r\n };\r\n\r\n ElementsArray.prototype.pop = function pop$1 () {\r\n var length = this.length;\r\n var result = pop.apply(this);\r\n\r\n if (length) {\r\n this._remove([ result ]);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n ElementsArray.prototype.splice = function splice$1 (index, howMany) {\r\n var elements = slice.call(arguments, 2);\r\n var result = this._splice(index, howMany, elements);\r\n\r\n this._change();\r\n\r\n return result;\r\n };\r\n\r\n ElementsArray.prototype.shift = function shift$1 () {\r\n var length = this.length;\r\n var result = shift.apply(this);\r\n\r\n if (length) {\r\n this._remove([ result ]);\r\n }\r\n\r\n return result;\r\n };\r\n\r\n ElementsArray.prototype.unshift = function unshift$1 () {\r\n var elements = arguments;\r\n var result = unshift.apply(this, elements);\r\n\r\n this._add(elements);\r\n\r\n return result;\r\n };\r\n\r\n ElementsArray.prototype.indexOf = function indexOf (element) {\r\n var this$1$1 = this;\r\n\r\n var length = this.length;\r\n\r\n for (var idx = 0; idx < length; idx++) {\r\n if (this$1$1[idx] === element) {\r\n return idx;\r\n }\r\n }\r\n return -1;\r\n };\r\n\r\n ElementsArray.prototype._splice = function _splice (index, howMany, elements) {\r\n var result = splice.apply(this, [ index, howMany ].concat(elements));\r\n\r\n this._clearObserver(result);\r\n this._setObserver(elements);\r\n\r\n return result;\r\n };\r\n\r\n ElementsArray.prototype._add = function _add (elements) {\r\n this._setObserver(elements);\r\n this._change();\r\n };\r\n\r\n ElementsArray.prototype._remove = function _remove (elements) {\r\n this._clearObserver(elements);\r\n this._change();\r\n };\r\n\r\n ElementsArray.prototype._setObserver = function _setObserver (elements) {\r\n var this$1$1 = this;\r\n\r\n for (var idx = 0; idx < elements.length; idx++) {\r\n elements[idx].addObserver(this$1$1);\r\n }\r\n };\r\n\r\n ElementsArray.prototype._clearObserver = function _clearObserver (elements) {\r\n var this$1$1 = this;\r\n\r\n for (var idx = 0; idx < elements.length; idx++) {\r\n elements[idx].removeObserver(this$1$1);\r\n }\r\n };\r\n\r\n ElementsArray.prototype._change = function _change () {};\r\n\r\n return ElementsArray;\r\n }(HasObservers));\r\n\r\n var GeometryElementsArray = (function (ElementsArray$$1) {\r\n function GeometryElementsArray () {\r\n ElementsArray$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(GeometryElementsArray, ElementsArray$$1);\r\n GeometryElementsArray.prototype = Object.create( ElementsArray$$1 && ElementsArray$$1.prototype );\r\n GeometryElementsArray.prototype.constructor = GeometryElementsArray;\r\n GeometryElementsArray.fn = GeometryElementsArray.prototype;\r\n GeometryElementsArray.fn.init = GeometryElementsArray.fn.constructor;\r\n\r\n GeometryElementsArray.prototype._change = function _change () {\r\n this.geometryChange();\r\n };\r\n\r\n return GeometryElementsArray;\r\n }(ElementsArray));\r\n\r\n function isOutOfEndPoint(endPoint, controlPoint, point) {\r\n var angle = deg(Math.atan2(controlPoint.y - endPoint.y, controlPoint.x - endPoint.x));\r\n var rotatedPoint = point.transformCopy(transform$1().rotate(-angle, endPoint));\r\n\r\n return rotatedPoint.x < endPoint.x;\r\n }\r\n\r\n function calculateCurveAt(t, field, points) {\r\n var t1 = 1 - t;\r\n return Math.pow(t1, 3) * points[0][field] +\r\n 3 * Math.pow(t1, 2) * t * points[1][field] +\r\n 3 * Math.pow(t, 2) * t1 * points[2][field] +\r\n Math.pow(t, 3) * points[3][field];\r\n }\r\n\r\n function toCubicPolynomial(points, field) {\r\n return [ -points[0][field] + 3 * points[1][field] - 3 * points[2][field] + points[3][field],\r\n 3 * (points[0][field] - 2 * points[1][field] + points[2][field]),\r\n 3 * (-points[0][field] + points[1][field]),\r\n points[0][field]\r\n ];\r\n }\r\n\r\n var ComplexNumber = (function (Class$$1) {\r\n function ComplexNumber(real, img) {\r\n if (real === void 0) { real = 0; }\r\n if (img === void 0) { img = 0; }\r\n\r\n Class$$1.call(this);\r\n\r\n this.real = real;\r\n this.img = img;\r\n }\r\n\r\n extendStatic(ComplexNumber, Class$$1);\r\n ComplexNumber.prototype = Object.create( Class$$1 && Class$$1.prototype );\r\n ComplexNumber.prototype.constructor = ComplexNumber;\r\n ComplexNumber.fn = ComplexNumber.prototype;\r\n ComplexNumber.fn.init = ComplexNumber.fn.constructor;\r\n\r\n ComplexNumber.prototype.add = function add (cNumber) {\r\n return new ComplexNumber(round(this.real + cNumber.real, PRECISION), round(this.img + cNumber.img, PRECISION));\r\n };\r\n\r\n ComplexNumber.prototype.addConstant = function addConstant (value) {\r\n return new ComplexNumber(this.real + value, this.img);\r\n };\r\n\r\n ComplexNumber.prototype.negate = function negate () {\r\n return new ComplexNumber(-this.real, -this.img);\r\n };\r\n\r\n ComplexNumber.prototype.multiply = function multiply (cNumber) {\r\n return new ComplexNumber(this.real * cNumber.real - this.img * cNumber.img,\r\n this.real * cNumber.img + this.img * cNumber.real);\r\n };\r\n\r\n ComplexNumber.prototype.multiplyConstant = function multiplyConstant (value) {\r\n return new ComplexNumber(this.real * value, this.img * value);\r\n };\r\n\r\n ComplexNumber.prototype.nthRoot = function nthRoot (n) {\r\n var rad$$1 = Math.atan2(this.img, this.real);\r\n var r = Math.sqrt(Math.pow(this.img, 2) + Math.pow(this.real, 2));\r\n var nthR = Math.pow(r, 1 / n);\r\n\r\n return new ComplexNumber(nthR * Math.cos(rad$$1 / n), nthR * Math.sin(rad$$1 / n)); //Moivre's formula\r\n };\r\n\r\n ComplexNumber.prototype.equals = function equals (cNumber) {\r\n return this.real === cNumber.real && this.img === cNumber.img;\r\n };\r\n\r\n ComplexNumber.prototype.isReal = function isReal () {\r\n return this.img === 0;\r\n };\r\n\r\n return ComplexNumber;\r\n }(Class));\r\n\r\n function numberSign$1(x) {\r\n return x < 0 ? -1 : 1;\r\n }\r\n\r\n function solveQuadraticEquation(a, b, c) {\r\n var squareRoot = Math.sqrt(Math.pow(b, 2) - 4 * a * c);\r\n return [\r\n (-b + squareRoot) / (2 * a),\r\n (-b - squareRoot) / (2 * a)\r\n ];\r\n }\r\n\r\n //Cardano's formula\r\n function solveCubicEquation(a, b, c, d) {\r\n if (a === 0) {\r\n return solveQuadraticEquation(b, c, d);\r\n }\r\n\r\n var p = (3 * a * c - Math.pow(b, 2)) / (3 * Math.pow(a, 2));\r\n var q = (2 * Math.pow(b, 3) - 9 * a * b * c + 27 * Math.pow(a, 2) * d) / (27 * Math.pow(a, 3));\r\n var Q = Math.pow(p / 3, 3) + Math.pow(q / 2, 2);\r\n var i = new ComplexNumber(0,1);\r\n var b3a = -b / (3 * a);\r\n var x1, x2, y1, y2, y3, z1, z2;\r\n\r\n if (Q < 0) {\r\n x1 = new ComplexNumber(-q / 2, Math.sqrt(-Q)).nthRoot(3);\r\n x2 = new ComplexNumber(-q / 2, - Math.sqrt(-Q)).nthRoot(3);\r\n } else {\r\n x1 = -q / 2 + Math.sqrt(Q);\r\n x1 = new ComplexNumber(numberSign$1(x1) * Math.pow(Math.abs(x1), 1 / 3));\r\n x2 = -q / 2 - Math.sqrt(Q);\r\n x2 = new ComplexNumber(numberSign$1(x2) * Math.pow(Math.abs(x2), 1 / 3));\r\n }\r\n\r\n y1 = x1.add(x2);\r\n\r\n z1 = x1.add(x2).multiplyConstant(-1 / 2);\r\n z2 = x1.add(x2.negate()).multiplyConstant(Math.sqrt(3) / 2);\r\n\r\n y2 = z1.add(i.multiply(z2));\r\n y3 = z1.add(i.negate().multiply(z2));\r\n\r\n var result = [];\r\n\r\n if (y1.isReal()) {\r\n result.push(round(y1.real + b3a, PRECISION));\r\n }\r\n if (y2.isReal()) {\r\n result.push(round(y2.real + b3a, PRECISION));\r\n }\r\n if (y3.isReal()) {\r\n result.push(round(y3.real + b3a, PRECISION));\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function hasRootsInRange(points, point, field, rootField, range) {\r\n var polynomial = toCubicPolynomial(points, rootField);\r\n var roots = solveCubicEquation(polynomial[0], polynomial[1], polynomial[2], polynomial[3] - point[rootField]);\r\n var intersection;\r\n\r\n for (var idx = 0; idx < roots.length; idx++) {\r\n if (0 <= roots[idx] && roots[idx] <= 1) {\r\n intersection = calculateCurveAt(roots[idx], field, points);\r\n if (Math.abs(intersection - point[field]) <= range) {\r\n return true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n function curveIntersectionsCount(points, point, bbox) {\r\n var polynomial = toCubicPolynomial(points, \"x\");\r\n var roots = solveCubicEquation(polynomial[0], polynomial[1], polynomial[2], polynomial[3] - point.x);\r\n var rayIntersection, intersectsRay;\r\n var count = 0;\r\n for (var i = 0; i < roots.length; i++) {\r\n rayIntersection = calculateCurveAt(roots[i], \"y\", points);\r\n intersectsRay = close$1(rayIntersection, point.y) || rayIntersection > point.y;\r\n if (intersectsRay && (((roots[i] === 0 || roots[i] === 1) && bbox.bottomRight().x > point.x) || (0 < roots[i] && roots[i] < 1))) {\r\n count++;\r\n }\r\n }\r\n\r\n return count;\r\n }\r\n\r\n function lineIntersectionsCount(a, b, point) {\r\n var intersects;\r\n if (a.x !== b.x) {\r\n var minX = Math.min(a.x, b.x);\r\n var maxX = Math.max(a.x, b.x);\r\n var minY = Math.min(a.y, b.y);\r\n var maxY = Math.max(a.y, b.y);\r\n var inRange = minX <= point.x && point.x < maxX;\r\n\r\n if (minY === maxY) {\r\n intersects = point.y <= minY && inRange;\r\n } else {\r\n intersects = inRange && (((maxY - minY) * ((a.x - b.x) * (a.y - b.y) > 0 ? point.x - minX : maxX - point.x)) / (maxX - minX) + minY - point.y) >= 0;\r\n }\r\n }\r\n\r\n return intersects ? 1 : 0;\r\n }\r\n\r\n function pointAccessor(name) {\r\n var fieldName = \"_\" + name;\r\n return function(value) {\r\n if (defined(value)) {\r\n this._observerField(fieldName, Point.create(value));\r\n this.geometryChange();\r\n return this;\r\n }\r\n\r\n return this[fieldName];\r\n };\r\n }\r\n\r\n function definePointAccessors(fn, names) {\r\n for (var i = 0; i < names.length; i++) {\r\n fn[names[i]] = pointAccessor(names[i]);\r\n }\r\n }\r\n\r\n var withPoints = function (TBase, names) {\r\n var result = (function (TBase) {\r\n function result () {\r\n TBase.apply(this, arguments);\r\n }extendStatic(result, TBase);\r\n result.prototype = Object.create( TBase && TBase.prototype );\r\n result.prototype.constructor = result;\r\n result.fn = result.prototype;\r\n result.fn.init = result.fn.constructor;\r\n\r\n return result;\r\n }(TBase));\r\n definePointAccessors(result.prototype, names);\r\n\r\n return result;\r\n };\r\n\r\n var points = [ \"anchor\", \"controlIn\", \"controlOut\" ];\r\n\r\n var Segment = (function (superclass) {\r\n function Segment(anchor, controlIn, controlOut) {\r\n superclass.call(this);\r\n\r\n this.anchor(anchor || new Point());\r\n this.controlIn(controlIn);\r\n this.controlOut(controlOut);\r\n }\r\n\r\n extendStatic(Segment, superclass);\r\n Segment.prototype = Object.create( superclass && superclass.prototype );\r\n Segment.prototype.constructor = Segment;\r\n Segment.fn = Segment.prototype;\r\n Segment.fn.init = Segment.fn.constructor;\r\n\r\n Segment.prototype.bboxTo = function bboxTo (toSegment, matrix) {\r\n var segmentAnchor = this.anchor().transformCopy(matrix);\r\n var toSegmentAnchor = toSegment.anchor().transformCopy(matrix);\r\n var rect;\r\n\r\n if (this.controlOut() && toSegment.controlIn()) {\r\n rect = this._curveBoundingBox(\r\n segmentAnchor, this.controlOut().transformCopy(matrix),\r\n toSegment.controlIn().transformCopy(matrix), toSegmentAnchor\r\n );\r\n } else {\r\n rect = this._lineBoundingBox(segmentAnchor, toSegmentAnchor);\r\n }\r\n\r\n return rect;\r\n };\r\n\r\n Segment.prototype._lineBoundingBox = function _lineBoundingBox (p1, p2) {\r\n return Rect.fromPoints(p1, p2);\r\n };\r\n\r\n Segment.prototype._curveBoundingBox = function _curveBoundingBox (p1, cp1, cp2, p2) {\r\n var points = [ p1, cp1, cp2, p2 ];\r\n var extremesX = this._curveExtremesFor(points, \"x\");\r\n var extremesY = this._curveExtremesFor(points, \"y\");\r\n var xLimits = arrayLimits([ extremesX.min, extremesX.max, p1.x, p2.x ]);\r\n var yLimits = arrayLimits([ extremesY.min, extremesY.max, p1.y, p2.y ]);\r\n\r\n return Rect.fromPoints(new Point(xLimits.min, yLimits.min), new Point(xLimits.max, yLimits.max));\r\n };\r\n\r\n Segment.prototype._curveExtremesFor = function _curveExtremesFor (points, field) {\r\n var extremes = this._curveExtremes(\r\n points[0][field], points[1][field],\r\n points[2][field], points[3][field]\r\n );\r\n\r\n return {\r\n min: calculateCurveAt(extremes.min, field, points),\r\n max: calculateCurveAt(extremes.max, field, points)\r\n };\r\n };\r\n\r\n Segment.prototype._curveExtremes = function _curveExtremes (x1, x2, x3, x4) {\r\n var a = x1 - 3 * x2 + 3 * x3 - x4;\r\n var b = - 2 * (x1 - 2 * x2 + x3);\r\n var c = x1 - x2;\r\n var sqrt = Math.sqrt(b * b - 4 * a * c);\r\n var t1 = 0;\r\n var t2 = 1;\r\n\r\n if (a === 0) {\r\n if (b !== 0) {\r\n t1 = t2 = -c / b;\r\n }\r\n } else if (!isNaN(sqrt)) {\r\n t1 = (- b + sqrt) / (2 * a);\r\n t2 = (- b - sqrt) / (2 * a);\r\n }\r\n\r\n var min = Math.max(Math.min(t1, t2), 0);\r\n if (min < 0 || min > 1) {\r\n min = 0;\r\n }\r\n\r\n var max = Math.min(Math.max(t1, t2), 1);\r\n if (max > 1 || max < 0) {\r\n max = 1;\r\n }\r\n\r\n return {\r\n min: min,\r\n max: max\r\n };\r\n };\r\n\r\n Segment.prototype._intersectionsTo = function _intersectionsTo (segment, point) {\r\n var intersectionsCount;\r\n if (this.controlOut() && segment.controlIn()) {\r\n intersectionsCount = curveIntersectionsCount([ this.anchor(), this.controlOut(), segment.controlIn(), segment.anchor() ], point, this.bboxTo(segment));\r\n } else {\r\n intersectionsCount = lineIntersectionsCount(this.anchor(), segment.anchor(), point);\r\n }\r\n return intersectionsCount;\r\n };\r\n\r\n Segment.prototype._isOnCurveTo = function _isOnCurveTo (segment, point, width, endSegment) {\r\n var bbox = this.bboxTo(segment).expand(width, width);\r\n if (bbox.containsPoint(point)) {\r\n var p1 = this.anchor();\r\n var p2 = this.controlOut();\r\n var p3 = segment.controlIn();\r\n var p4 = segment.anchor();\r\n\r\n if (endSegment === \"start\" && p1.distanceTo(point) <= width) {\r\n return !isOutOfEndPoint(p1, p2, point);\r\n } else if (endSegment === \"end\" && p4.distanceTo(point) <= width) {\r\n return !isOutOfEndPoint(p4, p3, point);\r\n }\r\n\r\n //the approach is not entirely correct but is close and the alternatives are solving a 6th degree polynomial or testing the segment points\r\n var points = [ p1, p2, p3, p4 ];\r\n if (hasRootsInRange(points, point, \"x\", \"y\", width) || hasRootsInRange(points, point, \"y\", \"x\", width)) {\r\n return true;\r\n }\r\n var rotation = transform$1().rotate(45, point);\r\n var rotatedPoints = [ p1.transformCopy(rotation), p2.transformCopy(rotation), p3.transformCopy(rotation), p4.transformCopy(rotation) ];\r\n return hasRootsInRange(rotatedPoints, point, \"x\", \"y\", width) || hasRootsInRange(rotatedPoints, point, \"y\", \"x\", width);\r\n }\r\n };\r\n\r\n Segment.prototype._isOnLineTo = function _isOnLineTo (segment, point, width) {\r\n var p1 = this.anchor();\r\n var p2 = segment.anchor();\r\n var angle = deg(Math.atan2(p2.y - p1.y, p2.x - p1.x));\r\n var rect = new Rect([ p1.x, p1.y - width / 2 ], [ p1.distanceTo(p2), width ]);\r\n return rect.containsPoint(point.transformCopy(transform$1().rotate(-angle, p1)));\r\n };\r\n\r\n Segment.prototype._isOnPathTo = function _isOnPathTo (segment, point, width, endSegment) {\r\n var isOnPath;\r\n if (this.controlOut() && segment.controlIn()) {\r\n isOnPath = this._isOnCurveTo(segment, point, width / 2, endSegment);\r\n } else {\r\n isOnPath = this._isOnLineTo(segment, point, width);\r\n }\r\n return isOnPath;\r\n };\r\n\r\n return Segment;\r\n }(withPoints(HasObservers, points)));\r\n\r\n function arrayLimits(arr) {\r\n var length = arr.length;\r\n var min = MAX_NUM;\r\n var max = MIN_NUM;\r\n\r\n for (var i = 0; i < length; i ++) {\r\n max = Math.max(max, arr[i]);\r\n min = Math.min(min, arr[i]);\r\n }\r\n\r\n return {\r\n min: min,\r\n max: max\r\n };\r\n }\r\n\r\n var geometry = {\r\n \tCircle: Circle$2,\r\n \tArc: Arc$2,\r\n \tRect: Rect,\r\n \tPoint: Point,\r\n \tSegment: Segment,\r\n \tMatrix: Matrix,\r\n \tSize: Size,\r\n \ttoMatrix: toMatrix,\r\n \tTransformation: Transformation,\r\n \ttransform: transform$1\r\n };\r\n\r\n var WEIGHT = 0.333;\r\n var EXTREMUM_ALLOWED_DEVIATION = 0.01;\r\n var X = \"x\";\r\n var Y = \"y\";\r\n\r\n function pointsToCurve(pointsIn, closed) {\r\n var points = pointsIn.slice(0);\r\n var segments = [];\r\n var length = points.length;\r\n\r\n if (length > 2) {\r\n removeDuplicates(0, points);\r\n length = points.length;\r\n }\r\n\r\n if (length < 2 || (length === 2 && points[0].equals(points[1]))) {\r\n return segments;\r\n }\r\n\r\n var p0 = points[0];\r\n var p1 = points[1];\r\n var p2 = points[2];\r\n\r\n segments.push(new Segment(p0));\r\n\r\n while (p0.equals(points[length - 1])) {\r\n closed = true;\r\n points.pop();\r\n length--;\r\n }\r\n\r\n if (length === 2) {\r\n var tangent = getTangent(p0,p1, X, Y);\r\n\r\n last(segments).controlOut(\r\n firstControlPoint(tangent, p0, p1, X, Y)\r\n );\r\n\r\n segments.push(new Segment(\r\n p1,\r\n secondControlPoint(tangent, p0, p1, X, Y)\r\n ));\r\n\r\n return segments;\r\n }\r\n\r\n var initialControlPoint, lastControlPoint;\r\n\r\n if (closed) {\r\n p0 = points[length - 1]; p1 = points[0]; p2 = points[1];\r\n var controlPoints = getControlPoints(p0, p1, p2);\r\n initialControlPoint = controlPoints[1];\r\n lastControlPoint = controlPoints[0];\r\n } else {\r\n var tangent$1 = getTangent(p0, p1, X,Y);\r\n initialControlPoint = firstControlPoint(tangent$1, p0, p1, X, Y);\r\n }\r\n\r\n var cp0 = initialControlPoint;\r\n for (var idx = 0; idx <= length - 3; idx++) {\r\n removeDuplicates(idx, points);\r\n length = points.length;\r\n if (idx + 3 <= length) {\r\n p0 = points[idx]; p1 = points[idx + 1]; p2 = points[idx + 2];\r\n var controlPoints$1 = getControlPoints(p0,p1,p2);\r\n\r\n last(segments).controlOut(cp0);\r\n cp0 = controlPoints$1[1];\r\n\r\n var cp1 = controlPoints$1[0];\r\n segments.push(new Segment(p1, cp1));\r\n }\r\n }\r\n\r\n if (closed) {\r\n p0 = points[length - 2]; p1 = points[length - 1]; p2 = points[0];\r\n var controlPoints$2 = getControlPoints(p0, p1, p2);\r\n\r\n last(segments).controlOut(cp0);\r\n segments.push(new Segment(\r\n p1,\r\n controlPoints$2[0]\r\n ));\r\n\r\n last(segments).controlOut(controlPoints$2[1]);\r\n segments.push(new Segment(\r\n p2,\r\n lastControlPoint\r\n ));\r\n } else {\r\n var tangent$2 = getTangent(p1, p2, X, Y);\r\n\r\n last(segments).controlOut(cp0);\r\n segments.push(new Segment(\r\n p2,\r\n secondControlPoint(tangent$2, p1, p2, X, Y)\r\n ));\r\n }\r\n\r\n return segments;\r\n }\r\n\r\n function removeDuplicates(idx, points) {\r\n while (points[idx + 1] && (points[idx].equals(points[idx + 1]) || points[idx + 1].equals(points[idx + 2]))) {\r\n points.splice(idx + 1, 1);\r\n }\r\n }\r\n\r\n function invertAxis(p0, p1, p2) {\r\n var invertAxis = false;\r\n\r\n if (p0.x === p1.x) {\r\n invertAxis = true;\r\n } else if (p1.x === p2.x) {\r\n if ((p1.y < p2.y && p0.y <= p1.y) || (p2.y < p1.y && p1.y <= p0.y)) {\r\n invertAxis = true;\r\n }\r\n } else {\r\n var fn = lineFunction(p0,p1);\r\n var y2 = calculateFunction(fn, p2.x);\r\n if (!(p0.y <= p1.y && p2.y <= y2) &&\r\n !(p1.y <= p0.y && p2.y >= y2)) {\r\n invertAxis = true;\r\n }\r\n }\r\n\r\n return invertAxis;\r\n }\r\n\r\n function isLine(p0, p1, p2) {\r\n var fn = lineFunction(p0, p1);\r\n var y2 = calculateFunction(fn, p2.x);\r\n\r\n return (p0.x === p1.x && p1.x === p2.x) || round(y2, 1) === round(p2.y, 1);\r\n }\r\n\r\n function lineFunction(p1, p2) {\r\n var a = (p2.y - p1.y) / (p2.x - p1.x);\r\n var b = p1.y - a * p1.x;\r\n\r\n return [ b, a ];\r\n }\r\n\r\n function getControlPoints(p0, p1, p2) {\r\n var xField = X;\r\n var yField = Y;\r\n var restrict = false;\r\n var switchOrientation = false;\r\n var tangent;\r\n\r\n if (isLine(p0, p1, p2)) {\r\n tangent = getTangent(p0, p1, X, Y);\r\n } else {\r\n var monotonic = {\r\n x: isMonotonicByField(p0, p1, p2, X),\r\n y: isMonotonicByField(p0, p1, p2, Y)\r\n };\r\n\r\n if (monotonic.x && monotonic.y) {\r\n tangent = getTangent(p0, p2, X, Y);\r\n restrict = true;\r\n } else {\r\n if (invertAxis(p0, p1, p2)) {\r\n xField = Y;\r\n yField = X;\r\n }\r\n\r\n if (monotonic[xField]) {\r\n tangent = 0;\r\n } else {\r\n var sign;\r\n if ((p2[yField] < p0[yField] && p0[yField] <= p1[yField]) ||\r\n (p0[yField] < p2[yField] && p1[yField] <= p0[yField])) {\r\n sign = numberSign((p2[yField] - p0[yField]) * (p1[xField] - p0[xField]));\r\n } else {\r\n sign = -numberSign((p2[xField] - p0[xField]) * (p1[yField] - p0[yField]));\r\n }\r\n\r\n tangent = EXTREMUM_ALLOWED_DEVIATION * sign;\r\n switchOrientation = true;\r\n }\r\n }\r\n }\r\n\r\n var secondCP = secondControlPoint(tangent, p0, p1, xField, yField);\r\n\r\n if (switchOrientation) {\r\n var oldXField = xField;\r\n xField = yField;\r\n yField = oldXField;\r\n }\r\n\r\n var firstCP = firstControlPoint(tangent, p1, p2, xField, yField);\r\n\r\n if (restrict) {\r\n restrictControlPoint(p0, p1, secondCP, tangent);\r\n restrictControlPoint(p1, p2, firstCP, tangent);\r\n }\r\n\r\n return [ secondCP, firstCP ];\r\n }\r\n\r\n function restrictControlPoint(p1, p2, cp, tangent) {\r\n if (p1.y < p2.y) {\r\n if (p2.y < cp.y) {\r\n cp.x = p1.x + (p2.y - p1.y) / tangent;\r\n cp.y = p2.y;\r\n } else if (cp.y < p1.y) {\r\n cp.x = p2.x - (p2.y - p1.y) / tangent;\r\n cp.y = p1.y;\r\n }\r\n } else {\r\n if (cp.y < p2.y) {\r\n cp.x = p1.x - (p1.y - p2.y) / tangent;\r\n cp.y = p2.y;\r\n } else if (p1.y < cp.y) {\r\n cp.x = p2.x + (p1.y - p2.y) / tangent;\r\n cp.y = p1.y;\r\n }\r\n }\r\n }\r\n\r\n function getTangent(p0, p1, xField, yField) {\r\n var x = p1[xField] - p0[xField];\r\n var y = p1[yField] - p0[yField];\r\n var tangent;\r\n\r\n if (x === 0) {\r\n tangent = 0;\r\n } else {\r\n tangent = y / x;\r\n }\r\n\r\n return tangent;\r\n }\r\n\r\n function isMonotonicByField(p0, p1, p2, field) {\r\n return (p2[field] > p1[field] && p1[field] > p0[field]) ||\r\n (p2[field] < p1[field] && p1[field] < p0[field]);\r\n }\r\n\r\n function firstControlPoint(tangent, p0, p3, xField, yField) {\r\n var t1 = p0[xField];\r\n var t2 = p3[xField];\r\n var distance = (t2 - t1) * WEIGHT;\r\n\r\n return point(t1 + distance, p0[yField] + distance * tangent, xField, yField);\r\n }\r\n\r\n function secondControlPoint(tangent, p0, p3, xField, yField) {\r\n var t1 = p0[xField];\r\n var t2 = p3[xField];\r\n var distance = (t2 - t1) * WEIGHT;\r\n\r\n return point(t2 - distance, p3[yField] - distance * tangent, xField, yField);\r\n }\r\n\r\n function point(xValue, yValue, xField, yField) {\r\n var controlPoint = new Point();\r\n controlPoint[xField] = xValue;\r\n controlPoint[yField] = yValue;\r\n\r\n return controlPoint;\r\n }\r\n\r\n function calculateFunction(fn, x) {\r\n var length = fn.length;\r\n var result = 0;\r\n\r\n for (var i = 0; i < length; i++) {\r\n result += Math.pow(x,i) * fn[i];\r\n }\r\n return result;\r\n }\r\n\r\n function numberSign(value) {\r\n return value <= 0 ? -1 : 1;\r\n }\r\n\r\n var ShapeMap = {\r\n l: function(path, options) {\r\n var parameters = options.parameters;\r\n var position = options.position;\r\n\r\n for (var i = 0; i < parameters.length; i += 2) {\r\n var point = new Point(parameters[i], parameters[i + 1]);\r\n\r\n if (options.isRelative) {\r\n point.translateWith(position);\r\n }\r\n\r\n path.lineTo(point.x, point.y);\r\n\r\n position.x = point.x;\r\n position.y = point.y;\r\n }\r\n },\r\n\r\n c: function(path, options) {\r\n var parameters = options.parameters;\r\n var position = options.position;\r\n\r\n for (var i = 0; i < parameters.length; i += 6) {\r\n var controlOut = new Point(parameters[i], parameters[i + 1]);\r\n var controlIn = new Point(parameters[i + 2], parameters[i + 3]);\r\n var point = new Point(parameters[i + 4], parameters[i + 5]);\r\n if (options.isRelative) {\r\n controlIn.translateWith(position);\r\n controlOut.translateWith(position);\r\n point.translateWith(position);\r\n }\r\n\r\n path.curveTo(controlOut, controlIn, point);\r\n\r\n position.x = point.x;\r\n position.y = point.y;\r\n }\r\n },\r\n\r\n v: function(path, options) {\r\n var value = options.isRelative ? 0 : options.position.x;\r\n\r\n toLineParamaters(options.parameters, true, value);\r\n this.l(path, options);\r\n },\r\n\r\n h: function(path, options) {\r\n var value = options.isRelative ? 0 : options.position.y;\r\n\r\n toLineParamaters(options.parameters, false, value);\r\n this.l(path, options);\r\n },\r\n\r\n a: function(path, options) {\r\n var parameters = options.parameters;\r\n var position = options.position;\r\n\r\n for (var i = 0; i < parameters.length; i += 7) {\r\n var radiusX = parameters[i];\r\n var radiusY = parameters[i + 1];\r\n var rotation = parameters[i + 2];\r\n var largeArc = parameters[i + 3];\r\n var swipe = parameters[i + 4];\r\n var endPoint = new Point(parameters[i + 5], parameters[i + 6]);\r\n\r\n if (options.isRelative) {\r\n endPoint.translateWith(position);\r\n }\r\n if (position.x !== endPoint.x || position.y !== endPoint.y) {\r\n path.arcTo(endPoint, radiusX, radiusY, largeArc, swipe, rotation);\r\n\r\n position.x = endPoint.x;\r\n position.y = endPoint.y;\r\n }\r\n }\r\n },\r\n\r\n s: function(path, options) {\r\n var parameters = options.parameters;\r\n var position = options.position;\r\n var previousCommand = options.previousCommand;\r\n var lastControlIn;\r\n\r\n if (previousCommand === \"s\" || previousCommand === \"c\") {\r\n lastControlIn = last(last(path.paths).segments).controlIn();\r\n }\r\n\r\n for (var i = 0; i < parameters.length; i += 4) {\r\n var controlIn = new Point(parameters[i], parameters[i + 1]);\r\n var endPoint = new Point(parameters[i + 2], parameters[i + 3]);\r\n var controlOut = (void 0);\r\n\r\n if (options.isRelative) {\r\n controlIn.translateWith(position);\r\n endPoint.translateWith(position);\r\n }\r\n\r\n if (lastControlIn) {\r\n controlOut = reflectionPoint(lastControlIn, position);\r\n } else {\r\n controlOut = position.clone();\r\n }\r\n\r\n lastControlIn = controlIn;\r\n\r\n path.curveTo(controlOut, controlIn, endPoint);\r\n\r\n position.x = endPoint.x;\r\n position.y = endPoint.y;\r\n }\r\n },\r\n\r\n q: function(path, options) {\r\n var parameters = options.parameters;\r\n var position = options.position;\r\n\r\n for (var i = 0; i < parameters.length; i += 4) {\r\n var controlPoint = new Point(parameters[i], parameters[i + 1]);\r\n var endPoint = new Point(parameters[i + 2], parameters[i + 3]);\r\n\r\n if (options.isRelative) {\r\n controlPoint.translateWith(position);\r\n endPoint.translateWith(position);\r\n }\r\n\r\n var cubicControlPoints = quadraticToCubicControlPoints(position, controlPoint, endPoint);\r\n\r\n path.curveTo(cubicControlPoints.controlOut, cubicControlPoints.controlIn, endPoint);\r\n\r\n position.x = endPoint.x;\r\n position.y = endPoint.y;\r\n }\r\n },\r\n\r\n t: function(path, options) {\r\n var parameters = options.parameters;\r\n var position = options.position;\r\n var previousCommand = options.previousCommand;\r\n var controlPoint;\r\n\r\n if (previousCommand === \"q\" || previousCommand === \"t\") {\r\n var lastSegment = last(last(path.paths).segments);\r\n controlPoint = lastSegment.controlIn().clone()\r\n .translateWith(position.scaleCopy(-1 / 3))\r\n .scale(3 / 2);\r\n }\r\n\r\n for (var i = 0; i < parameters.length; i += 2) {\r\n var endPoint = new Point(parameters[i], parameters[i + 1]);\r\n if (options.isRelative) {\r\n endPoint.translateWith(position);\r\n }\r\n\r\n if (controlPoint) {\r\n controlPoint = reflectionPoint(controlPoint, position);\r\n } else {\r\n controlPoint = position.clone();\r\n }\r\n\r\n var cubicControlPoints = quadraticToCubicControlPoints(position, controlPoint, endPoint);\r\n\r\n path.curveTo(cubicControlPoints.controlOut, cubicControlPoints.controlIn, endPoint);\r\n\r\n position.x = endPoint.x;\r\n position.y = endPoint.y;\r\n }\r\n }\r\n };\r\n\r\n function toLineParamaters(parameters, isVertical, value) {\r\n var insertPosition = isVertical ? 0 : 1;\r\n\r\n for (var i = 0; i < parameters.length; i += 2) {\r\n parameters.splice(i + insertPosition, 0, value);\r\n }\r\n }\r\n\r\n function reflectionPoint(point, center) {\r\n if (point && center) {\r\n return center.scaleCopy(2).translate(-point.x, -point.y);\r\n }\r\n }\r\n\r\n var third = 1 / 3;\r\n\r\n function quadraticToCubicControlPoints(position, controlPoint, endPoint) {\r\n var scaledPoint = controlPoint.clone().scale(2 / 3);\r\n return {\r\n controlOut: scaledPoint.clone().translateWith(position.scaleCopy(third)),\r\n controlIn: scaledPoint.translateWith(endPoint.scaleCopy(third))\r\n };\r\n }\r\n\r\n var SEGMENT_REGEX = /([a-df-z]{1})([^a-df-z]*)(z)?/gi;\r\n var SPLIT_REGEX = /[,\\s]?([+\\-]?(?:\\d*\\.\\d+|\\d+)(?:[eE][+\\-]?\\d+)?)/g;\r\n var MOVE = \"m\";\r\n var CLOSE = \"z\";\r\n\r\n function parseParameters(str) {\r\n var parameters = [];\r\n str.replace(SPLIT_REGEX, function(match, number) {\r\n parameters.push(parseFloat(number));\r\n });\r\n return parameters;\r\n }\r\n\r\n function parsePath(pathInstance, str) {\r\n var position = new Point();\r\n var previousCommand;\r\n\r\n str.replace(SEGMENT_REGEX, function (match, element, params, closePath) {\r\n var command = element.toLowerCase();\r\n var isRelative = command === element;\r\n var parameters = parseParameters(params.trim());\r\n\r\n if (command === MOVE) {\r\n if (isRelative) {\r\n position.x += parameters[0];\r\n position.y += parameters[1];\r\n } else {\r\n position.x = parameters[0];\r\n position.y = parameters[1];\r\n }\r\n\r\n pathInstance.moveTo(position.x, position.y);\r\n\r\n if (parameters.length > 2) {\r\n command = \"l\";\r\n parameters.splice(0, 2);\r\n }\r\n }\r\n\r\n if (ShapeMap[command]) {\r\n ShapeMap[command](\r\n pathInstance, {\r\n parameters: parameters,\r\n position: position,\r\n isRelative: isRelative,\r\n previousCommand: previousCommand\r\n }\r\n );\r\n\r\n if (closePath && closePath.toLowerCase() === CLOSE) {\r\n pathInstance.close();\r\n }\r\n } else if (command !== MOVE) {\r\n throw new Error(\"Error while parsing SVG path. Unsupported command: \" + command);\r\n }\r\n\r\n previousCommand = command;\r\n });\r\n\r\n return pathInstance;\r\n }\r\n\r\n function elementsBoundingBox(elements, applyTransform, transformation) {\r\n var boundingBox;\r\n\r\n for (var i = 0; i < elements.length; i++) {\r\n var element = elements[i];\r\n if (element.visible()) {\r\n var elementBoundingBox = applyTransform ? element.bbox(transformation) : element.rawBBox();\r\n if (elementBoundingBox) {\r\n if (boundingBox) {\r\n boundingBox = Rect.union(boundingBox, elementBoundingBox);\r\n } else {\r\n boundingBox = elementBoundingBox;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return boundingBox;\r\n }\r\n\r\n function elementsClippedBoundingBox(elements, transformation) {\r\n var boundingBox;\r\n\r\n for (var i = 0; i < elements.length; i++) {\r\n var element = elements[i];\r\n if (element.visible()) {\r\n var elementBoundingBox = element.clippedBBox(transformation);\r\n if (elementBoundingBox) {\r\n if (boundingBox) {\r\n boundingBox = Rect.union(boundingBox, elementBoundingBox);\r\n } else {\r\n boundingBox = elementBoundingBox;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return boundingBox;\r\n }\r\n\r\n var SPACE = ' ';\r\n var printPoints = function (precision) { return function () {\r\n var points = [], len = arguments.length;\r\n while ( len-- ) points[ len ] = arguments[ len ];\r\n\r\n return points.map(function (p) { return p.toString(precision); }).join(SPACE);\r\n } };\r\n var segmentType = function (segmentStart, segmentEnd) { return segmentStart.controlOut() && segmentEnd.controlIn() ? 'C' : 'L'; };\r\n\r\n var Path = (function (superclass) {\r\n function Path(options) {\r\n superclass.call(this, options);\r\n this.segments = new GeometryElementsArray();\r\n this.segments.addObserver(this);\r\n\r\n if (!defined(this.options.stroke)) {\r\n this.stroke('#000');\r\n\r\n if (!defined(this.options.stroke.lineJoin)) {\r\n this.options.set('stroke.lineJoin', 'miter');\r\n }\r\n }\r\n }\r\n\r\n extendStatic(Path, superclass);\r\n Path.prototype = Object.create( superclass && superclass.prototype );\r\n Path.prototype.constructor = Path;\r\n Path.fn = Path.prototype;\r\n Path.fn.init = Path.fn.constructor;\r\n\r\n var prototypeAccessors = { nodeType: {} };\r\n\r\n prototypeAccessors.nodeType.get = function () {\r\n return 'Path';\r\n };\r\n\r\n Path.prototype.moveTo = function moveTo (x, y) {\r\n this.suspend();\r\n this.segments.elements([]);\r\n this.resume();\r\n\r\n this.lineTo(x, y);\r\n\r\n return this;\r\n };\r\n\r\n Path.prototype.lineTo = function lineTo (x, y) {\r\n var point$$1 = defined(y) ? new Point(x, y) : x;\r\n var segment = new Segment(point$$1);\r\n\r\n this.segments.push(segment);\r\n\r\n return this;\r\n };\r\n\r\n Path.prototype.curveTo = function curveTo (controlOut, controlIn, point$$1) {\r\n if (this.segments.length > 0) {\r\n var lastSegment = last(this.segments);\r\n var segment = new Segment(point$$1, controlIn);\r\n this.suspend();\r\n lastSegment.controlOut(controlOut);\r\n this.resume();\r\n\r\n this.segments.push(segment);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n Path.prototype.arc = function arc (startAngle, endAngle, radiusX, radiusY, anticlockwise) {\r\n if (this.segments.length > 0) {\r\n var lastSegment = last(this.segments);\r\n var anchor = lastSegment.anchor();\r\n var start = rad(startAngle);\r\n var center = new Point(anchor.x - radiusX * Math.cos(start),\r\n anchor.y - radiusY * Math.sin(start));\r\n var arc = new Arc$2(center, {\r\n startAngle: startAngle,\r\n endAngle: endAngle,\r\n radiusX: radiusX,\r\n radiusY: radiusY,\r\n anticlockwise: anticlockwise\r\n });\r\n\r\n this._addArcSegments(arc);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n Path.prototype.arcTo = function arcTo (end, rx, ry, largeArc, swipe, rotation) {\r\n if (this.segments.length > 0) {\r\n var lastSegment = last(this.segments);\r\n var anchor = lastSegment.anchor();\r\n var arc = Arc$2.fromPoints(anchor, Point.create(end), rx, ry, largeArc, swipe, rotation);\r\n\r\n this._addArcSegments(arc);\r\n }\r\n return this;\r\n };\r\n\r\n Path.prototype._addArcSegments = function _addArcSegments (arc) {\r\n var this$1$1 = this;\r\n\r\n this.suspend();\r\n\r\n var curvePoints = arc.curvePoints();\r\n\r\n for (var i = 1; i < curvePoints.length; i += 3) {\r\n this$1$1.curveTo(curvePoints[i], curvePoints[i + 1], curvePoints[i + 2]);\r\n }\r\n\r\n this.resume();\r\n this.geometryChange();\r\n };\r\n\r\n Path.prototype.close = function close () {\r\n this.options.closed = true;\r\n this.geometryChange();\r\n\r\n return this;\r\n };\r\n\r\n Path.prototype.rawBBox = function rawBBox () {\r\n return this._bbox();\r\n };\r\n\r\n Path.prototype.toString = function toString (digits) {\r\n var output = '';\r\n\r\n var segments = this.segments;\r\n var length = segments.length;\r\n if (length > 0) {\r\n var parts = [];\r\n var print = printPoints(digits);\r\n var currentType;\r\n\r\n for (var i = 1; i < length; i++) {\r\n var type = segmentType(segments[i - 1], segments[i]);\r\n if (type !== currentType) {\r\n currentType = type;\r\n parts.push(type);\r\n }\r\n\r\n if (type === 'L') {\r\n parts.push(print(segments[i].anchor()));\r\n } else {\r\n parts.push(print(\r\n segments[i - 1].controlOut(), segments[i].controlIn(), segments[i].anchor()\r\n ));\r\n }\r\n }\r\n\r\n output = 'M' + print(segments[0].anchor()) + SPACE + parts.join(SPACE);\r\n if (this.options.closed) {\r\n output += 'Z';\r\n }\r\n }\r\n\r\n return output;\r\n };\r\n\r\n Path.prototype._containsPoint = function _containsPoint (point$$1) {\r\n var segments = this.segments;\r\n var length = segments.length;\r\n var intersectionsCount = 0;\r\n var previous, current;\r\n\r\n for (var idx = 1; idx < length; idx++) {\r\n previous = segments[idx - 1];\r\n current = segments[idx];\r\n intersectionsCount += previous._intersectionsTo(current, point$$1);\r\n }\r\n\r\n if (this.options.closed || !segments[0].anchor().equals(segments[length - 1].anchor())) {\r\n intersectionsCount += lineIntersectionsCount(segments[0].anchor(), segments[length - 1].anchor(), point$$1);\r\n }\r\n\r\n return intersectionsCount % 2 !== 0;\r\n };\r\n\r\n Path.prototype._isOnPath = function _isOnPath (point$$1, width) {\r\n var segments = this.segments;\r\n var length = segments.length;\r\n var pathWidth = width || this.options.stroke.width;\r\n\r\n if (length > 1) {\r\n if (segments[0]._isOnPathTo(segments[1], point$$1, pathWidth, 'start')) {\r\n return true;\r\n }\r\n\r\n for (var idx = 2; idx <= length - 2; idx++) {\r\n if (segments[idx - 1]._isOnPathTo(segments[idx], point$$1, pathWidth)) {\r\n return true;\r\n }\r\n }\r\n\r\n if (segments[length - 2]._isOnPathTo(segments[length - 1], point$$1, pathWidth, 'end')) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n Path.prototype._bbox = function _bbox (matrix) {\r\n var segments = this.segments;\r\n var length = segments.length;\r\n var boundingBox;\r\n\r\n if (length === 1) {\r\n var anchor = segments[0].anchor().transformCopy(matrix);\r\n boundingBox = new Rect(anchor, Size.ZERO);\r\n } else if (length > 0) {\r\n for (var i = 1; i < length; i++) {\r\n var segmentBox = segments[i - 1].bboxTo(segments[i], matrix);\r\n if (boundingBox) {\r\n boundingBox = Rect.union(boundingBox, segmentBox);\r\n } else {\r\n boundingBox = segmentBox;\r\n }\r\n }\r\n }\r\n\r\n return boundingBox;\r\n };\r\n\r\n Path.parse = function parse (str, options) {\r\n return MultiPath.parse(str, options);\r\n };\r\n\r\n Path.fromRect = function fromRect (rect, options) {\r\n var path = new Path(options);\r\n var ref = rect.cornerRadius;\r\n var rx = ref[0];\r\n var ry = ref[1];\r\n\r\n if (rx === 0 && ry === 0) {\r\n path.moveTo(rect.topLeft())\r\n .lineTo(rect.topRight())\r\n .lineTo(rect.bottomRight())\r\n .lineTo(rect.bottomLeft())\r\n .close();\r\n } else {\r\n var origin = rect.origin;\r\n var x = origin.x;\r\n var y = origin.y;\r\n var width = rect.width();\r\n var height = rect.height();\r\n rx = limitValue(rx, 0, width / 2);\r\n ry = limitValue(ry, 0, height / 2);\r\n\r\n path.moveTo(x + rx, y)\r\n .lineTo(x + width - rx, y)\r\n .arcTo([ x + width, y + ry ], rx, ry, false)\r\n .lineTo(x + width, y + height - ry)\r\n .arcTo([ x + width - rx, y + height ], rx, ry, false)\r\n .lineTo(x + rx, y + height)\r\n .arcTo([ x, y + height - ry ], rx, ry, false)\r\n .lineTo(x, y + ry)\r\n .arcTo([ x + rx, y ], rx, ry, false);\r\n }\r\n\r\n return path;\r\n };\r\n\r\n Path.fromPoints = function fromPoints (points, options) {\r\n if (points) {\r\n var path = new Path(options);\r\n\r\n for (var i = 0; i < points.length; i++) {\r\n var point$$1 = Point.create(points[i]);\r\n if (point$$1) {\r\n if (i === 0) {\r\n path.moveTo(point$$1);\r\n } else {\r\n path.lineTo(point$$1);\r\n }\r\n }\r\n }\r\n\r\n return path;\r\n }\r\n };\r\n\r\n Path.curveFromPoints = function curveFromPoints (points, options) {\r\n if (points) {\r\n var segments = pointsToCurve(points);\r\n var path = new Path(options);\r\n path.segments.push.apply(path.segments, segments);\r\n\r\n return path;\r\n }\r\n };\r\n\r\n Path.fromArc = function fromArc (arc, options) {\r\n var path = new Path(options);\r\n var startAngle = arc.startAngle;\r\n var start = arc.pointAt(startAngle);\r\n path.moveTo(start.x, start.y);\r\n path.arc(startAngle, arc.endAngle, arc.radiusX, arc.radiusY, arc.anticlockwise);\r\n return path;\r\n };\r\n\r\n Object.defineProperties( Path.prototype, prototypeAccessors );\r\n\r\n return Path;\r\n }(paintable(measurable(Element$1))));\r\n\r\n var MultiPath = (function (superclass) {\r\n function MultiPath(options) {\r\n superclass.call(this, options);\r\n this.paths = new GeometryElementsArray();\r\n this.paths.addObserver(this);\r\n\r\n if (!defined(this.options.stroke)) {\r\n this.stroke('#000');\r\n }\r\n }\r\n\r\n extendStatic(MultiPath, superclass);\r\n MultiPath.prototype = Object.create( superclass && superclass.prototype );\r\n MultiPath.prototype.constructor = MultiPath;\r\n MultiPath.fn = MultiPath.prototype;\r\n MultiPath.fn.init = MultiPath.fn.constructor;\r\n\r\n var prototypeAccessors$1 = { nodeType: {} };\r\n\r\n MultiPath.parse = function parse (str, options) {\r\n var instance = new MultiPath(options);\r\n return parsePath(instance, str);\r\n };\r\n\r\n MultiPath.prototype.toString = function toString (digits) {\r\n var paths = this.paths;\r\n var output = '';\r\n\r\n if (paths.length > 0) {\r\n var result = [];\r\n\r\n for (var i = 0; i < paths.length; i++) {\r\n result.push(paths[i].toString(digits));\r\n }\r\n\r\n output = result.join(SPACE);\r\n }\r\n\r\n return output;\r\n };\r\n\r\n prototypeAccessors$1.nodeType.get = function () {\r\n return 'MultiPath';\r\n };\r\n\r\n MultiPath.prototype.moveTo = function moveTo (x, y) {\r\n var path = new Path();\r\n path.moveTo(x, y);\r\n\r\n this.paths.push(path);\r\n\r\n return this;\r\n };\r\n\r\n MultiPath.prototype.lineTo = function lineTo (x, y) {\r\n if (this.paths.length > 0) {\r\n last(this.paths).lineTo(x, y);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n MultiPath.prototype.curveTo = function curveTo (controlOut, controlIn, point$$1) {\r\n if (this.paths.length > 0) {\r\n last(this.paths).curveTo(controlOut, controlIn, point$$1);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n MultiPath.prototype.arc = function arc (startAngle, endAngle, radiusX, radiusY, anticlockwise) {\r\n if (this.paths.length > 0) {\r\n last(this.paths).arc(startAngle, endAngle, radiusX, radiusY, anticlockwise);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n MultiPath.prototype.arcTo = function arcTo (end, rx, ry, largeArc, swipe, rotation) {\r\n if (this.paths.length > 0) {\r\n last(this.paths).arcTo(end, rx, ry, largeArc, swipe, rotation);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n MultiPath.prototype.close = function close () {\r\n if (this.paths.length > 0) {\r\n last(this.paths).close();\r\n }\r\n\r\n return this;\r\n };\r\n\r\n MultiPath.prototype._bbox = function _bbox (matrix) {\r\n return elementsBoundingBox(this.paths, true, matrix);\r\n };\r\n\r\n MultiPath.prototype.rawBBox = function rawBBox () {\r\n return elementsBoundingBox(this.paths, false);\r\n };\r\n\r\n MultiPath.prototype._containsPoint = function _containsPoint (point$$1) {\r\n var paths = this.paths;\r\n\r\n for (var idx = 0; idx < paths.length; idx++) {\r\n if (paths[idx]._containsPoint(point$$1)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n MultiPath.prototype._isOnPath = function _isOnPath (point$$1) {\r\n var paths = this.paths;\r\n var width = this.options.stroke.width;\r\n\r\n for (var idx = 0; idx < paths.length; idx++) {\r\n if (paths[idx]._isOnPath(point$$1, width)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n MultiPath.prototype._clippedBBox = function _clippedBBox (transformation) {\r\n return elementsClippedBoundingBox(this.paths, this.currentTransform(transformation));\r\n };\r\n\r\n Object.defineProperties( MultiPath.prototype, prototypeAccessors$1 );\r\n\r\n return MultiPath;\r\n }(paintable(measurable(Element$1))));\r\n\r\n var DEFAULT_STROKE$1 = \"#000\";\r\n\r\n var Arc = (function (superclass) {\r\n function Arc(geometry, options) {\r\n if (geometry === void 0) { geometry = new Arc$2(); }\r\n if (options === void 0) { options = {}; }\r\n\r\n superclass.call(this, options);\r\n\r\n this.geometry(geometry);\r\n\r\n if (!defined(this.options.stroke)) {\r\n this.stroke(DEFAULT_STROKE$1);\r\n }\r\n }\r\n\r\n extendStatic(Arc, superclass);\r\n Arc.prototype = Object.create( superclass && superclass.prototype );\r\n Arc.prototype.constructor = Arc;\r\n Arc.fn = Arc.prototype;\r\n Arc.fn.init = Arc.fn.constructor;\r\n\r\n var prototypeAccessors = { nodeType: {} };\r\n\r\n prototypeAccessors.nodeType.get = function () {\r\n return \"Arc\";\r\n };\r\n\r\n Arc.prototype._bbox = function _bbox (matrix) {\r\n return this._geometry.bbox(matrix);\r\n };\r\n\r\n Arc.prototype.rawBBox = function rawBBox () {\r\n return this.geometry().bbox();\r\n };\r\n\r\n Arc.prototype.toPath = function toPath () {\r\n var path = new Path();\r\n var curvePoints = this.geometry().curvePoints();\r\n\r\n if (curvePoints.length > 0) {\r\n path.moveTo(curvePoints[0].x, curvePoints[0].y);\r\n\r\n for (var i = 1; i < curvePoints.length; i += 3) {\r\n path.curveTo(curvePoints[i], curvePoints[i + 1], curvePoints[i + 2]);\r\n }\r\n }\r\n\r\n return path;\r\n };\r\n\r\n Arc.prototype._containsPoint = function _containsPoint (point) {\r\n return this.geometry().containsPoint(point);\r\n };\r\n\r\n Arc.prototype._isOnPath = function _isOnPath (point) {\r\n return this.geometry()._isOnPath(point, this.options.stroke.width / 2);\r\n };\r\n\r\n Object.defineProperties( Arc.prototype, prototypeAccessors );\r\n\r\n return Arc;\r\n }(paintable(measurable(withGeometry(Element$1)))));\r\n\r\n var DEFAULT_FONT = \"12px sans-serif\";\r\n var DEFAULT_FILL = \"#000\";\r\n\r\n var Text = (function (superclass) {\r\n function Text(content, position, options) {\r\n if (position === void 0) { position = new Point(); }\r\n if (options === void 0) { options = {}; }\r\n\r\n superclass.call(this, options);\r\n\r\n this.content(content);\r\n this.position(position);\r\n\r\n if (!this.options.font) {\r\n this.options.font = DEFAULT_FONT;\r\n }\r\n\r\n if (!defined(this.options.fill)) {\r\n this.fill(DEFAULT_FILL);\r\n }\r\n }\r\n\r\n extendStatic(Text, superclass);\r\n Text.prototype = Object.create( superclass && superclass.prototype );\r\n Text.prototype.constructor = Text;\r\n Text.fn = Text.prototype;\r\n Text.fn.init = Text.fn.constructor;\r\n\r\n var prototypeAccessors = { nodeType: {} };\r\n\r\n prototypeAccessors.nodeType.get = function () {\r\n return \"Text\";\r\n };\r\n\r\n Text.prototype.content = function content (value) {\r\n if (defined(value)) {\r\n this.options.set(\"content\", value);\r\n return this;\r\n }\r\n\r\n return this.options.get(\"content\");\r\n };\r\n\r\n Text.prototype.measure = function measure () {\r\n var metrics = kendoUtil.measureText(this.content(), {\r\n font: this.options.get(\"font\")\r\n });\r\n\r\n return metrics;\r\n };\r\n\r\n Text.prototype.rect = function rect () {\r\n var size = this.measure();\r\n var pos = this.position().clone();\r\n return new Rect(pos, [ size.width, size.height ]);\r\n };\r\n\r\n Text.prototype.bbox = function bbox (transformation) {\r\n var combinedMatrix = toMatrix(this.currentTransform(transformation));\r\n return this.rect().bbox(combinedMatrix);\r\n };\r\n\r\n Text.prototype.rawBBox = function rawBBox () {\r\n return this.rect().bbox();\r\n };\r\n\r\n Text.prototype._containsPoint = function _containsPoint (point) {\r\n return this.rect().containsPoint(point);\r\n };\r\n\r\n Object.defineProperties( Text.prototype, prototypeAccessors );\r\n\r\n return Text;\r\n }(paintable(withPoints(Element$1, [ \"position\" ]))));\r\n\r\n var Image$1 = (function (superclass) {\r\n function Image(src, rect, options) {\r\n if (rect === void 0) { rect = new Rect(); }\r\n if (options === void 0) { options = {}; }\r\n\r\n superclass.call(this, options);\r\n\r\n this.src(src);\r\n this.rect(rect);\r\n }\r\n\r\n extendStatic(Image, superclass);\r\n Image.prototype = Object.create( superclass && superclass.prototype );\r\n Image.prototype.constructor = Image;\r\n Image.fn = Image.prototype;\r\n Image.fn.init = Image.fn.constructor;\r\n\r\n var prototypeAccessors = { nodeType: {} };\r\n\r\n prototypeAccessors.nodeType.get = function () {\r\n return \"Image\";\r\n };\r\n\r\n Image.prototype.src = function src (value) {\r\n if (defined(value)) {\r\n this.options.set(\"src\", value);\r\n return this;\r\n }\r\n\r\n return this.options.get(\"src\");\r\n };\r\n\r\n Image.prototype.bbox = function bbox (transformation) {\r\n var combinedMatrix = toMatrix(this.currentTransform(transformation));\r\n return this._rect.bbox(combinedMatrix);\r\n };\r\n\r\n Image.prototype.rawBBox = function rawBBox () {\r\n return this._rect.bbox();\r\n };\r\n\r\n Image.prototype._containsPoint = function _containsPoint (point) {\r\n return this._rect.containsPoint(point);\r\n };\r\n\r\n Image.prototype._hasFill = function _hasFill () {\r\n return this.src();\r\n };\r\n\r\n Object.defineProperties( Image.prototype, prototypeAccessors );\r\n\r\n return Image;\r\n }(withGeometry(Element$1, [ \"rect\" ])));\r\n\r\n var traversable = function (TBase, childrenField) { return (\r\n (function (TBase) {\r\n function anonymous () {\r\n TBase.apply(this, arguments);\r\n }\r\n\r\n extendStatic(anonymous, TBase);\r\n anonymous.prototype = Object.create( TBase && TBase.prototype );\r\n anonymous.prototype.constructor = anonymous;\r\n anonymous.fn = anonymous.prototype;\r\n anonymous.fn.init = anonymous.fn.constructor;\r\n\r\n anonymous.prototype.traverse = function traverse (callback) {\r\n var children = this[childrenField];\r\n\r\n for (var i = 0; i < children.length; i++) {\r\n var child = children[i];\r\n\r\n if (child.traverse) {\r\n child.traverse(callback);\r\n } else {\r\n callback(child);\r\n }\r\n }\r\n\r\n return this;\r\n };\r\n\r\n return anonymous;\r\n }(TBase))\r\n ); };\r\n\r\n var Group = (function (superclass) {\r\n function Group(options) {\r\n superclass.call(this, options);\r\n this.children = [];\r\n }\r\n\r\n extendStatic(Group, superclass);\r\n Group.prototype = Object.create( superclass && superclass.prototype );\r\n Group.prototype.constructor = Group;\r\n Group.fn = Group.prototype;\r\n Group.fn.init = Group.fn.constructor;\r\n\r\n var prototypeAccessors = { nodeType: {} };\r\n\r\n prototypeAccessors.nodeType.get = function () {\r\n return \"Group\";\r\n };\r\n\r\n Group.prototype.childrenChange = function childrenChange (action, items, index) {\r\n this.trigger(\"childrenChange\",{\r\n action: action,\r\n items: items,\r\n index: index\r\n });\r\n };\r\n\r\n Group.prototype.append = function append$1 () {\r\n append$1$1(this.children, arguments);\r\n this._reparent(arguments, this);\r\n\r\n this.childrenChange(\"add\", arguments);\r\n\r\n return this;\r\n };\r\n\r\n Group.prototype.insert = function insert (index, element) {\r\n this.children.splice(index, 0, element);\r\n element.parent = this;\r\n\r\n this.childrenChange(\"add\", [ element ], index);\r\n\r\n return this;\r\n };\r\n\r\n Group.prototype.insertAt = function insertAt (element, index) {\r\n return this.insert(index, element);\r\n };\r\n\r\n Group.prototype.remove = function remove (element) {\r\n var index = this.children.indexOf(element);\r\n if (index >= 0) {\r\n this.children.splice(index, 1);\r\n element.parent = null;\r\n this.childrenChange(\"remove\", [ element ], index);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n Group.prototype.removeAt = function removeAt (index) {\r\n if (0 <= index && index < this.children.length) {\r\n var element = this.children[index];\r\n this.children.splice(index, 1);\r\n element.parent = null;\r\n this.childrenChange(\"remove\", [ element ], index);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n Group.prototype.clear = function clear () {\r\n var items = this.children;\r\n this.children = [];\r\n this._reparent(items, null);\r\n\r\n this.childrenChange(\"remove\", items, 0);\r\n\r\n return this;\r\n };\r\n\r\n Group.prototype.bbox = function bbox (transformation) {\r\n return elementsBoundingBox(this.children, true, this.currentTransform(transformation));\r\n };\r\n\r\n Group.prototype.rawBBox = function rawBBox () {\r\n return elementsBoundingBox(this.children, false);\r\n };\r\n\r\n Group.prototype._clippedBBox = function _clippedBBox (transformation) {\r\n return elementsClippedBoundingBox(this.children, this.currentTransform(transformation));\r\n };\r\n\r\n Group.prototype.currentTransform = function currentTransform (transformation) {\r\n return Element$1.prototype.currentTransform.call(this, transformation) || null;\r\n };\r\n\r\n Group.prototype.containsPoint = function containsPoint (point, parentTransform) {\r\n if (this.visible()) {\r\n var children = this.children;\r\n var transform = this.currentTransform(parentTransform);\r\n for (var idx = 0; idx < children.length; idx++) {\r\n if (children[idx].containsPoint(point, transform)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n Group.prototype._reparent = function _reparent (elements, newParent) {\r\n var this$1$1 = this;\r\n\r\n for (var i = 0; i < elements.length; i++) {\r\n var child = elements[i];\r\n var parent = child.parent;\r\n if (parent && parent !== this$1$1 && parent.remove) {\r\n parent.remove(child);\r\n }\r\n\r\n child.parent = newParent;\r\n }\r\n };\r\n\r\n Object.defineProperties( Group.prototype, prototypeAccessors );\r\n\r\n return Group;\r\n }(traversable(Element$1, \"children\")));\r\n\r\n function translateToPoint(point, bbox, element) {\r\n var transofrm = element.transform() || transform$1();\r\n var matrix = transofrm.matrix();\r\n matrix.e += point.x - bbox.origin.x;\r\n matrix.f += point.y - bbox.origin.y;\r\n\r\n transofrm.matrix(matrix);\r\n element.transform(transofrm);\r\n }\r\n\r\n function alignStart(size, rect, align, axis, sizeField) {\r\n var start;\r\n if (align === \"start\") {\r\n start = rect.origin[axis];\r\n } else if (align === \"end\") {\r\n start = rect.origin[axis] + rect.size[sizeField] - size;\r\n } else {\r\n start = rect.origin[axis] + (rect.size[sizeField] - size) / 2;\r\n }\r\n\r\n return start;\r\n }\r\n\r\n function alignStartReverse(size, rect, align, axis, sizeField) {\r\n var start;\r\n if (align === \"start\") {\r\n start = rect.origin[axis] + rect.size[sizeField] - size;\r\n } else if (align === \"end\") {\r\n start = rect.origin[axis];\r\n } else {\r\n start = rect.origin[axis] + (rect.size[sizeField] - size) / 2;\r\n }\r\n\r\n return start;\r\n }\r\n\r\n var DEFAULT_OPTIONS = {\r\n alignContent: \"start\",\r\n justifyContent: \"start\",\r\n alignItems: \"start\",\r\n spacing: 0,\r\n orientation: \"horizontal\",\r\n lineSpacing: 0,\r\n wrap: true,\r\n revers: false\r\n };\r\n\r\n var forEach = function (elements, callback) {\r\n elements.forEach(callback);\r\n };\r\n\r\n var forEachReverse = function (elements, callback) {\r\n var length = elements.length;\r\n\r\n for (var idx = length - 1; idx >= 0; idx--) {\r\n callback(elements[idx], idx);\r\n }\r\n };\r\n\r\n var Layout = (function (Group$$1) {\r\n function Layout(rect, options) {\r\n Group$$1.call(this, $.extend({}, DEFAULT_OPTIONS, options));\r\n this._rect = rect;\r\n this._fieldMap = {};\r\n }\r\n\r\n extendStatic(Layout, Group$$1);\r\n Layout.prototype = Object.create( Group$$1 && Group$$1.prototype );\r\n Layout.prototype.constructor = Layout;\r\n Layout.fn = Layout.prototype;\r\n Layout.fn.init = Layout.fn.constructor;\r\n\r\n Layout.prototype.rect = function rect (value) {\r\n if (value) {\r\n this._rect = value;\r\n return this;\r\n }\r\n\r\n return this._rect;\r\n };\r\n\r\n Layout.prototype._initMap = function _initMap () {\r\n var options = this.options;\r\n var fieldMap = this._fieldMap;\r\n if (options.orientation === \"horizontal\") {\r\n fieldMap.sizeField = \"width\";\r\n fieldMap.groupsSizeField = \"height\";\r\n fieldMap.groupAxis = \"x\";\r\n fieldMap.groupsAxis = \"y\";\r\n } else {\r\n fieldMap.sizeField = \"height\";\r\n fieldMap.groupsSizeField = \"width\";\r\n fieldMap.groupAxis = \"y\";\r\n fieldMap.groupsAxis = \"x\";\r\n }\r\n\r\n if (options.reverse) {\r\n this.forEach = forEachReverse;\r\n this.justifyAlign = alignStartReverse;\r\n } else {\r\n this.forEach = forEach;\r\n this.justifyAlign = alignStart;\r\n }\r\n };\r\n\r\n Layout.prototype.reflow = function reflow () {\r\n var this$1$1 = this;\r\n\r\n if (!this._rect || this.children.length === 0) {\r\n return;\r\n }\r\n this._initMap();\r\n\r\n if (this.options.transform) {\r\n this.transform(null);\r\n }\r\n\r\n var options = this.options;\r\n var rect = this._rect;\r\n var ref = this._initGroups();\r\n var groups = ref.groups;\r\n var groupsSize = ref.groupsSize;\r\n var ref$1 = this._fieldMap;\r\n var sizeField = ref$1.sizeField;\r\n var groupsSizeField = ref$1.groupsSizeField;\r\n var groupAxis = ref$1.groupAxis;\r\n var groupsAxis = ref$1.groupsAxis;\r\n var groupOrigin = new Point();\r\n var elementOrigin = new Point();\r\n var size = new Size();\r\n var groupStart = alignStart(groupsSize, rect, options.alignContent, groupsAxis, groupsSizeField);\r\n var elementStart, group, groupBox;\r\n\r\n var arrangeElements = function (bbox, idx) {\r\n var element = group.elements[idx];\r\n\r\n elementOrigin[groupAxis] = elementStart;\r\n elementOrigin[groupsAxis] = alignStart(bbox.size[groupsSizeField], groupBox, options.alignItems, groupsAxis, groupsSizeField);\r\n translateToPoint(elementOrigin, bbox, element);\r\n elementStart += bbox.size[sizeField] + options.spacing;\r\n };\r\n\r\n for (var groupIdx = 0; groupIdx < groups.length; groupIdx++) {\r\n group = groups[groupIdx];\r\n groupOrigin[groupAxis] = elementStart = this$1$1.justifyAlign(group.size, rect, options.justifyContent, groupAxis, sizeField);\r\n groupOrigin[groupsAxis] = groupStart;\r\n size[sizeField] = group.size;\r\n size[groupsSizeField] = group.lineSize;\r\n groupBox = new Rect(groupOrigin, size);\r\n this$1$1.forEach(group.bboxes, arrangeElements);\r\n\r\n groupStart += group.lineSize + options.lineSpacing;\r\n }\r\n\r\n if (!options.wrap && group.size > rect.size[sizeField]) {\r\n var scale = rect.size[sizeField] / groupBox.size[sizeField];\r\n var scaledStart = groupBox.topLeft().scale(scale, scale);\r\n var scaledSize = groupBox.size[groupsSizeField] * scale;\r\n var newStart = alignStart(scaledSize, rect, options.alignContent, groupsAxis, groupsSizeField);\r\n var transform = transform$1();\r\n if (groupAxis === \"x\") {\r\n transform.translate(rect.origin.x - scaledStart.x, newStart - scaledStart.y);\r\n } else {\r\n transform.translate(newStart - scaledStart.x, rect.origin.y - scaledStart.y);\r\n }\r\n transform.scale(scale, scale);\r\n\r\n this.transform(transform);\r\n }\r\n };\r\n\r\n Layout.prototype._initGroups = function _initGroups () {\r\n var this$1$1 = this;\r\n\r\n var ref = this;\r\n var options = ref.options;\r\n var children = ref.children;\r\n var lineSpacing = options.lineSpacing;\r\n var wrap = options.wrap;\r\n var spacing = options.spacing;\r\n var sizeField = this._fieldMap.sizeField;\r\n var group = this._newGroup();\r\n var groups = [];\r\n var addGroup = function() {\r\n groups.push(group);\r\n groupsSize += group.lineSize + lineSpacing;\r\n };\r\n var groupsSize = -lineSpacing;\r\n\r\n for (var idx = 0; idx < children.length; idx++) {\r\n var element = children[idx];\r\n var bbox = children[idx].clippedBBox();\r\n if (element.visible() && bbox) {\r\n if (wrap && group.size + bbox.size[sizeField] + spacing > this$1$1._rect.size[sizeField]) {\r\n if (group.bboxes.length === 0) {\r\n this$1$1._addToGroup(group, bbox, element);\r\n addGroup();\r\n group = this$1$1._newGroup();\r\n } else {\r\n addGroup();\r\n group = this$1$1._newGroup();\r\n this$1$1._addToGroup(group, bbox, element);\r\n }\r\n } else {\r\n this$1$1._addToGroup(group, bbox, element);\r\n }\r\n }\r\n }\r\n\r\n if (group.bboxes.length) {\r\n addGroup();\r\n }\r\n\r\n return {\r\n groups: groups,\r\n groupsSize: groupsSize\r\n };\r\n };\r\n\r\n Layout.prototype._addToGroup = function _addToGroup (group, bbox, element) {\r\n group.size += bbox.size[this._fieldMap.sizeField] + this.options.spacing;\r\n group.lineSize = Math.max(bbox.size[this._fieldMap.groupsSizeField], group.lineSize);\r\n group.bboxes.push(bbox);\r\n group.elements.push(element);\r\n };\r\n\r\n Layout.prototype._newGroup = function _newGroup () {\r\n return {\r\n lineSize: 0,\r\n size: -this.options.spacing,\r\n bboxes: [],\r\n elements: []\r\n };\r\n };\r\n\r\n return Layout;\r\n }(Group));\r\n\r\n var Rect$2 = (function (superclass) {\r\n function Rect$$1(geometry, options) {\r\n if (geometry === void 0) { geometry = new Rect(); }\r\n if (options === void 0) { options = {}; }\r\n\r\n superclass.call(this, options);\r\n\r\n this.geometry(geometry);\r\n\r\n if (!defined(this.options.stroke)) {\r\n this.stroke(\"#000\");\r\n }\r\n }\r\n\r\n extendStatic(Rect$$1, superclass);\r\n Rect$$1.prototype = Object.create( superclass && superclass.prototype );\r\n Rect$$1.prototype.constructor = Rect$$1;\r\n Rect$$1.fn = Rect$$1.prototype;\r\n Rect$$1.fn.init = Rect$$1.fn.constructor;\r\n\r\n var prototypeAccessors = { nodeType: {} };\r\n\r\n prototypeAccessors.nodeType.get = function () {\r\n return \"Rect\";\r\n };\r\n\r\n Rect$$1.prototype._bbox = function _bbox (matrix) {\r\n return this._geometry.bbox(matrix);\r\n };\r\n\r\n Rect$$1.prototype.rawBBox = function rawBBox () {\r\n return this._geometry.bbox();\r\n };\r\n\r\n Rect$$1.prototype._containsPoint = function _containsPoint (point) {\r\n return this._geometry.containsPoint(point);\r\n };\r\n\r\n Rect$$1.prototype._isOnPath = function _isOnPath (point) {\r\n return this.geometry()._isOnPath(point, this.options.stroke.width / 2);\r\n };\r\n\r\n Object.defineProperties( Rect$$1.prototype, prototypeAccessors );\r\n\r\n return Rect$$1;\r\n }(paintable(measurable(withGeometry(Element$1)))));\r\n\r\n function alignElements(elements, rect, alignment, axis, sizeField) {\r\n for (var idx = 0; idx < elements.length; idx++) {\r\n var bbox = elements[idx].clippedBBox();\r\n if (bbox) {\r\n var point = bbox.origin.clone();\r\n point[axis] = alignStart(bbox.size[sizeField], rect, alignment || \"start\", axis, sizeField);\r\n translateToPoint(point, bbox, elements[idx]);\r\n }\r\n }\r\n }\r\n\r\n function align(elements, rect, alignment) {\r\n alignElements(elements, rect, alignment, \"x\", \"width\");\r\n }\r\n\r\n function vAlign(elements, rect, alignment) {\r\n alignElements(elements, rect, alignment, \"y\", \"height\");\r\n }\r\n\r\n function stackElements(elements, stackAxis, otherAxis, sizeField) {\r\n if (elements.length > 1) {\r\n var origin = new Point();\r\n var previousBBox = elements[0].bbox;\r\n\r\n for (var idx = 1; idx < elements.length; idx++) {\r\n var element = elements[idx].element;\r\n var bbox = elements[idx].bbox;\r\n origin[stackAxis] = previousBBox.origin[stackAxis] + previousBBox.size[sizeField];\r\n origin[otherAxis] = bbox.origin[otherAxis];\r\n translateToPoint(origin, bbox, element);\r\n bbox.origin[stackAxis] = origin[stackAxis];\r\n previousBBox = bbox;\r\n }\r\n }\r\n }\r\n\r\n function createStackElements(elements) {\r\n var stackElements = [];\r\n\r\n for (var idx = 0; idx < elements.length; idx++) {\r\n var element = elements[idx];\r\n var bbox = element.clippedBBox();\r\n if (bbox) {\r\n stackElements.push({\r\n element: element,\r\n bbox: bbox\r\n });\r\n }\r\n }\r\n\r\n return stackElements;\r\n }\r\n\r\n function stack(elements) {\r\n stackElements(createStackElements(elements), \"x\", \"y\", \"width\");\r\n }\r\n\r\n function vStack(elements) {\r\n stackElements(createStackElements(elements), \"y\", \"x\", \"height\");\r\n }\r\n\r\n function getStacks(elements, rect, sizeField) {\r\n var maxSize = rect.size[sizeField];\r\n var stacks = [];\r\n var stack = [];\r\n var stackSize = 0;\r\n var element, bbox;\r\n\r\n var addElementToStack = function() {\r\n stack.push({\r\n element: element,\r\n bbox: bbox\r\n });\r\n };\r\n\r\n for (var idx = 0; idx < elements.length; idx++) {\r\n element = elements[idx];\r\n\r\n bbox = element.clippedBBox();\r\n if (bbox) {\r\n var size = bbox.size[sizeField];\r\n if (stackSize + size > maxSize) {\r\n if (stack.length) {\r\n stacks.push(stack);\r\n stack = [];\r\n addElementToStack();\r\n stackSize = size;\r\n } else {\r\n addElementToStack();\r\n stacks.push(stack);\r\n stack = [];\r\n stackSize = 0;\r\n }\r\n } else {\r\n addElementToStack();\r\n stackSize += size;\r\n }\r\n }\r\n }\r\n\r\n if (stack.length) {\r\n stacks.push(stack);\r\n }\r\n\r\n return stacks;\r\n }\r\n\r\n function wrapElements(elements, rect, axis, otherAxis, sizeField) {\r\n var stacks = getStacks(elements, rect, sizeField);\r\n var origin = rect.origin.clone();\r\n var result = [];\r\n\r\n for (var idx = 0; idx < stacks.length; idx++) {\r\n var stack = stacks[idx];\r\n var startElement = stack[0];\r\n origin[otherAxis] = startElement.bbox.origin[otherAxis];\r\n translateToPoint(origin, startElement.bbox, startElement.element);\r\n startElement.bbox.origin[axis] = origin[axis];\r\n stackElements(stack, axis, otherAxis, sizeField);\r\n result.push([]);\r\n for (var elementIdx = 0; elementIdx < stack.length; elementIdx++) {\r\n result[idx].push(stack[elementIdx].element);\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n function wrap(elements, rect) {\r\n return wrapElements(elements, rect, \"x\", \"y\", \"width\");\r\n }\r\n\r\n function vWrap(elements, rect) {\r\n return wrapElements(elements, rect, \"y\", \"x\", \"height\");\r\n }\r\n\r\n function fit(element, rect) {\r\n var bbox = element.clippedBBox();\r\n if (bbox) {\r\n var elementSize = bbox.size;\r\n var rectSize = rect.size;\r\n if (rectSize.width < elementSize.width || rectSize.height < elementSize.height) {\r\n var scale = Math.min(rectSize.width / elementSize.width, rectSize.height / elementSize.height);\r\n var transform = element.transform() || transform$1();\r\n transform.scale(scale, scale);\r\n element.transform(transform);\r\n }\r\n }\r\n }\r\n\r\n var StopsArray = (function (ElementsArray$$1) {\r\n function StopsArray () {\r\n ElementsArray$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(StopsArray, ElementsArray$$1);\r\n StopsArray.prototype = Object.create( ElementsArray$$1 && ElementsArray$$1.prototype );\r\n StopsArray.prototype.constructor = StopsArray;\r\n StopsArray.fn = StopsArray.prototype;\r\n StopsArray.fn.init = StopsArray.fn.constructor;\r\n\r\n StopsArray.prototype._change = function _change () {\r\n this.optionsChange({\r\n field: \"stops\"\r\n });\r\n };\r\n\r\n return StopsArray;\r\n }(ElementsArray));\r\n\r\n function optionsAccessor(name) {\r\n return function(value) {\r\n if (defined(value)) {\r\n this.options.set(name, value);\r\n return this;\r\n }\r\n\r\n return this.options.get(name);\r\n };\r\n }\r\n\r\n function defineOptionsAccessors(fn, names) {\r\n for (var i = 0; i < names.length; i++) {\r\n fn[names[i]] = optionsAccessor(names[i]);\r\n }\r\n }\r\n\r\n var withOptions = function (TBase, names) {\r\n var result = (function (TBase) {\r\n function result () {\r\n TBase.apply(this, arguments);\r\n }extendStatic(result, TBase);\r\n result.prototype = Object.create( TBase && TBase.prototype );\r\n result.prototype.constructor = result;\r\n result.fn = result.prototype;\r\n result.fn.init = result.fn.constructor;\r\n\r\n return result;\r\n }(TBase));\r\n defineOptionsAccessors(result.prototype, names);\r\n\r\n return result;\r\n };\r\n\r\n var options = [ \"offset\", \"color\", \"opacity\" ];\r\n\r\n var GradientStop = (function (superclass) {\r\n function GradientStop(offset, color, opacity) {\r\n superclass.call(this);\r\n\r\n this.options = new OptionsStore({\r\n offset: offset,\r\n color: color,\r\n opacity: defined(opacity) ? opacity : 1\r\n });\r\n\r\n this.options.addObserver(this);\r\n }\r\n\r\n extendStatic(GradientStop, superclass);\r\n GradientStop.prototype = Object.create( superclass && superclass.prototype );\r\n GradientStop.prototype.constructor = GradientStop;\r\n GradientStop.fn = GradientStop.prototype;\r\n GradientStop.fn.init = GradientStop.fn.constructor;\r\n\r\n GradientStop.create = function create (arg) {\r\n if (defined(arg)) {\r\n var stop;\r\n if (arg instanceof GradientStop) {\r\n stop = arg;\r\n } else if (arg.length > 1) {\r\n stop = new GradientStop(arg[0], arg[1], arg[2]);\r\n } else {\r\n stop = new GradientStop(arg.offset, arg.color, arg.opacity);\r\n }\r\n\r\n return stop;\r\n }\r\n };\r\n\r\n return GradientStop;\r\n }(withOptions(HasObservers, options)));\r\n\r\n var Gradient = (function (HasObservers$$1) {\r\n function Gradient(options) {\r\n if (options === void 0) { options = {}; }\r\n\r\n HasObservers$$1.call(this);\r\n\r\n this.stops = new StopsArray(this._createStops(options.stops));\r\n this.stops.addObserver(this);\r\n this._userSpace = options.userSpace;\r\n this.id = definitionId();\r\n }\r\n\r\n extendStatic(Gradient, HasObservers$$1);\r\n Gradient.prototype = Object.create( HasObservers$$1 && HasObservers$$1.prototype );\r\n Gradient.prototype.constructor = Gradient;\r\n Gradient.fn = Gradient.prototype;\r\n Gradient.fn.init = Gradient.fn.constructor;\r\n\r\n var prototypeAccessors = { nodeType: {} };\r\n\r\n prototypeAccessors.nodeType.get = function () {\r\n return \"Gradient\";\r\n };\r\n\r\n Gradient.prototype.userSpace = function userSpace (value) {\r\n if (defined(value)) {\r\n this._userSpace = value;\r\n this.optionsChange();\r\n return this;\r\n }\r\n\r\n return this._userSpace;\r\n };\r\n\r\n Gradient.prototype._createStops = function _createStops (stops) {\r\n if (stops === void 0) { stops = []; }\r\n\r\n var result = [];\r\n for (var idx = 0; idx < stops.length; idx++) {\r\n result.push(GradientStop.create(stops[idx]));\r\n }\r\n\r\n return result;\r\n };\r\n\r\n Gradient.prototype.addStop = function addStop (offset, color, opacity) {\r\n this.stops.push(new GradientStop(offset, color, opacity));\r\n };\r\n\r\n Gradient.prototype.removeStop = function removeStop (stop) {\r\n var index = this.stops.indexOf(stop);\r\n if (index >= 0) {\r\n this.stops.splice(index, 1);\r\n }\r\n };\r\n\r\n Gradient.prototype.optionsChange = function optionsChange (e) {\r\n this.trigger(\"optionsChange\", {\r\n field: \"gradient\" + (e ? \".\" + e.field : \"\"),\r\n value: this\r\n });\r\n };\r\n\r\n Gradient.prototype.geometryChange = function geometryChange () {\r\n this.optionsChange();\r\n };\r\n\r\n Object.defineProperties( Gradient.prototype, prototypeAccessors );\r\n\r\n return Gradient;\r\n }(HasObservers));\r\n\r\n var points$1 = [ \"start\", \"end\" ];\r\n\r\n var LinearGradient = (function (superclass) {\r\n function LinearGradient(options) {\r\n if (options === void 0) { options = {}; }\r\n\r\n superclass.call(this, options);\r\n\r\n this.start(options.start || new Point());\r\n this.end(options.end || new Point(1, 0));\r\n }\r\n\r\n extendStatic(LinearGradient, superclass);\r\n LinearGradient.prototype = Object.create( superclass && superclass.prototype );\r\n LinearGradient.prototype.constructor = LinearGradient;\r\n LinearGradient.fn = LinearGradient.prototype;\r\n LinearGradient.fn.init = LinearGradient.fn.constructor;\r\n\r\n return LinearGradient;\r\n }(withPoints(Gradient, points$1)));\r\n\r\n var RadialGradient = (function (superclass) {\r\n function RadialGradient(options) {\r\n if (options === void 0) { options = {}; }\r\n\r\n superclass.call(this, options);\r\n\r\n this.center(options.center || new Point());\r\n this._radius = defined(options.radius) ? options.radius : 1;\r\n this._fallbackFill = options.fallbackFill;\r\n }\r\n\r\n extendStatic(RadialGradient, superclass);\r\n RadialGradient.prototype = Object.create( superclass && superclass.prototype );\r\n RadialGradient.prototype.constructor = RadialGradient;\r\n RadialGradient.fn = RadialGradient.prototype;\r\n RadialGradient.fn.init = RadialGradient.fn.constructor;\r\n\r\n RadialGradient.prototype.radius = function radius (value) {\r\n if (defined(value)) {\r\n this._radius = value;\r\n this.geometryChange();\r\n return this;\r\n }\r\n\r\n return this._radius;\r\n };\r\n\r\n RadialGradient.prototype.fallbackFill = function fallbackFill (value) {\r\n if (defined(value)) {\r\n this._fallbackFill = value;\r\n this.optionsChange();\r\n return this;\r\n }\r\n\r\n return this._fallbackFill;\r\n };\r\n\r\n return RadialGradient;\r\n }(withPoints(Gradient, [ \"center\" ])));\r\n\r\n function swing(position) {\r\n return 0.5 - Math.cos(position * Math.PI) / 2;\r\n }\r\n\r\n function linear(position) {\r\n return position;\r\n }\r\n\r\n function easeOutElastic(position, time, start, diff) {\r\n var s = 1.70158,\r\n p = 0,\r\n a = diff;\r\n\r\n if (position === 0) {\r\n return start;\r\n }\r\n\r\n if (position === 1) {\r\n return start + diff;\r\n }\r\n\r\n if (!p) {\r\n p = 0.5;\r\n }\r\n\r\n if (a < Math.abs(diff)) {\r\n a = diff;\r\n s = p / 4;\r\n } else {\r\n s = p / (2 * Math.PI) * Math.asin(diff / a);\r\n }\r\n\r\n return a * Math.pow(2, -10 * position) *\r\n Math.sin((Number(position) - s) * (1.1 * Math.PI) / p) + diff + start;\r\n }\r\n\r\n var easingFunctions = {\r\n \tswing: swing,\r\n \tlinear: linear,\r\n \teaseOutElastic: easeOutElastic\r\n };\r\n\r\n var instance;\r\n\r\n var AnimationFactory = (function (Class$$1) {\r\n function AnimationFactory() {\r\n Class$$1.call(this);\r\n\r\n this._items = [];\r\n }\r\n\r\n extendStatic(AnimationFactory, Class$$1);\r\n AnimationFactory.prototype = Object.create( Class$$1 && Class$$1.prototype );\r\n AnimationFactory.prototype.constructor = AnimationFactory;\r\n AnimationFactory.fn = AnimationFactory.prototype;\r\n AnimationFactory.fn.init = AnimationFactory.fn.constructor;\r\n\r\n var staticAccessors = { current: {} };\r\n\r\n staticAccessors.current.get = function () {\r\n if (!instance) {\r\n instance = new AnimationFactory();\r\n }\r\n\r\n return instance;\r\n };\r\n\r\n AnimationFactory.prototype.register = function register (name, type) {\r\n this._items.push({\r\n name: name,\r\n type: type\r\n });\r\n };\r\n\r\n AnimationFactory.prototype.create = function create (element, options) {\r\n var items = this._items;\r\n var match;\r\n\r\n if (options && options.type) {\r\n var type = options.type.toLowerCase();\r\n for (var i = 0; i < items.length; i++) {\r\n if (items[i].name.toLowerCase() === type) {\r\n match = items[i];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (match) {\r\n return new match.type(element, options);\r\n }\r\n };\r\n\r\n Object.defineProperties( AnimationFactory, staticAccessors );\r\n\r\n return AnimationFactory;\r\n }(Class));\r\n\r\n var Animation = (function (Class$$1) {\r\n function Animation(element, options) {\r\n Class$$1.call(this);\r\n\r\n this.options = $.extend({}, this.options, options);\r\n this.element = element;\r\n }\r\n\r\n extendStatic(Animation, Class$$1);\r\n Animation.prototype = Object.create( Class$$1 && Class$$1.prototype );\r\n Animation.prototype.constructor = Animation;\r\n Animation.fn = Animation.prototype;\r\n Animation.fn.init = Animation.fn.constructor;\r\n\r\n var prototypeAccessors = { options: {} };\r\n\r\n Animation.create = function create (type, element, options) {\r\n return AnimationFactory.current.create(type, element, options);\r\n };\r\n\r\n prototypeAccessors.options.get = function () {\r\n return this._options || {\r\n duration: 500,\r\n easing: \"swing\"\r\n };\r\n };\r\n\r\n prototypeAccessors.options.set = function (value) {\r\n this._options = value;\r\n };\r\n\r\n Animation.prototype.setup = function setup () {};\r\n Animation.prototype.step = function step () {};\r\n\r\n Animation.prototype.play = function play () {\r\n var this$1$1 = this;\r\n\r\n var options = this.options;\r\n var duration = options.duration;\r\n var delay = options.delay; if (delay === void 0) { delay = 0; }\r\n var easing = easingFunctions[options.easing];\r\n var start = now() + delay;\r\n var finish = start + duration;\r\n\r\n if (duration === 0) {\r\n this.step(1);\r\n this.abort();\r\n } else {\r\n setTimeout(function () {\r\n var loop = function () {\r\n if (this$1$1._stopped) {\r\n return;\r\n }\r\n\r\n var wallTime = now();\r\n\r\n var time = limitValue(wallTime - start, 0, duration);\r\n var position = time / duration;\r\n var easingPosition = easing(position, time, 0, 1, duration);\r\n\r\n this$1$1.step(easingPosition);\r\n\r\n if (wallTime < finish) {\r\n kendo.animationFrame(loop);\r\n } else {\r\n this$1$1.abort();\r\n }\r\n };\r\n\r\n loop();\r\n }, delay);\r\n }\r\n };\r\n\r\n Animation.prototype.abort = function abort () {\r\n this._stopped = true;\r\n };\r\n\r\n Animation.prototype.destroy = function destroy () {\r\n this.abort();\r\n };\r\n\r\n Object.defineProperties( Animation.prototype, prototypeAccessors );\r\n\r\n return Animation;\r\n }(Class));\r\n\r\n var instance$1;\r\n\r\n var PathParser = (function (Class$$1) {\r\n function PathParser () {\r\n Class$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(PathParser, Class$$1);\r\n PathParser.prototype = Object.create( Class$$1 && Class$$1.prototype );\r\n PathParser.prototype.constructor = PathParser;\r\n PathParser.fn = PathParser.prototype;\r\n PathParser.fn.init = PathParser.fn.constructor;\r\n\r\n var staticAccessors = { current: {} };\r\n\r\n staticAccessors.current.get = function () {\r\n if (!instance$1) {\r\n instance$1 = new PathParser();\r\n }\r\n\r\n return instance$1;\r\n };\r\n\r\n PathParser.prototype.parse = function parse (str, options) {\r\n var multiPath = new MultiPath(options);\r\n return parsePath(multiPath, str);\r\n };\r\n\r\n Object.defineProperties( PathParser, staticAccessors );\r\n\r\n return PathParser;\r\n }(Class));\r\n\r\n var BaseNode = (function (Class$$1) {\r\n function BaseNode(srcElement) {\r\n Class$$1.call(this);\r\n\r\n this.childNodes = [];\r\n this.parent = null;\r\n\r\n if (srcElement) {\r\n this.srcElement = srcElement;\r\n this.observe();\r\n }\r\n }\r\n\r\n extendStatic(BaseNode, Class$$1);\r\n BaseNode.prototype = Object.create( Class$$1 && Class$$1.prototype );\r\n BaseNode.prototype.constructor = BaseNode;\r\n BaseNode.fn = BaseNode.prototype;\r\n BaseNode.fn.init = BaseNode.fn.constructor;\r\n\r\n BaseNode.prototype.destroy = function destroy () {\r\n var this$1$1 = this;\r\n\r\n if (this.srcElement) {\r\n this.srcElement.removeObserver(this);\r\n }\r\n\r\n var children = this.childNodes;\r\n for (var i = 0; i < children.length; i++) {\r\n this$1$1.childNodes[i].destroy();\r\n }\r\n\r\n this.parent = null;\r\n };\r\n\r\n BaseNode.prototype.load = function load () {};\r\n\r\n BaseNode.prototype.observe = function observe () {\r\n if (this.srcElement) {\r\n this.srcElement.addObserver(this);\r\n }\r\n };\r\n\r\n BaseNode.prototype.append = function append (node) {\r\n this.childNodes.push(node);\r\n node.parent = this;\r\n };\r\n\r\n BaseNode.prototype.insertAt = function insertAt (node, pos) {\r\n this.childNodes.splice(pos, 0, node);\r\n node.parent = this;\r\n };\r\n\r\n BaseNode.prototype.remove = function remove (index, count) {\r\n var this$1$1 = this;\r\n\r\n var end = index + count;\r\n for (var i = index; i < end; i++) {\r\n this$1$1.childNodes[i].removeSelf();\r\n }\r\n this.childNodes.splice(index, count);\r\n };\r\n\r\n BaseNode.prototype.removeSelf = function removeSelf () {\r\n this.clear();\r\n this.destroy();\r\n };\r\n\r\n BaseNode.prototype.clear = function clear () {\r\n this.remove(0, this.childNodes.length);\r\n };\r\n\r\n BaseNode.prototype.invalidate = function invalidate () {\r\n if (this.parent) {\r\n this.parent.invalidate();\r\n }\r\n };\r\n\r\n BaseNode.prototype.geometryChange = function geometryChange () {\r\n this.invalidate();\r\n };\r\n\r\n BaseNode.prototype.optionsChange = function optionsChange () {\r\n this.invalidate();\r\n };\r\n\r\n BaseNode.prototype.childrenChange = function childrenChange (e) {\r\n if (e.action === \"add\") {\r\n this.load(e.items, e.index);\r\n } else if (e.action === \"remove\") {\r\n this.remove(e.index, e.items.length);\r\n }\r\n\r\n this.invalidate();\r\n };\r\n\r\n return BaseNode;\r\n }(Class));\r\n\r\n var events = [\r\n \"click\",\r\n \"mouseenter\",\r\n \"mouseleave\",\r\n \"mousemove\",\r\n \"resize\"\r\n ];\r\n\r\n var Surface$2 = (function (Observable$$1) {\r\n function Surface(element, options) {\r\n Observable$$1.call(this);\r\n\r\n this.options = $.extend({}, options);\r\n this.element = element;\r\n this.element._kendoExportVisual = this.exportVisual.bind(this);\r\n\r\n this._click = this._handler(\"click\");\r\n this._mouseenter = this._handler(\"mouseenter\");\r\n this._mouseleave = this._handler(\"mouseleave\");\r\n this._mousemove = this._handler(\"mousemove\");\r\n\r\n this._visual = new Group();\r\n\r\n elementSize(element, this.options);\r\n\r\n this.bind(events, this.options);\r\n\r\n this._enableTracking();\r\n }\r\n\r\n extendStatic(Surface, Observable$$1);\r\n Surface.prototype = Object.create( Observable$$1 && Observable$$1.prototype );\r\n Surface.prototype.constructor = Surface;\r\n Surface.fn = Surface.prototype;\r\n Surface.fn.init = Surface.fn.constructor;\r\n\r\n Surface.prototype.draw = function draw (element) {\r\n this._visual.children.push(element);\r\n };\r\n\r\n Surface.prototype.clear = function clear () {\r\n this._visual.children = [];\r\n };\r\n\r\n Surface.prototype.destroy = function destroy () {\r\n this._visual = null;\r\n this.element._kendoExportVisual = null;\r\n this.unbind();\r\n };\r\n\r\n Surface.prototype.eventTarget = function eventTarget (e) {\r\n var this$1$1 = this;\r\n\r\n var domNode = eventElement(e);\r\n var node;\r\n\r\n while (!node && domNode) {\r\n node = domNode._kendoNode;\r\n if (domNode === this$1$1.element) {\r\n break;\r\n }\r\n\r\n domNode = domNode.parentElement;\r\n }\r\n\r\n if (node) {\r\n return node.srcElement;\r\n }\r\n };\r\n\r\n Surface.prototype.exportVisual = function exportVisual () {\r\n return this._visual;\r\n };\r\n\r\n Surface.prototype.getSize = function getSize () {\r\n return elementSize(this.element);\r\n };\r\n\r\n Surface.prototype.currentSize = function currentSize (size) {\r\n if (size) {\r\n this._size = size;\r\n } else {\r\n return this._size;\r\n }\r\n };\r\n\r\n Surface.prototype.setSize = function setSize (size) {\r\n elementSize(this.element, size);\r\n\r\n this.currentSize(size);\r\n this._resize();\r\n };\r\n\r\n Surface.prototype.resize = function resize (force) {\r\n var size = this.getSize();\r\n var currentSize = this.currentSize();\r\n\r\n if (force || (size.width > 0 || size.height > 0) && (!currentSize || size.width !== currentSize.width || size.height !== currentSize.height)) {\r\n this.currentSize(size);\r\n this._resize(size, force);\r\n this.trigger(\"resize\", size);\r\n }\r\n };\r\n\r\n Surface.prototype.size = function size (value) {\r\n if (!value) {\r\n return this.getSize();\r\n }\r\n\r\n this.setSize(value);\r\n };\r\n\r\n Surface.prototype.suspendTracking = function suspendTracking () {\r\n this._suspendedTracking = true;\r\n };\r\n\r\n Surface.prototype.resumeTracking = function resumeTracking () {\r\n this._suspendedTracking = false;\r\n };\r\n\r\n Surface.prototype._enableTracking = function _enableTracking () {};\r\n\r\n Surface.prototype._resize = function _resize () {};\r\n\r\n Surface.prototype._handler = function _handler (eventName) {\r\n var this$1$1 = this;\r\n\r\n return function (e) {\r\n var node = this$1$1.eventTarget(e);\r\n if (node && !this$1$1._suspendedTracking) {\r\n this$1$1.trigger(eventName, {\r\n element: node,\r\n originalEvent: e,\r\n type: eventName\r\n });\r\n }\r\n };\r\n };\r\n\r\n Surface.prototype._elementOffset = function _elementOffset () {\r\n var element = this.element;\r\n var padding = elementPadding(element);\r\n var ref = elementOffset(element);\r\n var left = ref.left;\r\n var top = ref.top;\r\n\r\n return {\r\n left: left + padding.left,\r\n top: top + padding.top\r\n };\r\n };\r\n\r\n Surface.prototype._surfacePoint = function _surfacePoint (e) {\r\n var offset = this._elementOffset();\r\n var coord = eventCoordinates(e);\r\n var x = coord.x - offset.left;\r\n var y = coord.y - offset.top;\r\n\r\n var inverseTransform = elementScale(this.element).invert();\r\n var point = new Point(\r\n x,\r\n y\r\n ).transform(inverseTransform);\r\n\r\n return point;\r\n };\r\n\r\n return Surface;\r\n }(kendo.Observable));\r\n\r\n function renderAttr(name, value) {\r\n return (defined(value) && value !== null) ? (\" \" + name + \"=\\\"\" + value + \"\\\" \") : \"\";\r\n }\r\n\r\n function renderAllAttr(attrs) {\r\n var output = \"\";\r\n for (var i = 0; i < attrs.length; i++) {\r\n output += renderAttr(attrs[i][0], attrs[i][1]);\r\n }\r\n\r\n return output;\r\n }\r\n\r\n function renderStyle(attrs) {\r\n var output = \"\";\r\n for (var i = 0; i < attrs.length; i++) {\r\n var value = attrs[i][1];\r\n if (defined(value)) {\r\n output += attrs[i][0] + \":\" + value + \";\";\r\n }\r\n }\r\n\r\n if (output !== \"\") {\r\n return output;\r\n }\r\n }\r\n\r\n var NODE_MAP = {};\r\n\r\n var SVG_NS = \"http://www.w3.org/2000/svg\";\r\n var NONE = \"none\";\r\n var POINT_DIGITS = 3;\r\n\r\n var applyStyle = function (styleString, element) { return styleString.split(';').filter(function (s) { return s !== ''; }).forEach(function (s) {\r\n var parts = s.split(':');\r\n element.style[parts[0].trim()] = parts[1].trim();\r\n }); };\r\n\r\n var styleAttr = 'data-style';\r\n var replaceStyleAttr = function (html) { return html.replace(/\\sstyle=/g, ' ' + styleAttr + '='); };\r\n var restoreStyleAttr = function (container) {\r\n Array.from(container.querySelectorAll('[' + styleAttr +']')).forEach(function (element) {\r\n var styleString = element.getAttribute(styleAttr);\r\n element.removeAttribute(styleAttr);\r\n applyStyle(styleString, element);\r\n });\r\n };\r\n\r\n var renderSVG = function(container, svg) {\r\n container.innerHTML = replaceStyleAttr(svg);\r\n restoreStyleAttr(container);\r\n };\r\n\r\n if (typeof document !== \"undefined\") {\r\n var testFragment = \"
\";\r\n var testContainer = document.createElement(\"div\");\r\n var hasParser = typeof DOMParser !== \"undefined\";\r\n\r\n testContainer.innerHTML = testFragment;\r\n\r\n if (hasParser && testContainer.firstChild.namespaceURI !== SVG_NS) {\r\n renderSVG = function(container, svg) {\r\n var parser = new DOMParser();\r\n var chartDoc = parser.parseFromString(replaceStyleAttr(svg), \"text/xml\");\r\n restoreStyleAttr(chartDoc);\r\n var importedDoc = document.adoptNode(chartDoc.documentElement);\r\n\r\n container.innerHTML = \"\";\r\n container.appendChild(importedDoc);\r\n };\r\n }\r\n }\r\n\r\n var renderSVG$1 = renderSVG;\r\n\r\n var TRANSFORM = \"transform\";\r\n var DefinitionMap = {\r\n clip: \"clip-path\",\r\n fill: \"fill\"\r\n };\r\n\r\n function isDefinition(type, value) {\r\n return type === \"clip\" || (type === \"fill\" && (!value || value.nodeType === \"Gradient\"));\r\n }\r\n\r\n function baseUrl() {\r\n var base = document.getElementsByTagName(\"base\")[0];\r\n var href = document.location.href;\r\n var url = \"\";\r\n\r\n if (base && !(supportBrowser || {}).msie) {\r\n var hashIndex = href.indexOf(\"#\");\r\n if (hashIndex !== -1) {\r\n href = href.substring(0, hashIndex);\r\n }\r\n\r\n url = href;\r\n }\r\n\r\n return url;\r\n }\r\n\r\n var Node = (function (BaseNode$$1) {\r\n function Node(srcElement, options) {\r\n BaseNode$$1.call(this, srcElement);\r\n this.definitions = {};\r\n\r\n this.options = options;\r\n }\r\n\r\n extendStatic(Node, BaseNode$$1);\r\n Node.prototype = Object.create( BaseNode$$1 && BaseNode$$1.prototype );\r\n Node.prototype.constructor = Node;\r\n Node.fn = Node.prototype;\r\n Node.fn.init = Node.fn.constructor;\r\n\r\n Node.prototype.destroy = function destroy () {\r\n if (this.element) {\r\n this.element._kendoNode = null;\r\n this.element = null;\r\n }\r\n\r\n this.clearDefinitions();\r\n BaseNode$$1.prototype.destroy.call(this);\r\n };\r\n\r\n Node.prototype.load = function load (elements, pos) {\r\n var this$1$1 = this;\r\n\r\n for (var i = 0; i < elements.length; i++) {\r\n var srcElement = elements[i];\r\n var children = srcElement.children;\r\n\r\n var childNode = new NODE_MAP[srcElement.nodeType](srcElement, this$1$1.options);\r\n\r\n if (defined(pos)) {\r\n this$1$1.insertAt(childNode, pos);\r\n } else {\r\n this$1$1.append(childNode);\r\n }\r\n\r\n childNode.createDefinitions();\r\n\r\n if (children && children.length > 0) {\r\n childNode.load(children);\r\n }\r\n\r\n var element = this$1$1.element;\r\n if (element) {\r\n childNode.attachTo(element, pos);\r\n }\r\n }\r\n };\r\n\r\n Node.prototype.root = function root () {\r\n var root = this;\r\n\r\n while (root.parent) {\r\n root = root.parent;\r\n }\r\n\r\n return root;\r\n };\r\n\r\n Node.prototype.attachTo = function attachTo (domElement, pos) {\r\n var container = document.createElement(\"div\");\r\n renderSVG$1(container,\r\n \"
\"\r\n );\r\n\r\n var element = container.firstChild.firstChild;\r\n if (element) {\r\n if (defined(pos)) {\r\n domElement.insertBefore(element, domElement.childNodes[pos] || null);\r\n } else {\r\n domElement.appendChild(element);\r\n }\r\n this.setElement(element);\r\n }\r\n };\r\n\r\n Node.prototype.setElement = function setElement (element) {\r\n if (this.element) {\r\n this.element._kendoNode = null;\r\n }\r\n\r\n this.element = element;\r\n this.element._kendoNode = this;\r\n\r\n var nodes = this.childNodes;\r\n for (var i = 0; i < nodes.length; i++) {\r\n var childElement = element.childNodes[i];\r\n nodes[i].setElement(childElement);\r\n }\r\n };\r\n\r\n Node.prototype.clear = function clear () {\r\n this.clearDefinitions();\r\n\r\n if (this.element) {\r\n this.element.innerHTML = \"\";\r\n }\r\n\r\n var children = this.childNodes;\r\n for (var i = 0; i < children.length; i++) {\r\n children[i].destroy();\r\n }\r\n\r\n this.childNodes = [];\r\n };\r\n\r\n Node.prototype.removeSelf = function removeSelf () {\r\n if (this.element) {\r\n var parentNode = this.element.parentNode;\r\n if (parentNode) {\r\n parentNode.removeChild(this.element);\r\n }\r\n this.element = null;\r\n }\r\n\r\n BaseNode$$1.prototype.removeSelf.call(this);\r\n };\r\n\r\n Node.prototype.template = function template () {\r\n return this.renderChildren();\r\n };\r\n\r\n Node.prototype.render = function render () {\r\n return this.template();\r\n };\r\n\r\n Node.prototype.renderChildren = function renderChildren () {\r\n var nodes = this.childNodes;\r\n var output = \"\";\r\n\r\n for (var i = 0; i < nodes.length; i++) {\r\n output += nodes[i].render();\r\n }\r\n\r\n return output;\r\n };\r\n\r\n Node.prototype.optionsChange = function optionsChange (e) {\r\n var field = e.field;\r\n var value = e.value;\r\n\r\n if (field === \"visible\") {\r\n this.css(\"display\", value ? \"\" : NONE);\r\n } else if (DefinitionMap[field] && isDefinition(field, value)) {\r\n this.updateDefinition(field, value);\r\n } else if (field === \"opacity\") {\r\n this.attr(\"opacity\", value);\r\n } else if (field === \"cursor\") {\r\n this.css(\"cursor\", value);\r\n } else if (field === \"id\") {\r\n if (value) {\r\n this.attr(\"id\", value);\r\n } else {\r\n this.removeAttr(\"id\");\r\n }\r\n }\r\n\r\n BaseNode$$1.prototype.optionsChange.call(this, e);\r\n };\r\n\r\n Node.prototype.accessibilityOptionsChange = function accessibilityOptionsChange (e) {\r\n var field = e.field;\r\n var value = e.value;\r\n\r\n if (field === \"role\") {\r\n if (value) {\r\n this.attr(\"role\", value);\r\n } else {\r\n this.removeAttr(\"role\");\r\n }\r\n } else if (field === \"ariaLabel\") {\r\n if (value) {\r\n this.attr(\"aria-label\", htmlEncode(value));\r\n } else {\r\n this.removeAttr(\"aria-label\");\r\n }\r\n } else if (field === \"ariaRoleDescription\") {\r\n if (value) {\r\n this.attr(\"aria-roledescription\", htmlEncode(value));\r\n } else {\r\n this.removeAttr(\"aria-roledescription\");\r\n }\r\n } else if (field === \"ariaChecked\") {\r\n if (defined(value)) {\r\n this.attr(\"aria-checked\", value);\r\n } else {\r\n this.removeAttr(\"aria-checked\");\r\n }\r\n } else if (field === \"className\") {\r\n this.className(value);\r\n }\r\n };\r\n\r\n Node.prototype.attr = function attr (name, value) {\r\n if (this.element) {\r\n this.element.setAttribute(name, value);\r\n }\r\n };\r\n\r\n Node.prototype.allAttr = function allAttr (attrs) {\r\n var this$1$1 = this;\r\n\r\n for (var i = 0; i < attrs.length; i++) {\r\n this$1$1.attr(attrs[i][0], attrs[i][1]);\r\n }\r\n };\r\n\r\n Node.prototype.toggleAttr = function toggleAttr (name, value) {\r\n if (value) {\r\n this.attr(name, value);\r\n } else {\r\n this.removeAttr(name);\r\n }\r\n };\r\n\r\n Node.prototype.css = function css (name, value) {\r\n if (this.element) {\r\n this.element.style[name] = value;\r\n }\r\n };\r\n\r\n Node.prototype.allCss = function allCss (styles) {\r\n var this$1$1 = this;\r\n\r\n for (var i = 0; i < styles.length; i++) {\r\n this$1$1.css(styles[i][0], styles[i][1]);\r\n }\r\n };\r\n\r\n Node.prototype.className = function className (value) {\r\n var this$1$1 = this;\r\n\r\n if (this.element) {\r\n (ref = this.element.classList).remove.apply(ref, this.element.classList);\r\n value.split(\" \").forEach(function (item) {\r\n this$1$1.element.classList.add(item);\r\n });\r\n }\r\n var ref;\r\n };\r\n\r\n Node.prototype.removeAttr = function removeAttr (name) {\r\n if (this.element) {\r\n this.element.removeAttribute(name);\r\n }\r\n };\r\n\r\n Node.prototype.mapTransform = function mapTransform (transform) {\r\n var attrs = [];\r\n if (transform) {\r\n attrs.push([\r\n TRANSFORM,\r\n \"matrix(\" + transform.matrix().toString(6) + \")\"\r\n ]);\r\n }\r\n\r\n return attrs;\r\n };\r\n\r\n Node.prototype.renderTransform = function renderTransform () {\r\n return renderAllAttr(\r\n this.mapTransform(this.srcElement.transform())\r\n );\r\n };\r\n\r\n Node.prototype.transformChange = function transformChange (value) {\r\n if (value) {\r\n this.allAttr(this.mapTransform(value));\r\n } else {\r\n this.removeAttr(TRANSFORM);\r\n }\r\n };\r\n\r\n Node.prototype.mapStyle = function mapStyle () {\r\n var options = this.srcElement.options;\r\n var style = [ [ \"cursor\", options.cursor ] ];\r\n\r\n if (options.visible === false) {\r\n style.push([ \"display\", NONE ]);\r\n }\r\n\r\n return style;\r\n };\r\n\r\n Node.prototype.renderStyle = function renderStyle$1 () {\r\n return renderAttr(\"style\", renderStyle(this.mapStyle(true)));\r\n };\r\n\r\n Node.prototype.renderOpacity = function renderOpacity () {\r\n return renderAttr(\"opacity\", this.srcElement.options.opacity);\r\n };\r\n\r\n Node.prototype.renderId = function renderId () {\r\n return renderAttr(\"id\", this.srcElement.options.id);\r\n };\r\n\r\n Node.prototype.renderClassName = function renderClassName () {\r\n return renderAttr(\"class\", this.srcElement.options.className);\r\n };\r\n\r\n Node.prototype.renderRole = function renderRole () {\r\n return renderAttr(\"role\", this.srcElement.options.role);\r\n };\r\n\r\n Node.prototype.renderAriaLabel = function renderAriaLabel () {\r\n var value = this.srcElement.options.ariaLabel;\r\n if (value) {\r\n value = htmlEncode(value);\r\n }\r\n return renderAttr(\"aria-label\", value);\r\n };\r\n\r\n Node.prototype.renderAriaRoleDescription = function renderAriaRoleDescription () {\r\n var value = this.srcElement.options.ariaRoleDescription;\r\n if (value) {\r\n value = htmlEncode(value);\r\n }\r\n return renderAttr(\"aria-roledescription\", value);\r\n };\r\n\r\n Node.prototype.renderAriaChecked = function renderAriaChecked () {\r\n return renderAttr(\"aria-checked\", this.srcElement.options.ariaChecked);\r\n };\r\n\r\n Node.prototype.createDefinitions = function createDefinitions () {\r\n var srcElement = this.srcElement;\r\n var definitions = this.definitions;\r\n if (srcElement) {\r\n var options = srcElement.options;\r\n var hasDefinitions;\r\n\r\n for (var field in DefinitionMap) {\r\n var definition = options.get(field);\r\n if (definition && isDefinition(field, definition)) {\r\n definitions[field] = definition;\r\n hasDefinitions = true;\r\n }\r\n }\r\n if (hasDefinitions) {\r\n this.definitionChange({\r\n action: \"add\",\r\n definitions: definitions\r\n });\r\n }\r\n }\r\n };\r\n\r\n Node.prototype.definitionChange = function definitionChange (e) {\r\n if (this.parent) {\r\n this.parent.definitionChange(e);\r\n }\r\n };\r\n\r\n Node.prototype.updateDefinition = function updateDefinition (type, value) {\r\n var definitions = this.definitions;\r\n var current = definitions[type];\r\n var attr = DefinitionMap[type];\r\n var definition = {};\r\n if (current) {\r\n definition[type] = current;\r\n this.definitionChange({\r\n action: \"remove\",\r\n definitions: definition\r\n });\r\n delete definitions[type];\r\n }\r\n\r\n if (!value) {\r\n if (current) {\r\n this.removeAttr(attr);\r\n }\r\n } else {\r\n definition[type] = value;\r\n this.definitionChange({\r\n action: \"add\",\r\n definitions: definition\r\n });\r\n definitions[type] = value;\r\n this.attr(attr, this.refUrl(value.id));\r\n }\r\n };\r\n\r\n Node.prototype.clearDefinitions = function clearDefinitions () {\r\n var definitions = this.definitions;\r\n\r\n this.definitionChange({\r\n action: \"remove\",\r\n definitions: definitions\r\n });\r\n this.definitions = {};\r\n };\r\n\r\n Node.prototype.renderDefinitions = function renderDefinitions () {\r\n return renderAllAttr(this.mapDefinitions());\r\n };\r\n\r\n Node.prototype.mapDefinitions = function mapDefinitions () {\r\n var this$1$1 = this;\r\n\r\n var definitions = this.definitions;\r\n var attrs = [];\r\n\r\n for (var field in definitions) {\r\n attrs.push([ DefinitionMap[field], this$1$1.refUrl(definitions[field].id) ]);\r\n }\r\n\r\n return attrs;\r\n };\r\n\r\n Node.prototype.refUrl = function refUrl (id) {\r\n var skipBaseHref = (this.options || {}).skipBaseHref;\r\n var baseHref = this.baseUrl().replace(/'/g, \"\\\\'\");\r\n var base = skipBaseHref ? '' : baseHref;\r\n return (\"url(\" + base + \"#\" + id + \")\");\r\n };\r\n\r\n Node.prototype.baseUrl = function baseUrl$1 () {\r\n return baseUrl();\r\n };\r\n\r\n return Node;\r\n }(BaseNode));\r\n\r\n var GradientStopNode = (function (Node$$1) {\r\n function GradientStopNode () {\r\n Node$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(GradientStopNode, Node$$1);\r\n GradientStopNode.prototype = Object.create( Node$$1 && Node$$1.prototype );\r\n GradientStopNode.prototype.constructor = GradientStopNode;\r\n GradientStopNode.fn = GradientStopNode.prototype;\r\n GradientStopNode.fn.init = GradientStopNode.fn.constructor;\r\n\r\n GradientStopNode.prototype.template = function template () {\r\n return (\"
\");\r\n };\r\n\r\n GradientStopNode.prototype.renderOffset = function renderOffset () {\r\n return renderAttr(\"offset\", this.srcElement.offset());\r\n };\r\n\r\n GradientStopNode.prototype.mapStyle = function mapStyle () {\r\n var srcElement = this.srcElement;\r\n return [\r\n [ \"stop-color\", srcElement.color() ],\r\n [ \"stop-opacity\", srcElement.opacity() ]\r\n ];\r\n };\r\n\r\n GradientStopNode.prototype.optionsChange = function optionsChange (e) {\r\n if (e.field === \"offset\") {\r\n this.attr(e.field, e.value);\r\n } else if (e.field === \"color\" || e.field === \"opacity\") {\r\n this.css(\"stop-\" + e.field, e.value);\r\n }\r\n };\r\n\r\n return GradientStopNode;\r\n }(Node));\r\n\r\n var GradientNode = (function (Node$$1) {\r\n function GradientNode(srcElement) {\r\n Node$$1.call(this, srcElement);\r\n\r\n this.id = srcElement.id;\r\n\r\n this.loadStops();\r\n }\r\n\r\n extendStatic(GradientNode, Node$$1);\r\n GradientNode.prototype = Object.create( Node$$1 && Node$$1.prototype );\r\n GradientNode.prototype.constructor = GradientNode;\r\n GradientNode.fn = GradientNode.prototype;\r\n GradientNode.fn.init = GradientNode.fn.constructor;\r\n\r\n GradientNode.prototype.loadStops = function loadStops () {\r\n var this$1$1 = this;\r\n\r\n var stops = this.srcElement.stops;\r\n var element = this.element;\r\n\r\n for (var idx = 0; idx < stops.length; idx++) {\r\n var stopNode = new GradientStopNode(stops[idx]);\r\n this$1$1.append(stopNode);\r\n if (element) {\r\n stopNode.attachTo(element);\r\n }\r\n }\r\n };\r\n\r\n GradientNode.prototype.optionsChange = function optionsChange (e) {\r\n if (e.field === \"gradient.stops\") {\r\n BaseNode.prototype.clear.call(this);\r\n this.loadStops();\r\n } else if (e.field === \"gradient\") {\r\n this.allAttr(this.mapCoordinates());\r\n }\r\n };\r\n\r\n GradientNode.prototype.renderCoordinates = function renderCoordinates () {\r\n return renderAllAttr(this.mapCoordinates());\r\n };\r\n\r\n GradientNode.prototype.mapSpace = function mapSpace () {\r\n return [ \"gradientUnits\", this.srcElement.userSpace() ? \"userSpaceOnUse\" : \"objectBoundingBox\" ];\r\n };\r\n\r\n return GradientNode;\r\n }(Node));\r\n\r\n var LinearGradientNode = (function (GradientNode$$1) {\r\n function LinearGradientNode () {\r\n GradientNode$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(LinearGradientNode, GradientNode$$1);\r\n LinearGradientNode.prototype = Object.create( GradientNode$$1 && GradientNode$$1.prototype );\r\n LinearGradientNode.prototype.constructor = LinearGradientNode;\r\n LinearGradientNode.fn = LinearGradientNode.prototype;\r\n LinearGradientNode.fn.init = LinearGradientNode.fn.constructor;\r\n\r\n LinearGradientNode.prototype.template = function template () {\r\n return (\"
\" + (this.renderChildren()) + \"\");\r\n };\r\n\r\n LinearGradientNode.prototype.mapCoordinates = function mapCoordinates () {\r\n var srcElement = this.srcElement;\r\n var start = srcElement.start();\r\n var end = srcElement.end();\r\n var attrs = [\r\n [ \"x1\", start.x ],\r\n [ \"y1\", start.y ],\r\n [ \"x2\", end.x ],\r\n [ \"y2\", end.y ],\r\n this.mapSpace()\r\n ];\r\n\r\n return attrs;\r\n };\r\n\r\n return LinearGradientNode;\r\n }(GradientNode));\r\n\r\n var RadialGradientNode = (function (GradientNode$$1) {\r\n function RadialGradientNode () {\r\n GradientNode$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(RadialGradientNode, GradientNode$$1);\r\n RadialGradientNode.prototype = Object.create( GradientNode$$1 && GradientNode$$1.prototype );\r\n RadialGradientNode.prototype.constructor = RadialGradientNode;\r\n RadialGradientNode.fn = RadialGradientNode.prototype;\r\n RadialGradientNode.fn.init = RadialGradientNode.fn.constructor;\r\n\r\n RadialGradientNode.prototype.template = function template () {\r\n return (\"
\" + (this.renderChildren()) + \"\");\r\n };\r\n\r\n RadialGradientNode.prototype.mapCoordinates = function mapCoordinates () {\r\n var srcElement = this.srcElement;\r\n var center = srcElement.center();\r\n var radius = srcElement.radius();\r\n var attrs = [\r\n [ \"cx\", center.x ],\r\n [ \"cy\", center.y ],\r\n [ \"r\", radius ],\r\n this.mapSpace()\r\n ];\r\n return attrs;\r\n };\r\n\r\n return RadialGradientNode;\r\n }(GradientNode));\r\n\r\n var ClipNode = (function (Node$$1) {\r\n function ClipNode(srcElement) {\r\n Node$$1.call(this);\r\n\r\n this.srcElement = srcElement;\r\n this.id = srcElement.id;\r\n\r\n this.load([ srcElement ]);\r\n }\r\n\r\n extendStatic(ClipNode, Node$$1);\r\n ClipNode.prototype = Object.create( Node$$1 && Node$$1.prototype );\r\n ClipNode.prototype.constructor = ClipNode;\r\n ClipNode.fn = ClipNode.prototype;\r\n ClipNode.fn.init = ClipNode.fn.constructor;\r\n\r\n ClipNode.prototype.renderClipRule = function renderClipRule () {\r\n return renderAttr(\"clip-rule\", \"evenodd\");\r\n };\r\n ClipNode.prototype.template = function template () {\r\n return (\"
\" + (this.renderChildren()) + \"\");\r\n };\r\n\r\n return ClipNode;\r\n }(Node));\r\n\r\n var DefinitionNode = (function (Node$$1) {\r\n function DefinitionNode() {\r\n Node$$1.call(this);\r\n this.definitionMap = {};\r\n }\r\n\r\n extendStatic(DefinitionNode, Node$$1);\r\n DefinitionNode.prototype = Object.create( Node$$1 && Node$$1.prototype );\r\n DefinitionNode.prototype.constructor = DefinitionNode;\r\n DefinitionNode.fn = DefinitionNode.prototype;\r\n DefinitionNode.fn.init = DefinitionNode.fn.constructor;\r\n\r\n DefinitionNode.prototype.attachTo = function attachTo (domElement) {\r\n this.element = domElement;\r\n };\r\n\r\n DefinitionNode.prototype.template = function template () {\r\n return (\"
\" + (this.renderChildren()) + \"\");\r\n };\r\n\r\n DefinitionNode.prototype.definitionChange = function definitionChange (e) {\r\n var definitions = e.definitions;\r\n var action = e.action;\r\n\r\n if (action === \"add\") {\r\n this.addDefinitions(definitions);\r\n } else if (action === \"remove\") {\r\n this.removeDefinitions(definitions);\r\n }\r\n };\r\n\r\n DefinitionNode.prototype.createDefinition = function createDefinition (type, item) {\r\n var nodeType;\r\n if (type === \"clip\") {\r\n nodeType = ClipNode;\r\n } else if (type === \"fill\") {\r\n if (item instanceof LinearGradient) {\r\n nodeType = LinearGradientNode;\r\n } else if (item instanceof RadialGradient) {\r\n nodeType = RadialGradientNode;\r\n }\r\n }\r\n return new nodeType(item);\r\n };\r\n\r\n DefinitionNode.prototype.addDefinitions = function addDefinitions (definitions) {\r\n var this$1$1 = this;\r\n\r\n for (var field in definitions) {\r\n this$1$1.addDefinition(field, definitions[field]);\r\n }\r\n };\r\n\r\n DefinitionNode.prototype.addDefinition = function addDefinition (type, srcElement) {\r\n var ref = this;\r\n var element = ref.element;\r\n var definitionMap = ref.definitionMap;\r\n var id = srcElement.id;\r\n var mapItem = definitionMap[id];\r\n if (!mapItem) {\r\n var node = this.createDefinition(type, srcElement);\r\n definitionMap[id] = {\r\n element: node,\r\n count: 1\r\n };\r\n this.append(node);\r\n if (element) {\r\n node.attachTo(this.element);\r\n }\r\n } else {\r\n mapItem.count++;\r\n }\r\n };\r\n\r\n DefinitionNode.prototype.removeDefinitions = function removeDefinitions (definitions) {\r\n var this$1$1 = this;\r\n\r\n for (var field in definitions) {\r\n this$1$1.removeDefinition(definitions[field]);\r\n }\r\n };\r\n\r\n DefinitionNode.prototype.removeDefinition = function removeDefinition (srcElement) {\r\n var definitionMap = this.definitionMap;\r\n var id = srcElement.id;\r\n var mapItem = definitionMap[id];\r\n\r\n if (mapItem) {\r\n mapItem.count--;\r\n if (mapItem.count === 0) {\r\n this.remove(this.childNodes.indexOf(mapItem.element), 1);\r\n delete definitionMap[id];\r\n }\r\n }\r\n };\r\n\r\n return DefinitionNode;\r\n }(Node));\r\n\r\n var RootNode = (function (Node$$1) {\r\n function RootNode(options) {\r\n Node$$1.call(this);\r\n this.options = options;\r\n this.defs = new DefinitionNode();\r\n }\r\n\r\n extendStatic(RootNode, Node$$1);\r\n RootNode.prototype = Object.create( Node$$1 && Node$$1.prototype );\r\n RootNode.prototype.constructor = RootNode;\r\n RootNode.fn = RootNode.prototype;\r\n RootNode.fn.init = RootNode.fn.constructor;\r\n\r\n RootNode.prototype.attachTo = function attachTo (domElement) {\r\n this.element = domElement;\r\n this.defs.attachTo(domElement.firstElementChild);\r\n };\r\n\r\n RootNode.prototype.clear = function clear () {\r\n BaseNode.prototype.clear.call(this);\r\n };\r\n\r\n RootNode.prototype.template = function template () {\r\n return this.defs.render() + this.renderChildren();\r\n };\r\n\r\n RootNode.prototype.definitionChange = function definitionChange (e) {\r\n this.defs.definitionChange(e);\r\n };\r\n\r\n return RootNode;\r\n }(Node));\r\n\r\n var DASH_ARRAYS = {\r\n dot: [ 1.5, 3.5 ],\r\n dash: [ 4, 3.5 ],\r\n longdash: [ 8, 3.5 ],\r\n dashdot: [ 3.5, 3.5, 1.5, 3.5 ],\r\n longdashdot: [ 8, 3.5, 1.5, 3.5 ],\r\n longdashdotdot: [ 8, 3.5, 1.5, 3.5, 1.5, 3.5 ]\r\n };\r\n\r\n var SOLID = \"solid\";\r\n var BUTT = \"butt\";\r\n\r\n var ATTRIBUTE_MAP = {\r\n \"fill.opacity\": \"fill-opacity\",\r\n \"stroke.color\": \"stroke\",\r\n \"stroke.width\": \"stroke-width\",\r\n \"stroke.opacity\": \"stroke-opacity\"\r\n };\r\n\r\n var PathNode = (function (Node$$1) {\r\n function PathNode () {\r\n Node$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(PathNode, Node$$1);\r\n PathNode.prototype = Object.create( Node$$1 && Node$$1.prototype );\r\n PathNode.prototype.constructor = PathNode;\r\n PathNode.fn = PathNode.prototype;\r\n PathNode.fn.init = PathNode.fn.constructor;\r\n\r\n PathNode.prototype.geometryChange = function geometryChange () {\r\n this.attr(\"d\", this.renderData());\r\n this.invalidate();\r\n };\r\n\r\n PathNode.prototype.optionsChange = function optionsChange (e) {\r\n switch (e.field) {\r\n case \"fill\":\r\n if (e.value) {\r\n this.allAttr(this.mapFill(e.value));\r\n } else {\r\n this.removeAttr(\"fill\");\r\n }\r\n break;\r\n\r\n case \"fill.color\":\r\n this.allAttr(this.mapFill({ color: e.value }));\r\n break;\r\n\r\n case \"stroke\":\r\n if (e.value) {\r\n this.allAttr(this.mapStroke(e.value));\r\n } else {\r\n this.removeAttr(\"stroke\");\r\n }\r\n break;\r\n\r\n case \"transform\":\r\n this.transformChange(e.value);\r\n break;\r\n\r\n default:\r\n var name = ATTRIBUTE_MAP[e.field];\r\n if (name) {\r\n this.attr(name, e.value);\r\n }\r\n break;\r\n }\r\n\r\n this.accessibilityOptionsChange(e);\r\n\r\n Node$$1.prototype.optionsChange.call(this, e);\r\n };\r\n\r\n PathNode.prototype.content = function content () {\r\n if (this.element) {\r\n this.element.textContent = this.srcElement.content();\r\n }\r\n };\r\n\r\n PathNode.prototype.renderData = function renderData () {\r\n return this.srcElement.toString(POINT_DIGITS) || undefined;\r\n };\r\n\r\n PathNode.prototype.mapStroke = function mapStroke (stroke) {\r\n var attrs = [];\r\n\r\n if (stroke && !isTransparent(stroke.color)) {\r\n attrs.push([ \"stroke\", stroke.color ]);\r\n attrs.push([ \"stroke-width\", stroke.width ]);\r\n attrs.push([ \"stroke-linecap\", this.renderLinecap(stroke) ]);\r\n attrs.push([ \"stroke-linejoin\", stroke.lineJoin ]);\r\n\r\n if (defined(stroke.opacity)) {\r\n attrs.push([ \"stroke-opacity\", stroke.opacity ]);\r\n }\r\n\r\n if (defined(stroke.dashType)) {\r\n attrs.push([ \"stroke-dasharray\", this.renderDashType(stroke) ]);\r\n }\r\n } else {\r\n attrs.push([ \"stroke\", NONE ]);\r\n }\r\n\r\n return attrs;\r\n };\r\n\r\n PathNode.prototype.renderStroke = function renderStroke () {\r\n return renderAllAttr(\r\n this.mapStroke(this.srcElement.options.stroke)\r\n );\r\n };\r\n\r\n PathNode.prototype.renderDashType = function renderDashType (stroke) {\r\n var dashType = stroke.dashType;\r\n var width = stroke.width; if (width === void 0) { width = 1; }\r\n\r\n if (dashType && dashType !== SOLID) {\r\n var dashArray = DASH_ARRAYS[dashType.toLowerCase()];\r\n var result = [];\r\n\r\n for (var i = 0; i < dashArray.length; i++) {\r\n result.push(dashArray[i] * width);\r\n }\r\n\r\n return result.join(\" \");\r\n }\r\n };\r\n\r\n PathNode.prototype.renderLinecap = function renderLinecap (stroke) {\r\n var dashType = stroke.dashType;\r\n var lineCap = stroke.lineCap;\r\n\r\n return (dashType && dashType !== \"solid\") ? BUTT : lineCap;\r\n };\r\n\r\n PathNode.prototype.mapFill = function mapFill (fill) {\r\n var attrs = [];\r\n if (!(fill && fill.nodeType === \"Gradient\")) {\r\n if (fill && !isTransparent(fill.color)) {\r\n attrs.push([ \"fill\", fill.color ]);\r\n\r\n if (defined(fill.opacity)) {\r\n attrs.push([ \"fill-opacity\", fill.opacity ]);\r\n }\r\n } else {\r\n attrs.push([ \"fill\", NONE ]);\r\n }\r\n }\r\n\r\n return attrs;\r\n };\r\n\r\n PathNode.prototype.renderFill = function renderFill () {\r\n return renderAllAttr(\r\n this.mapFill(this.srcElement.options.fill)\r\n );\r\n };\r\n\r\n PathNode.prototype.template = function template () {\r\n return \"
\";\r\n };\r\n\r\n return PathNode;\r\n }(Node));\r\n\r\n var ArcNode = (function (PathNode$$1) {\r\n function ArcNode () {\r\n PathNode$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(ArcNode, PathNode$$1);\r\n ArcNode.prototype = Object.create( PathNode$$1 && PathNode$$1.prototype );\r\n ArcNode.prototype.constructor = ArcNode;\r\n ArcNode.fn = ArcNode.prototype;\r\n ArcNode.fn.init = ArcNode.fn.constructor;\r\n\r\n ArcNode.prototype.renderData = function renderData () {\r\n return this.srcElement.toPath().toString(POINT_DIGITS);\r\n };\r\n\r\n return ArcNode;\r\n }(PathNode));\r\n\r\n var CircleNode = (function (PathNode$$1) {\r\n function CircleNode () {\r\n PathNode$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(CircleNode, PathNode$$1);\r\n CircleNode.prototype = Object.create( PathNode$$1 && PathNode$$1.prototype );\r\n CircleNode.prototype.constructor = CircleNode;\r\n CircleNode.fn = CircleNode.prototype;\r\n CircleNode.fn.init = CircleNode.fn.constructor;\r\n\r\n CircleNode.prototype.geometryChange = function geometryChange () {\r\n var center = this.center();\r\n this.attr(\"cx\", center.x);\r\n this.attr(\"cy\", center.y);\r\n this.attr(\"r\", this.radius());\r\n this.invalidate();\r\n };\r\n\r\n CircleNode.prototype.center = function center () {\r\n return this.srcElement.geometry().center;\r\n };\r\n\r\n CircleNode.prototype.radius = function radius () {\r\n return this.srcElement.geometry().radius;\r\n };\r\n\r\n CircleNode.prototype.template = function template () {\r\n return \"
\";\r\n };\r\n\r\n return CircleNode;\r\n }(PathNode));\r\n\r\n var GroupNode = (function (Node$$1) {\r\n function GroupNode () {\r\n Node$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(GroupNode, Node$$1);\r\n GroupNode.prototype = Object.create( Node$$1 && Node$$1.prototype );\r\n GroupNode.prototype.constructor = GroupNode;\r\n GroupNode.fn = GroupNode.prototype;\r\n GroupNode.fn.init = GroupNode.fn.constructor;\r\n\r\n GroupNode.prototype.template = function template () {\r\n return (\"
\" + (this.renderChildren()) + \"\");\r\n };\r\n\r\n GroupNode.prototype.optionsChange = function optionsChange (e) {\r\n var field = e.field;\r\n var value = e.value;\r\n\r\n if (field === \"transform\") {\r\n this.transformChange(value);\r\n }\r\n\r\n this.accessibilityOptionsChange(e);\r\n\r\n Node$$1.prototype.optionsChange.call(this, e);\r\n };\r\n\r\n return GroupNode;\r\n }(Node));\r\n\r\n var ImageNode = (function (PathNode$$1) {\r\n function ImageNode () {\r\n PathNode$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(ImageNode, PathNode$$1);\r\n ImageNode.prototype = Object.create( PathNode$$1 && PathNode$$1.prototype );\r\n ImageNode.prototype.constructor = ImageNode;\r\n ImageNode.fn = ImageNode.prototype;\r\n ImageNode.fn.init = ImageNode.fn.constructor;\r\n\r\n ImageNode.prototype.geometryChange = function geometryChange () {\r\n this.allAttr(this.mapPosition());\r\n this.invalidate();\r\n };\r\n\r\n ImageNode.prototype.optionsChange = function optionsChange (e) {\r\n if (e.field === \"src\") {\r\n this.allAttr(this.mapSource());\r\n }\r\n\r\n PathNode$$1.prototype.optionsChange.call(this, e);\r\n };\r\n\r\n ImageNode.prototype.mapPosition = function mapPosition () {\r\n var rect = this.srcElement.rect();\r\n var tl = rect.topLeft();\r\n\r\n return [\r\n [ \"x\", tl.x ],\r\n [ \"y\", tl.y ],\r\n [ \"width\", rect.width() + \"px\" ],\r\n [ \"height\", rect.height() + \"px\" ]\r\n ];\r\n };\r\n\r\n ImageNode.prototype.renderPosition = function renderPosition () {\r\n return renderAllAttr(this.mapPosition());\r\n };\r\n\r\n ImageNode.prototype.mapSource = function mapSource (encode) {\r\n var src = this.srcElement.src();\r\n\r\n if (encode) {\r\n src = htmlEncode(src);\r\n }\r\n\r\n return [ [ \"xlink:href\", src ] ];\r\n };\r\n\r\n ImageNode.prototype.renderSource = function renderSource () {\r\n return renderAllAttr(this.mapSource(true));\r\n };\r\n\r\n ImageNode.prototype.template = function template () {\r\n return \"
\" +\r\n \"\";\r\n };\r\n\r\n return ImageNode;\r\n }(PathNode));\r\n\r\n var MultiPathNode = (function (PathNode$$1) {\r\n function MultiPathNode () {\r\n PathNode$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(MultiPathNode, PathNode$$1);\r\n MultiPathNode.prototype = Object.create( PathNode$$1 && PathNode$$1.prototype );\r\n MultiPathNode.prototype.constructor = MultiPathNode;\r\n MultiPathNode.fn = MultiPathNode.prototype;\r\n MultiPathNode.fn.init = MultiPathNode.fn.constructor;\r\n\r\n MultiPathNode.prototype.renderData = function renderData () {\r\n return this.srcElement.toString(POINT_DIGITS) || 'undefined';\r\n };\r\n\r\n return MultiPathNode;\r\n }(PathNode));\r\n\r\n var RectNode = (function (PathNode$$1) {\r\n function RectNode () {\r\n PathNode$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(RectNode, PathNode$$1);\r\n RectNode.prototype = Object.create( PathNode$$1 && PathNode$$1.prototype );\r\n RectNode.prototype.constructor = RectNode;\r\n RectNode.fn = RectNode.prototype;\r\n RectNode.fn.init = RectNode.fn.constructor;\r\n\r\n RectNode.prototype.geometryChange = function geometryChange () {\r\n var geometry = this.srcElement.geometry();\r\n this.attr(\"x\", geometry.origin.x);\r\n this.attr(\"y\", geometry.origin.y);\r\n this.attr(\"width\", geometry.size.width);\r\n this.attr(\"height\", geometry.size.height);\r\n this.attr(\"rx\", geometry.cornerRadius[0]);\r\n this.attr(\"ry\", geometry.cornerRadius[1]);\r\n this.invalidate();\r\n };\r\n\r\n RectNode.prototype.size = function size () {\r\n return this.srcElement.geometry().size;\r\n };\r\n\r\n RectNode.prototype.origin = function origin () {\r\n return this.srcElement.geometry().origin;\r\n };\r\n\r\n RectNode.prototype.rx = function rx () {\r\n return this.srcElement.geometry().cornerRadius[0];\r\n };\r\n\r\n RectNode.prototype.ry = function ry () {\r\n return this.srcElement.geometry().cornerRadius[1];\r\n };\r\n\r\n RectNode.prototype.template = function template () {\r\n return \"
\";\r\n };\r\n\r\n return RectNode;\r\n }(PathNode));\r\n\r\n var ENTITY_REGEX = /&(?:[a-zA-Z]+|#\\d+);/g;\r\n\r\n function decodeEntities(text) {\r\n if (!text || typeof text !== \"string\" || !ENTITY_REGEX.test(text)) {\r\n return text;\r\n }\r\n\r\n var element = decodeEntities._element;\r\n ENTITY_REGEX.lastIndex = 0;\r\n\r\n return text.replace(ENTITY_REGEX, function (match) {\r\n element.innerHTML = match;\r\n\r\n return element.textContent || element.innerText;\r\n });\r\n }\r\n\r\n if (typeof document !== \"undefined\") {\r\n decodeEntities._element = document.createElement(\"span\");\r\n }\r\n\r\n var TextNode = (function (PathNode$$1) {\r\n function TextNode () {\r\n PathNode$$1.apply(this, arguments);\r\n }\r\n\r\n extendStatic(TextNode, PathNode$$1);\r\n TextNode.prototype = Object.create( PathNode$$1 && PathNode$$1.prototype );\r\n TextNode.prototype.constructor = TextNode;\r\n TextNode.fn = TextNode.prototype;\r\n TextNode.fn.init = TextNode.fn.constructor;\r\n\r\n TextNode.prototype.geometryChange = function geometryChange () {\r\n var pos = this.pos();\r\n this.attr(\"x\", pos.x);\r\n this.attr(\"y\", pos.y);\r\n this.invalidate();\r\n };\r\n\r\n TextNode.prototype.optionsChange = function optionsChange (e) {\r\n if (e.field === \"font\") {\r\n this.attr(\"style\", renderStyle(this.mapStyle()));\r\n this.geometryChange();\r\n } else if (e.field === \"content\") {\r\n PathNode$$1.prototype.content.call(this, this.srcElement.content());\r\n }\r\n\r\n PathNode$$1.prototype.optionsChange.call(this, e);\r\n };\r\n\r\n TextNode.prototype.mapStyle = function mapStyle (encode) {\r\n var style = PathNode$$1.prototype.mapStyle.call(this, encode);\r\n var font = this.srcElement.options.font;\r\n\r\n if (encode) {\r\n font = htmlEncode(font);\r\n }\r\n\r\n style.push([ \"font\", font ], [ \"white-space\", \"pre\" ]);\r\n\r\n return style;\r\n };\r\n\r\n TextNode.prototype.pos = function pos () {\r\n var pos = this.srcElement.position();\r\n var size = this.srcElement.measure();\r\n return pos.clone().setY(pos.y + size.baseline);\r\n };\r\n\r\n TextNode.prototype.renderContent = function renderContent () {\r\n var content = this.srcElement.content();\r\n content = decodeEntities(content);\r\n content = htmlEncode(content);\r\n\r\n return kendoUtil.normalizeText(content);\r\n };\r\n\r\n TextNode.prototype.renderTextAnchor = function renderTextAnchor () {\r\n var anchor;\r\n\r\n if ((this.options || {}).rtl && !(supportBrowser.msie || supportBrowser.edge)) {\r\n anchor = 'end';\r\n }\r\n\r\n return renderAttr(\"text-anchor\", anchor);\r\n };\r\n\r\n TextNode.prototype.renderPaintOrder = function renderPaintOrder () {\r\n var paintOrder = this.srcElement.options.paintOrder;\r\n return paintOrder ? renderAttr(\"paint-order\", paintOrder) : \"\";\r\n };\r\n\r\n TextNode.prototype.template = function template () {\r\n return \"
\" + (this.renderContent()) + \"\";\r\n };\r\n\r\n return TextNode;\r\n }(PathNode));\r\n\r\n NODE_MAP.Arc = ArcNode;\r\n NODE_MAP.Circle = CircleNode;\r\n NODE_MAP.Group = GroupNode;\r\n NODE_MAP.Image = ImageNode;\r\n NODE_MAP.MultiPath = MultiPathNode;\r\n NODE_MAP.Path = PathNode;\r\n NODE_MAP.Rect = RectNode;\r\n NODE_MAP.Text = TextNode;\r\n\r\n var RTL = 'rtl';\r\n\r\n function alignToScreen(element) {\r\n var ctm;\r\n\r\n try {\r\n ctm = element.getScreenCTM ? element.getScreenCTM() : null;\r\n } catch (e) { } // eslint-disable-line no-empty\r\n\r\n if (ctm) {\r\n var left = - ctm.e % 1;\r\n var top = - ctm.f % 1;\r\n var style = element.style;\r\n\r\n if (left !== 0 || top !== 0) {\r\n style.left = left + \"px\";\r\n style.top = top + \"px\";\r\n }\r\n }\r\n }\r\n\r\n var Surface$3 = (function (BaseSurface) {\r\n function Surface(element, options) {\r\n BaseSurface.call(this, element, options);\r\n\r\n this._root = new RootNode($.extend({\r\n rtl: elementStyles(element, 'direction').direction === RTL\r\n }, this.options));\r\n\r\n renderSVG$1(this.element, this._template(''));\r\n\r\n this._rootElement = this.element.firstElementChild;\r\n this._rootElement.style.width = '100%';\r\n this._rootElement.style.height = '100%';\r\n this._rootElement.style.overflow = 'hidden';\r\n\r\n alignToScreen(this._rootElement);\r\n\r\n this._root.attachTo(this._rootElement);\r\n\r\n bindEvents(this.element, {\r\n click: this._click,\r\n mouseover: this._mouseenter,\r\n mouseout: this._mouseleave,\r\n mousemove: this._mousemove\r\n });\r\n\r\n this.resize();\r\n }\r\n\r\n extendStatic(Surface, BaseSurface);\r\n Surface.prototype = Object.create( BaseSurface && BaseSurface.prototype );\r\n Surface.prototype.constructor = Surface;\r\n Surface.fn = Surface.prototype;\r\n Surface.fn.init = Surface.fn.constructor;\r\n\r\n var prototypeAccessors = { type: {} };\r\n\r\n prototypeAccessors.type.get = function () {\r\n return \"svg\";\r\n };\r\n\r\n Surface.prototype.destroy = function destroy () {\r\n if (this._root) {\r\n this._root.destroy();\r\n this._root = null;\r\n this._rootElement = null;\r\n unbindEvents(this.element, {\r\n click: this._click,\r\n mouseover: this._mouseenter,\r\n mouseout: this._mouseleave,\r\n mousemove: this._mousemove\r\n });\r\n }\r\n\r\n BaseSurface.prototype.destroy.call(this);\r\n };\r\n\r\n Surface.prototype.translate = function translate (offset) {\r\n var viewBox = (Math.round(offset.x)) + \" \" + (Math.round(offset.y)) + \" \" + (this._size.width) + \" \" + (this._size.height);\r\n\r\n this._offset = offset;\r\n this._rootElement.setAttribute(\"viewBox\", viewBox);\r\n };\r\n\r\n Surface.prototype.draw = function draw (element) {\r\n BaseSurface.prototype.draw.call(this, element);\r\n this._root.load([ element ]);\r\n };\r\n\r\n Surface.prototype.clear = function clear () {\r\n BaseSurface.prototype.clear.call(this);\r\n this._root.clear();\r\n };\r\n\r\n Surface.prototype.svg = function svg () {\r\n return \"\" + this._template();\r\n };\r\n\r\n Surface.prototype.exportVisual = function exportVisual () {\r\n var ref = this;\r\n var visual = ref._visual;\r\n var offset = ref._offset;\r\n\r\n if (offset) {\r\n var wrap = new Group();\r\n wrap.children.push(visual);\r\n\r\n wrap.transform(\r\n transform$1().translate(-offset.x, -offset.y)\r\n );\r\n\r\n visual = wrap;\r\n }\r\n\r\n return visual;\r\n };\r\n\r\n Surface.prototype._resize = function _resize () {\r\n if (this._offset) {\r\n this.translate(this._offset);\r\n }\r\n };\r\n\r\n Surface.prototype._template = function _template (svgStyles) {\r\n var styles = typeof svgStyles === 'string' ? svgStyles :\r\n \"style='width: 100%; height: 100%; overflow: hidden;' \";\r\n return (\"
\");\r\n };\r\n\r\n Object.defineProperties( Surface.prototype, prototypeAccessors );\r\n\r\n return Surface;\r\n }(Surface$2));\r\n\r\n var NODE_MAP$2 = {};\r\n\r\n var Node$2 = (function (BaseNode$$1) {\r\n function Node(srcElement) {\r\n BaseNode$$1.call(this, srcElement);\r\n if (srcElement) {\r\n this.initClip();\r\n }\r\n }\r\n\r\n extendStatic(Node, BaseNode$$1);\r\n Node.prototype = Object.create( BaseNode$$1 && BaseNode$$1.prototype );\r\n Node.prototype.constructor = Node;\r\n Node.fn = Node.prototype;\r\n Node.fn.init = Node.fn.constructor;\r\n\r\n Node.prototype.initClip = function initClip () {\r\n var clip = this.srcElement.clip();\r\n if (clip) {\r\n this.clip = clip;\r\n clip.addObserver(this);\r\n }\r\n };\r\n\r\n Node.prototype.clear = function clear () {\r\n if (this.srcElement) {\r\n this.srcElement.removeObserver(this);\r\n }\r\n\r\n this.clearClip();\r\n\r\n BaseNode$$1.prototype.clear.call(this);\r\n };\r\n\r\n Node.prototype.clearClip = function clearClip () {\r\n if (this.clip) {\r\n this.clip.removeObserver(this);\r\n delete this.clip;\r\n }\r\n };\r\n\r\n Node.prototype.setClip = function setClip (ctx) {\r\n if (this.clip) {\r\n ctx.beginPath();\r\n\r\n var clipNode = new NODE_MAP$2[this.clip.nodeType](this.clip);\r\n clipNode.renderPoints(ctx, this.clip);\r\n\r\n ctx.clip(\"evenodd\");\r\n }\r\n };\r\n\r\n Node.prototype.optionsChange = function optionsChange (e) {\r\n if (e.field === \"clip\") {\r\n this.clearClip();\r\n this.initClip();\r\n }\r\n\r\n BaseNode$$1.prototype.optionsChange.call(this, e);\r\n };\r\n\r\n Node.prototype.setTransform = function setTransform (ctx) {\r\n if (this.srcElement) {\r\n var transform = this.srcElement.transform();\r\n if (transform) {\r\n ctx.transform.apply(ctx, transform.matrix().toArray(6));\r\n }\r\n }\r\n };\r\n\r\n Node.prototype.loadElements = function loadElements (elements, pos, cors) {\r\n var this$1$1 = this;\r\n\r\n for (var i = 0; i < elements.length; i++) {\r\n var srcElement = elements[i];\r\n var children = srcElement.children;\r\n\r\n var childNode = new NODE_MAP$2[srcElement.nodeType](srcElement, cors);\r\n\r\n if (children && children.length > 0) {\r\n childNode.load(children, pos, cors);\r\n }\r\n\r\n if (defined(pos)) {\r\n this$1$1.insertAt(childNode, pos);\r\n } else {\r\n this$1$1.append(childNode);\r\n }\r\n }\r\n };\r\n\r\n Node.prototype.load = function load (elements, pos, cors) {\r\n this.loadElements(elements, pos, cors);\r\n\r\n this.invalidate();\r\n };\r\n\r\n Node.prototype.setOpacity = function setOpacity (ctx) {\r\n if (this.srcElement) {\r\n var opacity = this.srcElement.opacity();\r\n if (defined(opacity)) {\r\n this.globalAlpha(ctx, opacity);\r\n }\r\n }\r\n };\r\n\r\n Node.prototype.globalAlpha = function globalAlpha (ctx, value) {\r\n var opactity = value;\r\n if (opactity && ctx.globalAlpha) {\r\n opactity *= ctx.globalAlpha;\r\n }\r\n ctx.globalAlpha = opactity;\r\n };\r\n\r\n Node.prototype.visible = function visible () {\r\n var src = this.srcElement;\r\n return !src || (src && src.options.visible !== false);\r\n };\r\n\r\n return Node;\r\n }(BaseNode));\r\n\r\n var GroupNode$2 = (function (superclass) {\r\n function GroupNode () {\r\n superclass.apply(this, arguments);\r\n }\r\n\r\n extendStatic(GroupNode, superclass);\r\n GroupNode.prototype = Object.create( superclass && superclass.prototype );\r\n GroupNode.prototype.constructor = GroupNode;\r\n GroupNode.fn = GroupNode.prototype;\r\n GroupNode.fn.init = GroupNode.fn.constructor;\r\n\r\n GroupNode.prototype.renderTo = function renderTo (ctx) {\r\n if (!this.visible()) {\r\n return;\r\n }\r\n\r\n ctx.save();\r\n\r\n this.setTransform(ctx);\r\n this.setClip(ctx);\r\n this.setOpacity(ctx);\r\n\r\n var childNodes = this.childNodes;\r\n for (var i = 0; i < childNodes.length; i++) {\r\n var child = childNodes[i];\r\n if (child.visible()) {\r\n child.renderTo(ctx);\r\n }\r\n }\r\n\r\n ctx.restore();\r\n };\r\n\r\n return GroupNode;\r\n }(traversable(Node$2, \"childNodes\")));\r\n\r\n var FRAME_DELAY = 1000 / 60;\r\n\r\n var RootNode$2 = (function (superclass) {\r\n function RootNode(canvas, size) {\r\n superclass.call(this);\r\n\r\n this.canvas = canvas;\r\n this.size = size;\r\n this.ctx = canvas.getContext(\"2d\");\r\n\r\n var invalidateHandler = this._invalidate.bind(this);\r\n this.invalidate = kendo.throttle(function () {\r\n kendo.animationFrame(invalidateHandler);\r\n }, FRAME_DELAY);\r\n }\r\n\r\n extendStatic(RootNode, superclass);\r\n RootNode.prototype = Object.create( superclass && superclass.prototype );\r\n RootNode.prototype.constructor = RootNode;\r\n RootNode.fn = RootNode.prototype;\r\n RootNode.fn.init = RootNode.fn.constructor;\r\n\r\n RootNode.prototype.destroy = function destroy () {\r\n superclass.prototype.destroy.call(this);\r\n this.canvas = null;\r\n this.ctx = null;\r\n };\r\n\r\n RootNode.prototype.load = function load (elements, pos, cors) {\r\n this.loadElements(elements, pos, cors);\r\n this._invalidate();\r\n };\r\n\r\n RootNode.prototype._rescale = function _rescale (scale) {\r\n var ref = this;\r\n var canvas = ref.canvas;\r\n var size = ref.size;\r\n canvas.width = size.width * scale;\r\n canvas.height = size.height * scale;\r\n this.ctx.scale(scale, scale);\r\n };\r\n\r\n RootNode.prototype._devicePixelRatio = function _devicePixelRatio () {\r\n if (typeof window.devicePixelRatio === 'number') {\r\n return window.devicePixelRatio;\r\n }\r\n\r\n return 1;\r\n };\r\n\r\n RootNode.prototype._invalidate = function _invalidate (options) {\r\n if (!this.ctx) {\r\n return;\r\n }\r\n\r\n var fixedScale = options && options.fixedScale;\r\n var scale = fixedScale ? 1 : this._devicePixelRatio();\r\n this._rescale(scale);\r\n\r\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n this.renderTo(this.ctx);\r\n };\r\n\r\n return RootNode;\r\n }(traversable(GroupNode$2, \"childNodes\")));\r\n\r\n var QuadRoot = (function (Class$$1) {\r\n function QuadRoot() {\r\n Class$$1.call(this);\r\n\r\n this.shapes = [];\r\n }\r\n\r\n extendStatic(QuadRoot, Class$$1);\r\n QuadRoot.prototype = Object.create( Class$$1 && Class$$1.prototype );\r\n QuadRoot.prototype.constructor = QuadRoot;\r\n QuadRoot.fn = QuadRoot.prototype;\r\n QuadRoot.fn.init = QuadRoot.fn.constructor;\r\n\r\n QuadRoot.prototype._add = function _add (shape, bbox) {\r\n this.shapes.push({\r\n bbox: bbox,\r\n shape: shape\r\n });\r\n shape._quadNode = this;\r\n };\r\n\r\n QuadRoot.prototype.pointShapes = function pointShapes (point) {\r\n var shapes = this.shapes;\r\n var length = shapes.length;\r\n var result = [];\r\n for (var idx = 0; idx < length; idx++) {\r\n if (shapes[idx].bbox.containsPoint(point)) {\r\n result.push(shapes[idx].shape);\r\n }\r\n }\r\n return result;\r\n };\r\n\r\n QuadRoot.prototype.insert = function insert (shape, bbox) {\r\n this._add(shape, bbox);\r\n };\r\n\r\n QuadRoot.prototype.remove = function remove (shape) {\r\n var shapes = this.shapes;\r\n var length = shapes.length;\r\n\r\n for (var idx = 0; idx < length; idx++) {\r\n if (shapes[idx].shape === shape) {\r\n shapes.splice(idx, 1);\r\n break;\r\n }\r\n }\r\n };\r\n\r\n return QuadRoot;\r\n }(Class));\r\n\r\n var QuadNode = (function (QuadRoot$$1) {\r\n function QuadNode(rect) {\r\n QuadRoot$$1.call(this);\r\n this.children = [];\r\n this.rect = rect;\r\n }\r\n\r\n extendStatic(QuadNode, QuadRoot$$1);\r\n QuadNode.prototype = Object.create( QuadRoot$$1 && QuadRoot$$1.prototype );\r\n QuadNode.prototype.constructor = QuadNode;\r\n QuadNode.fn = QuadNode.prototype;\r\n QuadNode.fn.init = QuadNode.fn.constructor;\r\n\r\n QuadNode.prototype.inBounds = function inBounds (rect) {\r\n var nodeRect = this.rect;\r\n var nodeBottomRight = nodeRect.bottomRight();\r\n var bottomRight = rect.bottomRight();\r\n var inBounds = nodeRect.origin.x <= rect.origin.x && nodeRect.origin.y <= rect.origin.y && bottomRight.x <= nodeBottomRight.x &&\r\n bottomRight.y <= nodeBottomRight.y;\r\n return inBounds;\r\n };\r\n\r\n QuadNode.prototype.pointShapes = function pointShapes (point) {\r\n var children = this.children;\r\n var length = children.length;\r\n var result = QuadRoot$$1.prototype.pointShapes.call(this, point);\r\n for (var idx = 0; idx < length; idx++) {\r\n append$1$1(result, children[idx].pointShapes(point));\r\n }\r\n return result;\r\n };\r\n\r\n QuadNode.prototype.insert = function insert (shape, bbox) {\r\n var children = this.children;\r\n var inserted = false;\r\n\r\n if (this.inBounds(bbox)) {\r\n if (this.shapes.length < 4) {\r\n this._add(shape, bbox);\r\n } else {\r\n if (!children.length) {\r\n this._initChildren();\r\n }\r\n\r\n for (var idx = 0; idx < children.length; idx++) {\r\n if (children[idx].insert(shape, bbox)) {\r\n inserted = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!inserted) {\r\n this._add(shape, bbox);\r\n }\r\n }\r\n inserted = true;\r\n }\r\n\r\n return inserted;\r\n };\r\n\r\n QuadNode.prototype._initChildren = function _initChildren () {\r\n var ref = this;\r\n var rect = ref.rect;\r\n var children = ref.children;\r\n var center = rect.center();\r\n var halfWidth = rect.width() / 2;\r\n var halfHeight = rect.height() / 2;\r\n\r\n children.push(\r\n new QuadNode(new Rect([ rect.origin.x, rect.origin.y ], [ halfWidth, halfHeight ])),\r\n new QuadNode(new Rect([ center.x, rect.origin.y ], [ halfWidth, halfHeight ])),\r\n new QuadNode(new Rect([ rect.origin.x, center.y ], [ halfWidth, halfHeight ])),\r\n new QuadNode(new Rect([ center.x, center.y ], [ halfWidth, halfHeight ]))\r\n );\r\n };\r\n\r\n return QuadNode;\r\n }(QuadRoot));\r\n\r\n var ROOT_SIZE = 3000;\r\n var LEVEL_STEP = 10000;\r\n var MAX_LEVEL = 75;\r\n\r\n var ShapesQuadTree = (function (Class$$1) {\r\n function ShapesQuadTree() {\r\n Class$$1.call(this);\r\n\r\n this.initRoots();\r\n }\r\n\r\n extendStatic(ShapesQuadTree, Class$$1);\r\n ShapesQuadTree.prototype = Object.create( Class$$1 && Class$$1.prototype );\r\n ShapesQuadTree.prototype.constructor = ShapesQuadTree;\r\n ShapesQuadTree.fn = ShapesQuadTree.prototype;\r\n ShapesQuadTree.fn.init = ShapesQuadTree.fn.constructor;\r\n\r\n ShapesQuadTree.prototype.initRoots = function initRoots () {\r\n this.rootMap = {};\r\n this.root = new QuadRoot();\r\n this.rootElements = [];\r\n };\r\n\r\n ShapesQuadTree.prototype.clear = function clear () {\r\n var this$1$1 = this;\r\n\r\n var rootElements = this.rootElements;\r\n for (var idx = 0; idx < rootElements.length; idx++) {\r\n this$1$1.remove(rootElements[idx]);\r\n }\r\n this.initRoots();\r\n };\r\n\r\n ShapesQuadTree.prototype.pointShape = function pointShape (point) {\r\n var sectorRoot = ( this.rootMap[ Math.floor( point.x / ROOT_SIZE ) ] || {} )[ Math.floor( point.y / ROOT_SIZE ) ];\r\n var result = this.root.pointShapes(point);\r\n\r\n if (sectorRoot) {\r\n result = result.concat(sectorRoot.pointShapes(point));\r\n }\r\n\r\n this.assignZindex(result);\r\n\r\n result.sort(zIndexComparer);\r\n for (var idx = 0; idx < result.length; idx++) {\r\n if (result[idx].containsPoint(point)) {\r\n return result[idx];\r\n }\r\n }\r\n };\r\n\r\n ShapesQuadTree.prototype.assignZindex = function assignZindex (elements) {\r\n var this$1$1 = this;\r\n\r\n for (var idx = 0; idx < elements.length; idx++) {\r\n var element = elements[idx];\r\n var zIndex = 0;\r\n var levelWeight = Math.pow(LEVEL_STEP, MAX_LEVEL);\r\n var parents = [];\r\n\r\n while (element) {\r\n parents.push(element);\r\n element = element.parent;\r\n }\r\n\r\n while (parents.length) {\r\n element = parents.pop();\r\n zIndex += ((element.parent ? element.parent.children : this$1$1.rootElements).indexOf(element) + 1) * levelWeight;\r\n levelWeight /= LEVEL_STEP;\r\n }\r\n\r\n elements[idx]._zIndex = zIndex;\r\n }\r\n };\r\n\r\n ShapesQuadTree.prototype.optionsChange = function optionsChange (e) {\r\n if (e.field === \"transform\" || e.field === \"stroke.width\") {\r\n this.bboxChange(e.element);\r\n }\r\n };\r\n\r\n ShapesQuadTree.prototype.geometryChange = function geometryChange (e) {\r\n this.bboxChange(e.element);\r\n };\r\n\r\n ShapesQuadTree.prototype.bboxChange = function bboxChange (element) {\r\n var this$1$1 = this;\r\n\r\n if (element.nodeType === \"Group\") {\r\n for (var idx = 0; idx < element.children.length; idx++) {\r\n this$1$1.bboxChange(element.children[idx]);\r\n }\r\n } else {\r\n if (element._quadNode) {\r\n element._quadNode.remove(element);\r\n }\r\n this._insertShape(element);\r\n }\r\n };\r\n\r\n ShapesQuadTree.prototype.add = function add (elements) {\r\n var elementsArray = Array.isArray(elements) ? elements.slice(0) : [ elements ];\r\n\r\n append$1$1(this.rootElements, elementsArray);\r\n this._insert(elementsArray);\r\n };\r\n\r\n ShapesQuadTree.prototype.childrenChange = function childrenChange (e) {\r\n var this$1$1 = this;\r\n\r\n if (e.action === \"remove\") {\r\n for (var idx = 0; idx < e.items.length; idx++) {\r\n this$1$1.remove(e.items[idx]);\r\n }\r\n } else {\r\n this._insert(Array.prototype.slice.call(e.items, 0));\r\n }\r\n };\r\n\r\n ShapesQuadTree.prototype._insert = function _insert (elements) {\r\n var this$1$1 = this;\r\n\r\n var element;\r\n\r\n while (elements.length > 0) {\r\n element = elements.pop();\r\n element.addObserver(this$1$1);\r\n if (element.nodeType === \"Group\") {\r\n append$1$1(elements, element.children);\r\n } else {\r\n this$1$1._insertShape(element);\r\n }\r\n }\r\n };\r\n\r\n ShapesQuadTree.prototype._insertShape = function _insertShape (shape) {\r\n var bbox = shape.bbox();\r\n if (bbox) {\r\n var sectors = this.getSectors(bbox);\r\n var x = sectors[0][0];\r\n var y = sectors[1][0];\r\n\r\n if (this.inRoot(sectors)) {\r\n this.root.insert(shape, bbox);\r\n } else {\r\n var rootMap = this.rootMap;\r\n if (!rootMap[x]) {\r\n rootMap[x] = {};\r\n }\r\n\r\n if (!rootMap[x][y]) {\r\n rootMap[x][y] = new QuadNode(\r\n new Rect([ x * ROOT_SIZE, y * ROOT_SIZE ], [ ROOT_SIZE, ROOT_SIZE ])\r\n );\r\n }\r\n\r\n rootMap[x][y].insert(shape, bbox);\r\n }\r\n }\r\n };\r\n\r\n ShapesQuadTree.prototype.remove = function remove (element) {\r\n var this$1$1 = this;\r\n\r\n element.removeObserver(this);\r\n\r\n if (element.nodeType === \"Group\") {\r\n var children = element.children;\r\n for (var idx = 0; idx < children.length; idx++) {\r\n this$1$1.remove(children[idx]);\r\n }\r\n } else if (element._quadNode) {\r\n element._quadNode.remove(element);\r\n delete element._quadNode;\r\n }\r\n };\r\n\r\n ShapesQuadTree.prototype.inRoot = function inRoot (sectors) {\r\n return sectors[0].length > 1 || sectors[1].length > 1;\r\n };\r\n\r\n ShapesQuadTree.prototype.getSectors = function getSectors (rect) {\r\n var bottomRight = rect.bottomRight();\r\n var bottomX = Math.floor(bottomRight.x / ROOT_SIZE);\r\n var bottomY = Math.floor(bottomRight.y / ROOT_SIZE);\r\n var sectors = [ [], [] ];\r\n for (var x = Math.floor(rect.origin.x / ROOT_SIZE); x <= bottomX; x++) {\r\n sectors[0].push(x);\r\n }\r\n for (var y = Math.floor(rect.origin.y / ROOT_SIZE); y <= bottomY; y++) {\r\n sectors[1].push(y);\r\n }\r\n return sectors;\r\n };\r\n\r\n return ShapesQuadTree;\r\n }(Class));\r\n\r\n function zIndexComparer(x1, x2) {\r\n if (x1._zIndex < x2._zIndex) {\r\n return 1;\r\n }\r\n if (x1._zIndex > x2._zIndex) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n var SurfaceCursor = function SurfaceCursor(surface) {\r\n surface.bind(\"mouseenter\", this._mouseenter.bind(this));\r\n surface.bind(\"mouseleave\", this._mouseleave.bind(this));\r\n\r\n this.element = surface.element;\r\n };\r\n\r\n SurfaceCursor.prototype.clear = function clear () {\r\n this._resetCursor();\r\n };\r\n\r\n SurfaceCursor.prototype.destroy = function destroy () {\r\n this._resetCursor();\r\n delete this.element;\r\n };\r\n\r\n SurfaceCursor.prototype._mouseenter = function _mouseenter (e) {\r\n var cursor = this._shapeCursor(e);\r\n\r\n if (!cursor) {\r\n this._resetCursor();\r\n } else {\r\n if (!this._current) {\r\n this._defaultCursor = this._getCursor();\r\n }\r\n\r\n this._setCursor(cursor);\r\n }\r\n };\r\n\r\n SurfaceCursor.prototype._mouseleave = function _mouseleave () {\r\n this._resetCursor();\r\n };\r\n\r\n SurfaceCursor.prototype._shapeCursor = function _shapeCursor (e) {\r\n var shape = e.element;\r\n\r\n while (shape && !defined(shape.options.cursor)) {\r\n shape = shape.parent;\r\n }\r\n\r\n if (shape) {\r\n return shape.options.cursor;\r\n }\r\n };\r\n\r\n SurfaceCursor.prototype._getCursor = function _getCursor () {\r\n if (this.element) {\r\n return this.element.style.cursor;\r\n }\r\n };\r\n\r\n SurfaceCursor.prototype._setCursor = function _setCursor (cursor) {\r\n if (this.element) {\r\n this.element.style.cursor = cursor;\r\n this._current = cursor;\r\n }\r\n };\r\n\r\n SurfaceCursor.prototype._resetCursor = function _resetCursor () {\r\n if (this._current) {\r\n this._setCursor(this._defaultCursor || \"\");\r\n delete this._current;\r\n }\r\n };\r\n\r\n function renderPath(ctx, path) {\r\n var segments = path.segments;\r\n\r\n if (segments.length === 0) {\r\n return;\r\n }\r\n\r\n var segment = segments[0];\r\n var anchor = segment.anchor();\r\n ctx.moveTo(anchor.x, anchor.y);\r\n\r\n for (var i = 1; i < segments.length; i++) {\r\n segment = segments[i];\r\n anchor = segment.anchor();\r\n\r\n var prevSeg = segments[i - 1];\r\n var prevOut = prevSeg.controlOut();\r\n var controlIn = segment.controlIn();\r\n\r\n if (prevOut && controlIn) {\r\n ctx.bezierCurveTo(prevOut.x, prevOut.y,\r\n controlIn.x, controlIn.y,\r\n anchor.x, anchor.y);\r\n } else {\r\n ctx.lineTo(anchor.x, anchor.y);\r\n }\r\n }\r\n\r\n if (path.options.closed) {\r\n ctx.closePath();\r\n }\r\n }\r\n\r\n function addGradientStops(gradient, stops) {\r\n for (var idx = 0; idx < stops.length; idx++) {\r\n var stop = stops[idx];\r\n var color = kendo.parseColor(stop.color());\r\n\r\n color.a *= stop.opacity();\r\n\r\n gradient.addColorStop(stop.offset(), color.toCssRgba());\r\n }\r\n }\r\n\r\n var PathNode$2 = (function (Node) {\r\n function PathNode () {\r\n Node.apply(this, arguments);\r\n }\r\n\r\n extendStatic(PathNode, Node);\r\n PathNode.prototype = Object.create( Node && Node.prototype );\r\n PathNode.prototype.constructor = PathNode;\r\n PathNode.fn = PathNode.prototype;\r\n PathNode.fn.init = PathNode.fn.constructor;\r\n\r\n PathNode.prototype.renderTo = function renderTo (ctx) {\r\n ctx.save();\r\n\r\n this.setTransform(ctx);\r\n this.setClip(ctx);\r\n this.setOpacity(ctx);\r\n\r\n ctx.beginPath();\r\n\r\n this.renderPoints(ctx, this.srcElement);\r\n\r\n this.setLineDash(ctx);\r\n this.setLineCap(ctx);\r\n this.setLineJoin(ctx);\r\n\r\n this.setFill(ctx);\r\n this.setStroke(ctx);\r\n\r\n ctx.restore();\r\n };\r\n\r\n PathNode.prototype.setFill = function setFill (ctx) {\r\n var fill = this.srcElement.options.fill;\r\n var hasFill = false;\r\n\r\n if (fill) {\r\n if (fill.nodeType === \"Gradient\") {\r\n this.setGradientFill(ctx, fill);\r\n hasFill = true;\r\n } else if (!isTransparent(fill.color)) {\r\n ctx.fillStyle = fill.color;\r\n\r\n ctx.save();\r\n this.globalAlpha(ctx, fill.opacity);\r\n ctx.fill();\r\n ctx.restore();\r\n\r\n hasFill = true;\r\n }\r\n }\r\n\r\n return hasFill;\r\n };\r\n\r\n PathNode.prototype.setGradientFill = function setGradientFill (ctx, fill) {\r\n var bbox = this.srcElement.rawBBox();\r\n var gradient;\r\n\r\n if (fill instanceof LinearGradient) {\r\n var start = fill.start();\r\n var end = fill.end();\r\n gradient = ctx.createLinearGradient(start.x, start.y, end.x, end.y);\r\n } else if (fill instanceof RadialGradient) {\r\n var center = fill.center();\r\n gradient = ctx.createRadialGradient(center.x, center.y, 0, center.x, center.y, fill.radius());\r\n }\r\n\r\n addGradientStops(gradient, fill.stops);\r\n\r\n ctx.save();\r\n\r\n if (!fill.userSpace()) {\r\n ctx.transform(bbox.width(), 0, 0, bbox.height(), bbox.origin.x, bbox.origin.y);\r\n }\r\n ctx.fillStyle = gradient;\r\n ctx.fill();\r\n\r\n ctx.restore();\r\n };\r\n\r\n PathNode.prototype.setStroke = function setStroke (ctx) {\r\n var stroke = this.srcElement.options.stroke;\r\n if (stroke && !isTransparent(stroke.color) && stroke.width > 0) {\r\n ctx.strokeStyle = stroke.color;\r\n ctx.lineWidth = valueOrDefault(stroke.width, 1);\r\n ctx.lineJoin = valueOrDefault(stroke.lineJoin, ctx.lineJoin);\r\n\r\n ctx.save();\r\n this.globalAlpha(ctx, stroke.opacity);\r\n ctx.stroke();\r\n ctx.restore();\r\n\r\n return true;\r\n }\r\n };\r\n\r\n PathNode.prototype.dashType = function dashType () {\r\n var stroke = this.srcElement.options.stroke;\r\n if (stroke && stroke.dashType) {\r\n return stroke.dashType.toLowerCase();\r\n }\r\n };\r\n\r\n PathNode.prototype.setLineDash = function setLineDash (ctx) {\r\n var dashType = this.dashType();\r\n if (dashType && dashType !== SOLID) {\r\n var dashArray = DASH_ARRAYS[dashType];\r\n if (ctx.setLineDash) {\r\n ctx.setLineDash(dashArray);\r\n } else {\r\n ctx.mozDash = dashArray;\r\n ctx.webkitLineDash = dashArray;\r\n }\r\n }\r\n };\r\n\r\n PathNode.prototype.setLineCap = function setLineCap (ctx) {\r\n var dashType = this.dashType();\r\n var stroke = this.srcElement.options.stroke;\r\n if (dashType && dashType !== SOLID) {\r\n ctx.lineCap = BUTT;\r\n } else if (stroke && stroke.lineCap) {\r\n ctx.lineCap = stroke.lineCap;\r\n }\r\n };\r\n\r\n PathNode.prototype.setLineJoin = function setLineJoin (ctx) {\r\n var stroke = this.srcElement.options.stroke;\r\n if (stroke && stroke.lineJoin) {\r\n ctx.lineJoin = stroke.lineJoin;\r\n }\r\n };\r\n\r\n PathNode.prototype.renderPoints = function renderPoints (ctx, path) {\r\n renderPath(ctx, path);\r\n };\r\n\r\n return PathNode;\r\n }(Node$2));\r\n\r\n var ArcNode$2 = (function (PathNode) {\r\n function ArcNode () {\r\n PathNode.apply(this, arguments);\r\n }\r\n\r\n extendStatic(ArcNode, PathNode);\r\n ArcNode.prototype = Object.create( PathNode && PathNode.prototype );\r\n ArcNode.prototype.constructor = ArcNode;\r\n ArcNode.fn = ArcNode.prototype;\r\n ArcNode.fn.init = ArcNode.fn.constructor;\r\n\r\n ArcNode.prototype.renderPoints = function renderPoints (ctx) {\r\n var path = this.srcElement.toPath();\r\n renderPath(ctx, path);\r\n };\r\n\r\n return ArcNode;\r\n }(PathNode$2));\r\n\r\n var CircleNode$2 = (function (PathNode) {\r\n function CircleNode () {\r\n PathNode.apply(this, arguments);\r\n }\r\n\r\n extendStatic(CircleNode, PathNode);\r\n CircleNode.prototype = Object.create( PathNode && PathNode.prototype );\r\n CircleNode.prototype.constructor = CircleNode;\r\n CircleNode.fn = CircleNode.prototype;\r\n CircleNode.fn.init = CircleNode.fn.constructor;\r\n\r\n CircleNode.prototype.renderPoints = function renderPoints (ctx) {\r\n var ref = this.srcElement.geometry();\r\n var center = ref.center;\r\n var radius = ref.radius;\r\n\r\n ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\r\n };\r\n\r\n return CircleNode;\r\n }(PathNode$2));\r\n\r\n var ImageNode$2 = (function (PathNode) {\r\n function ImageNode(srcElement, cors) {\r\n PathNode.call(this, srcElement);\r\n\r\n this.onLoad = this.onLoad.bind(this);\r\n this.onError = this.onError.bind(this);\r\n\r\n this.loading = createPromise();\r\n\r\n var img = this.img = new Image();\r\n var src = srcElement.src();\r\n\r\n if (cors && !(/^data:/i.test(src))) {\r\n img.crossOrigin = cors;\r\n }\r\n\r\n if (src) {\r\n img.src = src;\r\n }\r\n\r\n if (img.complete) {\r\n this.onLoad();\r\n } else {\r\n img.onload = this.onLoad;\r\n img.onerror = this.onError;\r\n }\r\n }\r\n\r\n extendStatic(ImageNode, PathNode);\r\n ImageNode.prototype = Object.create( PathNode && PathNode.prototype );\r\n ImageNode.prototype.constructor = ImageNode;\r\n ImageNode.fn = ImageNode.prototype;\r\n ImageNode.fn.init = ImageNode.fn.constructor;\r\n\r\n ImageNode.prototype.renderTo = function renderTo (ctx) {\r\n if (this.loading.state() === \"resolved\") {\r\n ctx.save();\r\n\r\n this.setTransform(ctx);\r\n this.setClip(ctx);\r\n\r\n this.drawImage(ctx);\r\n\r\n ctx.restore();\r\n }\r\n };\r\n\r\n ImageNode.prototype.optionsChange = function optionsChange (e) {\r\n if (e.field === \"src\") {\r\n this.loading = createPromise();\r\n this.img.src = this.srcElement.src();\r\n } else {\r\n PathNode.prototype.optionsChange.call(this, e);\r\n }\r\n };\r\n\r\n ImageNode.prototype.onLoad = function onLoad () {\r\n this.loading.resolve();\r\n this.invalidate();\r\n };\r\n\r\n ImageNode.prototype.onError = function onError () {\r\n this.loading.reject(new Error(\r\n \"Unable to load image '\" + this.img.src +\r\n \"'. Check for connectivity and verify CORS headers.\"\r\n ));\r\n };\r\n\r\n ImageNode.prototype.drawImage = function drawImage (ctx) {\r\n var rect = this.srcElement.rect();\r\n var topLeft = rect.topLeft();\r\n\r\n ctx.drawImage(\r\n this.img, topLeft.x, topLeft.y, rect.width(), rect.height()\r\n );\r\n };\r\n\r\n return ImageNode;\r\n }(PathNode$2));\r\n\r\n var MultiPathNode$2 = (function (PathNode) {\r\n function MultiPathNode () {\r\n PathNode.apply(this, arguments);\r\n }\r\n\r\n extendStatic(MultiPathNode, PathNode);\r\n MultiPathNode.prototype = Object.create( PathNode && PathNode.prototype );\r\n MultiPathNode.prototype.constructor = MultiPathNode;\r\n MultiPathNode.fn = MultiPathNode.prototype;\r\n MultiPathNode.fn.init = MultiPathNode.fn.constructor;\r\n\r\n MultiPathNode.prototype.renderPoints = function renderPoints (ctx) {\r\n var paths = this.srcElement.paths;\r\n for (var i = 0; i < paths.length; i++) {\r\n renderPath(ctx, paths[i]);\r\n }\r\n };\r\n\r\n return MultiPathNode;\r\n }(PathNode$2));\r\n\r\n var RectNode$2 = (function (PathNode) {\r\n function RectNode () {\r\n PathNode.apply(this, arguments);\r\n }\r\n\r\n extendStatic(RectNode, PathNode);\r\n RectNode.prototype = Object.create( PathNode && PathNode.prototype );\r\n RectNode.prototype.constructor = RectNode;\r\n RectNode.fn = RectNode.prototype;\r\n RectNode.fn.init = RectNode.fn.constructor;\r\n\r\n RectNode.prototype.renderPoints = function renderPoints (ctx) {\r\n var geometry = this.srcElement.geometry();\r\n var ref = geometry.cornerRadius;\r\n var rx = ref[0];\r\n var ry = ref[1];\r\n\r\n if (rx === 0 && ry === 0) {\r\n var origin = geometry.origin;\r\n var size = geometry.size;\r\n ctx.rect(origin.x, origin.y, size.width, size.height);\r\n } else {\r\n PathNode.prototype.renderPoints.call(this, ctx, Path.fromRect(geometry));\r\n }\r\n };\r\n\r\n return RectNode;\r\n }(PathNode$2));\r\n\r\n var TextNode$2 = (function (PathNode) {\r\n function TextNode () {\r\n PathNode.apply(this, arguments);\r\n }\r\n\r\n extendStatic(TextNode, PathNode);\r\n TextNode.prototype = Object.create( PathNode && PathNode.prototype );\r\n TextNode.prototype.constructor = TextNode;\r\n TextNode.fn = TextNode.prototype;\r\n TextNode.fn.init = TextNode.fn.constructor;\r\n\r\n TextNode.prototype.renderTo = function renderTo (ctx) {\r\n var text = this.srcElement;\r\n var pos = text.position();\r\n var size = text.measure();\r\n\r\n ctx.save();\r\n\r\n this.setTransform(ctx);\r\n this.setClip(ctx);\r\n this.setOpacity(ctx);\r\n\r\n ctx.beginPath();\r\n\r\n ctx.font = text.options.font;\r\n ctx.textAlign = 'left';\r\n\r\n if (text.options.paintOrder === 'stroke') {\r\n this.stroke(ctx, text, pos, size);\r\n this.fill(ctx, text, pos, size);\r\n } else {\r\n this.fill(ctx, text, pos, size);\r\n this.stroke(ctx, text, pos, size);\r\n }\r\n\r\n ctx.restore();\r\n };\r\n\r\n TextNode.prototype.stroke = function stroke (ctx, text, pos, size) {\r\n if (this.setStroke(ctx)) {\r\n this.setLineDash(ctx);\r\n ctx.strokeText(text.content(), pos.x, pos.y + size.baseline);\r\n }\r\n };\r\n\r\n TextNode.prototype.fill = function fill (ctx, text, pos, size) {\r\n if (this.setFill(ctx)) {\r\n ctx.fillText(text.content(), pos.x, pos.y + size.baseline);\r\n }\r\n };\r\n\r\n return TextNode;\r\n }(PathNode$2));\r\n\r\n NODE_MAP$2.Arc = ArcNode$2;\r\n NODE_MAP$2.Circle = CircleNode$2;\r\n NODE_MAP$2.Group = GroupNode$2;\r\n NODE_MAP$2.Image = ImageNode$2;\r\n NODE_MAP$2.MultiPath = MultiPathNode$2;\r\n NODE_MAP$2.Path = PathNode$2;\r\n NODE_MAP$2.Rect = RectNode$2;\r\n NODE_MAP$2.Text = TextNode$2;\r\n\r\n var Surface$4 = (function (BaseSurface) {\r\n function Surface(element, options) {\r\n BaseSurface.call(this, element, options);\r\n\r\n this.element.innerHTML = this._template(this);\r\n\r\n var canvas = this.element.firstElementChild;\r\n canvas.style.width = '100%';\r\n canvas.style.height = '100%';\r\n\r\n var size = elementSize(element);\r\n\r\n canvas.width = size.width;\r\n canvas.height = size.height;\r\n\r\n this._rootElement = canvas;\r\n\r\n this._root = new RootNode$2(canvas, size);\r\n\r\n this._mouseTrackHandler = this._trackMouse.bind(this);\r\n\r\n bindEvents(this.element, {\r\n click: this._mouseTrackHandler,\r\n mousemove: this._mouseTrackHandler\r\n });\r\n }\r\n\r\n extendStatic(Surface, BaseSurface);\r\n Surface.prototype = Object.create( BaseSurface && BaseSurface.prototype );\r\n Surface.prototype.constructor = Surface;\r\n Surface.fn = Surface.prototype;\r\n Surface.fn.init = Surface.fn.constructor;\r\n\r\n var prototypeAccessors = { type: {} };\r\n\r\n prototypeAccessors.type.get = function () {\r\n return \"canvas\";\r\n };\r\n\r\n Surface.prototype.destroy = function destroy () {\r\n BaseSurface.prototype.destroy.call(this);\r\n\r\n if (this._root) {\r\n this._root.destroy();\r\n this._root = null;\r\n }\r\n\r\n if (this._searchTree) {\r\n this._searchTree.clear();\r\n delete this._searchTree;\r\n }\r\n\r\n if (this._cursor) {\r\n this._cursor.destroy();\r\n delete this._cursor;\r\n }\r\n\r\n unbindEvents(this.element, {\r\n click: this._mouseTrackHandler,\r\n mousemove: this._mouseTrackHandler\r\n });\r\n };\r\n\r\n Surface.prototype.draw = function draw (element) {\r\n BaseSurface.prototype.draw.call(this, element);\r\n this._root.load([ element ], undefined, this.options.cors);\r\n\r\n if (this._searchTree) {\r\n this._searchTree.add([ element ]);\r\n }\r\n };\r\n\r\n Surface.prototype.clear = function clear () {\r\n BaseSurface.prototype.clear.call(this);\r\n this._root.clear();\r\n\r\n if (this._searchTree) {\r\n this._searchTree.clear();\r\n }\r\n\r\n if (this._cursor) {\r\n this._cursor.clear();\r\n }\r\n };\r\n\r\n Surface.prototype.eventTarget = function eventTarget (e) {\r\n if (this._searchTree) {\r\n var point = this._surfacePoint(e);\r\n var shape = this._searchTree.pointShape(point);\r\n return shape;\r\n }\r\n };\r\n\r\n Surface.prototype.image = function image () {\r\n var ref = this;\r\n var root = ref._root;\r\n var rootElement = ref._rootElement;\r\n var loadingStates = [];\r\n\r\n root.traverse(function (childNode) {\r\n if (childNode.loading) {\r\n loadingStates.push(childNode.loading);\r\n }\r\n });\r\n\r\n var promise = createPromise();\r\n var resolveDataURL = function () {\r\n root._invalidate({ fixedScale: true });\r\n\r\n try {\r\n var data = rootElement.toDataURL();\r\n promise.resolve(data);\r\n } catch (e) {\r\n promise.reject(e);\r\n }\r\n };\r\n\r\n promiseAll(loadingStates).then(resolveDataURL, resolveDataURL);\r\n\r\n return promise;\r\n };\r\n\r\n Surface.prototype.suspendTracking = function suspendTracking () {\r\n BaseSurface.prototype.suspendTracking.call(this);\r\n if (this._searchTree) {\r\n this._searchTree.clear();\r\n delete this._searchTree;\r\n }\r\n };\r\n\r\n Surface.prototype.resumeTracking = function resumeTracking () {\r\n BaseSurface.prototype.resumeTracking.call(this);\r\n if (!this._searchTree) {\r\n this._searchTree = new ShapesQuadTree();\r\n\r\n var childNodes = this._root.childNodes;\r\n var rootElements = [];\r\n for (var idx = 0; idx < childNodes.length; idx++) {\r\n rootElements.push(childNodes[idx].srcElement);\r\n }\r\n this._searchTree.add(rootElements);\r\n }\r\n };\r\n\r\n Surface.prototype._resize = function _resize () {\r\n this._rootElement.width = this._size.width;\r\n this._rootElement.height = this._size.height;\r\n\r\n this._root.size = this._size;\r\n this._root.invalidate();\r\n };\r\n\r\n Surface.prototype._template = function _template () {\r\n return \"
\";\r\n };\r\n\r\n Surface.prototype._enableTracking = function _enableTracking () {\r\n this._searchTree = new ShapesQuadTree();\r\n this._cursor = new SurfaceCursor(this);\r\n\r\n BaseSurface.prototype._enableTracking.call(this);\r\n };\r\n\r\n Surface.prototype._trackMouse = function _trackMouse (e) {\r\n if (this._suspendedTracking) {\r\n return;\r\n }\r\n\r\n var shape = this.eventTarget(e);\r\n\r\n if (e.type !== \"click\") {\r\n var currentShape = this._currentShape;\r\n if (currentShape && currentShape !== shape) {\r\n this.trigger(\"mouseleave\", {\r\n element: currentShape,\r\n originalEvent: e,\r\n type: \"mouseleave\"\r\n });\r\n }\r\n\r\n if (shape && currentShape !== shape) {\r\n this.trigger(\"mouseenter\", {\r\n element: shape,\r\n originalEvent: e,\r\n type: \"mouseenter\"\r\n });\r\n }\r\n\r\n this.trigger(\"mousemove\", {\r\n element: shape,\r\n originalEvent: e,\r\n type: \"mousemove\"\r\n });\r\n\r\n this._currentShape = shape;\r\n } else if (shape) {\r\n this.trigger(\"click\", {\r\n element: shape,\r\n originalEvent: e,\r\n type: \"click\"\r\n });\r\n }\r\n };\r\n\r\n Object.defineProperties( Surface.prototype, prototypeAccessors );\r\n\r\n return Surface;\r\n }(Surface$2));\r\n\r\n var instance$2;\r\n var support$1;\r\n\r\n var hasDocument = function () { return typeof document !== \"undefined\"; };\r\n\r\n var supportsCanvas = function () { return hasDocument() &&\r\n document.createElement(\"canvas\").getContext; };\r\n\r\n var supportsSVG = function () { return hasDocument() &&\r\n document.implementation.hasFeature(\"http://www.w3.org/TR/SVG11/feature#BasicStructure\", \"1.1\"); };\r\n\r\n var SurfaceFactory = (function (Class$$1) {\r\n function SurfaceFactory() {\r\n Class$$1.call(this);\r\n\r\n this._items = [ {\r\n name: \"svg\",\r\n type: Surface$3\r\n }, {\r\n name: \"canvas\",\r\n type: Surface$4\r\n } ];\r\n }\r\n\r\n extendStatic(SurfaceFactory, Class$$1);\r\n SurfaceFactory.prototype = Object.create( Class$$1 && Class$$1.prototype );\r\n SurfaceFactory.prototype.constructor = SurfaceFactory;\r\n SurfaceFactory.fn = SurfaceFactory.prototype;\r\n SurfaceFactory.fn.init = SurfaceFactory.fn.constructor;\r\n\r\n var staticAccessors = { support: {},current: {} };\r\n\r\n staticAccessors.support.get = function () {\r\n if (!support$1) {\r\n support$1 = {\r\n canvas: supportsCanvas(),\r\n svg: supportsSVG()\r\n };\r\n }\r\n\r\n return support$1;\r\n };\r\n\r\n staticAccessors.current.get = function () {\r\n if (!instance$2) {\r\n instance$2 = new SurfaceFactory();\r\n }\r\n\r\n return instance$2;\r\n };\r\n\r\n SurfaceFactory.prototype.create = function create (element, options) {\r\n var items = this._items;\r\n var match = items[0];\r\n\r\n if (options && options.type) {\r\n var preferred = options.type.toLowerCase();\r\n for (var i = 0; i < items.length; i++) {\r\n if (items[i].name === preferred) {\r\n match = items[i];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (match) {\r\n return new match.type(element, options);\r\n }\r\n\r\n kendo.logToConsole(\r\n \"Warning: Unable to create Kendo UI Drawing Surface. Possible causes:\\n\" +\r\n \"- The browser does not support SVG and Canvas. User agent: \" + (navigator.userAgent));\r\n };\r\n\r\n Object.defineProperties( SurfaceFactory, staticAccessors );\r\n\r\n return SurfaceFactory;\r\n }(Class));\r\n\r\n var Surface = (function (BaseSurface) {\r\n function Surface () {\r\n BaseSurface.apply(this, arguments);\r\n }\r\n\r\n extendStatic(Surface, BaseSurface);\r\n Surface.prototype = Object.create( BaseSurface && BaseSurface.prototype );\r\n Surface.prototype.constructor = Surface;\r\n Surface.fn = Surface.prototype;\r\n Surface.fn.init = Surface.fn.constructor;\r\n\r\n var staticAccessors = { support: {} };\r\n\r\n staticAccessors.support.get = function () {\r\n return SurfaceFactory.support;\r\n };\r\n\r\n Surface.create = function create (element, options) {\r\n return SurfaceFactory.current.create(element, options);\r\n };\r\n\r\n Object.defineProperties( Surface, staticAccessors );\r\n\r\n return Surface;\r\n }(Surface$2));\r\n\r\n function exportGroup(group) {\r\n var root = new RootNode({\r\n skipBaseHref: true\r\n });\r\n var bbox = group.clippedBBox();\r\n var rootGroup = group;\r\n\r\n if (bbox) {\r\n var origin = bbox.getOrigin();\r\n var exportRoot = new Group();\r\n exportRoot.transform(transform$1().translate(-origin.x, -origin.y));\r\n exportRoot.children.push(group);\r\n rootGroup = exportRoot;\r\n }\r\n\r\n root.load([ rootGroup ]);\r\n\r\n var svg = \"
\";\r\n\r\n root.destroy();\r\n\r\n return svg;\r\n }\r\n\r\n var svg$1 = {\r\n \tSurface: Surface$3,\r\n \tRootNode: RootNode,\r\n \tNode: Node,\r\n \tGroupNode: GroupNode,\r\n \tArcNode: ArcNode,\r\n \tCircleNode: CircleNode,\r\n \tRectNode: RectNode,\r\n \tImageNode: ImageNode,\r\n \tTextNode: TextNode,\r\n \tPathNode: PathNode,\r\n \tMultiPathNode: MultiPathNode,\r\n \tDefinitionNode: DefinitionNode,\r\n \tClipNode: ClipNode,\r\n \tGradientStopNode: GradientStopNode,\r\n \tLinearGradientNode: LinearGradientNode,\r\n \tRadialGradientNode: RadialGradientNode,\r\n \texportGroup: exportGroup\r\n };\r\n\r\n var canvas = {\r\n \tSurface: Surface$4,\r\n \tRootNode: RootNode$2,\r\n \tNode: Node$2,\r\n \tGroupNode: GroupNode$2,\r\n \tArcNode: ArcNode$2,\r\n \tCircleNode: CircleNode$2,\r\n \tRectNode: RectNode$2,\r\n \tImageNode: ImageNode$2,\r\n \tTextNode: TextNode$2,\r\n \tPathNode: PathNode$2,\r\n \tMultiPathNode: MultiPathNode$2\r\n };\r\n\r\n function exportImage(group, options) {\r\n var defaults = {\r\n width: \"800px\", height: \"600px\",\r\n cors: \"Anonymous\"\r\n };\r\n\r\n var exportRoot = group;\r\n var bbox = group.clippedBBox();\r\n\r\n if (bbox) {\r\n var origin = bbox.getOrigin();\r\n exportRoot = new Group();\r\n exportRoot.transform(transform$1().translate(-origin.x, -origin.y));\r\n exportRoot.children.push(group);\r\n\r\n var size = bbox.getSize();\r\n defaults.width = size.width + \"px\";\r\n defaults.height = size.height + \"px\";\r\n }\r\n\r\n var surfaceOptions = $.extend(defaults, options);\r\n\r\n var container = document.createElement(\"div\");\r\n var style = container.style;\r\n\r\n style.display = \"none\";\r\n style.width = surfaceOptions.width;\r\n style.height = surfaceOptions.height;\r\n document.body.appendChild(container);\r\n\r\n var surface = new Surface$4(container, surfaceOptions);\r\n surface.suspendTracking();\r\n surface.draw(exportRoot);\r\n\r\n var promise = surface.image();\r\n var destroy = function () {\r\n surface.destroy();\r\n document.body.removeChild(container);\r\n };\r\n promise.then(destroy, destroy);\r\n\r\n return promise;\r\n }\r\n\r\n function exportSVG(group, options) {\r\n var svg = exportGroup(group);\r\n\r\n if (!options || !options.raw) {\r\n svg = \"data:image/svg+xml;base64,\" + encodeBase64(svg);\r\n }\r\n\r\n return createPromise().resolve(svg);\r\n }\r\n\r\n /* eslint-disable no-multi-spaces, key-spacing, indent, camelcase, space-before-blocks, eqeqeq, brace-style */\r\n /* eslint-disable space-infix-ops, space-before-function-paren, array-bracket-spacing, object-curly-spacing */\r\n /* eslint-disable no-nested-ternary, max-params, default-case, no-else-return, no-empty, yoda */\r\n /* eslint-disable no-param-reassign, no-var, block-scoped-var */\r\n\r\n var browser = supportBrowser || {};\r\n /*\r\n\r\n XXX: to test:\r\n\r\n - cloneNodes function:\r\n - drawing document containing canvas with page breaking\r\n - drawing document with named radio
-s (should not clear selection)\r\n - IE9/IE10 don't support el.dataset; do they copy user data?\r\n\r\n - repeating table headers/footers on page breaking\r\n\r\n - forceBreak, keepTogether\r\n\r\n - avoidLinks\r\n\r\n */\r\n\r\n /* -----[ local vars ]----- */\r\n\r\n function slice$1$1(thing) {\r\n return Array.prototype.slice.call(thing);\r\n }\r\n\r\n var KENDO_PSEUDO_ELEMENT = \"KENDO-PSEUDO-ELEMENT\";\r\n var KENDO_BULLET_TYPE = 'data-kendo-bullet-type';\r\n\r\n var IMAGE_CACHE = {};\r\n\r\n var nodeInfo = {};\r\n nodeInfo._root = nodeInfo;\r\n\r\n /* -----[ Custom Text node to speed up rendering in kendo.pdf ]----- */\r\n\r\n var inBrowser = typeof window !== 'undefined';\r\n var microsoft = inBrowser ? browser.msie || browser.edge : false;\r\n\r\n var TextRect = (function (Text$$1) {\r\n function TextRect(str, rect, options) {\r\n Text$$1.call(this, str, rect.getOrigin(), options);\r\n this._pdfRect = rect;\r\n }\r\n\r\n extendStatic(TextRect, Text$$1);\r\n TextRect.prototype = Object.create( Text$$1 && Text$$1.prototype );\r\n TextRect.prototype.constructor = TextRect;\r\n TextRect.fn = TextRect.prototype;\r\n TextRect.fn.init = TextRect.fn.constructor;\r\n TextRect.prototype.rect = function rect () {\r\n // this is the crux of it: we can avoid a call to\r\n // measure(), which is what the base class does, since we\r\n // already know the rect. measure() is s-l-o-w.\r\n return this._pdfRect;\r\n };\r\n TextRect.prototype.rawBBox = function rawBBox () {\r\n // also let's avoid creating a new rectangle.\r\n return this._pdfRect;\r\n };\r\n\r\n return TextRect;\r\n }(Text));\r\n\r\n function addClass(el, cls) {\r\n if (el.classList) {\r\n el.classList.add(cls);\r\n } else {\r\n el.className += \" \" + cls;\r\n }\r\n }\r\n\r\n function removeClass(el, cls) {\r\n if (el.classList) {\r\n el.classList.remove(cls);\r\n } else {\r\n el.className = el.className.split(/\\s+/).reduce(function(a, word){\r\n if (word != cls) {\r\n a.push(word);\r\n }\r\n return a;\r\n }, []).join(\" \");\r\n }\r\n }\r\n\r\n function setCSS(el, styles) {\r\n Object.keys(styles).forEach(function(key){\r\n el.style[key] = styles[key];\r\n });\r\n }\r\n\r\n var matches = typeof Element !== \"undefined\" && Element.prototype && (function(p){\r\n if (p.matches) {\r\n return function(el, selector) { return el.matches(selector); };\r\n }\r\n if (p.webkitMatchesSelector) {\r\n return function(el, selector) { return el.webkitMatchesSelector(selector); };\r\n }\r\n if (p.mozMatchesSelector) {\r\n return function(el, selector) { return el.mozMatchesSelector(selector); };\r\n }\r\n if (p.msMatchesSelector) {\r\n return function(el, selector) { return el.msMatchesSelector(selector); };\r\n }\r\n return function(s) {\r\n \treturn [].indexOf.call(document.querySelectorAll(s), this) !== -1;\r\n };\r\n })(Element.prototype);\r\n\r\n function closest(el, selector) {\r\n if (el.closest) {\r\n return el.closest(selector);\r\n }\r\n // IE: stringifying rather than simply comparing with `document`,\r\n // which is not iframe-proof and fails in editor export —\r\n // https://github.com/telerik/kendo/issues/6721\r\n while (el && !/^\\[object (?:HTML)?Document\\]$/.test(String(el))) {\r\n if (el.nodeType == 1 /* Element */ && matches(el, selector)) {\r\n return el;\r\n }\r\n el = el.parentNode;\r\n }\r\n }\r\n\r\n // clone nodes ourselves, so that we redraw