made with requirebin
Created
June 28, 2016 17:40
-
-
Save danfinlay/e14efdd08cfd35e76ec4ff022925e00f to your computer and use it in GitHub Desktop.
requirebin sketch
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| var jazzicon = require('jazzicon') | |
| var h = require('virtual-dom/virtual-hyperscript/svg') | |
| var createElement = require('virtual-dom/create-element') | |
| var body = document.querySelector('body') | |
| for(var i = 0; i < 10; i++) { | |
| var fakeAccount = '0x' | |
| for (var x = 0; x < 10; x++) { | |
| fakeAccount += Math.round(Math.random() * 10) | |
| } | |
| var el = icon(50, fakeAccount) | |
| body.appendChild(el) | |
| } | |
| function icon(iconSize, seed) { | |
| console.log(seed) | |
| var textHeight = 12 | |
| var gapSize = 5 | |
| var size = iconSize + gapSize | |
| var icon = jazzicon(size, parseInt(seed)) | |
| icon.style.position = 'inline-block' | |
| icon.setAttribute('width', iconSize) | |
| icon.setAttribute('height', iconSize) | |
| icon.style.width = `${iconSize}px` | |
| icon.style.height = `${iconSize}px` | |
| // Title container: | |
| var el = document.createElement('div') | |
| el.style.display = 'inline-flex' | |
| el.style.justifyContent = 'center' | |
| el.style.alignItems = 'center' | |
| el.style.position = 'inherit' | |
| el.style.padding = `${textHeight}px` | |
| el.appendChild(icon) | |
| let iconId = `identicon-${seed}-${size}` | |
| var label = createElement(h('svg', { | |
| height: size + textHeight * 2, | |
| width: size + textHeight * 2, | |
| version: '1.1', | |
| style: { | |
| position: 'absolute', | |
| zIndex: 3, | |
| transform: `translateX(-${size + textHeight}px) translateY(-${textHeight}px)`, | |
| } | |
| }, [ | |
| h('g', [ | |
| h('path', { | |
| id: iconId, | |
| fill: 'none', | |
| strokeWidth: '10px', | |
| stroke: 'none', | |
| strokeLocation: 'outside', | |
| style: { | |
| opacity: 1, | |
| zIndex: 2, | |
| }, | |
| d: ` | |
| M ${(size/2) + textHeight + gapSize/2} ${(size + textHeight)/2 + gapSize} | |
| m -${size/2}, 0 | |
| a ${size/2}, ${size/2} 0 1,1 ${size},0 | |
| a ${size/2}, ${size/2} 0 1,1 -${size},0 | |
| ` | |
| }), | |
| h('text', { | |
| style: { | |
| textAnchor: 'middle', | |
| fontStyle: 'normal', | |
| fontVariant: 'normal', | |
| fontWeight: 'normal', | |
| fontSize: '12px', | |
| lineHeight: 'normal', | |
| fontFamily: 'monospace', | |
| fill: 'black' | |
| } | |
| }, [ | |
| h('textPath', { | |
| 'xmlns:xlink': 'http://www.w3.org/1999/xlink', | |
| 'xlink:href': `#${iconId}`, | |
| startOffset: '0%', | |
| }, [ | |
| seed, | |
| ]) | |
| ]) | |
| ]) | |
| ])) | |
| el.appendChild(label) | |
| return el | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| setTimeout(function(){ | |
| ;require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ | |
| },{}],2:[function(require,module,exports){ | |
| (function (global){ | |
| var topLevel = typeof global !== 'undefined' ? global : | |
| typeof window !== 'undefined' ? window : {} | |
| var minDoc = require('min-document'); | |
| if (typeof document !== 'undefined') { | |
| module.exports = document; | |
| } else { | |
| var doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4']; | |
| if (!doccy) { | |
| doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc; | |
| } | |
| module.exports = doccy; | |
| } | |
| }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9nbG9iYWwvZG9jdW1lbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9wTGV2ZWwgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6XG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB7fVxudmFyIG1pbkRvYyA9IHJlcXVpcmUoJ21pbi1kb2N1bWVudCcpO1xuXG5pZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZG9jdW1lbnQ7XG59IGVsc2Uge1xuICAgIHZhciBkb2NjeSA9IHRvcExldmVsWydfX0dMT0JBTF9ET0NVTUVOVF9DQUNIRUA0J107XG5cbiAgICBpZiAoIWRvY2N5KSB7XG4gICAgICAgIGRvY2N5ID0gdG9wTGV2ZWxbJ19fR0xPQkFMX0RPQ1VNRU5UX0NBQ0hFQDQnXSA9IG1pbkRvYztcbiAgICB9XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IGRvY2N5O1xufVxuIl19 | |
| },{"min-document":1}],3:[function(require,module,exports){ | |
| "use strict"; | |
| module.exports = function isObject(x) { | |
| return typeof x === "object" && x !== null; | |
| }; | |
| },{}],4:[function(require,module,exports){ | |
| var isObject = require("is-object") | |
| var isHook = require("../vnode/is-vhook.js") | |
| module.exports = applyProperties | |
| function applyProperties(node, props, previous) { | |
| for (var propName in props) { | |
| var propValue = props[propName] | |
| if (propValue === undefined) { | |
| removeProperty(node, propName, propValue, previous); | |
| } else if (isHook(propValue)) { | |
| removeProperty(node, propName, propValue, previous) | |
| if (propValue.hook) { | |
| propValue.hook(node, | |
| propName, | |
| previous ? previous[propName] : undefined) | |
| } | |
| } else { | |
| if (isObject(propValue)) { | |
| patchObject(node, props, previous, propName, propValue); | |
| } else { | |
| node[propName] = propValue | |
| } | |
| } | |
| } | |
| } | |
| function removeProperty(node, propName, propValue, previous) { | |
| if (previous) { | |
| var previousValue = previous[propName] | |
| if (!isHook(previousValue)) { | |
| if (propName === "attributes") { | |
| for (var attrName in previousValue) { | |
| node.removeAttribute(attrName) | |
| } | |
| } else if (propName === "style") { | |
| for (var i in previousValue) { | |
| node.style[i] = "" | |
| } | |
| } else if (typeof previousValue === "string") { | |
| node[propName] = "" | |
| } else { | |
| node[propName] = null | |
| } | |
| } else if (previousValue.unhook) { | |
| previousValue.unhook(node, propName, propValue) | |
| } | |
| } | |
| } | |
| function patchObject(node, props, previous, propName, propValue) { | |
| var previousValue = previous ? previous[propName] : undefined | |
| // Set attributes | |
| if (propName === "attributes") { | |
| for (var attrName in propValue) { | |
| var attrValue = propValue[attrName] | |
| if (attrValue === undefined) { | |
| node.removeAttribute(attrName) | |
| } else { | |
| node.setAttribute(attrName, attrValue) | |
| } | |
| } | |
| return | |
| } | |
| if(previousValue && isObject(previousValue) && | |
| getPrototype(previousValue) !== getPrototype(propValue)) { | |
| node[propName] = propValue | |
| return | |
| } | |
| if (!isObject(node[propName])) { | |
| node[propName] = {} | |
| } | |
| var replacer = propName === "style" ? "" : undefined | |
| for (var k in propValue) { | |
| var value = propValue[k] | |
| node[propName][k] = (value === undefined) ? replacer : value | |
| } | |
| } | |
| function getPrototype(value) { | |
| if (Object.getPrototypeOf) { | |
| return Object.getPrototypeOf(value) | |
| } else if (value.__proto__) { | |
| return value.__proto__ | |
| } else if (value.constructor) { | |
| return value.constructor.prototype | |
| } | |
| } | |
| },{"../vnode/is-vhook.js":8,"is-object":3}],5:[function(require,module,exports){ | |
| var document = require("global/document") | |
| var applyProperties = require("./apply-properties") | |
| var isVNode = require("../vnode/is-vnode.js") | |
| var isVText = require("../vnode/is-vtext.js") | |
| var isWidget = require("../vnode/is-widget.js") | |
| var handleThunk = require("../vnode/handle-thunk.js") | |
| module.exports = createElement | |
| function createElement(vnode, opts) { | |
| var doc = opts ? opts.document || document : document | |
| var warn = opts ? opts.warn : null | |
| vnode = handleThunk(vnode).a | |
| if (isWidget(vnode)) { | |
| return vnode.init() | |
| } else if (isVText(vnode)) { | |
| return doc.createTextNode(vnode.text) | |
| } else if (!isVNode(vnode)) { | |
| if (warn) { | |
| warn("Item is not a valid virtual dom node", vnode) | |
| } | |
| return null | |
| } | |
| var node = (vnode.namespace === null) ? | |
| doc.createElement(vnode.tagName) : | |
| doc.createElementNS(vnode.namespace, vnode.tagName) | |
| var props = vnode.properties | |
| applyProperties(node, props) | |
| var children = vnode.children | |
| for (var i = 0; i < children.length; i++) { | |
| var childNode = createElement(children[i], opts) | |
| if (childNode) { | |
| node.appendChild(childNode) | |
| } | |
| } | |
| return node | |
| } | |
| },{"../vnode/handle-thunk.js":6,"../vnode/is-vnode.js":9,"../vnode/is-vtext.js":10,"../vnode/is-widget.js":11,"./apply-properties":4,"global/document":2}],6:[function(require,module,exports){ | |
| var isVNode = require("./is-vnode") | |
| var isVText = require("./is-vtext") | |
| var isWidget = require("./is-widget") | |
| var isThunk = require("./is-thunk") | |
| module.exports = handleThunk | |
| function handleThunk(a, b) { | |
| var renderedA = a | |
| var renderedB = b | |
| if (isThunk(b)) { | |
| renderedB = renderThunk(b, a) | |
| } | |
| if (isThunk(a)) { | |
| renderedA = renderThunk(a, null) | |
| } | |
| return { | |
| a: renderedA, | |
| b: renderedB | |
| } | |
| } | |
| function renderThunk(thunk, previous) { | |
| var renderedThunk = thunk.vnode | |
| if (!renderedThunk) { | |
| renderedThunk = thunk.vnode = thunk.render(previous) | |
| } | |
| if (!(isVNode(renderedThunk) || | |
| isVText(renderedThunk) || | |
| isWidget(renderedThunk))) { | |
| throw new Error("thunk did not return a valid node"); | |
| } | |
| return renderedThunk | |
| } | |
| },{"./is-thunk":7,"./is-vnode":9,"./is-vtext":10,"./is-widget":11}],7:[function(require,module,exports){ | |
| module.exports = isThunk | |
| function isThunk(t) { | |
| return t && t.type === "Thunk" | |
| } | |
| },{}],8:[function(require,module,exports){ | |
| module.exports = isHook | |
| function isHook(hook) { | |
| return hook && | |
| (typeof hook.hook === "function" && !hook.hasOwnProperty("hook") || | |
| typeof hook.unhook === "function" && !hook.hasOwnProperty("unhook")) | |
| } | |
| },{}],9:[function(require,module,exports){ | |
| var version = require("./version") | |
| module.exports = isVirtualNode | |
| function isVirtualNode(x) { | |
| return x && x.type === "VirtualNode" && x.version === version | |
| } | |
| },{"./version":12}],10:[function(require,module,exports){ | |
| var version = require("./version") | |
| module.exports = isVirtualText | |
| function isVirtualText(x) { | |
| return x && x.type === "VirtualText" && x.version === version | |
| } | |
| },{"./version":12}],11:[function(require,module,exports){ | |
| module.exports = isWidget | |
| function isWidget(w) { | |
| return w && w.type === "Widget" | |
| } | |
| },{}],12:[function(require,module,exports){ | |
| module.exports = "2" | |
| },{}],"virtual-dom/create-element":[function(require,module,exports){ | |
| var createElement = require("./vdom/create-element.js") | |
| module.exports = createElement | |
| },{"./vdom/create-element.js":5}]},{},[]) | |
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcmVzb2x2ZS9lbXB0eS5qcyIsIm5vZGVfbW9kdWxlcy9nbG9iYWwvZG9jdW1lbnQuanMiLCJub2RlX21vZHVsZXMvaXMtb2JqZWN0L2luZGV4LmpzIiwidmRvbS9hcHBseS1wcm9wZXJ0aWVzLmpzIiwidmRvbS9jcmVhdGUtZWxlbWVudC5qcyIsInZub2RlL2hhbmRsZS10aHVuay5qcyIsInZub2RlL2lzLXRodW5rLmpzIiwidm5vZGUvaXMtdmhvb2suanMiLCJ2bm9kZS9pcy12bm9kZS5qcyIsInZub2RlL2lzLXZ0ZXh0LmpzIiwidm5vZGUvaXMtd2lkZ2V0LmpzIiwidm5vZGUvdmVyc2lvbi5qcyIsImNyZWF0ZS1lbGVtZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIixudWxsLCIoZnVuY3Rpb24gKGdsb2JhbCl7XG52YXIgdG9wTGV2ZWwgPSB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6XG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB7fVxudmFyIG1pbkRvYyA9IHJlcXVpcmUoJ21pbi1kb2N1bWVudCcpO1xuXG5pZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gZG9jdW1lbnQ7XG59IGVsc2Uge1xuICAgIHZhciBkb2NjeSA9IHRvcExldmVsWydfX0dMT0JBTF9ET0NVTUVOVF9DQUNIRUA0J107XG5cbiAgICBpZiAoIWRvY2N5KSB7XG4gICAgICAgIGRvY2N5ID0gdG9wTGV2ZWxbJ19fR0xPQkFMX0RPQ1VNRU5UX0NBQ0hFQDQnXSA9IG1pbkRvYztcbiAgICB9XG5cbiAgICBtb2R1bGUuZXhwb3J0cyA9IGRvY2N5O1xufVxuXG59KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkltNXZaR1ZmYlc5a2RXeGxjeTluYkc5aVlXd3ZaRzlqZFcxbGJuUXVhbk1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJanRCUVVGQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJJaXdpWm1sc1pTSTZJbWRsYm1WeVlYUmxaQzVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKMllYSWdkRzl3VEdWMlpXd2dQU0IwZVhCbGIyWWdaMnh2WW1Gc0lDRTlQU0FuZFc1a1pXWnBibVZrSnlBL0lHZHNiMkpoYkNBNlhHNGdJQ0FnZEhsd1pXOW1JSGRwYm1SdmR5QWhQVDBnSjNWdVpHVm1hVzVsWkNjZ1B5QjNhVzVrYjNjZ09pQjdmVnh1ZG1GeUlHMXBia1J2WXlBOUlISmxjWFZwY21Vb0oyMXBiaTFrYjJOMWJXVnVkQ2NwTzF4dVhHNXBaaUFvZEhsd1pXOW1JR1J2WTNWdFpXNTBJQ0U5UFNBbmRXNWtaV1pwYm1Wa0p5a2dlMXh1SUNBZ0lHMXZaSFZzWlM1bGVIQnZjblJ6SUQwZ1pHOWpkVzFsYm5RN1hHNTlJR1ZzYzJVZ2UxeHVJQ0FnSUhaaGNpQmtiMk5qZVNBOUlIUnZjRXhsZG1Wc1d5ZGZYMGRNVDBKQlRGOUVUME5WVFVWT1ZGOURRVU5JUlVBMEoxMDdYRzVjYmlBZ0lDQnBaaUFvSVdSdlkyTjVLU0I3WEc0Z0lDQWdJQ0FnSUdSdlkyTjVJRDBnZEc5d1RHVjJaV3hiSjE5ZlIweFBRa0ZNWDBSUFExVk5SVTVVWDBOQlEwaEZRRFFuWFNBOUlHMXBia1J2WXp0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0J0YjJSMWJHVXVaWGh3YjNKMGN5QTlJR1J2WTJONU8xeHVmVnh1SWwxOSIsIlwidXNlIHN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzT2JqZWN0KHgpIHtcblx0cmV0dXJuIHR5cGVvZiB4ID09PSBcIm9iamVjdFwiICYmIHggIT09IG51bGw7XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZShcImlzLW9iamVjdFwiKVxudmFyIGlzSG9vayA9IHJlcXVpcmUoXCIuLi92bm9kZS9pcy12aG9vay5qc1wiKVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFwcGx5UHJvcGVydGllc1xuXG5mdW5jdGlvbiBhcHBseVByb3BlcnRpZXMobm9kZSwgcHJvcHMsIHByZXZpb3VzKSB7XG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gcHJvcHMpIHtcbiAgICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXVxuXG4gICAgICAgIGlmIChwcm9wVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVtb3ZlUHJvcGVydHkobm9kZSwgcHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJldmlvdXMpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzSG9vayhwcm9wVmFsdWUpKSB7XG4gICAgICAgICAgICByZW1vdmVQcm9wZXJ0eShub2RlLCBwcm9wTmFtZSwgcHJvcFZhbHVlLCBwcmV2aW91cylcbiAgICAgICAgICAgIGlmIChwcm9wVmFsdWUuaG9vaykge1xuICAgICAgICAgICAgICAgIHByb3BWYWx1ZS5ob29rKG5vZGUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lLFxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA/IHByZXZpb3VzW3Byb3BOYW1lXSA6IHVuZGVmaW5lZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc09iamVjdChwcm9wVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcGF0Y2hPYmplY3Qobm9kZSwgcHJvcHMsIHByZXZpb3VzLCBwcm9wTmFtZSwgcHJvcFZhbHVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9kZVtwcm9wTmFtZV0gPSBwcm9wVmFsdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlUHJvcGVydHkobm9kZSwgcHJvcE5hbWUsIHByb3BWYWx1ZSwgcHJldmlvdXMpIHtcbiAgICBpZiAocHJldmlvdXMpIHtcbiAgICAgICAgdmFyIHByZXZpb3VzVmFsdWUgPSBwcmV2aW91c1twcm9wTmFtZV1cblxuICAgICAgICBpZiAoIWlzSG9vayhwcmV2aW91c1ZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSBcImF0dHJpYnV0ZXNcIikge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGF0dHJOYW1lIGluIHByZXZpb3VzVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wTmFtZSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBwcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc3R5bGVbaV0gPSBcIlwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcHJldmlvdXNWYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIG5vZGVbcHJvcE5hbWVdID0gXCJcIlxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlW3Byb3BOYW1lXSA9IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwcmV2aW91c1ZhbHVlLnVuaG9vaykge1xuICAgICAgICAgICAgcHJldmlvdXNWYWx1ZS51bmhvb2sobm9kZSwgcHJvcE5hbWUsIHByb3BWYWx1ZSlcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gcGF0Y2hPYmplY3Qobm9kZSwgcHJvcHMsIHByZXZpb3VzLCBwcm9wTmFtZSwgcHJvcFZhbHVlKSB7XG4gICAgdmFyIHByZXZpb3VzVmFsdWUgPSBwcmV2aW91cyA/IHByZXZpb3VzW3Byb3BOYW1lXSA6IHVuZGVmaW5lZFxuXG4gICAgLy8gU2V0IGF0dHJpYnV0ZXNcbiAgICBpZiAocHJvcE5hbWUgPT09IFwiYXR0cmlidXRlc1wiKSB7XG4gICAgICAgIGZvciAodmFyIGF0dHJOYW1lIGluIHByb3BWYWx1ZSkge1xuICAgICAgICAgICAgdmFyIGF0dHJWYWx1ZSA9IHByb3BWYWx1ZVthdHRyTmFtZV1cblxuICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZihwcmV2aW91c1ZhbHVlICYmIGlzT2JqZWN0KHByZXZpb3VzVmFsdWUpICYmXG4gICAgICAgIGdldFByb3RvdHlwZShwcmV2aW91c1ZhbHVlKSAhPT0gZ2V0UHJvdG90eXBlKHByb3BWYWx1ZSkpIHtcbiAgICAgICAgbm9kZVtwcm9wTmFtZV0gPSBwcm9wVmFsdWVcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFpc09iamVjdChub2RlW3Byb3BOYW1lXSkpIHtcbiAgICAgICAgbm9kZVtwcm9wTmFtZV0gPSB7fVxuICAgIH1cblxuICAgIHZhciByZXBsYWNlciA9IHByb3BOYW1lID09PSBcInN0eWxlXCIgPyBcIlwiIDogdW5kZWZpbmVkXG5cbiAgICBmb3IgKHZhciBrIGluIHByb3BWYWx1ZSkge1xuICAgICAgICB2YXIgdmFsdWUgPSBwcm9wVmFsdWVba11cbiAgICAgICAgbm9kZVtwcm9wTmFtZV1ba10gPSAodmFsdWUgPT09IHVuZGVmaW5lZCkgPyByZXBsYWNlciA6IHZhbHVlXG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZXRQcm90b3R5cGUodmFsdWUpIHtcbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpXG4gICAgfSBlbHNlIGlmICh2YWx1ZS5fX3Byb3RvX18pIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLl9fcHJvdG9fX1xuICAgIH0gZWxzZSBpZiAodmFsdWUuY29uc3RydWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZVxuICAgIH1cbn1cbiIsInZhciBkb2N1bWVudCA9IHJlcXVpcmUoXCJnbG9iYWwvZG9jdW1lbnRcIilcblxudmFyIGFwcGx5UHJvcGVydGllcyA9IHJlcXVpcmUoXCIuL2FwcGx5LXByb3BlcnRpZXNcIilcblxudmFyIGlzVk5vZGUgPSByZXF1aXJlKFwiLi4vdm5vZGUvaXMtdm5vZGUuanNcIilcbnZhciBpc1ZUZXh0ID0gcmVxdWlyZShcIi4uL3Zub2RlL2lzLXZ0ZXh0LmpzXCIpXG52YXIgaXNXaWRnZXQgPSByZXF1aXJlKFwiLi4vdm5vZGUvaXMtd2lkZ2V0LmpzXCIpXG52YXIgaGFuZGxlVGh1bmsgPSByZXF1aXJlKFwiLi4vdm5vZGUvaGFuZGxlLXRodW5rLmpzXCIpXG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlRWxlbWVudFxuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHZub2RlLCBvcHRzKSB7XG4gICAgdmFyIGRvYyA9IG9wdHMgPyBvcHRzLmRvY3VtZW50IHx8IGRvY3VtZW50IDogZG9jdW1lbnRcbiAgICB2YXIgd2FybiA9IG9wdHMgPyBvcHRzLndhcm4gOiBudWxsXG5cbiAgICB2bm9kZSA9IGhhbmRsZVRodW5rKHZub2RlKS5hXG5cbiAgICBpZiAoaXNXaWRnZXQodm5vZGUpKSB7XG4gICAgICAgIHJldHVybiB2bm9kZS5pbml0KClcbiAgICB9IGVsc2UgaWYgKGlzVlRleHQodm5vZGUpKSB7XG4gICAgICAgIHJldHVybiBkb2MuY3JlYXRlVGV4dE5vZGUodm5vZGUudGV4dClcbiAgICB9IGVsc2UgaWYgKCFpc1ZOb2RlKHZub2RlKSkge1xuICAgICAgICBpZiAod2Fybikge1xuICAgICAgICAgICAgd2FybihcIkl0ZW0gaXMgbm90IGEgdmFsaWQgdmlydHVhbCBkb20gbm9kZVwiLCB2bm9kZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHZhciBub2RlID0gKHZub2RlLm5hbWVzcGFjZSA9PT0gbnVsbCkgP1xuICAgICAgICBkb2MuY3JlYXRlRWxlbWVudCh2bm9kZS50YWdOYW1lKSA6XG4gICAgICAgIGRvYy5jcmVhdGVFbGVtZW50TlModm5vZGUubmFtZXNwYWNlLCB2bm9kZS50YWdOYW1lKVxuXG4gICAgdmFyIHByb3BzID0gdm5vZGUucHJvcGVydGllc1xuICAgIGFwcGx5UHJvcGVydGllcyhub2RlLCBwcm9wcylcblxuICAgIHZhciBjaGlsZHJlbiA9IHZub2RlLmNoaWxkcmVuXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBjaGlsZE5vZGUgPSBjcmVhdGVFbGVtZW50KGNoaWxkcmVuW2ldLCBvcHRzKVxuICAgICAgICBpZiAoY2hpbGROb2RlKSB7XG4gICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKGNoaWxkTm9kZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBub2RlXG59XG4iLCJ2YXIgaXNWTm9kZSA9IHJlcXVpcmUoXCIuL2lzLXZub2RlXCIpXG52YXIgaXNWVGV4dCA9IHJlcXVpcmUoXCIuL2lzLXZ0ZXh0XCIpXG52YXIgaXNXaWRnZXQgPSByZXF1aXJlKFwiLi9pcy13aWRnZXRcIilcbnZhciBpc1RodW5rID0gcmVxdWlyZShcIi4vaXMtdGh1bmtcIilcblxubW9kdWxlLmV4cG9ydHMgPSBoYW5kbGVUaHVua1xuXG5mdW5jdGlvbiBoYW5kbGVUaHVuayhhLCBiKSB7XG4gICAgdmFyIHJlbmRlcmVkQSA9IGFcbiAgICB2YXIgcmVuZGVyZWRCID0gYlxuXG4gICAgaWYgKGlzVGh1bmsoYikpIHtcbiAgICAgICAgcmVuZGVyZWRCID0gcmVuZGVyVGh1bmsoYiwgYSlcbiAgICB9XG5cbiAgICBpZiAoaXNUaHVuayhhKSkge1xuICAgICAgICByZW5kZXJlZEEgPSByZW5kZXJUaHVuayhhLCBudWxsKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGE6IHJlbmRlcmVkQSxcbiAgICAgICAgYjogcmVuZGVyZWRCXG4gICAgfVxufVxuXG5mdW5jdGlvbiByZW5kZXJUaHVuayh0aHVuaywgcHJldmlvdXMpIHtcbiAgICB2YXIgcmVuZGVyZWRUaHVuayA9IHRodW5rLnZub2RlXG5cbiAgICBpZiAoIXJlbmRlcmVkVGh1bmspIHtcbiAgICAgICAgcmVuZGVyZWRUaHVuayA9IHRodW5rLnZub2RlID0gdGh1bmsucmVuZGVyKHByZXZpb3VzKVxuICAgIH1cblxuICAgIGlmICghKGlzVk5vZGUocmVuZGVyZWRUaHVuaykgfHxcbiAgICAgICAgICAgIGlzVlRleHQocmVuZGVyZWRUaHVuaykgfHxcbiAgICAgICAgICAgIGlzV2lkZ2V0KHJlbmRlcmVkVGh1bmspKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0aHVuayBkaWQgbm90IHJldHVybiBhIHZhbGlkIG5vZGVcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbmRlcmVkVGh1bmtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gaXNUaHVua1xyXG5cclxuZnVuY3Rpb24gaXNUaHVuayh0KSB7XHJcbiAgICByZXR1cm4gdCAmJiB0LnR5cGUgPT09IFwiVGh1bmtcIlxyXG59XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gaXNIb29rXG5cbmZ1bmN0aW9uIGlzSG9vayhob29rKSB7XG4gICAgcmV0dXJuIGhvb2sgJiZcbiAgICAgICh0eXBlb2YgaG9vay5ob29rID09PSBcImZ1bmN0aW9uXCIgJiYgIWhvb2suaGFzT3duUHJvcGVydHkoXCJob29rXCIpIHx8XG4gICAgICAgdHlwZW9mIGhvb2sudW5ob29rID09PSBcImZ1bmN0aW9uXCIgJiYgIWhvb2suaGFzT3duUHJvcGVydHkoXCJ1bmhvb2tcIikpXG59XG4iLCJ2YXIgdmVyc2lvbiA9IHJlcXVpcmUoXCIuL3ZlcnNpb25cIilcblxubW9kdWxlLmV4cG9ydHMgPSBpc1ZpcnR1YWxOb2RlXG5cbmZ1bmN0aW9uIGlzVmlydHVhbE5vZGUoeCkge1xuICAgIHJldHVybiB4ICYmIHgudHlwZSA9PT0gXCJWaXJ0dWFsTm9kZVwiICYmIHgudmVyc2lvbiA9PT0gdmVyc2lvblxufVxuIiwidmFyIHZlcnNpb24gPSByZXF1aXJlKFwiLi92ZXJzaW9uXCIpXG5cbm1vZHVsZS5leHBvcnRzID0gaXNWaXJ0dWFsVGV4dFxuXG5mdW5jdGlvbiBpc1ZpcnR1YWxUZXh0KHgpIHtcbiAgICByZXR1cm4geCAmJiB4LnR5cGUgPT09IFwiVmlydHVhbFRleHRcIiAmJiB4LnZlcnNpb24gPT09IHZlcnNpb25cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gaXNXaWRnZXRcblxuZnVuY3Rpb24gaXNXaWRnZXQodykge1xuICAgIHJldHVybiB3ICYmIHcudHlwZSA9PT0gXCJXaWRnZXRcIlxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjJcIlxuIiwidmFyIGNyZWF0ZUVsZW1lbnQgPSByZXF1aXJlKFwiLi92ZG9tL2NyZWF0ZS1lbGVtZW50LmpzXCIpXG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlRWxlbWVudFxuIl19 | |
| require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ | |
| module.exports = [ | |
| '#01888C', // teal | |
| '#FC7500', // bright orange | |
| '#034F5D', // dark teal | |
| '#F73F01', // orangered | |
| '#FC1960', // magenta | |
| '#C7144C', // raspberry | |
| '#F3C100', // goldenrod | |
| '#1598F2', // lightning blue | |
| '#2465E1', // sail blue | |
| '#F19E02', // gold | |
| ] | |
| },{}],2:[function(require,module,exports){ | |
| /* MIT license */ | |
| var convert = require('color-convert'); | |
| var string = require('color-string'); | |
| var Color = function (obj) { | |
| if (obj instanceof Color) { | |
| return obj; | |
| } | |
| if (!(this instanceof Color)) { | |
| return new Color(obj); | |
| } | |
| this.values = { | |
| rgb: [0, 0, 0], | |
| hsl: [0, 0, 0], | |
| hsv: [0, 0, 0], | |
| hwb: [0, 0, 0], | |
| cmyk: [0, 0, 0, 0], | |
| alpha: 1 | |
| }; | |
| // parse Color() argument | |
| var vals; | |
| if (typeof obj === 'string') { | |
| vals = string.getRgba(obj); | |
| if (vals) { | |
| this.setValues('rgb', vals); | |
| } else if (vals = string.getHsla(obj)) { | |
| this.setValues('hsl', vals); | |
| } else if (vals = string.getHwb(obj)) { | |
| this.setValues('hwb', vals); | |
| } else { | |
| throw new Error('Unable to parse color from string "' + obj + '"'); | |
| } | |
| } else if (typeof obj === 'object') { | |
| vals = obj; | |
| if (vals.r !== undefined || vals.red !== undefined) { | |
| this.setValues('rgb', vals); | |
| } else if (vals.l !== undefined || vals.lightness !== undefined) { | |
| this.setValues('hsl', vals); | |
| } else if (vals.v !== undefined || vals.value !== undefined) { | |
| this.setValues('hsv', vals); | |
| } else if (vals.w !== undefined || vals.whiteness !== undefined) { | |
| this.setValues('hwb', vals); | |
| } else if (vals.c !== undefined || vals.cyan !== undefined) { | |
| this.setValues('cmyk', vals); | |
| } else { | |
| throw new Error('Unable to parse color from object ' + JSON.stringify(obj)); | |
| } | |
| } | |
| }; | |
| Color.prototype = { | |
| rgb: function () { | |
| return this.setSpace('rgb', arguments); | |
| }, | |
| hsl: function () { | |
| return this.setSpace('hsl', arguments); | |
| }, | |
| hsv: function () { | |
| return this.setSpace('hsv', arguments); | |
| }, | |
| hwb: function () { | |
| return this.setSpace('hwb', arguments); | |
| }, | |
| cmyk: function () { | |
| return this.setSpace('cmyk', arguments); | |
| }, | |
| rgbArray: function () { | |
| return this.values.rgb; | |
| }, | |
| hslArray: function () { | |
| return this.values.hsl; | |
| }, | |
| hsvArray: function () { | |
| return this.values.hsv; | |
| }, | |
| hwbArray: function () { | |
| if (this.values.alpha !== 1) { | |
| return this.values.hwb.concat([this.values.alpha]); | |
| } | |
| return this.values.hwb; | |
| }, | |
| cmykArray: function () { | |
| return this.values.cmyk; | |
| }, | |
| rgbaArray: function () { | |
| var rgb = this.values.rgb; | |
| return rgb.concat([this.values.alpha]); | |
| }, | |
| hslaArray: function () { | |
| var hsl = this.values.hsl; | |
| return hsl.concat([this.values.alpha]); | |
| }, | |
| alpha: function (val) { | |
| if (val === undefined) { | |
| return this.values.alpha; | |
| } | |
| this.setValues('alpha', val); | |
| return this; | |
| }, | |
| red: function (val) { | |
| return this.setChannel('rgb', 0, val); | |
| }, | |
| green: function (val) { | |
| return this.setChannel('rgb', 1, val); | |
| }, | |
| blue: function (val) { | |
| return this.setChannel('rgb', 2, val); | |
| }, | |
| hue: function (val) { | |
| if (val) { | |
| val %= 360; | |
| val = val < 0 ? 360 + val : val; | |
| } | |
| return this.setChannel('hsl', 0, val); | |
| }, | |
| saturation: function (val) { | |
| return this.setChannel('hsl', 1, val); | |
| }, | |
| lightness: function (val) { | |
| return this.setChannel('hsl', 2, val); | |
| }, | |
| saturationv: function (val) { | |
| return this.setChannel('hsv', 1, val); | |
| }, | |
| whiteness: function (val) { | |
| return this.setChannel('hwb', 1, val); | |
| }, | |
| blackness: function (val) { | |
| return this.setChannel('hwb', 2, val); | |
| }, | |
| value: function (val) { | |
| return this.setChannel('hsv', 2, val); | |
| }, | |
| cyan: function (val) { | |
| return this.setChannel('cmyk', 0, val); | |
| }, | |
| magenta: function (val) { | |
| return this.setChannel('cmyk', 1, val); | |
| }, | |
| yellow: function (val) { | |
| return this.setChannel('cmyk', 2, val); | |
| }, | |
| black: function (val) { | |
| return this.setChannel('cmyk', 3, val); | |
| }, | |
| hexString: function () { | |
| return string.hexString(this.values.rgb); | |
| }, | |
| rgbString: function () { | |
| return string.rgbString(this.values.rgb, this.values.alpha); | |
| }, | |
| rgbaString: function () { | |
| return string.rgbaString(this.values.rgb, this.values.alpha); | |
| }, | |
| percentString: function () { | |
| return string.percentString(this.values.rgb, this.values.alpha); | |
| }, | |
| hslString: function () { | |
| return string.hslString(this.values.hsl, this.values.alpha); | |
| }, | |
| hslaString: function () { | |
| return string.hslaString(this.values.hsl, this.values.alpha); | |
| }, | |
| hwbString: function () { | |
| return string.hwbString(this.values.hwb, this.values.alpha); | |
| }, | |
| keyword: function () { | |
| return string.keyword(this.values.rgb, this.values.alpha); | |
| }, | |
| rgbNumber: function () { | |
| return (this.values.rgb[0] << 16) | (this.values.rgb[1] << 8) | this.values.rgb[2]; | |
| }, | |
| luminosity: function () { | |
| // http://www.w3.org/TR/WCAG20/#relativeluminancedef | |
| var rgb = this.values.rgb; | |
| var lum = []; | |
| for (var i = 0; i < rgb.length; i++) { | |
| var chan = rgb[i] / 255; | |
| lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4); | |
| } | |
| return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2]; | |
| }, | |
| contrast: function (color2) { | |
| // http://www.w3.org/TR/WCAG20/#contrast-ratiodef | |
| var lum1 = this.luminosity(); | |
| var lum2 = color2.luminosity(); | |
| if (lum1 > lum2) { | |
| return (lum1 + 0.05) / (lum2 + 0.05); | |
| } | |
| return (lum2 + 0.05) / (lum1 + 0.05); | |
| }, | |
| level: function (color2) { | |
| var contrastRatio = this.contrast(color2); | |
| if (contrastRatio >= 7.1) { | |
| return 'AAA'; | |
| } | |
| return (contrastRatio >= 4.5) ? 'AA' : ''; | |
| }, | |
| dark: function () { | |
| // YIQ equation from http://24ways.org/2010/calculating-color-contrast | |
| var rgb = this.values.rgb; | |
| var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; | |
| return yiq < 128; | |
| }, | |
| light: function () { | |
| return !this.dark(); | |
| }, | |
| negate: function () { | |
| var rgb = []; | |
| for (var i = 0; i < 3; i++) { | |
| rgb[i] = 255 - this.values.rgb[i]; | |
| } | |
| this.setValues('rgb', rgb); | |
| return this; | |
| }, | |
| lighten: function (ratio) { | |
| this.values.hsl[2] += this.values.hsl[2] * ratio; | |
| this.setValues('hsl', this.values.hsl); | |
| return this; | |
| }, | |
| darken: function (ratio) { | |
| this.values.hsl[2] -= this.values.hsl[2] * ratio; | |
| this.setValues('hsl', this.values.hsl); | |
| return this; | |
| }, | |
| saturate: function (ratio) { | |
| this.values.hsl[1] += this.values.hsl[1] * ratio; | |
| this.setValues('hsl', this.values.hsl); | |
| return this; | |
| }, | |
| desaturate: function (ratio) { | |
| this.values.hsl[1] -= this.values.hsl[1] * ratio; | |
| this.setValues('hsl', this.values.hsl); | |
| return this; | |
| }, | |
| whiten: function (ratio) { | |
| this.values.hwb[1] += this.values.hwb[1] * ratio; | |
| this.setValues('hwb', this.values.hwb); | |
| return this; | |
| }, | |
| blacken: function (ratio) { | |
| this.values.hwb[2] += this.values.hwb[2] * ratio; | |
| this.setValues('hwb', this.values.hwb); | |
| return this; | |
| }, | |
| greyscale: function () { | |
| var rgb = this.values.rgb; | |
| // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale | |
| var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; | |
| this.setValues('rgb', [val, val, val]); | |
| return this; | |
| }, | |
| clearer: function (ratio) { | |
| this.setValues('alpha', this.values.alpha - (this.values.alpha * ratio)); | |
| return this; | |
| }, | |
| opaquer: function (ratio) { | |
| this.setValues('alpha', this.values.alpha + (this.values.alpha * ratio)); | |
| return this; | |
| }, | |
| rotate: function (degrees) { | |
| var hue = this.values.hsl[0]; | |
| hue = (hue + degrees) % 360; | |
| hue = hue < 0 ? 360 + hue : hue; | |
| this.values.hsl[0] = hue; | |
| this.setValues('hsl', this.values.hsl); | |
| return this; | |
| }, | |
| /** | |
| * Ported from sass implementation in C | |
| * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 | |
| */ | |
| mix: function (mixinColor, weight) { | |
| var color1 = this; | |
| var color2 = mixinColor; | |
| var p = weight === undefined ? 0.5 : weight; | |
| var w = 2 * p - 1; | |
| var a = color1.alpha() - color2.alpha(); | |
| var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; | |
| var w2 = 1 - w1; | |
| return this | |
| .rgb( | |
| w1 * color1.red() + w2 * color2.red(), | |
| w1 * color1.green() + w2 * color2.green(), | |
| w1 * color1.blue() + w2 * color2.blue() | |
| ) | |
| .alpha(color1.alpha() * p + color2.alpha() * (1 - p)); | |
| }, | |
| toJSON: function () { | |
| return this.rgb(); | |
| }, | |
| clone: function () { | |
| return new Color(this.rgb()); | |
| } | |
| }; | |
| Color.prototype.getValues = function (space) { | |
| var vals = {}; | |
| for (var i = 0; i < space.length; i++) { | |
| vals[space.charAt(i)] = this.values[space][i]; | |
| } | |
| if (this.values.alpha !== 1) { | |
| vals.a = this.values.alpha; | |
| } | |
| // {r: 255, g: 255, b: 255, a: 0.4} | |
| return vals; | |
| }; | |
| Color.prototype.setValues = function (space, vals) { | |
| var spaces = { | |
| rgb: ['red', 'green', 'blue'], | |
| hsl: ['hue', 'saturation', 'lightness'], | |
| hsv: ['hue', 'saturation', 'value'], | |
| hwb: ['hue', 'whiteness', 'blackness'], | |
| cmyk: ['cyan', 'magenta', 'yellow', 'black'] | |
| }; | |
| var maxes = { | |
| rgb: [255, 255, 255], | |
| hsl: [360, 100, 100], | |
| hsv: [360, 100, 100], | |
| hwb: [360, 100, 100], | |
| cmyk: [100, 100, 100, 100] | |
| }; | |
| var i; | |
| var alpha = 1; | |
| if (space === 'alpha') { | |
| alpha = vals; | |
| } else if (vals.length) { | |
| // [10, 10, 10] | |
| this.values[space] = vals.slice(0, space.length); | |
| alpha = vals[space.length]; | |
| } else if (vals[space.charAt(0)] !== undefined) { | |
| // {r: 10, g: 10, b: 10} | |
| for (i = 0; i < space.length; i++) { | |
| this.values[space][i] = vals[space.charAt(i)]; | |
| } | |
| alpha = vals.a; | |
| } else if (vals[spaces[space][0]] !== undefined) { | |
| // {red: 10, green: 10, blue: 10} | |
| var chans = spaces[space]; | |
| for (i = 0; i < space.length; i++) { | |
| this.values[space][i] = vals[chans[i]]; | |
| } | |
| alpha = vals.alpha; | |
| } | |
| this.values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? this.values.alpha : alpha))); | |
| if (space === 'alpha') { | |
| return false; | |
| } | |
| var capped; | |
| // cap values of the space prior converting all values | |
| for (i = 0; i < space.length; i++) { | |
| capped = Math.max(0, Math.min(maxes[space][i], this.values[space][i])); | |
| this.values[space][i] = Math.round(capped); | |
| } | |
| // convert to all the other color spaces | |
| for (var sname in spaces) { | |
| if (sname !== space) { | |
| this.values[sname] = convert[space][sname](this.values[space]); | |
| } | |
| // cap values | |
| for (i = 0; i < sname.length; i++) { | |
| capped = Math.max(0, Math.min(maxes[sname][i], this.values[sname][i])); | |
| this.values[sname][i] = Math.round(capped); | |
| } | |
| } | |
| return true; | |
| }; | |
| Color.prototype.setSpace = function (space, args) { | |
| var vals = args[0]; | |
| if (vals === undefined) { | |
| // color.rgb() | |
| return this.getValues(space); | |
| } | |
| // color.rgb(10, 10, 10) | |
| if (typeof vals === 'number') { | |
| vals = Array.prototype.slice.call(args); | |
| } | |
| this.setValues(space, vals); | |
| return this; | |
| }; | |
| Color.prototype.setChannel = function (space, index, val) { | |
| if (val === undefined) { | |
| // color.red() | |
| return this.values[space][index]; | |
| } else if (val === this.values[space][index]) { | |
| // color.red(color.red()) | |
| return this; | |
| } | |
| // color.red(100) | |
| this.values[space][index] = val; | |
| this.setValues(space, this.values[space]); | |
| return this; | |
| }; | |
| module.exports = Color; | |
| },{"color-convert":4,"color-string":5}],3:[function(require,module,exports){ | |
| /* MIT license */ | |
| module.exports = { | |
| rgb2hsl: rgb2hsl, | |
| rgb2hsv: rgb2hsv, | |
| rgb2hwb: rgb2hwb, | |
| rgb2cmyk: rgb2cmyk, | |
| rgb2keyword: rgb2keyword, | |
| rgb2xyz: rgb2xyz, | |
| rgb2lab: rgb2lab, | |
| rgb2lch: rgb2lch, | |
| hsl2rgb: hsl2rgb, | |
| hsl2hsv: hsl2hsv, | |
| hsl2hwb: hsl2hwb, | |
| hsl2cmyk: hsl2cmyk, | |
| hsl2keyword: hsl2keyword, | |
| hsv2rgb: hsv2rgb, | |
| hsv2hsl: hsv2hsl, | |
| hsv2hwb: hsv2hwb, | |
| hsv2cmyk: hsv2cmyk, | |
| hsv2keyword: hsv2keyword, | |
| hwb2rgb: hwb2rgb, | |
| hwb2hsl: hwb2hsl, | |
| hwb2hsv: hwb2hsv, | |
| hwb2cmyk: hwb2cmyk, | |
| hwb2keyword: hwb2keyword, | |
| cmyk2rgb: cmyk2rgb, | |
| cmyk2hsl: cmyk2hsl, | |
| cmyk2hsv: cmyk2hsv, | |
| cmyk2hwb: cmyk2hwb, | |
| cmyk2keyword: cmyk2keyword, | |
| keyword2rgb: keyword2rgb, | |
| keyword2hsl: keyword2hsl, | |
| keyword2hsv: keyword2hsv, | |
| keyword2hwb: keyword2hwb, | |
| keyword2cmyk: keyword2cmyk, | |
| keyword2lab: keyword2lab, | |
| keyword2xyz: keyword2xyz, | |
| xyz2rgb: xyz2rgb, | |
| xyz2lab: xyz2lab, | |
| xyz2lch: xyz2lch, | |
| lab2xyz: lab2xyz, | |
| lab2rgb: lab2rgb, | |
| lab2lch: lab2lch, | |
| lch2lab: lch2lab, | |
| lch2xyz: lch2xyz, | |
| lch2rgb: lch2rgb | |
| } | |
| function rgb2hsl(rgb) { | |
| var r = rgb[0]/255, | |
| g = rgb[1]/255, | |
| b = rgb[2]/255, | |
| min = Math.min(r, g, b), | |
| max = Math.max(r, g, b), | |
| delta = max - min, | |
| h, s, l; | |
| if (max == min) | |
| h = 0; | |
| else if (r == max) | |
| h = (g - b) / delta; | |
| else if (g == max) | |
| h = 2 + (b - r) / delta; | |
| else if (b == max) | |
| h = 4 + (r - g)/ delta; | |
| h = Math.min(h * 60, 360); | |
| if (h < 0) | |
| h += 360; | |
| l = (min + max) / 2; | |
| if (max == min) | |
| s = 0; | |
| else if (l <= 0.5) | |
| s = delta / (max + min); | |
| else | |
| s = delta / (2 - max - min); | |
| return [h, s * 100, l * 100]; | |
| } | |
| function rgb2hsv(rgb) { | |
| var r = rgb[0], | |
| g = rgb[1], | |
| b = rgb[2], | |
| min = Math.min(r, g, b), | |
| max = Math.max(r, g, b), | |
| delta = max - min, | |
| h, s, v; | |
| if (max == 0) | |
| s = 0; | |
| else | |
| s = (delta/max * 1000)/10; | |
| if (max == min) | |
| h = 0; | |
| else if (r == max) | |
| h = (g - b) / delta; | |
| else if (g == max) | |
| h = 2 + (b - r) / delta; | |
| else if (b == max) | |
| h = 4 + (r - g) / delta; | |
| h = Math.min(h * 60, 360); | |
| if (h < 0) | |
| h += 360; | |
| v = ((max / 255) * 1000) / 10; | |
| return [h, s, v]; | |
| } | |
| function rgb2hwb(rgb) { | |
| var r = rgb[0], | |
| g = rgb[1], | |
| b = rgb[2], | |
| h = rgb2hsl(rgb)[0], | |
| w = 1/255 * Math.min(r, Math.min(g, b)), | |
| b = 1 - 1/255 * Math.max(r, Math.max(g, b)); | |
| return [h, w * 100, b * 100]; | |
| } | |
| function rgb2cmyk(rgb) { | |
| var r = rgb[0] / 255, | |
| g = rgb[1] / 255, | |
| b = rgb[2] / 255, | |
| c, m, y, k; | |
| k = Math.min(1 - r, 1 - g, 1 - b); | |
| c = (1 - r - k) / (1 - k) || 0; | |
| m = (1 - g - k) / (1 - k) || 0; | |
| y = (1 - b - k) / (1 - k) || 0; | |
| return [c * 100, m * 100, y * 100, k * 100]; | |
| } | |
| function rgb2keyword(rgb) { | |
| return reverseKeywords[JSON.stringify(rgb)]; | |
| } | |
| function rgb2xyz(rgb) { | |
| var r = rgb[0] / 255, | |
| g = rgb[1] / 255, | |
| b = rgb[2] / 255; | |
| // assume sRGB | |
| r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); | |
| g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); | |
| b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); | |
| var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); | |
| var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); | |
| var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); | |
| return [x * 100, y *100, z * 100]; | |
| } | |
| function rgb2lab(rgb) { | |
| var xyz = rgb2xyz(rgb), | |
| x = xyz[0], | |
| y = xyz[1], | |
| z = xyz[2], | |
| l, a, b; | |
| x /= 95.047; | |
| y /= 100; | |
| z /= 108.883; | |
| x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); | |
| y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); | |
| z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); | |
| l = (116 * y) - 16; | |
| a = 500 * (x - y); | |
| b = 200 * (y - z); | |
| return [l, a, b]; | |
| } | |
| function rgb2lch(args) { | |
| return lab2lch(rgb2lab(args)); | |
| } | |
| function hsl2rgb(hsl) { | |
| var h = hsl[0] / 360, | |
| s = hsl[1] / 100, | |
| l = hsl[2] / 100, | |
| t1, t2, t3, rgb, val; | |
| if (s == 0) { | |
| val = l * 255; | |
| return [val, val, val]; | |
| } | |
| if (l < 0.5) | |
| t2 = l * (1 + s); | |
| else | |
| t2 = l + s - l * s; | |
| t1 = 2 * l - t2; | |
| rgb = [0, 0, 0]; | |
| for (var i = 0; i < 3; i++) { | |
| t3 = h + 1 / 3 * - (i - 1); | |
| t3 < 0 && t3++; | |
| t3 > 1 && t3--; | |
| if (6 * t3 < 1) | |
| val = t1 + (t2 - t1) * 6 * t3; | |
| else if (2 * t3 < 1) | |
| val = t2; | |
| else if (3 * t3 < 2) | |
| val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; | |
| else | |
| val = t1; | |
| rgb[i] = val * 255; | |
| } | |
| return rgb; | |
| } | |
| function hsl2hsv(hsl) { | |
| var h = hsl[0], | |
| s = hsl[1] / 100, | |
| l = hsl[2] / 100, | |
| sv, v; | |
| if(l === 0) { | |
| // no need to do calc on black | |
| // also avoids divide by 0 error | |
| return [0, 0, 0]; | |
| } | |
| l *= 2; | |
| s *= (l <= 1) ? l : 2 - l; | |
| v = (l + s) / 2; | |
| sv = (2 * s) / (l + s); | |
| return [h, sv * 100, v * 100]; | |
| } | |
| function hsl2hwb(args) { | |
| return rgb2hwb(hsl2rgb(args)); | |
| } | |
| function hsl2cmyk(args) { | |
| return rgb2cmyk(hsl2rgb(args)); | |
| } | |
| function hsl2keyword(args) { | |
| return rgb2keyword(hsl2rgb(args)); | |
| } | |
| function hsv2rgb(hsv) { | |
| var h = hsv[0] / 60, | |
| s = hsv[1] / 100, | |
| v = hsv[2] / 100, | |
| hi = Math.floor(h) % 6; | |
| var f = h - Math.floor(h), | |
| p = 255 * v * (1 - s), | |
| q = 255 * v * (1 - (s * f)), | |
| t = 255 * v * (1 - (s * (1 - f))), | |
| v = 255 * v; | |
| switch(hi) { | |
| case 0: | |
| return [v, t, p]; | |
| case 1: | |
| return [q, v, p]; | |
| case 2: | |
| return [p, v, t]; | |
| case 3: | |
| return [p, q, v]; | |
| case 4: | |
| return [t, p, v]; | |
| case 5: | |
| return [v, p, q]; | |
| } | |
| } | |
| function hsv2hsl(hsv) { | |
| var h = hsv[0], | |
| s = hsv[1] / 100, | |
| v = hsv[2] / 100, | |
| sl, l; | |
| l = (2 - s) * v; | |
| sl = s * v; | |
| sl /= (l <= 1) ? l : 2 - l; | |
| sl = sl || 0; | |
| l /= 2; | |
| return [h, sl * 100, l * 100]; | |
| } | |
| function hsv2hwb(args) { | |
| return rgb2hwb(hsv2rgb(args)) | |
| } | |
| function hsv2cmyk(args) { | |
| return rgb2cmyk(hsv2rgb(args)); | |
| } | |
| function hsv2keyword(args) { | |
| return rgb2keyword(hsv2rgb(args)); | |
| } | |
| // http://dev.w3.org/csswg/css-color/#hwb-to-rgb | |
| function hwb2rgb(hwb) { | |
| var h = hwb[0] / 360, | |
| wh = hwb[1] / 100, | |
| bl = hwb[2] / 100, | |
| ratio = wh + bl, | |
| i, v, f, n; | |
| // wh + bl cant be > 1 | |
| if (ratio > 1) { | |
| wh /= ratio; | |
| bl /= ratio; | |
| } | |
| i = Math.floor(6 * h); | |
| v = 1 - bl; | |
| f = 6 * h - i; | |
| if ((i & 0x01) != 0) { | |
| f = 1 - f; | |
| } | |
| n = wh + f * (v - wh); // linear interpolation | |
| switch (i) { | |
| default: | |
| case 6: | |
| case 0: r = v; g = n; b = wh; break; | |
| case 1: r = n; g = v; b = wh; break; | |
| case 2: r = wh; g = v; b = n; break; | |
| case 3: r = wh; g = n; b = v; break; | |
| case 4: r = n; g = wh; b = v; break; | |
| case 5: r = v; g = wh; b = n; break; | |
| } | |
| return [r * 255, g * 255, b * 255]; | |
| } | |
| function hwb2hsl(args) { | |
| return rgb2hsl(hwb2rgb(args)); | |
| } | |
| function hwb2hsv(args) { | |
| return rgb2hsv(hwb2rgb(args)); | |
| } | |
| function hwb2cmyk(args) { | |
| return rgb2cmyk(hwb2rgb(args)); | |
| } | |
| function hwb2keyword(args) { | |
| return rgb2keyword(hwb2rgb(args)); | |
| } | |
| function cmyk2rgb(cmyk) { | |
| var c = cmyk[0] / 100, | |
| m = cmyk[1] / 100, | |
| y = cmyk[2] / 100, | |
| k = cmyk[3] / 100, | |
| r, g, b; | |
| r = 1 - Math.min(1, c * (1 - k) + k); | |
| g = 1 - Math.min(1, m * (1 - k) + k); | |
| b = 1 - Math.min(1, y * (1 - k) + k); | |
| return [r * 255, g * 255, b * 255]; | |
| } | |
| function cmyk2hsl(args) { | |
| return rgb2hsl(cmyk2rgb(args)); | |
| } | |
| function cmyk2hsv(args) { | |
| return rgb2hsv(cmyk2rgb(args)); | |
| } | |
| function cmyk2hwb(args) { | |
| return rgb2hwb(cmyk2rgb(args)); | |
| } | |
| function cmyk2keyword(args) { | |
| return rgb2keyword(cmyk2rgb(args)); | |
| } | |
| function xyz2rgb(xyz) { | |
| var x = xyz[0] / 100, | |
| y = xyz[1] / 100, | |
| z = xyz[2] / 100, | |
| r, g, b; | |
| r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); | |
| g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); | |
| b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); | |
| // assume sRGB | |
| r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) | |
| : r = (r * 12.92); | |
| g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) | |
| : g = (g * 12.92); | |
| b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) | |
| : b = (b * 12.92); | |
| r = Math.min(Math.max(0, r), 1); | |
| g = Math.min(Math.max(0, g), 1); | |
| b = Math.min(Math.max(0, b), 1); | |
| return [r * 255, g * 255, b * 255]; | |
| } | |
| function xyz2lab(xyz) { | |
| var x = xyz[0], | |
| y = xyz[1], | |
| z = xyz[2], | |
| l, a, b; | |
| x /= 95.047; | |
| y /= 100; | |
| z /= 108.883; | |
| x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); | |
| y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); | |
| z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); | |
| l = (116 * y) - 16; | |
| a = 500 * (x - y); | |
| b = 200 * (y - z); | |
| return [l, a, b]; | |
| } | |
| function xyz2lch(args) { | |
| return lab2lch(xyz2lab(args)); | |
| } | |
| function lab2xyz(lab) { | |
| var l = lab[0], | |
| a = lab[1], | |
| b = lab[2], | |
| x, y, z, y2; | |
| if (l <= 8) { | |
| y = (l * 100) / 903.3; | |
| y2 = (7.787 * (y / 100)) + (16 / 116); | |
| } else { | |
| y = 100 * Math.pow((l + 16) / 116, 3); | |
| y2 = Math.pow(y / 100, 1/3); | |
| } | |
| x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3); | |
| z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3); | |
| return [x, y, z]; | |
| } | |
| function lab2lch(lab) { | |
| var l = lab[0], | |
| a = lab[1], | |
| b = lab[2], | |
| hr, h, c; | |
| hr = Math.atan2(b, a); | |
| h = hr * 360 / 2 / Math.PI; | |
| if (h < 0) { | |
| h += 360; | |
| } | |
| c = Math.sqrt(a * a + b * b); | |
| return [l, c, h]; | |
| } | |
| function lab2rgb(args) { | |
| return xyz2rgb(lab2xyz(args)); | |
| } | |
| function lch2lab(lch) { | |
| var l = lch[0], | |
| c = lch[1], | |
| h = lch[2], | |
| a, b, hr; | |
| hr = h / 360 * 2 * Math.PI; | |
| a = c * Math.cos(hr); | |
| b = c * Math.sin(hr); | |
| return [l, a, b]; | |
| } | |
| function lch2xyz(args) { | |
| return lab2xyz(lch2lab(args)); | |
| } | |
| function lch2rgb(args) { | |
| return lab2rgb(lch2lab(args)); | |
| } | |
| function keyword2rgb(keyword) { | |
| return cssKeywords[keyword]; | |
| } | |
| function keyword2hsl(args) { | |
| return rgb2hsl(keyword2rgb(args)); | |
| } | |
| function keyword2hsv(args) { | |
| return rgb2hsv(keyword2rgb(args)); | |
| } | |
| function keyword2hwb(args) { | |
| return rgb2hwb(keyword2rgb(args)); | |
| } | |
| function keyword2cmyk(args) { | |
| return rgb2cmyk(keyword2rgb(args)); | |
| } | |
| function keyword2lab(args) { | |
| return rgb2lab(keyword2rgb(args)); | |
| } | |
| function keyword2xyz(args) { | |
| return rgb2xyz(keyword2rgb(args)); | |
| } | |
| var cssKeywords = { | |
| aliceblue: [240,248,255], | |
| antiquewhite: [250,235,215], | |
| aqua: [0,255,255], | |
| aquamarine: [127,255,212], | |
| azure: [240,255,255], | |
| beige: [245,245,220], | |
| bisque: [255,228,196], | |
| black: [0,0,0], | |
| blanchedalmond: [255,235,205], | |
| blue: [0,0,255], | |
| blueviolet: [138,43,226], | |
| brown: [165,42,42], | |
| burlywood: [222,184,135], | |
| cadetblue: [95,158,160], | |
| chartreuse: [127,255,0], | |
| chocolate: [210,105,30], | |
| coral: [255,127,80], | |
| cornflowerblue: [100,149,237], | |
| cornsilk: [255,248,220], | |
| crimson: [220,20,60], | |
| cyan: [0,255,255], | |
| darkblue: [0,0,139], | |
| darkcyan: [0,139,139], | |
| darkgoldenrod: [184,134,11], | |
| darkgray: [169,169,169], | |
| darkgreen: [0,100,0], | |
| darkgrey: [169,169,169], | |
| darkkhaki: [189,183,107], | |
| darkmagenta: [139,0,139], | |
| darkolivegreen: [85,107,47], | |
| darkorange: [255,140,0], | |
| darkorchid: [153,50,204], | |
| darkred: [139,0,0], | |
| darksalmon: [233,150,122], | |
| darkseagreen: [143,188,143], | |
| darkslateblue: [72,61,139], | |
| darkslategray: [47,79,79], | |
| darkslategrey: [47,79,79], | |
| darkturquoise: [0,206,209], | |
| darkviolet: [148,0,211], | |
| deeppink: [255,20,147], | |
| deepskyblue: [0,191,255], | |
| dimgray: [105,105,105], | |
| dimgrey: [105,105,105], | |
| dodgerblue: [30,144,255], | |
| firebrick: [178,34,34], | |
| floralwhite: [255,250,240], | |
| forestgreen: [34,139,34], | |
| fuchsia: [255,0,255], | |
| gainsboro: [220,220,220], | |
| ghostwhite: [248,248,255], | |
| gold: [255,215,0], | |
| goldenrod: [218,165,32], | |
| gray: [128,128,128], | |
| green: [0,128,0], | |
| greenyellow: [173,255,47], | |
| grey: [128,128,128], | |
| honeydew: [240,255,240], | |
| hotpink: [255,105,180], | |
| indianred: [205,92,92], | |
| indigo: [75,0,130], | |
| ivory: [255,255,240], | |
| khaki: [240,230,140], | |
| lavender: [230,230,250], | |
| lavenderblush: [255,240,245], | |
| lawngreen: [124,252,0], | |
| lemonchiffon: [255,250,205], | |
| lightblue: [173,216,230], | |
| lightcoral: [240,128,128], | |
| lightcyan: [224,255,255], | |
| lightgoldenrodyellow: [250,250,210], | |
| lightgray: [211,211,211], | |
| lightgreen: [144,238,144], | |
| lightgrey: [211,211,211], | |
| lightpink: [255,182,193], | |
| lightsalmon: [255,160,122], | |
| lightseagreen: [32,178,170], | |
| lightskyblue: [135,206,250], | |
| lightslategray: [119,136,153], | |
| lightslategrey: [119,136,153], | |
| lightsteelblue: [176,196,222], | |
| lightyellow: [255,255,224], | |
| lime: [0,255,0], | |
| limegreen: [50,205,50], | |
| linen: [250,240,230], | |
| magenta: [255,0,255], | |
| maroon: [128,0,0], | |
| mediumaquamarine: [102,205,170], | |
| mediumblue: [0,0,205], | |
| mediumorchid: [186,85,211], | |
| mediumpurple: [147,112,219], | |
| mediumseagreen: [60,179,113], | |
| mediumslateblue: [123,104,238], | |
| mediumspringgreen: [0,250,154], | |
| mediumturquoise: [72,209,204], | |
| mediumvioletred: [199,21,133], | |
| midnightblue: [25,25,112], | |
| mintcream: [245,255,250], | |
| mistyrose: [255,228,225], | |
| moccasin: [255,228,181], | |
| navajowhite: [255,222,173], | |
| navy: [0,0,128], | |
| oldlace: [253,245,230], | |
| olive: [128,128,0], | |
| olivedrab: [107,142,35], | |
| orange: [255,165,0], | |
| orangered: [255,69,0], | |
| orchid: [218,112,214], | |
| palegoldenrod: [238,232,170], | |
| palegreen: [152,251,152], | |
| paleturquoise: [175,238,238], | |
| palevioletred: [219,112,147], | |
| papayawhip: [255,239,213], | |
| peachpuff: [255,218,185], | |
| peru: [205,133,63], | |
| pink: [255,192,203], | |
| plum: [221,160,221], | |
| powderblue: [176,224,230], | |
| purple: [128,0,128], | |
| rebeccapurple: [102, 51, 153], | |
| red: [255,0,0], | |
| rosybrown: [188,143,143], | |
| royalblue: [65,105,225], | |
| saddlebrown: [139,69,19], | |
| salmon: [250,128,114], | |
| sandybrown: [244,164,96], | |
| seagreen: [46,139,87], | |
| seashell: [255,245,238], | |
| sienna: [160,82,45], | |
| silver: [192,192,192], | |
| skyblue: [135,206,235], | |
| slateblue: [106,90,205], | |
| slategray: [112,128,144], | |
| slategrey: [112,128,144], | |
| snow: [255,250,250], | |
| springgreen: [0,255,127], | |
| steelblue: [70,130,180], | |
| tan: [210,180,140], | |
| teal: [0,128,128], | |
| thistle: [216,191,216], | |
| tomato: [255,99,71], | |
| turquoise: [64,224,208], | |
| violet: [238,130,238], | |
| wheat: [245,222,179], | |
| white: [255,255,255], | |
| whitesmoke: [245,245,245], | |
| yellow: [255,255,0], | |
| yellowgreen: [154,205,50] | |
| }; | |
| var reverseKeywords = {}; | |
| for (var key in cssKeywords) { | |
| reverseKeywords[JSON.stringify(cssKeywords[key])] = key; | |
| } | |
| },{}],4:[function(require,module,exports){ | |
| var conversions = require("./conversions"); | |
| var convert = function() { | |
| return new Converter(); | |
| } | |
| for (var func in conversions) { | |
| // export Raw versions | |
| convert[func + "Raw"] = (function(func) { | |
| // accept array or plain args | |
| return function(arg) { | |
| if (typeof arg == "number") | |
| arg = Array.prototype.slice.call(arguments); | |
| return conversions[func](arg); | |
| } | |
| })(func); | |
| var pair = /(\w+)2(\w+)/.exec(func), | |
| from = pair[1], | |
| to = pair[2]; | |
| // export rgb2hsl and ["rgb"]["hsl"] | |
| convert[from] = convert[from] || {}; | |
| convert[from][to] = convert[func] = (function(func) { | |
| return function(arg) { | |
| if (typeof arg == "number") | |
| arg = Array.prototype.slice.call(arguments); | |
| var val = conversions[func](arg); | |
| if (typeof val == "string" || val === undefined) | |
| return val; // keyword | |
| for (var i = 0; i < val.length; i++) | |
| val[i] = Math.round(val[i]); | |
| return val; | |
| } | |
| })(func); | |
| } | |
| /* Converter does lazy conversion and caching */ | |
| var Converter = function() { | |
| this.convs = {}; | |
| }; | |
| /* Either get the values for a space or | |
| set the values for a space, depending on args */ | |
| Converter.prototype.routeSpace = function(space, args) { | |
| var values = args[0]; | |
| if (values === undefined) { | |
| // color.rgb() | |
| return this.getValues(space); | |
| } | |
| // color.rgb(10, 10, 10) | |
| if (typeof values == "number") { | |
| values = Array.prototype.slice.call(args); | |
| } | |
| return this.setValues(space, values); | |
| }; | |
| /* Set the values for a space, invalidating cache */ | |
| Converter.prototype.setValues = function(space, values) { | |
| this.space = space; | |
| this.convs = {}; | |
| this.convs[space] = values; | |
| return this; | |
| }; | |
| /* Get the values for a space. If there's already | |
| a conversion for the space, fetch it, otherwise | |
| compute it */ | |
| Converter.prototype.getValues = function(space) { | |
| var vals = this.convs[space]; | |
| if (!vals) { | |
| var fspace = this.space, | |
| from = this.convs[fspace]; | |
| vals = convert[fspace][space](from); | |
| this.convs[space] = vals; | |
| } | |
| return vals; | |
| }; | |
| ["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function(space) { | |
| Converter.prototype[space] = function(vals) { | |
| return this.routeSpace(space, arguments); | |
| } | |
| }); | |
| module.exports = convert; | |
| },{"./conversions":3}],5:[function(require,module,exports){ | |
| /* MIT license */ | |
| var colorNames = require('color-name'); | |
| module.exports = { | |
| getRgba: getRgba, | |
| getHsla: getHsla, | |
| getRgb: getRgb, | |
| getHsl: getHsl, | |
| getHwb: getHwb, | |
| getAlpha: getAlpha, | |
| hexString: hexString, | |
| rgbString: rgbString, | |
| rgbaString: rgbaString, | |
| percentString: percentString, | |
| percentaString: percentaString, | |
| hslString: hslString, | |
| hslaString: hslaString, | |
| hwbString: hwbString, | |
| keyword: keyword | |
| } | |
| function getRgba(string) { | |
| if (!string) { | |
| return; | |
| } | |
| var abbr = /^#([a-fA-F0-9]{3})$/, | |
| hex = /^#([a-fA-F0-9]{6})$/, | |
| rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/, | |
| per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/, | |
| keyword = /(\D+)/; | |
| var rgb = [0, 0, 0], | |
| a = 1, | |
| match = string.match(abbr); | |
| if (match) { | |
| match = match[1]; | |
| for (var i = 0; i < rgb.length; i++) { | |
| rgb[i] = parseInt(match[i] + match[i], 16); | |
| } | |
| } | |
| else if (match = string.match(hex)) { | |
| match = match[1]; | |
| for (var i = 0; i < rgb.length; i++) { | |
| rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16); | |
| } | |
| } | |
| else if (match = string.match(rgba)) { | |
| for (var i = 0; i < rgb.length; i++) { | |
| rgb[i] = parseInt(match[i + 1]); | |
| } | |
| a = parseFloat(match[4]); | |
| } | |
| else if (match = string.match(per)) { | |
| for (var i = 0; i < rgb.length; i++) { | |
| rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55); | |
| } | |
| a = parseFloat(match[4]); | |
| } | |
| else if (match = string.match(keyword)) { | |
| if (match[1] == "transparent") { | |
| return [0, 0, 0, 0]; | |
| } | |
| rgb = colorNames[match[1]]; | |
| if (!rgb) { | |
| return; | |
| } | |
| } | |
| for (var i = 0; i < rgb.length; i++) { | |
| rgb[i] = scale(rgb[i], 0, 255); | |
| } | |
| if (!a && a != 0) { | |
| a = 1; | |
| } | |
| else { | |
| a = scale(a, 0, 1); | |
| } | |
| rgb[3] = a; | |
| return rgb; | |
| } | |
| function getHsla(string) { | |
| if (!string) { | |
| return; | |
| } | |
| var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; | |
| var match = string.match(hsl); | |
| if (match) { | |
| var alpha = parseFloat(match[4]); | |
| var h = scale(parseInt(match[1]), 0, 360), | |
| s = scale(parseFloat(match[2]), 0, 100), | |
| l = scale(parseFloat(match[3]), 0, 100), | |
| a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); | |
| return [h, s, l, a]; | |
| } | |
| } | |
| function getHwb(string) { | |
| if (!string) { | |
| return; | |
| } | |
| var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; | |
| var match = string.match(hwb); | |
| if (match) { | |
| var alpha = parseFloat(match[4]); | |
| var h = scale(parseInt(match[1]), 0, 360), | |
| w = scale(parseFloat(match[2]), 0, 100), | |
| b = scale(parseFloat(match[3]), 0, 100), | |
| a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); | |
| return [h, w, b, a]; | |
| } | |
| } | |
| function getRgb(string) { | |
| var rgba = getRgba(string); | |
| return rgba && rgba.slice(0, 3); | |
| } | |
| function getHsl(string) { | |
| var hsla = getHsla(string); | |
| return hsla && hsla.slice(0, 3); | |
| } | |
| function getAlpha(string) { | |
| var vals = getRgba(string); | |
| if (vals) { | |
| return vals[3]; | |
| } | |
| else if (vals = getHsla(string)) { | |
| return vals[3]; | |
| } | |
| else if (vals = getHwb(string)) { | |
| return vals[3]; | |
| } | |
| } | |
| // generators | |
| function hexString(rgb) { | |
| return "#" + hexDouble(rgb[0]) + hexDouble(rgb[1]) | |
| + hexDouble(rgb[2]); | |
| } | |
| function rgbString(rgba, alpha) { | |
| if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { | |
| return rgbaString(rgba, alpha); | |
| } | |
| return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")"; | |
| } | |
| function rgbaString(rgba, alpha) { | |
| if (alpha === undefined) { | |
| alpha = (rgba[3] !== undefined ? rgba[3] : 1); | |
| } | |
| return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] | |
| + ", " + alpha + ")"; | |
| } | |
| function percentString(rgba, alpha) { | |
| if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { | |
| return percentaString(rgba, alpha); | |
| } | |
| var r = Math.round(rgba[0]/255 * 100), | |
| g = Math.round(rgba[1]/255 * 100), | |
| b = Math.round(rgba[2]/255 * 100); | |
| return "rgb(" + r + "%, " + g + "%, " + b + "%)"; | |
| } | |
| function percentaString(rgba, alpha) { | |
| var r = Math.round(rgba[0]/255 * 100), | |
| g = Math.round(rgba[1]/255 * 100), | |
| b = Math.round(rgba[2]/255 * 100); | |
| return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")"; | |
| } | |
| function hslString(hsla, alpha) { | |
| if (alpha < 1 || (hsla[3] && hsla[3] < 1)) { | |
| return hslaString(hsla, alpha); | |
| } | |
| return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)"; | |
| } | |
| function hslaString(hsla, alpha) { | |
| if (alpha === undefined) { | |
| alpha = (hsla[3] !== undefined ? hsla[3] : 1); | |
| } | |
| return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " | |
| + alpha + ")"; | |
| } | |
| // hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax | |
| // (hwb have alpha optional & 1 is default value) | |
| function hwbString(hwb, alpha) { | |
| if (alpha === undefined) { | |
| alpha = (hwb[3] !== undefined ? hwb[3] : 1); | |
| } | |
| return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%" | |
| + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")"; | |
| } | |
| function keyword(rgb) { | |
| return reverseNames[rgb.slice(0, 3)]; | |
| } | |
| // helpers | |
| function scale(num, min, max) { | |
| return Math.min(Math.max(min, num), max); | |
| } | |
| function hexDouble(num) { | |
| var str = num.toString(16).toUpperCase(); | |
| return (str.length < 2) ? "0" + str : str; | |
| } | |
| //create a list of reverse color names | |
| var reverseNames = {}; | |
| for (var name in colorNames) { | |
| reverseNames[colorNames[name]] = name; | |
| } | |
| },{"color-name":6}],6:[function(require,module,exports){ | |
| module.exports = { | |
| "aliceblue": [240, 248, 255], | |
| "antiquewhite": [250, 235, 215], | |
| "aqua": [0, 255, 255], | |
| "aquamarine": [127, 255, 212], | |
| "azure": [240, 255, 255], | |
| "beige": [245, 245, 220], | |
| "bisque": [255, 228, 196], | |
| "black": [0, 0, 0], | |
| "blanchedalmond": [255, 235, 205], | |
| "blue": [0, 0, 255], | |
| "blueviolet": [138, 43, 226], | |
| "brown": [165, 42, 42], | |
| "burlywood": [222, 184, 135], | |
| "cadetblue": [95, 158, 160], | |
| "chartreuse": [127, 255, 0], | |
| "chocolate": [210, 105, 30], | |
| "coral": [255, 127, 80], | |
| "cornflowerblue": [100, 149, 237], | |
| "cornsilk": [255, 248, 220], | |
| "crimson": [220, 20, 60], | |
| "cyan": [0, 255, 255], | |
| "darkblue": [0, 0, 139], | |
| "darkcyan": [0, 139, 139], | |
| "darkgoldenrod": [184, 134, 11], | |
| "darkgray": [169, 169, 169], | |
| "darkgreen": [0, 100, 0], | |
| "darkgrey": [169, 169, 169], | |
| "darkkhaki": [189, 183, 107], | |
| "darkmagenta": [139, 0, 139], | |
| "darkolivegreen": [85, 107, 47], | |
| "darkorange": [255, 140, 0], | |
| "darkorchid": [153, 50, 204], | |
| "darkred": [139, 0, 0], | |
| "darksalmon": [233, 150, 122], | |
| "darkseagreen": [143, 188, 143], | |
| "darkslateblue": [72, 61, 139], | |
| "darkslategray": [47, 79, 79], | |
| "darkslategrey": [47, 79, 79], | |
| "darkturquoise": [0, 206, 209], | |
| "darkviolet": [148, 0, 211], | |
| "deeppink": [255, 20, 147], | |
| "deepskyblue": [0, 191, 255], | |
| "dimgray": [105, 105, 105], | |
| "dimgrey": [105, 105, 105], | |
| "dodgerblue": [30, 144, 255], | |
| "firebrick": [178, 34, 34], | |
| "floralwhite": [255, 250, 240], | |
| "forestgreen": [34, 139, 34], | |
| "fuchsia": [255, 0, 255], | |
| "gainsboro": [220, 220, 220], | |
| "ghostwhite": [248, 248, 255], | |
| "gold": [255, 215, 0], | |
| "goldenrod": [218, 165, 32], | |
| "gray": [128, 128, 128], | |
| "green": [0, 128, 0], | |
| "greenyellow": [173, 255, 47], | |
| "grey": [128, 128, 128], | |
| "honeydew": [240, 255, 240], | |
| "hotpink": [255, 105, 180], | |
| "indianred": [205, 92, 92], | |
| "indigo": [75, 0, 130], | |
| "ivory": [255, 255, 240], | |
| "khaki": [240, 230, 140], | |
| "lavender": [230, 230, 250], | |
| "lavenderblush": [255, 240, 245], | |
| "lawngreen": [124, 252, 0], | |
| "lemonchiffon": [255, 250, 205], | |
| "lightblue": [173, 216, 230], | |
| "lightcoral": [240, 128, 128], | |
| "lightcyan": [224, 255, 255], | |
| "lightgoldenrodyellow": [250, 250, 210], | |
| "lightgray": [211, 211, 211], | |
| "lightgreen": [144, 238, 144], | |
| "lightgrey": [211, 211, 211], | |
| "lightpink": [255, 182, 193], | |
| "lightsalmon": [255, 160, 122], | |
| "lightseagreen": [32, 178, 170], | |
| "lightskyblue": [135, 206, 250], | |
| "lightslategray": [119, 136, 153], | |
| "lightslategrey": [119, 136, 153], | |
| "lightsteelblue": [176, 196, 222], | |
| "lightyellow": [255, 255, 224], | |
| "lime": [0, 255, 0], | |
| "limegreen": [50, 205, 50], | |
| "linen": [250, 240, 230], | |
| "magenta": [255, 0, 255], | |
| "maroon": [128, 0, 0], | |
| "mediumaquamarine": [102, 205, 170], | |
| "mediumblue": [0, 0, 205], | |
| "mediumorchid": [186, 85, 211], | |
| "mediumpurple": [147, 112, 219], | |
| "mediumseagreen": [60, 179, 113], | |
| "mediumslateblue": [123, 104, 238], | |
| "mediumspringgreen": [0, 250, 154], | |
| "mediumturquoise": [72, 209, 204], | |
| "mediumvioletred": [199, 21, 133], | |
| "midnightblue": [25, 25, 112], | |
| "mintcream": [245, 255, 250], | |
| "mistyrose": [255, 228, 225], | |
| "moccasin": [255, 228, 181], | |
| "navajowhite": [255, 222, 173], | |
| "navy": [0, 0, 128], | |
| "oldlace": [253, 245, 230], | |
| "olive": [128, 128, 0], | |
| "olivedrab": [107, 142, 35], | |
| "orange": [255, 165, 0], | |
| "orangered": [255, 69, 0], | |
| "orchid": [218, 112, 214], | |
| "palegoldenrod": [238, 232, 170], | |
| "palegreen": [152, 251, 152], | |
| "paleturquoise": [175, 238, 238], | |
| "palevioletred": [219, 112, 147], | |
| "papayawhip": [255, 239, 213], | |
| "peachpuff": [255, 218, 185], | |
| "peru": [205, 133, 63], | |
| "pink": [255, 192, 203], | |
| "plum": [221, 160, 221], | |
| "powderblue": [176, 224, 230], | |
| "purple": [128, 0, 128], | |
| "rebeccapurple": [102, 51, 153], | |
| "red": [255, 0, 0], | |
| "rosybrown": [188, 143, 143], | |
| "royalblue": [65, 105, 225], | |
| "saddlebrown": [139, 69, 19], | |
| "salmon": [250, 128, 114], | |
| "sandybrown": [244, 164, 96], | |
| "seagreen": [46, 139, 87], | |
| "seashell": [255, 245, 238], | |
| "sienna": [160, 82, 45], | |
| "silver": [192, 192, 192], | |
| "skyblue": [135, 206, 235], | |
| "slateblue": [106, 90, 205], | |
| "slategray": [112, 128, 144], | |
| "slategrey": [112, 128, 144], | |
| "snow": [255, 250, 250], | |
| "springgreen": [0, 255, 127], | |
| "steelblue": [70, 130, 180], | |
| "tan": [210, 180, 140], | |
| "teal": [0, 128, 128], | |
| "thistle": [216, 191, 216], | |
| "tomato": [255, 99, 71], | |
| "turquoise": [64, 224, 208], | |
| "violet": [238, 130, 238], | |
| "wheat": [245, 222, 179], | |
| "white": [255, 255, 255], | |
| "whitesmoke": [245, 245, 245], | |
| "yellow": [255, 255, 0], | |
| "yellowgreen": [154, 205, 50] | |
| }; | |
| },{}],7:[function(require,module,exports){ | |
| /* | |
| https://github.com/banksean wrapped Makoto Matsumoto and Takuji Nishimura's code in a namespace | |
| so it's better encapsulated. Now you can have multiple random number generators | |
| and they won't stomp all over eachother's state. | |
| If you want to use this as a substitute for Math.random(), use the random() | |
| method like so: | |
| var m = new MersenneTwister(); | |
| var randomNumber = m.random(); | |
| You can also call the other genrand_{foo}() methods on the instance. | |
| If you want to use a specific seed in order to get a repeatable random | |
| sequence, pass an integer into the constructor: | |
| var m = new MersenneTwister(123); | |
| and that will always produce the same random sequence. | |
| Sean McCullough (banksean@gmail.com) | |
| */ | |
| /* | |
| A C-program for MT19937, with initialization improved 2002/1/26. | |
| Coded by Takuji Nishimura and Makoto Matsumoto. | |
| Before using, initialize the state by using init_seed(seed) | |
| or init_by_array(init_key, key_length). | |
| Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, | |
| All rights reserved. | |
| Redistribution and use in source and binary forms, with or without | |
| modification, are permitted provided that the following conditions | |
| are met: | |
| 1. Redistributions of source code must retain the above copyright | |
| notice, this list of conditions and the following disclaimer. | |
| 2. Redistributions in binary form must reproduce the above copyright | |
| notice, this list of conditions and the following disclaimer in the | |
| documentation and/or other materials provided with the distribution. | |
| 3. The names of its contributors may not be used to endorse or promote | |
| products derived from this software without specific prior written | |
| permission. | |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR | |
| CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
| EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
| PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
| PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |
| LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
| NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| Any feedback is very welcome. | |
| http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html | |
| email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space) | |
| */ | |
| var MersenneTwister = function(seed) { | |
| if (seed == undefined) { | |
| seed = new Date().getTime(); | |
| } | |
| /* Period parameters */ | |
| this.N = 624; | |
| this.M = 397; | |
| this.MATRIX_A = 0x9908b0df; /* constant vector a */ | |
| this.UPPER_MASK = 0x80000000; /* most significant w-r bits */ | |
| this.LOWER_MASK = 0x7fffffff; /* least significant r bits */ | |
| this.mt = new Array(this.N); /* the array for the state vector */ | |
| this.mti=this.N+1; /* mti==N+1 means mt[N] is not initialized */ | |
| this.init_seed(seed); | |
| } | |
| /* initializes mt[N] with a seed */ | |
| /* origin name init_genrand */ | |
| MersenneTwister.prototype.init_seed = function(s) { | |
| this.mt[0] = s >>> 0; | |
| for (this.mti=1; this.mti<this.N; this.mti++) { | |
| var s = this.mt[this.mti-1] ^ (this.mt[this.mti-1] >>> 30); | |
| this.mt[this.mti] = (((((s & 0xffff0000) >>> 16) * 1812433253) << 16) + (s & 0x0000ffff) * 1812433253) | |
| + this.mti; | |
| /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ | |
| /* In the previous versions, MSBs of the seed affect */ | |
| /* only MSBs of the array mt[]. */ | |
| /* 2002/01/09 modified by Makoto Matsumoto */ | |
| this.mt[this.mti] >>>= 0; | |
| /* for >32 bit machines */ | |
| } | |
| } | |
| /* initialize by an array with array-length */ | |
| /* init_key is the array for initializing keys */ | |
| /* key_length is its length */ | |
| /* slight change for C++, 2004/2/26 */ | |
| MersenneTwister.prototype.init_by_array = function(init_key, key_length) { | |
| var i, j, k; | |
| this.init_seed(19650218); | |
| i=1; j=0; | |
| k = (this.N>key_length ? this.N : key_length); | |
| for (; k; k--) { | |
| var s = this.mt[i-1] ^ (this.mt[i-1] >>> 30) | |
| this.mt[i] = (this.mt[i] ^ (((((s & 0xffff0000) >>> 16) * 1664525) << 16) + ((s & 0x0000ffff) * 1664525))) | |
| + init_key[j] + j; /* non linear */ | |
| this.mt[i] >>>= 0; /* for WORDSIZE > 32 machines */ | |
| i++; j++; | |
| if (i>=this.N) { this.mt[0] = this.mt[this.N-1]; i=1; } | |
| if (j>=key_length) j=0; | |
| } | |
| for (k=this.N-1; k; k--) { | |
| var s = this.mt[i-1] ^ (this.mt[i-1] >>> 30); | |
| this.mt[i] = (this.mt[i] ^ (((((s & 0xffff0000) >>> 16) * 1566083941) << 16) + (s & 0x0000ffff) * 1566083941)) | |
| - i; /* non linear */ | |
| this.mt[i] >>>= 0; /* for WORDSIZE > 32 machines */ | |
| i++; | |
| if (i>=this.N) { this.mt[0] = this.mt[this.N-1]; i=1; } | |
| } | |
| this.mt[0] = 0x80000000; /* MSB is 1; assuring non-zero initial array */ | |
| } | |
| /* generates a random number on [0,0xffffffff]-interval */ | |
| /* origin name genrand_int32 */ | |
| MersenneTwister.prototype.random_int = function() { | |
| var y; | |
| var mag01 = new Array(0x0, this.MATRIX_A); | |
| /* mag01[x] = x * MATRIX_A for x=0,1 */ | |
| if (this.mti >= this.N) { /* generate N words at one time */ | |
| var kk; | |
| if (this.mti == this.N+1) /* if init_seed() has not been called, */ | |
| this.init_seed(5489); /* a default initial seed is used */ | |
| for (kk=0;kk<this.N-this.M;kk++) { | |
| y = (this.mt[kk]&this.UPPER_MASK)|(this.mt[kk+1]&this.LOWER_MASK); | |
| this.mt[kk] = this.mt[kk+this.M] ^ (y >>> 1) ^ mag01[y & 0x1]; | |
| } | |
| for (;kk<this.N-1;kk++) { | |
| y = (this.mt[kk]&this.UPPER_MASK)|(this.mt[kk+1]&this.LOWER_MASK); | |
| this.mt[kk] = this.mt[kk+(this.M-this.N)] ^ (y >>> 1) ^ mag01[y & 0x1]; | |
| } | |
| y = (this.mt[this.N-1]&this.UPPER_MASK)|(this.mt[0]&this.LOWER_MASK); | |
| this.mt[this.N-1] = this.mt[this.M-1] ^ (y >>> 1) ^ mag01[y & 0x1]; | |
| this.mti = 0; | |
| } | |
| y = this.mt[this.mti++]; | |
| /* Tempering */ | |
| y ^= (y >>> 11); | |
| y ^= (y << 7) & 0x9d2c5680; | |
| y ^= (y << 15) & 0xefc60000; | |
| y ^= (y >>> 18); | |
| return y >>> 0; | |
| } | |
| /* generates a random number on [0,0x7fffffff]-interval */ | |
| /* origin name genrand_int31 */ | |
| MersenneTwister.prototype.random_int31 = function() { | |
| return (this.random_int()>>>1); | |
| } | |
| /* generates a random number on [0,1]-real-interval */ | |
| /* origin name genrand_real1 */ | |
| MersenneTwister.prototype.random_incl = function() { | |
| return this.random_int()*(1.0/4294967295.0); | |
| /* divided by 2^32-1 */ | |
| } | |
| /* generates a random number on [0,1)-real-interval */ | |
| MersenneTwister.prototype.random = function() { | |
| return this.random_int()*(1.0/4294967296.0); | |
| /* divided by 2^32 */ | |
| } | |
| /* generates a random number on (0,1)-real-interval */ | |
| /* origin name genrand_real3 */ | |
| MersenneTwister.prototype.random_excl = function() { | |
| return (this.random_int() + 0.5)*(1.0/4294967296.0); | |
| /* divided by 2^32 */ | |
| } | |
| /* generates a random number on [0,1) with 53-bit resolution*/ | |
| /* origin name genrand_res53 */ | |
| MersenneTwister.prototype.random_long = function() { | |
| var a=this.random_int()>>>5, b=this.random_int()>>>6; | |
| return(a*67108864.0+b)*(1.0/9007199254740992.0); | |
| } | |
| /* These real versions are due to Isaku Wada, 2002/01/09 added */ | |
| module.exports = MersenneTwister; | |
| },{}],8:[function(require,module,exports){ | |
| !function t(e,r){"object"==typeof exports&&"object"==typeof module?module.exports=r():"function"==typeof define&&define.amd?define("Raphael",[],r):"object"==typeof exports?exports.Raphael=r():e.Raphael=r()}(this,function(){return function(t){function e(i){if(r[i])return r[i].exports;var n=r[i]={exports:{},id:i,loaded:!1};return t[i].call(n.exports,n,n.exports,e),n.loaded=!0,n.exports}var r={};return e.m=t,e.c=r,e.p="",e(0)}([function(t,e,r){var i,n;i=[r(1),r(3),r(4)],n=function(t){return t}.apply(e,i),!(void 0!==n&&(t.exports=n))},function(t,e,r){var i,n;i=[r(2)],n=function(t){function e(r){if(e.is(r,"function"))return w?r():t.on("raphael.DOMload",r);if(e.is(r,Q))return e._engine.create[z](e,r.splice(0,3+e.is(r[0],$))).add(r);var i=Array.prototype.slice.call(arguments,0);if(e.is(i[i.length-1],"function")){var n=i.pop();return w?n.call(e._engine.create[z](e,i)):t.on("raphael.DOMload",function(){n.call(e._engine.create[z](e,i))})}return e._engine.create[z](e,arguments)}function r(t){if("function"==typeof t||Object(t)!==t)return t;var e=new t.constructor;for(var i in t)t[T](i)&&(e[i]=r(t[i]));return e}function i(t,e){for(var r=0,i=t.length;i>r;r++)if(t[r]===e)return t.push(t.splice(r,1)[0])}function n(t,e,r){function n(){var a=Array.prototype.slice.call(arguments,0),s=a.join("␀"),o=n.cache=n.cache||{},l=n.count=n.count||[];return o[T](s)?(i(l,s),r?r(o[s]):o[s]):(l.length>=1e3&&delete o[l.shift()],l.push(s),o[s]=t[z](e,a),r?r(o[s]):o[s])}return n}function a(){return this.hex}function s(t,e){for(var r=[],i=0,n=t.length;n-2*!e>i;i+=2){var a=[{x:+t[i-2],y:+t[i-1]},{x:+t[i],y:+t[i+1]},{x:+t[i+2],y:+t[i+3]},{x:+t[i+4],y:+t[i+5]}];e?i?n-4==i?a[3]={x:+t[0],y:+t[1]}:n-2==i&&(a[2]={x:+t[0],y:+t[1]},a[3]={x:+t[2],y:+t[3]}):a[0]={x:+t[n-2],y:+t[n-1]}:n-4==i?a[3]=a[2]:i||(a[0]={x:+t[i],y:+t[i+1]}),r.push(["C",(-a[0].x+6*a[1].x+a[2].x)/6,(-a[0].y+6*a[1].y+a[2].y)/6,(a[1].x+6*a[2].x-a[3].x)/6,(a[1].y+6*a[2].y-a[3].y)/6,a[2].x,a[2].y])}return r}function o(t,e,r,i,n){var a=-3*e+9*r-9*i+3*n,s=t*a+6*e-12*r+6*i;return t*s-3*e+3*r}function l(t,e,r,i,n,a,s,l,h){null==h&&(h=1),h=h>1?1:0>h?0:h;for(var u=h/2,c=12,f=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],p=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],d=0,g=0;c>g;g++){var x=u*f[g]+u,v=o(x,t,r,n,s),y=o(x,e,i,a,l),m=v*v+y*y;d+=p[g]*Y.sqrt(m)}return u*d}function h(t,e,r,i,n,a,s,o,h){if(!(0>h||l(t,e,r,i,n,a,s,o)<h)){var u=1,c=u/2,f=u-c,p,d=.01;for(p=l(t,e,r,i,n,a,s,o,f);H(p-h)>d;)c/=2,f+=(h>p?1:-1)*c,p=l(t,e,r,i,n,a,s,o,f);return f}}function u(t,e,r,i,n,a,s,o){if(!(W(t,r)<G(n,s)||G(t,r)>W(n,s)||W(e,i)<G(a,o)||G(e,i)>W(a,o))){var l=(t*i-e*r)*(n-s)-(t-r)*(n*o-a*s),h=(t*i-e*r)*(a-o)-(e-i)*(n*o-a*s),u=(t-r)*(a-o)-(e-i)*(n-s);if(u){var c=l/u,f=h/u,p=+c.toFixed(2),d=+f.toFixed(2);if(!(p<+G(t,r).toFixed(2)||p>+W(t,r).toFixed(2)||p<+G(n,s).toFixed(2)||p>+W(n,s).toFixed(2)||d<+G(e,i).toFixed(2)||d>+W(e,i).toFixed(2)||d<+G(a,o).toFixed(2)||d>+W(a,o).toFixed(2)))return{x:c,y:f}}}}function c(t,e){return p(t,e)}function f(t,e){return p(t,e,1)}function p(t,r,i){var n=e.bezierBBox(t),a=e.bezierBBox(r);if(!e.isBBoxIntersect(n,a))return i?0:[];for(var s=l.apply(0,t),o=l.apply(0,r),h=W(~~(s/5),1),c=W(~~(o/5),1),f=[],p=[],d={},g=i?0:[],x=0;h+1>x;x++){var v=e.findDotsAtSegment.apply(e,t.concat(x/h));f.push({x:v.x,y:v.y,t:x/h})}for(x=0;c+1>x;x++)v=e.findDotsAtSegment.apply(e,r.concat(x/c)),p.push({x:v.x,y:v.y,t:x/c});for(x=0;h>x;x++)for(var y=0;c>y;y++){var m=f[x],b=f[x+1],_=p[y],w=p[y+1],k=H(b.x-m.x)<.001?"y":"x",B=H(w.x-_.x)<.001?"y":"x",C=u(m.x,m.y,b.x,b.y,_.x,_.y,w.x,w.y);if(C){if(d[C.x.toFixed(4)]==C.y.toFixed(4))continue;d[C.x.toFixed(4)]=C.y.toFixed(4);var S=m.t+H((C[k]-m[k])/(b[k]-m[k]))*(b.t-m.t),T=_.t+H((C[B]-_[B])/(w[B]-_[B]))*(w.t-_.t);S>=0&&1.001>=S&&T>=0&&1.001>=T&&(i?g++:g.push({x:C.x,y:C.y,t1:G(S,1),t2:G(T,1)}))}}return g}function d(t,r,i){t=e._path2curve(t),r=e._path2curve(r);for(var n,a,s,o,l,h,u,c,f,d,g=i?0:[],x=0,v=t.length;v>x;x++){var y=t[x];if("M"==y[0])n=l=y[1],a=h=y[2];else{"C"==y[0]?(f=[n,a].concat(y.slice(1)),n=f[6],a=f[7]):(f=[n,a,n,a,l,h,l,h],n=l,a=h);for(var m=0,b=r.length;b>m;m++){var _=r[m];if("M"==_[0])s=u=_[1],o=c=_[2];else{"C"==_[0]?(d=[s,o].concat(_.slice(1)),s=d[6],o=d[7]):(d=[s,o,s,o,u,c,u,c],s=u,o=c);var w=p(f,d,i);if(i)g+=w;else{for(var k=0,B=w.length;B>k;k++)w[k].segment1=x,w[k].segment2=m,w[k].bez1=f,w[k].bez2=d;g=g.concat(w)}}}}}return g}function g(t,e,r,i,n,a){null!=t?(this.a=+t,this.b=+e,this.c=+r,this.d=+i,this.e=+n,this.f=+a):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function x(){return this.x+I+this.y}function v(){return this.x+I+this.y+I+this.width+" × "+this.height}function y(t,e,r,i,n,a){function s(t){return((c*t+u)*t+h)*t}function o(t,e){var r=l(t,e);return((d*r+p)*r+f)*r}function l(t,e){var r,i,n,a,o,l;for(n=t,l=0;8>l;l++){if(a=s(n)-t,H(a)<e)return n;if(o=(3*c*n+2*u)*n+h,H(o)<1e-6)break;n-=a/o}if(r=0,i=1,n=t,r>n)return r;if(n>i)return i;for(;i>r;){if(a=s(n),H(a-t)<e)return n;t>a?r=n:i=n,n=(i-r)/2+r}return n}var h=3*e,u=3*(i-e)-h,c=1-h-u,f=3*r,p=3*(n-r)-f,d=1-f-p;return o(t,1/(200*a))}function m(t,e){var r=[],i={};if(this.ms=e,this.times=1,t){for(var n in t)t[T](n)&&(i[ht(n)]=t[n],r.push(ht(n)));r.sort(Bt)}this.anim=i,this.top=r[r.length-1],this.percents=r}function b(r,i,n,a,s,o){n=ht(n);var l,h,u,c=[],f,p,d,x=r.ms,v={},m={},b={};if(a)for(w=0,B=Ee.length;B>w;w++){var _=Ee[w];if(_.el.id==i.id&&_.anim==r){_.percent!=n?(Ee.splice(w,1),u=1):h=_,i.attr(_.totalOrigin);break}}else a=+m;for(var w=0,B=r.percents.length;B>w;w++){if(r.percents[w]==n||r.percents[w]>a*r.top){n=r.percents[w],p=r.percents[w-1]||0,x=x/r.top*(n-p),f=r.percents[w+1],l=r.anim[n];break}a&&i.attr(r.anim[r.percents[w]])}if(l){if(h)h.initstatus=a,h.start=new Date-h.ms*a;else{for(var C in l)if(l[T](C)&&(pt[T](C)||i.paper.customAttributes[T](C)))switch(v[C]=i.attr(C),null==v[C]&&(v[C]=ft[C]),m[C]=l[C],pt[C]){case $:b[C]=(m[C]-v[C])/x;break;case"colour":v[C]=e.getRGB(v[C]);var S=e.getRGB(m[C]);b[C]={r:(S.r-v[C].r)/x,g:(S.g-v[C].g)/x,b:(S.b-v[C].b)/x};break;case"path":var A=Qt(v[C],m[C]),E=A[1];for(v[C]=A[0],b[C]=[],w=0,B=v[C].length;B>w;w++){b[C][w]=[0];for(var N=1,M=v[C][w].length;M>N;N++)b[C][w][N]=(E[w][N]-v[C][w][N])/x}break;case"transform":var L=i._,z=le(L[C],m[C]);if(z)for(v[C]=z.from,m[C]=z.to,b[C]=[],b[C].real=!0,w=0,B=v[C].length;B>w;w++)for(b[C][w]=[v[C][w][0]],N=1,M=v[C][w].length;M>N;N++)b[C][w][N]=(m[C][w][N]-v[C][w][N])/x;else{var F=i.matrix||new g,R={_:{transform:L.transform},getBBox:function(){return i.getBBox(1)}};v[C]=[F.a,F.b,F.c,F.d,F.e,F.f],se(R,m[C]),m[C]=R._.transform,b[C]=[(R.matrix.a-F.a)/x,(R.matrix.b-F.b)/x,(R.matrix.c-F.c)/x,(R.matrix.d-F.d)/x,(R.matrix.e-F.e)/x,(R.matrix.f-F.f)/x]}break;case"csv":var I=j(l[C])[q](k),D=j(v[C])[q](k);if("clip-rect"==C)for(v[C]=D,b[C]=[],w=D.length;w--;)b[C][w]=(I[w]-v[C][w])/x;m[C]=I;break;default:for(I=[][P](l[C]),D=[][P](v[C]),b[C]=[],w=i.paper.customAttributes[C].length;w--;)b[C][w]=((I[w]||0)-(D[w]||0))/x}var V=l.easing,O=e.easing_formulas[V];if(!O)if(O=j(V).match(st),O&&5==O.length){var Y=O;O=function(t){return y(t,+Y[1],+Y[2],+Y[3],+Y[4],x)}}else O=St;if(d=l.start||r.start||+new Date,_={anim:r,percent:n,timestamp:d,start:d+(r.del||0),status:0,initstatus:a||0,stop:!1,ms:x,easing:O,from:v,diff:b,to:m,el:i,callback:l.callback,prev:p,next:f,repeat:o||r.times,origin:i.attr(),totalOrigin:s},Ee.push(_),a&&!h&&!u&&(_.stop=!0,_.start=new Date-x*a,1==Ee.length))return Me();u&&(_.start=new Date-_.ms*a),1==Ee.length&&Ne(Me)}t("raphael.anim.start."+i.id,i,r)}}function _(t){for(var e=0;e<Ee.length;e++)Ee[e].el.paper==t&&Ee.splice(e--,1)}e.version="@@VERSION",e.eve=t;var w,k=/[, ]+/,B={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},C=/\{(\d+)\}/g,S="prototype",T="hasOwnProperty",A={doc:document,win:window},E={was:Object.prototype[T].call(A.win,"Raphael"),is:A.win.Raphael},N=function(){this.ca=this.customAttributes={}},M,L="appendChild",z="apply",P="concat",F="ontouchstart"in A.win||A.win.DocumentTouch&&A.doc instanceof DocumentTouch,R="",I=" ",j=String,q="split",D="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[q](I),V={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},O=j.prototype.toLowerCase,Y=Math,W=Y.max,G=Y.min,H=Y.abs,X=Y.pow,U=Y.PI,$="number",Z="string",Q="array",J="toString",K="fill",tt=Object.prototype.toString,et={},rt="push",it=e._ISURL=/^url\(['"]?(.+?)['"]?\)$/i,nt=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,at={NaN:1,Infinity:1,"-Infinity":1},st=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,ot=Y.round,lt="setAttribute",ht=parseFloat,ut=parseInt,ct=j.prototype.toUpperCase,ft=e._availableAttrs={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/","letter-spacing":0,opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0},pt=e._availableAnimAttrs={blur:$,"clip-rect":"csv",cx:$,cy:$,fill:"colour","fill-opacity":$,"font-size":$,height:$,opacity:$,path:"path",r:$,rx:$,ry:$,stroke:"colour","stroke-opacity":$,"stroke-width":$,transform:"transform",width:$,x:$,y:$},dt=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]/g,gt=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/,xt={hs:1,rg:1},vt=/,?([achlmqrstvxz]),?/gi,yt=/([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,mt=/([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,bt=/(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/gi,_t=e._radial_gradient=/^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/,wt={},kt=function(t,e){return t.key-e.key},Bt=function(t,e){return ht(t)-ht(e)},Ct=function(){},St=function(t){return t},Tt=e._rectPath=function(t,e,r,i,n){return n?[["M",t+n,e],["l",r-2*n,0],["a",n,n,0,0,1,n,n],["l",0,i-2*n],["a",n,n,0,0,1,-n,n],["l",2*n-r,0],["a",n,n,0,0,1,-n,-n],["l",0,2*n-i],["a",n,n,0,0,1,n,-n],["z"]]:[["M",t,e],["l",r,0],["l",0,i],["l",-r,0],["z"]]},At=function(t,e,r,i){return null==i&&(i=r),[["M",t,e],["m",0,-i],["a",r,i,0,1,1,0,2*i],["a",r,i,0,1,1,0,-2*i],["z"]]},Et=e._getPath={path:function(t){return t.attr("path")},circle:function(t){var e=t.attrs;return At(e.cx,e.cy,e.r)},ellipse:function(t){var e=t.attrs;return At(e.cx,e.cy,e.rx,e.ry)},rect:function(t){var e=t.attrs;return Tt(e.x,e.y,e.width,e.height,e.r)},image:function(t){var e=t.attrs;return Tt(e.x,e.y,e.width,e.height)},text:function(t){var e=t._getBBox();return Tt(e.x,e.y,e.width,e.height)},set:function(t){var e=t._getBBox();return Tt(e.x,e.y,e.width,e.height)}},Nt=e.mapPath=function(t,e){if(!e)return t;var r,i,n,a,s,o,l;for(t=Qt(t),n=0,s=t.length;s>n;n++)for(l=t[n],a=1,o=l.length;o>a;a+=2)r=e.x(l[a],l[a+1]),i=e.y(l[a],l[a+1]),l[a]=r,l[a+1]=i;return t};if(e._g=A,e.type=A.win.SVGAngle||A.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML","VML"==e.type){var Mt=A.doc.createElement("div"),Lt;if(Mt.innerHTML='<v:shape adj="1"/>',Lt=Mt.firstChild,Lt.style.behavior="url(#default#VML)",!Lt||"object"!=typeof Lt.adj)return e.type=R;Mt=null}e.svg=!(e.vml="VML"==e.type),e._Paper=N,e.fn=M=N.prototype=e.prototype,e._id=0,e._oid=0,e.is=function(t,e){return e=O.call(e),"finite"==e?!at[T](+t):"array"==e?t instanceof Array:"null"==e&&null===t||e==typeof t&&null!==t||"object"==e&&t===Object(t)||"array"==e&&Array.isArray&&Array.isArray(t)||tt.call(t).slice(8,-1).toLowerCase()==e},e.angle=function(t,r,i,n,a,s){if(null==a){var o=t-i,l=r-n;return o||l?(180+180*Y.atan2(-l,-o)/U+360)%360:0}return e.angle(t,r,a,s)-e.angle(i,n,a,s)},e.rad=function(t){return t%360*U/180},e.deg=function(t){return Math.round(180*t/U%360*1e3)/1e3},e.snapTo=function(t,r,i){if(i=e.is(i,"finite")?i:10,e.is(t,Q)){for(var n=t.length;n--;)if(H(t[n]-r)<=i)return t[n]}else{t=+t;var a=r%t;if(i>a)return r-a;if(a>t-i)return r-a+t}return r};var zt=e.createUUID=function(t,e){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(t,e).toUpperCase()}}(/[xy]/g,function(t){var e=16*Y.random()|0,r="x"==t?e:3&e|8;return r.toString(16)});e.setWindow=function(r){t("raphael.setWindow",e,A.win,r),A.win=r,A.doc=A.win.document,e._engine.initWin&&e._engine.initWin(A.win)};var Pt=function(t){if(e.vml){var r=/^\s+|\s+$/g,i;try{var a=new ActiveXObject("htmlfile");a.write("<body>"),a.close(),i=a.body}catch(s){i=createPopup().document.body}var o=i.createTextRange();Pt=n(function(t){try{i.style.color=j(t).replace(r,R);var e=o.queryCommandValue("ForeColor");return e=(255&e)<<16|65280&e|(16711680&e)>>>16,"#"+("000000"+e.toString(16)).slice(-6)}catch(n){return"none"}})}else{var l=A.doc.createElement("i");l.title="Raphaël Colour Picker",l.style.display="none",A.doc.body.appendChild(l),Pt=n(function(t){return l.style.color=t,A.doc.defaultView.getComputedStyle(l,R).getPropertyValue("color")})}return Pt(t)},Ft=function(){return"hsb("+[this.h,this.s,this.b]+")"},Rt=function(){return"hsl("+[this.h,this.s,this.l]+")"},It=function(){return this.hex},jt=function(t,r,i){if(null==r&&e.is(t,"object")&&"r"in t&&"g"in t&&"b"in t&&(i=t.b,r=t.g,t=t.r),null==r&&e.is(t,Z)){var n=e.getRGB(t);t=n.r,r=n.g,i=n.b}return(t>1||r>1||i>1)&&(t/=255,r/=255,i/=255),[t,r,i]},qt=function(t,r,i,n){t*=255,r*=255,i*=255;var a={r:t,g:r,b:i,hex:e.rgb(t,r,i),toString:It};return e.is(n,"finite")&&(a.opacity=n),a};e.color=function(t){var r;return e.is(t,"object")&&"h"in t&&"s"in t&&"b"in t?(r=e.hsb2rgb(t),t.r=r.r,t.g=r.g,t.b=r.b,t.hex=r.hex):e.is(t,"object")&&"h"in t&&"s"in t&&"l"in t?(r=e.hsl2rgb(t),t.r=r.r,t.g=r.g,t.b=r.b,t.hex=r.hex):(e.is(t,"string")&&(t=e.getRGB(t)),e.is(t,"object")&&"r"in t&&"g"in t&&"b"in t?(r=e.rgb2hsl(t),t.h=r.h,t.s=r.s,t.l=r.l,r=e.rgb2hsb(t),t.v=r.b):(t={hex:"none"},t.r=t.g=t.b=t.h=t.s=t.v=t.l=-1)),t.toString=It,t},e.hsb2rgb=function(t,e,r,i){this.is(t,"object")&&"h"in t&&"s"in t&&"b"in t&&(r=t.b,e=t.s,i=t.o,t=t.h),t*=360;var n,a,s,o,l;return t=t%360/60,l=r*e,o=l*(1-H(t%2-1)),n=a=s=r-l,t=~~t,n+=[l,o,0,0,o,l][t],a+=[o,l,l,o,0,0][t],s+=[0,0,o,l,l,o][t],qt(n,a,s,i)},e.hsl2rgb=function(t,e,r,i){this.is(t,"object")&&"h"in t&&"s"in t&&"l"in t&&(r=t.l,e=t.s,t=t.h),(t>1||e>1||r>1)&&(t/=360,e/=100,r/=100),t*=360;var n,a,s,o,l;return t=t%360/60,l=2*e*(.5>r?r:1-r),o=l*(1-H(t%2-1)),n=a=s=r-l/2,t=~~t,n+=[l,o,0,0,o,l][t],a+=[o,l,l,o,0,0][t],s+=[0,0,o,l,l,o][t],qt(n,a,s,i)},e.rgb2hsb=function(t,e,r){r=jt(t,e,r),t=r[0],e=r[1],r=r[2];var i,n,a,s;return a=W(t,e,r),s=a-G(t,e,r),i=0==s?null:a==t?(e-r)/s:a==e?(r-t)/s+2:(t-e)/s+4,i=(i+360)%6*60/360,n=0==s?0:s/a,{h:i,s:n,b:a,toString:Ft}},e.rgb2hsl=function(t,e,r){r=jt(t,e,r),t=r[0],e=r[1],r=r[2];var i,n,a,s,o,l;return s=W(t,e,r),o=G(t,e,r),l=s-o,i=0==l?null:s==t?(e-r)/l:s==e?(r-t)/l+2:(t-e)/l+4,i=(i+360)%6*60/360,a=(s+o)/2,n=0==l?0:.5>a?l/(2*a):l/(2-2*a),{h:i,s:n,l:a,toString:Rt}},e._path2string=function(){return this.join(",").replace(vt,"$1")};var Dt=e._preload=function(t,e){var r=A.doc.createElement("img");r.style.cssText="position:absolute;left:-9999em;top:-9999em",r.onload=function(){e.call(this),this.onload=null,A.doc.body.removeChild(this)},r.onerror=function(){A.doc.body.removeChild(this)},A.doc.body.appendChild(r),r.src=t};e.getRGB=n(function(t){if(!t||(t=j(t)).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:a};if("none"==t)return{r:-1,g:-1,b:-1,hex:"none",toString:a};!(xt[T](t.toLowerCase().substring(0,2))||"#"==t.charAt())&&(t=Pt(t));var r,i,n,s,o,l,h,u=t.match(nt);return u?(u[2]&&(s=ut(u[2].substring(5),16),n=ut(u[2].substring(3,5),16),i=ut(u[2].substring(1,3),16)),u[3]&&(s=ut((l=u[3].charAt(3))+l,16),n=ut((l=u[3].charAt(2))+l,16),i=ut((l=u[3].charAt(1))+l,16)),u[4]&&(h=u[4][q](gt),i=ht(h[0]),"%"==h[0].slice(-1)&&(i*=2.55),n=ht(h[1]),"%"==h[1].slice(-1)&&(n*=2.55),s=ht(h[2]),"%"==h[2].slice(-1)&&(s*=2.55),"rgba"==u[1].toLowerCase().slice(0,4)&&(o=ht(h[3])),h[3]&&"%"==h[3].slice(-1)&&(o/=100)),u[5]?(h=u[5][q](gt),i=ht(h[0]),"%"==h[0].slice(-1)&&(i*=2.55),n=ht(h[1]),"%"==h[1].slice(-1)&&(n*=2.55),s=ht(h[2]),"%"==h[2].slice(-1)&&(s*=2.55),("deg"==h[0].slice(-3)||"°"==h[0].slice(-1))&&(i/=360),"hsba"==u[1].toLowerCase().slice(0,4)&&(o=ht(h[3])),h[3]&&"%"==h[3].slice(-1)&&(o/=100),e.hsb2rgb(i,n,s,o)):u[6]?(h=u[6][q](gt),i=ht(h[0]),"%"==h[0].slice(-1)&&(i*=2.55),n=ht(h[1]),"%"==h[1].slice(-1)&&(n*=2.55),s=ht(h[2]),"%"==h[2].slice(-1)&&(s*=2.55),("deg"==h[0].slice(-3)||"°"==h[0].slice(-1))&&(i/=360),"hsla"==u[1].toLowerCase().slice(0,4)&&(o=ht(h[3])),h[3]&&"%"==h[3].slice(-1)&&(o/=100),e.hsl2rgb(i,n,s,o)):(u={r:i,g:n,b:s,toString:a},u.hex="#"+(16777216|s|n<<8|i<<16).toString(16).slice(1),e.is(o,"finite")&&(u.opacity=o),u)):{r:-1,g:-1,b:-1,hex:"none",error:1,toString:a}},e),e.hsb=n(function(t,r,i){return e.hsb2rgb(t,r,i).hex}),e.hsl=n(function(t,r,i){return e.hsl2rgb(t,r,i).hex}),e.rgb=n(function(t,e,r){function i(t){return t+.5|0}return"#"+(16777216|i(r)|i(e)<<8|i(t)<<16).toString(16).slice(1)}),e.getColor=function(t){var e=this.getColor.start=this.getColor.start||{h:0,s:1,b:t||.75},r=this.hsb2rgb(e.h,e.s,e.b);return e.h+=.075,e.h>1&&(e.h=0,e.s-=.2,e.s<=0&&(this.getColor.start={h:0,s:1,b:e.b})),r.hex},e.getColor.reset=function(){delete this.start},e.parsePathString=function(t){if(!t)return null;var r=Vt(t);if(r.arr)return Yt(r.arr);var i={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},n=[];return e.is(t,Q)&&e.is(t[0],Q)&&(n=Yt(t)),n.length||j(t).replace(yt,function(t,e,r){var a=[],s=e.toLowerCase();if(r.replace(bt,function(t,e){e&&a.push(+e)}),"m"==s&&a.length>2&&(n.push([e][P](a.splice(0,2))),s="l",e="m"==e?"l":"L"),"r"==s)n.push([e][P](a));else for(;a.length>=i[s]&&(n.push([e][P](a.splice(0,i[s]))),i[s]););}),n.toString=e._path2string,r.arr=Yt(n),n},e.parseTransformString=n(function(t){if(!t)return null;var r={r:3,s:4,t:2,m:6},i=[];return e.is(t,Q)&&e.is(t[0],Q)&&(i=Yt(t)),i.length||j(t).replace(mt,function(t,e,r){var n=[],a=O.call(e);r.replace(bt,function(t,e){e&&n.push(+e)}),i.push([e][P](n))}),i.toString=e._path2string,i});var Vt=function(t){var e=Vt.ps=Vt.ps||{};return e[t]?e[t].sleep=100:e[t]={sleep:100},setTimeout(function(){for(var r in e)e[T](r)&&r!=t&&(e[r].sleep--,!e[r].sleep&&delete e[r])}),e[t]};e.findDotsAtSegment=function(t,e,r,i,n,a,s,o,l){var h=1-l,u=X(h,3),c=X(h,2),f=l*l,p=f*l,d=u*t+3*c*l*r+3*h*l*l*n+p*s,g=u*e+3*c*l*i+3*h*l*l*a+p*o,x=t+2*l*(r-t)+f*(n-2*r+t),v=e+2*l*(i-e)+f*(a-2*i+e),y=r+2*l*(n-r)+f*(s-2*n+r),m=i+2*l*(a-i)+f*(o-2*a+i),b=h*t+l*r,_=h*e+l*i,w=h*n+l*s,k=h*a+l*o,B=90-180*Y.atan2(x-y,v-m)/U;return(x>y||m>v)&&(B+=180),{x:d,y:g,m:{x:x,y:v},n:{x:y,y:m},start:{x:b,y:_},end:{x:w,y:k},alpha:B}},e.bezierBBox=function(t,r,i,n,a,s,o,l){e.is(t,"array")||(t=[t,r,i,n,a,s,o,l]);var h=Zt.apply(null,t);return{x:h.min.x,y:h.min.y,x2:h.max.x,y2:h.max.y,width:h.max.x-h.min.x,height:h.max.y-h.min.y}},e.isPointInsideBBox=function(t,e,r){return e>=t.x&&e<=t.x2&&r>=t.y&&r<=t.y2},e.isBBoxIntersect=function(t,r){var i=e.isPointInsideBBox;return i(r,t.x,t.y)||i(r,t.x2,t.y)||i(r,t.x,t.y2)||i(r,t.x2,t.y2)||i(t,r.x,r.y)||i(t,r.x2,r.y)||i(t,r.x,r.y2)||i(t,r.x2,r.y2)||(t.x<r.x2&&t.x>r.x||r.x<t.x2&&r.x>t.x)&&(t.y<r.y2&&t.y>r.y||r.y<t.y2&&r.y>t.y)},e.pathIntersection=function(t,e){return d(t,e)},e.pathIntersectionNumber=function(t,e){return d(t,e,1)},e.isPointInsidePath=function(t,r,i){var n=e.pathBBox(t);return e.isPointInsideBBox(n,r,i)&&d(t,[["M",r,i],["H",n.x2+10]],1)%2==1},e._removedFactory=function(e){return function(){t("raphael.log",null,"Raphaël: you are calling to method “"+e+"” of removed object",e)}};var Ot=e.pathBBox=function(t){var e=Vt(t);if(e.bbox)return r(e.bbox);if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0};t=Qt(t);for(var i=0,n=0,a=[],s=[],o,l=0,h=t.length;h>l;l++)if(o=t[l],"M"==o[0])i=o[1],n=o[2],a.push(i),s.push(n);else{var u=Zt(i,n,o[1],o[2],o[3],o[4],o[5],o[6]);a=a[P](u.min.x,u.max.x),s=s[P](u.min.y,u.max.y),i=o[5],n=o[6]}var c=G[z](0,a),f=G[z](0,s),p=W[z](0,a),d=W[z](0,s),g=p-c,x=d-f,v={x:c,y:f,x2:p,y2:d,width:g,height:x,cx:c+g/2,cy:f+x/2};return e.bbox=r(v),v},Yt=function(t){var i=r(t);return i.toString=e._path2string,i},Wt=e._pathToRelative=function(t){var r=Vt(t);if(r.rel)return Yt(r.rel);e.is(t,Q)&&e.is(t&&t[0],Q)||(t=e.parsePathString(t));var i=[],n=0,a=0,s=0,o=0,l=0;"M"==t[0][0]&&(n=t[0][1],a=t[0][2],s=n,o=a,l++,i.push(["M",n,a]));for(var h=l,u=t.length;u>h;h++){var c=i[h]=[],f=t[h];if(f[0]!=O.call(f[0]))switch(c[0]=O.call(f[0]),c[0]){case"a":c[1]=f[1],c[2]=f[2],c[3]=f[3],c[4]=f[4],c[5]=f[5],c[6]=+(f[6]-n).toFixed(3),c[7]=+(f[7]-a).toFixed(3);break;case"v":c[1]=+(f[1]-a).toFixed(3);break;case"m":s=f[1],o=f[2];default:for(var p=1,d=f.length;d>p;p++)c[p]=+(f[p]-(p%2?n:a)).toFixed(3)}else{c=i[h]=[],"m"==f[0]&&(s=f[1]+n,o=f[2]+a);for(var g=0,x=f.length;x>g;g++)i[h][g]=f[g]}var v=i[h].length;switch(i[h][0]){case"z":n=s,a=o;break;case"h":n+=+i[h][v-1];break;case"v":a+=+i[h][v-1];break;default:n+=+i[h][v-2],a+=+i[h][v-1]}}return i.toString=e._path2string,r.rel=Yt(i),i},Gt=e._pathToAbsolute=function(t){var r=Vt(t);if(r.abs)return Yt(r.abs);if(e.is(t,Q)&&e.is(t&&t[0],Q)||(t=e.parsePathString(t)),!t||!t.length)return[["M",0,0]];var i=[],n=0,a=0,o=0,l=0,h=0;"M"==t[0][0]&&(n=+t[0][1],a=+t[0][2],o=n,l=a,h++,i[0]=["M",n,a]);for(var u=3==t.length&&"M"==t[0][0]&&"R"==t[1][0].toUpperCase()&&"Z"==t[2][0].toUpperCase(),c,f,p=h,d=t.length;d>p;p++){if(i.push(c=[]),f=t[p],f[0]!=ct.call(f[0]))switch(c[0]=ct.call(f[0]),c[0]){case"A":c[1]=f[1],c[2]=f[2],c[3]=f[3],c[4]=f[4],c[5]=f[5],c[6]=+(f[6]+n),c[7]=+(f[7]+a);break;case"V":c[1]=+f[1]+a;break;case"H":c[1]=+f[1]+n;break;case"R":for(var g=[n,a][P](f.slice(1)),x=2,v=g.length;v>x;x++)g[x]=+g[x]+n,g[++x]=+g[x]+a;i.pop(),i=i[P](s(g,u));break;case"M":o=+f[1]+n,l=+f[2]+a;default:for(x=1,v=f.length;v>x;x++)c[x]=+f[x]+(x%2?n:a)}else if("R"==f[0])g=[n,a][P](f.slice(1)),i.pop(),i=i[P](s(g,u)),c=["R"][P](f.slice(-2));else for(var y=0,m=f.length;m>y;y++)c[y]=f[y];switch(c[0]){case"Z":n=o,a=l;break;case"H":n=c[1];break;case"V":a=c[1];break;case"M":o=c[c.length-2],l=c[c.length-1];default:n=c[c.length-2],a=c[c.length-1]}}return i.toString=e._path2string,r.abs=Yt(i),i},Ht=function(t,e,r,i){return[t,e,r,i,r,i]},Xt=function(t,e,r,i,n,a){var s=1/3,o=2/3;return[s*t+o*r,s*e+o*i,s*n+o*r,s*a+o*i,n,a]},Ut=function(t,e,r,i,a,s,o,l,h,u){var c=120*U/180,f=U/180*(+a||0),p=[],d,g=n(function(t,e,r){var i=t*Y.cos(r)-e*Y.sin(r),n=t*Y.sin(r)+e*Y.cos(r);return{x:i,y:n}});if(u)S=u[0],T=u[1],B=u[2],C=u[3];else{d=g(t,e,-f),t=d.x,e=d.y,d=g(l,h,-f),l=d.x,h=d.y;var x=Y.cos(U/180*a),v=Y.sin(U/180*a),y=(t-l)/2,m=(e-h)/2,b=y*y/(r*r)+m*m/(i*i);b>1&&(b=Y.sqrt(b),r=b*r,i=b*i);var _=r*r,w=i*i,k=(s==o?-1:1)*Y.sqrt(H((_*w-_*m*m-w*y*y)/(_*m*m+w*y*y))),B=k*r*m/i+(t+l)/2,C=k*-i*y/r+(e+h)/2,S=Y.asin(((e-C)/i).toFixed(9)),T=Y.asin(((h-C)/i).toFixed(9));S=B>t?U-S:S,T=B>l?U-T:T,0>S&&(S=2*U+S),0>T&&(T=2*U+T),o&&S>T&&(S-=2*U),!o&&T>S&&(T-=2*U)}var A=T-S;if(H(A)>c){var E=T,N=l,M=h;T=S+c*(o&&T>S?1:-1),l=B+r*Y.cos(T),h=C+i*Y.sin(T),p=Ut(l,h,r,i,a,0,o,N,M,[T,E,B,C])}A=T-S;var L=Y.cos(S),z=Y.sin(S),F=Y.cos(T),R=Y.sin(T),I=Y.tan(A/4),j=4/3*r*I,D=4/3*i*I,V=[t,e],O=[t+j*z,e-D*L],W=[l+j*R,h-D*F],G=[l,h];if(O[0]=2*V[0]-O[0],O[1]=2*V[1]-O[1],u)return[O,W,G][P](p);p=[O,W,G][P](p).join()[q](",");for(var X=[],$=0,Z=p.length;Z>$;$++)X[$]=$%2?g(p[$-1],p[$],f).y:g(p[$],p[$+1],f).x;return X},$t=function(t,e,r,i,n,a,s,o,l){var h=1-l;return{x:X(h,3)*t+3*X(h,2)*l*r+3*h*l*l*n+X(l,3)*s,y:X(h,3)*e+3*X(h,2)*l*i+3*h*l*l*a+X(l,3)*o}},Zt=n(function(t,e,r,i,n,a,s,o){var l=n-2*r+t-(s-2*n+r),h=2*(r-t)-2*(n-r),u=t-r,c=(-h+Y.sqrt(h*h-4*l*u))/2/l,f=(-h-Y.sqrt(h*h-4*l*u))/2/l,p=[e,o],d=[t,s],g;return H(c)>"1e12"&&(c=.5),H(f)>"1e12"&&(f=.5),c>0&&1>c&&(g=$t(t,e,r,i,n,a,s,o,c),d.push(g.x),p.push(g.y)),f>0&&1>f&&(g=$t(t,e,r,i,n,a,s,o,f),d.push(g.x),p.push(g.y)),l=a-2*i+e-(o-2*a+i),h=2*(i-e)-2*(a-i),u=e-i,c=(-h+Y.sqrt(h*h-4*l*u))/2/l,f=(-h-Y.sqrt(h*h-4*l*u))/2/l,H(c)>"1e12"&&(c=.5),H(f)>"1e12"&&(f=.5),c>0&&1>c&&(g=$t(t,e,r,i,n,a,s,o,c),d.push(g.x),p.push(g.y)),f>0&&1>f&&(g=$t(t,e,r,i,n,a,s,o,f),d.push(g.x),p.push(g.y)),{min:{x:G[z](0,d),y:G[z](0,p)},max:{x:W[z](0,d),y:W[z](0,p)}}}),Qt=e._path2curve=n(function(t,e){var r=!e&&Vt(t);if(!e&&r.curve)return Yt(r.curve);for(var i=Gt(t),n=e&&Gt(e),a={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},s={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},o=(function(t,e,r){var i,n,a={T:1,Q:1};if(!t)return["C",e.x,e.y,e.x,e.y,e.x,e.y];switch(!(t[0]in a)&&(e.qx=e.qy=null),t[0]){case"M":e.X=t[1],e.Y=t[2];break;case"A":t=["C"][P](Ut[z](0,[e.x,e.y][P](t.slice(1))));break;case"S":"C"==r||"S"==r?(i=2*e.x-e.bx,n=2*e.y-e.by):(i=e.x,n=e.y),t=["C",i,n][P](t.slice(1));break;case"T":"Q"==r||"T"==r?(e.qx=2*e.x-e.qx,e.qy=2*e.y-e.qy):(e.qx=e.x,e.qy=e.y),t=["C"][P](Xt(e.x,e.y,e.qx,e.qy,t[1],t[2]));break;case"Q":e.qx=t[1],e.qy=t[2],t=["C"][P](Xt(e.x,e.y,t[1],t[2],t[3],t[4]));break;case"L":t=["C"][P](Ht(e.x,e.y,t[1],t[2]));break;case"H":t=["C"][P](Ht(e.x,e.y,t[1],e.y));break;case"V":t=["C"][P](Ht(e.x,e.y,e.x,t[1]));break;case"Z":t=["C"][P](Ht(e.x,e.y,e.X,e.Y))}return t}),l=function(t,e){if(t[e].length>7){t[e].shift();for(var r=t[e];r.length;)u[e]="A",n&&(c[e]="A"),t.splice(e++,0,["C"][P](r.splice(0,6)));t.splice(e,1),g=W(i.length,n&&n.length||0)}},h=function(t,e,r,a,s){t&&e&&"M"==t[s][0]&&"M"!=e[s][0]&&(e.splice(s,0,["M",a.x,a.y]),r.bx=0,r.by=0,r.x=t[s][1],r.y=t[s][2],g=W(i.length,n&&n.length||0))},u=[],c=[],f="",p="",d=0,g=W(i.length,n&&n.length||0);g>d;d++){i[d]&&(f=i[d][0]),"C"!=f&&(u[d]=f,d&&(p=u[d-1])),i[d]=o(i[d],a,p),"A"!=u[d]&&"C"==f&&(u[d]="C"),l(i,d),n&&(n[d]&&(f=n[d][0]),"C"!=f&&(c[d]=f,d&&(p=c[d-1])),n[d]=o(n[d],s,p),"A"!=c[d]&&"C"==f&&(c[d]="C"),l(n,d)),h(i,n,a,s,d),h(n,i,s,a,d);var x=i[d],v=n&&n[d],y=x.length,m=n&&v.length;a.x=x[y-2],a.y=x[y-1],a.bx=ht(x[y-4])||a.x,a.by=ht(x[y-3])||a.y,s.bx=n&&(ht(v[m-4])||s.x),s.by=n&&(ht(v[m-3])||s.y),s.x=n&&v[m-2],s.y=n&&v[m-1]}return n||(r.curve=Yt(i)),n?[i,n]:i},null,Yt),Jt=e._parseDots=n(function(t){for(var r=[],i=0,n=t.length;n>i;i++){var a={},s=t[i].match(/^([^:]*):?([\d\.]*)/);if(a.color=e.getRGB(s[1]),a.color.error)return null;a.opacity=a.color.opacity,a.color=a.color.hex,s[2]&&(a.offset=s[2]+"%"),r.push(a)}for(i=1,n=r.length-1;n>i;i++)if(!r[i].offset){for(var o=ht(r[i-1].offset||0),l=0,h=i+1;n>h;h++)if(r[h].offset){l=r[h].offset;break}l||(l=100,h=n),l=ht(l);for(var u=(l-o)/(h-i+1);h>i;i++)o+=u,r[i].offset=o+"%"}return r}),Kt=e._tear=function(t,e){t==e.top&&(e.top=t.prev),t==e.bottom&&(e.bottom=t.next),t.next&&(t.next.prev=t.prev),t.prev&&(t.prev.next=t.next)},te=e._tofront=function(t,e){e.top!==t&&(Kt(t,e),t.next=null,t.prev=e.top,e.top.next=t,e.top=t)},ee=e._toback=function(t,e){e.bottom!==t&&(Kt(t,e),t.next=e.bottom,t.prev=null,e.bottom.prev=t,e.bottom=t)},re=e._insertafter=function(t,e,r){Kt(t,r),e==r.top&&(r.top=t),e.next&&(e.next.prev=t),t.next=e.next,t.prev=e,e.next=t},ie=e._insertbefore=function(t,e,r){Kt(t,r),e==r.bottom&&(r.bottom=t),e.prev&&(e.prev.next=t),t.prev=e.prev,e.prev=t,t.next=e},ne=e.toMatrix=function(t,e){var r=Ot(t),i={_:{transform:R},getBBox:function(){return r}};return se(i,e),i.matrix},ae=e.transformPath=function(t,e){return Nt(t,ne(t,e))},se=e._extractTransform=function(t,r){if(null==r)return t._.transform;r=j(r).replace(/\.{3}|\u2026/g,t._.transform||R);var i=e.parseTransformString(r),n=0,a=0,s=0,o=1,l=1,h=t._,u=new g;if(h.transform=i||[],i)for(var c=0,f=i.length;f>c;c++){var p=i[c],d=p.length,x=j(p[0]).toLowerCase(),v=p[0]!=x,y=v?u.invert():0,m,b,_,w,k;"t"==x&&3==d?v?(m=y.x(0,0),b=y.y(0,0),_=y.x(p[1],p[2]),w=y.y(p[1],p[2]),u.translate(_-m,w-b)):u.translate(p[1],p[2]):"r"==x?2==d?(k=k||t.getBBox(1),u.rotate(p[1],k.x+k.width/2,k.y+k.height/2),n+=p[1]):4==d&&(v?(_=y.x(p[2],p[3]),w=y.y(p[2],p[3]),u.rotate(p[1],_,w)):u.rotate(p[1],p[2],p[3]),n+=p[1]):"s"==x?2==d||3==d?(k=k||t.getBBox(1),u.scale(p[1],p[d-1],k.x+k.width/2,k.y+k.height/2),o*=p[1],l*=p[d-1]):5==d&&(v?(_=y.x(p[3],p[4]),w=y.y(p[3],p[4]),u.scale(p[1],p[2],_,w)):u.scale(p[1],p[2],p[3],p[4]),o*=p[1],l*=p[2]):"m"==x&&7==d&&u.add(p[1],p[2],p[3],p[4],p[5],p[6]),h.dirtyT=1,t.matrix=u}t.matrix=u,h.sx=o,h.sy=l,h.deg=n,h.dx=a=u.e,h.dy=s=u.f,1==o&&1==l&&!n&&h.bbox?(h.bbox.x+=+a,h.bbox.y+=+s):h.dirtyT=1},oe=function(t){var e=t[0];switch(e.toLowerCase()){case"t":return[e,0,0];case"m":return[e,1,0,0,1,0,0];case"r":return 4==t.length?[e,0,t[2],t[3]]:[e,0];case"s":return 5==t.length?[e,1,1,t[3],t[4]]:3==t.length?[e,1,1]:[e,1]}},le=e._equaliseTransform=function(t,r){r=j(r).replace(/\.{3}|\u2026/g,t),t=e.parseTransformString(t)||[],r=e.parseTransformString(r)||[];for(var i=W(t.length,r.length),n=[],a=[],s=0,o,l,h,u;i>s;s++){if(h=t[s]||oe(r[s]),u=r[s]||oe(h),h[0]!=u[0]||"r"==h[0].toLowerCase()&&(h[2]!=u[2]||h[3]!=u[3])||"s"==h[0].toLowerCase()&&(h[3]!=u[3]||h[4]!=u[4]))return;for(n[s]=[],a[s]=[],o=0,l=W(h.length,u.length);l>o;o++)o in h&&(n[s][o]=h[o]),o in u&&(a[s][o]=u[o])}return{from:n,to:a}};e._getContainer=function(t,r,i,n){var a;return a=null!=n||e.is(t,"object")?t:A.doc.getElementById(t),null!=a?a.tagName?null==r?{container:a,width:a.style.pixelWidth||a.offsetWidth,height:a.style.pixelHeight||a.offsetHeight}:{container:a,width:r,height:i}:{container:1,x:t,y:r,width:i,height:n}:void 0},e.pathToRelative=Wt,e._engine={},e.path2curve=Qt,e.matrix=function(t,e,r,i,n,a){return new g(t,e,r,i,n,a)},function(t){function r(t){return t[0]*t[0]+t[1]*t[1]}function i(t){var e=Y.sqrt(r(t));t[0]&&(t[0]/=e),t[1]&&(t[1]/=e)}t.add=function(t,e,r,i,n,a){var s=[[],[],[]],o=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],l=[[t,r,n],[e,i,a],[0,0,1]],h,u,c,f;for(t&&t instanceof g&&(l=[[t.a,t.c,t.e],[t.b,t.d,t.f],[0,0,1]]),h=0;3>h;h++)for(u=0;3>u;u++){for(f=0,c=0;3>c;c++)f+=o[h][c]*l[c][u];s[h][u]=f}this.a=s[0][0],this.b=s[1][0],this.c=s[0][1],this.d=s[1][1],this.e=s[0][2],this.f=s[1][2]},t.invert=function(){var t=this,e=t.a*t.d-t.b*t.c;return new g(t.d/e,-t.b/e,-t.c/e,t.a/e,(t.c*t.f-t.d*t.e)/e,(t.b*t.e-t.a*t.f)/e)},t.clone=function(){return new g(this.a,this.b,this.c,this.d,this.e,this.f)},t.translate=function(t,e){ | |
| this.add(1,0,0,1,t,e)},t.scale=function(t,e,r,i){null==e&&(e=t),(r||i)&&this.add(1,0,0,1,r,i),this.add(t,0,0,e,0,0),(r||i)&&this.add(1,0,0,1,-r,-i)},t.rotate=function(t,r,i){t=e.rad(t),r=r||0,i=i||0;var n=+Y.cos(t).toFixed(9),a=+Y.sin(t).toFixed(9);this.add(n,a,-a,n,r,i),this.add(1,0,0,1,-r,-i)},t.x=function(t,e){return t*this.a+e*this.c+this.e},t.y=function(t,e){return t*this.b+e*this.d+this.f},t.get=function(t){return+this[j.fromCharCode(97+t)].toFixed(4)},t.toString=function(){return e.svg?"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},t.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0)+", M12="+this.get(2)+", M21="+this.get(1)+", M22="+this.get(3)+", Dx="+this.get(4)+", Dy="+this.get(5)+", sizingmethod='auto expand')"},t.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},t.split=function(){var t={};t.dx=this.e,t.dy=this.f;var n=[[this.a,this.c],[this.b,this.d]];t.scalex=Y.sqrt(r(n[0])),i(n[0]),t.shear=n[0][0]*n[1][0]+n[0][1]*n[1][1],n[1]=[n[1][0]-n[0][0]*t.shear,n[1][1]-n[0][1]*t.shear],t.scaley=Y.sqrt(r(n[1])),i(n[1]),t.shear/=t.scaley;var a=-n[0][1],s=n[1][1];return 0>s?(t.rotate=e.deg(Y.acos(s)),0>a&&(t.rotate=360-t.rotate)):t.rotate=e.deg(Y.asin(a)),t.isSimple=!(+t.shear.toFixed(9)||t.scalex.toFixed(9)!=t.scaley.toFixed(9)&&t.rotate),t.isSuperSimple=!+t.shear.toFixed(9)&&t.scalex.toFixed(9)==t.scaley.toFixed(9)&&!t.rotate,t.noRotation=!+t.shear.toFixed(9)&&!t.rotate,t},t.toTransformString=function(t){var e=t||this[q]();return e.isSimple?(e.scalex=+e.scalex.toFixed(4),e.scaley=+e.scaley.toFixed(4),e.rotate=+e.rotate.toFixed(4),(e.dx||e.dy?"t"+[e.dx,e.dy]:R)+(1!=e.scalex||1!=e.scaley?"s"+[e.scalex,e.scaley,0,0]:R)+(e.rotate?"r"+[e.rotate,0,0]:R)):"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(g.prototype);for(var he=function(){this.returnValue=!1},ue=function(){return this.originalEvent.preventDefault()},ce=function(){this.cancelBubble=!0},fe=function(){return this.originalEvent.stopPropagation()},pe=function(t){var e=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,r=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;return{x:t.clientX+r,y:t.clientY+e}},de=function(){return A.doc.addEventListener?function(t,e,r,i){var n=function(t){var e=pe(t);return r.call(i,t,e.x,e.y)};if(t.addEventListener(e,n,!1),F&&V[e]){var a=function(e){for(var n=pe(e),a=e,s=0,o=e.targetTouches&&e.targetTouches.length;o>s;s++)if(e.targetTouches[s].target==t){e=e.targetTouches[s],e.originalEvent=a,e.preventDefault=ue,e.stopPropagation=fe;break}return r.call(i,e,n.x,n.y)};t.addEventListener(V[e],a,!1)}return function(){return t.removeEventListener(e,n,!1),F&&V[e]&&t.removeEventListener(V[e],a,!1),!0}}:A.doc.attachEvent?function(t,e,r,i){var n=function(t){t=t||A.win.event;var e=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,n=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,a=t.clientX+n,s=t.clientY+e;return t.preventDefault=t.preventDefault||he,t.stopPropagation=t.stopPropagation||ce,r.call(i,t,a,s)};t.attachEvent("on"+e,n);var a=function(){return t.detachEvent("on"+e,n),!0};return a}:void 0}(),ge=[],xe=function(e){for(var r=e.clientX,i=e.clientY,n=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,a=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,s,o=ge.length;o--;){if(s=ge[o],F&&e.touches){for(var l=e.touches.length,h;l--;)if(h=e.touches[l],h.identifier==s.el._drag.id){r=h.clientX,i=h.clientY,(e.originalEvent?e.originalEvent:e).preventDefault();break}}else e.preventDefault();var u=s.el.node,c,f=u.nextSibling,p=u.parentNode,d=u.style.display;A.win.opera&&p.removeChild(u),u.style.display="none",c=s.el.paper.getElementByPoint(r,i),u.style.display=d,A.win.opera&&(f?p.insertBefore(u,f):p.appendChild(u)),c&&t("raphael.drag.over."+s.el.id,s.el,c),r+=a,i+=n,t("raphael.drag.move."+s.el.id,s.move_scope||s.el,r-s.el._drag.x,i-s.el._drag.y,r,i,e)}},ve=function(r){e.unmousemove(xe).unmouseup(ve);for(var i=ge.length,n;i--;)n=ge[i],n.el._drag={},t("raphael.drag.end."+n.el.id,n.end_scope||n.start_scope||n.move_scope||n.el,r);ge=[]},ye=e.el={},me=D.length;me--;)!function(t){e[t]=ye[t]=function(r,i){return e.is(r,"function")&&(this.events=this.events||[],this.events.push({name:t,f:r,unbind:de(this.shape||this.node||A.doc,t,r,i||this)})),this},e["un"+t]=ye["un"+t]=function(r){for(var i=this.events||[],n=i.length;n--;)i[n].name!=t||!e.is(r,"undefined")&&i[n].f!=r||(i[n].unbind(),i.splice(n,1),!i.length&&delete this.events);return this}}(D[me]);ye.data=function(r,i){var n=wt[this.id]=wt[this.id]||{};if(0==arguments.length)return n;if(1==arguments.length){if(e.is(r,"object")){for(var a in r)r[T](a)&&this.data(a,r[a]);return this}return t("raphael.data.get."+this.id,this,n[r],r),n[r]}return n[r]=i,t("raphael.data.set."+this.id,this,i,r),this},ye.removeData=function(t){return null==t?wt[this.id]={}:wt[this.id]&&delete wt[this.id][t],this},ye.getData=function(){return r(wt[this.id]||{})},ye.hover=function(t,e,r,i){return this.mouseover(t,r).mouseout(e,i||r)},ye.unhover=function(t,e){return this.unmouseover(t).unmouseout(e)};var be=[];ye.drag=function(r,i,n,a,s,o){function l(l){(l.originalEvent||l).preventDefault();var h=l.clientX,u=l.clientY,c=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,f=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;if(this._drag.id=l.identifier,F&&l.touches)for(var p=l.touches.length,d;p--;)if(d=l.touches[p],this._drag.id=d.identifier,d.identifier==this._drag.id){h=d.clientX,u=d.clientY;break}this._drag.x=h+f,this._drag.y=u+c,!ge.length&&e.mousemove(xe).mouseup(ve),ge.push({el:this,move_scope:a,start_scope:s,end_scope:o}),i&&t.on("raphael.drag.start."+this.id,i),r&&t.on("raphael.drag.move."+this.id,r),n&&t.on("raphael.drag.end."+this.id,n),t("raphael.drag.start."+this.id,s||a||this,l.clientX+f,l.clientY+c,l)}return this._drag={},be.push({el:this,start:l}),this.mousedown(l),this},ye.onDragOver=function(e){e?t.on("raphael.drag.over."+this.id,e):t.unbind("raphael.drag.over."+this.id)},ye.undrag=function(){for(var r=be.length;r--;)be[r].el==this&&(this.unmousedown(be[r].start),be.splice(r,1),t.unbind("raphael.drag.*."+this.id));!be.length&&e.unmousemove(xe).unmouseup(ve),ge=[]},M.circle=function(t,r,i){var n=e._engine.circle(this,t||0,r||0,i||0);return this.__set__&&this.__set__.push(n),n},M.rect=function(t,r,i,n,a){var s=e._engine.rect(this,t||0,r||0,i||0,n||0,a||0);return this.__set__&&this.__set__.push(s),s},M.ellipse=function(t,r,i,n){var a=e._engine.ellipse(this,t||0,r||0,i||0,n||0);return this.__set__&&this.__set__.push(a),a},M.path=function(t){t&&!e.is(t,Z)&&!e.is(t[0],Q)&&(t+=R);var r=e._engine.path(e.format[z](e,arguments),this);return this.__set__&&this.__set__.push(r),r},M.image=function(t,r,i,n,a){var s=e._engine.image(this,t||"about:blank",r||0,i||0,n||0,a||0);return this.__set__&&this.__set__.push(s),s},M.text=function(t,r,i){var n=e._engine.text(this,t||0,r||0,j(i));return this.__set__&&this.__set__.push(n),n},M.set=function(t){!e.is(t,"array")&&(t=Array.prototype.splice.call(arguments,0,arguments.length));var r=new ze(t);return this.__set__&&this.__set__.push(r),r.paper=this,r.type="set",r},M.setStart=function(t){this.__set__=t||this.set()},M.setFinish=function(t){var e=this.__set__;return delete this.__set__,e},M.getSize=function(){var t=this.canvas.parentNode;return{width:t.offsetWidth,height:t.offsetHeight}},M.setSize=function(t,r){return e._engine.setSize.call(this,t,r)},M.setViewBox=function(t,r,i,n,a){return e._engine.setViewBox.call(this,t,r,i,n,a)},M.top=M.bottom=null,M.raphael=e;var _e=function(t){var e=t.getBoundingClientRect(),r=t.ownerDocument,i=r.body,n=r.documentElement,a=n.clientTop||i.clientTop||0,s=n.clientLeft||i.clientLeft||0,o=e.top+(A.win.pageYOffset||n.scrollTop||i.scrollTop)-a,l=e.left+(A.win.pageXOffset||n.scrollLeft||i.scrollLeft)-s;return{y:o,x:l}};M.getElementByPoint=function(t,e){var r=this,i=r.canvas,n=A.doc.elementFromPoint(t,e);if(A.win.opera&&"svg"==n.tagName){var a=_e(i),s=i.createSVGRect();s.x=t-a.x,s.y=e-a.y,s.width=s.height=1;var o=i.getIntersectionList(s,null);o.length&&(n=o[o.length-1])}if(!n)return null;for(;n.parentNode&&n!=i.parentNode&&!n.raphael;)n=n.parentNode;return n==r.canvas.parentNode&&(n=i),n=n&&n.raphael?r.getById(n.raphaelid):null},M.getElementsByBBox=function(t){var r=this.set();return this.forEach(function(i){e.isBBoxIntersect(i.getBBox(),t)&&r.push(i)}),r},M.getById=function(t){for(var e=this.bottom;e;){if(e.id==t)return e;e=e.next}return null},M.forEach=function(t,e){for(var r=this.bottom;r;){if(t.call(e,r)===!1)return this;r=r.next}return this},M.getElementsByPoint=function(t,e){var r=this.set();return this.forEach(function(i){i.isPointInside(t,e)&&r.push(i)}),r},ye.isPointInside=function(t,r){var i=this.realPath=Et[this.type](this);return this.attr("transform")&&this.attr("transform").length&&(i=e.transformPath(i,this.attr("transform"))),e.isPointInsidePath(i,t,r)},ye.getBBox=function(t){if(this.removed)return{};var e=this._;return t?(!e.dirty&&e.bboxwt||(this.realPath=Et[this.type](this),e.bboxwt=Ot(this.realPath),e.bboxwt.toString=v,e.dirty=0),e.bboxwt):((e.dirty||e.dirtyT||!e.bbox)&&(!e.dirty&&this.realPath||(e.bboxwt=0,this.realPath=Et[this.type](this)),e.bbox=Ot(Nt(this.realPath,this.matrix)),e.bbox.toString=v,e.dirty=e.dirtyT=0),e.bbox)},ye.clone=function(){if(this.removed)return null;var t=this.paper[this.type]().attr(this.attr());return this.__set__&&this.__set__.push(t),t},ye.glow=function(t){if("text"==this.type)return null;t=t||{};var e={width:(t.width||10)+(+this.attr("stroke-width")||1),fill:t.fill||!1,opacity:null==t.opacity?.5:t.opacity,offsetx:t.offsetx||0,offsety:t.offsety||0,color:t.color||"#000"},r=e.width/2,i=this.paper,n=i.set(),a=this.realPath||Et[this.type](this);a=this.matrix?Nt(a,this.matrix):a;for(var s=1;r+1>s;s++)n.push(i.path(a).attr({stroke:e.color,fill:e.fill?e.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(e.width/r*s).toFixed(3),opacity:+(e.opacity/r).toFixed(3)}));return n.insertBefore(this).translate(e.offsetx,e.offsety)};var we={},ke=function(t,r,i,n,a,s,o,u,c){return null==c?l(t,r,i,n,a,s,o,u):e.findDotsAtSegment(t,r,i,n,a,s,o,u,h(t,r,i,n,a,s,o,u,c))},Be=function(t,r){return function(i,n,a){i=Qt(i);for(var s,o,l,h,u="",c={},f,p=0,d=0,g=i.length;g>d;d++){if(l=i[d],"M"==l[0])s=+l[1],o=+l[2];else{if(h=ke(s,o,l[1],l[2],l[3],l[4],l[5],l[6]),p+h>n){if(r&&!c.start){if(f=ke(s,o,l[1],l[2],l[3],l[4],l[5],l[6],n-p),u+=["C"+f.start.x,f.start.y,f.m.x,f.m.y,f.x,f.y],a)return u;c.start=u,u=["M"+f.x,f.y+"C"+f.n.x,f.n.y,f.end.x,f.end.y,l[5],l[6]].join(),p+=h,s=+l[5],o=+l[6];continue}if(!t&&!r)return f=ke(s,o,l[1],l[2],l[3],l[4],l[5],l[6],n-p),{x:f.x,y:f.y,alpha:f.alpha}}p+=h,s=+l[5],o=+l[6]}u+=l.shift()+l}return c.end=u,f=t?p:r?c:e.findDotsAtSegment(s,o,l[0],l[1],l[2],l[3],l[4],l[5],1),f.alpha&&(f={x:f.x,y:f.y,alpha:f.alpha}),f}},Ce=Be(1),Se=Be(),Te=Be(0,1);e.getTotalLength=Ce,e.getPointAtLength=Se,e.getSubpath=function(t,e,r){if(this.getTotalLength(t)-r<1e-6)return Te(t,e).end;var i=Te(t,r,1);return e?Te(i,e).end:i},ye.getTotalLength=function(){var t=this.getPath();if(t)return this.node.getTotalLength?this.node.getTotalLength():Ce(t)},ye.getPointAtLength=function(t){var e=this.getPath();if(e)return Se(e,t)},ye.getPath=function(){var t,r=e._getPath[this.type];if("text"!=this.type&&"set"!=this.type)return r&&(t=r(this)),t},ye.getSubpath=function(t,r){var i=this.getPath();if(i)return e.getSubpath(i,t,r)};var Ae=e.easing_formulas={linear:function(t){return t},"<":function(t){return X(t,1.7)},">":function(t){return X(t,.48)},"<>":function(t){var e=.48-t/1.04,r=Y.sqrt(.1734+e*e),i=r-e,n=X(H(i),1/3)*(0>i?-1:1),a=-r-e,s=X(H(a),1/3)*(0>a?-1:1),o=n+s+.5;return 3*(1-o)*o*o+o*o*o},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){t-=1;var e=1.70158;return t*t*((e+1)*t+e)+1},elastic:function(t){return t==!!t?t:X(2,-10*t)*Y.sin((t-.075)*(2*U)/.3)+1},bounce:function(t){var e=7.5625,r=2.75,i;return 1/r>t?i=e*t*t:2/r>t?(t-=1.5/r,i=e*t*t+.75):2.5/r>t?(t-=2.25/r,i=e*t*t+.9375):(t-=2.625/r,i=e*t*t+.984375),i}};Ae.easeIn=Ae["ease-in"]=Ae["<"],Ae.easeOut=Ae["ease-out"]=Ae[">"],Ae.easeInOut=Ae["ease-in-out"]=Ae["<>"],Ae["back-in"]=Ae.backIn,Ae["back-out"]=Ae.backOut;var Ee=[],Ne=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){setTimeout(t,16)},Me=function(){for(var r=+new Date,i=0;i<Ee.length;i++){var n=Ee[i];if(!n.el.removed&&!n.paused){var a=r-n.start,s=n.ms,o=n.easing,l=n.from,h=n.diff,u=n.to,c=n.t,f=n.el,p={},d,g={},x;if(n.initstatus?(a=(n.initstatus*n.anim.top-n.prev)/(n.percent-n.prev)*s,n.status=n.initstatus,delete n.initstatus,n.stop&&Ee.splice(i--,1)):n.status=(n.prev+(n.percent-n.prev)*(a/s))/n.anim.top,!(0>a))if(s>a){var v=o(a/s);for(var y in l)if(l[T](y)){switch(pt[y]){case $:d=+l[y]+v*s*h[y];break;case"colour":d="rgb("+[Le(ot(l[y].r+v*s*h[y].r)),Le(ot(l[y].g+v*s*h[y].g)),Le(ot(l[y].b+v*s*h[y].b))].join(",")+")";break;case"path":d=[];for(var m=0,_=l[y].length;_>m;m++){d[m]=[l[y][m][0]];for(var w=1,k=l[y][m].length;k>w;w++)d[m][w]=+l[y][m][w]+v*s*h[y][m][w];d[m]=d[m].join(I)}d=d.join(I);break;case"transform":if(h[y].real)for(d=[],m=0,_=l[y].length;_>m;m++)for(d[m]=[l[y][m][0]],w=1,k=l[y][m].length;k>w;w++)d[m][w]=l[y][m][w]+v*s*h[y][m][w];else{var B=function(t){return+l[y][t]+v*s*h[y][t]};d=[["m",B(0),B(1),B(2),B(3),B(4),B(5)]]}break;case"csv":if("clip-rect"==y)for(d=[],m=4;m--;)d[m]=+l[y][m]+v*s*h[y][m];break;default:var C=[][P](l[y]);for(d=[],m=f.paper.customAttributes[y].length;m--;)d[m]=+C[m]+v*s*h[y][m]}p[y]=d}f.attr(p),function(e,r,i){setTimeout(function(){t("raphael.anim.frame."+e,r,i)})}(f.id,f,n.anim)}else{if(function(r,i,n){setTimeout(function(){t("raphael.anim.frame."+i.id,i,n),t("raphael.anim.finish."+i.id,i,n),e.is(r,"function")&&r.call(i)})}(n.callback,f,n.anim),f.attr(u),Ee.splice(i--,1),n.repeat>1&&!n.next){for(x in u)u[T](x)&&(g[x]=n.totalOrigin[x]);n.el.attr(g),b(n.anim,n.el,n.anim.percents[0],null,n.totalOrigin,n.repeat-1)}n.next&&!n.stop&&b(n.anim,n.el,n.next,null,n.totalOrigin,n.repeat)}}}Ee.length&&Ne(Me)},Le=function(t){return t>255?255:0>t?0:t};ye.animateWith=function(t,r,i,n,a,s){var o=this;if(o.removed)return s&&s.call(o),o;var l=i instanceof m?i:e.animation(i,n,a,s),h,u;b(l,o,l.percents[0],null,o.attr());for(var c=0,f=Ee.length;f>c;c++)if(Ee[c].anim==r&&Ee[c].el==t){Ee[f-1].start=Ee[c].start;break}return o},ye.onAnimation=function(e){return e?t.on("raphael.anim.frame."+this.id,e):t.unbind("raphael.anim.frame."+this.id),this},m.prototype.delay=function(t){var e=new m(this.anim,this.ms);return e.times=this.times,e.del=+t||0,e},m.prototype.repeat=function(t){var e=new m(this.anim,this.ms);return e.del=this.del,e.times=Y.floor(W(t,0))||1,e},e.animation=function(t,r,i,n){if(t instanceof m)return t;!e.is(i,"function")&&i||(n=n||i||null,i=null),t=Object(t),r=+r||0;var a={},s,o;for(o in t)t[T](o)&&ht(o)!=o&&ht(o)+"%"!=o&&(s=!0,a[o]=t[o]);if(s)return i&&(a.easing=i),n&&(a.callback=n),new m({100:a},r);if(n){var l=0;for(var h in t){var u=ut(h);t[T](h)&&u>l&&(l=u)}l+="%",!t[l].callback&&(t[l].callback=n)}return new m(t,r)},ye.animate=function(t,r,i,n){var a=this;if(a.removed)return n&&n.call(a),a;var s=t instanceof m?t:e.animation(t,r,i,n);return b(s,a,s.percents[0],null,a.attr()),a},ye.setTime=function(t,e){return t&&null!=e&&this.status(t,G(e,t.ms)/t.ms),this},ye.status=function(t,e){var r=[],i=0,n,a;if(null!=e)return b(t,this,-1,G(e,1)),this;for(n=Ee.length;n>i;i++)if(a=Ee[i],a.el.id==this.id&&(!t||a.anim==t)){if(t)return a.status;r.push({anim:a.anim,status:a.status})}return t?0:r},ye.pause=function(e){for(var r=0;r<Ee.length;r++)Ee[r].el.id!=this.id||e&&Ee[r].anim!=e||t("raphael.anim.pause."+this.id,this,Ee[r].anim)!==!1&&(Ee[r].paused=!0);return this},ye.resume=function(e){for(var r=0;r<Ee.length;r++)if(Ee[r].el.id==this.id&&(!e||Ee[r].anim==e)){var i=Ee[r];t("raphael.anim.resume."+this.id,this,i.anim)!==!1&&(delete i.paused,this.status(i.anim,i.status))}return this},ye.stop=function(e){for(var r=0;r<Ee.length;r++)Ee[r].el.id!=this.id||e&&Ee[r].anim!=e||t("raphael.anim.stop."+this.id,this,Ee[r].anim)!==!1&&Ee.splice(r--,1);return this},t.on("raphael.remove",_),t.on("raphael.clear",_),ye.toString=function(){return"Raphaël’s object"};var ze=function(t){if(this.items=[],this.length=0,this.type="set",t)for(var e=0,r=t.length;r>e;e++)!t[e]||t[e].constructor!=ye.constructor&&t[e].constructor!=ze||(this[this.items.length]=this.items[this.items.length]=t[e],this.length++)},Pe=ze.prototype;Pe.push=function(){for(var t,e,r=0,i=arguments.length;i>r;r++)t=arguments[r],!t||t.constructor!=ye.constructor&&t.constructor!=ze||(e=this.items.length,this[e]=this.items[e]=t,this.length++);return this},Pe.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},Pe.forEach=function(t,e){for(var r=0,i=this.items.length;i>r;r++)if(t.call(e,this.items[r],r)===!1)return this;return this};for(var Fe in ye)ye[T](Fe)&&(Pe[Fe]=function(t){return function(){var e=arguments;return this.forEach(function(r){r[t][z](r,e)})}}(Fe));return Pe.attr=function(t,r){if(t&&e.is(t,Q)&&e.is(t[0],"object"))for(var i=0,n=t.length;n>i;i++)this.items[i].attr(t[i]);else for(var a=0,s=this.items.length;s>a;a++)this.items[a].attr(t,r);return this},Pe.clear=function(){for(;this.length;)this.pop()},Pe.splice=function(t,e,r){t=0>t?W(this.length+t,0):t,e=W(0,G(this.length-t,e));var i=[],n=[],a=[],s;for(s=2;s<arguments.length;s++)a.push(arguments[s]);for(s=0;e>s;s++)n.push(this[t+s]);for(;s<this.length-t;s++)i.push(this[t+s]);var o=a.length;for(s=0;s<o+i.length;s++)this.items[t+s]=this[t+s]=o>s?a[s]:i[s-o];for(s=this.items.length=this.length-=e-o;this[s];)delete this[s++];return new ze(n)},Pe.exclude=function(t){for(var e=0,r=this.length;r>e;e++)if(this[e]==t)return this.splice(e,1),!0},Pe.animate=function(t,r,i,n){(e.is(i,"function")||!i)&&(n=i||null);var a=this.items.length,s=a,o,l=this,h;if(!a)return this;n&&(h=function(){!--a&&n.call(l)}),i=e.is(i,Z)?i:h;var u=e.animation(t,r,i,h);for(o=this.items[--s].animate(u);s--;)this.items[s]&&!this.items[s].removed&&this.items[s].animateWith(o,u,u),this.items[s]&&!this.items[s].removed||a--;return this},Pe.insertAfter=function(t){for(var e=this.items.length;e--;)this.items[e].insertAfter(t);return this},Pe.getBBox=function(){for(var t=[],e=[],r=[],i=[],n=this.items.length;n--;)if(!this.items[n].removed){var a=this.items[n].getBBox();t.push(a.x),e.push(a.y),r.push(a.x+a.width),i.push(a.y+a.height)}return t=G[z](0,t),e=G[z](0,e),r=W[z](0,r),i=W[z](0,i),{x:t,y:e,x2:r,y2:i,width:r-t,height:i-e}},Pe.clone=function(t){t=this.paper.set();for(var e=0,r=this.items.length;r>e;e++)t.push(this.items[e].clone());return t},Pe.toString=function(){return"Raphaël‘s set"},Pe.glow=function(t){var e=this.paper.set();return this.forEach(function(r,i){var n=r.glow(t);null!=n&&n.forEach(function(t,r){e.push(t)})}),e},Pe.isPointInside=function(t,e){var r=!1;return this.forEach(function(i){return i.isPointInside(t,e)?(r=!0,!1):void 0}),r},e.registerFont=function(t){if(!t.face)return t;this.fonts=this.fonts||{};var e={w:t.w,face:{},glyphs:{}},r=t.face["font-family"];for(var i in t.face)t.face[T](i)&&(e.face[i]=t.face[i]);if(this.fonts[r]?this.fonts[r].push(e):this.fonts[r]=[e],!t.svg){e.face["units-per-em"]=ut(t.face["units-per-em"],10);for(var n in t.glyphs)if(t.glyphs[T](n)){var a=t.glyphs[n];if(e.glyphs[n]={w:a.w,k:{},d:a.d&&"M"+a.d.replace(/[mlcxtrv]/g,function(t){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[t]||"M"})+"z"},a.k)for(var s in a.k)a[T](s)&&(e.glyphs[n].k[s]=a.k[s])}}return t},M.getFont=function(t,r,i,n){if(n=n||"normal",i=i||"normal",r=+r||{normal:400,bold:700,lighter:300,bolder:800}[r]||400,e.fonts){var a=e.fonts[t];if(!a){var s=new RegExp("(^|\\s)"+t.replace(/[^\w\d\s+!~.:_-]/g,R)+"(\\s|$)","i");for(var o in e.fonts)if(e.fonts[T](o)&&s.test(o)){a=e.fonts[o];break}}var l;if(a)for(var h=0,u=a.length;u>h&&(l=a[h],l.face["font-weight"]!=r||l.face["font-style"]!=i&&l.face["font-style"]||l.face["font-stretch"]!=n);h++);return l}},M.print=function(t,r,i,n,a,s,o,l){s=s||"middle",o=W(G(o||0,1),-1),l=W(G(l||1,3),1);var h=j(i)[q](R),u=0,c=0,f=R,p;if(e.is(n,"string")&&(n=this.getFont(n)),n){p=(a||16)/n.face["units-per-em"];for(var d=n.face.bbox[q](k),g=+d[0],x=d[3]-d[1],v=0,y=+d[1]+("baseline"==s?x+ +n.face.descent:x/2),m=0,b=h.length;b>m;m++){if("\n"==h[m])u=0,w=0,c=0,v+=x*l;else{var _=c&&n.glyphs[h[m-1]]||{},w=n.glyphs[h[m]];u+=c?(_.w||n.w)+(_.k&&_.k[h[m]]||0)+n.w*o:0,c=1}w&&w.d&&(f+=e.transformPath(w.d,["t",u*p,v*p,"s",p,p,g,y,"t",(t-g)/p,(r-y)/p]))}}return this.path(f).attr({fill:"#000",stroke:"none"})},M.add=function(t){if(e.is(t,"array"))for(var r=this.set(),i=0,n=t.length,a;n>i;i++)a=t[i]||{},B[T](a.type)&&r.push(this[a.type]().attr(a));return r},e.format=function(t,r){var i=e.is(r,Q)?[0][P](r):arguments;return t&&e.is(t,Z)&&i.length-1&&(t=t.replace(C,function(t,e){return null==i[++e]?R:i[e]})),t||R},e.fullfill=function(){var t=/\{([^\}]+)\}/g,e=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,r=function(t,r,i){var n=i;return r.replace(e,function(t,e,r,i,a){e=e||i,n&&(e in n&&(n=n[e]),"function"==typeof n&&a&&(n=n()))}),n=(null==n||n==i?t:n)+""};return function(e,i){return String(e).replace(t,function(t,e){return r(t,e,i)})}}(),e.ninja=function(){if(E.was)A.win.Raphael=E.is;else{window.Raphael=void 0;try{delete window.Raphael}catch(t){}}return e},e.st=Pe,t.on("raphael.DOMload",function(){w=!0}),function(t,r,i){function n(){/in/.test(t.readyState)?setTimeout(n,9):e.eve("raphael.DOMload")}null==t.readyState&&t.addEventListener&&(t.addEventListener(r,i=function(){t.removeEventListener(r,i,!1),t.readyState="complete"},!1),t.readyState="loading"),n()}(document,"DOMContentLoaded"),e}.apply(e,i),!(void 0!==n&&(t.exports=n))},function(t,e,r){var i,n;!function(r){var a="0.4.2",s="hasOwnProperty",o=/[\.\/]/,l="*",h=function(){},u=function(t,e){return t-e},c,f,p={n:{}},d=function(t,e){t=String(t);var r=p,i=f,n=Array.prototype.slice.call(arguments,2),a=d.listeners(t),s=0,o=!1,l,h=[],g={},x=[],v=c,y=[];c=t,f=0;for(var m=0,b=a.length;b>m;m++)"zIndex"in a[m]&&(h.push(a[m].zIndex),a[m].zIndex<0&&(g[a[m].zIndex]=a[m]));for(h.sort(u);h[s]<0;)if(l=g[h[s++]],x.push(l.apply(e,n)),f)return f=i,x;for(m=0;b>m;m++)if(l=a[m],"zIndex"in l)if(l.zIndex==h[s]){if(x.push(l.apply(e,n)),f)break;do if(s++,l=g[h[s]],l&&x.push(l.apply(e,n)),f)break;while(l)}else g[l.zIndex]=l;else if(x.push(l.apply(e,n)),f)break;return f=i,c=v,x.length?x:null};d._events=p,d.listeners=function(t){var e=t.split(o),r=p,i,n,a,s,h,u,c,f,d=[r],g=[];for(s=0,h=e.length;h>s;s++){for(f=[],u=0,c=d.length;c>u;u++)for(r=d[u].n,n=[r[e[s]],r[l]],a=2;a--;)i=n[a],i&&(f.push(i),g=g.concat(i.f||[]));d=f}return g},d.on=function(t,e){if(t=String(t),"function"!=typeof e)return function(){};for(var r=t.split(o),i=p,n=0,a=r.length;a>n;n++)i=i.n,i=i.hasOwnProperty(r[n])&&i[r[n]]||(i[r[n]]={n:{}});for(i.f=i.f||[],n=0,a=i.f.length;a>n;n++)if(i.f[n]==e)return h;return i.f.push(e),function(t){+t==+t&&(e.zIndex=+t)}},d.f=function(t){var e=[].slice.call(arguments,1);return function(){d.apply(null,[t,null].concat(e).concat([].slice.call(arguments,0)))}},d.stop=function(){f=1},d.nt=function(t){return t?new RegExp("(?:\\.|\\/|^)"+t+"(?:\\.|\\/|$)").test(c):c},d.nts=function(){return c.split(o)},d.off=d.unbind=function(t,e){if(!t)return void(d._events=p={n:{}});var r=t.split(o),i,n,a,h,u,c,f,g=[p];for(h=0,u=r.length;u>h;h++)for(c=0;c<g.length;c+=a.length-2){if(a=[c,1],i=g[c].n,r[h]!=l)i[r[h]]&&a.push(i[r[h]]);else for(n in i)i[s](n)&&a.push(i[n]);g.splice.apply(g,a)}for(h=0,u=g.length;u>h;h++)for(i=g[h];i.n;){if(e){if(i.f){for(c=0,f=i.f.length;f>c;c++)if(i.f[c]==e){i.f.splice(c,1);break}!i.f.length&&delete i.f}for(n in i.n)if(i.n[s](n)&&i.n[n].f){var x=i.n[n].f;for(c=0,f=x.length;f>c;c++)if(x[c]==e){x.splice(c,1);break}!x.length&&delete i.n[n].f}}else{delete i.f;for(n in i.n)i.n[s](n)&&i.n[n].f&&delete i.n[n].f}i=i.n}},d.once=function(t,e){var r=function(){return d.unbind(t,r),e.apply(this,arguments)};return d.on(t,r)},d.version=a,d.toString=function(){return"You are running Eve "+a},"undefined"!=typeof t&&t.exports?t.exports=d:(i=[],n=function(){return d}.apply(e,i),!(void 0!==n&&(t.exports=n)))}(this)},function(t,e,r){var i,n;i=[r(1)],n=function(t){if(!t||t.svg){var e="hasOwnProperty",r=String,i=parseFloat,n=parseInt,a=Math,s=a.max,o=a.abs,l=a.pow,h=/[, ]+/,u=t.eve,c="",f=" ",p="http://www.w3.org/1999/xlink",d={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},g={};t.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var x=function(i,n){if(n){"string"==typeof i&&(i=x(i));for(var a in n)n[e](a)&&("xlink:"==a.substring(0,6)?i.setAttributeNS(p,a.substring(6),r(n[a])):i.setAttribute(a,r(n[a])))}else i=t._g.doc.createElementNS("http://www.w3.org/2000/svg",i),i.style&&(i.style.webkitTapHighlightColor="rgba(0,0,0,0)");return i},v=function(e,n){var h="linear",u=e.id+n,f=.5,p=.5,d=e.node,g=e.paper,v=d.style,y=t._g.doc.getElementById(u);if(!y){if(n=r(n).replace(t._radial_gradient,function(t,e,r){if(h="radial",e&&r){f=i(e),p=i(r);var n=2*(p>.5)-1;l(f-.5,2)+l(p-.5,2)>.25&&(p=a.sqrt(.25-l(f-.5,2))*n+.5)&&.5!=p&&(p=p.toFixed(5)-1e-5*n)}return c}),n=n.split(/\s*\-\s*/),"linear"==h){var b=n.shift();if(b=-i(b),isNaN(b))return null;var _=[0,0,a.cos(t.rad(b)),a.sin(t.rad(b))],w=1/(s(o(_[2]),o(_[3]))||1);_[2]*=w,_[3]*=w,_[2]<0&&(_[0]=-_[2],_[2]=0),_[3]<0&&(_[1]=-_[3],_[3]=0)}var k=t._parseDots(n);if(!k)return null;if(u=u.replace(/[\(\)\s,\xb0#]/g,"_"),e.gradient&&u!=e.gradient.id&&(g.defs.removeChild(e.gradient),delete e.gradient),!e.gradient){y=x(h+"Gradient",{id:u}),e.gradient=y,x(y,"radial"==h?{fx:f,fy:p}:{x1:_[0],y1:_[1],x2:_[2],y2:_[3],gradientTransform:e.matrix.invert()}),g.defs.appendChild(y);for(var B=0,C=k.length;C>B;B++)y.appendChild(x("stop",{offset:k[B].offset?k[B].offset:B?"100%":"0%","stop-color":k[B].color||"#fff","stop-opacity":isFinite(k[B].opacity)?k[B].opacity:1}))}}return x(d,{fill:m(u),opacity:1,"fill-opacity":1}),v.fill=c,v.opacity=1,v.fillOpacity=1,1},y=function(){var t=document.documentMode;return t&&(9===t||10===t)},m=function(t){if(y())return"url('#"+t+"')";var e=document.location,r=e.protocol+"//"+e.host+e.pathname+e.search;return"url('"+r+"#"+t+"')"},b=function(t){var e=t.getBBox(1);x(t.pattern,{patternTransform:t.matrix.invert()+" translate("+e.x+","+e.y+")"})},_=function(i,n,a){if("path"==i.type){for(var s=r(n).toLowerCase().split("-"),o=i.paper,l=a?"end":"start",h=i.node,u=i.attrs,f=u["stroke-width"],p=s.length,v="classic",y,m,b,_,w,k=3,B=3,C=5;p--;)switch(s[p]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":v=s[p];break;case"wide":B=5;break;case"narrow":B=2;break;case"long":k=5;break;case"short":k=2}if("open"==v?(k+=2,B+=2,C+=2,b=1,_=a?4:1,w={fill:"none",stroke:u.stroke}):(_=b=k/2,w={fill:u.stroke,stroke:"none"}),i._.arrows?a?(i._.arrows.endPath&&g[i._.arrows.endPath]--,i._.arrows.endMarker&&g[i._.arrows.endMarker]--):(i._.arrows.startPath&&g[i._.arrows.startPath]--,i._.arrows.startMarker&&g[i._.arrows.startMarker]--):i._.arrows={},"none"!=v){var S="raphael-marker-"+v,T="raphael-marker-"+l+v+k+B+"-obj"+i.id;t._g.doc.getElementById(S)?g[S]++:(o.defs.appendChild(x(x("path"),{"stroke-linecap":"round",d:d[v],id:S})),g[S]=1);var A=t._g.doc.getElementById(T),E;A?(g[T]++,E=A.getElementsByTagName("use")[0]):(A=x(x("marker"),{id:T,markerHeight:B,markerWidth:k,orient:"auto",refX:_,refY:B/2}),E=x(x("use"),{"xlink:href":"#"+S,transform:(a?"rotate(180 "+k/2+" "+B/2+") ":c)+"scale("+k/C+","+B/C+")","stroke-width":(1/((k/C+B/C)/2)).toFixed(4)}),A.appendChild(E),o.defs.appendChild(A),g[T]=1),x(E,w);var N=b*("diamond"!=v&&"oval"!=v);a?(y=i._.arrows.startdx*f||0,m=t.getTotalLength(u.path)-N*f):(y=N*f,m=t.getTotalLength(u.path)-(i._.arrows.enddx*f||0)),w={},w["marker-"+l]="url(#"+T+")",(m||y)&&(w.d=t.getSubpath(u.path,y,m)),x(h,w),i._.arrows[l+"Path"]=S,i._.arrows[l+"Marker"]=T,i._.arrows[l+"dx"]=N,i._.arrows[l+"Type"]=v,i._.arrows[l+"String"]=n}else a?(y=i._.arrows.startdx*f||0,m=t.getTotalLength(u.path)-y):(y=0,m=t.getTotalLength(u.path)-(i._.arrows.enddx*f||0)),i._.arrows[l+"Path"]&&x(h,{d:t.getSubpath(u.path,y,m)}),delete i._.arrows[l+"Path"],delete i._.arrows[l+"Marker"],delete i._.arrows[l+"dx"],delete i._.arrows[l+"Type"],delete i._.arrows[l+"String"];for(w in g)if(g[e](w)&&!g[w]){var M=t._g.doc.getElementById(w);M&&M.parentNode.removeChild(M)}}},w={"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},k=function(t,e,i){if(e=w[r(e).toLowerCase()]){for(var n=t.attrs["stroke-width"]||"1",a={round:n,square:n,butt:0}[t.attrs["stroke-linecap"]||i["stroke-linecap"]]||0,s=[],o=e.length;o--;)s[o]=e[o]*n+(o%2?1:-1)*a;x(t.node,{"stroke-dasharray":s.join(",")})}else x(t.node,{"stroke-dasharray":"none"})},B=function(i,a){var l=i.node,u=i.attrs,f=l.style.visibility;l.style.visibility="hidden";for(var d in a)if(a[e](d)){if(!t._availableAttrs[e](d))continue;var g=a[d];switch(u[d]=g,d){case"blur":i.blur(g);break;case"title":var y=l.getElementsByTagName("title");if(y.length&&(y=y[0]))y.firstChild.nodeValue=g;else{y=x("title");var m=t._g.doc.createTextNode(g);y.appendChild(m),l.appendChild(y)}break;case"href":case"target":var w=l.parentNode;if("a"!=w.tagName.toLowerCase()){var B=x("a");w.insertBefore(B,l),B.appendChild(l),w=B}"target"==d?w.setAttributeNS(p,"show","blank"==g?"new":g):w.setAttributeNS(p,d,g);break;case"cursor":l.style.cursor=g;break;case"transform":i.transform(g);break;case"arrow-start":_(i,g);break;case"arrow-end":_(i,g,1);break;case"clip-rect":var C=r(g).split(h);if(4==C.length){i.clip&&i.clip.parentNode.parentNode.removeChild(i.clip.parentNode);var T=x("clipPath"),A=x("rect");T.id=t.createUUID(),x(A,{x:C[0],y:C[1],width:C[2],height:C[3]}),T.appendChild(A),i.paper.defs.appendChild(T),x(l,{"clip-path":"url(#"+T.id+")"}),i.clip=A}if(!g){var E=l.getAttribute("clip-path");if(E){var N=t._g.doc.getElementById(E.replace(/(^url\(#|\)$)/g,c));N&&N.parentNode.removeChild(N),x(l,{"clip-path":c}),delete i.clip}}break;case"path":"path"==i.type&&(x(l,{d:g?u.path=t._pathToAbsolute(g):"M0,0"}),i._.dirty=1,i._.arrows&&("startString"in i._.arrows&&_(i,i._.arrows.startString),"endString"in i._.arrows&&_(i,i._.arrows.endString,1)));break;case"width":if(l.setAttribute(d,g),i._.dirty=1,!u.fx)break;d="x",g=u.x;case"x":u.fx&&(g=-u.x-(u.width||0));case"rx":if("rx"==d&&"rect"==i.type)break;case"cx":l.setAttribute(d,g),i.pattern&&b(i),i._.dirty=1;break;case"height":if(l.setAttribute(d,g),i._.dirty=1,!u.fy)break;d="y",g=u.y;case"y":u.fy&&(g=-u.y-(u.height||0));case"ry":if("ry"==d&&"rect"==i.type)break;case"cy":l.setAttribute(d,g),i.pattern&&b(i),i._.dirty=1;break;case"r":"rect"==i.type?x(l,{rx:g,ry:g}):l.setAttribute(d,g),i._.dirty=1;break;case"src":"image"==i.type&&l.setAttributeNS(p,"href",g);break;case"stroke-width":1==i._.sx&&1==i._.sy||(g/=s(o(i._.sx),o(i._.sy))||1),l.setAttribute(d,g),u["stroke-dasharray"]&&k(i,u["stroke-dasharray"],a),i._.arrows&&("startString"in i._.arrows&&_(i,i._.arrows.startString),"endString"in i._.arrows&&_(i,i._.arrows.endString,1));break;case"stroke-dasharray":k(i,g,a);break;case"fill":var M=r(g).match(t._ISURL);if(M){T=x("pattern");var L=x("image");T.id=t.createUUID(),x(T,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),x(L,{x:0,y:0,"xlink:href":M[1]}),T.appendChild(L),function(e){t._preload(M[1],function(){var t=this.offsetWidth,r=this.offsetHeight;x(e,{width:t,height:r}),x(L,{width:t,height:r})})}(T),i.paper.defs.appendChild(T),x(l,{fill:"url(#"+T.id+")"}),i.pattern=T,i.pattern&&b(i);break}var z=t.getRGB(g);if(z.error){if(("circle"==i.type||"ellipse"==i.type||"r"!=r(g).charAt())&&v(i,g)){ | |
| if("opacity"in u||"fill-opacity"in u){var P=t._g.doc.getElementById(l.getAttribute("fill").replace(/^url\(#|\)$/g,c));if(P){var F=P.getElementsByTagName("stop");x(F[F.length-1],{"stop-opacity":("opacity"in u?u.opacity:1)*("fill-opacity"in u?u["fill-opacity"]:1)})}}u.gradient=g,u.fill="none";break}}else delete a.gradient,delete u.gradient,!t.is(u.opacity,"undefined")&&t.is(a.opacity,"undefined")&&x(l,{opacity:u.opacity}),!t.is(u["fill-opacity"],"undefined")&&t.is(a["fill-opacity"],"undefined")&&x(l,{"fill-opacity":u["fill-opacity"]});z[e]("opacity")&&x(l,{"fill-opacity":z.opacity>1?z.opacity/100:z.opacity});case"stroke":z=t.getRGB(g),l.setAttribute(d,z.hex),"stroke"==d&&z[e]("opacity")&&x(l,{"stroke-opacity":z.opacity>1?z.opacity/100:z.opacity}),"stroke"==d&&i._.arrows&&("startString"in i._.arrows&&_(i,i._.arrows.startString),"endString"in i._.arrows&&_(i,i._.arrows.endString,1));break;case"gradient":("circle"==i.type||"ellipse"==i.type||"r"!=r(g).charAt())&&v(i,g);break;case"opacity":u.gradient&&!u[e]("stroke-opacity")&&x(l,{"stroke-opacity":g>1?g/100:g});case"fill-opacity":if(u.gradient){P=t._g.doc.getElementById(l.getAttribute("fill").replace(/^url\(#|\)$/g,c)),P&&(F=P.getElementsByTagName("stop"),x(F[F.length-1],{"stop-opacity":g}));break}default:"font-size"==d&&(g=n(g,10)+"px");var R=d.replace(/(\-.)/g,function(t){return t.substring(1).toUpperCase()});l.style[R]=g,i._.dirty=1,l.setAttribute(d,g)}}S(i,a),l.style.visibility=f},C=1.2,S=function(i,a){if("text"==i.type&&(a[e]("text")||a[e]("font")||a[e]("font-size")||a[e]("x")||a[e]("y"))){var s=i.attrs,o=i.node,l=o.firstChild?n(t._g.doc.defaultView.getComputedStyle(o.firstChild,c).getPropertyValue("font-size"),10):10;if(a[e]("text")){for(s.text=a.text;o.firstChild;)o.removeChild(o.firstChild);for(var h=r(a.text).split("\n"),u=[],f,p=0,d=h.length;d>p;p++)f=x("tspan"),p&&x(f,{dy:l*C,x:s.x}),f.appendChild(t._g.doc.createTextNode(h[p])),o.appendChild(f),u[p]=f}else for(u=o.getElementsByTagName("tspan"),p=0,d=u.length;d>p;p++)p?x(u[p],{dy:l*C,x:s.x}):x(u[0],{dy:0});x(o,{x:s.x,y:s.y}),i._.dirty=1;var g=i._getBBox(),v=s.y-(g.y+g.height/2);v&&t.is(v,"finite")&&x(u[0],{dy:v})}},T=function(t){return t.parentNode&&"a"===t.parentNode.tagName.toLowerCase()?t.parentNode:t},A=function(e,r){var i=0,n=0;this[0]=this.node=e,e.raphael=!0,this.id=t._oid++,e.raphaelid=this.id,this.matrix=t.matrix(),this.realPath=null,this.paper=r,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!r.bottom&&(r.bottom=this),this.prev=r.top,r.top&&(r.top.next=this),r.top=this,this.next=null},E=t.el;A.prototype=E,E.constructor=A,t._engine.path=function(t,e){var r=x("path");e.canvas&&e.canvas.appendChild(r);var i=new A(r,e);return i.type="path",B(i,{fill:"none",stroke:"#000",path:t}),i},E.rotate=function(t,e,n){if(this.removed)return this;if(t=r(t).split(h),t.length-1&&(e=i(t[1]),n=i(t[2])),t=i(t[0]),null==n&&(e=n),null==e||null==n){var a=this.getBBox(1);e=a.x+a.width/2,n=a.y+a.height/2}return this.transform(this._.transform.concat([["r",t,e,n]])),this},E.scale=function(t,e,n,a){if(this.removed)return this;if(t=r(t).split(h),t.length-1&&(e=i(t[1]),n=i(t[2]),a=i(t[3])),t=i(t[0]),null==e&&(e=t),null==a&&(n=a),null==n||null==a)var s=this.getBBox(1);return n=null==n?s.x+s.width/2:n,a=null==a?s.y+s.height/2:a,this.transform(this._.transform.concat([["s",t,e,n,a]])),this},E.translate=function(t,e){return this.removed?this:(t=r(t).split(h),t.length-1&&(e=i(t[1])),t=i(t[0])||0,e=+e||0,this.transform(this._.transform.concat([["t",t,e]])),this)},E.transform=function(r){var i=this._;if(null==r)return i.transform;if(t._extractTransform(this,r),this.clip&&x(this.clip,{transform:this.matrix.invert()}),this.pattern&&b(this),this.node&&x(this.node,{transform:this.matrix}),1!=i.sx||1!=i.sy){var n=this.attrs[e]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":n})}return i.transform=this.matrix.toTransformString(),this},E.hide=function(){return this.removed||(this.node.style.display="none"),this},E.show=function(){return this.removed||(this.node.style.display=""),this},E.remove=function(){var e=T(this.node);if(!this.removed&&e.parentNode){var r=this.paper;r.__set__&&r.__set__.exclude(this),u.unbind("raphael.*.*."+this.id),this.gradient&&r.defs.removeChild(this.gradient),t._tear(this,r),e.parentNode.removeChild(e),this.removeData();for(var i in this)this[i]="function"==typeof this[i]?t._removedFactory(i):null;this.removed=!0}},E._getBBox=function(){if("none"==this.node.style.display){this.show();var t=!0}var e=!1,r;this.paper.canvas.parentElement?r=this.paper.canvas.parentElement.style:this.paper.canvas.parentNode&&(r=this.paper.canvas.parentNode.style),r&&"none"==r.display&&(e=!0,r.display="");var i={};try{i=this.node.getBBox()}catch(n){i={x:this.node.clientLeft,y:this.node.clientTop,width:this.node.clientWidth,height:this.node.clientHeight}}finally{i=i||{},e&&(r.display="none")}return t&&this.hide(),i},E.attr=function(r,i){if(this.removed)return this;if(null==r){var n={};for(var a in this.attrs)this.attrs[e](a)&&(n[a]=this.attrs[a]);return n.gradient&&"none"==n.fill&&(n.fill=n.gradient)&&delete n.gradient,n.transform=this._.transform,n}if(null==i&&t.is(r,"string")){if("fill"==r&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;if("transform"==r)return this._.transform;for(var s=r.split(h),o={},l=0,c=s.length;c>l;l++)r=s[l],r in this.attrs?o[r]=this.attrs[r]:t.is(this.paper.customAttributes[r],"function")?o[r]=this.paper.customAttributes[r].def:o[r]=t._availableAttrs[r];return c-1?o:o[s[0]]}if(null==i&&t.is(r,"array")){for(o={},l=0,c=r.length;c>l;l++)o[r[l]]=this.attr(r[l]);return o}if(null!=i){var f={};f[r]=i}else null!=r&&t.is(r,"object")&&(f=r);for(var p in f)u("raphael.attr."+p+"."+this.id,this,f[p]);for(p in this.paper.customAttributes)if(this.paper.customAttributes[e](p)&&f[e](p)&&t.is(this.paper.customAttributes[p],"function")){var d=this.paper.customAttributes[p].apply(this,[].concat(f[p]));this.attrs[p]=f[p];for(var g in d)d[e](g)&&(f[g]=d[g])}return B(this,f),this},E.toFront=function(){if(this.removed)return this;var e=T(this.node);e.parentNode.appendChild(e);var r=this.paper;return r.top!=this&&t._tofront(this,r),this},E.toBack=function(){if(this.removed)return this;var e=T(this.node),r=e.parentNode;r.insertBefore(e,r.firstChild),t._toback(this,this.paper);var i=this.paper;return this},E.insertAfter=function(e){if(this.removed||!e)return this;var r=T(this.node),i=T(e.node||e[e.length-1].node);return i.nextSibling?i.parentNode.insertBefore(r,i.nextSibling):i.parentNode.appendChild(r),t._insertafter(this,e,this.paper),this},E.insertBefore=function(e){if(this.removed||!e)return this;var r=T(this.node),i=T(e.node||e[0].node);return i.parentNode.insertBefore(r,i),t._insertbefore(this,e,this.paper),this},E.blur=function(e){var r=this;if(0!==+e){var i=x("filter"),n=x("feGaussianBlur");r.attrs.blur=e,i.id=t.createUUID(),x(n,{stdDeviation:+e||1.5}),i.appendChild(n),r.paper.defs.appendChild(i),r._blur=i,x(r.node,{filter:"url(#"+i.id+")"})}else r._blur&&(r._blur.parentNode.removeChild(r._blur),delete r._blur,delete r.attrs.blur),r.node.removeAttribute("filter");return r},t._engine.circle=function(t,e,r,i){var n=x("circle");t.canvas&&t.canvas.appendChild(n);var a=new A(n,t);return a.attrs={cx:e,cy:r,r:i,fill:"none",stroke:"#000"},a.type="circle",x(n,a.attrs),a},t._engine.rect=function(t,e,r,i,n,a){var s=x("rect");t.canvas&&t.canvas.appendChild(s);var o=new A(s,t);return o.attrs={x:e,y:r,width:i,height:n,rx:a||0,ry:a||0,fill:"none",stroke:"#000"},o.type="rect",x(s,o.attrs),o},t._engine.ellipse=function(t,e,r,i,n){var a=x("ellipse");t.canvas&&t.canvas.appendChild(a);var s=new A(a,t);return s.attrs={cx:e,cy:r,rx:i,ry:n,fill:"none",stroke:"#000"},s.type="ellipse",x(a,s.attrs),s},t._engine.image=function(t,e,r,i,n,a){var s=x("image");x(s,{x:r,y:i,width:n,height:a,preserveAspectRatio:"none"}),s.setAttributeNS(p,"href",e),t.canvas&&t.canvas.appendChild(s);var o=new A(s,t);return o.attrs={x:r,y:i,width:n,height:a,src:e},o.type="image",o},t._engine.text=function(e,r,i,n){var a=x("text");e.canvas&&e.canvas.appendChild(a);var s=new A(a,e);return s.attrs={x:r,y:i,"text-anchor":"middle",text:n,"font-family":t._availableAttrs["font-family"],"font-size":t._availableAttrs["font-size"],stroke:"none",fill:"#000"},s.type="text",B(s,s.attrs),s},t._engine.setSize=function(t,e){return this.width=t||this.width,this.height=e||this.height,this.canvas.setAttribute("width",this.width),this.canvas.setAttribute("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox),this},t._engine.create=function(){var e=t._getContainer.apply(0,arguments),r=e&&e.container,i=e.x,n=e.y,a=e.width,s=e.height;if(!r)throw new Error("SVG container not found.");var o=x("svg"),l="overflow:hidden;",h;return i=i||0,n=n||0,a=a||512,s=s||342,x(o,{height:s,version:1.1,width:a,xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink"}),1==r?(o.style.cssText=l+"position:absolute;left:"+i+"px;top:"+n+"px",t._g.doc.body.appendChild(o),h=1):(o.style.cssText=l+"position:relative",r.firstChild?r.insertBefore(o,r.firstChild):r.appendChild(o)),r=new t._Paper,r.width=a,r.height=s,r.canvas=o,r.clear(),r._left=r._top=0,h&&(r.renderfix=function(){}),r.renderfix(),r},t._engine.setViewBox=function(t,e,r,i,n){u("raphael.setViewBox",this,this._viewBox,[t,e,r,i,n]);var a=this.getSize(),o=s(r/a.width,i/a.height),l=this.top,h=n?"xMidYMid meet":"xMinYMin",c,p;for(null==t?(this._vbSize&&(o=1),delete this._vbSize,c="0 0 "+this.width+f+this.height):(this._vbSize=o,c=t+f+e+f+r+f+i),x(this.canvas,{viewBox:c,preserveAspectRatio:h});o&&l;)p="stroke-width"in l.attrs?l.attrs["stroke-width"]:1,l.attr({"stroke-width":p}),l._.dirty=1,l._.dirtyT=1,l=l.prev;return this._viewBox=[t,e,r,i,!!n],this},t.prototype.renderfix=function(){var t=this.canvas,e=t.style,r;try{r=t.getScreenCTM()||t.createSVGMatrix()}catch(i){r=t.createSVGMatrix()}var n=-r.e%1,a=-r.f%1;(n||a)&&(n&&(this._left=(this._left+n)%1,e.left=this._left+"px"),a&&(this._top=(this._top+a)%1,e.top=this._top+"px"))},t.prototype.clear=function(){t.eve("raphael.clear",this);for(var e=this.canvas;e.firstChild;)e.removeChild(e.firstChild);this.bottom=this.top=null,(this.desc=x("desc")).appendChild(t._g.doc.createTextNode("Created with Raphaël "+t.version)),e.appendChild(this.desc),e.appendChild(this.defs=x("defs"))},t.prototype.remove=function(){u("raphael.remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var e in this)this[e]="function"==typeof this[e]?t._removedFactory(e):null};var N=t.st;for(var M in E)E[e](M)&&!N[e](M)&&(N[M]=function(t){return function(){var e=arguments;return this.forEach(function(r){r[t].apply(r,e)})}}(M))}}.apply(e,i),!(void 0!==n&&(t.exports=n))},function(t,e,r){var i,n;i=[r(1)],n=function(t){if(!t||t.vml){var e="hasOwnProperty",r=String,i=parseFloat,n=Math,a=n.round,s=n.max,o=n.min,l=n.abs,h="fill",u=/[, ]+/,c=t.eve,f=" progid:DXImageTransform.Microsoft",p=" ",d="",g={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},x=/([clmz]),?([^clmz]*)/gi,v=/ progid:\S+Blur\([^\)]+\)/g,y=/-?[^,\s-]+/g,m="position:absolute;left:0;top:0;width:1px;height:1px;behavior:url(#default#VML)",b=21600,_={path:1,rect:1,image:1},w={circle:1,ellipse:1},k=function(e){var i=/[ahqstv]/gi,n=t._pathToAbsolute;if(r(e).match(i)&&(n=t._path2curve),i=/[clmz]/g,n==t._pathToAbsolute&&!r(e).match(i)){var s=r(e).replace(x,function(t,e,r){var i=[],n="m"==e.toLowerCase(),s=g[e];return r.replace(y,function(t){n&&2==i.length&&(s+=i+g["m"==e?"l":"L"],i=[]),i.push(a(t*b))}),s+i});return s}var o=n(e),l,h;s=[];for(var u=0,c=o.length;c>u;u++){l=o[u],h=o[u][0].toLowerCase(),"z"==h&&(h="x");for(var f=1,v=l.length;v>f;f++)h+=a(l[f]*b)+(f!=v-1?",":d);s.push(h)}return s.join(p)},B=function(e,r,i){var n=t.matrix();return n.rotate(-e,.5,.5),{dx:n.x(r,i),dy:n.y(r,i)}},C=function(t,e,r,i,n,a){var s=t._,o=t.matrix,u=s.fillpos,c=t.node,f=c.style,d=1,g="",x,v=b/e,y=b/r;if(f.visibility="hidden",e&&r){if(c.coordsize=l(v)+p+l(y),f.rotation=a*(0>e*r?-1:1),a){var m=B(a,i,n);i=m.dx,n=m.dy}if(0>e&&(g+="x"),0>r&&(g+=" y")&&(d=-1),f.flip=g,c.coordorigin=i*-v+p+n*-y,u||s.fillsize){var _=c.getElementsByTagName(h);_=_&&_[0],c.removeChild(_),u&&(m=B(a,o.x(u[0],u[1]),o.y(u[0],u[1])),_.position=m.dx*d+p+m.dy*d),s.fillsize&&(_.size=s.fillsize[0]*l(e)+p+s.fillsize[1]*l(r)),c.appendChild(_)}f.visibility="visible"}};t.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};var S=function(t,e,i){for(var n=r(e).toLowerCase().split("-"),a=i?"end":"start",s=n.length,o="classic",l="medium",h="medium";s--;)switch(n[s]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":o=n[s];break;case"wide":case"narrow":h=n[s];break;case"long":case"short":l=n[s]}var u=t.node.getElementsByTagName("stroke")[0];u[a+"arrow"]=o,u[a+"arrowlength"]=l,u[a+"arrowwidth"]=h},T=function(n,l){n.attrs=n.attrs||{};var c=n.node,f=n.attrs,g=c.style,x,v=_[n.type]&&(l.x!=f.x||l.y!=f.y||l.width!=f.width||l.height!=f.height||l.cx!=f.cx||l.cy!=f.cy||l.rx!=f.rx||l.ry!=f.ry||l.r!=f.r),y=w[n.type]&&(f.cx!=l.cx||f.cy!=l.cy||f.r!=l.r||f.rx!=l.rx||f.ry!=l.ry),m=n;for(var B in l)l[e](B)&&(f[B]=l[B]);if(v&&(f.path=t._getPath[n.type](n),n._.dirty=1),l.href&&(c.href=l.href),l.title&&(c.title=l.title),l.target&&(c.target=l.target),l.cursor&&(g.cursor=l.cursor),"blur"in l&&n.blur(l.blur),(l.path&&"path"==n.type||v)&&(c.path=k(~r(f.path).toLowerCase().indexOf("r")?t._pathToAbsolute(f.path):f.path),n._.dirty=1,"image"==n.type&&(n._.fillpos=[f.x,f.y],n._.fillsize=[f.width,f.height],C(n,1,1,0,0,0))),"transform"in l&&n.transform(l.transform),y){var T=+f.cx,E=+f.cy,N=+f.rx||+f.r||0,L=+f.ry||+f.r||0;c.path=t.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",a((T-N)*b),a((E-L)*b),a((T+N)*b),a((E+L)*b),a(T*b)),n._.dirty=1}if("clip-rect"in l){var z=r(l["clip-rect"]).split(u);if(4==z.length){z[2]=+z[2]+ +z[0],z[3]=+z[3]+ +z[1];var P=c.clipRect||t._g.doc.createElement("div"),F=P.style;F.clip=t.format("rect({1}px {2}px {3}px {0}px)",z),c.clipRect||(F.position="absolute",F.top=0,F.left=0,F.width=n.paper.width+"px",F.height=n.paper.height+"px",c.parentNode.insertBefore(P,c),P.appendChild(c),c.clipRect=P)}l["clip-rect"]||c.clipRect&&(c.clipRect.style.clip="auto")}if(n.textpath){var R=n.textpath.style;l.font&&(R.font=l.font),l["font-family"]&&(R.fontFamily='"'+l["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,d)+'"'),l["font-size"]&&(R.fontSize=l["font-size"]),l["font-weight"]&&(R.fontWeight=l["font-weight"]),l["font-style"]&&(R.fontStyle=l["font-style"])}if("arrow-start"in l&&S(m,l["arrow-start"]),"arrow-end"in l&&S(m,l["arrow-end"],1),null!=l.opacity||null!=l["stroke-width"]||null!=l.fill||null!=l.src||null!=l.stroke||null!=l["stroke-width"]||null!=l["stroke-opacity"]||null!=l["fill-opacity"]||null!=l["stroke-dasharray"]||null!=l["stroke-miterlimit"]||null!=l["stroke-linejoin"]||null!=l["stroke-linecap"]){var I=c.getElementsByTagName(h),j=!1;if(I=I&&I[0],!I&&(j=I=M(h)),"image"==n.type&&l.src&&(I.src=l.src),l.fill&&(I.on=!0),null!=I.on&&"none"!=l.fill&&null!==l.fill||(I.on=!1),I.on&&l.fill){var q=r(l.fill).match(t._ISURL);if(q){I.parentNode==c&&c.removeChild(I),I.rotate=!0,I.src=q[1],I.type="tile";var D=n.getBBox(1);I.position=D.x+p+D.y,n._.fillpos=[D.x,D.y],t._preload(q[1],function(){n._.fillsize=[this.offsetWidth,this.offsetHeight]})}else I.color=t.getRGB(l.fill).hex,I.src=d,I.type="solid",t.getRGB(l.fill).error&&(m.type in{circle:1,ellipse:1}||"r"!=r(l.fill).charAt())&&A(m,l.fill,I)&&(f.fill="none",f.gradient=l.fill,I.rotate=!1)}if("fill-opacity"in l||"opacity"in l){var V=((+f["fill-opacity"]+1||2)-1)*((+f.opacity+1||2)-1)*((+t.getRGB(l.fill).o+1||2)-1);V=o(s(V,0),1),I.opacity=V,I.src&&(I.color="none")}c.appendChild(I);var O=c.getElementsByTagName("stroke")&&c.getElementsByTagName("stroke")[0],Y=!1;!O&&(Y=O=M("stroke")),(l.stroke&&"none"!=l.stroke||l["stroke-width"]||null!=l["stroke-opacity"]||l["stroke-dasharray"]||l["stroke-miterlimit"]||l["stroke-linejoin"]||l["stroke-linecap"])&&(O.on=!0),("none"==l.stroke||null===l.stroke||null==O.on||0==l.stroke||0==l["stroke-width"])&&(O.on=!1);var W=t.getRGB(l.stroke);O.on&&l.stroke&&(O.color=W.hex),V=((+f["stroke-opacity"]+1||2)-1)*((+f.opacity+1||2)-1)*((+W.o+1||2)-1);var G=.75*(i(l["stroke-width"])||1);if(V=o(s(V,0),1),null==l["stroke-width"]&&(G=f["stroke-width"]),l["stroke-width"]&&(O.weight=G),G&&1>G&&(V*=G)&&(O.weight=1),O.opacity=V,l["stroke-linejoin"]&&(O.joinstyle=l["stroke-linejoin"]||"miter"),O.miterlimit=l["stroke-miterlimit"]||8,l["stroke-linecap"]&&(O.endcap="butt"==l["stroke-linecap"]?"flat":"square"==l["stroke-linecap"]?"square":"round"),"stroke-dasharray"in l){var H={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};O.dashstyle=H[e](l["stroke-dasharray"])?H[l["stroke-dasharray"]]:d}Y&&c.appendChild(O)}if("text"==m.type){m.paper.canvas.style.display=d;var X=m.paper.span,U=100,$=f.font&&f.font.match(/\d+(?:\.\d*)?(?=px)/);g=X.style,f.font&&(g.font=f.font),f["font-family"]&&(g.fontFamily=f["font-family"]),f["font-weight"]&&(g.fontWeight=f["font-weight"]),f["font-style"]&&(g.fontStyle=f["font-style"]),$=i(f["font-size"]||$&&$[0])||10,g.fontSize=$*U+"px",m.textpath.string&&(X.innerHTML=r(m.textpath.string).replace(/</g,"<").replace(/&/g,"&").replace(/\n/g,"<br>"));var Z=X.getBoundingClientRect();m.W=f.w=(Z.right-Z.left)/U,m.H=f.h=(Z.bottom-Z.top)/U,m.X=f.x,m.Y=f.y+m.H/2,("x"in l||"y"in l)&&(m.path.v=t.format("m{0},{1}l{2},{1}",a(f.x*b),a(f.y*b),a(f.x*b)+1));for(var Q=["x","y","text","font","font-family","font-weight","font-style","font-size"],J=0,K=Q.length;K>J;J++)if(Q[J]in l){m._.dirty=1;break}switch(f["text-anchor"]){case"start":m.textpath.style["v-text-align"]="left",m.bbx=m.W/2;break;case"end":m.textpath.style["v-text-align"]="right",m.bbx=-m.W/2;break;default:m.textpath.style["v-text-align"]="center",m.bbx=0}m.textpath.style["v-text-kern"]=!0}},A=function(e,a,s){e.attrs=e.attrs||{};var o=e.attrs,l=Math.pow,h,u,c="linear",f=".5 .5";if(e.attrs.gradient=a,a=r(a).replace(t._radial_gradient,function(t,e,r){return c="radial",e&&r&&(e=i(e),r=i(r),l(e-.5,2)+l(r-.5,2)>.25&&(r=n.sqrt(.25-l(e-.5,2))*(2*(r>.5)-1)+.5),f=e+p+r),d}),a=a.split(/\s*\-\s*/),"linear"==c){var g=a.shift();if(g=-i(g),isNaN(g))return null}var x=t._parseDots(a);if(!x)return null;if(e=e.shape||e.node,x.length){e.removeChild(s),s.on=!0,s.method="none",s.color=x[0].color,s.color2=x[x.length-1].color;for(var v=[],y=0,m=x.length;m>y;y++)x[y].offset&&v.push(x[y].offset+p+x[y].color);s.colors=v.length?v.join():"0% "+s.color,"radial"==c?(s.type="gradientTitle",s.focus="100%",s.focussize="0 0",s.focusposition=f,s.angle=0):(s.type="gradient",s.angle=(270-g)%360),e.appendChild(s)}return 1},E=function(e,r){this[0]=this.node=e,e.raphael=!0,this.id=t._oid++,e.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=r,this.matrix=t.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!r.bottom&&(r.bottom=this),this.prev=r.top,r.top&&(r.top.next=this),r.top=this,this.next=null},N=t.el;E.prototype=N,N.constructor=E,N.transform=function(e){if(null==e)return this._.transform;var i=this.paper._viewBoxShift,n=i?"s"+[i.scale,i.scale]+"-1-1t"+[i.dx,i.dy]:d,a;i&&(a=e=r(e).replace(/\.{3}|\u2026/g,this._.transform||d)),t._extractTransform(this,n+e);var s=this.matrix.clone(),o=this.skew,l=this.node,h,u=~r(this.attrs.fill).indexOf("-"),c=!r(this.attrs.fill).indexOf("url(");if(s.translate(1,1),c||u||"image"==this.type)if(o.matrix="1 0 0 1",o.offset="0 0",h=s.split(),u&&h.noRotation||!h.isSimple){l.style.filter=s.toFilter();var f=this.getBBox(),g=this.getBBox(1),x=f.x-g.x,v=f.y-g.y;l.coordorigin=x*-b+p+v*-b,C(this,1,1,x,v,0)}else l.style.filter=d,C(this,h.scalex,h.scaley,h.dx,h.dy,h.rotate);else l.style.filter=d,o.matrix=r(s),o.offset=s.offset();return null!==a&&(this._.transform=a,t._extractTransform(this,a)),this},N.rotate=function(t,e,n){if(this.removed)return this;if(null!=t){if(t=r(t).split(u),t.length-1&&(e=i(t[1]),n=i(t[2])),t=i(t[0]),null==n&&(e=n),null==e||null==n){var a=this.getBBox(1);e=a.x+a.width/2,n=a.y+a.height/2}return this._.dirtyT=1,this.transform(this._.transform.concat([["r",t,e,n]])),this}},N.translate=function(t,e){return this.removed?this:(t=r(t).split(u),t.length-1&&(e=i(t[1])),t=i(t[0])||0,e=+e||0,this._.bbox&&(this._.bbox.x+=t,this._.bbox.y+=e),this.transform(this._.transform.concat([["t",t,e]])),this)},N.scale=function(t,e,n,a){if(this.removed)return this;if(t=r(t).split(u),t.length-1&&(e=i(t[1]),n=i(t[2]),a=i(t[3]),isNaN(n)&&(n=null),isNaN(a)&&(a=null)),t=i(t[0]),null==e&&(e=t),null==a&&(n=a),null==n||null==a)var s=this.getBBox(1);return n=null==n?s.x+s.width/2:n,a=null==a?s.y+s.height/2:a,this.transform(this._.transform.concat([["s",t,e,n,a]])),this._.dirtyT=1,this},N.hide=function(){return!this.removed&&(this.node.style.display="none"),this},N.show=function(){return!this.removed&&(this.node.style.display=d),this},N.auxGetBBox=t.el.getBBox,N.getBBox=function(){var t=this.auxGetBBox();if(this.paper&&this.paper._viewBoxShift){var e={},r=1/this.paper._viewBoxShift.scale;return e.x=t.x-this.paper._viewBoxShift.dx,e.x*=r,e.y=t.y-this.paper._viewBoxShift.dy,e.y*=r,e.width=t.width*r,e.height=t.height*r,e.x2=e.x+e.width,e.y2=e.y+e.height,e}return t},N._getBBox=function(){return this.removed?{}:{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},N.remove=function(){if(!this.removed&&this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),t.eve.unbind("raphael.*.*."+this.id),t._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var e in this)this[e]="function"==typeof this[e]?t._removedFactory(e):null;this.removed=!0}},N.attr=function(r,i){if(this.removed)return this;if(null==r){var n={};for(var a in this.attrs)this.attrs[e](a)&&(n[a]=this.attrs[a]);return n.gradient&&"none"==n.fill&&(n.fill=n.gradient)&&delete n.gradient,n.transform=this._.transform,n}if(null==i&&t.is(r,"string")){if(r==h&&"none"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;for(var s=r.split(u),o={},l=0,f=s.length;f>l;l++)r=s[l],r in this.attrs?o[r]=this.attrs[r]:t.is(this.paper.customAttributes[r],"function")?o[r]=this.paper.customAttributes[r].def:o[r]=t._availableAttrs[r];return f-1?o:o[s[0]]}if(this.attrs&&null==i&&t.is(r,"array")){for(o={},l=0,f=r.length;f>l;l++)o[r[l]]=this.attr(r[l]);return o}var p;null!=i&&(p={},p[r]=i),null==i&&t.is(r,"object")&&(p=r);for(var d in p)c("raphael.attr."+d+"."+this.id,this,p[d]);if(p){for(d in this.paper.customAttributes)if(this.paper.customAttributes[e](d)&&p[e](d)&&t.is(this.paper.customAttributes[d],"function")){var g=this.paper.customAttributes[d].apply(this,[].concat(p[d]));this.attrs[d]=p[d];for(var x in g)g[e](x)&&(p[x]=g[x])}p.text&&"text"==this.type&&(this.textpath.string=p.text),T(this,p)}return this},N.toFront=function(){return!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&t._tofront(this,this.paper),this},N.toBack=function(){return this.removed?this:(this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),t._toback(this,this.paper)),this)},N.insertAfter=function(e){return this.removed?this:(e.constructor==t.st.constructor&&(e=e[e.length-1]),e.node.nextSibling?e.node.parentNode.insertBefore(this.node,e.node.nextSibling):e.node.parentNode.appendChild(this.node),t._insertafter(this,e,this.paper),this)},N.insertBefore=function(e){return this.removed?this:(e.constructor==t.st.constructor&&(e=e[0]),e.node.parentNode.insertBefore(this.node,e.node),t._insertbefore(this,e,this.paper),this)},N.blur=function(e){var r=this.node.runtimeStyle,i=r.filter;return i=i.replace(v,d),0!==+e?(this.attrs.blur=e,r.filter=i+p+f+".Blur(pixelradius="+(+e||1.5)+")",r.margin=t.format("-{0}px 0 0 -{0}px",a(+e||1.5))):(r.filter=i,r.margin=0,delete this.attrs.blur),this},t._engine.path=function(t,e){var r=M("shape");r.style.cssText=m,r.coordsize=b+p+b,r.coordorigin=e.coordorigin;var i=new E(r,e),n={fill:"none",stroke:"#000"};t&&(n.path=t),i.type="path",i.path=[],i.Path=d,T(i,n),e.canvas&&e.canvas.appendChild(r);var a=M("skew");return a.on=!0,r.appendChild(a),i.skew=a,i.transform(d),i},t._engine.rect=function(e,r,i,n,a,s){var o=t._rectPath(r,i,n,a,s),l=e.path(o),h=l.attrs;return l.X=h.x=r,l.Y=h.y=i,l.W=h.width=n,l.H=h.height=a,h.r=s,h.path=o,l.type="rect",l},t._engine.ellipse=function(t,e,r,i,n){var a=t.path(),s=a.attrs;return a.X=e-i,a.Y=r-n,a.W=2*i,a.H=2*n,a.type="ellipse",T(a,{cx:e,cy:r,rx:i,ry:n}),a},t._engine.circle=function(t,e,r,i){var n=t.path(),a=n.attrs;return n.X=e-i,n.Y=r-i,n.W=n.H=2*i,n.type="circle",T(n,{cx:e,cy:r,r:i}),n},t._engine.image=function(e,r,i,n,a,s){var o=t._rectPath(i,n,a,s),l=e.path(o).attr({stroke:"none"}),u=l.attrs,c=l.node,f=c.getElementsByTagName(h)[0];return u.src=r,l.X=u.x=i,l.Y=u.y=n,l.W=u.width=a,l.H=u.height=s,u.path=o,l.type="image",f.parentNode==c&&c.removeChild(f),f.rotate=!0,f.src=r,f.type="tile",l._.fillpos=[i,n],l._.fillsize=[a,s],c.appendChild(f),C(l,1,1,0,0,0),l},t._engine.text=function(e,i,n,s){var o=M("shape"),l=M("path"),h=M("textpath");i=i||0,n=n||0,s=s||"",l.v=t.format("m{0},{1}l{2},{1}",a(i*b),a(n*b),a(i*b)+1),l.textpathok=!0,h.string=r(s),h.on=!0,o.style.cssText=m,o.coordsize=b+p+b,o.coordorigin="0 0";var u=new E(o,e),c={fill:"#000",stroke:"none",font:t._availableAttrs.font,text:s};u.shape=o,u.path=l,u.textpath=h,u.type="text",u.attrs.text=r(s),u.attrs.x=i,u.attrs.y=n,u.attrs.w=1,u.attrs.h=1,T(u,c),o.appendChild(h),o.appendChild(l),e.canvas.appendChild(o);var f=M("skew");return f.on=!0,o.appendChild(f),u.skew=f,u.transform(d),u},t._engine.setSize=function(e,r){var i=this.canvas.style;return this.width=e,this.height=r,e==+e&&(e+="px"),r==+r&&(r+="px"),i.width=e,i.height=r,i.clip="rect(0 "+e+" "+r+" 0)",this._viewBox&&t._engine.setViewBox.apply(this,this._viewBox),this},t._engine.setViewBox=function(e,r,i,n,a){t.eve("raphael.setViewBox",this,this._viewBox,[e,r,i,n,a]);var s=this.getSize(),o=s.width,l=s.height,h,u;return a&&(h=l/n,u=o/i,o>i*h&&(e-=(o-i*h)/2/h),l>n*u&&(r-=(l-n*u)/2/u)),this._viewBox=[e,r,i,n,!!a],this._viewBoxShift={dx:-e,dy:-r,scale:s},this.forEach(function(t){t.transform("...")}),this};var M;t._engine.initWin=function(t){var e=t.document;e.styleSheets.length<31?e.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)"):e.styleSheets[0].addRule(".rvml","behavior:url(#default#VML)");try{!e.namespaces.rvml&&e.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),M=function(t){return e.createElement("<rvml:"+t+' class="rvml">')}}catch(r){M=function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},t._engine.initWin(t._g.win),t._engine.create=function(){var e=t._getContainer.apply(0,arguments),r=e.container,i=e.height,n,a=e.width,s=e.x,o=e.y;if(!r)throw new Error("VML container not found.");var l=new t._Paper,h=l.canvas=t._g.doc.createElement("div"),u=h.style;return s=s||0,o=o||0,a=a||512,i=i||342,l.width=a,l.height=i,a==+a&&(a+="px"),i==+i&&(i+="px"),l.coordsize=1e3*b+p+1e3*b,l.coordorigin="0 0",l.span=t._g.doc.createElement("span"),l.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",h.appendChild(l.span),u.cssText=t.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",a,i),1==r?(t._g.doc.body.appendChild(h),u.left=s+"px",u.top=o+"px",u.position="absolute"):r.firstChild?r.insertBefore(h,r.firstChild):r.appendChild(h),l.renderfix=function(){},l},t.prototype.clear=function(){t.eve("raphael.clear",this),this.canvas.innerHTML=d,this.span=t._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},t.prototype.remove=function(){t.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var e in this)this[e]="function"==typeof this[e]?t._removedFactory(e):null;return!0};var L=t.st;for(var z in N)N[e](z)&&!L[e](z)&&(L[z]=function(t){return function(){var e=arguments;return this.forEach(function(r){r[t].apply(r,e)})}}(z))}}.apply(e,i),!(void 0!==n&&(t.exports=n))}])}); | |
| },{}],9:[function(require,module,exports){ | |
| var Raphael = require('raphael') | |
| function newPaper(diameter) { | |
| var container = document.createElement('div') | |
| container.style.borderRadius = '50px' | |
| container.style.overflow = 'hidden' | |
| container.style.padding = '0px' | |
| container.style.margin = '0px' | |
| container.style.width = '' + diameter + 'px' | |
| container.style.height = '' + diameter + 'px' | |
| container.style.display = 'inline-block' | |
| var paper = Raphael(container, 100, 100); | |
| return { | |
| paper: paper, | |
| container: container, | |
| } | |
| } | |
| module.exports = newPaper | |
| },{"raphael":8}],"jazzicon":[function(require,module,exports){ | |
| var MersenneTwister = require('mersenne-twister'); | |
| var paperGen = require('./paper') | |
| var Color = require('color') | |
| var colors = require('./colors') | |
| var shapeCount = 4 | |
| module.exports = generateIdenticon | |
| var generator | |
| function generateIdenticon(diameter, seed) { | |
| generator = new MersenneTwister(seed); | |
| var elements = paperGen(diameter) | |
| var paper = elements.paper | |
| var container = elements.container | |
| var remainingColors = hueShift(colors.slice(), generator) | |
| var bkgnd = paper.rect(0, 0, diameter, diameter); | |
| bkgnd.attr("fill", genColor(remainingColors)); | |
| bkgnd.attr('stroke', 'none'); | |
| for(var i = 0; i < shapeCount - 1; i++) { | |
| genShape(paper, remainingColors, diameter, i, shapeCount - 1) | |
| } | |
| return container | |
| } | |
| function genShape(paper, remainingColors, diameter, i, total) { | |
| var shape = paper.rect(0, 0, diameter, diameter); | |
| shape.rotate(360 * generator.random()) | |
| var trans = diameter / total * generator.random() + (i * diameter / total) | |
| shape.translate(trans) | |
| shape.rotate(180 * generator.random()) | |
| shape.attr('fill', genColor(remainingColors)); | |
| shape.attr('stroke', 'none'); | |
| } | |
| function genColor(colors) { | |
| var rand = generator.random() | |
| var idx = Math.floor(colors.length * generator.random()) | |
| var color = colors.splice(idx,1)[0] | |
| return color | |
| } | |
| var wobble = 30 | |
| function hueShift(colors, generator) { | |
| var amount = (generator.random() * 30) - (wobble / 2) | |
| return colors.map(function(hex) { | |
| var color = Color(hex) | |
| color.rotate(amount) | |
| return color.hexString() | |
| }) | |
| } | |
| },{"./colors":1,"./paper":9,"color":2,"mersenne-twister":7}]},{},[]) | |
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsImNvbG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb2xvci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb2xvci9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9jb252ZXJzaW9ucy5qcyIsIm5vZGVfbW9kdWxlcy9jb2xvci9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb2xvci9ub2RlX21vZHVsZXMvY29sb3Itc3RyaW5nL2NvbG9yLXN0cmluZy5qcyIsIm5vZGVfbW9kdWxlcy9jb2xvci9ub2RlX21vZHVsZXMvY29sb3Itc3RyaW5nL25vZGVfbW9kdWxlcy9jb2xvci1uYW1lL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL21lcnNlbm5lLXR3aXN0ZXIvc3JjL21lcnNlbm5lLXR3aXN0ZXIuanMiLCJub2RlX21vZHVsZXMvcmFwaGFlbC9yYXBoYWVsLm1pbi5qcyIsInBhcGVyLmpzIiwiaW5kZXguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN01BO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIm1vZHVsZS5leHBvcnRzID0gW1xuXHQnIzAxODg4QycsIC8vIHRlYWxcbiAgJyNGQzc1MDAnLCAvLyBicmlnaHQgb3JhbmdlXG4gICcjMDM0RjVEJywgLy8gZGFyayB0ZWFsXG4gICcjRjczRjAxJywgLy8gb3JhbmdlcmVkXG4gICcjRkMxOTYwJywgLy8gbWFnZW50YVxuICAnI0M3MTQ0QycsIC8vIHJhc3BiZXJyeVxuICAnI0YzQzEwMCcsIC8vIGdvbGRlbnJvZFxuICAnIzE1OThGMicsIC8vIGxpZ2h0bmluZyBibHVlXG4gICcjMjQ2NUUxJywgLy8gc2FpbCBibHVlXG4gICcjRjE5RTAyJywgLy8gZ29sZFxuXVxuIiwiLyogTUlUIGxpY2Vuc2UgKi9cbnZhciBjb252ZXJ0ID0gcmVxdWlyZSgnY29sb3ItY29udmVydCcpO1xudmFyIHN0cmluZyA9IHJlcXVpcmUoJ2NvbG9yLXN0cmluZycpO1xuXG52YXIgQ29sb3IgPSBmdW5jdGlvbiAob2JqKSB7XG5cdGlmIChvYmogaW5zdGFuY2VvZiBDb2xvcikge1xuXHRcdHJldHVybiBvYmo7XG5cdH1cblx0aWYgKCEodGhpcyBpbnN0YW5jZW9mIENvbG9yKSkge1xuXHRcdHJldHVybiBuZXcgQ29sb3Iob2JqKTtcblx0fVxuXG5cdHRoaXMudmFsdWVzID0ge1xuXHRcdHJnYjogWzAsIDAsIDBdLFxuXHRcdGhzbDogWzAsIDAsIDBdLFxuXHRcdGhzdjogWzAsIDAsIDBdLFxuXHRcdGh3YjogWzAsIDAsIDBdLFxuXHRcdGNteWs6IFswLCAwLCAwLCAwXSxcblx0XHRhbHBoYTogMVxuXHR9O1xuXG5cdC8vIHBhcnNlIENvbG9yKCkgYXJndW1lbnRcblx0dmFyIHZhbHM7XG5cdGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuXHRcdHZhbHMgPSBzdHJpbmcuZ2V0UmdiYShvYmopO1xuXHRcdGlmICh2YWxzKSB7XG5cdFx0XHR0aGlzLnNldFZhbHVlcygncmdiJywgdmFscyk7XG5cdFx0fSBlbHNlIGlmICh2YWxzID0gc3RyaW5nLmdldEhzbGEob2JqKSkge1xuXHRcdFx0dGhpcy5zZXRWYWx1ZXMoJ2hzbCcsIHZhbHMpO1xuXHRcdH0gZWxzZSBpZiAodmFscyA9IHN0cmluZy5nZXRId2Iob2JqKSkge1xuXHRcdFx0dGhpcy5zZXRWYWx1ZXMoJ2h3YicsIHZhbHMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBwYXJzZSBjb2xvciBmcm9tIHN0cmluZyBcIicgKyBvYmogKyAnXCInKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcblx0XHR2YWxzID0gb2JqO1xuXHRcdGlmICh2YWxzLnIgIT09IHVuZGVmaW5lZCB8fCB2YWxzLnJlZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLnNldFZhbHVlcygncmdiJywgdmFscyk7XG5cdFx0fSBlbHNlIGlmICh2YWxzLmwgIT09IHVuZGVmaW5lZCB8fCB2YWxzLmxpZ2h0bmVzcyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLnNldFZhbHVlcygnaHNsJywgdmFscyk7XG5cdFx0fSBlbHNlIGlmICh2YWxzLnYgIT09IHVuZGVmaW5lZCB8fCB2YWxzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuc2V0VmFsdWVzKCdoc3YnLCB2YWxzKTtcblx0XHR9IGVsc2UgaWYgKHZhbHMudyAhPT0gdW5kZWZpbmVkIHx8IHZhbHMud2hpdGVuZXNzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuc2V0VmFsdWVzKCdod2InLCB2YWxzKTtcblx0XHR9IGVsc2UgaWYgKHZhbHMuYyAhPT0gdW5kZWZpbmVkIHx8IHZhbHMuY3lhbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLnNldFZhbHVlcygnY215aycsIHZhbHMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBwYXJzZSBjb2xvciBmcm9tIG9iamVjdCAnICsgSlNPTi5zdHJpbmdpZnkob2JqKSk7XG5cdFx0fVxuXHR9XG59O1xuXG5Db2xvci5wcm90b3R5cGUgPSB7XG5cdHJnYjogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnNldFNwYWNlKCdyZ2InLCBhcmd1bWVudHMpO1xuXHR9LFxuXHRoc2w6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRTcGFjZSgnaHNsJywgYXJndW1lbnRzKTtcblx0fSxcblx0aHN2OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0U3BhY2UoJ2hzdicsIGFyZ3VtZW50cyk7XG5cdH0sXG5cdGh3YjogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnNldFNwYWNlKCdod2InLCBhcmd1bWVudHMpO1xuXHR9LFxuXHRjbXlrOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0U3BhY2UoJ2NteWsnLCBhcmd1bWVudHMpO1xuXHR9LFxuXG5cdHJnYkFycmF5OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMudmFsdWVzLnJnYjtcblx0fSxcblx0aHNsQXJyYXk6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy52YWx1ZXMuaHNsO1xuXHR9LFxuXHRoc3ZBcnJheTogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnZhbHVlcy5oc3Y7XG5cdH0sXG5cdGh3YkFycmF5OiBmdW5jdGlvbiAoKSB7XG5cdFx0aWYgKHRoaXMudmFsdWVzLmFscGhhICE9PSAxKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy52YWx1ZXMuaHdiLmNvbmNhdChbdGhpcy52YWx1ZXMuYWxwaGFdKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMudmFsdWVzLmh3Yjtcblx0fSxcblx0Y215a0FycmF5OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMudmFsdWVzLmNteWs7XG5cdH0sXG5cdHJnYmFBcnJheTogZnVuY3Rpb24gKCkge1xuXHRcdHZhciByZ2IgPSB0aGlzLnZhbHVlcy5yZ2I7XG5cdFx0cmV0dXJuIHJnYi5jb25jYXQoW3RoaXMudmFsdWVzLmFscGhhXSk7XG5cdH0sXG5cdGhzbGFBcnJheTogZnVuY3Rpb24gKCkge1xuXHRcdHZhciBoc2wgPSB0aGlzLnZhbHVlcy5oc2w7XG5cdFx0cmV0dXJuIGhzbC5jb25jYXQoW3RoaXMudmFsdWVzLmFscGhhXSk7XG5cdH0sXG5cdGFscGhhOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0aWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy52YWx1ZXMuYWxwaGE7XG5cdFx0fVxuXHRcdHRoaXMuc2V0VmFsdWVzKCdhbHBoYScsIHZhbCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cmVkOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgncmdiJywgMCwgdmFsKTtcblx0fSxcblx0Z3JlZW46IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdyZ2InLCAxLCB2YWwpO1xuXHR9LFxuXHRibHVlOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgncmdiJywgMiwgdmFsKTtcblx0fSxcblx0aHVlOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0aWYgKHZhbCkge1xuXHRcdFx0dmFsICU9IDM2MDtcblx0XHRcdHZhbCA9IHZhbCA8IDAgPyAzNjAgKyB2YWwgOiB2YWw7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ2hzbCcsIDAsIHZhbCk7XG5cdH0sXG5cdHNhdHVyYXRpb246IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdoc2wnLCAxLCB2YWwpO1xuXHR9LFxuXHRsaWdodG5lc3M6IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdoc2wnLCAyLCB2YWwpO1xuXHR9LFxuXHRzYXR1cmF0aW9udjogZnVuY3Rpb24gKHZhbCkge1xuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ2hzdicsIDEsIHZhbCk7XG5cdH0sXG5cdHdoaXRlbmVzczogZnVuY3Rpb24gKHZhbCkge1xuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ2h3YicsIDEsIHZhbCk7XG5cdH0sXG5cdGJsYWNrbmVzczogZnVuY3Rpb24gKHZhbCkge1xuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ2h3YicsIDIsIHZhbCk7XG5cdH0sXG5cdHZhbHVlOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgnaHN2JywgMiwgdmFsKTtcblx0fSxcblx0Y3lhbjogZnVuY3Rpb24gKHZhbCkge1xuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ2NteWsnLCAwLCB2YWwpO1xuXHR9LFxuXHRtYWdlbnRhOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgnY215aycsIDEsIHZhbCk7XG5cdH0sXG5cdHllbGxvdzogZnVuY3Rpb24gKHZhbCkge1xuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ2NteWsnLCAyLCB2YWwpO1xuXHR9LFxuXHRibGFjazogZnVuY3Rpb24gKHZhbCkge1xuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ2NteWsnLCAzLCB2YWwpO1xuXHR9LFxuXG5cdGhleFN0cmluZzogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBzdHJpbmcuaGV4U3RyaW5nKHRoaXMudmFsdWVzLnJnYik7XG5cdH0sXG5cdHJnYlN0cmluZzogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBzdHJpbmcucmdiU3RyaW5nKHRoaXMudmFsdWVzLnJnYiwgdGhpcy52YWx1ZXMuYWxwaGEpO1xuXHR9LFxuXHRyZ2JhU3RyaW5nOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHN0cmluZy5yZ2JhU3RyaW5nKHRoaXMudmFsdWVzLnJnYiwgdGhpcy52YWx1ZXMuYWxwaGEpO1xuXHR9LFxuXHRwZXJjZW50U3RyaW5nOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHN0cmluZy5wZXJjZW50U3RyaW5nKHRoaXMudmFsdWVzLnJnYiwgdGhpcy52YWx1ZXMuYWxwaGEpO1xuXHR9LFxuXHRoc2xTdHJpbmc6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gc3RyaW5nLmhzbFN0cmluZyh0aGlzLnZhbHVlcy5oc2wsIHRoaXMudmFsdWVzLmFscGhhKTtcblx0fSxcblx0aHNsYVN0cmluZzogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBzdHJpbmcuaHNsYVN0cmluZyh0aGlzLnZhbHVlcy5oc2wsIHRoaXMudmFsdWVzLmFscGhhKTtcblx0fSxcblx0aHdiU3RyaW5nOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHN0cmluZy5od2JTdHJpbmcodGhpcy52YWx1ZXMuaHdiLCB0aGlzLnZhbHVlcy5hbHBoYSk7XG5cdH0sXG5cdGtleXdvcmQ6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gc3RyaW5nLmtleXdvcmQodGhpcy52YWx1ZXMucmdiLCB0aGlzLnZhbHVlcy5hbHBoYSk7XG5cdH0sXG5cblx0cmdiTnVtYmVyOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuICh0aGlzLnZhbHVlcy5yZ2JbMF0gPDwgMTYpIHwgKHRoaXMudmFsdWVzLnJnYlsxXSA8PCA4KSB8IHRoaXMudmFsdWVzLnJnYlsyXTtcblx0fSxcblxuXHRsdW1pbm9zaXR5OiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuXHRcdHZhciByZ2IgPSB0aGlzLnZhbHVlcy5yZ2I7XG5cdFx0dmFyIGx1bSA9IFtdO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgcmdiLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgY2hhbiA9IHJnYltpXSAvIDI1NTtcblx0XHRcdGx1bVtpXSA9IChjaGFuIDw9IDAuMDM5MjgpID8gY2hhbiAvIDEyLjkyIDogTWF0aC5wb3coKChjaGFuICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpO1xuXHRcdH1cblx0XHRyZXR1cm4gMC4yMTI2ICogbHVtWzBdICsgMC43MTUyICogbHVtWzFdICsgMC4wNzIyICogbHVtWzJdO1xuXHR9LFxuXG5cdGNvbnRyYXN0OiBmdW5jdGlvbiAoY29sb3IyKSB7XG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNjb250cmFzdC1yYXRpb2RlZlxuXHRcdHZhciBsdW0xID0gdGhpcy5sdW1pbm9zaXR5KCk7XG5cdFx0dmFyIGx1bTIgPSBjb2xvcjIubHVtaW5vc2l0eSgpO1xuXHRcdGlmIChsdW0xID4gbHVtMikge1xuXHRcdFx0cmV0dXJuIChsdW0xICsgMC4wNSkgLyAobHVtMiArIDAuMDUpO1xuXHRcdH1cblx0XHRyZXR1cm4gKGx1bTIgKyAwLjA1KSAvIChsdW0xICsgMC4wNSk7XG5cdH0sXG5cblx0bGV2ZWw6IGZ1bmN0aW9uIChjb2xvcjIpIHtcblx0XHR2YXIgY29udHJhc3RSYXRpbyA9IHRoaXMuY29udHJhc3QoY29sb3IyKTtcblx0XHRpZiAoY29udHJhc3RSYXRpbyA+PSA3LjEpIHtcblx0XHRcdHJldHVybiAnQUFBJztcblx0XHR9XG5cblx0XHRyZXR1cm4gKGNvbnRyYXN0UmF0aW8gPj0gNC41KSA/ICdBQScgOiAnJztcblx0fSxcblxuXHRkYXJrOiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gWUlRIGVxdWF0aW9uIGZyb20gaHR0cDovLzI0d2F5cy5vcmcvMjAxMC9jYWxjdWxhdGluZy1jb2xvci1jb250cmFzdFxuXHRcdHZhciByZ2IgPSB0aGlzLnZhbHVlcy5yZ2I7XG5cdFx0dmFyIHlpcSA9IChyZ2JbMF0gKiAyOTkgKyByZ2JbMV0gKiA1ODcgKyByZ2JbMl0gKiAxMTQpIC8gMTAwMDtcblx0XHRyZXR1cm4geWlxIDwgMTI4O1xuXHR9LFxuXG5cdGxpZ2h0OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuICF0aGlzLmRhcmsoKTtcblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmdiID0gW107XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdHJnYltpXSA9IDI1NSAtIHRoaXMudmFsdWVzLnJnYltpXTtcblx0XHR9XG5cdFx0dGhpcy5zZXRWYWx1ZXMoJ3JnYicsIHJnYik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0bGlnaHRlbjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dGhpcy52YWx1ZXMuaHNsWzJdICs9IHRoaXMudmFsdWVzLmhzbFsyXSAqIHJhdGlvO1xuXHRcdHRoaXMuc2V0VmFsdWVzKCdoc2wnLCB0aGlzLnZhbHVlcy5oc2wpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGRhcmtlbjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dGhpcy52YWx1ZXMuaHNsWzJdIC09IHRoaXMudmFsdWVzLmhzbFsyXSAqIHJhdGlvO1xuXHRcdHRoaXMuc2V0VmFsdWVzKCdoc2wnLCB0aGlzLnZhbHVlcy5oc2wpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHNhdHVyYXRlOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR0aGlzLnZhbHVlcy5oc2xbMV0gKz0gdGhpcy52YWx1ZXMuaHNsWzFdICogcmF0aW87XG5cdFx0dGhpcy5zZXRWYWx1ZXMoJ2hzbCcsIHRoaXMudmFsdWVzLmhzbCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0ZGVzYXR1cmF0ZTogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dGhpcy52YWx1ZXMuaHNsWzFdIC09IHRoaXMudmFsdWVzLmhzbFsxXSAqIHJhdGlvO1xuXHRcdHRoaXMuc2V0VmFsdWVzKCdoc2wnLCB0aGlzLnZhbHVlcy5oc2wpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHdoaXRlbjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dGhpcy52YWx1ZXMuaHdiWzFdICs9IHRoaXMudmFsdWVzLmh3YlsxXSAqIHJhdGlvO1xuXHRcdHRoaXMuc2V0VmFsdWVzKCdod2InLCB0aGlzLnZhbHVlcy5od2IpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGJsYWNrZW46IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHRoaXMudmFsdWVzLmh3YlsyXSArPSB0aGlzLnZhbHVlcy5od2JbMl0gKiByYXRpbztcblx0XHR0aGlzLnNldFZhbHVlcygnaHdiJywgdGhpcy52YWx1ZXMuaHdiKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRncmV5c2NhbGU6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmdiID0gdGhpcy52YWx1ZXMucmdiO1xuXHRcdC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR3JheXNjYWxlI0NvbnZlcnRpbmdfY29sb3JfdG9fZ3JheXNjYWxlXG5cdFx0dmFyIHZhbCA9IHJnYlswXSAqIDAuMyArIHJnYlsxXSAqIDAuNTkgKyByZ2JbMl0gKiAwLjExO1xuXHRcdHRoaXMuc2V0VmFsdWVzKCdyZ2InLCBbdmFsLCB2YWwsIHZhbF0pO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGNsZWFyZXI6IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHRoaXMuc2V0VmFsdWVzKCdhbHBoYScsIHRoaXMudmFsdWVzLmFscGhhIC0gKHRoaXMudmFsdWVzLmFscGhhICogcmF0aW8pKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRvcGFxdWVyOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR0aGlzLnNldFZhbHVlcygnYWxwaGEnLCB0aGlzLnZhbHVlcy5hbHBoYSArICh0aGlzLnZhbHVlcy5hbHBoYSAqIHJhdGlvKSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cm90YXRlOiBmdW5jdGlvbiAoZGVncmVlcykge1xuXHRcdHZhciBodWUgPSB0aGlzLnZhbHVlcy5oc2xbMF07XG5cdFx0aHVlID0gKGh1ZSArIGRlZ3JlZXMpICUgMzYwO1xuXHRcdGh1ZSA9IGh1ZSA8IDAgPyAzNjAgKyBodWUgOiBodWU7XG5cdFx0dGhpcy52YWx1ZXMuaHNsWzBdID0gaHVlO1xuXHRcdHRoaXMuc2V0VmFsdWVzKCdoc2wnLCB0aGlzLnZhbHVlcy5oc2wpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBQb3J0ZWQgZnJvbSBzYXNzIGltcGxlbWVudGF0aW9uIGluIENcblx0ICogaHR0cHM6Ly9naXRodWIuY29tL3Nhc3MvbGlic2Fzcy9ibG9iLzBlNmI0YTI4NTAwOTIzNTZhYTNlY2UwN2M2YjI0OWYwMjIxY2FjZWQvZnVuY3Rpb25zLmNwcCNMMjA5XG5cdCAqL1xuXHRtaXg6IGZ1bmN0aW9uIChtaXhpbkNvbG9yLCB3ZWlnaHQpIHtcblx0XHR2YXIgY29sb3IxID0gdGhpcztcblx0XHR2YXIgY29sb3IyID0gbWl4aW5Db2xvcjtcblx0XHR2YXIgcCA9IHdlaWdodCA9PT0gdW5kZWZpbmVkID8gMC41IDogd2VpZ2h0O1xuXG5cdFx0dmFyIHcgPSAyICogcCAtIDE7XG5cdFx0dmFyIGEgPSBjb2xvcjEuYWxwaGEoKSAtIGNvbG9yMi5hbHBoYSgpO1xuXG5cdFx0dmFyIHcxID0gKCgodyAqIGEgPT09IC0xKSA/IHcgOiAodyArIGEpIC8gKDEgKyB3ICogYSkpICsgMSkgLyAyLjA7XG5cdFx0dmFyIHcyID0gMSAtIHcxO1xuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5yZ2IoXG5cdFx0XHRcdHcxICogY29sb3IxLnJlZCgpICsgdzIgKiBjb2xvcjIucmVkKCksXG5cdFx0XHRcdHcxICogY29sb3IxLmdyZWVuKCkgKyB3MiAqIGNvbG9yMi5ncmVlbigpLFxuXHRcdFx0XHR3MSAqIGNvbG9yMS5ibHVlKCkgKyB3MiAqIGNvbG9yMi5ibHVlKClcblx0XHRcdClcblx0XHRcdC5hbHBoYShjb2xvcjEuYWxwaGEoKSAqIHAgKyBjb2xvcjIuYWxwaGEoKSAqICgxIC0gcCkpO1xuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnJnYigpO1xuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIG5ldyBDb2xvcih0aGlzLnJnYigpKTtcblx0fVxufTtcblxuQ29sb3IucHJvdG90eXBlLmdldFZhbHVlcyA9IGZ1bmN0aW9uIChzcGFjZSkge1xuXHR2YXIgdmFscyA9IHt9O1xuXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgc3BhY2UubGVuZ3RoOyBpKyspIHtcblx0XHR2YWxzW3NwYWNlLmNoYXJBdChpKV0gPSB0aGlzLnZhbHVlc1tzcGFjZV1baV07XG5cdH1cblxuXHRpZiAodGhpcy52YWx1ZXMuYWxwaGEgIT09IDEpIHtcblx0XHR2YWxzLmEgPSB0aGlzLnZhbHVlcy5hbHBoYTtcblx0fVxuXG5cdC8vIHtyOiAyNTUsIGc6IDI1NSwgYjogMjU1LCBhOiAwLjR9XG5cdHJldHVybiB2YWxzO1xufTtcblxuQ29sb3IucHJvdG90eXBlLnNldFZhbHVlcyA9IGZ1bmN0aW9uIChzcGFjZSwgdmFscykge1xuXHR2YXIgc3BhY2VzID0ge1xuXHRcdHJnYjogWydyZWQnLCAnZ3JlZW4nLCAnYmx1ZSddLFxuXHRcdGhzbDogWydodWUnLCAnc2F0dXJhdGlvbicsICdsaWdodG5lc3MnXSxcblx0XHRoc3Y6IFsnaHVlJywgJ3NhdHVyYXRpb24nLCAndmFsdWUnXSxcblx0XHRod2I6IFsnaHVlJywgJ3doaXRlbmVzcycsICdibGFja25lc3MnXSxcblx0XHRjbXlrOiBbJ2N5YW4nLCAnbWFnZW50YScsICd5ZWxsb3cnLCAnYmxhY2snXVxuXHR9O1xuXG5cdHZhciBtYXhlcyA9IHtcblx0XHRyZ2I6IFsyNTUsIDI1NSwgMjU1XSxcblx0XHRoc2w6IFszNjAsIDEwMCwgMTAwXSxcblx0XHRoc3Y6IFszNjAsIDEwMCwgMTAwXSxcblx0XHRod2I6IFszNjAsIDEwMCwgMTAwXSxcblx0XHRjbXlrOiBbMTAwLCAxMDAsIDEwMCwgMTAwXVxuXHR9O1xuXG5cdHZhciBpO1xuXHR2YXIgYWxwaGEgPSAxO1xuXHRpZiAoc3BhY2UgPT09ICdhbHBoYScpIHtcblx0XHRhbHBoYSA9IHZhbHM7XG5cdH0gZWxzZSBpZiAodmFscy5sZW5ndGgpIHtcblx0XHQvLyBbMTAsIDEwLCAxMF1cblx0XHR0aGlzLnZhbHVlc1tzcGFjZV0gPSB2YWxzLnNsaWNlKDAsIHNwYWNlLmxlbmd0aCk7XG5cdFx0YWxwaGEgPSB2YWxzW3NwYWNlLmxlbmd0aF07XG5cdH0gZWxzZSBpZiAodmFsc1tzcGFjZS5jaGFyQXQoMCldICE9PSB1bmRlZmluZWQpIHtcblx0XHQvLyB7cjogMTAsIGc6IDEwLCBiOiAxMH1cblx0XHRmb3IgKGkgPSAwOyBpIDwgc3BhY2UubGVuZ3RoOyBpKyspIHtcblx0XHRcdHRoaXMudmFsdWVzW3NwYWNlXVtpXSA9IHZhbHNbc3BhY2UuY2hhckF0KGkpXTtcblx0XHR9XG5cblx0XHRhbHBoYSA9IHZhbHMuYTtcblx0fSBlbHNlIGlmICh2YWxzW3NwYWNlc1tzcGFjZV1bMF1dICE9PSB1bmRlZmluZWQpIHtcblx0XHQvLyB7cmVkOiAxMCwgZ3JlZW46IDEwLCBibHVlOiAxMH1cblx0XHR2YXIgY2hhbnMgPSBzcGFjZXNbc3BhY2VdO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IHNwYWNlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR0aGlzLnZhbHVlc1tzcGFjZV1baV0gPSB2YWxzW2NoYW5zW2ldXTtcblx0XHR9XG5cblx0XHRhbHBoYSA9IHZhbHMuYWxwaGE7XG5cdH1cblxuXHR0aGlzLnZhbHVlcy5hbHBoYSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIChhbHBoYSA9PT0gdW5kZWZpbmVkID8gdGhpcy52YWx1ZXMuYWxwaGEgOiBhbHBoYSkpKTtcblxuXHRpZiAoc3BhY2UgPT09ICdhbHBoYScpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHR2YXIgY2FwcGVkO1xuXG5cdC8vIGNhcCB2YWx1ZXMgb2YgdGhlIHNwYWNlIHByaW9yIGNvbnZlcnRpbmcgYWxsIHZhbHVlc1xuXHRmb3IgKGkgPSAwOyBpIDwgc3BhY2UubGVuZ3RoOyBpKyspIHtcblx0XHRjYXBwZWQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihtYXhlc1tzcGFjZV1baV0sIHRoaXMudmFsdWVzW3NwYWNlXVtpXSkpO1xuXHRcdHRoaXMudmFsdWVzW3NwYWNlXVtpXSA9IE1hdGgucm91bmQoY2FwcGVkKTtcblx0fVxuXG5cdC8vIGNvbnZlcnQgdG8gYWxsIHRoZSBvdGhlciBjb2xvciBzcGFjZXNcblx0Zm9yICh2YXIgc25hbWUgaW4gc3BhY2VzKSB7XG5cdFx0aWYgKHNuYW1lICE9PSBzcGFjZSkge1xuXHRcdFx0dGhpcy52YWx1ZXNbc25hbWVdID0gY29udmVydFtzcGFjZV1bc25hbWVdKHRoaXMudmFsdWVzW3NwYWNlXSk7XG5cdFx0fVxuXG5cdFx0Ly8gY2FwIHZhbHVlc1xuXHRcdGZvciAoaSA9IDA7IGkgPCBzbmFtZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y2FwcGVkID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obWF4ZXNbc25hbWVdW2ldLCB0aGlzLnZhbHVlc1tzbmFtZV1baV0pKTtcblx0XHRcdHRoaXMudmFsdWVzW3NuYW1lXVtpXSA9IE1hdGgucm91bmQoY2FwcGVkKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcbn07XG5cbkNvbG9yLnByb3RvdHlwZS5zZXRTcGFjZSA9IGZ1bmN0aW9uIChzcGFjZSwgYXJncykge1xuXHR2YXIgdmFscyA9IGFyZ3NbMF07XG5cblx0aWYgKHZhbHMgPT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIGNvbG9yLnJnYigpXG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmFsdWVzKHNwYWNlKTtcblx0fVxuXG5cdC8vIGNvbG9yLnJnYigxMCwgMTAsIDEwKVxuXHRpZiAodHlwZW9mIHZhbHMgPT09ICdudW1iZXInKSB7XG5cdFx0dmFscyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3MpO1xuXHR9XG5cblx0dGhpcy5zZXRWYWx1ZXMoc3BhY2UsIHZhbHMpO1xuXHRyZXR1cm4gdGhpcztcbn07XG5cbkNvbG9yLnByb3RvdHlwZS5zZXRDaGFubmVsID0gZnVuY3Rpb24gKHNwYWNlLCBpbmRleCwgdmFsKSB7XG5cdGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIGNvbG9yLnJlZCgpXG5cdFx0cmV0dXJuIHRoaXMudmFsdWVzW3NwYWNlXVtpbmRleF07XG5cdH0gZWxzZSBpZiAodmFsID09PSB0aGlzLnZhbHVlc1tzcGFjZV1baW5kZXhdKSB7XG5cdFx0Ly8gY29sb3IucmVkKGNvbG9yLnJlZCgpKVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0Ly8gY29sb3IucmVkKDEwMClcblx0dGhpcy52YWx1ZXNbc3BhY2VdW2luZGV4XSA9IHZhbDtcblx0dGhpcy5zZXRWYWx1ZXMoc3BhY2UsIHRoaXMudmFsdWVzW3NwYWNlXSk7XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENvbG9yO1xuIiwiLyogTUlUIGxpY2Vuc2UgKi9cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHJnYjJoc2w6IHJnYjJoc2wsXG4gIHJnYjJoc3Y6IHJnYjJoc3YsXG4gIHJnYjJod2I6IHJnYjJod2IsXG4gIHJnYjJjbXlrOiByZ2IyY215ayxcbiAgcmdiMmtleXdvcmQ6IHJnYjJrZXl3b3JkLFxuICByZ2IyeHl6OiByZ2IyeHl6LFxuICByZ2IybGFiOiByZ2IybGFiLFxuICByZ2IybGNoOiByZ2IybGNoLFxuXG4gIGhzbDJyZ2I6IGhzbDJyZ2IsXG4gIGhzbDJoc3Y6IGhzbDJoc3YsXG4gIGhzbDJod2I6IGhzbDJod2IsXG4gIGhzbDJjbXlrOiBoc2wyY215ayxcbiAgaHNsMmtleXdvcmQ6IGhzbDJrZXl3b3JkLFxuXG4gIGhzdjJyZ2I6IGhzdjJyZ2IsXG4gIGhzdjJoc2w6IGhzdjJoc2wsXG4gIGhzdjJod2I6IGhzdjJod2IsXG4gIGhzdjJjbXlrOiBoc3YyY215ayxcbiAgaHN2MmtleXdvcmQ6IGhzdjJrZXl3b3JkLFxuXG4gIGh3YjJyZ2I6IGh3YjJyZ2IsXG4gIGh3YjJoc2w6IGh3YjJoc2wsXG4gIGh3YjJoc3Y6IGh3YjJoc3YsXG4gIGh3YjJjbXlrOiBod2IyY215ayxcbiAgaHdiMmtleXdvcmQ6IGh3YjJrZXl3b3JkLFxuXG4gIGNteWsycmdiOiBjbXlrMnJnYixcbiAgY215azJoc2w6IGNteWsyaHNsLFxuICBjbXlrMmhzdjogY215azJoc3YsXG4gIGNteWsyaHdiOiBjbXlrMmh3YixcbiAgY215azJrZXl3b3JkOiBjbXlrMmtleXdvcmQsXG5cbiAga2V5d29yZDJyZ2I6IGtleXdvcmQycmdiLFxuICBrZXl3b3JkMmhzbDoga2V5d29yZDJoc2wsXG4gIGtleXdvcmQyaHN2OiBrZXl3b3JkMmhzdixcbiAga2V5d29yZDJod2I6IGtleXdvcmQyaHdiLFxuICBrZXl3b3JkMmNteWs6IGtleXdvcmQyY215ayxcbiAga2V5d29yZDJsYWI6IGtleXdvcmQybGFiLFxuICBrZXl3b3JkMnh5ejoga2V5d29yZDJ4eXosXG5cbiAgeHl6MnJnYjogeHl6MnJnYixcbiAgeHl6MmxhYjogeHl6MmxhYixcbiAgeHl6MmxjaDogeHl6MmxjaCxcblxuICBsYWIyeHl6OiBsYWIyeHl6LFxuICBsYWIycmdiOiBsYWIycmdiLFxuICBsYWIybGNoOiBsYWIybGNoLFxuXG4gIGxjaDJsYWI6IGxjaDJsYWIsXG4gIGxjaDJ4eXo6IGxjaDJ4eXosXG4gIGxjaDJyZ2I6IGxjaDJyZ2Jcbn1cblxuXG5mdW5jdGlvbiByZ2IyaHNsKHJnYikge1xuICB2YXIgciA9IHJnYlswXS8yNTUsXG4gICAgICBnID0gcmdiWzFdLzI1NSxcbiAgICAgIGIgPSByZ2JbMl0vMjU1LFxuICAgICAgbWluID0gTWF0aC5taW4ociwgZywgYiksXG4gICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSxcbiAgICAgIGRlbHRhID0gbWF4IC0gbWluLFxuICAgICAgaCwgcywgbDtcblxuICBpZiAobWF4ID09IG1pbilcbiAgICBoID0gMDtcbiAgZWxzZSBpZiAociA9PSBtYXgpXG4gICAgaCA9IChnIC0gYikgLyBkZWx0YTtcbiAgZWxzZSBpZiAoZyA9PSBtYXgpXG4gICAgaCA9IDIgKyAoYiAtIHIpIC8gZGVsdGE7XG4gIGVsc2UgaWYgKGIgPT0gbWF4KVxuICAgIGggPSA0ICsgKHIgLSBnKS8gZGVsdGE7XG5cbiAgaCA9IE1hdGgubWluKGggKiA2MCwgMzYwKTtcblxuICBpZiAoaCA8IDApXG4gICAgaCArPSAzNjA7XG5cbiAgbCA9IChtaW4gKyBtYXgpIC8gMjtcblxuICBpZiAobWF4ID09IG1pbilcbiAgICBzID0gMDtcbiAgZWxzZSBpZiAobCA8PSAwLjUpXG4gICAgcyA9IGRlbHRhIC8gKG1heCArIG1pbik7XG4gIGVsc2VcbiAgICBzID0gZGVsdGEgLyAoMiAtIG1heCAtIG1pbik7XG5cbiAgcmV0dXJuIFtoLCBzICogMTAwLCBsICogMTAwXTtcbn1cblxuZnVuY3Rpb24gcmdiMmhzdihyZ2IpIHtcbiAgdmFyIHIgPSByZ2JbMF0sXG4gICAgICBnID0gcmdiWzFdLFxuICAgICAgYiA9IHJnYlsyXSxcbiAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLFxuICAgICAgbWF4ID0gTWF0aC5tYXgociwgZywgYiksXG4gICAgICBkZWx0YSA9IG1heCAtIG1pbixcbiAgICAgIGgsIHMsIHY7XG5cbiAgaWYgKG1heCA9PSAwKVxuICAgIHMgPSAwO1xuICBlbHNlXG4gICAgcyA9IChkZWx0YS9tYXggKiAxMDAwKS8xMDtcblxuICBpZiAobWF4ID09IG1pbilcbiAgICBoID0gMDtcbiAgZWxzZSBpZiAociA9PSBtYXgpXG4gICAgaCA9IChnIC0gYikgLyBkZWx0YTtcbiAgZWxzZSBpZiAoZyA9PSBtYXgpXG4gICAgaCA9IDIgKyAoYiAtIHIpIC8gZGVsdGE7XG4gIGVsc2UgaWYgKGIgPT0gbWF4KVxuICAgIGggPSA0ICsgKHIgLSBnKSAvIGRlbHRhO1xuXG4gIGggPSBNYXRoLm1pbihoICogNjAsIDM2MCk7XG5cbiAgaWYgKGggPCAwKVxuICAgIGggKz0gMzYwO1xuXG4gIHYgPSAoKG1heCAvIDI1NSkgKiAxMDAwKSAvIDEwO1xuXG4gIHJldHVybiBbaCwgcywgdl07XG59XG5cbmZ1bmN0aW9uIHJnYjJod2IocmdiKSB7XG4gIHZhciByID0gcmdiWzBdLFxuICAgICAgZyA9IHJnYlsxXSxcbiAgICAgIGIgPSByZ2JbMl0sXG4gICAgICBoID0gcmdiMmhzbChyZ2IpWzBdLFxuICAgICAgdyA9IDEvMjU1ICogTWF0aC5taW4ociwgTWF0aC5taW4oZywgYikpLFxuICAgICAgYiA9IDEgLSAxLzI1NSAqIE1hdGgubWF4KHIsIE1hdGgubWF4KGcsIGIpKTtcblxuICByZXR1cm4gW2gsIHcgKiAxMDAsIGIgKiAxMDBdO1xufVxuXG5mdW5jdGlvbiByZ2IyY215ayhyZ2IpIHtcbiAgdmFyIHIgPSByZ2JbMF0gLyAyNTUsXG4gICAgICBnID0gcmdiWzFdIC8gMjU1LFxuICAgICAgYiA9IHJnYlsyXSAvIDI1NSxcbiAgICAgIGMsIG0sIHksIGs7XG5cbiAgayA9IE1hdGgubWluKDEgLSByLCAxIC0gZywgMSAtIGIpO1xuICBjID0gKDEgLSByIC0gaykgLyAoMSAtIGspIHx8IDA7XG4gIG0gPSAoMSAtIGcgLSBrKSAvICgxIC0gaykgfHwgMDtcbiAgeSA9ICgxIC0gYiAtIGspIC8gKDEgLSBrKSB8fCAwO1xuICByZXR1cm4gW2MgKiAxMDAsIG0gKiAxMDAsIHkgKiAxMDAsIGsgKiAxMDBdO1xufVxuXG5mdW5jdGlvbiByZ2Iya2V5d29yZChyZ2IpIHtcbiAgcmV0dXJuIHJldmVyc2VLZXl3b3Jkc1tKU09OLnN0cmluZ2lmeShyZ2IpXTtcbn1cblxuZnVuY3Rpb24gcmdiMnh5eihyZ2IpIHtcbiAgdmFyIHIgPSByZ2JbMF0gLyAyNTUsXG4gICAgICBnID0gcmdiWzFdIC8gMjU1LFxuICAgICAgYiA9IHJnYlsyXSAvIDI1NTtcblxuICAvLyBhc3N1bWUgc1JHQlxuICByID0gciA+IDAuMDQwNDUgPyBNYXRoLnBvdygoKHIgKyAwLjA1NSkgLyAxLjA1NSksIDIuNCkgOiAociAvIDEyLjkyKTtcbiAgZyA9IGcgPiAwLjA0MDQ1ID8gTWF0aC5wb3coKChnICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpIDogKGcgLyAxMi45Mik7XG4gIGIgPSBiID4gMC4wNDA0NSA/IE1hdGgucG93KCgoYiArIDAuMDU1KSAvIDEuMDU1KSwgMi40KSA6IChiIC8gMTIuOTIpO1xuXG4gIHZhciB4ID0gKHIgKiAwLjQxMjQpICsgKGcgKiAwLjM1NzYpICsgKGIgKiAwLjE4MDUpO1xuICB2YXIgeSA9IChyICogMC4yMTI2KSArIChnICogMC43MTUyKSArIChiICogMC4wNzIyKTtcbiAgdmFyIHogPSAociAqIDAuMDE5MykgKyAoZyAqIDAuMTE5MikgKyAoYiAqIDAuOTUwNSk7XG5cbiAgcmV0dXJuIFt4ICogMTAwLCB5ICoxMDAsIHogKiAxMDBdO1xufVxuXG5mdW5jdGlvbiByZ2IybGFiKHJnYikge1xuICB2YXIgeHl6ID0gcmdiMnh5eihyZ2IpLFxuICAgICAgICB4ID0geHl6WzBdLFxuICAgICAgICB5ID0geHl6WzFdLFxuICAgICAgICB6ID0geHl6WzJdLFxuICAgICAgICBsLCBhLCBiO1xuXG4gIHggLz0gOTUuMDQ3O1xuICB5IC89IDEwMDtcbiAgeiAvPSAxMDguODgzO1xuXG4gIHggPSB4ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh4LCAxLzMpIDogKDcuNzg3ICogeCkgKyAoMTYgLyAxMTYpO1xuICB5ID0geSA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeSwgMS8zKSA6ICg3Ljc4NyAqIHkpICsgKDE2IC8gMTE2KTtcbiAgeiA9IHogPiAwLjAwODg1NiA/IE1hdGgucG93KHosIDEvMykgOiAoNy43ODcgKiB6KSArICgxNiAvIDExNik7XG5cbiAgbCA9ICgxMTYgKiB5KSAtIDE2O1xuICBhID0gNTAwICogKHggLSB5KTtcbiAgYiA9IDIwMCAqICh5IC0geik7XG5cbiAgcmV0dXJuIFtsLCBhLCBiXTtcbn1cblxuZnVuY3Rpb24gcmdiMmxjaChhcmdzKSB7XG4gIHJldHVybiBsYWIybGNoKHJnYjJsYWIoYXJncykpO1xufVxuXG5mdW5jdGlvbiBoc2wycmdiKGhzbCkge1xuICB2YXIgaCA9IGhzbFswXSAvIDM2MCxcbiAgICAgIHMgPSBoc2xbMV0gLyAxMDAsXG4gICAgICBsID0gaHNsWzJdIC8gMTAwLFxuICAgICAgdDEsIHQyLCB0MywgcmdiLCB2YWw7XG5cbiAgaWYgKHMgPT0gMCkge1xuICAgIHZhbCA9IGwgKiAyNTU7XG4gICAgcmV0dXJuIFt2YWwsIHZhbCwgdmFsXTtcbiAgfVxuXG4gIGlmIChsIDwgMC41KVxuICAgIHQyID0gbCAqICgxICsgcyk7XG4gIGVsc2VcbiAgICB0MiA9IGwgKyBzIC0gbCAqIHM7XG4gIHQxID0gMiAqIGwgLSB0MjtcblxuICByZ2IgPSBbMCwgMCwgMF07XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgdDMgPSBoICsgMSAvIDMgKiAtIChpIC0gMSk7XG4gICAgdDMgPCAwICYmIHQzKys7XG4gICAgdDMgPiAxICYmIHQzLS07XG5cbiAgICBpZiAoNiAqIHQzIDwgMSlcbiAgICAgIHZhbCA9IHQxICsgKHQyIC0gdDEpICogNiAqIHQzO1xuICAgIGVsc2UgaWYgKDIgKiB0MyA8IDEpXG4gICAgICB2YWwgPSB0MjtcbiAgICBlbHNlIGlmICgzICogdDMgPCAyKVxuICAgICAgdmFsID0gdDEgKyAodDIgLSB0MSkgKiAoMiAvIDMgLSB0MykgKiA2O1xuICAgIGVsc2VcbiAgICAgIHZhbCA9IHQxO1xuXG4gICAgcmdiW2ldID0gdmFsICogMjU1O1xuICB9XG5cbiAgcmV0dXJuIHJnYjtcbn1cblxuZnVuY3Rpb24gaHNsMmhzdihoc2wpIHtcbiAgdmFyIGggPSBoc2xbMF0sXG4gICAgICBzID0gaHNsWzFdIC8gMTAwLFxuICAgICAgbCA9IGhzbFsyXSAvIDEwMCxcbiAgICAgIHN2LCB2O1xuXG4gIGlmKGwgPT09IDApIHtcbiAgICAgIC8vIG5vIG5lZWQgdG8gZG8gY2FsYyBvbiBibGFja1xuICAgICAgLy8gYWxzbyBhdm9pZHMgZGl2aWRlIGJ5IDAgZXJyb3JcbiAgICAgIHJldHVybiBbMCwgMCwgMF07XG4gIH1cblxuICBsICo9IDI7XG4gIHMgKj0gKGwgPD0gMSkgPyBsIDogMiAtIGw7XG4gIHYgPSAobCArIHMpIC8gMjtcbiAgc3YgPSAoMiAqIHMpIC8gKGwgKyBzKTtcbiAgcmV0dXJuIFtoLCBzdiAqIDEwMCwgdiAqIDEwMF07XG59XG5cbmZ1bmN0aW9uIGhzbDJod2IoYXJncykge1xuICByZXR1cm4gcmdiMmh3Yihoc2wycmdiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24gaHNsMmNteWsoYXJncykge1xuICByZXR1cm4gcmdiMmNteWsoaHNsMnJnYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGhzbDJrZXl3b3JkKGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJrZXl3b3JkKGhzbDJyZ2IoYXJncykpO1xufVxuXG5cbmZ1bmN0aW9uIGhzdjJyZ2IoaHN2KSB7XG4gIHZhciBoID0gaHN2WzBdIC8gNjAsXG4gICAgICBzID0gaHN2WzFdIC8gMTAwLFxuICAgICAgdiA9IGhzdlsyXSAvIDEwMCxcbiAgICAgIGhpID0gTWF0aC5mbG9vcihoKSAlIDY7XG5cbiAgdmFyIGYgPSBoIC0gTWF0aC5mbG9vcihoKSxcbiAgICAgIHAgPSAyNTUgKiB2ICogKDEgLSBzKSxcbiAgICAgIHEgPSAyNTUgKiB2ICogKDEgLSAocyAqIGYpKSxcbiAgICAgIHQgPSAyNTUgKiB2ICogKDEgLSAocyAqICgxIC0gZikpKSxcbiAgICAgIHYgPSAyNTUgKiB2O1xuXG4gIHN3aXRjaChoaSkge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBbdiwgdCwgcF07XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIFtxLCB2LCBwXTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gW3AsIHYsIHRdO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBbcCwgcSwgdl07XG4gICAgY2FzZSA0OlxuICAgICAgcmV0dXJuIFt0LCBwLCB2XTtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gW3YsIHAsIHFdO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhzdjJoc2woaHN2KSB7XG4gIHZhciBoID0gaHN2WzBdLFxuICAgICAgcyA9IGhzdlsxXSAvIDEwMCxcbiAgICAgIHYgPSBoc3ZbMl0gLyAxMDAsXG4gICAgICBzbCwgbDtcblxuICBsID0gKDIgLSBzKSAqIHY7XG4gIHNsID0gcyAqIHY7XG4gIHNsIC89IChsIDw9IDEpID8gbCA6IDIgLSBsO1xuICBzbCA9IHNsIHx8IDA7XG4gIGwgLz0gMjtcbiAgcmV0dXJuIFtoLCBzbCAqIDEwMCwgbCAqIDEwMF07XG59XG5cbmZ1bmN0aW9uIGhzdjJod2IoYXJncykge1xuICByZXR1cm4gcmdiMmh3Yihoc3YycmdiKGFyZ3MpKVxufVxuXG5mdW5jdGlvbiBoc3YyY215ayhhcmdzKSB7XG4gIHJldHVybiByZ2IyY215ayhoc3YycmdiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24gaHN2MmtleXdvcmQoYXJncykge1xuICByZXR1cm4gcmdiMmtleXdvcmQoaHN2MnJnYihhcmdzKSk7XG59XG5cbi8vIGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzcy1jb2xvci8jaHdiLXRvLXJnYlxuZnVuY3Rpb24gaHdiMnJnYihod2IpIHtcbiAgdmFyIGggPSBod2JbMF0gLyAzNjAsXG4gICAgICB3aCA9IGh3YlsxXSAvIDEwMCxcbiAgICAgIGJsID0gaHdiWzJdIC8gMTAwLFxuICAgICAgcmF0aW8gPSB3aCArIGJsLFxuICAgICAgaSwgdiwgZiwgbjtcblxuICAvLyB3aCArIGJsIGNhbnQgYmUgPiAxXG4gIGlmIChyYXRpbyA+IDEpIHtcbiAgICB3aCAvPSByYXRpbztcbiAgICBibCAvPSByYXRpbztcbiAgfVxuXG4gIGkgPSBNYXRoLmZsb29yKDYgKiBoKTtcbiAgdiA9IDEgLSBibDtcbiAgZiA9IDYgKiBoIC0gaTtcbiAgaWYgKChpICYgMHgwMSkgIT0gMCkge1xuICAgIGYgPSAxIC0gZjtcbiAgfVxuICBuID0gd2ggKyBmICogKHYgLSB3aCk7ICAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvblxuXG4gIHN3aXRjaCAoaSkge1xuICAgIGRlZmF1bHQ6XG4gICAgY2FzZSA2OlxuICAgIGNhc2UgMDogciA9IHY7IGcgPSBuOyBiID0gd2g7IGJyZWFrO1xuICAgIGNhc2UgMTogciA9IG47IGcgPSB2OyBiID0gd2g7IGJyZWFrO1xuICAgIGNhc2UgMjogciA9IHdoOyBnID0gdjsgYiA9IG47IGJyZWFrO1xuICAgIGNhc2UgMzogciA9IHdoOyBnID0gbjsgYiA9IHY7IGJyZWFrO1xuICAgIGNhc2UgNDogciA9IG47IGcgPSB3aDsgYiA9IHY7IGJyZWFrO1xuICAgIGNhc2UgNTogciA9IHY7IGcgPSB3aDsgYiA9IG47IGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn1cblxuZnVuY3Rpb24gaHdiMmhzbChhcmdzKSB7XG4gIHJldHVybiByZ2IyaHNsKGh3YjJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBod2IyaHN2KGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJoc3YoaHdiMnJnYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGh3YjJjbXlrKGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJjbXlrKGh3YjJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBod2Iya2V5d29yZChhcmdzKSB7XG4gIHJldHVybiByZ2Iya2V5d29yZChod2IycmdiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24gY215azJyZ2IoY215aykge1xuICB2YXIgYyA9IGNteWtbMF0gLyAxMDAsXG4gICAgICBtID0gY215a1sxXSAvIDEwMCxcbiAgICAgIHkgPSBjbXlrWzJdIC8gMTAwLFxuICAgICAgayA9IGNteWtbM10gLyAxMDAsXG4gICAgICByLCBnLCBiO1xuXG4gIHIgPSAxIC0gTWF0aC5taW4oMSwgYyAqICgxIC0gaykgKyBrKTtcbiAgZyA9IDEgLSBNYXRoLm1pbigxLCBtICogKDEgLSBrKSArIGspO1xuICBiID0gMSAtIE1hdGgubWluKDEsIHkgKiAoMSAtIGspICsgayk7XG4gIHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59XG5cbmZ1bmN0aW9uIGNteWsyaHNsKGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJoc2woY215azJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBjbXlrMmhzdihhcmdzKSB7XG4gIHJldHVybiByZ2IyaHN2KGNteWsycmdiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24gY215azJod2IoYXJncykge1xuICByZXR1cm4gcmdiMmh3YihjbXlrMnJnYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGNteWsya2V5d29yZChhcmdzKSB7XG4gIHJldHVybiByZ2Iya2V5d29yZChjbXlrMnJnYihhcmdzKSk7XG59XG5cblxuZnVuY3Rpb24geHl6MnJnYih4eXopIHtcbiAgdmFyIHggPSB4eXpbMF0gLyAxMDAsXG4gICAgICB5ID0geHl6WzFdIC8gMTAwLFxuICAgICAgeiA9IHh5elsyXSAvIDEwMCxcbiAgICAgIHIsIGcsIGI7XG5cbiAgciA9ICh4ICogMy4yNDA2KSArICh5ICogLTEuNTM3MikgKyAoeiAqIC0wLjQ5ODYpO1xuICBnID0gKHggKiAtMC45Njg5KSArICh5ICogMS44NzU4KSArICh6ICogMC4wNDE1KTtcbiAgYiA9ICh4ICogMC4wNTU3KSArICh5ICogLTAuMjA0MCkgKyAoeiAqIDEuMDU3MCk7XG5cbiAgLy8gYXNzdW1lIHNSR0JcbiAgciA9IHIgPiAwLjAwMzEzMDggPyAoKDEuMDU1ICogTWF0aC5wb3cociwgMS4wIC8gMi40KSkgLSAwLjA1NSlcbiAgICA6IHIgPSAociAqIDEyLjkyKTtcblxuICBnID0gZyA+IDAuMDAzMTMwOCA/ICgoMS4wNTUgKiBNYXRoLnBvdyhnLCAxLjAgLyAyLjQpKSAtIDAuMDU1KVxuICAgIDogZyA9IChnICogMTIuOTIpO1xuXG4gIGIgPSBiID4gMC4wMDMxMzA4ID8gKCgxLjA1NSAqIE1hdGgucG93KGIsIDEuMCAvIDIuNCkpIC0gMC4wNTUpXG4gICAgOiBiID0gKGIgKiAxMi45Mik7XG5cbiAgciA9IE1hdGgubWluKE1hdGgubWF4KDAsIHIpLCAxKTtcbiAgZyA9IE1hdGgubWluKE1hdGgubWF4KDAsIGcpLCAxKTtcbiAgYiA9IE1hdGgubWluKE1hdGgubWF4KDAsIGIpLCAxKTtcblxuICByZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xufVxuXG5mdW5jdGlvbiB4eXoybGFiKHh5eikge1xuICB2YXIgeCA9IHh5elswXSxcbiAgICAgIHkgPSB4eXpbMV0sXG4gICAgICB6ID0geHl6WzJdLFxuICAgICAgbCwgYSwgYjtcblxuICB4IC89IDk1LjA0NztcbiAgeSAvPSAxMDA7XG4gIHogLz0gMTA4Ljg4MztcblxuICB4ID0geCA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeCwgMS8zKSA6ICg3Ljc4NyAqIHgpICsgKDE2IC8gMTE2KTtcbiAgeSA9IHkgPiAwLjAwODg1NiA/IE1hdGgucG93KHksIDEvMykgOiAoNy43ODcgKiB5KSArICgxNiAvIDExNik7XG4gIHogPSB6ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh6LCAxLzMpIDogKDcuNzg3ICogeikgKyAoMTYgLyAxMTYpO1xuXG4gIGwgPSAoMTE2ICogeSkgLSAxNjtcbiAgYSA9IDUwMCAqICh4IC0geSk7XG4gIGIgPSAyMDAgKiAoeSAtIHopO1xuXG4gIHJldHVybiBbbCwgYSwgYl07XG59XG5cbmZ1bmN0aW9uIHh5ejJsY2goYXJncykge1xuICByZXR1cm4gbGFiMmxjaCh4eXoybGFiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24gbGFiMnh5eihsYWIpIHtcbiAgdmFyIGwgPSBsYWJbMF0sXG4gICAgICBhID0gbGFiWzFdLFxuICAgICAgYiA9IGxhYlsyXSxcbiAgICAgIHgsIHksIHosIHkyO1xuXG4gIGlmIChsIDw9IDgpIHtcbiAgICB5ID0gKGwgKiAxMDApIC8gOTAzLjM7XG4gICAgeTIgPSAoNy43ODcgKiAoeSAvIDEwMCkpICsgKDE2IC8gMTE2KTtcbiAgfSBlbHNlIHtcbiAgICB5ID0gMTAwICogTWF0aC5wb3coKGwgKyAxNikgLyAxMTYsIDMpO1xuICAgIHkyID0gTWF0aC5wb3coeSAvIDEwMCwgMS8zKTtcbiAgfVxuXG4gIHggPSB4IC8gOTUuMDQ3IDw9IDAuMDA4ODU2ID8geCA9ICg5NS4wNDcgKiAoKGEgLyA1MDApICsgeTIgLSAoMTYgLyAxMTYpKSkgLyA3Ljc4NyA6IDk1LjA0NyAqIE1hdGgucG93KChhIC8gNTAwKSArIHkyLCAzKTtcblxuICB6ID0geiAvIDEwOC44ODMgPD0gMC4wMDg4NTkgPyB6ID0gKDEwOC44ODMgKiAoeTIgLSAoYiAvIDIwMCkgLSAoMTYgLyAxMTYpKSkgLyA3Ljc4NyA6IDEwOC44ODMgKiBNYXRoLnBvdyh5MiAtIChiIC8gMjAwKSwgMyk7XG5cbiAgcmV0dXJuIFt4LCB5LCB6XTtcbn1cblxuZnVuY3Rpb24gbGFiMmxjaChsYWIpIHtcbiAgdmFyIGwgPSBsYWJbMF0sXG4gICAgICBhID0gbGFiWzFdLFxuICAgICAgYiA9IGxhYlsyXSxcbiAgICAgIGhyLCBoLCBjO1xuXG4gIGhyID0gTWF0aC5hdGFuMihiLCBhKTtcbiAgaCA9IGhyICogMzYwIC8gMiAvIE1hdGguUEk7XG4gIGlmIChoIDwgMCkge1xuICAgIGggKz0gMzYwO1xuICB9XG4gIGMgPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7XG4gIHJldHVybiBbbCwgYywgaF07XG59XG5cbmZ1bmN0aW9uIGxhYjJyZ2IoYXJncykge1xuICByZXR1cm4geHl6MnJnYihsYWIyeHl6KGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24gbGNoMmxhYihsY2gpIHtcbiAgdmFyIGwgPSBsY2hbMF0sXG4gICAgICBjID0gbGNoWzFdLFxuICAgICAgaCA9IGxjaFsyXSxcbiAgICAgIGEsIGIsIGhyO1xuXG4gIGhyID0gaCAvIDM2MCAqIDIgKiBNYXRoLlBJO1xuICBhID0gYyAqIE1hdGguY29zKGhyKTtcbiAgYiA9IGMgKiBNYXRoLnNpbihocik7XG4gIHJldHVybiBbbCwgYSwgYl07XG59XG5cbmZ1bmN0aW9uIGxjaDJ4eXooYXJncykge1xuICByZXR1cm4gbGFiMnh5eihsY2gybGFiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24gbGNoMnJnYihhcmdzKSB7XG4gIHJldHVybiBsYWIycmdiKGxjaDJsYWIoYXJncykpO1xufVxuXG5mdW5jdGlvbiBrZXl3b3JkMnJnYihrZXl3b3JkKSB7XG4gIHJldHVybiBjc3NLZXl3b3Jkc1trZXl3b3JkXTtcbn1cblxuZnVuY3Rpb24ga2V5d29yZDJoc2woYXJncykge1xuICByZXR1cm4gcmdiMmhzbChrZXl3b3JkMnJnYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGtleXdvcmQyaHN2KGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJoc3Yoa2V5d29yZDJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBrZXl3b3JkMmh3YihhcmdzKSB7XG4gIHJldHVybiByZ2IyaHdiKGtleXdvcmQycmdiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24ga2V5d29yZDJjbXlrKGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJjbXlrKGtleXdvcmQycmdiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24ga2V5d29yZDJsYWIoYXJncykge1xuICByZXR1cm4gcmdiMmxhYihrZXl3b3JkMnJnYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGtleXdvcmQyeHl6KGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJ4eXooa2V5d29yZDJyZ2IoYXJncykpO1xufVxuXG52YXIgY3NzS2V5d29yZHMgPSB7XG4gIGFsaWNlYmx1ZTogIFsyNDAsMjQ4LDI1NV0sXG4gIGFudGlxdWV3aGl0ZTogWzI1MCwyMzUsMjE1XSxcbiAgYXF1YTogWzAsMjU1LDI1NV0sXG4gIGFxdWFtYXJpbmU6IFsxMjcsMjU1LDIxMl0sXG4gIGF6dXJlOiAgWzI0MCwyNTUsMjU1XSxcbiAgYmVpZ2U6ICBbMjQ1LDI0NSwyMjBdLFxuICBiaXNxdWU6IFsyNTUsMjI4LDE5Nl0sXG4gIGJsYWNrOiAgWzAsMCwwXSxcbiAgYmxhbmNoZWRhbG1vbmQ6IFsyNTUsMjM1LDIwNV0sXG4gIGJsdWU6IFswLDAsMjU1XSxcbiAgYmx1ZXZpb2xldDogWzEzOCw0MywyMjZdLFxuICBicm93bjogIFsxNjUsNDIsNDJdLFxuICBidXJseXdvb2Q6ICBbMjIyLDE4NCwxMzVdLFxuICBjYWRldGJsdWU6ICBbOTUsMTU4LDE2MF0sXG4gIGNoYXJ0cmV1c2U6IFsxMjcsMjU1LDBdLFxuICBjaG9jb2xhdGU6ICBbMjEwLDEwNSwzMF0sXG4gIGNvcmFsOiAgWzI1NSwxMjcsODBdLFxuICBjb3JuZmxvd2VyYmx1ZTogWzEwMCwxNDksMjM3XSxcbiAgY29ybnNpbGs6IFsyNTUsMjQ4LDIyMF0sXG4gIGNyaW1zb246ICBbMjIwLDIwLDYwXSxcbiAgY3lhbjogWzAsMjU1LDI1NV0sXG4gIGRhcmtibHVlOiBbMCwwLDEzOV0sXG4gIGRhcmtjeWFuOiBbMCwxMzksMTM5XSxcbiAgZGFya2dvbGRlbnJvZDogIFsxODQsMTM0LDExXSxcbiAgZGFya2dyYXk6IFsxNjksMTY5LDE2OV0sXG4gIGRhcmtncmVlbjogIFswLDEwMCwwXSxcbiAgZGFya2dyZXk6IFsxNjksMTY5LDE2OV0sXG4gIGRhcmtraGFraTogIFsxODksMTgzLDEwN10sXG4gIGRhcmttYWdlbnRhOiAgWzEzOSwwLDEzOV0sXG4gIGRhcmtvbGl2ZWdyZWVuOiBbODUsMTA3LDQ3XSxcbiAgZGFya29yYW5nZTogWzI1NSwxNDAsMF0sXG4gIGRhcmtvcmNoaWQ6IFsxNTMsNTAsMjA0XSxcbiAgZGFya3JlZDogIFsxMzksMCwwXSxcbiAgZGFya3NhbG1vbjogWzIzMywxNTAsMTIyXSxcbiAgZGFya3NlYWdyZWVuOiBbMTQzLDE4OCwxNDNdLFxuICBkYXJrc2xhdGVibHVlOiAgWzcyLDYxLDEzOV0sXG4gIGRhcmtzbGF0ZWdyYXk6ICBbNDcsNzksNzldLFxuICBkYXJrc2xhdGVncmV5OiAgWzQ3LDc5LDc5XSxcbiAgZGFya3R1cnF1b2lzZTogIFswLDIwNiwyMDldLFxuICBkYXJrdmlvbGV0OiBbMTQ4LDAsMjExXSxcbiAgZGVlcHBpbms6IFsyNTUsMjAsMTQ3XSxcbiAgZGVlcHNreWJsdWU6ICBbMCwxOTEsMjU1XSxcbiAgZGltZ3JheTogIFsxMDUsMTA1LDEwNV0sXG4gIGRpbWdyZXk6ICBbMTA1LDEwNSwxMDVdLFxuICBkb2RnZXJibHVlOiBbMzAsMTQ0LDI1NV0sXG4gIGZpcmVicmljazogIFsxNzgsMzQsMzRdLFxuICBmbG9yYWx3aGl0ZTogIFsyNTUsMjUwLDI0MF0sXG4gIGZvcmVzdGdyZWVuOiAgWzM0LDEzOSwzNF0sXG4gIGZ1Y2hzaWE6ICBbMjU1LDAsMjU1XSxcbiAgZ2FpbnNib3JvOiAgWzIyMCwyMjAsMjIwXSxcbiAgZ2hvc3R3aGl0ZTogWzI0OCwyNDgsMjU1XSxcbiAgZ29sZDogWzI1NSwyMTUsMF0sXG4gIGdvbGRlbnJvZDogIFsyMTgsMTY1LDMyXSxcbiAgZ3JheTogWzEyOCwxMjgsMTI4XSxcbiAgZ3JlZW46ICBbMCwxMjgsMF0sXG4gIGdyZWVueWVsbG93OiAgWzE3MywyNTUsNDddLFxuICBncmV5OiBbMTI4LDEyOCwxMjhdLFxuICBob25leWRldzogWzI0MCwyNTUsMjQwXSxcbiAgaG90cGluazogIFsyNTUsMTA1LDE4MF0sXG4gIGluZGlhbnJlZDogIFsyMDUsOTIsOTJdLFxuICBpbmRpZ286IFs3NSwwLDEzMF0sXG4gIGl2b3J5OiAgWzI1NSwyNTUsMjQwXSxcbiAga2hha2k6ICBbMjQwLDIzMCwxNDBdLFxuICBsYXZlbmRlcjogWzIzMCwyMzAsMjUwXSxcbiAgbGF2ZW5kZXJibHVzaDogIFsyNTUsMjQwLDI0NV0sXG4gIGxhd25ncmVlbjogIFsxMjQsMjUyLDBdLFxuICBsZW1vbmNoaWZmb246IFsyNTUsMjUwLDIwNV0sXG4gIGxpZ2h0Ymx1ZTogIFsxNzMsMjE2LDIzMF0sXG4gIGxpZ2h0Y29yYWw6IFsyNDAsMTI4LDEyOF0sXG4gIGxpZ2h0Y3lhbjogIFsyMjQsMjU1LDI1NV0sXG4gIGxpZ2h0Z29sZGVucm9keWVsbG93OiBbMjUwLDI1MCwyMTBdLFxuICBsaWdodGdyYXk6ICBbMjExLDIxMSwyMTFdLFxuICBsaWdodGdyZWVuOiBbMTQ0LDIzOCwxNDRdLFxuICBsaWdodGdyZXk6ICBbMjExLDIxMSwyMTFdLFxuICBsaWdodHBpbms6ICBbMjU1LDE4MiwxOTNdLFxuICBsaWdodHNhbG1vbjogIFsyNTUsMTYwLDEyMl0sXG4gIGxpZ2h0c2VhZ3JlZW46ICBbMzIsMTc4LDE3MF0sXG4gIGxpZ2h0c2t5Ymx1ZTogWzEzNSwyMDYsMjUwXSxcbiAgbGlnaHRzbGF0ZWdyYXk6IFsxMTksMTM2LDE1M10sXG4gIGxpZ2h0c2xhdGVncmV5OiBbMTE5LDEzNiwxNTNdLFxuICBsaWdodHN0ZWVsYmx1ZTogWzE3NiwxOTYsMjIyXSxcbiAgbGlnaHR5ZWxsb3c6ICBbMjU1LDI1NSwyMjRdLFxuICBsaW1lOiBbMCwyNTUsMF0sXG4gIGxpbWVncmVlbjogIFs1MCwyMDUsNTBdLFxuICBsaW5lbjogIFsyNTAsMjQwLDIzMF0sXG4gIG1hZ2VudGE6ICBbMjU1LDAsMjU1XSxcbiAgbWFyb29uOiBbMTI4LDAsMF0sXG4gIG1lZGl1bWFxdWFtYXJpbmU6IFsxMDIsMjA1LDE3MF0sXG4gIG1lZGl1bWJsdWU6IFswLDAsMjA1XSxcbiAgbWVkaXVtb3JjaGlkOiBbMTg2LDg1LDIxMV0sXG4gIG1lZGl1bXB1cnBsZTogWzE0NywxMTIsMjE5XSxcbiAgbWVkaXVtc2VhZ3JlZW46IFs2MCwxNzksMTEzXSxcbiAgbWVkaXVtc2xhdGVibHVlOiAgWzEyMywxMDQsMjM4XSxcbiAgbWVkaXVtc3ByaW5nZ3JlZW46ICBbMCwyNTAsMTU0XSxcbiAgbWVkaXVtdHVycXVvaXNlOiAgWzcyLDIwOSwyMDRdLFxuICBtZWRpdW12aW9sZXRyZWQ6ICBbMTk5LDIxLDEzM10sXG4gIG1pZG5pZ2h0Ymx1ZTogWzI1LDI1LDExMl0sXG4gIG1pbnRjcmVhbTogIFsyNDUsMjU1LDI1MF0sXG4gIG1pc3R5cm9zZTogIFsyNTUsMjI4LDIyNV0sXG4gIG1vY2Nhc2luOiBbMjU1LDIyOCwxODFdLFxuICBuYXZham93aGl0ZTogIFsyNTUsMjIyLDE3M10sXG4gIG5hdnk6IFswLDAsMTI4XSxcbiAgb2xkbGFjZTogIFsyNTMsMjQ1LDIzMF0sXG4gIG9saXZlOiAgWzEyOCwxMjgsMF0sXG4gIG9saXZlZHJhYjogIFsxMDcsMTQyLDM1XSxcbiAgb3JhbmdlOiBbMjU1LDE2NSwwXSxcbiAgb3JhbmdlcmVkOiAgWzI1NSw2OSwwXSxcbiAgb3JjaGlkOiBbMjE4LDExMiwyMTRdLFxuICBwYWxlZ29sZGVucm9kOiAgWzIzOCwyMzIsMTcwXSxcbiAgcGFsZWdyZWVuOiAgWzE1MiwyNTEsMTUyXSxcbiAgcGFsZXR1cnF1b2lzZTogIFsxNzUsMjM4LDIzOF0sXG4gIHBhbGV2aW9sZXRyZWQ6ICBbMjE5LDExMiwxNDddLFxuICBwYXBheWF3aGlwOiBbMjU1LDIzOSwyMTNdLFxuICBwZWFjaHB1ZmY6ICBbMjU1LDIxOCwxODVdLFxuICBwZXJ1OiBbMjA1LDEzMyw2M10sXG4gIHBpbms6IFsyNTUsMTkyLDIwM10sXG4gIHBsdW06IFsyMjEsMTYwLDIyMV0sXG4gIHBvd2RlcmJsdWU6IFsxNzYsMjI0LDIzMF0sXG4gIHB1cnBsZTogWzEyOCwwLDEyOF0sXG4gIHJlYmVjY2FwdXJwbGU6IFsxMDIsIDUxLCAxNTNdLFxuICByZWQ6ICBbMjU1LDAsMF0sXG4gIHJvc3licm93bjogIFsxODgsMTQzLDE0M10sXG4gIHJveWFsYmx1ZTogIFs2NSwxMDUsMjI1XSxcbiAgc2FkZGxlYnJvd246ICBbMTM5LDY5LDE5XSxcbiAgc2FsbW9uOiBbMjUwLDEyOCwxMTRdLFxuICBzYW5keWJyb3duOiBbMjQ0LDE2NCw5Nl0sXG4gIHNlYWdyZWVuOiBbNDYsMTM5LDg3XSxcbiAgc2Vhc2hlbGw6IFsyNTUsMjQ1LDIzOF0sXG4gIHNpZW5uYTogWzE2MCw4Miw0NV0sXG4gIHNpbHZlcjogWzE5MiwxOTIsMTkyXSxcbiAgc2t5Ymx1ZTogIFsxMzUsMjA2LDIzNV0sXG4gIHNsYXRlYmx1ZTogIFsxMDYsOTAsMjA1XSxcbiAgc2xhdGVncmF5OiAgWzExMiwxMjgsMTQ0XSxcbiAgc2xhdGVncmV5OiAgWzExMiwxMjgsMTQ0XSxcbiAgc25vdzogWzI1NSwyNTAsMjUwXSxcbiAgc3ByaW5nZ3JlZW46ICBbMCwyNTUsMTI3XSxcbiAgc3RlZWxibHVlOiAgWzcwLDEzMCwxODBdLFxuICB0YW46ICBbMjEwLDE4MCwxNDBdLFxuICB0ZWFsOiBbMCwxMjgsMTI4XSxcbiAgdGhpc3RsZTogIFsyMTYsMTkxLDIxNl0sXG4gIHRvbWF0bzogWzI1NSw5OSw3MV0sXG4gIHR1cnF1b2lzZTogIFs2NCwyMjQsMjA4XSxcbiAgdmlvbGV0OiBbMjM4LDEzMCwyMzhdLFxuICB3aGVhdDogIFsyNDUsMjIyLDE3OV0sXG4gIHdoaXRlOiAgWzI1NSwyNTUsMjU1XSxcbiAgd2hpdGVzbW9rZTogWzI0NSwyNDUsMjQ1XSxcbiAgeWVsbG93OiBbMjU1LDI1NSwwXSxcbiAgeWVsbG93Z3JlZW46ICBbMTU0LDIwNSw1MF1cbn07XG5cbnZhciByZXZlcnNlS2V5d29yZHMgPSB7fTtcbmZvciAodmFyIGtleSBpbiBjc3NLZXl3b3Jkcykge1xuICByZXZlcnNlS2V5d29yZHNbSlNPTi5zdHJpbmdpZnkoY3NzS2V5d29yZHNba2V5XSldID0ga2V5O1xufVxuIiwidmFyIGNvbnZlcnNpb25zID0gcmVxdWlyZShcIi4vY29udmVyc2lvbnNcIik7XG5cbnZhciBjb252ZXJ0ID0gZnVuY3Rpb24oKSB7XG4gICByZXR1cm4gbmV3IENvbnZlcnRlcigpO1xufVxuXG5mb3IgKHZhciBmdW5jIGluIGNvbnZlcnNpb25zKSB7XG4gIC8vIGV4cG9ydCBSYXcgdmVyc2lvbnNcbiAgY29udmVydFtmdW5jICsgXCJSYXdcIl0gPSAgKGZ1bmN0aW9uKGZ1bmMpIHtcbiAgICAvLyBhY2NlcHQgYXJyYXkgb3IgcGxhaW4gYXJnc1xuICAgIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICAgIGlmICh0eXBlb2YgYXJnID09IFwibnVtYmVyXCIpXG4gICAgICAgIGFyZyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICByZXR1cm4gY29udmVyc2lvbnNbZnVuY10oYXJnKTtcbiAgICB9XG4gIH0pKGZ1bmMpO1xuXG4gIHZhciBwYWlyID0gLyhcXHcrKTIoXFx3KykvLmV4ZWMoZnVuYyksXG4gICAgICBmcm9tID0gcGFpclsxXSxcbiAgICAgIHRvID0gcGFpclsyXTtcblxuICAvLyBleHBvcnQgcmdiMmhzbCBhbmQgW1wicmdiXCJdW1wiaHNsXCJdXG4gIGNvbnZlcnRbZnJvbV0gPSBjb252ZXJ0W2Zyb21dIHx8IHt9O1xuXG4gIGNvbnZlcnRbZnJvbV1bdG9dID0gY29udmVydFtmdW5jXSA9IChmdW5jdGlvbihmdW5jKSB7IFxuICAgIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICAgIGlmICh0eXBlb2YgYXJnID09IFwibnVtYmVyXCIpXG4gICAgICAgIGFyZyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICBcbiAgICAgIHZhciB2YWwgPSBjb252ZXJzaW9uc1tmdW5jXShhcmcpO1xuICAgICAgaWYgKHR5cGVvZiB2YWwgPT0gXCJzdHJpbmdcIiB8fCB2YWwgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHZhbDsgLy8ga2V5d29yZFxuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKylcbiAgICAgICAgdmFsW2ldID0gTWF0aC5yb3VuZCh2YWxbaV0pO1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG4gIH0pKGZ1bmMpO1xufVxuXG5cbi8qIENvbnZlcnRlciBkb2VzIGxhenkgY29udmVyc2lvbiBhbmQgY2FjaGluZyAqL1xudmFyIENvbnZlcnRlciA9IGZ1bmN0aW9uKCkge1xuICAgdGhpcy5jb252cyA9IHt9O1xufTtcblxuLyogRWl0aGVyIGdldCB0aGUgdmFsdWVzIGZvciBhIHNwYWNlIG9yXG4gIHNldCB0aGUgdmFsdWVzIGZvciBhIHNwYWNlLCBkZXBlbmRpbmcgb24gYXJncyAqL1xuQ29udmVydGVyLnByb3RvdHlwZS5yb3V0ZVNwYWNlID0gZnVuY3Rpb24oc3BhY2UsIGFyZ3MpIHtcbiAgIHZhciB2YWx1ZXMgPSBhcmdzWzBdO1xuICAgaWYgKHZhbHVlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBjb2xvci5yZ2IoKVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWVzKHNwYWNlKTtcbiAgIH1cbiAgIC8vIGNvbG9yLnJnYigxMCwgMTAsIDEwKVxuICAgaWYgKHR5cGVvZiB2YWx1ZXMgPT0gXCJudW1iZXJcIikge1xuICAgICAgdmFsdWVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncyk7ICAgICAgICBcbiAgIH1cblxuICAgcmV0dXJuIHRoaXMuc2V0VmFsdWVzKHNwYWNlLCB2YWx1ZXMpO1xufTtcbiAgXG4vKiBTZXQgdGhlIHZhbHVlcyBmb3IgYSBzcGFjZSwgaW52YWxpZGF0aW5nIGNhY2hlICovXG5Db252ZXJ0ZXIucHJvdG90eXBlLnNldFZhbHVlcyA9IGZ1bmN0aW9uKHNwYWNlLCB2YWx1ZXMpIHtcbiAgIHRoaXMuc3BhY2UgPSBzcGFjZTtcbiAgIHRoaXMuY29udnMgPSB7fTtcbiAgIHRoaXMuY29udnNbc3BhY2VdID0gdmFsdWVzO1xuICAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKiBHZXQgdGhlIHZhbHVlcyBmb3IgYSBzcGFjZS4gSWYgdGhlcmUncyBhbHJlYWR5XG4gIGEgY29udmVyc2lvbiBmb3IgdGhlIHNwYWNlLCBmZXRjaCBpdCwgb3RoZXJ3aXNlXG4gIGNvbXB1dGUgaXQgKi9cbkNvbnZlcnRlci5wcm90b3R5cGUuZ2V0VmFsdWVzID0gZnVuY3Rpb24oc3BhY2UpIHtcbiAgIHZhciB2YWxzID0gdGhpcy5jb252c1tzcGFjZV07XG4gICBpZiAoIXZhbHMpIHtcbiAgICAgIHZhciBmc3BhY2UgPSB0aGlzLnNwYWNlLFxuICAgICAgICAgIGZyb20gPSB0aGlzLmNvbnZzW2ZzcGFjZV07XG4gICAgICB2YWxzID0gY29udmVydFtmc3BhY2VdW3NwYWNlXShmcm9tKTtcblxuICAgICAgdGhpcy5jb252c1tzcGFjZV0gPSB2YWxzO1xuICAgfVxuICByZXR1cm4gdmFscztcbn07XG5cbltcInJnYlwiLCBcImhzbFwiLCBcImhzdlwiLCBcImNteWtcIiwgXCJrZXl3b3JkXCJdLmZvckVhY2goZnVuY3Rpb24oc3BhY2UpIHtcbiAgIENvbnZlcnRlci5wcm90b3R5cGVbc3BhY2VdID0gZnVuY3Rpb24odmFscykge1xuICAgICAgcmV0dXJuIHRoaXMucm91dGVTcGFjZShzcGFjZSwgYXJndW1lbnRzKTtcbiAgIH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7IiwiLyogTUlUIGxpY2Vuc2UgKi9cbnZhciBjb2xvck5hbWVzID0gcmVxdWlyZSgnY29sb3ItbmFtZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgIGdldFJnYmE6IGdldFJnYmEsXG4gICBnZXRIc2xhOiBnZXRIc2xhLFxuICAgZ2V0UmdiOiBnZXRSZ2IsXG4gICBnZXRIc2w6IGdldEhzbCxcbiAgIGdldEh3YjogZ2V0SHdiLFxuICAgZ2V0QWxwaGE6IGdldEFscGhhLFxuXG4gICBoZXhTdHJpbmc6IGhleFN0cmluZyxcbiAgIHJnYlN0cmluZzogcmdiU3RyaW5nLFxuICAgcmdiYVN0cmluZzogcmdiYVN0cmluZyxcbiAgIHBlcmNlbnRTdHJpbmc6IHBlcmNlbnRTdHJpbmcsXG4gICBwZXJjZW50YVN0cmluZzogcGVyY2VudGFTdHJpbmcsXG4gICBoc2xTdHJpbmc6IGhzbFN0cmluZyxcbiAgIGhzbGFTdHJpbmc6IGhzbGFTdHJpbmcsXG4gICBod2JTdHJpbmc6IGh3YlN0cmluZyxcbiAgIGtleXdvcmQ6IGtleXdvcmRcbn1cblxuZnVuY3Rpb24gZ2V0UmdiYShzdHJpbmcpIHtcbiAgIGlmICghc3RyaW5nKSB7XG4gICAgICByZXR1cm47XG4gICB9XG4gICB2YXIgYWJiciA9ICAvXiMoW2EtZkEtRjAtOV17M30pJC8sXG4gICAgICAgaGV4ID0gIC9eIyhbYS1mQS1GMC05XXs2fSkkLyxcbiAgICAgICByZ2JhID0gL15yZ2JhP1xcKFxccyooWystXT9cXGQrKVxccyosXFxzKihbKy1dP1xcZCspXFxzKixcXHMqKFsrLV0/XFxkKylcXHMqKD86LFxccyooWystXT9bXFxkXFwuXSspXFxzKik/XFwpJC8sXG4gICAgICAgcGVyID0gL15yZ2JhP1xcKFxccyooWystXT9bXFxkXFwuXSspXFwlXFxzKixcXHMqKFsrLV0/W1xcZFxcLl0rKVxcJVxccyosXFxzKihbKy1dP1tcXGRcXC5dKylcXCVcXHMqKD86LFxccyooWystXT9bXFxkXFwuXSspXFxzKik/XFwpJC8sXG4gICAgICAga2V5d29yZCA9IC8oXFxEKykvO1xuXG4gICB2YXIgcmdiID0gWzAsIDAsIDBdLFxuICAgICAgIGEgPSAxLFxuICAgICAgIG1hdGNoID0gc3RyaW5nLm1hdGNoKGFiYnIpO1xuICAgaWYgKG1hdGNoKSB7XG4gICAgICBtYXRjaCA9IG1hdGNoWzFdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZ2IubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgIHJnYltpXSA9IHBhcnNlSW50KG1hdGNoW2ldICsgbWF0Y2hbaV0sIDE2KTtcbiAgICAgIH1cbiAgIH1cbiAgIGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKGhleCkpIHtcbiAgICAgIG1hdGNoID0gbWF0Y2hbMV07XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJnYi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgcmdiW2ldID0gcGFyc2VJbnQobWF0Y2guc2xpY2UoaSAqIDIsIGkgKiAyICsgMiksIDE2KTtcbiAgICAgIH1cbiAgIH1cbiAgIGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKHJnYmEpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJnYi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgcmdiW2ldID0gcGFyc2VJbnQobWF0Y2hbaSArIDFdKTtcbiAgICAgIH1cbiAgICAgIGEgPSBwYXJzZUZsb2F0KG1hdGNoWzRdKTtcbiAgIH1cbiAgIGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKHBlcikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmdiLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICByZ2JbaV0gPSBNYXRoLnJvdW5kKHBhcnNlRmxvYXQobWF0Y2hbaSArIDFdKSAqIDIuNTUpO1xuICAgICAgfVxuICAgICAgYSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pO1xuICAgfVxuICAgZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goa2V5d29yZCkpIHtcbiAgICAgIGlmIChtYXRjaFsxXSA9PSBcInRyYW5zcGFyZW50XCIpIHtcbiAgICAgICAgIHJldHVybiBbMCwgMCwgMCwgMF07XG4gICAgICB9XG4gICAgICByZ2IgPSBjb2xvck5hbWVzW21hdGNoWzFdXTtcbiAgICAgIGlmICghcmdiKSB7XG4gICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICB9XG5cbiAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmdiLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZ2JbaV0gPSBzY2FsZShyZ2JbaV0sIDAsIDI1NSk7XG4gICB9XG4gICBpZiAoIWEgJiYgYSAhPSAwKSB7XG4gICAgICBhID0gMTtcbiAgIH1cbiAgIGVsc2Uge1xuICAgICAgYSA9IHNjYWxlKGEsIDAsIDEpO1xuICAgfVxuICAgcmdiWzNdID0gYTtcbiAgIHJldHVybiByZ2I7XG59XG5cbmZ1bmN0aW9uIGdldEhzbGEoc3RyaW5nKSB7XG4gICBpZiAoIXN0cmluZykge1xuICAgICAgcmV0dXJuO1xuICAgfVxuICAgdmFyIGhzbCA9IC9eaHNsYT9cXChcXHMqKFsrLV0/XFxkKykoPzpkZWcpP1xccyosXFxzKihbKy1dP1tcXGRcXC5dKyklXFxzKixcXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqKD86LFxccyooWystXT9bXFxkXFwuXSspXFxzKik/XFwpLztcbiAgIHZhciBtYXRjaCA9IHN0cmluZy5tYXRjaChoc2wpO1xuICAgaWYgKG1hdGNoKSB7XG4gICAgICB2YXIgYWxwaGEgPSBwYXJzZUZsb2F0KG1hdGNoWzRdKTtcbiAgICAgIHZhciBoID0gc2NhbGUocGFyc2VJbnQobWF0Y2hbMV0pLCAwLCAzNjApLFxuICAgICAgICAgIHMgPSBzY2FsZShwYXJzZUZsb2F0KG1hdGNoWzJdKSwgMCwgMTAwKSxcbiAgICAgICAgICBsID0gc2NhbGUocGFyc2VGbG9hdChtYXRjaFszXSksIDAsIDEwMCksXG4gICAgICAgICAgYSA9IHNjYWxlKGlzTmFOKGFscGhhKSA/IDEgOiBhbHBoYSwgMCwgMSk7XG4gICAgICByZXR1cm4gW2gsIHMsIGwsIGFdO1xuICAgfVxufVxuXG5mdW5jdGlvbiBnZXRId2Ioc3RyaW5nKSB7XG4gICBpZiAoIXN0cmluZykge1xuICAgICAgcmV0dXJuO1xuICAgfVxuICAgdmFyIGh3YiA9IC9eaHdiXFwoXFxzKihbKy1dP1xcZCspKD86ZGVnKT9cXHMqLFxccyooWystXT9bXFxkXFwuXSspJVxccyosXFxzKihbKy1dP1tcXGRcXC5dKyklXFxzKig/OixcXHMqKFsrLV0/W1xcZFxcLl0rKVxccyopP1xcKS87XG4gICB2YXIgbWF0Y2ggPSBzdHJpbmcubWF0Y2goaHdiKTtcbiAgIGlmIChtYXRjaCkge1xuICAgIHZhciBhbHBoYSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pO1xuICAgICAgdmFyIGggPSBzY2FsZShwYXJzZUludChtYXRjaFsxXSksIDAsIDM2MCksXG4gICAgICAgICAgdyA9IHNjYWxlKHBhcnNlRmxvYXQobWF0Y2hbMl0pLCAwLCAxMDApLFxuICAgICAgICAgIGIgPSBzY2FsZShwYXJzZUZsb2F0KG1hdGNoWzNdKSwgMCwgMTAwKSxcbiAgICAgICAgICBhID0gc2NhbGUoaXNOYU4oYWxwaGEpID8gMSA6IGFscGhhLCAwLCAxKTtcbiAgICAgIHJldHVybiBbaCwgdywgYiwgYV07XG4gICB9XG59XG5cbmZ1bmN0aW9uIGdldFJnYihzdHJpbmcpIHtcbiAgIHZhciByZ2JhID0gZ2V0UmdiYShzdHJpbmcpO1xuICAgcmV0dXJuIHJnYmEgJiYgcmdiYS5zbGljZSgwLCAzKTtcbn1cblxuZnVuY3Rpb24gZ2V0SHNsKHN0cmluZykge1xuICB2YXIgaHNsYSA9IGdldEhzbGEoc3RyaW5nKTtcbiAgcmV0dXJuIGhzbGEgJiYgaHNsYS5zbGljZSgwLCAzKTtcbn1cblxuZnVuY3Rpb24gZ2V0QWxwaGEoc3RyaW5nKSB7XG4gICB2YXIgdmFscyA9IGdldFJnYmEoc3RyaW5nKTtcbiAgIGlmICh2YWxzKSB7XG4gICAgICByZXR1cm4gdmFsc1szXTtcbiAgIH1cbiAgIGVsc2UgaWYgKHZhbHMgPSBnZXRIc2xhKHN0cmluZykpIHtcbiAgICAgIHJldHVybiB2YWxzWzNdO1xuICAgfVxuICAgZWxzZSBpZiAodmFscyA9IGdldEh3YihzdHJpbmcpKSB7XG4gICAgICByZXR1cm4gdmFsc1szXTtcbiAgIH1cbn1cblxuLy8gZ2VuZXJhdG9yc1xuZnVuY3Rpb24gaGV4U3RyaW5nKHJnYikge1xuICAgcmV0dXJuIFwiI1wiICsgaGV4RG91YmxlKHJnYlswXSkgKyBoZXhEb3VibGUocmdiWzFdKVxuICAgICAgICAgICAgICArIGhleERvdWJsZShyZ2JbMl0pO1xufVxuXG5mdW5jdGlvbiByZ2JTdHJpbmcocmdiYSwgYWxwaGEpIHtcbiAgIGlmIChhbHBoYSA8IDEgfHwgKHJnYmFbM10gJiYgcmdiYVszXSA8IDEpKSB7XG4gICAgICByZXR1cm4gcmdiYVN0cmluZyhyZ2JhLCBhbHBoYSk7XG4gICB9XG4gICByZXR1cm4gXCJyZ2IoXCIgKyByZ2JhWzBdICsgXCIsIFwiICsgcmdiYVsxXSArIFwiLCBcIiArIHJnYmFbMl0gKyBcIilcIjtcbn1cblxuZnVuY3Rpb24gcmdiYVN0cmluZyhyZ2JhLCBhbHBoYSkge1xuICAgaWYgKGFscGhhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFscGhhID0gKHJnYmFbM10gIT09IHVuZGVmaW5lZCA/IHJnYmFbM10gOiAxKTtcbiAgIH1cbiAgIHJldHVybiBcInJnYmEoXCIgKyByZ2JhWzBdICsgXCIsIFwiICsgcmdiYVsxXSArIFwiLCBcIiArIHJnYmFbMl1cbiAgICAgICAgICAgKyBcIiwgXCIgKyBhbHBoYSArIFwiKVwiO1xufVxuXG5mdW5jdGlvbiBwZXJjZW50U3RyaW5nKHJnYmEsIGFscGhhKSB7XG4gICBpZiAoYWxwaGEgPCAxIHx8IChyZ2JhWzNdICYmIHJnYmFbM10gPCAxKSkge1xuICAgICAgcmV0dXJuIHBlcmNlbnRhU3RyaW5nKHJnYmEsIGFscGhhKTtcbiAgIH1cbiAgIHZhciByID0gTWF0aC5yb3VuZChyZ2JhWzBdLzI1NSAqIDEwMCksXG4gICAgICAgZyA9IE1hdGgucm91bmQocmdiYVsxXS8yNTUgKiAxMDApLFxuICAgICAgIGIgPSBNYXRoLnJvdW5kKHJnYmFbMl0vMjU1ICogMTAwKTtcblxuICAgcmV0dXJuIFwicmdiKFwiICsgciArIFwiJSwgXCIgKyBnICsgXCIlLCBcIiArIGIgKyBcIiUpXCI7XG59XG5cbmZ1bmN0aW9uIHBlcmNlbnRhU3RyaW5nKHJnYmEsIGFscGhhKSB7XG4gICB2YXIgciA9IE1hdGgucm91bmQocmdiYVswXS8yNTUgKiAxMDApLFxuICAgICAgIGcgPSBNYXRoLnJvdW5kKHJnYmFbMV0vMjU1ICogMTAwKSxcbiAgICAgICBiID0gTWF0aC5yb3VuZChyZ2JhWzJdLzI1NSAqIDEwMCk7XG4gICByZXR1cm4gXCJyZ2JhKFwiICsgciArIFwiJSwgXCIgKyBnICsgXCIlLCBcIiArIGIgKyBcIiUsIFwiICsgKGFscGhhIHx8IHJnYmFbM10gfHwgMSkgKyBcIilcIjtcbn1cblxuZnVuY3Rpb24gaHNsU3RyaW5nKGhzbGEsIGFscGhhKSB7XG4gICBpZiAoYWxwaGEgPCAxIHx8IChoc2xhWzNdICYmIGhzbGFbM10gPCAxKSkge1xuICAgICAgcmV0dXJuIGhzbGFTdHJpbmcoaHNsYSwgYWxwaGEpO1xuICAgfVxuICAgcmV0dXJuIFwiaHNsKFwiICsgaHNsYVswXSArIFwiLCBcIiArIGhzbGFbMV0gKyBcIiUsIFwiICsgaHNsYVsyXSArIFwiJSlcIjtcbn1cblxuZnVuY3Rpb24gaHNsYVN0cmluZyhoc2xhLCBhbHBoYSkge1xuICAgaWYgKGFscGhhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFscGhhID0gKGhzbGFbM10gIT09IHVuZGVmaW5lZCA/IGhzbGFbM10gOiAxKTtcbiAgIH1cbiAgIHJldHVybiBcImhzbGEoXCIgKyBoc2xhWzBdICsgXCIsIFwiICsgaHNsYVsxXSArIFwiJSwgXCIgKyBoc2xhWzJdICsgXCIlLCBcIlxuICAgICAgICAgICArIGFscGhhICsgXCIpXCI7XG59XG5cbi8vIGh3YiBpcyBhIGJpdCBkaWZmZXJlbnQgdGhhbiByZ2IoYSkgJiBoc2woYSkgc2luY2UgdGhlcmUgaXMgbm8gYWxwaGEgc3BlY2lmaWMgc3ludGF4XG4vLyAoaHdiIGhhdmUgYWxwaGEgb3B0aW9uYWwgJiAxIGlzIGRlZmF1bHQgdmFsdWUpXG5mdW5jdGlvbiBod2JTdHJpbmcoaHdiLCBhbHBoYSkge1xuICAgaWYgKGFscGhhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFscGhhID0gKGh3YlszXSAhPT0gdW5kZWZpbmVkID8gaHdiWzNdIDogMSk7XG4gICB9XG4gICByZXR1cm4gXCJod2IoXCIgKyBod2JbMF0gKyBcIiwgXCIgKyBod2JbMV0gKyBcIiUsIFwiICsgaHdiWzJdICsgXCIlXCJcbiAgICAgICAgICAgKyAoYWxwaGEgIT09IHVuZGVmaW5lZCAmJiBhbHBoYSAhPT0gMSA/IFwiLCBcIiArIGFscGhhIDogXCJcIikgKyBcIilcIjtcbn1cblxuZnVuY3Rpb24ga2V5d29yZChyZ2IpIHtcbiAgcmV0dXJuIHJldmVyc2VOYW1lc1tyZ2Iuc2xpY2UoMCwgMyldO1xufVxuXG4vLyBoZWxwZXJzXG5mdW5jdGlvbiBzY2FsZShudW0sIG1pbiwgbWF4KSB7XG4gICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobWluLCBudW0pLCBtYXgpO1xufVxuXG5mdW5jdGlvbiBoZXhEb3VibGUobnVtKSB7XG4gIHZhciBzdHIgPSBudW0udG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG4gIHJldHVybiAoc3RyLmxlbmd0aCA8IDIpID8gXCIwXCIgKyBzdHIgOiBzdHI7XG59XG5cblxuLy9jcmVhdGUgYSBsaXN0IG9mIHJldmVyc2UgY29sb3IgbmFtZXNcbnZhciByZXZlcnNlTmFtZXMgPSB7fTtcbmZvciAodmFyIG5hbWUgaW4gY29sb3JOYW1lcykge1xuICAgcmV2ZXJzZU5hbWVzW2NvbG9yTmFtZXNbbmFtZV1dID0gbmFtZTtcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0ge1xyXG5cdFwiYWxpY2VibHVlXCI6IFsyNDAsIDI0OCwgMjU1XSxcclxuXHRcImFudGlxdWV3aGl0ZVwiOiBbMjUwLCAyMzUsIDIxNV0sXHJcblx0XCJhcXVhXCI6IFswLCAyNTUsIDI1NV0sXHJcblx0XCJhcXVhbWFyaW5lXCI6IFsxMjcsIDI1NSwgMjEyXSxcclxuXHRcImF6dXJlXCI6IFsyNDAsIDI1NSwgMjU1XSxcclxuXHRcImJlaWdlXCI6IFsyNDUsIDI0NSwgMjIwXSxcclxuXHRcImJpc3F1ZVwiOiBbMjU1LCAyMjgsIDE5Nl0sXHJcblx0XCJibGFja1wiOiBbMCwgMCwgMF0sXHJcblx0XCJibGFuY2hlZGFsbW9uZFwiOiBbMjU1LCAyMzUsIDIwNV0sXHJcblx0XCJibHVlXCI6IFswLCAwLCAyNTVdLFxyXG5cdFwiYmx1ZXZpb2xldFwiOiBbMTM4LCA0MywgMjI2XSxcclxuXHRcImJyb3duXCI6IFsxNjUsIDQyLCA0Ml0sXHJcblx0XCJidXJseXdvb2RcIjogWzIyMiwgMTg0LCAxMzVdLFxyXG5cdFwiY2FkZXRibHVlXCI6IFs5NSwgMTU4LCAxNjBdLFxyXG5cdFwiY2hhcnRyZXVzZVwiOiBbMTI3LCAyNTUsIDBdLFxyXG5cdFwiY2hvY29sYXRlXCI6IFsyMTAsIDEwNSwgMzBdLFxyXG5cdFwiY29yYWxcIjogWzI1NSwgMTI3LCA4MF0sXHJcblx0XCJjb3JuZmxvd2VyYmx1ZVwiOiBbMTAwLCAxNDksIDIzN10sXHJcblx0XCJjb3Juc2lsa1wiOiBbMjU1LCAyNDgsIDIyMF0sXHJcblx0XCJjcmltc29uXCI6IFsyMjAsIDIwLCA2MF0sXHJcblx0XCJjeWFuXCI6IFswLCAyNTUsIDI1NV0sXHJcblx0XCJkYXJrYmx1ZVwiOiBbMCwgMCwgMTM5XSxcclxuXHRcImRhcmtjeWFuXCI6IFswLCAxMzksIDEzOV0sXHJcblx0XCJkYXJrZ29sZGVucm9kXCI6IFsxODQsIDEzNCwgMTFdLFxyXG5cdFwiZGFya2dyYXlcIjogWzE2OSwgMTY5LCAxNjldLFxyXG5cdFwiZGFya2dyZWVuXCI6IFswLCAxMDAsIDBdLFxyXG5cdFwiZGFya2dyZXlcIjogWzE2OSwgMTY5LCAxNjldLFxyXG5cdFwiZGFya2toYWtpXCI6IFsxODksIDE4MywgMTA3XSxcclxuXHRcImRhcmttYWdlbnRhXCI6IFsxMzksIDAsIDEzOV0sXHJcblx0XCJkYXJrb2xpdmVncmVlblwiOiBbODUsIDEwNywgNDddLFxyXG5cdFwiZGFya29yYW5nZVwiOiBbMjU1LCAxNDAsIDBdLFxyXG5cdFwiZGFya29yY2hpZFwiOiBbMTUzLCA1MCwgMjA0XSxcclxuXHRcImRhcmtyZWRcIjogWzEzOSwgMCwgMF0sXHJcblx0XCJkYXJrc2FsbW9uXCI6IFsyMzMsIDE1MCwgMTIyXSxcclxuXHRcImRhcmtzZWFncmVlblwiOiBbMTQzLCAxODgsIDE0M10sXHJcblx0XCJkYXJrc2xhdGVibHVlXCI6IFs3MiwgNjEsIDEzOV0sXHJcblx0XCJkYXJrc2xhdGVncmF5XCI6IFs0NywgNzksIDc5XSxcclxuXHRcImRhcmtzbGF0ZWdyZXlcIjogWzQ3LCA3OSwgNzldLFxyXG5cdFwiZGFya3R1cnF1b2lzZVwiOiBbMCwgMjA2LCAyMDldLFxyXG5cdFwiZGFya3Zpb2xldFwiOiBbMTQ4LCAwLCAyMTFdLFxyXG5cdFwiZGVlcHBpbmtcIjogWzI1NSwgMjAsIDE0N10sXHJcblx0XCJkZWVwc2t5Ymx1ZVwiOiBbMCwgMTkxLCAyNTVdLFxyXG5cdFwiZGltZ3JheVwiOiBbMTA1LCAxMDUsIDEwNV0sXHJcblx0XCJkaW1ncmV5XCI6IFsxMDUsIDEwNSwgMTA1XSxcclxuXHRcImRvZGdlcmJsdWVcIjogWzMwLCAxNDQsIDI1NV0sXHJcblx0XCJmaXJlYnJpY2tcIjogWzE3OCwgMzQsIDM0XSxcclxuXHRcImZsb3JhbHdoaXRlXCI6IFsyNTUsIDI1MCwgMjQwXSxcclxuXHRcImZvcmVzdGdyZWVuXCI6IFszNCwgMTM5LCAzNF0sXHJcblx0XCJmdWNoc2lhXCI6IFsyNTUsIDAsIDI1NV0sXHJcblx0XCJnYWluc2Jvcm9cIjogWzIyMCwgMjIwLCAyMjBdLFxyXG5cdFwiZ2hvc3R3aGl0ZVwiOiBbMjQ4LCAyNDgsIDI1NV0sXHJcblx0XCJnb2xkXCI6IFsyNTUsIDIxNSwgMF0sXHJcblx0XCJnb2xkZW5yb2RcIjogWzIxOCwgMTY1LCAzMl0sXHJcblx0XCJncmF5XCI6IFsxMjgsIDEyOCwgMTI4XSxcclxuXHRcImdyZWVuXCI6IFswLCAxMjgsIDBdLFxyXG5cdFwiZ3JlZW55ZWxsb3dcIjogWzE3MywgMjU1LCA0N10sXHJcblx0XCJncmV5XCI6IFsxMjgsIDEyOCwgMTI4XSxcclxuXHRcImhvbmV5ZGV3XCI6IFsyNDAsIDI1NSwgMjQwXSxcclxuXHRcImhvdHBpbmtcIjogWzI1NSwgMTA1LCAxODBdLFxyXG5cdFwiaW5kaWFucmVkXCI6IFsyMDUsIDkyLCA5Ml0sXHJcblx0XCJpbmRpZ29cIjogWzc1LCAwLCAxMzBdLFxyXG5cdFwiaXZvcnlcIjogWzI1NSwgMjU1LCAyNDBdLFxyXG5cdFwia2hha2lcIjogWzI0MCwgMjMwLCAxNDBdLFxyXG5cdFwibGF2ZW5kZXJcIjogWzIzMCwgMjMwLCAyNTBdLFxyXG5cdFwibGF2ZW5kZXJibHVzaFwiOiBbMjU1LCAyNDAsIDI0NV0sXHJcblx0XCJsYXduZ3JlZW5cIjogWzEyNCwgMjUyLCAwXSxcclxuXHRcImxlbW9uY2hpZmZvblwiOiBbMjU1LCAyNTAsIDIwNV0sXHJcblx0XCJsaWdodGJsdWVcIjogWzE3MywgMjE2LCAyMzBdLFxyXG5cdFwibGlnaHRjb3JhbFwiOiBbMjQwLCAxMjgsIDEyOF0sXHJcblx0XCJsaWdodGN5YW5cIjogWzIyNCwgMjU1LCAyNTVdLFxyXG5cdFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogWzI1MCwgMjUwLCAyMTBdLFxyXG5cdFwibGlnaHRncmF5XCI6IFsyMTEsIDIxMSwgMjExXSxcclxuXHRcImxpZ2h0Z3JlZW5cIjogWzE0NCwgMjM4LCAxNDRdLFxyXG5cdFwibGlnaHRncmV5XCI6IFsyMTEsIDIxMSwgMjExXSxcclxuXHRcImxpZ2h0cGlua1wiOiBbMjU1LCAxODIsIDE5M10sXHJcblx0XCJsaWdodHNhbG1vblwiOiBbMjU1LCAxNjAsIDEyMl0sXHJcblx0XCJsaWdodHNlYWdyZWVuXCI6IFszMiwgMTc4LCAxNzBdLFxyXG5cdFwibGlnaHRza3libHVlXCI6IFsxMzUsIDIwNiwgMjUwXSxcclxuXHRcImxpZ2h0c2xhdGVncmF5XCI6IFsxMTksIDEzNiwgMTUzXSxcclxuXHRcImxpZ2h0c2xhdGVncmV5XCI6IFsxMTksIDEzNiwgMTUzXSxcclxuXHRcImxpZ2h0c3RlZWxibHVlXCI6IFsxNzYsIDE5NiwgMjIyXSxcclxuXHRcImxpZ2h0eWVsbG93XCI6IFsyNTUsIDI1NSwgMjI0XSxcclxuXHRcImxpbWVcIjogWzAsIDI1NSwgMF0sXHJcblx0XCJsaW1lZ3JlZW5cIjogWzUwLCAyMDUsIDUwXSxcclxuXHRcImxpbmVuXCI6IFsyNTAsIDI0MCwgMjMwXSxcclxuXHRcIm1hZ2VudGFcIjogWzI1NSwgMCwgMjU1XSxcclxuXHRcIm1hcm9vblwiOiBbMTI4LCAwLCAwXSxcclxuXHRcIm1lZGl1bWFxdWFtYXJpbmVcIjogWzEwMiwgMjA1LCAxNzBdLFxyXG5cdFwibWVkaXVtYmx1ZVwiOiBbMCwgMCwgMjA1XSxcclxuXHRcIm1lZGl1bW9yY2hpZFwiOiBbMTg2LCA4NSwgMjExXSxcclxuXHRcIm1lZGl1bXB1cnBsZVwiOiBbMTQ3LCAxMTIsIDIxOV0sXHJcblx0XCJtZWRpdW1zZWFncmVlblwiOiBbNjAsIDE3OSwgMTEzXSxcclxuXHRcIm1lZGl1bXNsYXRlYmx1ZVwiOiBbMTIzLCAxMDQsIDIzOF0sXHJcblx0XCJtZWRpdW1zcHJpbmdncmVlblwiOiBbMCwgMjUwLCAxNTRdLFxyXG5cdFwibWVkaXVtdHVycXVvaXNlXCI6IFs3MiwgMjA5LCAyMDRdLFxyXG5cdFwibWVkaXVtdmlvbGV0cmVkXCI6IFsxOTksIDIxLCAxMzNdLFxyXG5cdFwibWlkbmlnaHRibHVlXCI6IFsyNSwgMjUsIDExMl0sXHJcblx0XCJtaW50Y3JlYW1cIjogWzI0NSwgMjU1LCAyNTBdLFxyXG5cdFwibWlzdHlyb3NlXCI6IFsyNTUsIDIyOCwgMjI1XSxcclxuXHRcIm1vY2Nhc2luXCI6IFsyNTUsIDIyOCwgMTgxXSxcclxuXHRcIm5hdmFqb3doaXRlXCI6IFsyNTUsIDIyMiwgMTczXSxcclxuXHRcIm5hdnlcIjogWzAsIDAsIDEyOF0sXHJcblx0XCJvbGRsYWNlXCI6IFsyNTMsIDI0NSwgMjMwXSxcclxuXHRcIm9saXZlXCI6IFsxMjgsIDEyOCwgMF0sXHJcblx0XCJvbGl2ZWRyYWJcIjogWzEwNywgMTQyLCAzNV0sXHJcblx0XCJvcmFuZ2VcIjogWzI1NSwgMTY1LCAwXSxcclxuXHRcIm9yYW5nZXJlZFwiOiBbMjU1LCA2OSwgMF0sXHJcblx0XCJvcmNoaWRcIjogWzIxOCwgMTEyLCAyMTRdLFxyXG5cdFwicGFsZWdvbGRlbnJvZFwiOiBbMjM4LCAyMzIsIDE3MF0sXHJcblx0XCJwYWxlZ3JlZW5cIjogWzE1MiwgMjUxLCAxNTJdLFxyXG5cdFwicGFsZXR1cnF1b2lzZVwiOiBbMTc1LCAyMzgsIDIzOF0sXHJcblx0XCJwYWxldmlvbGV0cmVkXCI6IFsyMTksIDExMiwgMTQ3XSxcclxuXHRcInBhcGF5YXdoaXBcIjogWzI1NSwgMjM5LCAyMTNdLFxyXG5cdFwicGVhY2hwdWZmXCI6IFsyNTUsIDIxOCwgMTg1XSxcclxuXHRcInBlcnVcIjogWzIwNSwgMTMzLCA2M10sXHJcblx0XCJwaW5rXCI6IFsyNTUsIDE5MiwgMjAzXSxcclxuXHRcInBsdW1cIjogWzIyMSwgMTYwLCAyMjFdLFxyXG5cdFwicG93ZGVyYmx1ZVwiOiBbMTc2LCAyMjQsIDIzMF0sXHJcblx0XCJwdXJwbGVcIjogWzEyOCwgMCwgMTI4XSxcclxuXHRcInJlYmVjY2FwdXJwbGVcIjogWzEwMiwgNTEsIDE1M10sXHJcblx0XCJyZWRcIjogWzI1NSwgMCwgMF0sXHJcblx0XCJyb3N5YnJvd25cIjogWzE4OCwgMTQzLCAxNDNdLFxyXG5cdFwicm95YWxibHVlXCI6IFs2NSwgMTA1LCAyMjVdLFxyXG5cdFwic2FkZGxlYnJvd25cIjogWzEzOSwgNjksIDE5XSxcclxuXHRcInNhbG1vblwiOiBbMjUwLCAxMjgsIDExNF0sXHJcblx0XCJzYW5keWJyb3duXCI6IFsyNDQsIDE2NCwgOTZdLFxyXG5cdFwic2VhZ3JlZW5cIjogWzQ2LCAxMzksIDg3XSxcclxuXHRcInNlYXNoZWxsXCI6IFsyNTUsIDI0NSwgMjM4XSxcclxuXHRcInNpZW5uYVwiOiBbMTYwLCA4MiwgNDVdLFxyXG5cdFwic2lsdmVyXCI6IFsxOTIsIDE5MiwgMTkyXSxcclxuXHRcInNreWJsdWVcIjogWzEzNSwgMjA2LCAyMzVdLFxyXG5cdFwic2xhdGVibHVlXCI6IFsxMDYsIDkwLCAyMDVdLFxyXG5cdFwic2xhdGVncmF5XCI6IFsxMTIsIDEyOCwgMTQ0XSxcclxuXHRcInNsYXRlZ3JleVwiOiBbMTEyLCAxMjgsIDE0NF0sXHJcblx0XCJzbm93XCI6IFsyNTUsIDI1MCwgMjUwXSxcclxuXHRcInNwcmluZ2dyZWVuXCI6IFswLCAyNTUsIDEyN10sXHJcblx0XCJzdGVlbGJsdWVcIjogWzcwLCAxMzAsIDE4MF0sXHJcblx0XCJ0YW5cIjogWzIxMCwgMTgwLCAxNDBdLFxyXG5cdFwidGVhbFwiOiBbMCwgMTI4LCAxMjhdLFxyXG5cdFwidGhpc3RsZVwiOiBbMjE2LCAxOTEsIDIxNl0sXHJcblx0XCJ0b21hdG9cIjogWzI1NSwgOTksIDcxXSxcclxuXHRcInR1cnF1b2lzZVwiOiBbNjQsIDIyNCwgMjA4XSxcclxuXHRcInZpb2xldFwiOiBbMjM4LCAxMzAsIDIzOF0sXHJcblx0XCJ3aGVhdFwiOiBbMjQ1LCAyMjIsIDE3OV0sXHJcblx0XCJ3aGl0ZVwiOiBbMjU1LCAyNTUsIDI1NV0sXHJcblx0XCJ3aGl0ZXNtb2tlXCI6IFsyNDUsIDI0NSwgMjQ1XSxcclxuXHRcInllbGxvd1wiOiBbMjU1LCAyNTUsIDBdLFxyXG5cdFwieWVsbG93Z3JlZW5cIjogWzE1NCwgMjA1LCA1MF1cclxufTsiLCIvKlxuICBodHRwczovL2dpdGh1Yi5jb20vYmFua3NlYW4gd3JhcHBlZCBNYWtvdG8gTWF0c3Vtb3RvIGFuZCBUYWt1amkgTmlzaGltdXJhJ3MgY29kZSBpbiBhIG5hbWVzcGFjZVxuICBzbyBpdCdzIGJldHRlciBlbmNhcHN1bGF0ZWQuIE5vdyB5b3UgY2FuIGhhdmUgbXVsdGlwbGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3JzXG4gIGFuZCB0aGV5IHdvbid0IHN0b21wIGFsbCBvdmVyIGVhY2hvdGhlcidzIHN0YXRlLlxuICBcbiAgSWYgeW91IHdhbnQgdG8gdXNlIHRoaXMgYXMgYSBzdWJzdGl0dXRlIGZvciBNYXRoLnJhbmRvbSgpLCB1c2UgdGhlIHJhbmRvbSgpXG4gIG1ldGhvZCBsaWtlIHNvOlxuICBcbiAgdmFyIG0gPSBuZXcgTWVyc2VubmVUd2lzdGVyKCk7XG4gIHZhciByYW5kb21OdW1iZXIgPSBtLnJhbmRvbSgpO1xuICBcbiAgWW91IGNhbiBhbHNvIGNhbGwgdGhlIG90aGVyIGdlbnJhbmRfe2Zvb30oKSBtZXRob2RzIG9uIHRoZSBpbnN0YW5jZS5cbiBcbiAgSWYgeW91IHdhbnQgdG8gdXNlIGEgc3BlY2lmaWMgc2VlZCBpbiBvcmRlciB0byBnZXQgYSByZXBlYXRhYmxlIHJhbmRvbVxuICBzZXF1ZW5jZSwgcGFzcyBhbiBpbnRlZ2VyIGludG8gdGhlIGNvbnN0cnVjdG9yOlxuIFxuICB2YXIgbSA9IG5ldyBNZXJzZW5uZVR3aXN0ZXIoMTIzKTtcbiBcbiAgYW5kIHRoYXQgd2lsbCBhbHdheXMgcHJvZHVjZSB0aGUgc2FtZSByYW5kb20gc2VxdWVuY2UuXG4gXG4gIFNlYW4gTWNDdWxsb3VnaCAoYmFua3NlYW5AZ21haWwuY29tKVxuKi9cbiBcbi8qIFxuICAgQSBDLXByb2dyYW0gZm9yIE1UMTk5MzcsIHdpdGggaW5pdGlhbGl6YXRpb24gaW1wcm92ZWQgMjAwMi8xLzI2LlxuICAgQ29kZWQgYnkgVGFrdWppIE5pc2hpbXVyYSBhbmQgTWFrb3RvIE1hdHN1bW90by5cbiBcbiAgIEJlZm9yZSB1c2luZywgaW5pdGlhbGl6ZSB0aGUgc3RhdGUgYnkgdXNpbmcgaW5pdF9zZWVkKHNlZWQpICBcbiAgIG9yIGluaXRfYnlfYXJyYXkoaW5pdF9rZXksIGtleV9sZW5ndGgpLlxuIFxuICAgQ29weXJpZ2h0IChDKSAxOTk3IC0gMjAwMiwgTWFrb3RvIE1hdHN1bW90byBhbmQgVGFrdWppIE5pc2hpbXVyYSxcbiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICBcbiBcbiAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zXG4gICBhcmUgbWV0OlxuIFxuICAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gXG4gICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0XG4gICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiBcbiAgICAgMy4gVGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBcbiAgICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIFxuICAgICAgICBwZXJtaXNzaW9uLlxuIFxuICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICAgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1JcbiAgIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLFxuICAgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLFxuICAgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SXG4gICBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GXG4gICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElOR1xuICAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTXG4gICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiBcbiBcbiAgIEFueSBmZWVkYmFjayBpcyB2ZXJ5IHdlbGNvbWUuXG4gICBodHRwOi8vd3d3Lm1hdGguc2NpLmhpcm9zaGltYS11LmFjLmpwL35tLW1hdC9NVC9lbXQuaHRtbFxuICAgZW1haWw6IG0tbWF0IEAgbWF0aC5zY2kuaGlyb3NoaW1hLXUuYWMuanAgKHJlbW92ZSBzcGFjZSlcbiovXG4gXG52YXIgTWVyc2VubmVUd2lzdGVyID0gZnVuY3Rpb24oc2VlZCkge1xuXHRpZiAoc2VlZCA9PSB1bmRlZmluZWQpIHtcblx0XHRzZWVkID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG5cdH0gXG5cblx0LyogUGVyaW9kIHBhcmFtZXRlcnMgKi8gIFxuXHR0aGlzLk4gPSA2MjQ7XG5cdHRoaXMuTSA9IDM5Nztcblx0dGhpcy5NQVRSSVhfQSA9IDB4OTkwOGIwZGY7ICAgLyogY29uc3RhbnQgdmVjdG9yIGEgKi9cblx0dGhpcy5VUFBFUl9NQVNLID0gMHg4MDAwMDAwMDsgLyogbW9zdCBzaWduaWZpY2FudCB3LXIgYml0cyAqL1xuXHR0aGlzLkxPV0VSX01BU0sgPSAweDdmZmZmZmZmOyAvKiBsZWFzdCBzaWduaWZpY2FudCByIGJpdHMgKi9cblxuXHR0aGlzLm10ID0gbmV3IEFycmF5KHRoaXMuTik7IC8qIHRoZSBhcnJheSBmb3IgdGhlIHN0YXRlIHZlY3RvciAqL1xuXHR0aGlzLm10aT10aGlzLk4rMTsgLyogbXRpPT1OKzEgbWVhbnMgbXRbTl0gaXMgbm90IGluaXRpYWxpemVkICovXG5cblx0dGhpcy5pbml0X3NlZWQoc2VlZCk7XG59ICBcblxuLyogaW5pdGlhbGl6ZXMgbXRbTl0gd2l0aCBhIHNlZWQgKi9cbi8qIG9yaWdpbiBuYW1lIGluaXRfZ2VucmFuZCAqL1xuTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5pbml0X3NlZWQgPSBmdW5jdGlvbihzKSB7XG5cdHRoaXMubXRbMF0gPSBzID4+PiAwO1xuXHRmb3IgKHRoaXMubXRpPTE7IHRoaXMubXRpPHRoaXMuTjsgdGhpcy5tdGkrKykge1xuXHRcdHZhciBzID0gdGhpcy5tdFt0aGlzLm10aS0xXSBeICh0aGlzLm10W3RoaXMubXRpLTFdID4+PiAzMCk7XG5cdFx0dGhpcy5tdFt0aGlzLm10aV0gPSAoKCgoKHMgJiAweGZmZmYwMDAwKSA+Pj4gMTYpICogMTgxMjQzMzI1MykgPDwgMTYpICsgKHMgJiAweDAwMDBmZmZmKSAqIDE4MTI0MzMyNTMpXG5cdFx0KyB0aGlzLm10aTtcblx0XHQvKiBTZWUgS251dGggVEFPQ1AgVm9sMi4gM3JkIEVkLiBQLjEwNiBmb3IgbXVsdGlwbGllci4gKi9cblx0XHQvKiBJbiB0aGUgcHJldmlvdXMgdmVyc2lvbnMsIE1TQnMgb2YgdGhlIHNlZWQgYWZmZWN0ICAgKi9cblx0XHQvKiBvbmx5IE1TQnMgb2YgdGhlIGFycmF5IG10W10uICAgICAgICAgICAgICAgICAgICAgICAgKi9cblx0XHQvKiAyMDAyLzAxLzA5IG1vZGlmaWVkIGJ5IE1ha290byBNYXRzdW1vdG8gICAgICAgICAgICAgKi9cblx0XHR0aGlzLm10W3RoaXMubXRpXSA+Pj49IDA7XG5cdFx0LyogZm9yID4zMiBiaXQgbWFjaGluZXMgKi9cblx0fVxufVxuXG4vKiBpbml0aWFsaXplIGJ5IGFuIGFycmF5IHdpdGggYXJyYXktbGVuZ3RoICovXG4vKiBpbml0X2tleSBpcyB0aGUgYXJyYXkgZm9yIGluaXRpYWxpemluZyBrZXlzICovXG4vKiBrZXlfbGVuZ3RoIGlzIGl0cyBsZW5ndGggKi9cbi8qIHNsaWdodCBjaGFuZ2UgZm9yIEMrKywgMjAwNC8yLzI2ICovXG5NZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLmluaXRfYnlfYXJyYXkgPSBmdW5jdGlvbihpbml0X2tleSwga2V5X2xlbmd0aCkge1xuXHR2YXIgaSwgaiwgaztcblx0dGhpcy5pbml0X3NlZWQoMTk2NTAyMTgpO1xuXHRpPTE7IGo9MDtcblx0ayA9ICh0aGlzLk4+a2V5X2xlbmd0aCA/IHRoaXMuTiA6IGtleV9sZW5ndGgpO1xuXHRmb3IgKDsgazsgay0tKSB7XG5cdFx0dmFyIHMgPSB0aGlzLm10W2ktMV0gXiAodGhpcy5tdFtpLTFdID4+PiAzMClcblx0XHR0aGlzLm10W2ldID0gKHRoaXMubXRbaV0gXiAoKCgoKHMgJiAweGZmZmYwMDAwKSA+Pj4gMTYpICogMTY2NDUyNSkgPDwgMTYpICsgKChzICYgMHgwMDAwZmZmZikgKiAxNjY0NTI1KSkpXG5cdFx0KyBpbml0X2tleVtqXSArIGo7IC8qIG5vbiBsaW5lYXIgKi9cblx0XHR0aGlzLm10W2ldID4+Pj0gMDsgLyogZm9yIFdPUkRTSVpFID4gMzIgbWFjaGluZXMgKi9cblx0XHRpKys7IGorKztcblx0XHRpZiAoaT49dGhpcy5OKSB7IHRoaXMubXRbMF0gPSB0aGlzLm10W3RoaXMuTi0xXTsgaT0xOyB9XG5cdFx0aWYgKGo+PWtleV9sZW5ndGgpIGo9MDtcblx0fVxuXHRmb3IgKGs9dGhpcy5OLTE7IGs7IGstLSkge1xuXHRcdHZhciBzID0gdGhpcy5tdFtpLTFdIF4gKHRoaXMubXRbaS0xXSA+Pj4gMzApO1xuXHRcdHRoaXMubXRbaV0gPSAodGhpcy5tdFtpXSBeICgoKCgocyAmIDB4ZmZmZjAwMDApID4+PiAxNikgKiAxNTY2MDgzOTQxKSA8PCAxNikgKyAocyAmIDB4MDAwMGZmZmYpICogMTU2NjA4Mzk0MSkpXG5cdFx0LSBpOyAvKiBub24gbGluZWFyICovXG5cdFx0dGhpcy5tdFtpXSA+Pj49IDA7IC8qIGZvciBXT1JEU0laRSA+IDMyIG1hY2hpbmVzICovXG5cdFx0aSsrO1xuXHRcdGlmIChpPj10aGlzLk4pIHsgdGhpcy5tdFswXSA9IHRoaXMubXRbdGhpcy5OLTFdOyBpPTE7IH1cblx0fVxuXG5cdHRoaXMubXRbMF0gPSAweDgwMDAwMDAwOyAvKiBNU0IgaXMgMTsgYXNzdXJpbmcgbm9uLXplcm8gaW5pdGlhbCBhcnJheSAqLyBcbn1cblxuLyogZ2VuZXJhdGVzIGEgcmFuZG9tIG51bWJlciBvbiBbMCwweGZmZmZmZmZmXS1pbnRlcnZhbCAqL1xuLyogb3JpZ2luIG5hbWUgZ2VucmFuZF9pbnQzMiAqL1xuTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5yYW5kb21faW50ID0gZnVuY3Rpb24oKSB7XG5cdHZhciB5O1xuXHR2YXIgbWFnMDEgPSBuZXcgQXJyYXkoMHgwLCB0aGlzLk1BVFJJWF9BKTtcblx0LyogbWFnMDFbeF0gPSB4ICogTUFUUklYX0EgIGZvciB4PTAsMSAqL1xuXG5cdGlmICh0aGlzLm10aSA+PSB0aGlzLk4pIHsgLyogZ2VuZXJhdGUgTiB3b3JkcyBhdCBvbmUgdGltZSAqL1xuXHRcdHZhciBraztcblxuXHRcdGlmICh0aGlzLm10aSA9PSB0aGlzLk4rMSkgIC8qIGlmIGluaXRfc2VlZCgpIGhhcyBub3QgYmVlbiBjYWxsZWQsICovXG5cdFx0XHR0aGlzLmluaXRfc2VlZCg1NDg5KTsgIC8qIGEgZGVmYXVsdCBpbml0aWFsIHNlZWQgaXMgdXNlZCAqL1xuXG5cdFx0Zm9yIChraz0wO2trPHRoaXMuTi10aGlzLk07a2srKykge1xuXHRcdFx0eSA9ICh0aGlzLm10W2trXSZ0aGlzLlVQUEVSX01BU0spfCh0aGlzLm10W2trKzFdJnRoaXMuTE9XRVJfTUFTSyk7XG5cdFx0XHR0aGlzLm10W2trXSA9IHRoaXMubXRba2srdGhpcy5NXSBeICh5ID4+PiAxKSBeIG1hZzAxW3kgJiAweDFdO1xuXHRcdH1cblx0XHRmb3IgKDtrazx0aGlzLk4tMTtraysrKSB7XG5cdFx0XHR5ID0gKHRoaXMubXRba2tdJnRoaXMuVVBQRVJfTUFTSyl8KHRoaXMubXRba2srMV0mdGhpcy5MT1dFUl9NQVNLKTtcblx0XHRcdHRoaXMubXRba2tdID0gdGhpcy5tdFtraysodGhpcy5NLXRoaXMuTildIF4gKHkgPj4+IDEpIF4gbWFnMDFbeSAmIDB4MV07XG5cdFx0fVxuXHRcdHkgPSAodGhpcy5tdFt0aGlzLk4tMV0mdGhpcy5VUFBFUl9NQVNLKXwodGhpcy5tdFswXSZ0aGlzLkxPV0VSX01BU0spO1xuXHRcdHRoaXMubXRbdGhpcy5OLTFdID0gdGhpcy5tdFt0aGlzLk0tMV0gXiAoeSA+Pj4gMSkgXiBtYWcwMVt5ICYgMHgxXTtcblxuXHRcdHRoaXMubXRpID0gMDtcblx0fVxuXG5cdHkgPSB0aGlzLm10W3RoaXMubXRpKytdO1xuXG5cdC8qIFRlbXBlcmluZyAqL1xuXHR5IF49ICh5ID4+PiAxMSk7XG5cdHkgXj0gKHkgPDwgNykgJiAweDlkMmM1NjgwO1xuXHR5IF49ICh5IDw8IDE1KSAmIDB4ZWZjNjAwMDA7XG5cdHkgXj0gKHkgPj4+IDE4KTtcblxuXHRyZXR1cm4geSA+Pj4gMDtcbn1cblxuLyogZ2VuZXJhdGVzIGEgcmFuZG9tIG51bWJlciBvbiBbMCwweDdmZmZmZmZmXS1pbnRlcnZhbCAqL1xuLyogb3JpZ2luIG5hbWUgZ2VucmFuZF9pbnQzMSAqL1xuTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5yYW5kb21faW50MzEgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuICh0aGlzLnJhbmRvbV9pbnQoKT4+PjEpO1xufVxuXG4vKiBnZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIG9uIFswLDFdLXJlYWwtaW50ZXJ2YWwgKi9cbi8qIG9yaWdpbiBuYW1lIGdlbnJhbmRfcmVhbDEgKi9cbk1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUucmFuZG9tX2luY2wgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLjAvNDI5NDk2NzI5NS4wKTsgXG5cdC8qIGRpdmlkZWQgYnkgMl4zMi0xICovIFxufVxuXG4vKiBnZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIG9uIFswLDEpLXJlYWwtaW50ZXJ2YWwgKi9cbk1lcnNlbm5lVHdpc3Rlci5wcm90b3R5cGUucmFuZG9tID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzLnJhbmRvbV9pbnQoKSooMS4wLzQyOTQ5NjcyOTYuMCk7IFxuXHQvKiBkaXZpZGVkIGJ5IDJeMzIgKi9cbn1cblxuLyogZ2VuZXJhdGVzIGEgcmFuZG9tIG51bWJlciBvbiAoMCwxKS1yZWFsLWludGVydmFsICovXG4vKiBvcmlnaW4gbmFtZSBnZW5yYW5kX3JlYWwzICovXG5NZXJzZW5uZVR3aXN0ZXIucHJvdG90eXBlLnJhbmRvbV9leGNsID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiAodGhpcy5yYW5kb21faW50KCkgKyAwLjUpKigxLjAvNDI5NDk2NzI5Ni4wKTsgXG5cdC8qIGRpdmlkZWQgYnkgMl4zMiAqL1xufVxuXG4vKiBnZW5lcmF0ZXMgYSByYW5kb20gbnVtYmVyIG9uIFswLDEpIHdpdGggNTMtYml0IHJlc29sdXRpb24qL1xuLyogb3JpZ2luIG5hbWUgZ2VucmFuZF9yZXM1MyAqL1xuTWVyc2VubmVUd2lzdGVyLnByb3RvdHlwZS5yYW5kb21fbG9uZyA9IGZ1bmN0aW9uKCkgeyBcblx0dmFyIGE9dGhpcy5yYW5kb21faW50KCk+Pj41LCBiPXRoaXMucmFuZG9tX2ludCgpPj4+NjsgXG5cdHJldHVybihhKjY3MTA4ODY0LjArYikqKDEuMC85MDA3MTk5MjU0NzQwOTkyLjApOyBcbn0gXG5cbi8qIFRoZXNlIHJlYWwgdmVyc2lvbnMgYXJlIGR1ZSB0byBJc2FrdSBXYWRhLCAyMDAyLzAxLzA5IGFkZGVkICovXG5cbm1vZHVsZS5leHBvcnRzID0gTWVyc2VubmVUd2lzdGVyO1xuIiwiIWZ1bmN0aW9uIHQoZSxyKXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1yKCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShcIlJhcGhhZWxcIixbXSxyKTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzLlJhcGhhZWw9cigpOmUuUmFwaGFlbD1yKCl9KHRoaXMsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShpKXtpZihyW2ldKXJldHVybiByW2ldLmV4cG9ydHM7dmFyIG49cltpXT17ZXhwb3J0czp7fSxpZDppLGxvYWRlZDohMX07cmV0dXJuIHRbaV0uY2FsbChuLmV4cG9ydHMsbixuLmV4cG9ydHMsZSksbi5sb2FkZWQ9ITAsbi5leHBvcnRzfXZhciByPXt9O3JldHVybiBlLm09dCxlLmM9cixlLnA9XCJcIixlKDApfShbZnVuY3Rpb24odCxlLHIpe3ZhciBpLG47aT1bcigxKSxyKDMpLHIoNCldLG49ZnVuY3Rpb24odCl7cmV0dXJuIHR9LmFwcGx5KGUsaSksISh2b2lkIDAhPT1uJiYodC5leHBvcnRzPW4pKX0sZnVuY3Rpb24odCxlLHIpe3ZhciBpLG47aT1bcigyKV0sbj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHIpe2lmKGUuaXMocixcImZ1bmN0aW9uXCIpKXJldHVybiB3P3IoKTp0Lm9uKFwicmFwaGFlbC5ET01sb2FkXCIscik7aWYoZS5pcyhyLFEpKXJldHVybiBlLl9lbmdpbmUuY3JlYXRlW3pdKGUsci5zcGxpY2UoMCwzK2UuaXMoclswXSwkKSkpLmFkZChyKTt2YXIgaT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7aWYoZS5pcyhpW2kubGVuZ3RoLTFdLFwiZnVuY3Rpb25cIikpe3ZhciBuPWkucG9wKCk7cmV0dXJuIHc/bi5jYWxsKGUuX2VuZ2luZS5jcmVhdGVbel0oZSxpKSk6dC5vbihcInJhcGhhZWwuRE9NbG9hZFwiLGZ1bmN0aW9uKCl7bi5jYWxsKGUuX2VuZ2luZS5jcmVhdGVbel0oZSxpKSl9KX1yZXR1cm4gZS5fZW5naW5lLmNyZWF0ZVt6XShlLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcih0KXtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiB0fHxPYmplY3QodCkhPT10KXJldHVybiB0O3ZhciBlPW5ldyB0LmNvbnN0cnVjdG9yO2Zvcih2YXIgaSBpbiB0KXRbVF0oaSkmJihlW2ldPXIodFtpXSkpO3JldHVybiBlfWZ1bmN0aW9uIGkodCxlKXtmb3IodmFyIHI9MCxpPXQubGVuZ3RoO2k+cjtyKyspaWYodFtyXT09PWUpcmV0dXJuIHQucHVzaCh0LnNwbGljZShyLDEpWzBdKX1mdW5jdGlvbiBuKHQsZSxyKXtmdW5jdGlvbiBuKCl7dmFyIGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLHM9YS5qb2luKFwi4pCAXCIpLG89bi5jYWNoZT1uLmNhY2hlfHx7fSxsPW4uY291bnQ9bi5jb3VudHx8W107cmV0dXJuIG9bVF0ocyk/KGkobCxzKSxyP3Iob1tzXSk6b1tzXSk6KGwubGVuZ3RoPj0xZTMmJmRlbGV0ZSBvW2wuc2hpZnQoKV0sbC5wdXNoKHMpLG9bc109dFt6XShlLGEpLHI/cihvW3NdKTpvW3NdKX1yZXR1cm4gbn1mdW5jdGlvbiBhKCl7cmV0dXJuIHRoaXMuaGV4fWZ1bmN0aW9uIHModCxlKXtmb3IodmFyIHI9W10saT0wLG49dC5sZW5ndGg7bi0yKiFlPmk7aSs9Mil7dmFyIGE9W3t4Oit0W2ktMl0seTordFtpLTFdfSx7eDordFtpXSx5Oit0W2krMV19LHt4Oit0W2krMl0seTordFtpKzNdfSx7eDordFtpKzRdLHk6K3RbaSs1XX1dO2U/aT9uLTQ9PWk/YVszXT17eDordFswXSx5Oit0WzFdfTpuLTI9PWkmJihhWzJdPXt4Oit0WzBdLHk6K3RbMV19LGFbM109e3g6K3RbMl0seTordFszXX0pOmFbMF09e3g6K3Rbbi0yXSx5Oit0W24tMV19Om4tND09aT9hWzNdPWFbMl06aXx8KGFbMF09e3g6K3RbaV0seTordFtpKzFdfSksci5wdXNoKFtcIkNcIiwoLWFbMF0ueCs2KmFbMV0ueCthWzJdLngpLzYsKC1hWzBdLnkrNiphWzFdLnkrYVsyXS55KS82LChhWzFdLngrNiphWzJdLngtYVszXS54KS82LChhWzFdLnkrNiphWzJdLnktYVszXS55KS82LGFbMl0ueCxhWzJdLnldKX1yZXR1cm4gcn1mdW5jdGlvbiBvKHQsZSxyLGksbil7dmFyIGE9LTMqZSs5KnItOSppKzMqbixzPXQqYSs2KmUtMTIqcis2Kmk7cmV0dXJuIHQqcy0zKmUrMypyfWZ1bmN0aW9uIGwodCxlLHIsaSxuLGEscyxsLGgpe251bGw9PWgmJihoPTEpLGg9aD4xPzE6MD5oPzA6aDtmb3IodmFyIHU9aC8yLGM9MTIsZj1bLS4xMjUyLC4xMjUyLC0uMzY3OCwuMzY3OCwtLjU4NzMsLjU4NzMsLS43Njk5LC43Njk5LC0uOTA0MSwuOTA0MSwtLjk4MTYsLjk4MTZdLHA9Wy4yNDkxLC4yNDkxLC4yMzM1LC4yMzM1LC4yMDMyLC4yMDMyLC4xNjAxLC4xNjAxLC4xMDY5LC4xMDY5LC4wNDcyLC4wNDcyXSxkPTAsZz0wO2M+ZztnKyspe3ZhciB4PXUqZltnXSt1LHY9byh4LHQscixuLHMpLHk9byh4LGUsaSxhLGwpLG09dip2K3kqeTtkKz1wW2ddKlkuc3FydChtKX1yZXR1cm4gdSpkfWZ1bmN0aW9uIGgodCxlLHIsaSxuLGEscyxvLGgpe2lmKCEoMD5ofHxsKHQsZSxyLGksbixhLHMsbyk8aCkpe3ZhciB1PTEsYz11LzIsZj11LWMscCxkPS4wMTtmb3IocD1sKHQsZSxyLGksbixhLHMsbyxmKTtIKHAtaCk+ZDspYy89MixmKz0oaD5wPzE6LTEpKmMscD1sKHQsZSxyLGksbixhLHMsbyxmKTtyZXR1cm4gZn19ZnVuY3Rpb24gdSh0LGUscixpLG4sYSxzLG8pe2lmKCEoVyh0LHIpPEcobixzKXx8Ryh0LHIpPlcobixzKXx8VyhlLGkpPEcoYSxvKXx8RyhlLGkpPlcoYSxvKSkpe3ZhciBsPSh0KmktZSpyKSoobi1zKS0odC1yKSoobipvLWEqcyksaD0odCppLWUqcikqKGEtbyktKGUtaSkqKG4qby1hKnMpLHU9KHQtcikqKGEtbyktKGUtaSkqKG4tcyk7aWYodSl7dmFyIGM9bC91LGY9aC91LHA9K2MudG9GaXhlZCgyKSxkPStmLnRvRml4ZWQoMik7aWYoIShwPCtHKHQscikudG9GaXhlZCgyKXx8cD4rVyh0LHIpLnRvRml4ZWQoMil8fHA8K0cobixzKS50b0ZpeGVkKDIpfHxwPitXKG4scykudG9GaXhlZCgyKXx8ZDwrRyhlLGkpLnRvRml4ZWQoMil8fGQ+K1coZSxpKS50b0ZpeGVkKDIpfHxkPCtHKGEsbykudG9GaXhlZCgyKXx8ZD4rVyhhLG8pLnRvRml4ZWQoMikpKXJldHVybnt4OmMseTpmfX19fWZ1bmN0aW9uIGModCxlKXtyZXR1cm4gcCh0LGUpfWZ1bmN0aW9uIGYodCxlKXtyZXR1cm4gcCh0LGUsMSl9ZnVuY3Rpb24gcCh0LHIsaSl7dmFyIG49ZS5iZXppZXJCQm94KHQpLGE9ZS5iZXppZXJCQm94KHIpO2lmKCFlLmlzQkJveEludGVyc2VjdChuLGEpKXJldHVybiBpPzA6W107Zm9yKHZhciBzPWwuYXBwbHkoMCx0KSxvPWwuYXBwbHkoMCxyKSxoPVcofn4ocy81KSwxKSxjPVcofn4oby81KSwxKSxmPVtdLHA9W10sZD17fSxnPWk/MDpbXSx4PTA7aCsxPng7eCsrKXt2YXIgdj1lLmZpbmREb3RzQXRTZWdtZW50LmFwcGx5KGUsdC5jb25jYXQoeC9oKSk7Zi5wdXNoKHt4OnYueCx5OnYueSx0OngvaH0pfWZvcih4PTA7YysxPng7eCsrKXY9ZS5maW5kRG90c0F0U2VnbWVudC5hcHBseShlLHIuY29uY2F0KHgvYykpLHAucHVzaCh7eDp2LngseTp2LnksdDp4L2N9KTtmb3IoeD0wO2g+eDt4KyspZm9yKHZhciB5PTA7Yz55O3krKyl7dmFyIG09Zlt4XSxiPWZbeCsxXSxfPXBbeV0sdz1wW3krMV0saz1IKGIueC1tLngpPC4wMDE/XCJ5XCI6XCJ4XCIsQj1IKHcueC1fLngpPC4wMDE/XCJ5XCI6XCJ4XCIsQz11KG0ueCxtLnksYi54LGIueSxfLngsXy55LHcueCx3LnkpO2lmKEMpe2lmKGRbQy54LnRvRml4ZWQoNCldPT1DLnkudG9GaXhlZCg0KSljb250aW51ZTtkW0MueC50b0ZpeGVkKDQpXT1DLnkudG9GaXhlZCg0KTt2YXIgUz1tLnQrSCgoQ1trXS1tW2tdKS8oYltrXS1tW2tdKSkqKGIudC1tLnQpLFQ9Xy50K0goKENbQl0tX1tCXSkvKHdbQl0tX1tCXSkpKih3LnQtXy50KTtTPj0wJiYxLjAwMT49UyYmVD49MCYmMS4wMDE+PVQmJihpP2crKzpnLnB1c2goe3g6Qy54LHk6Qy55LHQxOkcoUywxKSx0MjpHKFQsMSl9KSl9fXJldHVybiBnfWZ1bmN0aW9uIGQodCxyLGkpe3Q9ZS5fcGF0aDJjdXJ2ZSh0KSxyPWUuX3BhdGgyY3VydmUocik7Zm9yKHZhciBuLGEscyxvLGwsaCx1LGMsZixkLGc9aT8wOltdLHg9MCx2PXQubGVuZ3RoO3Y+eDt4Kyspe3ZhciB5PXRbeF07aWYoXCJNXCI9PXlbMF0pbj1sPXlbMV0sYT1oPXlbMl07ZWxzZXtcIkNcIj09eVswXT8oZj1bbixhXS5jb25jYXQoeS5zbGljZSgxKSksbj1mWzZdLGE9Zls3XSk6KGY9W24sYSxuLGEsbCxoLGwsaF0sbj1sLGE9aCk7Zm9yKHZhciBtPTAsYj1yLmxlbmd0aDtiPm07bSsrKXt2YXIgXz1yW21dO2lmKFwiTVwiPT1fWzBdKXM9dT1fWzFdLG89Yz1fWzJdO2Vsc2V7XCJDXCI9PV9bMF0/KGQ9W3Msb10uY29uY2F0KF8uc2xpY2UoMSkpLHM9ZFs2XSxvPWRbN10pOihkPVtzLG8scyxvLHUsYyx1LGNdLHM9dSxvPWMpO3ZhciB3PXAoZixkLGkpO2lmKGkpZys9dztlbHNle2Zvcih2YXIgaz0wLEI9dy5sZW5ndGg7Qj5rO2srKyl3W2tdLnNlZ21lbnQxPXgsd1trXS5zZWdtZW50Mj1tLHdba10uYmV6MT1mLHdba10uYmV6Mj1kO2c9Zy5jb25jYXQodyl9fX19fXJldHVybiBnfWZ1bmN0aW9uIGcodCxlLHIsaSxuLGEpe251bGwhPXQ/KHRoaXMuYT0rdCx0aGlzLmI9K2UsdGhpcy5jPStyLHRoaXMuZD0raSx0aGlzLmU9K24sdGhpcy5mPSthKToodGhpcy5hPTEsdGhpcy5iPTAsdGhpcy5jPTAsdGhpcy5kPTEsdGhpcy5lPTAsdGhpcy5mPTApfWZ1bmN0aW9uIHgoKXtyZXR1cm4gdGhpcy54K0krdGhpcy55fWZ1bmN0aW9uIHYoKXtyZXR1cm4gdGhpcy54K0krdGhpcy55K0krdGhpcy53aWR0aCtcIiDDlyBcIit0aGlzLmhlaWdodH1mdW5jdGlvbiB5KHQsZSxyLGksbixhKXtmdW5jdGlvbiBzKHQpe3JldHVybigoYyp0K3UpKnQraCkqdH1mdW5jdGlvbiBvKHQsZSl7dmFyIHI9bCh0LGUpO3JldHVybigoZCpyK3ApKnIrZikqcn1mdW5jdGlvbiBsKHQsZSl7dmFyIHIsaSxuLGEsbyxsO2ZvcihuPXQsbD0wOzg+bDtsKyspe2lmKGE9cyhuKS10LEgoYSk8ZSlyZXR1cm4gbjtpZihvPSgzKmMqbisyKnUpKm4raCxIKG8pPDFlLTYpYnJlYWs7bi09YS9vfWlmKHI9MCxpPTEsbj10LHI+bilyZXR1cm4gcjtpZihuPmkpcmV0dXJuIGk7Zm9yKDtpPnI7KXtpZihhPXMobiksSChhLXQpPGUpcmV0dXJuIG47dD5hP3I9bjppPW4sbj0oaS1yKS8yK3J9cmV0dXJuIG59dmFyIGg9MyplLHU9MyooaS1lKS1oLGM9MS1oLXUsZj0zKnIscD0zKihuLXIpLWYsZD0xLWYtcDtyZXR1cm4gbyh0LDEvKDIwMCphKSl9ZnVuY3Rpb24gbSh0LGUpe3ZhciByPVtdLGk9e307aWYodGhpcy5tcz1lLHRoaXMudGltZXM9MSx0KXtmb3IodmFyIG4gaW4gdCl0W1RdKG4pJiYoaVtodChuKV09dFtuXSxyLnB1c2goaHQobikpKTtyLnNvcnQoQnQpfXRoaXMuYW5pbT1pLHRoaXMudG9wPXJbci5sZW5ndGgtMV0sdGhpcy5wZXJjZW50cz1yfWZ1bmN0aW9uIGIocixpLG4sYSxzLG8pe249aHQobik7dmFyIGwsaCx1LGM9W10sZixwLGQseD1yLm1zLHY9e30sbT17fSxiPXt9O2lmKGEpZm9yKHc9MCxCPUVlLmxlbmd0aDtCPnc7dysrKXt2YXIgXz1FZVt3XTtpZihfLmVsLmlkPT1pLmlkJiZfLmFuaW09PXIpe18ucGVyY2VudCE9bj8oRWUuc3BsaWNlKHcsMSksdT0xKTpoPV8saS5hdHRyKF8udG90YWxPcmlnaW4pO2JyZWFrfX1lbHNlIGE9K207Zm9yKHZhciB3PTAsQj1yLnBlcmNlbnRzLmxlbmd0aDtCPnc7dysrKXtpZihyLnBlcmNlbnRzW3ddPT1ufHxyLnBlcmNlbnRzW3ddPmEqci50b3Ape249ci5wZXJjZW50c1t3XSxwPXIucGVyY2VudHNbdy0xXXx8MCx4PXgvci50b3AqKG4tcCksZj1yLnBlcmNlbnRzW3crMV0sbD1yLmFuaW1bbl07YnJlYWt9YSYmaS5hdHRyKHIuYW5pbVtyLnBlcmNlbnRzW3ddXSl9aWYobCl7aWYoaCloLmluaXRzdGF0dXM9YSxoLnN0YXJ0PW5ldyBEYXRlLWgubXMqYTtlbHNle2Zvcih2YXIgQyBpbiBsKWlmKGxbVF0oQykmJihwdFtUXShDKXx8aS5wYXBlci5jdXN0b21BdHRyaWJ1dGVzW1RdKEMpKSlzd2l0Y2godltDXT1pLmF0dHIoQyksbnVsbD09dltDXSYmKHZbQ109ZnRbQ10pLG1bQ109bFtDXSxwdFtDXSl7Y2FzZSAkOmJbQ109KG1bQ10tdltDXSkveDticmVhaztjYXNlXCJjb2xvdXJcIjp2W0NdPWUuZ2V0UkdCKHZbQ10pO3ZhciBTPWUuZ2V0UkdCKG1bQ10pO2JbQ109e3I6KFMuci12W0NdLnIpL3gsZzooUy5nLXZbQ10uZykveCxiOihTLmItdltDXS5iKS94fTticmVhaztjYXNlXCJwYXRoXCI6dmFyIEE9UXQodltDXSxtW0NdKSxFPUFbMV07Zm9yKHZbQ109QVswXSxiW0NdPVtdLHc9MCxCPXZbQ10ubGVuZ3RoO0I+dzt3Kyspe2JbQ11bd109WzBdO2Zvcih2YXIgTj0xLE09dltDXVt3XS5sZW5ndGg7TT5OO04rKyliW0NdW3ddW05dPShFW3ddW05dLXZbQ11bd11bTl0pL3h9YnJlYWs7Y2FzZVwidHJhbnNmb3JtXCI6dmFyIEw9aS5fLHo9bGUoTFtDXSxtW0NdKTtpZih6KWZvcih2W0NdPXouZnJvbSxtW0NdPXoudG8sYltDXT1bXSxiW0NdLnJlYWw9ITAsdz0wLEI9dltDXS5sZW5ndGg7Qj53O3crKylmb3IoYltDXVt3XT1bdltDXVt3XVswXV0sTj0xLE09dltDXVt3XS5sZW5ndGg7TT5OO04rKyliW0NdW3ddW05dPShtW0NdW3ddW05dLXZbQ11bd11bTl0pL3g7ZWxzZXt2YXIgRj1pLm1hdHJpeHx8bmV3IGcsUj17Xzp7dHJhbnNmb3JtOkwudHJhbnNmb3JtfSxnZXRCQm94OmZ1bmN0aW9uKCl7cmV0dXJuIGkuZ2V0QkJveCgxKX19O3ZbQ109W0YuYSxGLmIsRi5jLEYuZCxGLmUsRi5mXSxzZShSLG1bQ10pLG1bQ109Ui5fLnRyYW5zZm9ybSxiW0NdPVsoUi5tYXRyaXguYS1GLmEpL3gsKFIubWF0cml4LmItRi5iKS94LChSLm1hdHJpeC5jLUYuYykveCwoUi5tYXRyaXguZC1GLmQpL3gsKFIubWF0cml4LmUtRi5lKS94LChSLm1hdHJpeC5mLUYuZikveF19YnJlYWs7Y2FzZVwiY3N2XCI6dmFyIEk9aihsW0NdKVtxXShrKSxEPWoodltDXSlbcV0oayk7aWYoXCJjbGlwLXJlY3RcIj09Qylmb3IodltDXT1ELGJbQ109W10sdz1ELmxlbmd0aDt3LS07KWJbQ11bd109KElbd10tdltDXVt3XSkveDttW0NdPUk7YnJlYWs7ZGVmYXVsdDpmb3IoST1bXVtQXShsW0NdKSxEPVtdW1BdKHZbQ10pLGJbQ109W10sdz1pLnBhcGVyLmN1c3RvbUF0dHJpYnV0ZXNbQ10ubGVuZ3RoO3ctLTspYltDXVt3XT0oKElbd118fDApLShEW3ddfHwwKSkveH12YXIgVj1sLmVhc2luZyxPPWUuZWFzaW5nX2Zvcm11bGFzW1ZdO2lmKCFPKWlmKE89aihWKS5tYXRjaChzdCksTyYmNT09Ty5sZW5ndGgpe3ZhciBZPU87Tz1mdW5jdGlvbih0KXtyZXR1cm4geSh0LCtZWzFdLCtZWzJdLCtZWzNdLCtZWzRdLHgpfX1lbHNlIE89U3Q7aWYoZD1sLnN0YXJ0fHxyLnN0YXJ0fHwrbmV3IERhdGUsXz17YW5pbTpyLHBlcmNlbnQ6bix0aW1lc3RhbXA6ZCxzdGFydDpkKyhyLmRlbHx8MCksc3RhdHVzOjAsaW5pdHN0YXR1czphfHwwLHN0b3A6ITEsbXM6eCxlYXNpbmc6Tyxmcm9tOnYsZGlmZjpiLHRvOm0sZWw6aSxjYWxsYmFjazpsLmNhbGxiYWNrLHByZXY6cCxuZXh0OmYscmVwZWF0Om98fHIudGltZXMsb3JpZ2luOmkuYXR0cigpLHRvdGFsT3JpZ2luOnN9LEVlLnB1c2goXyksYSYmIWgmJiF1JiYoXy5zdG9wPSEwLF8uc3RhcnQ9bmV3IERhdGUteCphLDE9PUVlLmxlbmd0aCkpcmV0dXJuIE1lKCk7dSYmKF8uc3RhcnQ9bmV3IERhdGUtXy5tcyphKSwxPT1FZS5sZW5ndGgmJk5lKE1lKX10KFwicmFwaGFlbC5hbmltLnN0YXJ0LlwiK2kuaWQsaSxyKX19ZnVuY3Rpb24gXyh0KXtmb3IodmFyIGU9MDtlPEVlLmxlbmd0aDtlKyspRWVbZV0uZWwucGFwZXI9PXQmJkVlLnNwbGljZShlLS0sMSl9ZS52ZXJzaW9uPVwiQEBWRVJTSU9OXCIsZS5ldmU9dDt2YXIgdyxrPS9bLCBdKy8sQj17Y2lyY2xlOjEscmVjdDoxLHBhdGg6MSxlbGxpcHNlOjEsdGV4dDoxLGltYWdlOjF9LEM9L1xceyhcXGQrKVxcfS9nLFM9XCJwcm90b3R5cGVcIixUPVwiaGFzT3duUHJvcGVydHlcIixBPXtkb2M6ZG9jdW1lbnQsd2luOndpbmRvd30sRT17d2FzOk9iamVjdC5wcm90b3R5cGVbVF0uY2FsbChBLndpbixcIlJhcGhhZWxcIiksaXM6QS53aW4uUmFwaGFlbH0sTj1mdW5jdGlvbigpe3RoaXMuY2E9dGhpcy5jdXN0b21BdHRyaWJ1dGVzPXt9fSxNLEw9XCJhcHBlbmRDaGlsZFwiLHo9XCJhcHBseVwiLFA9XCJjb25jYXRcIixGPVwib250b3VjaHN0YXJ0XCJpbiBBLndpbnx8QS53aW4uRG9jdW1lbnRUb3VjaCYmQS5kb2MgaW5zdGFuY2VvZiBEb2N1bWVudFRvdWNoLFI9XCJcIixJPVwiIFwiLGo9U3RyaW5nLHE9XCJzcGxpdFwiLEQ9XCJjbGljayBkYmxjbGljayBtb3VzZWRvd24gbW91c2Vtb3ZlIG1vdXNlb3V0IG1vdXNlb3ZlciBtb3VzZXVwIHRvdWNoc3RhcnQgdG91Y2htb3ZlIHRvdWNoZW5kIHRvdWNoY2FuY2VsXCJbcV0oSSksVj17bW91c2Vkb3duOlwidG91Y2hzdGFydFwiLG1vdXNlbW92ZTpcInRvdWNobW92ZVwiLG1vdXNldXA6XCJ0b3VjaGVuZFwifSxPPWoucHJvdG90eXBlLnRvTG93ZXJDYXNlLFk9TWF0aCxXPVkubWF4LEc9WS5taW4sSD1ZLmFicyxYPVkucG93LFU9WS5QSSwkPVwibnVtYmVyXCIsWj1cInN0cmluZ1wiLFE9XCJhcnJheVwiLEo9XCJ0b1N0cmluZ1wiLEs9XCJmaWxsXCIsdHQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxldD17fSxydD1cInB1c2hcIixpdD1lLl9JU1VSTD0vXnVybFxcKFsnXCJdPyguKz8pWydcIl0/XFwpJC9pLG50PS9eXFxzKigoI1thLWZcXGRdezZ9KXwoI1thLWZcXGRdezN9KXxyZ2JhP1xcKFxccyooW1xcZFxcLl0rJT9cXHMqLFxccypbXFxkXFwuXSslP1xccyosXFxzKltcXGRcXC5dKyU/KD86XFxzKixcXHMqW1xcZFxcLl0rJT8pPylcXHMqXFwpfGhzYmE/XFwoXFxzKihbXFxkXFwuXSsoPzpkZWd8XFx4YjB8JSk/XFxzKixcXHMqW1xcZFxcLl0rJT9cXHMqLFxccypbXFxkXFwuXSsoPzolP1xccyosXFxzKltcXGRcXC5dKyk/KSU/XFxzKlxcKXxoc2xhP1xcKFxccyooW1xcZFxcLl0rKD86ZGVnfFxceGIwfCUpP1xccyosXFxzKltcXGRcXC5dKyU/XFxzKixcXHMqW1xcZFxcLl0rKD86JT9cXHMqLFxccypbXFxkXFwuXSspPyklP1xccypcXCkpXFxzKiQvaSxhdD17TmFOOjEsSW5maW5pdHk6MSxcIi1JbmZpbml0eVwiOjF9LHN0PS9eKD86Y3ViaWMtKT9iZXppZXJcXCgoW14sXSspLChbXixdKyksKFteLF0rKSwoW15cXCldKylcXCkvLG90PVkucm91bmQsbHQ9XCJzZXRBdHRyaWJ1dGVcIixodD1wYXJzZUZsb2F0LHV0PXBhcnNlSW50LGN0PWoucHJvdG90eXBlLnRvVXBwZXJDYXNlLGZ0PWUuX2F2YWlsYWJsZUF0dHJzPXtcImFycm93LWVuZFwiOlwibm9uZVwiLFwiYXJyb3ctc3RhcnRcIjpcIm5vbmVcIixibHVyOjAsXCJjbGlwLXJlY3RcIjpcIjAgMCAxZTkgMWU5XCIsY3Vyc29yOlwiZGVmYXVsdFwiLGN4OjAsY3k6MCxmaWxsOlwiI2ZmZlwiLFwiZmlsbC1vcGFjaXR5XCI6MSxmb250OicxMHB4IFwiQXJpYWxcIicsXCJmb250LWZhbWlseVwiOidcIkFyaWFsXCInLFwiZm9udC1zaXplXCI6XCIxMFwiLFwiZm9udC1zdHlsZVwiOlwibm9ybWFsXCIsXCJmb250LXdlaWdodFwiOjQwMCxncmFkaWVudDowLGhlaWdodDowLGhyZWY6XCJodHRwOi8vcmFwaGFlbGpzLmNvbS9cIixcImxldHRlci1zcGFjaW5nXCI6MCxvcGFjaXR5OjEscGF0aDpcIk0wLDBcIixyOjAscng6MCxyeTowLHNyYzpcIlwiLHN0cm9rZTpcIiMwMDBcIixcInN0cm9rZS1kYXNoYXJyYXlcIjpcIlwiLFwic3Ryb2tlLWxpbmVjYXBcIjpcImJ1dHRcIixcInN0cm9rZS1saW5lam9pblwiOlwiYnV0dFwiLFwic3Ryb2tlLW1pdGVybGltaXRcIjowLFwic3Ryb2tlLW9wYWNpdHlcIjoxLFwic3Ryb2tlLXdpZHRoXCI6MSx0YXJnZXQ6XCJfYmxhbmtcIixcInRleHQtYW5jaG9yXCI6XCJtaWRkbGVcIix0aXRsZTpcIlJhcGhhZWxcIix0cmFuc2Zvcm06XCJcIix3aWR0aDowLHg6MCx5OjB9LHB0PWUuX2F2YWlsYWJsZUFuaW1BdHRycz17Ymx1cjokLFwiY2xpcC1yZWN0XCI6XCJjc3ZcIixjeDokLGN5OiQsZmlsbDpcImNvbG91clwiLFwiZmlsbC1vcGFjaXR5XCI6JCxcImZvbnQtc2l6ZVwiOiQsaGVpZ2h0OiQsb3BhY2l0eTokLHBhdGg6XCJwYXRoXCIscjokLHJ4OiQscnk6JCxzdHJva2U6XCJjb2xvdXJcIixcInN0cm9rZS1vcGFjaXR5XCI6JCxcInN0cm9rZS13aWR0aFwiOiQsdHJhbnNmb3JtOlwidHJhbnNmb3JtXCIsd2lkdGg6JCx4OiQseTokfSxkdD0vW1xceDA5XFx4MGFcXHgwYlxceDBjXFx4MGRcXHgyMFxceGEwXFx1MTY4MFxcdTE4MGVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwYVxcdTIwMmZcXHUyMDVmXFx1MzAwMFxcdTIwMjhcXHUyMDI5XS9nLGd0PS9bXFx4MDlcXHgwYVxceDBiXFx4MGNcXHgwZFxceDIwXFx4YTBcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwXFx1MjAyOFxcdTIwMjldKixbXFx4MDlcXHgwYVxceDBiXFx4MGNcXHgwZFxceDIwXFx4YTBcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwXFx1MjAyOFxcdTIwMjldKi8seHQ9e2hzOjEscmc6MX0sdnQ9Lyw/KFthY2hsbXFyc3R2eHpdKSw/L2dpLHl0PS8oW2FjaGxtcnFzdHZ6XSlbXFx4MDlcXHgwYVxceDBiXFx4MGNcXHgwZFxceDIwXFx4YTBcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwXFx1MjAyOFxcdTIwMjksXSooKC0/XFxkKlxcLj9cXGQqKD86ZVtcXC0rXT9cXGQrKT9bXFx4MDlcXHgwYVxceDBiXFx4MGNcXHgwZFxceDIwXFx4YTBcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwXFx1MjAyOFxcdTIwMjldKiw/W1xceDA5XFx4MGFcXHgwYlxceDBjXFx4MGRcXHgyMFxceGEwXFx1MTY4MFxcdTE4MGVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwYVxcdTIwMmZcXHUyMDVmXFx1MzAwMFxcdTIwMjhcXHUyMDI5XSopKykvZ2ksbXQ9LyhbcnN0bV0pW1xceDA5XFx4MGFcXHgwYlxceDBjXFx4MGRcXHgyMFxceGEwXFx1MTY4MFxcdTE4MGVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwYVxcdTIwMmZcXHUyMDVmXFx1MzAwMFxcdTIwMjhcXHUyMDI5LF0qKCgtP1xcZCpcXC4/XFxkKig/OmVbXFwtK10/XFxkKyk/W1xceDA5XFx4MGFcXHgwYlxceDBjXFx4MGRcXHgyMFxceGEwXFx1MTY4MFxcdTE4MGVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwYVxcdTIwMmZcXHUyMDVmXFx1MzAwMFxcdTIwMjhcXHUyMDI5XSosP1tcXHgwOVxceDBhXFx4MGJcXHgwY1xceDBkXFx4MjBcXHhhMFxcdTE2ODBcXHUxODBlXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDBcXHUyMDI4XFx1MjAyOV0qKSspL2dpLGJ0PS8oLT9cXGQqXFwuP1xcZCooPzplW1xcLStdP1xcZCspPylbXFx4MDlcXHgwYVxceDBiXFx4MGNcXHgwZFxceDIwXFx4YTBcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwXFx1MjAyOFxcdTIwMjldKiw/W1xceDA5XFx4MGFcXHgwYlxceDBjXFx4MGRcXHgyMFxceGEwXFx1MTY4MFxcdTE4MGVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwYVxcdTIwMmZcXHUyMDVmXFx1MzAwMFxcdTIwMjhcXHUyMDI5XSovZ2ksX3Q9ZS5fcmFkaWFsX2dyYWRpZW50PS9ecig/OlxcKChbXixdKz8pW1xceDA5XFx4MGFcXHgwYlxceDBjXFx4MGRcXHgyMFxceGEwXFx1MTY4MFxcdTE4MGVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwYVxcdTIwMmZcXHUyMDVmXFx1MzAwMFxcdTIwMjhcXHUyMDI5XSosW1xceDA5XFx4MGFcXHgwYlxceDBjXFx4MGRcXHgyMFxceGEwXFx1MTY4MFxcdTE4MGVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwYVxcdTIwMmZcXHUyMDVmXFx1MzAwMFxcdTIwMjhcXHUyMDI5XSooW15cXCldKz8pXFwpKT8vLHd0PXt9LGt0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQua2V5LWUua2V5fSxCdD1mdW5jdGlvbih0LGUpe3JldHVybiBodCh0KS1odChlKX0sQ3Q9ZnVuY3Rpb24oKXt9LFN0PWZ1bmN0aW9uKHQpe3JldHVybiB0fSxUdD1lLl9yZWN0UGF0aD1mdW5jdGlvbih0LGUscixpLG4pe3JldHVybiBuP1tbXCJNXCIsdCtuLGVdLFtcImxcIixyLTIqbiwwXSxbXCJhXCIsbixuLDAsMCwxLG4sbl0sW1wibFwiLDAsaS0yKm5dLFtcImFcIixuLG4sMCwwLDEsLW4sbl0sW1wibFwiLDIqbi1yLDBdLFtcImFcIixuLG4sMCwwLDEsLW4sLW5dLFtcImxcIiwwLDIqbi1pXSxbXCJhXCIsbixuLDAsMCwxLG4sLW5dLFtcInpcIl1dOltbXCJNXCIsdCxlXSxbXCJsXCIsciwwXSxbXCJsXCIsMCxpXSxbXCJsXCIsLXIsMF0sW1wielwiXV19LEF0PWZ1bmN0aW9uKHQsZSxyLGkpe3JldHVybiBudWxsPT1pJiYoaT1yKSxbW1wiTVwiLHQsZV0sW1wibVwiLDAsLWldLFtcImFcIixyLGksMCwxLDEsMCwyKmldLFtcImFcIixyLGksMCwxLDEsMCwtMippXSxbXCJ6XCJdXX0sRXQ9ZS5fZ2V0UGF0aD17cGF0aDpmdW5jdGlvbih0KXtyZXR1cm4gdC5hdHRyKFwicGF0aFwiKX0sY2lyY2xlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuYXR0cnM7cmV0dXJuIEF0KGUuY3gsZS5jeSxlLnIpfSxlbGxpcHNlOmZ1bmN0aW9uKHQpe3ZhciBlPXQuYXR0cnM7cmV0dXJuIEF0KGUuY3gsZS5jeSxlLnJ4LGUucnkpfSxyZWN0OmZ1bmN0aW9uKHQpe3ZhciBlPXQuYXR0cnM7cmV0dXJuIFR0KGUueCxlLnksZS53aWR0aCxlLmhlaWdodCxlLnIpfSxpbWFnZTpmdW5jdGlvbih0KXt2YXIgZT10LmF0dHJzO3JldHVybiBUdChlLngsZS55LGUud2lkdGgsZS5oZWlnaHQpfSx0ZXh0OmZ1bmN0aW9uKHQpe3ZhciBlPXQuX2dldEJCb3goKTtyZXR1cm4gVHQoZS54LGUueSxlLndpZHRoLGUuaGVpZ2h0KX0sc2V0OmZ1bmN0aW9uKHQpe3ZhciBlPXQuX2dldEJCb3goKTtyZXR1cm4gVHQoZS54LGUueSxlLndpZHRoLGUuaGVpZ2h0KX19LE50PWUubWFwUGF0aD1mdW5jdGlvbih0LGUpe2lmKCFlKXJldHVybiB0O3ZhciByLGksbixhLHMsbyxsO2Zvcih0PVF0KHQpLG49MCxzPXQubGVuZ3RoO3M+bjtuKyspZm9yKGw9dFtuXSxhPTEsbz1sLmxlbmd0aDtvPmE7YSs9MilyPWUueChsW2FdLGxbYSsxXSksaT1lLnkobFthXSxsW2ErMV0pLGxbYV09cixsW2ErMV09aTtyZXR1cm4gdH07aWYoZS5fZz1BLGUudHlwZT1BLndpbi5TVkdBbmdsZXx8QS5kb2MuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZShcImh0dHA6Ly93d3cudzMub3JnL1RSL1NWRzExL2ZlYXR1cmUjQmFzaWNTdHJ1Y3R1cmVcIixcIjEuMVwiKT9cIlNWR1wiOlwiVk1MXCIsXCJWTUxcIj09ZS50eXBlKXt2YXIgTXQ9QS5kb2MuY3JlYXRlRWxlbWVudChcImRpdlwiKSxMdDtpZihNdC5pbm5lckhUTUw9Jzx2OnNoYXBlIGFkaj1cIjFcIi8+JyxMdD1NdC5maXJzdENoaWxkLEx0LnN0eWxlLmJlaGF2aW9yPVwidXJsKCNkZWZhdWx0I1ZNTClcIiwhTHR8fFwib2JqZWN0XCIhPXR5cGVvZiBMdC5hZGopcmV0dXJuIGUudHlwZT1SO010PW51bGx9ZS5zdmc9IShlLnZtbD1cIlZNTFwiPT1lLnR5cGUpLGUuX1BhcGVyPU4sZS5mbj1NPU4ucHJvdG90eXBlPWUucHJvdG90eXBlLGUuX2lkPTAsZS5fb2lkPTAsZS5pcz1mdW5jdGlvbih0LGUpe3JldHVybiBlPU8uY2FsbChlKSxcImZpbml0ZVwiPT1lPyFhdFtUXSgrdCk6XCJhcnJheVwiPT1lP3QgaW5zdGFuY2VvZiBBcnJheTpcIm51bGxcIj09ZSYmbnVsbD09PXR8fGU9PXR5cGVvZiB0JiZudWxsIT09dHx8XCJvYmplY3RcIj09ZSYmdD09PU9iamVjdCh0KXx8XCJhcnJheVwiPT1lJiZBcnJheS5pc0FycmF5JiZBcnJheS5pc0FycmF5KHQpfHx0dC5jYWxsKHQpLnNsaWNlKDgsLTEpLnRvTG93ZXJDYXNlKCk9PWV9LGUuYW5nbGU9ZnVuY3Rpb24odCxyLGksbixhLHMpe2lmKG51bGw9PWEpe3ZhciBvPXQtaSxsPXItbjtyZXR1cm4gb3x8bD8oMTgwKzE4MCpZLmF0YW4yKC1sLC1vKS9VKzM2MCklMzYwOjB9cmV0dXJuIGUuYW5nbGUodCxyLGEscyktZS5hbmdsZShpLG4sYSxzKX0sZS5yYWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQlMzYwKlUvMTgwfSxlLmRlZz1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCgxODAqdC9VJTM2MCoxZTMpLzFlM30sZS5zbmFwVG89ZnVuY3Rpb24odCxyLGkpe2lmKGk9ZS5pcyhpLFwiZmluaXRlXCIpP2k6MTAsZS5pcyh0LFEpKXtmb3IodmFyIG49dC5sZW5ndGg7bi0tOylpZihIKHRbbl0tcik8PWkpcmV0dXJuIHRbbl19ZWxzZXt0PSt0O3ZhciBhPXIldDtpZihpPmEpcmV0dXJuIHItYTtpZihhPnQtaSlyZXR1cm4gci1hK3R9cmV0dXJuIHJ9O3ZhciB6dD1lLmNyZWF0ZVVVSUQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm5cInh4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eFwiLnJlcGxhY2UodCxlKS50b1VwcGVyQ2FzZSgpfX0oL1t4eV0vZyxmdW5jdGlvbih0KXt2YXIgZT0xNipZLnJhbmRvbSgpfDAscj1cInhcIj09dD9lOjMmZXw4O3JldHVybiByLnRvU3RyaW5nKDE2KX0pO2Uuc2V0V2luZG93PWZ1bmN0aW9uKHIpe3QoXCJyYXBoYWVsLnNldFdpbmRvd1wiLGUsQS53aW4sciksQS53aW49cixBLmRvYz1BLndpbi5kb2N1bWVudCxlLl9lbmdpbmUuaW5pdFdpbiYmZS5fZW5naW5lLmluaXRXaW4oQS53aW4pfTt2YXIgUHQ9ZnVuY3Rpb24odCl7aWYoZS52bWwpe3ZhciByPS9eXFxzK3xcXHMrJC9nLGk7dHJ5e3ZhciBhPW5ldyBBY3RpdmVYT2JqZWN0KFwiaHRtbGZpbGVcIik7YS53cml0ZShcIjxib2R5PlwiKSxhLmNsb3NlKCksaT1hLmJvZHl9Y2F0Y2gocyl7aT1jcmVhdGVQb3B1cCgpLmRvY3VtZW50LmJvZHl9dmFyIG89aS5jcmVhdGVUZXh0UmFuZ2UoKTtQdD1uKGZ1bmN0aW9uKHQpe3RyeXtpLnN0eWxlLmNvbG9yPWoodCkucmVwbGFjZShyLFIpO3ZhciBlPW8ucXVlcnlDb21tYW5kVmFsdWUoXCJGb3JlQ29sb3JcIik7cmV0dXJuIGU9KDI1NSZlKTw8MTZ8NjUyODAmZXwoMTY3MTE2ODAmZSk+Pj4xNixcIiNcIisoXCIwMDAwMDBcIitlLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTYpfWNhdGNoKG4pe3JldHVyblwibm9uZVwifX0pfWVsc2V7dmFyIGw9QS5kb2MuY3JlYXRlRWxlbWVudChcImlcIik7bC50aXRsZT1cIlJhcGhhw6tsIENvbG91ciBQaWNrZXJcIixsLnN0eWxlLmRpc3BsYXk9XCJub25lXCIsQS5kb2MuYm9keS5hcHBlbmRDaGlsZChsKSxQdD1uKGZ1bmN0aW9uKHQpe3JldHVybiBsLnN0eWxlLmNvbG9yPXQsQS5kb2MuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShsLFIpLmdldFByb3BlcnR5VmFsdWUoXCJjb2xvclwiKX0pfXJldHVybiBQdCh0KX0sRnQ9ZnVuY3Rpb24oKXtyZXR1cm5cImhzYihcIitbdGhpcy5oLHRoaXMucyx0aGlzLmJdK1wiKVwifSxSdD1mdW5jdGlvbigpe3JldHVyblwiaHNsKFwiK1t0aGlzLmgsdGhpcy5zLHRoaXMubF0rXCIpXCJ9LEl0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGV4fSxqdD1mdW5jdGlvbih0LHIsaSl7aWYobnVsbD09ciYmZS5pcyh0LFwib2JqZWN0XCIpJiZcInJcImluIHQmJlwiZ1wiaW4gdCYmXCJiXCJpbiB0JiYoaT10LmIscj10LmcsdD10LnIpLG51bGw9PXImJmUuaXModCxaKSl7dmFyIG49ZS5nZXRSR0IodCk7dD1uLnIscj1uLmcsaT1uLmJ9cmV0dXJuKHQ+MXx8cj4xfHxpPjEpJiYodC89MjU1LHIvPTI1NSxpLz0yNTUpLFt0LHIsaV19LHF0PWZ1bmN0aW9uKHQscixpLG4pe3QqPTI1NSxyKj0yNTUsaSo9MjU1O3ZhciBhPXtyOnQsZzpyLGI6aSxoZXg6ZS5yZ2IodCxyLGkpLHRvU3RyaW5nOkl0fTtyZXR1cm4gZS5pcyhuLFwiZmluaXRlXCIpJiYoYS5vcGFjaXR5PW4pLGF9O2UuY29sb3I9ZnVuY3Rpb24odCl7dmFyIHI7cmV0dXJuIGUuaXModCxcIm9iamVjdFwiKSYmXCJoXCJpbiB0JiZcInNcImluIHQmJlwiYlwiaW4gdD8ocj1lLmhzYjJyZ2IodCksdC5yPXIucix0Lmc9ci5nLHQuYj1yLmIsdC5oZXg9ci5oZXgpOmUuaXModCxcIm9iamVjdFwiKSYmXCJoXCJpbiB0JiZcInNcImluIHQmJlwibFwiaW4gdD8ocj1lLmhzbDJyZ2IodCksdC5yPXIucix0Lmc9ci5nLHQuYj1yLmIsdC5oZXg9ci5oZXgpOihlLmlzKHQsXCJzdHJpbmdcIikmJih0PWUuZ2V0UkdCKHQpKSxlLmlzKHQsXCJvYmplY3RcIikmJlwiclwiaW4gdCYmXCJnXCJpbiB0JiZcImJcImluIHQ/KHI9ZS5yZ2IyaHNsKHQpLHQuaD1yLmgsdC5zPXIucyx0Lmw9ci5sLHI9ZS5yZ2IyaHNiKHQpLHQudj1yLmIpOih0PXtoZXg6XCJub25lXCJ9LHQucj10Lmc9dC5iPXQuaD10LnM9dC52PXQubD0tMSkpLHQudG9TdHJpbmc9SXQsdH0sZS5oc2IycmdiPWZ1bmN0aW9uKHQsZSxyLGkpe3RoaXMuaXModCxcIm9iamVjdFwiKSYmXCJoXCJpbiB0JiZcInNcImluIHQmJlwiYlwiaW4gdCYmKHI9dC5iLGU9dC5zLGk9dC5vLHQ9dC5oKSx0Kj0zNjA7dmFyIG4sYSxzLG8sbDtyZXR1cm4gdD10JTM2MC82MCxsPXIqZSxvPWwqKDEtSCh0JTItMSkpLG49YT1zPXItbCx0PX5+dCxuKz1bbCxvLDAsMCxvLGxdW3RdLGErPVtvLGwsbCxvLDAsMF1bdF0scys9WzAsMCxvLGwsbCxvXVt0XSxxdChuLGEscyxpKX0sZS5oc2wycmdiPWZ1bmN0aW9uKHQsZSxyLGkpe3RoaXMuaXModCxcIm9iamVjdFwiKSYmXCJoXCJpbiB0JiZcInNcImluIHQmJlwibFwiaW4gdCYmKHI9dC5sLGU9dC5zLHQ9dC5oKSwodD4xfHxlPjF8fHI+MSkmJih0Lz0zNjAsZS89MTAwLHIvPTEwMCksdCo9MzYwO3ZhciBuLGEscyxvLGw7cmV0dXJuIHQ9dCUzNjAvNjAsbD0yKmUqKC41PnI/cjoxLXIpLG89bCooMS1IKHQlMi0xKSksbj1hPXM9ci1sLzIsdD1+fnQsbis9W2wsbywwLDAsbyxsXVt0XSxhKz1bbyxsLGwsbywwLDBdW3RdLHMrPVswLDAsbyxsLGwsb11bdF0scXQobixhLHMsaSl9LGUucmdiMmhzYj1mdW5jdGlvbih0LGUscil7cj1qdCh0LGUsciksdD1yWzBdLGU9clsxXSxyPXJbMl07dmFyIGksbixhLHM7cmV0dXJuIGE9Vyh0LGUscikscz1hLUcodCxlLHIpLGk9MD09cz9udWxsOmE9PXQ/KGUtcikvczphPT1lPyhyLXQpL3MrMjoodC1lKS9zKzQsaT0oaSszNjApJTYqNjAvMzYwLG49MD09cz8wOnMvYSx7aDppLHM6bixiOmEsdG9TdHJpbmc6RnR9fSxlLnJnYjJoc2w9ZnVuY3Rpb24odCxlLHIpe3I9anQodCxlLHIpLHQ9clswXSxlPXJbMV0scj1yWzJdO3ZhciBpLG4sYSxzLG8sbDtyZXR1cm4gcz1XKHQsZSxyKSxvPUcodCxlLHIpLGw9cy1vLGk9MD09bD9udWxsOnM9PXQ/KGUtcikvbDpzPT1lPyhyLXQpL2wrMjoodC1lKS9sKzQsaT0oaSszNjApJTYqNjAvMzYwLGE9KHMrbykvMixuPTA9PWw/MDouNT5hP2wvKDIqYSk6bC8oMi0yKmEpLHtoOmksczpuLGw6YSx0b1N0cmluZzpSdH19LGUuX3BhdGgyc3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuam9pbihcIixcIikucmVwbGFjZSh2dCxcIiQxXCIpfTt2YXIgRHQ9ZS5fcHJlbG9hZD1mdW5jdGlvbih0LGUpe3ZhciByPUEuZG9jLmNyZWF0ZUVsZW1lbnQoXCJpbWdcIik7ci5zdHlsZS5jc3NUZXh0PVwicG9zaXRpb246YWJzb2x1dGU7bGVmdDotOTk5OWVtO3RvcDotOTk5OWVtXCIsci5vbmxvYWQ9ZnVuY3Rpb24oKXtlLmNhbGwodGhpcyksdGhpcy5vbmxvYWQ9bnVsbCxBLmRvYy5ib2R5LnJlbW92ZUNoaWxkKHRoaXMpfSxyLm9uZXJyb3I9ZnVuY3Rpb24oKXtBLmRvYy5ib2R5LnJlbW92ZUNoaWxkKHRoaXMpfSxBLmRvYy5ib2R5LmFwcGVuZENoaWxkKHIpLHIuc3JjPXR9O2UuZ2V0UkdCPW4oZnVuY3Rpb24odCl7aWYoIXR8fCh0PWoodCkpLmluZGV4T2YoXCItXCIpKzEpcmV0dXJue3I6LTEsZzotMSxiOi0xLGhleDpcIm5vbmVcIixlcnJvcjoxLHRvU3RyaW5nOmF9O2lmKFwibm9uZVwiPT10KXJldHVybntyOi0xLGc6LTEsYjotMSxoZXg6XCJub25lXCIsdG9TdHJpbmc6YX07ISh4dFtUXSh0LnRvTG93ZXJDYXNlKCkuc3Vic3RyaW5nKDAsMikpfHxcIiNcIj09dC5jaGFyQXQoKSkmJih0PVB0KHQpKTt2YXIgcixpLG4scyxvLGwsaCx1PXQubWF0Y2gobnQpO3JldHVybiB1Pyh1WzJdJiYocz11dCh1WzJdLnN1YnN0cmluZyg1KSwxNiksbj11dCh1WzJdLnN1YnN0cmluZygzLDUpLDE2KSxpPXV0KHVbMl0uc3Vic3RyaW5nKDEsMyksMTYpKSx1WzNdJiYocz11dCgobD11WzNdLmNoYXJBdCgzKSkrbCwxNiksbj11dCgobD11WzNdLmNoYXJBdCgyKSkrbCwxNiksaT11dCgobD11WzNdLmNoYXJBdCgxKSkrbCwxNikpLHVbNF0mJihoPXVbNF1bcV0oZ3QpLGk9aHQoaFswXSksXCIlXCI9PWhbMF0uc2xpY2UoLTEpJiYoaSo9Mi41NSksbj1odChoWzFdKSxcIiVcIj09aFsxXS5zbGljZSgtMSkmJihuKj0yLjU1KSxzPWh0KGhbMl0pLFwiJVwiPT1oWzJdLnNsaWNlKC0xKSYmKHMqPTIuNTUpLFwicmdiYVwiPT11WzFdLnRvTG93ZXJDYXNlKCkuc2xpY2UoMCw0KSYmKG89aHQoaFszXSkpLGhbM10mJlwiJVwiPT1oWzNdLnNsaWNlKC0xKSYmKG8vPTEwMCkpLHVbNV0/KGg9dVs1XVtxXShndCksaT1odChoWzBdKSxcIiVcIj09aFswXS5zbGljZSgtMSkmJihpKj0yLjU1KSxuPWh0KGhbMV0pLFwiJVwiPT1oWzFdLnNsaWNlKC0xKSYmKG4qPTIuNTUpLHM9aHQoaFsyXSksXCIlXCI9PWhbMl0uc2xpY2UoLTEpJiYocyo9Mi41NSksKFwiZGVnXCI9PWhbMF0uc2xpY2UoLTMpfHxcIsKwXCI9PWhbMF0uc2xpY2UoLTEpKSYmKGkvPTM2MCksXCJoc2JhXCI9PXVbMV0udG9Mb3dlckNhc2UoKS5zbGljZSgwLDQpJiYobz1odChoWzNdKSksaFszXSYmXCIlXCI9PWhbM10uc2xpY2UoLTEpJiYoby89MTAwKSxlLmhzYjJyZ2IoaSxuLHMsbykpOnVbNl0/KGg9dVs2XVtxXShndCksaT1odChoWzBdKSxcIiVcIj09aFswXS5zbGljZSgtMSkmJihpKj0yLjU1KSxuPWh0KGhbMV0pLFwiJVwiPT1oWzFdLnNsaWNlKC0xKSYmKG4qPTIuNTUpLHM9aHQoaFsyXSksXCIlXCI9PWhbMl0uc2xpY2UoLTEpJiYocyo9Mi41NSksKFwiZGVnXCI9PWhbMF0uc2xpY2UoLTMpfHxcIsKwXCI9PWhbMF0uc2xpY2UoLTEpKSYmKGkvPTM2MCksXCJoc2xhXCI9PXVbMV0udG9Mb3dlckNhc2UoKS5zbGljZSgwLDQpJiYobz1odChoWzNdKSksaFszXSYmXCIlXCI9PWhbM10uc2xpY2UoLTEpJiYoby89MTAwKSxlLmhzbDJyZ2IoaSxuLHMsbykpOih1PXtyOmksZzpuLGI6cyx0b1N0cmluZzphfSx1LmhleD1cIiNcIisoMTY3NzcyMTZ8c3xuPDw4fGk8PDE2KS50b1N0cmluZygxNikuc2xpY2UoMSksZS5pcyhvLFwiZmluaXRlXCIpJiYodS5vcGFjaXR5PW8pLHUpKTp7cjotMSxnOi0xLGI6LTEsaGV4Olwibm9uZVwiLGVycm9yOjEsdG9TdHJpbmc6YX19LGUpLGUuaHNiPW4oZnVuY3Rpb24odCxyLGkpe3JldHVybiBlLmhzYjJyZ2IodCxyLGkpLmhleH0pLGUuaHNsPW4oZnVuY3Rpb24odCxyLGkpe3JldHVybiBlLmhzbDJyZ2IodCxyLGkpLmhleH0pLGUucmdiPW4oZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIGkodCl7cmV0dXJuIHQrLjV8MH1yZXR1cm5cIiNcIisoMTY3NzcyMTZ8aShyKXxpKGUpPDw4fGkodCk8PDE2KS50b1N0cmluZygxNikuc2xpY2UoMSl9KSxlLmdldENvbG9yPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0Q29sb3Iuc3RhcnQ9dGhpcy5nZXRDb2xvci5zdGFydHx8e2g6MCxzOjEsYjp0fHwuNzV9LHI9dGhpcy5oc2IycmdiKGUuaCxlLnMsZS5iKTtyZXR1cm4gZS5oKz0uMDc1LGUuaD4xJiYoZS5oPTAsZS5zLT0uMixlLnM8PTAmJih0aGlzLmdldENvbG9yLnN0YXJ0PXtoOjAsczoxLGI6ZS5ifSkpLHIuaGV4fSxlLmdldENvbG9yLnJlc2V0PWZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMuc3RhcnR9LGUucGFyc2VQYXRoU3RyaW5nPWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiBudWxsO3ZhciByPVZ0KHQpO2lmKHIuYXJyKXJldHVybiBZdChyLmFycik7dmFyIGk9e2E6NyxjOjYsaDoxLGw6MixtOjIscjo0LHE6NCxzOjQsdDoyLHY6MSx6OjB9LG49W107cmV0dXJuIGUuaXModCxRKSYmZS5pcyh0WzBdLFEpJiYobj1ZdCh0KSksbi5sZW5ndGh8fGoodCkucmVwbGFjZSh5dCxmdW5jdGlvbih0LGUscil7dmFyIGE9W10scz1lLnRvTG93ZXJDYXNlKCk7aWYoci5yZXBsYWNlKGJ0LGZ1bmN0aW9uKHQsZSl7ZSYmYS5wdXNoKCtlKX0pLFwibVwiPT1zJiZhLmxlbmd0aD4yJiYobi5wdXNoKFtlXVtQXShhLnNwbGljZSgwLDIpKSkscz1cImxcIixlPVwibVwiPT1lP1wibFwiOlwiTFwiKSxcInJcIj09cyluLnB1c2goW2VdW1BdKGEpKTtlbHNlIGZvcig7YS5sZW5ndGg+PWlbc10mJihuLnB1c2goW2VdW1BdKGEuc3BsaWNlKDAsaVtzXSkpKSxpW3NdKTspO30pLG4udG9TdHJpbmc9ZS5fcGF0aDJzdHJpbmcsci5hcnI9WXQobiksbn0sZS5wYXJzZVRyYW5zZm9ybVN0cmluZz1uKGZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiBudWxsO3ZhciByPXtyOjMsczo0LHQ6MixtOjZ9LGk9W107cmV0dXJuIGUuaXModCxRKSYmZS5pcyh0WzBdLFEpJiYoaT1ZdCh0KSksaS5sZW5ndGh8fGoodCkucmVwbGFjZShtdCxmdW5jdGlvbih0LGUscil7dmFyIG49W10sYT1PLmNhbGwoZSk7ci5yZXBsYWNlKGJ0LGZ1bmN0aW9uKHQsZSl7ZSYmbi5wdXNoKCtlKX0pLGkucHVzaChbZV1bUF0obikpfSksaS50b1N0cmluZz1lLl9wYXRoMnN0cmluZyxpfSk7dmFyIFZ0PWZ1bmN0aW9uKHQpe3ZhciBlPVZ0LnBzPVZ0LnBzfHx7fTtyZXR1cm4gZVt0XT9lW3RdLnNsZWVwPTEwMDplW3RdPXtzbGVlcDoxMDB9LHNldFRpbWVvdXQoZnVuY3Rpb24oKXtmb3IodmFyIHIgaW4gZSllW1RdKHIpJiZyIT10JiYoZVtyXS5zbGVlcC0tLCFlW3JdLnNsZWVwJiZkZWxldGUgZVtyXSl9KSxlW3RdfTtlLmZpbmREb3RzQXRTZWdtZW50PWZ1bmN0aW9uKHQsZSxyLGksbixhLHMsbyxsKXt2YXIgaD0xLWwsdT1YKGgsMyksYz1YKGgsMiksZj1sKmwscD1mKmwsZD11KnQrMypjKmwqciszKmgqbCpsKm4rcCpzLGc9dSplKzMqYypsKmkrMypoKmwqbCphK3Aqbyx4PXQrMipsKihyLXQpK2YqKG4tMipyK3QpLHY9ZSsyKmwqKGktZSkrZiooYS0yKmkrZSkseT1yKzIqbCoobi1yKStmKihzLTIqbityKSxtPWkrMipsKihhLWkpK2YqKG8tMiphK2kpLGI9aCp0K2wqcixfPWgqZStsKmksdz1oKm4rbCpzLGs9aCphK2wqbyxCPTkwLTE4MCpZLmF0YW4yKHgteSx2LW0pL1U7cmV0dXJuKHg+eXx8bT52KSYmKEIrPTE4MCkse3g6ZCx5OmcsbTp7eDp4LHk6dn0sbjp7eDp5LHk6bX0sc3RhcnQ6e3g6Yix5Ol99LGVuZDp7eDp3LHk6a30sYWxwaGE6Qn19LGUuYmV6aWVyQkJveD1mdW5jdGlvbih0LHIsaSxuLGEscyxvLGwpe2UuaXModCxcImFycmF5XCIpfHwodD1bdCxyLGksbixhLHMsbyxsXSk7dmFyIGg9WnQuYXBwbHkobnVsbCx0KTtyZXR1cm57eDpoLm1pbi54LHk6aC5taW4ueSx4MjpoLm1heC54LHkyOmgubWF4Lnksd2lkdGg6aC5tYXgueC1oLm1pbi54LGhlaWdodDpoLm1heC55LWgubWluLnl9fSxlLmlzUG9pbnRJbnNpZGVCQm94PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gZT49dC54JiZlPD10LngyJiZyPj10LnkmJnI8PXQueTJ9LGUuaXNCQm94SW50ZXJzZWN0PWZ1bmN0aW9uKHQscil7dmFyIGk9ZS5pc1BvaW50SW5zaWRlQkJveDtyZXR1cm4gaShyLHQueCx0LnkpfHxpKHIsdC54Mix0LnkpfHxpKHIsdC54LHQueTIpfHxpKHIsdC54Mix0LnkyKXx8aSh0LHIueCxyLnkpfHxpKHQsci54MixyLnkpfHxpKHQsci54LHIueTIpfHxpKHQsci54MixyLnkyKXx8KHQueDxyLngyJiZ0Lng+ci54fHxyLng8dC54MiYmci54PnQueCkmJih0Lnk8ci55MiYmdC55PnIueXx8ci55PHQueTImJnIueT50LnkpfSxlLnBhdGhJbnRlcnNlY3Rpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gZCh0LGUpfSxlLnBhdGhJbnRlcnNlY3Rpb25OdW1iZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZCh0LGUsMSl9LGUuaXNQb2ludEluc2lkZVBhdGg9ZnVuY3Rpb24odCxyLGkpe3ZhciBuPWUucGF0aEJCb3godCk7cmV0dXJuIGUuaXNQb2ludEluc2lkZUJCb3gobixyLGkpJiZkKHQsW1tcIk1cIixyLGldLFtcIkhcIixuLngyKzEwXV0sMSklMj09MX0sZS5fcmVtb3ZlZEZhY3Rvcnk9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dChcInJhcGhhZWwubG9nXCIsbnVsbCxcIlJhcGhhw6tsOiB5b3UgYXJlIGNhbGxpbmcgdG8gbWV0aG9kIOKAnFwiK2UrXCLigJ0gb2YgcmVtb3ZlZCBvYmplY3RcIixlKX19O3ZhciBPdD1lLnBhdGhCQm94PWZ1bmN0aW9uKHQpe3ZhciBlPVZ0KHQpO2lmKGUuYmJveClyZXR1cm4gcihlLmJib3gpO2lmKCF0KXJldHVybnt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjAseDI6MCx5MjowfTt0PVF0KHQpO2Zvcih2YXIgaT0wLG49MCxhPVtdLHM9W10sbyxsPTAsaD10Lmxlbmd0aDtoPmw7bCsrKWlmKG89dFtsXSxcIk1cIj09b1swXSlpPW9bMV0sbj1vWzJdLGEucHVzaChpKSxzLnB1c2gobik7ZWxzZXt2YXIgdT1adChpLG4sb1sxXSxvWzJdLG9bM10sb1s0XSxvWzVdLG9bNl0pO2E9YVtQXSh1Lm1pbi54LHUubWF4LngpLHM9c1tQXSh1Lm1pbi55LHUubWF4LnkpLGk9b1s1XSxuPW9bNl19dmFyIGM9R1t6XSgwLGEpLGY9R1t6XSgwLHMpLHA9V1t6XSgwLGEpLGQ9V1t6XSgwLHMpLGc9cC1jLHg9ZC1mLHY9e3g6Yyx5OmYseDI6cCx5MjpkLHdpZHRoOmcsaGVpZ2h0OngsY3g6YytnLzIsY3k6Zit4LzJ9O3JldHVybiBlLmJib3g9cih2KSx2fSxZdD1mdW5jdGlvbih0KXt2YXIgaT1yKHQpO3JldHVybiBpLnRvU3RyaW5nPWUuX3BhdGgyc3RyaW5nLGl9LFd0PWUuX3BhdGhUb1JlbGF0aXZlPWZ1bmN0aW9uKHQpe3ZhciByPVZ0KHQpO2lmKHIucmVsKXJldHVybiBZdChyLnJlbCk7ZS5pcyh0LFEpJiZlLmlzKHQmJnRbMF0sUSl8fCh0PWUucGFyc2VQYXRoU3RyaW5nKHQpKTt2YXIgaT1bXSxuPTAsYT0wLHM9MCxvPTAsbD0wO1wiTVwiPT10WzBdWzBdJiYobj10WzBdWzFdLGE9dFswXVsyXSxzPW4sbz1hLGwrKyxpLnB1c2goW1wiTVwiLG4sYV0pKTtmb3IodmFyIGg9bCx1PXQubGVuZ3RoO3U+aDtoKyspe3ZhciBjPWlbaF09W10sZj10W2hdO2lmKGZbMF0hPU8uY2FsbChmWzBdKSlzd2l0Y2goY1swXT1PLmNhbGwoZlswXSksY1swXSl7Y2FzZVwiYVwiOmNbMV09ZlsxXSxjWzJdPWZbMl0sY1szXT1mWzNdLGNbNF09Zls0XSxjWzVdPWZbNV0sY1s2XT0rKGZbNl0tbikudG9GaXhlZCgzKSxjWzddPSsoZls3XS1hKS50b0ZpeGVkKDMpO2JyZWFrO2Nhc2VcInZcIjpjWzFdPSsoZlsxXS1hKS50b0ZpeGVkKDMpO2JyZWFrO2Nhc2VcIm1cIjpzPWZbMV0sbz1mWzJdO2RlZmF1bHQ6Zm9yKHZhciBwPTEsZD1mLmxlbmd0aDtkPnA7cCsrKWNbcF09KyhmW3BdLShwJTI/bjphKSkudG9GaXhlZCgzKX1lbHNle2M9aVtoXT1bXSxcIm1cIj09ZlswXSYmKHM9ZlsxXStuLG89ZlsyXSthKTtmb3IodmFyIGc9MCx4PWYubGVuZ3RoO3g+ZztnKyspaVtoXVtnXT1mW2ddfXZhciB2PWlbaF0ubGVuZ3RoO3N3aXRjaChpW2hdWzBdKXtjYXNlXCJ6XCI6bj1zLGE9bzticmVhaztjYXNlXCJoXCI6bis9K2lbaF1bdi0xXTticmVhaztjYXNlXCJ2XCI6YSs9K2lbaF1bdi0xXTticmVhaztkZWZhdWx0Om4rPStpW2hdW3YtMl0sYSs9K2lbaF1bdi0xXX19cmV0dXJuIGkudG9TdHJpbmc9ZS5fcGF0aDJzdHJpbmcsci5yZWw9WXQoaSksaX0sR3Q9ZS5fcGF0aFRvQWJzb2x1dGU9ZnVuY3Rpb24odCl7dmFyIHI9VnQodCk7aWYoci5hYnMpcmV0dXJuIFl0KHIuYWJzKTtpZihlLmlzKHQsUSkmJmUuaXModCYmdFswXSxRKXx8KHQ9ZS5wYXJzZVBhdGhTdHJpbmcodCkpLCF0fHwhdC5sZW5ndGgpcmV0dXJuW1tcIk1cIiwwLDBdXTt2YXIgaT1bXSxuPTAsYT0wLG89MCxsPTAsaD0wO1wiTVwiPT10WzBdWzBdJiYobj0rdFswXVsxXSxhPSt0WzBdWzJdLG89bixsPWEsaCsrLGlbMF09W1wiTVwiLG4sYV0pO2Zvcih2YXIgdT0zPT10Lmxlbmd0aCYmXCJNXCI9PXRbMF1bMF0mJlwiUlwiPT10WzFdWzBdLnRvVXBwZXJDYXNlKCkmJlwiWlwiPT10WzJdWzBdLnRvVXBwZXJDYXNlKCksYyxmLHA9aCxkPXQubGVuZ3RoO2Q+cDtwKyspe2lmKGkucHVzaChjPVtdKSxmPXRbcF0sZlswXSE9Y3QuY2FsbChmWzBdKSlzd2l0Y2goY1swXT1jdC5jYWxsKGZbMF0pLGNbMF0pe2Nhc2VcIkFcIjpjWzFdPWZbMV0sY1syXT1mWzJdLGNbM109ZlszXSxjWzRdPWZbNF0sY1s1XT1mWzVdLGNbNl09KyhmWzZdK24pLGNbN109KyhmWzddK2EpO2JyZWFrO2Nhc2VcIlZcIjpjWzFdPStmWzFdK2E7YnJlYWs7Y2FzZVwiSFwiOmNbMV09K2ZbMV0rbjticmVhaztjYXNlXCJSXCI6Zm9yKHZhciBnPVtuLGFdW1BdKGYuc2xpY2UoMSkpLHg9Mix2PWcubGVuZ3RoO3Y+eDt4KyspZ1t4XT0rZ1t4XStuLGdbKyt4XT0rZ1t4XSthO2kucG9wKCksaT1pW1BdKHMoZyx1KSk7YnJlYWs7Y2FzZVwiTVwiOm89K2ZbMV0rbixsPStmWzJdK2E7ZGVmYXVsdDpmb3IoeD0xLHY9Zi5sZW5ndGg7dj54O3grKyljW3hdPStmW3hdKyh4JTI/bjphKX1lbHNlIGlmKFwiUlwiPT1mWzBdKWc9W24sYV1bUF0oZi5zbGljZSgxKSksaS5wb3AoKSxpPWlbUF0ocyhnLHUpKSxjPVtcIlJcIl1bUF0oZi5zbGljZSgtMikpO2Vsc2UgZm9yKHZhciB5PTAsbT1mLmxlbmd0aDttPnk7eSsrKWNbeV09Zlt5XTtzd2l0Y2goY1swXSl7Y2FzZVwiWlwiOm49byxhPWw7YnJlYWs7Y2FzZVwiSFwiOm49Y1sxXTticmVhaztjYXNlXCJWXCI6YT1jWzFdO2JyZWFrO2Nhc2VcIk1cIjpvPWNbYy5sZW5ndGgtMl0sbD1jW2MubGVuZ3RoLTFdO2RlZmF1bHQ6bj1jW2MubGVuZ3RoLTJdLGE9Y1tjLmxlbmd0aC0xXX19cmV0dXJuIGkudG9TdHJpbmc9ZS5fcGF0aDJzdHJpbmcsci5hYnM9WXQoaSksaX0sSHQ9ZnVuY3Rpb24odCxlLHIsaSl7cmV0dXJuW3QsZSxyLGkscixpXX0sWHQ9ZnVuY3Rpb24odCxlLHIsaSxuLGEpe3ZhciBzPTEvMyxvPTIvMztyZXR1cm5bcyp0K28qcixzKmUrbyppLHMqbitvKnIscyphK28qaSxuLGFdfSxVdD1mdW5jdGlvbih0LGUscixpLGEscyxvLGwsaCx1KXt2YXIgYz0xMjAqVS8xODAsZj1VLzE4MCooK2F8fDApLHA9W10sZCxnPW4oZnVuY3Rpb24odCxlLHIpe3ZhciBpPXQqWS5jb3MociktZSpZLnNpbihyKSxuPXQqWS5zaW4ocikrZSpZLmNvcyhyKTtyZXR1cm57eDppLHk6bn19KTtpZih1KVM9dVswXSxUPXVbMV0sQj11WzJdLEM9dVszXTtlbHNle2Q9Zyh0LGUsLWYpLHQ9ZC54LGU9ZC55LGQ9ZyhsLGgsLWYpLGw9ZC54LGg9ZC55O3ZhciB4PVkuY29zKFUvMTgwKmEpLHY9WS5zaW4oVS8xODAqYSkseT0odC1sKS8yLG09KGUtaCkvMixiPXkqeS8ocipyKSttKm0vKGkqaSk7Yj4xJiYoYj1ZLnNxcnQoYikscj1iKnIsaT1iKmkpO3ZhciBfPXIqcix3PWkqaSxrPShzPT1vPy0xOjEpKlkuc3FydChIKChfKnctXyptKm0tdyp5KnkpLyhfKm0qbSt3KnkqeSkpKSxCPWsqciptL2krKHQrbCkvMixDPWsqLWkqeS9yKyhlK2gpLzIsUz1ZLmFzaW4oKChlLUMpL2kpLnRvRml4ZWQoOSkpLFQ9WS5hc2luKCgoaC1DKS9pKS50b0ZpeGVkKDkpKTtTPUI+dD9VLVM6UyxUPUI+bD9VLVQ6VCwwPlMmJihTPTIqVStTKSwwPlQmJihUPTIqVStUKSxvJiZTPlQmJihTLT0yKlUpLCFvJiZUPlMmJihULT0yKlUpfXZhciBBPVQtUztpZihIKEEpPmMpe3ZhciBFPVQsTj1sLE09aDtUPVMrYyoobyYmVD5TPzE6LTEpLGw9QityKlkuY29zKFQpLGg9QytpKlkuc2luKFQpLHA9VXQobCxoLHIsaSxhLDAsbyxOLE0sW1QsRSxCLENdKX1BPVQtUzt2YXIgTD1ZLmNvcyhTKSx6PVkuc2luKFMpLEY9WS5jb3MoVCksUj1ZLnNpbihUKSxJPVkudGFuKEEvNCksaj00LzMqcipJLEQ9NC8zKmkqSSxWPVt0LGVdLE89W3Qraip6LGUtRCpMXSxXPVtsK2oqUixoLUQqRl0sRz1bbCxoXTtpZihPWzBdPTIqVlswXS1PWzBdLE9bMV09MipWWzFdLU9bMV0sdSlyZXR1cm5bTyxXLEddW1BdKHApO3A9W08sVyxHXVtQXShwKS5qb2luKClbcV0oXCIsXCIpO2Zvcih2YXIgWD1bXSwkPTAsWj1wLmxlbmd0aDtaPiQ7JCsrKVhbJF09JCUyP2cocFskLTFdLHBbJF0sZikueTpnKHBbJF0scFskKzFdLGYpLng7cmV0dXJuIFh9LCR0PWZ1bmN0aW9uKHQsZSxyLGksbixhLHMsbyxsKXt2YXIgaD0xLWw7cmV0dXJue3g6WChoLDMpKnQrMypYKGgsMikqbCpyKzMqaCpsKmwqbitYKGwsMykqcyx5OlgoaCwzKSplKzMqWChoLDIpKmwqaSszKmgqbCpsKmErWChsLDMpKm99fSxadD1uKGZ1bmN0aW9uKHQsZSxyLGksbixhLHMsbyl7dmFyIGw9bi0yKnIrdC0ocy0yKm4rciksaD0yKihyLXQpLTIqKG4tciksdT10LXIsYz0oLWgrWS5zcXJ0KGgqaC00KmwqdSkpLzIvbCxmPSgtaC1ZLnNxcnQoaCpoLTQqbCp1KSkvMi9sLHA9W2Usb10sZD1bdCxzXSxnO3JldHVybiBIKGMpPlwiMWUxMlwiJiYoYz0uNSksSChmKT5cIjFlMTJcIiYmKGY9LjUpLGM+MCYmMT5jJiYoZz0kdCh0LGUscixpLG4sYSxzLG8sYyksZC5wdXNoKGcueCkscC5wdXNoKGcueSkpLGY+MCYmMT5mJiYoZz0kdCh0LGUscixpLG4sYSxzLG8sZiksZC5wdXNoKGcueCkscC5wdXNoKGcueSkpLGw9YS0yKmkrZS0oby0yKmEraSksaD0yKihpLWUpLTIqKGEtaSksdT1lLWksYz0oLWgrWS5zcXJ0KGgqaC00KmwqdSkpLzIvbCxmPSgtaC1ZLnNxcnQoaCpoLTQqbCp1KSkvMi9sLEgoYyk+XCIxZTEyXCImJihjPS41KSxIKGYpPlwiMWUxMlwiJiYoZj0uNSksYz4wJiYxPmMmJihnPSR0KHQsZSxyLGksbixhLHMsbyxjKSxkLnB1c2goZy54KSxwLnB1c2goZy55KSksZj4wJiYxPmYmJihnPSR0KHQsZSxyLGksbixhLHMsbyxmKSxkLnB1c2goZy54KSxwLnB1c2goZy55KSkse21pbjp7eDpHW3pdKDAsZCkseTpHW3pdKDAscCl9LG1heDp7eDpXW3pdKDAsZCkseTpXW3pdKDAscCl9fX0pLFF0PWUuX3BhdGgyY3VydmU9bihmdW5jdGlvbih0LGUpe3ZhciByPSFlJiZWdCh0KTtpZighZSYmci5jdXJ2ZSlyZXR1cm4gWXQoci5jdXJ2ZSk7Zm9yKHZhciBpPUd0KHQpLG49ZSYmR3QoZSksYT17eDowLHk6MCxieDowLGJ5OjAsWDowLFk6MCxxeDpudWxsLHF5Om51bGx9LHM9e3g6MCx5OjAsYng6MCxieTowLFg6MCxZOjAscXg6bnVsbCxxeTpudWxsfSxvPShmdW5jdGlvbih0LGUscil7dmFyIGksbixhPXtUOjEsUToxfTtpZighdClyZXR1cm5bXCJDXCIsZS54LGUueSxlLngsZS55LGUueCxlLnldO3N3aXRjaCghKHRbMF1pbiBhKSYmKGUucXg9ZS5xeT1udWxsKSx0WzBdKXtjYXNlXCJNXCI6ZS5YPXRbMV0sZS5ZPXRbMl07YnJlYWs7Y2FzZVwiQVwiOnQ9W1wiQ1wiXVtQXShVdFt6XSgwLFtlLngsZS55XVtQXSh0LnNsaWNlKDEpKSkpO2JyZWFrO2Nhc2VcIlNcIjpcIkNcIj09cnx8XCJTXCI9PXI/KGk9MiplLngtZS5ieCxuPTIqZS55LWUuYnkpOihpPWUueCxuPWUueSksdD1bXCJDXCIsaSxuXVtQXSh0LnNsaWNlKDEpKTticmVhaztjYXNlXCJUXCI6XCJRXCI9PXJ8fFwiVFwiPT1yPyhlLnF4PTIqZS54LWUucXgsZS5xeT0yKmUueS1lLnF5KTooZS5xeD1lLngsZS5xeT1lLnkpLHQ9W1wiQ1wiXVtQXShYdChlLngsZS55LGUucXgsZS5xeSx0WzFdLHRbMl0pKTticmVhaztjYXNlXCJRXCI6ZS5xeD10WzFdLGUucXk9dFsyXSx0PVtcIkNcIl1bUF0oWHQoZS54LGUueSx0WzFdLHRbMl0sdFszXSx0WzRdKSk7YnJlYWs7Y2FzZVwiTFwiOnQ9W1wiQ1wiXVtQXShIdChlLngsZS55LHRbMV0sdFsyXSkpO2JyZWFrO2Nhc2VcIkhcIjp0PVtcIkNcIl1bUF0oSHQoZS54LGUueSx0WzFdLGUueSkpO2JyZWFrO2Nhc2VcIlZcIjp0PVtcIkNcIl1bUF0oSHQoZS54LGUueSxlLngsdFsxXSkpO2JyZWFrO2Nhc2VcIlpcIjp0PVtcIkNcIl1bUF0oSHQoZS54LGUueSxlLlgsZS5ZKSl9cmV0dXJuIHR9KSxsPWZ1bmN0aW9uKHQsZSl7aWYodFtlXS5sZW5ndGg+Nyl7dFtlXS5zaGlmdCgpO2Zvcih2YXIgcj10W2VdO3IubGVuZ3RoOyl1W2VdPVwiQVwiLG4mJihjW2VdPVwiQVwiKSx0LnNwbGljZShlKyssMCxbXCJDXCJdW1BdKHIuc3BsaWNlKDAsNikpKTt0LnNwbGljZShlLDEpLGc9VyhpLmxlbmd0aCxuJiZuLmxlbmd0aHx8MCl9fSxoPWZ1bmN0aW9uKHQsZSxyLGEscyl7dCYmZSYmXCJNXCI9PXRbc11bMF0mJlwiTVwiIT1lW3NdWzBdJiYoZS5zcGxpY2UocywwLFtcIk1cIixhLngsYS55XSksci5ieD0wLHIuYnk9MCxyLng9dFtzXVsxXSxyLnk9dFtzXVsyXSxnPVcoaS5sZW5ndGgsbiYmbi5sZW5ndGh8fDApKX0sdT1bXSxjPVtdLGY9XCJcIixwPVwiXCIsZD0wLGc9VyhpLmxlbmd0aCxuJiZuLmxlbmd0aHx8MCk7Zz5kO2QrKyl7aVtkXSYmKGY9aVtkXVswXSksXCJDXCIhPWYmJih1W2RdPWYsZCYmKHA9dVtkLTFdKSksaVtkXT1vKGlbZF0sYSxwKSxcIkFcIiE9dVtkXSYmXCJDXCI9PWYmJih1W2RdPVwiQ1wiKSxsKGksZCksbiYmKG5bZF0mJihmPW5bZF1bMF0pLFwiQ1wiIT1mJiYoY1tkXT1mLGQmJihwPWNbZC0xXSkpLG5bZF09byhuW2RdLHMscCksXCJBXCIhPWNbZF0mJlwiQ1wiPT1mJiYoY1tkXT1cIkNcIiksbChuLGQpKSxoKGksbixhLHMsZCksaChuLGkscyxhLGQpO3ZhciB4PWlbZF0sdj1uJiZuW2RdLHk9eC5sZW5ndGgsbT1uJiZ2Lmxlbmd0aDthLng9eFt5LTJdLGEueT14W3ktMV0sYS5ieD1odCh4W3ktNF0pfHxhLngsYS5ieT1odCh4W3ktM10pfHxhLnkscy5ieD1uJiYoaHQodlttLTRdKXx8cy54KSxzLmJ5PW4mJihodCh2W20tM10pfHxzLnkpLHMueD1uJiZ2W20tMl0scy55PW4mJnZbbS0xXX1yZXR1cm4gbnx8KHIuY3VydmU9WXQoaSkpLG4/W2ksbl06aX0sbnVsbCxZdCksSnQ9ZS5fcGFyc2VEb3RzPW4oZnVuY3Rpb24odCl7Zm9yKHZhciByPVtdLGk9MCxuPXQubGVuZ3RoO24+aTtpKyspe3ZhciBhPXt9LHM9dFtpXS5tYXRjaCgvXihbXjpdKik6PyhbXFxkXFwuXSopLyk7aWYoYS5jb2xvcj1lLmdldFJHQihzWzFdKSxhLmNvbG9yLmVycm9yKXJldHVybiBudWxsO2Eub3BhY2l0eT1hLmNvbG9yLm9wYWNpdHksYS5jb2xvcj1hLmNvbG9yLmhleCxzWzJdJiYoYS5vZmZzZXQ9c1syXStcIiVcIiksci5wdXNoKGEpfWZvcihpPTEsbj1yLmxlbmd0aC0xO24+aTtpKyspaWYoIXJbaV0ub2Zmc2V0KXtmb3IodmFyIG89aHQocltpLTFdLm9mZnNldHx8MCksbD0wLGg9aSsxO24+aDtoKyspaWYocltoXS5vZmZzZXQpe2w9cltoXS5vZmZzZXQ7YnJlYWt9bHx8KGw9MTAwLGg9biksbD1odChsKTtmb3IodmFyIHU9KGwtbykvKGgtaSsxKTtoPmk7aSsrKW8rPXUscltpXS5vZmZzZXQ9bytcIiVcIn1yZXR1cm4gcn0pLEt0PWUuX3RlYXI9ZnVuY3Rpb24odCxlKXt0PT1lLnRvcCYmKGUudG9wPXQucHJldiksdD09ZS5ib3R0b20mJihlLmJvdHRvbT10Lm5leHQpLHQubmV4dCYmKHQubmV4dC5wcmV2PXQucHJldiksdC5wcmV2JiYodC5wcmV2Lm5leHQ9dC5uZXh0KX0sdGU9ZS5fdG9mcm9udD1mdW5jdGlvbih0LGUpe2UudG9wIT09dCYmKEt0KHQsZSksdC5uZXh0PW51bGwsdC5wcmV2PWUudG9wLGUudG9wLm5leHQ9dCxlLnRvcD10KX0sZWU9ZS5fdG9iYWNrPWZ1bmN0aW9uKHQsZSl7ZS5ib3R0b20hPT10JiYoS3QodCxlKSx0Lm5leHQ9ZS5ib3R0b20sdC5wcmV2PW51bGwsZS5ib3R0b20ucHJldj10LGUuYm90dG9tPXQpfSxyZT1lLl9pbnNlcnRhZnRlcj1mdW5jdGlvbih0LGUscil7S3QodCxyKSxlPT1yLnRvcCYmKHIudG9wPXQpLGUubmV4dCYmKGUubmV4dC5wcmV2PXQpLHQubmV4dD1lLm5leHQsdC5wcmV2PWUsZS5uZXh0PXR9LGllPWUuX2luc2VydGJlZm9yZT1mdW5jdGlvbih0LGUscil7S3QodCxyKSxlPT1yLmJvdHRvbSYmKHIuYm90dG9tPXQpLGUucHJldiYmKGUucHJldi5uZXh0PXQpLHQucHJldj1lLnByZXYsZS5wcmV2PXQsdC5uZXh0PWV9LG5lPWUudG9NYXRyaXg9ZnVuY3Rpb24odCxlKXt2YXIgcj1PdCh0KSxpPXtfOnt0cmFuc2Zvcm06Un0sZ2V0QkJveDpmdW5jdGlvbigpe3JldHVybiByfX07cmV0dXJuIHNlKGksZSksaS5tYXRyaXh9LGFlPWUudHJhbnNmb3JtUGF0aD1mdW5jdGlvbih0LGUpe3JldHVybiBOdCh0LG5lKHQsZSkpfSxzZT1lLl9leHRyYWN0VHJhbnNmb3JtPWZ1bmN0aW9uKHQscil7aWYobnVsbD09cilyZXR1cm4gdC5fLnRyYW5zZm9ybTtyPWoocikucmVwbGFjZSgvXFwuezN9fFxcdTIwMjYvZyx0Ll8udHJhbnNmb3JtfHxSKTt2YXIgaT1lLnBhcnNlVHJhbnNmb3JtU3RyaW5nKHIpLG49MCxhPTAscz0wLG89MSxsPTEsaD10Ll8sdT1uZXcgZztpZihoLnRyYW5zZm9ybT1pfHxbXSxpKWZvcih2YXIgYz0wLGY9aS5sZW5ndGg7Zj5jO2MrKyl7dmFyIHA9aVtjXSxkPXAubGVuZ3RoLHg9aihwWzBdKS50b0xvd2VyQ2FzZSgpLHY9cFswXSE9eCx5PXY/dS5pbnZlcnQoKTowLG0sYixfLHcsaztcInRcIj09eCYmMz09ZD92PyhtPXkueCgwLDApLGI9eS55KDAsMCksXz15LngocFsxXSxwWzJdKSx3PXkueShwWzFdLHBbMl0pLHUudHJhbnNsYXRlKF8tbSx3LWIpKTp1LnRyYW5zbGF0ZShwWzFdLHBbMl0pOlwiclwiPT14PzI9PWQ/KGs9a3x8dC5nZXRCQm94KDEpLHUucm90YXRlKHBbMV0say54K2sud2lkdGgvMixrLnkray5oZWlnaHQvMiksbis9cFsxXSk6ND09ZCYmKHY/KF89eS54KHBbMl0scFszXSksdz15LnkocFsyXSxwWzNdKSx1LnJvdGF0ZShwWzFdLF8sdykpOnUucm90YXRlKHBbMV0scFsyXSxwWzNdKSxuKz1wWzFdKTpcInNcIj09eD8yPT1kfHwzPT1kPyhrPWt8fHQuZ2V0QkJveCgxKSx1LnNjYWxlKHBbMV0scFtkLTFdLGsueCtrLndpZHRoLzIsay55K2suaGVpZ2h0LzIpLG8qPXBbMV0sbCo9cFtkLTFdKTo1PT1kJiYodj8oXz15LngocFszXSxwWzRdKSx3PXkueShwWzNdLHBbNF0pLHUuc2NhbGUocFsxXSxwWzJdLF8sdykpOnUuc2NhbGUocFsxXSxwWzJdLHBbM10scFs0XSksbyo9cFsxXSxsKj1wWzJdKTpcIm1cIj09eCYmNz09ZCYmdS5hZGQocFsxXSxwWzJdLHBbM10scFs0XSxwWzVdLHBbNl0pLGguZGlydHlUPTEsdC5tYXRyaXg9dX10Lm1hdHJpeD11LGguc3g9byxoLnN5PWwsaC5kZWc9bixoLmR4PWE9dS5lLGguZHk9cz11LmYsMT09byYmMT09bCYmIW4mJmguYmJveD8oaC5iYm94LngrPSthLGguYmJveC55Kz0rcyk6aC5kaXJ0eVQ9MX0sb2U9ZnVuY3Rpb24odCl7dmFyIGU9dFswXTtzd2l0Y2goZS50b0xvd2VyQ2FzZSgpKXtjYXNlXCJ0XCI6cmV0dXJuW2UsMCwwXTtjYXNlXCJtXCI6cmV0dXJuW2UsMSwwLDAsMSwwLDBdO2Nhc2VcInJcIjpyZXR1cm4gND09dC5sZW5ndGg/W2UsMCx0WzJdLHRbM11dOltlLDBdO2Nhc2VcInNcIjpyZXR1cm4gNT09dC5sZW5ndGg/W2UsMSwxLHRbM10sdFs0XV06Mz09dC5sZW5ndGg/W2UsMSwxXTpbZSwxXX19LGxlPWUuX2VxdWFsaXNlVHJhbnNmb3JtPWZ1bmN0aW9uKHQscil7cj1qKHIpLnJlcGxhY2UoL1xcLnszfXxcXHUyMDI2L2csdCksdD1lLnBhcnNlVHJhbnNmb3JtU3RyaW5nKHQpfHxbXSxyPWUucGFyc2VUcmFuc2Zvcm1TdHJpbmcocil8fFtdO2Zvcih2YXIgaT1XKHQubGVuZ3RoLHIubGVuZ3RoKSxuPVtdLGE9W10scz0wLG8sbCxoLHU7aT5zO3MrKyl7aWYoaD10W3NdfHxvZShyW3NdKSx1PXJbc118fG9lKGgpLGhbMF0hPXVbMF18fFwiclwiPT1oWzBdLnRvTG93ZXJDYXNlKCkmJihoWzJdIT11WzJdfHxoWzNdIT11WzNdKXx8XCJzXCI9PWhbMF0udG9Mb3dlckNhc2UoKSYmKGhbM10hPXVbM118fGhbNF0hPXVbNF0pKXJldHVybjtmb3IobltzXT1bXSxhW3NdPVtdLG89MCxsPVcoaC5sZW5ndGgsdS5sZW5ndGgpO2w+bztvKyspbyBpbiBoJiYobltzXVtvXT1oW29dKSxvIGluIHUmJihhW3NdW29dPXVbb10pfXJldHVybntmcm9tOm4sdG86YX19O2UuX2dldENvbnRhaW5lcj1mdW5jdGlvbih0LHIsaSxuKXt2YXIgYTtyZXR1cm4gYT1udWxsIT1ufHxlLmlzKHQsXCJvYmplY3RcIik/dDpBLmRvYy5nZXRFbGVtZW50QnlJZCh0KSxudWxsIT1hP2EudGFnTmFtZT9udWxsPT1yP3tjb250YWluZXI6YSx3aWR0aDphLnN0eWxlLnBpeGVsV2lkdGh8fGEub2Zmc2V0V2lkdGgsaGVpZ2h0OmEuc3R5bGUucGl4ZWxIZWlnaHR8fGEub2Zmc2V0SGVpZ2h0fTp7Y29udGFpbmVyOmEsd2lkdGg6cixoZWlnaHQ6aX06e2NvbnRhaW5lcjoxLHg6dCx5OnIsd2lkdGg6aSxoZWlnaHQ6bn06dm9pZCAwfSxlLnBhdGhUb1JlbGF0aXZlPVd0LGUuX2VuZ2luZT17fSxlLnBhdGgyY3VydmU9UXQsZS5tYXRyaXg9ZnVuY3Rpb24odCxlLHIsaSxuLGEpe3JldHVybiBuZXcgZyh0LGUscixpLG4sYSl9LGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIHRbMF0qdFswXSt0WzFdKnRbMV19ZnVuY3Rpb24gaSh0KXt2YXIgZT1ZLnNxcnQocih0KSk7dFswXSYmKHRbMF0vPWUpLHRbMV0mJih0WzFdLz1lKX10LmFkZD1mdW5jdGlvbih0LGUscixpLG4sYSl7dmFyIHM9W1tdLFtdLFtdXSxvPVtbdGhpcy5hLHRoaXMuYyx0aGlzLmVdLFt0aGlzLmIsdGhpcy5kLHRoaXMuZl0sWzAsMCwxXV0sbD1bW3QscixuXSxbZSxpLGFdLFswLDAsMV1dLGgsdSxjLGY7Zm9yKHQmJnQgaW5zdGFuY2VvZiBnJiYobD1bW3QuYSx0LmMsdC5lXSxbdC5iLHQuZCx0LmZdLFswLDAsMV1dKSxoPTA7Mz5oO2grKylmb3IodT0wOzM+dTt1Kyspe2ZvcihmPTAsYz0wOzM+YztjKyspZis9b1toXVtjXSpsW2NdW3VdO3NbaF1bdV09Zn10aGlzLmE9c1swXVswXSx0aGlzLmI9c1sxXVswXSx0aGlzLmM9c1swXVsxXSx0aGlzLmQ9c1sxXVsxXSx0aGlzLmU9c1swXVsyXSx0aGlzLmY9c1sxXVsyXX0sdC5pbnZlcnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dC5hKnQuZC10LmIqdC5jO3JldHVybiBuZXcgZyh0LmQvZSwtdC5iL2UsLXQuYy9lLHQuYS9lLCh0LmMqdC5mLXQuZCp0LmUpL2UsKHQuYip0LmUtdC5hKnQuZikvZSl9LHQuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGcodGhpcy5hLHRoaXMuYix0aGlzLmMsdGhpcy5kLHRoaXMuZSx0aGlzLmYpfSx0LnRyYW5zbGF0ZT1mdW5jdGlvbih0LGUpe1xudGhpcy5hZGQoMSwwLDAsMSx0LGUpfSx0LnNjYWxlPWZ1bmN0aW9uKHQsZSxyLGkpe251bGw9PWUmJihlPXQpLChyfHxpKSYmdGhpcy5hZGQoMSwwLDAsMSxyLGkpLHRoaXMuYWRkKHQsMCwwLGUsMCwwKSwocnx8aSkmJnRoaXMuYWRkKDEsMCwwLDEsLXIsLWkpfSx0LnJvdGF0ZT1mdW5jdGlvbih0LHIsaSl7dD1lLnJhZCh0KSxyPXJ8fDAsaT1pfHwwO3ZhciBuPStZLmNvcyh0KS50b0ZpeGVkKDkpLGE9K1kuc2luKHQpLnRvRml4ZWQoOSk7dGhpcy5hZGQobixhLC1hLG4scixpKSx0aGlzLmFkZCgxLDAsMCwxLC1yLC1pKX0sdC54PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQqdGhpcy5hK2UqdGhpcy5jK3RoaXMuZX0sdC55PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQqdGhpcy5iK2UqdGhpcy5kK3RoaXMuZn0sdC5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuK3RoaXNbai5mcm9tQ2hhckNvZGUoOTcrdCldLnRvRml4ZWQoNCl9LHQudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gZS5zdmc/XCJtYXRyaXgoXCIrW3RoaXMuZ2V0KDApLHRoaXMuZ2V0KDEpLHRoaXMuZ2V0KDIpLHRoaXMuZ2V0KDMpLHRoaXMuZ2V0KDQpLHRoaXMuZ2V0KDUpXS5qb2luKCkrXCIpXCI6W3RoaXMuZ2V0KDApLHRoaXMuZ2V0KDIpLHRoaXMuZ2V0KDEpLHRoaXMuZ2V0KDMpLDAsMF0uam9pbigpfSx0LnRvRmlsdGVyPWZ1bmN0aW9uKCl7cmV0dXJuXCJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuTWF0cml4KE0xMT1cIit0aGlzLmdldCgwKStcIiwgTTEyPVwiK3RoaXMuZ2V0KDIpK1wiLCBNMjE9XCIrdGhpcy5nZXQoMSkrXCIsIE0yMj1cIit0aGlzLmdldCgzKStcIiwgRHg9XCIrdGhpcy5nZXQoNCkrXCIsIER5PVwiK3RoaXMuZ2V0KDUpK1wiLCBzaXppbmdtZXRob2Q9J2F1dG8gZXhwYW5kJylcIn0sdC5vZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5lLnRvRml4ZWQoNCksdGhpcy5mLnRvRml4ZWQoNCldfSx0LnNwbGl0PWZ1bmN0aW9uKCl7dmFyIHQ9e307dC5keD10aGlzLmUsdC5keT10aGlzLmY7dmFyIG49W1t0aGlzLmEsdGhpcy5jXSxbdGhpcy5iLHRoaXMuZF1dO3Quc2NhbGV4PVkuc3FydChyKG5bMF0pKSxpKG5bMF0pLHQuc2hlYXI9blswXVswXSpuWzFdWzBdK25bMF1bMV0qblsxXVsxXSxuWzFdPVtuWzFdWzBdLW5bMF1bMF0qdC5zaGVhcixuWzFdWzFdLW5bMF1bMV0qdC5zaGVhcl0sdC5zY2FsZXk9WS5zcXJ0KHIoblsxXSkpLGkoblsxXSksdC5zaGVhci89dC5zY2FsZXk7dmFyIGE9LW5bMF1bMV0scz1uWzFdWzFdO3JldHVybiAwPnM/KHQucm90YXRlPWUuZGVnKFkuYWNvcyhzKSksMD5hJiYodC5yb3RhdGU9MzYwLXQucm90YXRlKSk6dC5yb3RhdGU9ZS5kZWcoWS5hc2luKGEpKSx0LmlzU2ltcGxlPSEoK3Quc2hlYXIudG9GaXhlZCg5KXx8dC5zY2FsZXgudG9GaXhlZCg5KSE9dC5zY2FsZXkudG9GaXhlZCg5KSYmdC5yb3RhdGUpLHQuaXNTdXBlclNpbXBsZT0hK3Quc2hlYXIudG9GaXhlZCg5KSYmdC5zY2FsZXgudG9GaXhlZCg5KT09dC5zY2FsZXkudG9GaXhlZCg5KSYmIXQucm90YXRlLHQubm9Sb3RhdGlvbj0hK3Quc2hlYXIudG9GaXhlZCg5KSYmIXQucm90YXRlLHR9LHQudG9UcmFuc2Zvcm1TdHJpbmc9ZnVuY3Rpb24odCl7dmFyIGU9dHx8dGhpc1txXSgpO3JldHVybiBlLmlzU2ltcGxlPyhlLnNjYWxleD0rZS5zY2FsZXgudG9GaXhlZCg0KSxlLnNjYWxleT0rZS5zY2FsZXkudG9GaXhlZCg0KSxlLnJvdGF0ZT0rZS5yb3RhdGUudG9GaXhlZCg0KSwoZS5keHx8ZS5keT9cInRcIitbZS5keCxlLmR5XTpSKSsoMSE9ZS5zY2FsZXh8fDEhPWUuc2NhbGV5P1wic1wiK1tlLnNjYWxleCxlLnNjYWxleSwwLDBdOlIpKyhlLnJvdGF0ZT9cInJcIitbZS5yb3RhdGUsMCwwXTpSKSk6XCJtXCIrW3RoaXMuZ2V0KDApLHRoaXMuZ2V0KDEpLHRoaXMuZ2V0KDIpLHRoaXMuZ2V0KDMpLHRoaXMuZ2V0KDQpLHRoaXMuZ2V0KDUpXX19KGcucHJvdG90eXBlKTtmb3IodmFyIGhlPWZ1bmN0aW9uKCl7dGhpcy5yZXR1cm5WYWx1ZT0hMX0sdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LGNlPWZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxCdWJibGU9ITB9LGZlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudC5zdG9wUHJvcGFnYXRpb24oKX0scGU9ZnVuY3Rpb24odCl7dmFyIGU9QS5kb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8QS5kb2MuYm9keS5zY3JvbGxUb3Ascj1BLmRvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdHx8QS5kb2MuYm9keS5zY3JvbGxMZWZ0O3JldHVybnt4OnQuY2xpZW50WCtyLHk6dC5jbGllbnRZK2V9fSxkZT1mdW5jdGlvbigpe3JldHVybiBBLmRvYy5hZGRFdmVudExpc3RlbmVyP2Z1bmN0aW9uKHQsZSxyLGkpe3ZhciBuPWZ1bmN0aW9uKHQpe3ZhciBlPXBlKHQpO3JldHVybiByLmNhbGwoaSx0LGUueCxlLnkpfTtpZih0LmFkZEV2ZW50TGlzdGVuZXIoZSxuLCExKSxGJiZWW2VdKXt2YXIgYT1mdW5jdGlvbihlKXtmb3IodmFyIG49cGUoZSksYT1lLHM9MCxvPWUudGFyZ2V0VG91Y2hlcyYmZS50YXJnZXRUb3VjaGVzLmxlbmd0aDtvPnM7cysrKWlmKGUudGFyZ2V0VG91Y2hlc1tzXS50YXJnZXQ9PXQpe2U9ZS50YXJnZXRUb3VjaGVzW3NdLGUub3JpZ2luYWxFdmVudD1hLGUucHJldmVudERlZmF1bHQ9dWUsZS5zdG9wUHJvcGFnYXRpb249ZmU7YnJlYWt9cmV0dXJuIHIuY2FsbChpLGUsbi54LG4ueSl9O3QuYWRkRXZlbnRMaXN0ZW5lcihWW2VdLGEsITEpfXJldHVybiBmdW5jdGlvbigpe3JldHVybiB0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxuLCExKSxGJiZWW2VdJiZ0LnJlbW92ZUV2ZW50TGlzdGVuZXIoVltlXSxhLCExKSwhMH19OkEuZG9jLmF0dGFjaEV2ZW50P2Z1bmN0aW9uKHQsZSxyLGkpe3ZhciBuPWZ1bmN0aW9uKHQpe3Q9dHx8QS53aW4uZXZlbnQ7dmFyIGU9QS5kb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8QS5kb2MuYm9keS5zY3JvbGxUb3Asbj1BLmRvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdHx8QS5kb2MuYm9keS5zY3JvbGxMZWZ0LGE9dC5jbGllbnRYK24scz10LmNsaWVudFkrZTtyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdD10LnByZXZlbnREZWZhdWx0fHxoZSx0LnN0b3BQcm9wYWdhdGlvbj10LnN0b3BQcm9wYWdhdGlvbnx8Y2Usci5jYWxsKGksdCxhLHMpfTt0LmF0dGFjaEV2ZW50KFwib25cIitlLG4pO3ZhciBhPWZ1bmN0aW9uKCl7cmV0dXJuIHQuZGV0YWNoRXZlbnQoXCJvblwiK2UsbiksITB9O3JldHVybiBhfTp2b2lkIDB9KCksZ2U9W10seGU9ZnVuY3Rpb24oZSl7Zm9yKHZhciByPWUuY2xpZW50WCxpPWUuY2xpZW50WSxuPUEuZG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B8fEEuZG9jLmJvZHkuc2Nyb2xsVG9wLGE9QS5kb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnR8fEEuZG9jLmJvZHkuc2Nyb2xsTGVmdCxzLG89Z2UubGVuZ3RoO28tLTspe2lmKHM9Z2Vbb10sRiYmZS50b3VjaGVzKXtmb3IodmFyIGw9ZS50b3VjaGVzLmxlbmd0aCxoO2wtLTspaWYoaD1lLnRvdWNoZXNbbF0saC5pZGVudGlmaWVyPT1zLmVsLl9kcmFnLmlkKXtyPWguY2xpZW50WCxpPWguY2xpZW50WSwoZS5vcmlnaW5hbEV2ZW50P2Uub3JpZ2luYWxFdmVudDplKS5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrfX1lbHNlIGUucHJldmVudERlZmF1bHQoKTt2YXIgdT1zLmVsLm5vZGUsYyxmPXUubmV4dFNpYmxpbmcscD11LnBhcmVudE5vZGUsZD11LnN0eWxlLmRpc3BsYXk7QS53aW4ub3BlcmEmJnAucmVtb3ZlQ2hpbGQodSksdS5zdHlsZS5kaXNwbGF5PVwibm9uZVwiLGM9cy5lbC5wYXBlci5nZXRFbGVtZW50QnlQb2ludChyLGkpLHUuc3R5bGUuZGlzcGxheT1kLEEud2luLm9wZXJhJiYoZj9wLmluc2VydEJlZm9yZSh1LGYpOnAuYXBwZW5kQ2hpbGQodSkpLGMmJnQoXCJyYXBoYWVsLmRyYWcub3Zlci5cIitzLmVsLmlkLHMuZWwsYykscis9YSxpKz1uLHQoXCJyYXBoYWVsLmRyYWcubW92ZS5cIitzLmVsLmlkLHMubW92ZV9zY29wZXx8cy5lbCxyLXMuZWwuX2RyYWcueCxpLXMuZWwuX2RyYWcueSxyLGksZSl9fSx2ZT1mdW5jdGlvbihyKXtlLnVubW91c2Vtb3ZlKHhlKS51bm1vdXNldXAodmUpO2Zvcih2YXIgaT1nZS5sZW5ndGgsbjtpLS07KW49Z2VbaV0sbi5lbC5fZHJhZz17fSx0KFwicmFwaGFlbC5kcmFnLmVuZC5cIituLmVsLmlkLG4uZW5kX3Njb3BlfHxuLnN0YXJ0X3Njb3BlfHxuLm1vdmVfc2NvcGV8fG4uZWwscik7Z2U9W119LHllPWUuZWw9e30sbWU9RC5sZW5ndGg7bWUtLTspIWZ1bmN0aW9uKHQpe2VbdF09eWVbdF09ZnVuY3Rpb24ocixpKXtyZXR1cm4gZS5pcyhyLFwiZnVuY3Rpb25cIikmJih0aGlzLmV2ZW50cz10aGlzLmV2ZW50c3x8W10sdGhpcy5ldmVudHMucHVzaCh7bmFtZTp0LGY6cix1bmJpbmQ6ZGUodGhpcy5zaGFwZXx8dGhpcy5ub2RlfHxBLmRvYyx0LHIsaXx8dGhpcyl9KSksdGhpc30sZVtcInVuXCIrdF09eWVbXCJ1blwiK3RdPWZ1bmN0aW9uKHIpe2Zvcih2YXIgaT10aGlzLmV2ZW50c3x8W10sbj1pLmxlbmd0aDtuLS07KWlbbl0ubmFtZSE9dHx8IWUuaXMocixcInVuZGVmaW5lZFwiKSYmaVtuXS5mIT1yfHwoaVtuXS51bmJpbmQoKSxpLnNwbGljZShuLDEpLCFpLmxlbmd0aCYmZGVsZXRlIHRoaXMuZXZlbnRzKTtyZXR1cm4gdGhpc319KERbbWVdKTt5ZS5kYXRhPWZ1bmN0aW9uKHIsaSl7dmFyIG49d3RbdGhpcy5pZF09d3RbdGhpcy5pZF18fHt9O2lmKDA9PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG47aWYoMT09YXJndW1lbnRzLmxlbmd0aCl7aWYoZS5pcyhyLFwib2JqZWN0XCIpKXtmb3IodmFyIGEgaW4gcilyW1RdKGEpJiZ0aGlzLmRhdGEoYSxyW2FdKTtyZXR1cm4gdGhpc31yZXR1cm4gdChcInJhcGhhZWwuZGF0YS5nZXQuXCIrdGhpcy5pZCx0aGlzLG5bcl0sciksbltyXX1yZXR1cm4gbltyXT1pLHQoXCJyYXBoYWVsLmRhdGEuc2V0LlwiK3RoaXMuaWQsdGhpcyxpLHIpLHRoaXN9LHllLnJlbW92ZURhdGE9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/d3RbdGhpcy5pZF09e306d3RbdGhpcy5pZF0mJmRlbGV0ZSB3dFt0aGlzLmlkXVt0XSx0aGlzfSx5ZS5nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHIod3RbdGhpcy5pZF18fHt9KX0seWUuaG92ZXI9ZnVuY3Rpb24odCxlLHIsaSl7cmV0dXJuIHRoaXMubW91c2VvdmVyKHQscikubW91c2VvdXQoZSxpfHxyKX0seWUudW5ob3Zlcj1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnVubW91c2VvdmVyKHQpLnVubW91c2VvdXQoZSl9O3ZhciBiZT1bXTt5ZS5kcmFnPWZ1bmN0aW9uKHIsaSxuLGEscyxvKXtmdW5jdGlvbiBsKGwpeyhsLm9yaWdpbmFsRXZlbnR8fGwpLnByZXZlbnREZWZhdWx0KCk7dmFyIGg9bC5jbGllbnRYLHU9bC5jbGllbnRZLGM9QS5kb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8QS5kb2MuYm9keS5zY3JvbGxUb3AsZj1BLmRvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdHx8QS5kb2MuYm9keS5zY3JvbGxMZWZ0O2lmKHRoaXMuX2RyYWcuaWQ9bC5pZGVudGlmaWVyLEYmJmwudG91Y2hlcylmb3IodmFyIHA9bC50b3VjaGVzLmxlbmd0aCxkO3AtLTspaWYoZD1sLnRvdWNoZXNbcF0sdGhpcy5fZHJhZy5pZD1kLmlkZW50aWZpZXIsZC5pZGVudGlmaWVyPT10aGlzLl9kcmFnLmlkKXtoPWQuY2xpZW50WCx1PWQuY2xpZW50WTticmVha310aGlzLl9kcmFnLng9aCtmLHRoaXMuX2RyYWcueT11K2MsIWdlLmxlbmd0aCYmZS5tb3VzZW1vdmUoeGUpLm1vdXNldXAodmUpLGdlLnB1c2goe2VsOnRoaXMsbW92ZV9zY29wZTphLHN0YXJ0X3Njb3BlOnMsZW5kX3Njb3BlOm99KSxpJiZ0Lm9uKFwicmFwaGFlbC5kcmFnLnN0YXJ0LlwiK3RoaXMuaWQsaSksciYmdC5vbihcInJhcGhhZWwuZHJhZy5tb3ZlLlwiK3RoaXMuaWQsciksbiYmdC5vbihcInJhcGhhZWwuZHJhZy5lbmQuXCIrdGhpcy5pZCxuKSx0KFwicmFwaGFlbC5kcmFnLnN0YXJ0LlwiK3RoaXMuaWQsc3x8YXx8dGhpcyxsLmNsaWVudFgrZixsLmNsaWVudFkrYyxsKX1yZXR1cm4gdGhpcy5fZHJhZz17fSxiZS5wdXNoKHtlbDp0aGlzLHN0YXJ0Omx9KSx0aGlzLm1vdXNlZG93bihsKSx0aGlzfSx5ZS5vbkRyYWdPdmVyPWZ1bmN0aW9uKGUpe2U/dC5vbihcInJhcGhhZWwuZHJhZy5vdmVyLlwiK3RoaXMuaWQsZSk6dC51bmJpbmQoXCJyYXBoYWVsLmRyYWcub3Zlci5cIit0aGlzLmlkKX0seWUudW5kcmFnPWZ1bmN0aW9uKCl7Zm9yKHZhciByPWJlLmxlbmd0aDtyLS07KWJlW3JdLmVsPT10aGlzJiYodGhpcy51bm1vdXNlZG93bihiZVtyXS5zdGFydCksYmUuc3BsaWNlKHIsMSksdC51bmJpbmQoXCJyYXBoYWVsLmRyYWcuKi5cIit0aGlzLmlkKSk7IWJlLmxlbmd0aCYmZS51bm1vdXNlbW92ZSh4ZSkudW5tb3VzZXVwKHZlKSxnZT1bXX0sTS5jaXJjbGU9ZnVuY3Rpb24odCxyLGkpe3ZhciBuPWUuX2VuZ2luZS5jaXJjbGUodGhpcyx0fHwwLHJ8fDAsaXx8MCk7cmV0dXJuIHRoaXMuX19zZXRfXyYmdGhpcy5fX3NldF9fLnB1c2gobiksbn0sTS5yZWN0PWZ1bmN0aW9uKHQscixpLG4sYSl7dmFyIHM9ZS5fZW5naW5lLnJlY3QodGhpcyx0fHwwLHJ8fDAsaXx8MCxufHwwLGF8fDApO3JldHVybiB0aGlzLl9fc2V0X18mJnRoaXMuX19zZXRfXy5wdXNoKHMpLHN9LE0uZWxsaXBzZT1mdW5jdGlvbih0LHIsaSxuKXt2YXIgYT1lLl9lbmdpbmUuZWxsaXBzZSh0aGlzLHR8fDAscnx8MCxpfHwwLG58fDApO3JldHVybiB0aGlzLl9fc2V0X18mJnRoaXMuX19zZXRfXy5wdXNoKGEpLGF9LE0ucGF0aD1mdW5jdGlvbih0KXt0JiYhZS5pcyh0LFopJiYhZS5pcyh0WzBdLFEpJiYodCs9Uik7dmFyIHI9ZS5fZW5naW5lLnBhdGgoZS5mb3JtYXRbel0oZSxhcmd1bWVudHMpLHRoaXMpO3JldHVybiB0aGlzLl9fc2V0X18mJnRoaXMuX19zZXRfXy5wdXNoKHIpLHJ9LE0uaW1hZ2U9ZnVuY3Rpb24odCxyLGksbixhKXt2YXIgcz1lLl9lbmdpbmUuaW1hZ2UodGhpcyx0fHxcImFib3V0OmJsYW5rXCIscnx8MCxpfHwwLG58fDAsYXx8MCk7cmV0dXJuIHRoaXMuX19zZXRfXyYmdGhpcy5fX3NldF9fLnB1c2gocyksc30sTS50ZXh0PWZ1bmN0aW9uKHQscixpKXt2YXIgbj1lLl9lbmdpbmUudGV4dCh0aGlzLHR8fDAscnx8MCxqKGkpKTtyZXR1cm4gdGhpcy5fX3NldF9fJiZ0aGlzLl9fc2V0X18ucHVzaChuKSxufSxNLnNldD1mdW5jdGlvbih0KXshZS5pcyh0LFwiYXJyYXlcIikmJih0PUFycmF5LnByb3RvdHlwZS5zcGxpY2UuY2FsbChhcmd1bWVudHMsMCxhcmd1bWVudHMubGVuZ3RoKSk7dmFyIHI9bmV3IHplKHQpO3JldHVybiB0aGlzLl9fc2V0X18mJnRoaXMuX19zZXRfXy5wdXNoKHIpLHIucGFwZXI9dGhpcyxyLnR5cGU9XCJzZXRcIixyfSxNLnNldFN0YXJ0PWZ1bmN0aW9uKHQpe3RoaXMuX19zZXRfXz10fHx0aGlzLnNldCgpfSxNLnNldEZpbmlzaD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fc2V0X187cmV0dXJuIGRlbGV0ZSB0aGlzLl9fc2V0X18sZX0sTS5nZXRTaXplPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jYW52YXMucGFyZW50Tm9kZTtyZXR1cm57d2lkdGg6dC5vZmZzZXRXaWR0aCxoZWlnaHQ6dC5vZmZzZXRIZWlnaHR9fSxNLnNldFNpemU9ZnVuY3Rpb24odCxyKXtyZXR1cm4gZS5fZW5naW5lLnNldFNpemUuY2FsbCh0aGlzLHQscil9LE0uc2V0Vmlld0JveD1mdW5jdGlvbih0LHIsaSxuLGEpe3JldHVybiBlLl9lbmdpbmUuc2V0Vmlld0JveC5jYWxsKHRoaXMsdCxyLGksbixhKX0sTS50b3A9TS5ib3R0b209bnVsbCxNLnJhcGhhZWw9ZTt2YXIgX2U9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxyPXQub3duZXJEb2N1bWVudCxpPXIuYm9keSxuPXIuZG9jdW1lbnRFbGVtZW50LGE9bi5jbGllbnRUb3B8fGkuY2xpZW50VG9wfHwwLHM9bi5jbGllbnRMZWZ0fHxpLmNsaWVudExlZnR8fDAsbz1lLnRvcCsoQS53aW4ucGFnZVlPZmZzZXR8fG4uc2Nyb2xsVG9wfHxpLnNjcm9sbFRvcCktYSxsPWUubGVmdCsoQS53aW4ucGFnZVhPZmZzZXR8fG4uc2Nyb2xsTGVmdHx8aS5zY3JvbGxMZWZ0KS1zO3JldHVybnt5Om8seDpsfX07TS5nZXRFbGVtZW50QnlQb2ludD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMsaT1yLmNhbnZhcyxuPUEuZG9jLmVsZW1lbnRGcm9tUG9pbnQodCxlKTtpZihBLndpbi5vcGVyYSYmXCJzdmdcIj09bi50YWdOYW1lKXt2YXIgYT1fZShpKSxzPWkuY3JlYXRlU1ZHUmVjdCgpO3MueD10LWEueCxzLnk9ZS1hLnkscy53aWR0aD1zLmhlaWdodD0xO3ZhciBvPWkuZ2V0SW50ZXJzZWN0aW9uTGlzdChzLG51bGwpO28ubGVuZ3RoJiYobj1vW28ubGVuZ3RoLTFdKX1pZighbilyZXR1cm4gbnVsbDtmb3IoO24ucGFyZW50Tm9kZSYmbiE9aS5wYXJlbnROb2RlJiYhbi5yYXBoYWVsOyluPW4ucGFyZW50Tm9kZTtyZXR1cm4gbj09ci5jYW52YXMucGFyZW50Tm9kZSYmKG49aSksbj1uJiZuLnJhcGhhZWw/ci5nZXRCeUlkKG4ucmFwaGFlbGlkKTpudWxsfSxNLmdldEVsZW1lbnRzQnlCQm94PWZ1bmN0aW9uKHQpe3ZhciByPXRoaXMuc2V0KCk7cmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbihpKXtlLmlzQkJveEludGVyc2VjdChpLmdldEJCb3goKSx0KSYmci5wdXNoKGkpfSkscn0sTS5nZXRCeUlkPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmJvdHRvbTtlOyl7aWYoZS5pZD09dClyZXR1cm4gZTtlPWUubmV4dH1yZXR1cm4gbnVsbH0sTS5mb3JFYWNoPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXRoaXMuYm90dG9tO3I7KXtpZih0LmNhbGwoZSxyKT09PSExKXJldHVybiB0aGlzO3I9ci5uZXh0fXJldHVybiB0aGlzfSxNLmdldEVsZW1lbnRzQnlQb2ludD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuc2V0KCk7cmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbihpKXtpLmlzUG9pbnRJbnNpZGUodCxlKSYmci5wdXNoKGkpfSkscn0seWUuaXNQb2ludEluc2lkZT1mdW5jdGlvbih0LHIpe3ZhciBpPXRoaXMucmVhbFBhdGg9RXRbdGhpcy50eXBlXSh0aGlzKTtyZXR1cm4gdGhpcy5hdHRyKFwidHJhbnNmb3JtXCIpJiZ0aGlzLmF0dHIoXCJ0cmFuc2Zvcm1cIikubGVuZ3RoJiYoaT1lLnRyYW5zZm9ybVBhdGgoaSx0aGlzLmF0dHIoXCJ0cmFuc2Zvcm1cIikpKSxlLmlzUG9pbnRJbnNpZGVQYXRoKGksdCxyKX0seWUuZ2V0QkJveD1mdW5jdGlvbih0KXtpZih0aGlzLnJlbW92ZWQpcmV0dXJue307dmFyIGU9dGhpcy5fO3JldHVybiB0PyghZS5kaXJ0eSYmZS5iYm94d3R8fCh0aGlzLnJlYWxQYXRoPUV0W3RoaXMudHlwZV0odGhpcyksZS5iYm94d3Q9T3QodGhpcy5yZWFsUGF0aCksZS5iYm94d3QudG9TdHJpbmc9dixlLmRpcnR5PTApLGUuYmJveHd0KTooKGUuZGlydHl8fGUuZGlydHlUfHwhZS5iYm94KSYmKCFlLmRpcnR5JiZ0aGlzLnJlYWxQYXRofHwoZS5iYm94d3Q9MCx0aGlzLnJlYWxQYXRoPUV0W3RoaXMudHlwZV0odGhpcykpLGUuYmJveD1PdChOdCh0aGlzLnJlYWxQYXRoLHRoaXMubWF0cml4KSksZS5iYm94LnRvU3RyaW5nPXYsZS5kaXJ0eT1lLmRpcnR5VD0wKSxlLmJib3gpfSx5ZS5jbG9uZT1mdW5jdGlvbigpe2lmKHRoaXMucmVtb3ZlZClyZXR1cm4gbnVsbDt2YXIgdD10aGlzLnBhcGVyW3RoaXMudHlwZV0oKS5hdHRyKHRoaXMuYXR0cigpKTtyZXR1cm4gdGhpcy5fX3NldF9fJiZ0aGlzLl9fc2V0X18ucHVzaCh0KSx0fSx5ZS5nbG93PWZ1bmN0aW9uKHQpe2lmKFwidGV4dFwiPT10aGlzLnR5cGUpcmV0dXJuIG51bGw7dD10fHx7fTt2YXIgZT17d2lkdGg6KHQud2lkdGh8fDEwKSsoK3RoaXMuYXR0cihcInN0cm9rZS13aWR0aFwiKXx8MSksZmlsbDp0LmZpbGx8fCExLG9wYWNpdHk6bnVsbD09dC5vcGFjaXR5Py41OnQub3BhY2l0eSxvZmZzZXR4OnQub2Zmc2V0eHx8MCxvZmZzZXR5OnQub2Zmc2V0eXx8MCxjb2xvcjp0LmNvbG9yfHxcIiMwMDBcIn0scj1lLndpZHRoLzIsaT10aGlzLnBhcGVyLG49aS5zZXQoKSxhPXRoaXMucmVhbFBhdGh8fEV0W3RoaXMudHlwZV0odGhpcyk7YT10aGlzLm1hdHJpeD9OdChhLHRoaXMubWF0cml4KTphO2Zvcih2YXIgcz0xO3IrMT5zO3MrKyluLnB1c2goaS5wYXRoKGEpLmF0dHIoe3N0cm9rZTplLmNvbG9yLGZpbGw6ZS5maWxsP2UuY29sb3I6XCJub25lXCIsXCJzdHJva2UtbGluZWpvaW5cIjpcInJvdW5kXCIsXCJzdHJva2UtbGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZS13aWR0aFwiOisoZS53aWR0aC9yKnMpLnRvRml4ZWQoMyksb3BhY2l0eTorKGUub3BhY2l0eS9yKS50b0ZpeGVkKDMpfSkpO3JldHVybiBuLmluc2VydEJlZm9yZSh0aGlzKS50cmFuc2xhdGUoZS5vZmZzZXR4LGUub2Zmc2V0eSl9O3ZhciB3ZT17fSxrZT1mdW5jdGlvbih0LHIsaSxuLGEscyxvLHUsYyl7cmV0dXJuIG51bGw9PWM/bCh0LHIsaSxuLGEscyxvLHUpOmUuZmluZERvdHNBdFNlZ21lbnQodCxyLGksbixhLHMsbyx1LGgodCxyLGksbixhLHMsbyx1LGMpKX0sQmU9ZnVuY3Rpb24odCxyKXtyZXR1cm4gZnVuY3Rpb24oaSxuLGEpe2k9UXQoaSk7Zm9yKHZhciBzLG8sbCxoLHU9XCJcIixjPXt9LGYscD0wLGQ9MCxnPWkubGVuZ3RoO2c+ZDtkKyspe2lmKGw9aVtkXSxcIk1cIj09bFswXSlzPStsWzFdLG89K2xbMl07ZWxzZXtpZihoPWtlKHMsbyxsWzFdLGxbMl0sbFszXSxsWzRdLGxbNV0sbFs2XSkscCtoPm4pe2lmKHImJiFjLnN0YXJ0KXtpZihmPWtlKHMsbyxsWzFdLGxbMl0sbFszXSxsWzRdLGxbNV0sbFs2XSxuLXApLHUrPVtcIkNcIitmLnN0YXJ0LngsZi5zdGFydC55LGYubS54LGYubS55LGYueCxmLnldLGEpcmV0dXJuIHU7Yy5zdGFydD11LHU9W1wiTVwiK2YueCxmLnkrXCJDXCIrZi5uLngsZi5uLnksZi5lbmQueCxmLmVuZC55LGxbNV0sbFs2XV0uam9pbigpLHArPWgscz0rbFs1XSxvPStsWzZdO2NvbnRpbnVlfWlmKCF0JiYhcilyZXR1cm4gZj1rZShzLG8sbFsxXSxsWzJdLGxbM10sbFs0XSxsWzVdLGxbNl0sbi1wKSx7eDpmLngseTpmLnksYWxwaGE6Zi5hbHBoYX19cCs9aCxzPStsWzVdLG89K2xbNl19dSs9bC5zaGlmdCgpK2x9cmV0dXJuIGMuZW5kPXUsZj10P3A6cj9jOmUuZmluZERvdHNBdFNlZ21lbnQocyxvLGxbMF0sbFsxXSxsWzJdLGxbM10sbFs0XSxsWzVdLDEpLGYuYWxwaGEmJihmPXt4OmYueCx5OmYueSxhbHBoYTpmLmFscGhhfSksZn19LENlPUJlKDEpLFNlPUJlKCksVGU9QmUoMCwxKTtlLmdldFRvdGFsTGVuZ3RoPUNlLGUuZ2V0UG9pbnRBdExlbmd0aD1TZSxlLmdldFN1YnBhdGg9ZnVuY3Rpb24odCxlLHIpe2lmKHRoaXMuZ2V0VG90YWxMZW5ndGgodCktcjwxZS02KXJldHVybiBUZSh0LGUpLmVuZDt2YXIgaT1UZSh0LHIsMSk7cmV0dXJuIGU/VGUoaSxlKS5lbmQ6aX0seWUuZ2V0VG90YWxMZW5ndGg9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFBhdGgoKTtpZih0KXJldHVybiB0aGlzLm5vZGUuZ2V0VG90YWxMZW5ndGg/dGhpcy5ub2RlLmdldFRvdGFsTGVuZ3RoKCk6Q2UodCl9LHllLmdldFBvaW50QXRMZW5ndGg9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRQYXRoKCk7aWYoZSlyZXR1cm4gU2UoZSx0KX0seWUuZ2V0UGF0aD1mdW5jdGlvbigpe3ZhciB0LHI9ZS5fZ2V0UGF0aFt0aGlzLnR5cGVdO2lmKFwidGV4dFwiIT10aGlzLnR5cGUmJlwic2V0XCIhPXRoaXMudHlwZSlyZXR1cm4gciYmKHQ9cih0aGlzKSksdH0seWUuZ2V0U3VicGF0aD1mdW5jdGlvbih0LHIpe3ZhciBpPXRoaXMuZ2V0UGF0aCgpO2lmKGkpcmV0dXJuIGUuZ2V0U3VicGF0aChpLHQscil9O3ZhciBBZT1lLmVhc2luZ19mb3JtdWxhcz17bGluZWFyOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxcIjxcIjpmdW5jdGlvbih0KXtyZXR1cm4gWCh0LDEuNyl9LFwiPlwiOmZ1bmN0aW9uKHQpe3JldHVybiBYKHQsLjQ4KX0sXCI8PlwiOmZ1bmN0aW9uKHQpe3ZhciBlPS40OC10LzEuMDQscj1ZLnNxcnQoLjE3MzQrZSplKSxpPXItZSxuPVgoSChpKSwxLzMpKigwPmk/LTE6MSksYT0tci1lLHM9WChIKGEpLDEvMykqKDA+YT8tMToxKSxvPW4rcysuNTtyZXR1cm4gMyooMS1vKSpvKm8rbypvKm99LGJhY2tJbjpmdW5jdGlvbih0KXt2YXIgZT0xLjcwMTU4O3JldHVybiB0KnQqKChlKzEpKnQtZSl9LGJhY2tPdXQ6ZnVuY3Rpb24odCl7dC09MTt2YXIgZT0xLjcwMTU4O3JldHVybiB0KnQqKChlKzEpKnQrZSkrMX0sZWxhc3RpYzpmdW5jdGlvbih0KXtyZXR1cm4gdD09ISF0P3Q6WCgyLC0xMCp0KSpZLnNpbigodC0uMDc1KSooMipVKS8uMykrMX0sYm91bmNlOmZ1bmN0aW9uKHQpe3ZhciBlPTcuNTYyNSxyPTIuNzUsaTtyZXR1cm4gMS9yPnQ/aT1lKnQqdDoyL3I+dD8odC09MS41L3IsaT1lKnQqdCsuNzUpOjIuNS9yPnQ/KHQtPTIuMjUvcixpPWUqdCp0Ky45Mzc1KToodC09Mi42MjUvcixpPWUqdCp0Ky45ODQzNzUpLGl9fTtBZS5lYXNlSW49QWVbXCJlYXNlLWluXCJdPUFlW1wiPFwiXSxBZS5lYXNlT3V0PUFlW1wiZWFzZS1vdXRcIl09QWVbXCI+XCJdLEFlLmVhc2VJbk91dD1BZVtcImVhc2UtaW4tb3V0XCJdPUFlW1wiPD5cIl0sQWVbXCJiYWNrLWluXCJdPUFlLmJhY2tJbixBZVtcImJhY2stb3V0XCJdPUFlLmJhY2tPdXQ7dmFyIEVlPVtdLE5lPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fGZ1bmN0aW9uKHQpe3NldFRpbWVvdXQodCwxNil9LE1lPWZ1bmN0aW9uKCl7Zm9yKHZhciByPStuZXcgRGF0ZSxpPTA7aTxFZS5sZW5ndGg7aSsrKXt2YXIgbj1FZVtpXTtpZighbi5lbC5yZW1vdmVkJiYhbi5wYXVzZWQpe3ZhciBhPXItbi5zdGFydCxzPW4ubXMsbz1uLmVhc2luZyxsPW4uZnJvbSxoPW4uZGlmZix1PW4udG8sYz1uLnQsZj1uLmVsLHA9e30sZCxnPXt9LHg7aWYobi5pbml0c3RhdHVzPyhhPShuLmluaXRzdGF0dXMqbi5hbmltLnRvcC1uLnByZXYpLyhuLnBlcmNlbnQtbi5wcmV2KSpzLG4uc3RhdHVzPW4uaW5pdHN0YXR1cyxkZWxldGUgbi5pbml0c3RhdHVzLG4uc3RvcCYmRWUuc3BsaWNlKGktLSwxKSk6bi5zdGF0dXM9KG4ucHJldisobi5wZXJjZW50LW4ucHJldikqKGEvcykpL24uYW5pbS50b3AsISgwPmEpKWlmKHM+YSl7dmFyIHY9byhhL3MpO2Zvcih2YXIgeSBpbiBsKWlmKGxbVF0oeSkpe3N3aXRjaChwdFt5XSl7Y2FzZSAkOmQ9K2xbeV0rdipzKmhbeV07YnJlYWs7Y2FzZVwiY29sb3VyXCI6ZD1cInJnYihcIitbTGUob3QobFt5XS5yK3YqcypoW3ldLnIpKSxMZShvdChsW3ldLmcrdipzKmhbeV0uZykpLExlKG90KGxbeV0uYit2KnMqaFt5XS5iKSldLmpvaW4oXCIsXCIpK1wiKVwiO2JyZWFrO2Nhc2VcInBhdGhcIjpkPVtdO2Zvcih2YXIgbT0wLF89bFt5XS5sZW5ndGg7Xz5tO20rKyl7ZFttXT1bbFt5XVttXVswXV07Zm9yKHZhciB3PTEsaz1sW3ldW21dLmxlbmd0aDtrPnc7dysrKWRbbV1bd109K2xbeV1bbV1bd10rdipzKmhbeV1bbV1bd107ZFttXT1kW21dLmpvaW4oSSl9ZD1kLmpvaW4oSSk7YnJlYWs7Y2FzZVwidHJhbnNmb3JtXCI6aWYoaFt5XS5yZWFsKWZvcihkPVtdLG09MCxfPWxbeV0ubGVuZ3RoO18+bTttKyspZm9yKGRbbV09W2xbeV1bbV1bMF1dLHc9MSxrPWxbeV1bbV0ubGVuZ3RoO2s+dzt3KyspZFttXVt3XT1sW3ldW21dW3ddK3YqcypoW3ldW21dW3ddO2Vsc2V7dmFyIEI9ZnVuY3Rpb24odCl7cmV0dXJuK2xbeV1bdF0rdipzKmhbeV1bdF19O2Q9W1tcIm1cIixCKDApLEIoMSksQigyKSxCKDMpLEIoNCksQig1KV1dfWJyZWFrO2Nhc2VcImNzdlwiOmlmKFwiY2xpcC1yZWN0XCI9PXkpZm9yKGQ9W10sbT00O20tLTspZFttXT0rbFt5XVttXSt2KnMqaFt5XVttXTticmVhaztkZWZhdWx0OnZhciBDPVtdW1BdKGxbeV0pO2ZvcihkPVtdLG09Zi5wYXBlci5jdXN0b21BdHRyaWJ1dGVzW3ldLmxlbmd0aDttLS07KWRbbV09K0NbbV0rdipzKmhbeV1bbV19cFt5XT1kfWYuYXR0cihwKSxmdW5jdGlvbihlLHIsaSl7c2V0VGltZW91dChmdW5jdGlvbigpe3QoXCJyYXBoYWVsLmFuaW0uZnJhbWUuXCIrZSxyLGkpfSl9KGYuaWQsZixuLmFuaW0pfWVsc2V7aWYoZnVuY3Rpb24ocixpLG4pe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0KFwicmFwaGFlbC5hbmltLmZyYW1lLlwiK2kuaWQsaSxuKSx0KFwicmFwaGFlbC5hbmltLmZpbmlzaC5cIitpLmlkLGksbiksZS5pcyhyLFwiZnVuY3Rpb25cIikmJnIuY2FsbChpKX0pfShuLmNhbGxiYWNrLGYsbi5hbmltKSxmLmF0dHIodSksRWUuc3BsaWNlKGktLSwxKSxuLnJlcGVhdD4xJiYhbi5uZXh0KXtmb3IoeCBpbiB1KXVbVF0oeCkmJihnW3hdPW4udG90YWxPcmlnaW5beF0pO24uZWwuYXR0cihnKSxiKG4uYW5pbSxuLmVsLG4uYW5pbS5wZXJjZW50c1swXSxudWxsLG4udG90YWxPcmlnaW4sbi5yZXBlYXQtMSl9bi5uZXh0JiYhbi5zdG9wJiZiKG4uYW5pbSxuLmVsLG4ubmV4dCxudWxsLG4udG90YWxPcmlnaW4sbi5yZXBlYXQpfX19RWUubGVuZ3RoJiZOZShNZSl9LExlPWZ1bmN0aW9uKHQpe3JldHVybiB0PjI1NT8yNTU6MD50PzA6dH07eWUuYW5pbWF0ZVdpdGg9ZnVuY3Rpb24odCxyLGksbixhLHMpe3ZhciBvPXRoaXM7aWYoby5yZW1vdmVkKXJldHVybiBzJiZzLmNhbGwobyksbzt2YXIgbD1pIGluc3RhbmNlb2YgbT9pOmUuYW5pbWF0aW9uKGksbixhLHMpLGgsdTtiKGwsbyxsLnBlcmNlbnRzWzBdLG51bGwsby5hdHRyKCkpO2Zvcih2YXIgYz0wLGY9RWUubGVuZ3RoO2Y+YztjKyspaWYoRWVbY10uYW5pbT09ciYmRWVbY10uZWw9PXQpe0VlW2YtMV0uc3RhcnQ9RWVbY10uc3RhcnQ7YnJlYWt9cmV0dXJuIG99LHllLm9uQW5pbWF0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiBlP3Qub24oXCJyYXBoYWVsLmFuaW0uZnJhbWUuXCIrdGhpcy5pZCxlKTp0LnVuYmluZChcInJhcGhhZWwuYW5pbS5mcmFtZS5cIit0aGlzLmlkKSx0aGlzfSxtLnByb3RvdHlwZS5kZWxheT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgbSh0aGlzLmFuaW0sdGhpcy5tcyk7cmV0dXJuIGUudGltZXM9dGhpcy50aW1lcyxlLmRlbD0rdHx8MCxlfSxtLnByb3RvdHlwZS5yZXBlYXQ9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IG0odGhpcy5hbmltLHRoaXMubXMpO3JldHVybiBlLmRlbD10aGlzLmRlbCxlLnRpbWVzPVkuZmxvb3IoVyh0LDApKXx8MSxlfSxlLmFuaW1hdGlvbj1mdW5jdGlvbih0LHIsaSxuKXtpZih0IGluc3RhbmNlb2YgbSlyZXR1cm4gdDshZS5pcyhpLFwiZnVuY3Rpb25cIikmJml8fChuPW58fGl8fG51bGwsaT1udWxsKSx0PU9iamVjdCh0KSxyPStyfHwwO3ZhciBhPXt9LHMsbztmb3IobyBpbiB0KXRbVF0obykmJmh0KG8pIT1vJiZodChvKStcIiVcIiE9byYmKHM9ITAsYVtvXT10W29dKTtpZihzKXJldHVybiBpJiYoYS5lYXNpbmc9aSksbiYmKGEuY2FsbGJhY2s9biksbmV3IG0oezEwMDphfSxyKTtpZihuKXt2YXIgbD0wO2Zvcih2YXIgaCBpbiB0KXt2YXIgdT11dChoKTt0W1RdKGgpJiZ1PmwmJihsPXUpfWwrPVwiJVwiLCF0W2xdLmNhbGxiYWNrJiYodFtsXS5jYWxsYmFjaz1uKX1yZXR1cm4gbmV3IG0odCxyKX0seWUuYW5pbWF0ZT1mdW5jdGlvbih0LHIsaSxuKXt2YXIgYT10aGlzO2lmKGEucmVtb3ZlZClyZXR1cm4gbiYmbi5jYWxsKGEpLGE7dmFyIHM9dCBpbnN0YW5jZW9mIG0/dDplLmFuaW1hdGlvbih0LHIsaSxuKTtyZXR1cm4gYihzLGEscy5wZXJjZW50c1swXSxudWxsLGEuYXR0cigpKSxhfSx5ZS5zZXRUaW1lPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJm51bGwhPWUmJnRoaXMuc3RhdHVzKHQsRyhlLHQubXMpL3QubXMpLHRoaXN9LHllLnN0YXR1cz1mdW5jdGlvbih0LGUpe3ZhciByPVtdLGk9MCxuLGE7aWYobnVsbCE9ZSlyZXR1cm4gYih0LHRoaXMsLTEsRyhlLDEpKSx0aGlzO2ZvcihuPUVlLmxlbmd0aDtuPmk7aSsrKWlmKGE9RWVbaV0sYS5lbC5pZD09dGhpcy5pZCYmKCF0fHxhLmFuaW09PXQpKXtpZih0KXJldHVybiBhLnN0YXR1cztyLnB1c2goe2FuaW06YS5hbmltLHN0YXR1czphLnN0YXR1c30pfXJldHVybiB0PzA6cn0seWUucGF1c2U9ZnVuY3Rpb24oZSl7Zm9yKHZhciByPTA7cjxFZS5sZW5ndGg7cisrKUVlW3JdLmVsLmlkIT10aGlzLmlkfHxlJiZFZVtyXS5hbmltIT1lfHx0KFwicmFwaGFlbC5hbmltLnBhdXNlLlwiK3RoaXMuaWQsdGhpcyxFZVtyXS5hbmltKSE9PSExJiYoRWVbcl0ucGF1c2VkPSEwKTtyZXR1cm4gdGhpc30seWUucmVzdW1lPWZ1bmN0aW9uKGUpe2Zvcih2YXIgcj0wO3I8RWUubGVuZ3RoO3IrKylpZihFZVtyXS5lbC5pZD09dGhpcy5pZCYmKCFlfHxFZVtyXS5hbmltPT1lKSl7dmFyIGk9RWVbcl07dChcInJhcGhhZWwuYW5pbS5yZXN1bWUuXCIrdGhpcy5pZCx0aGlzLGkuYW5pbSkhPT0hMSYmKGRlbGV0ZSBpLnBhdXNlZCx0aGlzLnN0YXR1cyhpLmFuaW0saS5zdGF0dXMpKX1yZXR1cm4gdGhpc30seWUuc3RvcD1mdW5jdGlvbihlKXtmb3IodmFyIHI9MDtyPEVlLmxlbmd0aDtyKyspRWVbcl0uZWwuaWQhPXRoaXMuaWR8fGUmJkVlW3JdLmFuaW0hPWV8fHQoXCJyYXBoYWVsLmFuaW0uc3RvcC5cIit0aGlzLmlkLHRoaXMsRWVbcl0uYW5pbSkhPT0hMSYmRWUuc3BsaWNlKHItLSwxKTtyZXR1cm4gdGhpc30sdC5vbihcInJhcGhhZWwucmVtb3ZlXCIsXyksdC5vbihcInJhcGhhZWwuY2xlYXJcIixfKSx5ZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiUmFwaGHDq2zigJlzIG9iamVjdFwifTt2YXIgemU9ZnVuY3Rpb24odCl7aWYodGhpcy5pdGVtcz1bXSx0aGlzLmxlbmd0aD0wLHRoaXMudHlwZT1cInNldFwiLHQpZm9yKHZhciBlPTAscj10Lmxlbmd0aDtyPmU7ZSsrKSF0W2VdfHx0W2VdLmNvbnN0cnVjdG9yIT15ZS5jb25zdHJ1Y3RvciYmdFtlXS5jb25zdHJ1Y3RvciE9emV8fCh0aGlzW3RoaXMuaXRlbXMubGVuZ3RoXT10aGlzLml0ZW1zW3RoaXMuaXRlbXMubGVuZ3RoXT10W2VdLHRoaXMubGVuZ3RoKyspfSxQZT16ZS5wcm90b3R5cGU7UGUucHVzaD1mdW5jdGlvbigpe2Zvcih2YXIgdCxlLHI9MCxpPWFyZ3VtZW50cy5sZW5ndGg7aT5yO3IrKyl0PWFyZ3VtZW50c1tyXSwhdHx8dC5jb25zdHJ1Y3RvciE9eWUuY29uc3RydWN0b3ImJnQuY29uc3RydWN0b3IhPXplfHwoZT10aGlzLml0ZW1zLmxlbmd0aCx0aGlzW2VdPXRoaXMuaXRlbXNbZV09dCx0aGlzLmxlbmd0aCsrKTtyZXR1cm4gdGhpc30sUGUucG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RoJiZkZWxldGUgdGhpc1t0aGlzLmxlbmd0aC0tXSx0aGlzLml0ZW1zLnBvcCgpfSxQZS5mb3JFYWNoPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPTAsaT10aGlzLml0ZW1zLmxlbmd0aDtpPnI7cisrKWlmKHQuY2FsbChlLHRoaXMuaXRlbXNbcl0scik9PT0hMSlyZXR1cm4gdGhpcztyZXR1cm4gdGhpc307Zm9yKHZhciBGZSBpbiB5ZSl5ZVtUXShGZSkmJihQZVtGZV09ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24ocil7clt0XVt6XShyLGUpfSl9fShGZSkpO3JldHVybiBQZS5hdHRyPWZ1bmN0aW9uKHQscil7aWYodCYmZS5pcyh0LFEpJiZlLmlzKHRbMF0sXCJvYmplY3RcIikpZm9yKHZhciBpPTAsbj10Lmxlbmd0aDtuPmk7aSsrKXRoaXMuaXRlbXNbaV0uYXR0cih0W2ldKTtlbHNlIGZvcih2YXIgYT0wLHM9dGhpcy5pdGVtcy5sZW5ndGg7cz5hO2ErKyl0aGlzLml0ZW1zW2FdLmF0dHIodCxyKTtyZXR1cm4gdGhpc30sUGUuY2xlYXI9ZnVuY3Rpb24oKXtmb3IoO3RoaXMubGVuZ3RoOyl0aGlzLnBvcCgpfSxQZS5zcGxpY2U9ZnVuY3Rpb24odCxlLHIpe3Q9MD50P1codGhpcy5sZW5ndGgrdCwwKTp0LGU9VygwLEcodGhpcy5sZW5ndGgtdCxlKSk7dmFyIGk9W10sbj1bXSxhPVtdLHM7Zm9yKHM9MjtzPGFyZ3VtZW50cy5sZW5ndGg7cysrKWEucHVzaChhcmd1bWVudHNbc10pO2ZvcihzPTA7ZT5zO3MrKyluLnB1c2godGhpc1t0K3NdKTtmb3IoO3M8dGhpcy5sZW5ndGgtdDtzKyspaS5wdXNoKHRoaXNbdCtzXSk7dmFyIG89YS5sZW5ndGg7Zm9yKHM9MDtzPG8raS5sZW5ndGg7cysrKXRoaXMuaXRlbXNbdCtzXT10aGlzW3Qrc109bz5zP2Fbc106aVtzLW9dO2ZvcihzPXRoaXMuaXRlbXMubGVuZ3RoPXRoaXMubGVuZ3RoLT1lLW87dGhpc1tzXTspZGVsZXRlIHRoaXNbcysrXTtyZXR1cm4gbmV3IHplKG4pfSxQZS5leGNsdWRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLHI9dGhpcy5sZW5ndGg7cj5lO2UrKylpZih0aGlzW2VdPT10KXJldHVybiB0aGlzLnNwbGljZShlLDEpLCEwfSxQZS5hbmltYXRlPWZ1bmN0aW9uKHQscixpLG4peyhlLmlzKGksXCJmdW5jdGlvblwiKXx8IWkpJiYobj1pfHxudWxsKTt2YXIgYT10aGlzLml0ZW1zLmxlbmd0aCxzPWEsbyxsPXRoaXMsaDtpZighYSlyZXR1cm4gdGhpcztuJiYoaD1mdW5jdGlvbigpeyEtLWEmJm4uY2FsbChsKX0pLGk9ZS5pcyhpLFopP2k6aDt2YXIgdT1lLmFuaW1hdGlvbih0LHIsaSxoKTtmb3Iobz10aGlzLml0ZW1zWy0tc10uYW5pbWF0ZSh1KTtzLS07KXRoaXMuaXRlbXNbc10mJiF0aGlzLml0ZW1zW3NdLnJlbW92ZWQmJnRoaXMuaXRlbXNbc10uYW5pbWF0ZVdpdGgobyx1LHUpLHRoaXMuaXRlbXNbc10mJiF0aGlzLml0ZW1zW3NdLnJlbW92ZWR8fGEtLTtyZXR1cm4gdGhpc30sUGUuaW5zZXJ0QWZ0ZXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuaXRlbXMubGVuZ3RoO2UtLTspdGhpcy5pdGVtc1tlXS5pbnNlcnRBZnRlcih0KTtyZXR1cm4gdGhpc30sUGUuZ2V0QkJveD1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPVtdLHI9W10saT1bXSxuPXRoaXMuaXRlbXMubGVuZ3RoO24tLTspaWYoIXRoaXMuaXRlbXNbbl0ucmVtb3ZlZCl7dmFyIGE9dGhpcy5pdGVtc1tuXS5nZXRCQm94KCk7dC5wdXNoKGEueCksZS5wdXNoKGEueSksci5wdXNoKGEueCthLndpZHRoKSxpLnB1c2goYS55K2EuaGVpZ2h0KX1yZXR1cm4gdD1HW3pdKDAsdCksZT1HW3pdKDAsZSkscj1XW3pdKDAsciksaT1XW3pdKDAsaSkse3g6dCx5OmUseDI6cix5MjppLHdpZHRoOnItdCxoZWlnaHQ6aS1lfX0sUGUuY2xvbmU9ZnVuY3Rpb24odCl7dD10aGlzLnBhcGVyLnNldCgpO2Zvcih2YXIgZT0wLHI9dGhpcy5pdGVtcy5sZW5ndGg7cj5lO2UrKyl0LnB1c2godGhpcy5pdGVtc1tlXS5jbG9uZSgpKTtyZXR1cm4gdH0sUGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5cIlJhcGhhw6ts4oCYcyBzZXRcIn0sUGUuZ2xvdz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnBhcGVyLnNldCgpO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24ocixpKXt2YXIgbj1yLmdsb3codCk7bnVsbCE9biYmbi5mb3JFYWNoKGZ1bmN0aW9uKHQscil7ZS5wdXNoKHQpfSl9KSxlfSxQZS5pc1BvaW50SW5zaWRlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ITE7cmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbihpKXtyZXR1cm4gaS5pc1BvaW50SW5zaWRlKHQsZSk/KHI9ITAsITEpOnZvaWQgMH0pLHJ9LGUucmVnaXN0ZXJGb250PWZ1bmN0aW9uKHQpe2lmKCF0LmZhY2UpcmV0dXJuIHQ7dGhpcy5mb250cz10aGlzLmZvbnRzfHx7fTt2YXIgZT17dzp0LncsZmFjZTp7fSxnbHlwaHM6e319LHI9dC5mYWNlW1wiZm9udC1mYW1pbHlcIl07Zm9yKHZhciBpIGluIHQuZmFjZSl0LmZhY2VbVF0oaSkmJihlLmZhY2VbaV09dC5mYWNlW2ldKTtpZih0aGlzLmZvbnRzW3JdP3RoaXMuZm9udHNbcl0ucHVzaChlKTp0aGlzLmZvbnRzW3JdPVtlXSwhdC5zdmcpe2UuZmFjZVtcInVuaXRzLXBlci1lbVwiXT11dCh0LmZhY2VbXCJ1bml0cy1wZXItZW1cIl0sMTApO2Zvcih2YXIgbiBpbiB0LmdseXBocylpZih0LmdseXBoc1tUXShuKSl7dmFyIGE9dC5nbHlwaHNbbl07aWYoZS5nbHlwaHNbbl09e3c6YS53LGs6e30sZDphLmQmJlwiTVwiK2EuZC5yZXBsYWNlKC9bbWxjeHRydl0vZyxmdW5jdGlvbih0KXtyZXR1cm57bDpcIkxcIixjOlwiQ1wiLHg6XCJ6XCIsdDpcIm1cIixyOlwibFwiLHY6XCJjXCJ9W3RdfHxcIk1cIn0pK1wielwifSxhLmspZm9yKHZhciBzIGluIGEuaylhW1RdKHMpJiYoZS5nbHlwaHNbbl0ua1tzXT1hLmtbc10pfX1yZXR1cm4gdH0sTS5nZXRGb250PWZ1bmN0aW9uKHQscixpLG4pe2lmKG49bnx8XCJub3JtYWxcIixpPWl8fFwibm9ybWFsXCIscj0rcnx8e25vcm1hbDo0MDAsYm9sZDo3MDAsbGlnaHRlcjozMDAsYm9sZGVyOjgwMH1bcl18fDQwMCxlLmZvbnRzKXt2YXIgYT1lLmZvbnRzW3RdO2lmKCFhKXt2YXIgcz1uZXcgUmVnRXhwKFwiKF58XFxcXHMpXCIrdC5yZXBsYWNlKC9bXlxcd1xcZFxccyshfi46Xy1dL2csUikrXCIoXFxcXHN8JClcIixcImlcIik7Zm9yKHZhciBvIGluIGUuZm9udHMpaWYoZS5mb250c1tUXShvKSYmcy50ZXN0KG8pKXthPWUuZm9udHNbb107YnJlYWt9fXZhciBsO2lmKGEpZm9yKHZhciBoPTAsdT1hLmxlbmd0aDt1PmgmJihsPWFbaF0sbC5mYWNlW1wiZm9udC13ZWlnaHRcIl0hPXJ8fGwuZmFjZVtcImZvbnQtc3R5bGVcIl0hPWkmJmwuZmFjZVtcImZvbnQtc3R5bGVcIl18fGwuZmFjZVtcImZvbnQtc3RyZXRjaFwiXSE9bik7aCsrKTtyZXR1cm4gbH19LE0ucHJpbnQ9ZnVuY3Rpb24odCxyLGksbixhLHMsbyxsKXtzPXN8fFwibWlkZGxlXCIsbz1XKEcob3x8MCwxKSwtMSksbD1XKEcobHx8MSwzKSwxKTt2YXIgaD1qKGkpW3FdKFIpLHU9MCxjPTAsZj1SLHA7aWYoZS5pcyhuLFwic3RyaW5nXCIpJiYobj10aGlzLmdldEZvbnQobikpLG4pe3A9KGF8fDE2KS9uLmZhY2VbXCJ1bml0cy1wZXItZW1cIl07Zm9yKHZhciBkPW4uZmFjZS5iYm94W3FdKGspLGc9K2RbMF0seD1kWzNdLWRbMV0sdj0wLHk9K2RbMV0rKFwiYmFzZWxpbmVcIj09cz94KyArbi5mYWNlLmRlc2NlbnQ6eC8yKSxtPTAsYj1oLmxlbmd0aDtiPm07bSsrKXtpZihcIlxcblwiPT1oW21dKXU9MCx3PTAsYz0wLHYrPXgqbDtlbHNle3ZhciBfPWMmJm4uZ2x5cGhzW2hbbS0xXV18fHt9LHc9bi5nbHlwaHNbaFttXV07dSs9Yz8oXy53fHxuLncpKyhfLmsmJl8ua1toW21dXXx8MCkrbi53Km86MCxjPTF9dyYmdy5kJiYoZis9ZS50cmFuc2Zvcm1QYXRoKHcuZCxbXCJ0XCIsdSpwLHYqcCxcInNcIixwLHAsZyx5LFwidFwiLCh0LWcpL3AsKHIteSkvcF0pKX19cmV0dXJuIHRoaXMucGF0aChmKS5hdHRyKHtmaWxsOlwiIzAwMFwiLHN0cm9rZTpcIm5vbmVcIn0pfSxNLmFkZD1mdW5jdGlvbih0KXtpZihlLmlzKHQsXCJhcnJheVwiKSlmb3IodmFyIHI9dGhpcy5zZXQoKSxpPTAsbj10Lmxlbmd0aCxhO24+aTtpKyspYT10W2ldfHx7fSxCW1RdKGEudHlwZSkmJnIucHVzaCh0aGlzW2EudHlwZV0oKS5hdHRyKGEpKTtyZXR1cm4gcn0sZS5mb3JtYXQ9ZnVuY3Rpb24odCxyKXt2YXIgaT1lLmlzKHIsUSk/WzBdW1BdKHIpOmFyZ3VtZW50cztyZXR1cm4gdCYmZS5pcyh0LFopJiZpLmxlbmd0aC0xJiYodD10LnJlcGxhY2UoQyxmdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1pWysrZV0/UjppW2VdfSkpLHR8fFJ9LGUuZnVsbGZpbGw9ZnVuY3Rpb24oKXt2YXIgdD0vXFx7KFteXFx9XSspXFx9L2csZT0vKD86KD86XnxcXC4pKC4rPykoPz1cXFt8XFwufCR8XFwoKXxcXFsoJ3xcIikoLis/KVxcMlxcXSkoXFwoXFwpKT8vZyxyPWZ1bmN0aW9uKHQscixpKXt2YXIgbj1pO3JldHVybiByLnJlcGxhY2UoZSxmdW5jdGlvbih0LGUscixpLGEpe2U9ZXx8aSxuJiYoZSBpbiBuJiYobj1uW2VdKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBuJiZhJiYobj1uKCkpKX0pLG49KG51bGw9PW58fG49PWk/dDpuKStcIlwifTtyZXR1cm4gZnVuY3Rpb24oZSxpKXtyZXR1cm4gU3RyaW5nKGUpLnJlcGxhY2UodCxmdW5jdGlvbih0LGUpe3JldHVybiByKHQsZSxpKX0pfX0oKSxlLm5pbmphPWZ1bmN0aW9uKCl7aWYoRS53YXMpQS53aW4uUmFwaGFlbD1FLmlzO2Vsc2V7d2luZG93LlJhcGhhZWw9dm9pZCAwO3RyeXtkZWxldGUgd2luZG93LlJhcGhhZWx9Y2F0Y2godCl7fX1yZXR1cm4gZX0sZS5zdD1QZSx0Lm9uKFwicmFwaGFlbC5ET01sb2FkXCIsZnVuY3Rpb24oKXt3PSEwfSksZnVuY3Rpb24odCxyLGkpe2Z1bmN0aW9uIG4oKXsvaW4vLnRlc3QodC5yZWFkeVN0YXRlKT9zZXRUaW1lb3V0KG4sOSk6ZS5ldmUoXCJyYXBoYWVsLkRPTWxvYWRcIil9bnVsbD09dC5yZWFkeVN0YXRlJiZ0LmFkZEV2ZW50TGlzdGVuZXImJih0LmFkZEV2ZW50TGlzdGVuZXIocixpPWZ1bmN0aW9uKCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKHIsaSwhMSksdC5yZWFkeVN0YXRlPVwiY29tcGxldGVcIn0sITEpLHQucmVhZHlTdGF0ZT1cImxvYWRpbmdcIiksbigpfShkb2N1bWVudCxcIkRPTUNvbnRlbnRMb2FkZWRcIiksZX0uYXBwbHkoZSxpKSwhKHZvaWQgMCE9PW4mJih0LmV4cG9ydHM9bikpfSxmdW5jdGlvbih0LGUscil7dmFyIGksbjshZnVuY3Rpb24ocil7dmFyIGE9XCIwLjQuMlwiLHM9XCJoYXNPd25Qcm9wZXJ0eVwiLG89L1tcXC5cXC9dLyxsPVwiKlwiLGg9ZnVuY3Rpb24oKXt9LHU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC1lfSxjLGYscD17bjp7fX0sZD1mdW5jdGlvbih0LGUpe3Q9U3RyaW5nKHQpO3ZhciByPXAsaT1mLG49QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDIpLGE9ZC5saXN0ZW5lcnModCkscz0wLG89ITEsbCxoPVtdLGc9e30seD1bXSx2PWMseT1bXTtjPXQsZj0wO2Zvcih2YXIgbT0wLGI9YS5sZW5ndGg7Yj5tO20rKylcInpJbmRleFwiaW4gYVttXSYmKGgucHVzaChhW21dLnpJbmRleCksYVttXS56SW5kZXg8MCYmKGdbYVttXS56SW5kZXhdPWFbbV0pKTtmb3IoaC5zb3J0KHUpO2hbc108MDspaWYobD1nW2hbcysrXV0seC5wdXNoKGwuYXBwbHkoZSxuKSksZilyZXR1cm4gZj1pLHg7Zm9yKG09MDtiPm07bSsrKWlmKGw9YVttXSxcInpJbmRleFwiaW4gbClpZihsLnpJbmRleD09aFtzXSl7aWYoeC5wdXNoKGwuYXBwbHkoZSxuKSksZilicmVhaztkbyBpZihzKyssbD1nW2hbc11dLGwmJngucHVzaChsLmFwcGx5KGUsbikpLGYpYnJlYWs7d2hpbGUobCl9ZWxzZSBnW2wuekluZGV4XT1sO2Vsc2UgaWYoeC5wdXNoKGwuYXBwbHkoZSxuKSksZilicmVhaztyZXR1cm4gZj1pLGM9dix4Lmxlbmd0aD94Om51bGx9O2QuX2V2ZW50cz1wLGQubGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc3BsaXQobykscj1wLGksbixhLHMsaCx1LGMsZixkPVtyXSxnPVtdO2ZvcihzPTAsaD1lLmxlbmd0aDtoPnM7cysrKXtmb3IoZj1bXSx1PTAsYz1kLmxlbmd0aDtjPnU7dSsrKWZvcihyPWRbdV0ubixuPVtyW2Vbc11dLHJbbF1dLGE9MjthLS07KWk9blthXSxpJiYoZi5wdXNoKGkpLGc9Zy5jb25jYXQoaS5mfHxbXSkpO2Q9Zn1yZXR1cm4gZ30sZC5vbj1mdW5jdGlvbih0LGUpe2lmKHQ9U3RyaW5nKHQpLFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUpcmV0dXJuIGZ1bmN0aW9uKCl7fTtmb3IodmFyIHI9dC5zcGxpdChvKSxpPXAsbj0wLGE9ci5sZW5ndGg7YT5uO24rKylpPWkubixpPWkuaGFzT3duUHJvcGVydHkocltuXSkmJmlbcltuXV18fChpW3Jbbl1dPXtuOnt9fSk7Zm9yKGkuZj1pLmZ8fFtdLG49MCxhPWkuZi5sZW5ndGg7YT5uO24rKylpZihpLmZbbl09PWUpcmV0dXJuIGg7cmV0dXJuIGkuZi5wdXNoKGUpLGZ1bmN0aW9uKHQpeyt0PT0rdCYmKGUuekluZGV4PSt0KX19LGQuZj1mdW5jdGlvbih0KXt2YXIgZT1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gZnVuY3Rpb24oKXtkLmFwcGx5KG51bGwsW3QsbnVsbF0uY29uY2F0KGUpLmNvbmNhdChbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSkpfX0sZC5zdG9wPWZ1bmN0aW9uKCl7Zj0xfSxkLm50PWZ1bmN0aW9uKHQpe3JldHVybiB0P25ldyBSZWdFeHAoXCIoPzpcXFxcLnxcXFxcL3xeKVwiK3QrXCIoPzpcXFxcLnxcXFxcL3wkKVwiKS50ZXN0KGMpOmN9LGQubnRzPWZ1bmN0aW9uKCl7cmV0dXJuIGMuc3BsaXQobyl9LGQub2ZmPWQudW5iaW5kPWZ1bmN0aW9uKHQsZSl7aWYoIXQpcmV0dXJuIHZvaWQoZC5fZXZlbnRzPXA9e246e319KTt2YXIgcj10LnNwbGl0KG8pLGksbixhLGgsdSxjLGYsZz1bcF07Zm9yKGg9MCx1PXIubGVuZ3RoO3U+aDtoKyspZm9yKGM9MDtjPGcubGVuZ3RoO2MrPWEubGVuZ3RoLTIpe2lmKGE9W2MsMV0saT1nW2NdLm4scltoXSE9bClpW3JbaF1dJiZhLnB1c2goaVtyW2hdXSk7ZWxzZSBmb3IobiBpbiBpKWlbc10obikmJmEucHVzaChpW25dKTtnLnNwbGljZS5hcHBseShnLGEpfWZvcihoPTAsdT1nLmxlbmd0aDt1Pmg7aCsrKWZvcihpPWdbaF07aS5uOyl7aWYoZSl7aWYoaS5mKXtmb3IoYz0wLGY9aS5mLmxlbmd0aDtmPmM7YysrKWlmKGkuZltjXT09ZSl7aS5mLnNwbGljZShjLDEpO2JyZWFrfSFpLmYubGVuZ3RoJiZkZWxldGUgaS5mfWZvcihuIGluIGkubilpZihpLm5bc10obikmJmkubltuXS5mKXt2YXIgeD1pLm5bbl0uZjtmb3IoYz0wLGY9eC5sZW5ndGg7Zj5jO2MrKylpZih4W2NdPT1lKXt4LnNwbGljZShjLDEpO2JyZWFrfSF4Lmxlbmd0aCYmZGVsZXRlIGkubltuXS5mfX1lbHNle2RlbGV0ZSBpLmY7Zm9yKG4gaW4gaS5uKWkubltzXShuKSYmaS5uW25dLmYmJmRlbGV0ZSBpLm5bbl0uZn1pPWkubn19LGQub25jZT1mdW5jdGlvbih0LGUpe3ZhciByPWZ1bmN0aW9uKCl7cmV0dXJuIGQudW5iaW5kKHQsciksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3JldHVybiBkLm9uKHQscil9LGQudmVyc2lvbj1hLGQudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5cIllvdSBhcmUgcnVubmluZyBFdmUgXCIrYX0sXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHQmJnQuZXhwb3J0cz90LmV4cG9ydHM9ZDooaT1bXSxuPWZ1bmN0aW9uKCl7cmV0dXJuIGR9LmFwcGx5KGUsaSksISh2b2lkIDAhPT1uJiYodC5leHBvcnRzPW4pKSl9KHRoaXMpfSxmdW5jdGlvbih0LGUscil7dmFyIGksbjtpPVtyKDEpXSxuPWZ1bmN0aW9uKHQpe2lmKCF0fHx0LnN2Zyl7dmFyIGU9XCJoYXNPd25Qcm9wZXJ0eVwiLHI9U3RyaW5nLGk9cGFyc2VGbG9hdCxuPXBhcnNlSW50LGE9TWF0aCxzPWEubWF4LG89YS5hYnMsbD1hLnBvdyxoPS9bLCBdKy8sdT10LmV2ZSxjPVwiXCIsZj1cIiBcIixwPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLGQ9e2Jsb2NrOlwiTTUsMCAwLDIuNSA1LDV6XCIsY2xhc3NpYzpcIk01LDAgMCwyLjUgNSw1IDMuNSwzIDMuNSwyelwiLGRpYW1vbmQ6XCJNMi41LDAgNSwyLjUgMi41LDUgMCwyLjV6XCIsb3BlbjpcIk02LDEgMSwzLjUgNiw2XCIsb3ZhbDpcIk0yLjUsMEEyLjUsMi41LDAsMCwxLDIuNSw1IDIuNSwyLjUsMCwwLDEsMi41LDB6XCJ9LGc9e307dC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiWW91ciBicm93c2VyIHN1cHBvcnRzIFNWRy5cXG5Zb3UgYXJlIHJ1bm5pbmcgUmFwaGHDq2wgXCIrdGhpcy52ZXJzaW9ufTt2YXIgeD1mdW5jdGlvbihpLG4pe2lmKG4pe1wic3RyaW5nXCI9PXR5cGVvZiBpJiYoaT14KGkpKTtmb3IodmFyIGEgaW4gbiluW2VdKGEpJiYoXCJ4bGluazpcIj09YS5zdWJzdHJpbmcoMCw2KT9pLnNldEF0dHJpYnV0ZU5TKHAsYS5zdWJzdHJpbmcoNikscihuW2FdKSk6aS5zZXRBdHRyaWJ1dGUoYSxyKG5bYV0pKSl9ZWxzZSBpPXQuX2cuZG9jLmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsaSksaS5zdHlsZSYmKGkuc3R5bGUud2Via2l0VGFwSGlnaGxpZ2h0Q29sb3I9XCJyZ2JhKDAsMCwwLDApXCIpO3JldHVybiBpfSx2PWZ1bmN0aW9uKGUsbil7dmFyIGg9XCJsaW5lYXJcIix1PWUuaWQrbixmPS41LHA9LjUsZD1lLm5vZGUsZz1lLnBhcGVyLHY9ZC5zdHlsZSx5PXQuX2cuZG9jLmdldEVsZW1lbnRCeUlkKHUpO2lmKCF5KXtpZihuPXIobikucmVwbGFjZSh0Ll9yYWRpYWxfZ3JhZGllbnQsZnVuY3Rpb24odCxlLHIpe2lmKGg9XCJyYWRpYWxcIixlJiZyKXtmPWkoZSkscD1pKHIpO3ZhciBuPTIqKHA+LjUpLTE7bChmLS41LDIpK2wocC0uNSwyKT4uMjUmJihwPWEuc3FydCguMjUtbChmLS41LDIpKSpuKy41KSYmLjUhPXAmJihwPXAudG9GaXhlZCg1KS0xZS01Km4pfXJldHVybiBjfSksbj1uLnNwbGl0KC9cXHMqXFwtXFxzKi8pLFwibGluZWFyXCI9PWgpe3ZhciBiPW4uc2hpZnQoKTtpZihiPS1pKGIpLGlzTmFOKGIpKXJldHVybiBudWxsO3ZhciBfPVswLDAsYS5jb3ModC5yYWQoYikpLGEuc2luKHQucmFkKGIpKV0sdz0xLyhzKG8oX1syXSksbyhfWzNdKSl8fDEpO19bMl0qPXcsX1szXSo9dyxfWzJdPDAmJihfWzBdPS1fWzJdLF9bMl09MCksX1szXTwwJiYoX1sxXT0tX1szXSxfWzNdPTApfXZhciBrPXQuX3BhcnNlRG90cyhuKTtpZighaylyZXR1cm4gbnVsbDtpZih1PXUucmVwbGFjZSgvW1xcKFxcKVxccyxcXHhiMCNdL2csXCJfXCIpLGUuZ3JhZGllbnQmJnUhPWUuZ3JhZGllbnQuaWQmJihnLmRlZnMucmVtb3ZlQ2hpbGQoZS5ncmFkaWVudCksZGVsZXRlIGUuZ3JhZGllbnQpLCFlLmdyYWRpZW50KXt5PXgoaCtcIkdyYWRpZW50XCIse2lkOnV9KSxlLmdyYWRpZW50PXkseCh5LFwicmFkaWFsXCI9PWg/e2Z4OmYsZnk6cH06e3gxOl9bMF0seTE6X1sxXSx4MjpfWzJdLHkyOl9bM10sZ3JhZGllbnRUcmFuc2Zvcm06ZS5tYXRyaXguaW52ZXJ0KCl9KSxnLmRlZnMuYXBwZW5kQ2hpbGQoeSk7Zm9yKHZhciBCPTAsQz1rLmxlbmd0aDtDPkI7QisrKXkuYXBwZW5kQ2hpbGQoeChcInN0b3BcIix7b2Zmc2V0OmtbQl0ub2Zmc2V0P2tbQl0ub2Zmc2V0OkI/XCIxMDAlXCI6XCIwJVwiLFwic3RvcC1jb2xvclwiOmtbQl0uY29sb3J8fFwiI2ZmZlwiLFwic3RvcC1vcGFjaXR5XCI6aXNGaW5pdGUoa1tCXS5vcGFjaXR5KT9rW0JdLm9wYWNpdHk6MX0pKX19cmV0dXJuIHgoZCx7ZmlsbDptKHUpLG9wYWNpdHk6MSxcImZpbGwtb3BhY2l0eVwiOjF9KSx2LmZpbGw9Yyx2Lm9wYWNpdHk9MSx2LmZpbGxPcGFjaXR5PTEsMX0seT1mdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmRvY3VtZW50TW9kZTtyZXR1cm4gdCYmKDk9PT10fHwxMD09PXQpfSxtPWZ1bmN0aW9uKHQpe2lmKHkoKSlyZXR1cm5cInVybCgnI1wiK3QrXCInKVwiO3ZhciBlPWRvY3VtZW50LmxvY2F0aW9uLHI9ZS5wcm90b2NvbCtcIi8vXCIrZS5ob3N0K2UucGF0aG5hbWUrZS5zZWFyY2g7cmV0dXJuXCJ1cmwoJ1wiK3IrXCIjXCIrdCtcIicpXCJ9LGI9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRCQm94KDEpO3godC5wYXR0ZXJuLHtwYXR0ZXJuVHJhbnNmb3JtOnQubWF0cml4LmludmVydCgpK1wiIHRyYW5zbGF0ZShcIitlLngrXCIsXCIrZS55K1wiKVwifSl9LF89ZnVuY3Rpb24oaSxuLGEpe2lmKFwicGF0aFwiPT1pLnR5cGUpe2Zvcih2YXIgcz1yKG4pLnRvTG93ZXJDYXNlKCkuc3BsaXQoXCItXCIpLG89aS5wYXBlcixsPWE/XCJlbmRcIjpcInN0YXJ0XCIsaD1pLm5vZGUsdT1pLmF0dHJzLGY9dVtcInN0cm9rZS13aWR0aFwiXSxwPXMubGVuZ3RoLHY9XCJjbGFzc2ljXCIseSxtLGIsXyx3LGs9MyxCPTMsQz01O3AtLTspc3dpdGNoKHNbcF0pe2Nhc2VcImJsb2NrXCI6Y2FzZVwiY2xhc3NpY1wiOmNhc2VcIm92YWxcIjpjYXNlXCJkaWFtb25kXCI6Y2FzZVwib3BlblwiOmNhc2VcIm5vbmVcIjp2PXNbcF07YnJlYWs7Y2FzZVwid2lkZVwiOkI9NTticmVhaztjYXNlXCJuYXJyb3dcIjpCPTI7YnJlYWs7Y2FzZVwibG9uZ1wiOms9NTticmVhaztjYXNlXCJzaG9ydFwiOms9Mn1pZihcIm9wZW5cIj09dj8oays9MixCKz0yLEMrPTIsYj0xLF89YT80OjEsdz17ZmlsbDpcIm5vbmVcIixzdHJva2U6dS5zdHJva2V9KTooXz1iPWsvMix3PXtmaWxsOnUuc3Ryb2tlLHN0cm9rZTpcIm5vbmVcIn0pLGkuXy5hcnJvd3M/YT8oaS5fLmFycm93cy5lbmRQYXRoJiZnW2kuXy5hcnJvd3MuZW5kUGF0aF0tLSxpLl8uYXJyb3dzLmVuZE1hcmtlciYmZ1tpLl8uYXJyb3dzLmVuZE1hcmtlcl0tLSk6KGkuXy5hcnJvd3Muc3RhcnRQYXRoJiZnW2kuXy5hcnJvd3Muc3RhcnRQYXRoXS0tLGkuXy5hcnJvd3Muc3RhcnRNYXJrZXImJmdbaS5fLmFycm93cy5zdGFydE1hcmtlcl0tLSk6aS5fLmFycm93cz17fSxcIm5vbmVcIiE9dil7dmFyIFM9XCJyYXBoYWVsLW1hcmtlci1cIit2LFQ9XCJyYXBoYWVsLW1hcmtlci1cIitsK3YraytCK1wiLW9ialwiK2kuaWQ7dC5fZy5kb2MuZ2V0RWxlbWVudEJ5SWQoUyk/Z1tTXSsrOihvLmRlZnMuYXBwZW5kQ2hpbGQoeCh4KFwicGF0aFwiKSx7XCJzdHJva2UtbGluZWNhcFwiOlwicm91bmRcIixkOmRbdl0saWQ6U30pKSxnW1NdPTEpO3ZhciBBPXQuX2cuZG9jLmdldEVsZW1lbnRCeUlkKFQpLEU7QT8oZ1tUXSsrLEU9QS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInVzZVwiKVswXSk6KEE9eCh4KFwibWFya2VyXCIpLHtpZDpULG1hcmtlckhlaWdodDpCLG1hcmtlcldpZHRoOmssb3JpZW50OlwiYXV0b1wiLHJlZlg6XyxyZWZZOkIvMn0pLEU9eCh4KFwidXNlXCIpLHtcInhsaW5rOmhyZWZcIjpcIiNcIitTLHRyYW5zZm9ybTooYT9cInJvdGF0ZSgxODAgXCIray8yK1wiIFwiK0IvMitcIikgXCI6YykrXCJzY2FsZShcIitrL0MrXCIsXCIrQi9DK1wiKVwiLFwic3Ryb2tlLXdpZHRoXCI6KDEvKChrL0MrQi9DKS8yKSkudG9GaXhlZCg0KX0pLEEuYXBwZW5kQ2hpbGQoRSksby5kZWZzLmFwcGVuZENoaWxkKEEpLGdbVF09MSkseChFLHcpO3ZhciBOPWIqKFwiZGlhbW9uZFwiIT12JiZcIm92YWxcIiE9dik7YT8oeT1pLl8uYXJyb3dzLnN0YXJ0ZHgqZnx8MCxtPXQuZ2V0VG90YWxMZW5ndGgodS5wYXRoKS1OKmYpOih5PU4qZixtPXQuZ2V0VG90YWxMZW5ndGgodS5wYXRoKS0oaS5fLmFycm93cy5lbmRkeCpmfHwwKSksdz17fSx3W1wibWFya2VyLVwiK2xdPVwidXJsKCNcIitUK1wiKVwiLChtfHx5KSYmKHcuZD10LmdldFN1YnBhdGgodS5wYXRoLHksbSkpLHgoaCx3KSxpLl8uYXJyb3dzW2wrXCJQYXRoXCJdPVMsaS5fLmFycm93c1tsK1wiTWFya2VyXCJdPVQsaS5fLmFycm93c1tsK1wiZHhcIl09TixpLl8uYXJyb3dzW2wrXCJUeXBlXCJdPXYsaS5fLmFycm93c1tsK1wiU3RyaW5nXCJdPW59ZWxzZSBhPyh5PWkuXy5hcnJvd3Muc3RhcnRkeCpmfHwwLG09dC5nZXRUb3RhbExlbmd0aCh1LnBhdGgpLXkpOih5PTAsbT10LmdldFRvdGFsTGVuZ3RoKHUucGF0aCktKGkuXy5hcnJvd3MuZW5kZHgqZnx8MCkpLGkuXy5hcnJvd3NbbCtcIlBhdGhcIl0mJngoaCx7ZDp0LmdldFN1YnBhdGgodS5wYXRoLHksbSl9KSxkZWxldGUgaS5fLmFycm93c1tsK1wiUGF0aFwiXSxkZWxldGUgaS5fLmFycm93c1tsK1wiTWFya2VyXCJdLGRlbGV0ZSBpLl8uYXJyb3dzW2wrXCJkeFwiXSxkZWxldGUgaS5fLmFycm93c1tsK1wiVHlwZVwiXSxkZWxldGUgaS5fLmFycm93c1tsK1wiU3RyaW5nXCJdO2Zvcih3IGluIGcpaWYoZ1tlXSh3KSYmIWdbd10pe3ZhciBNPXQuX2cuZG9jLmdldEVsZW1lbnRCeUlkKHcpO00mJk0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChNKX19fSx3PXtcIi1cIjpbMywxXSxcIi5cIjpbMSwxXSxcIi0uXCI6WzMsMSwxLDFdLFwiLS4uXCI6WzMsMSwxLDEsMSwxXSxcIi4gXCI6WzEsM10sXCItIFwiOls0LDNdLFwiLS1cIjpbOCwzXSxcIi0gLlwiOls0LDMsMSwzXSxcIi0tLlwiOls4LDMsMSwzXSxcIi0tLi5cIjpbOCwzLDEsMywxLDNdfSxrPWZ1bmN0aW9uKHQsZSxpKXtpZihlPXdbcihlKS50b0xvd2VyQ2FzZSgpXSl7Zm9yKHZhciBuPXQuYXR0cnNbXCJzdHJva2Utd2lkdGhcIl18fFwiMVwiLGE9e3JvdW5kOm4sc3F1YXJlOm4sYnV0dDowfVt0LmF0dHJzW1wic3Ryb2tlLWxpbmVjYXBcIl18fGlbXCJzdHJva2UtbGluZWNhcFwiXV18fDAscz1bXSxvPWUubGVuZ3RoO28tLTspc1tvXT1lW29dKm4rKG8lMj8xOi0xKSphO3godC5ub2RlLHtcInN0cm9rZS1kYXNoYXJyYXlcIjpzLmpvaW4oXCIsXCIpfSl9ZWxzZSB4KHQubm9kZSx7XCJzdHJva2UtZGFzaGFycmF5XCI6XCJub25lXCJ9KX0sQj1mdW5jdGlvbihpLGEpe3ZhciBsPWkubm9kZSx1PWkuYXR0cnMsZj1sLnN0eWxlLnZpc2liaWxpdHk7bC5zdHlsZS52aXNpYmlsaXR5PVwiaGlkZGVuXCI7Zm9yKHZhciBkIGluIGEpaWYoYVtlXShkKSl7aWYoIXQuX2F2YWlsYWJsZUF0dHJzW2VdKGQpKWNvbnRpbnVlO3ZhciBnPWFbZF07c3dpdGNoKHVbZF09ZyxkKXtjYXNlXCJibHVyXCI6aS5ibHVyKGcpO2JyZWFrO2Nhc2VcInRpdGxlXCI6dmFyIHk9bC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRpdGxlXCIpO2lmKHkubGVuZ3RoJiYoeT15WzBdKSl5LmZpcnN0Q2hpbGQubm9kZVZhbHVlPWc7ZWxzZXt5PXgoXCJ0aXRsZVwiKTt2YXIgbT10Ll9nLmRvYy5jcmVhdGVUZXh0Tm9kZShnKTt5LmFwcGVuZENoaWxkKG0pLGwuYXBwZW5kQ2hpbGQoeSl9YnJlYWs7Y2FzZVwiaHJlZlwiOmNhc2VcInRhcmdldFwiOnZhciB3PWwucGFyZW50Tm9kZTtpZihcImFcIiE9dy50YWdOYW1lLnRvTG93ZXJDYXNlKCkpe3ZhciBCPXgoXCJhXCIpO3cuaW5zZXJ0QmVmb3JlKEIsbCksQi5hcHBlbmRDaGlsZChsKSx3PUJ9XCJ0YXJnZXRcIj09ZD93LnNldEF0dHJpYnV0ZU5TKHAsXCJzaG93XCIsXCJibGFua1wiPT1nP1wibmV3XCI6Zyk6dy5zZXRBdHRyaWJ1dGVOUyhwLGQsZyk7YnJlYWs7Y2FzZVwiY3Vyc29yXCI6bC5zdHlsZS5jdXJzb3I9ZzticmVhaztjYXNlXCJ0cmFuc2Zvcm1cIjppLnRyYW5zZm9ybShnKTticmVhaztjYXNlXCJhcnJvdy1zdGFydFwiOl8oaSxnKTticmVhaztjYXNlXCJhcnJvdy1lbmRcIjpfKGksZywxKTticmVhaztjYXNlXCJjbGlwLXJlY3RcIjp2YXIgQz1yKGcpLnNwbGl0KGgpO2lmKDQ9PUMubGVuZ3RoKXtpLmNsaXAmJmkuY2xpcC5wYXJlbnROb2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaS5jbGlwLnBhcmVudE5vZGUpO3ZhciBUPXgoXCJjbGlwUGF0aFwiKSxBPXgoXCJyZWN0XCIpO1QuaWQ9dC5jcmVhdGVVVUlEKCkseChBLHt4OkNbMF0seTpDWzFdLHdpZHRoOkNbMl0saGVpZ2h0OkNbM119KSxULmFwcGVuZENoaWxkKEEpLGkucGFwZXIuZGVmcy5hcHBlbmRDaGlsZChUKSx4KGwse1wiY2xpcC1wYXRoXCI6XCJ1cmwoI1wiK1QuaWQrXCIpXCJ9KSxpLmNsaXA9QX1pZighZyl7dmFyIEU9bC5nZXRBdHRyaWJ1dGUoXCJjbGlwLXBhdGhcIik7aWYoRSl7dmFyIE49dC5fZy5kb2MuZ2V0RWxlbWVudEJ5SWQoRS5yZXBsYWNlKC8oXnVybFxcKCN8XFwpJCkvZyxjKSk7TiYmTi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKE4pLHgobCx7XCJjbGlwLXBhdGhcIjpjfSksZGVsZXRlIGkuY2xpcH19YnJlYWs7Y2FzZVwicGF0aFwiOlwicGF0aFwiPT1pLnR5cGUmJih4KGwse2Q6Zz91LnBhdGg9dC5fcGF0aFRvQWJzb2x1dGUoZyk6XCJNMCwwXCJ9KSxpLl8uZGlydHk9MSxpLl8uYXJyb3dzJiYoXCJzdGFydFN0cmluZ1wiaW4gaS5fLmFycm93cyYmXyhpLGkuXy5hcnJvd3Muc3RhcnRTdHJpbmcpLFwiZW5kU3RyaW5nXCJpbiBpLl8uYXJyb3dzJiZfKGksaS5fLmFycm93cy5lbmRTdHJpbmcsMSkpKTticmVhaztjYXNlXCJ3aWR0aFwiOmlmKGwuc2V0QXR0cmlidXRlKGQsZyksaS5fLmRpcnR5PTEsIXUuZngpYnJlYWs7ZD1cInhcIixnPXUueDtjYXNlXCJ4XCI6dS5meCYmKGc9LXUueC0odS53aWR0aHx8MCkpO2Nhc2VcInJ4XCI6aWYoXCJyeFwiPT1kJiZcInJlY3RcIj09aS50eXBlKWJyZWFrO2Nhc2VcImN4XCI6bC5zZXRBdHRyaWJ1dGUoZCxnKSxpLnBhdHRlcm4mJmIoaSksaS5fLmRpcnR5PTE7YnJlYWs7Y2FzZVwiaGVpZ2h0XCI6aWYobC5zZXRBdHRyaWJ1dGUoZCxnKSxpLl8uZGlydHk9MSwhdS5meSlicmVhaztkPVwieVwiLGc9dS55O2Nhc2VcInlcIjp1LmZ5JiYoZz0tdS55LSh1LmhlaWdodHx8MCkpO2Nhc2VcInJ5XCI6aWYoXCJyeVwiPT1kJiZcInJlY3RcIj09aS50eXBlKWJyZWFrO2Nhc2VcImN5XCI6bC5zZXRBdHRyaWJ1dGUoZCxnKSxpLnBhdHRlcm4mJmIoaSksaS5fLmRpcnR5PTE7YnJlYWs7Y2FzZVwiclwiOlwicmVjdFwiPT1pLnR5cGU/eChsLHtyeDpnLHJ5Omd9KTpsLnNldEF0dHJpYnV0ZShkLGcpLGkuXy5kaXJ0eT0xO2JyZWFrO2Nhc2VcInNyY1wiOlwiaW1hZ2VcIj09aS50eXBlJiZsLnNldEF0dHJpYnV0ZU5TKHAsXCJocmVmXCIsZyk7YnJlYWs7Y2FzZVwic3Ryb2tlLXdpZHRoXCI6MT09aS5fLnN4JiYxPT1pLl8uc3l8fChnLz1zKG8oaS5fLnN4KSxvKGkuXy5zeSkpfHwxKSxsLnNldEF0dHJpYnV0ZShkLGcpLHVbXCJzdHJva2UtZGFzaGFycmF5XCJdJiZrKGksdVtcInN0cm9rZS1kYXNoYXJyYXlcIl0sYSksaS5fLmFycm93cyYmKFwic3RhcnRTdHJpbmdcImluIGkuXy5hcnJvd3MmJl8oaSxpLl8uYXJyb3dzLnN0YXJ0U3RyaW5nKSxcImVuZFN0cmluZ1wiaW4gaS5fLmFycm93cyYmXyhpLGkuXy5hcnJvd3MuZW5kU3RyaW5nLDEpKTticmVhaztjYXNlXCJzdHJva2UtZGFzaGFycmF5XCI6ayhpLGcsYSk7YnJlYWs7Y2FzZVwiZmlsbFwiOnZhciBNPXIoZykubWF0Y2godC5fSVNVUkwpO2lmKE0pe1Q9eChcInBhdHRlcm5cIik7dmFyIEw9eChcImltYWdlXCIpO1QuaWQ9dC5jcmVhdGVVVUlEKCkseChULHt4OjAseTowLHBhdHRlcm5Vbml0czpcInVzZXJTcGFjZU9uVXNlXCIsaGVpZ2h0OjEsd2lkdGg6MX0pLHgoTCx7eDowLHk6MCxcInhsaW5rOmhyZWZcIjpNWzFdfSksVC5hcHBlbmRDaGlsZChMKSxmdW5jdGlvbihlKXt0Ll9wcmVsb2FkKE1bMV0sZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9mZnNldFdpZHRoLHI9dGhpcy5vZmZzZXRIZWlnaHQ7eChlLHt3aWR0aDp0LGhlaWdodDpyfSkseChMLHt3aWR0aDp0LGhlaWdodDpyfSl9KX0oVCksaS5wYXBlci5kZWZzLmFwcGVuZENoaWxkKFQpLHgobCx7ZmlsbDpcInVybCgjXCIrVC5pZCtcIilcIn0pLGkucGF0dGVybj1ULGkucGF0dGVybiYmYihpKTticmVha312YXIgej10LmdldFJHQihnKTtpZih6LmVycm9yKXtpZigoXCJjaXJjbGVcIj09aS50eXBlfHxcImVsbGlwc2VcIj09aS50eXBlfHxcInJcIiE9cihnKS5jaGFyQXQoKSkmJnYoaSxnKSl7XG5pZihcIm9wYWNpdHlcImluIHV8fFwiZmlsbC1vcGFjaXR5XCJpbiB1KXt2YXIgUD10Ll9nLmRvYy5nZXRFbGVtZW50QnlJZChsLmdldEF0dHJpYnV0ZShcImZpbGxcIikucmVwbGFjZSgvXnVybFxcKCN8XFwpJC9nLGMpKTtpZihQKXt2YXIgRj1QLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic3RvcFwiKTt4KEZbRi5sZW5ndGgtMV0se1wic3RvcC1vcGFjaXR5XCI6KFwib3BhY2l0eVwiaW4gdT91Lm9wYWNpdHk6MSkqKFwiZmlsbC1vcGFjaXR5XCJpbiB1P3VbXCJmaWxsLW9wYWNpdHlcIl06MSl9KX19dS5ncmFkaWVudD1nLHUuZmlsbD1cIm5vbmVcIjticmVha319ZWxzZSBkZWxldGUgYS5ncmFkaWVudCxkZWxldGUgdS5ncmFkaWVudCwhdC5pcyh1Lm9wYWNpdHksXCJ1bmRlZmluZWRcIikmJnQuaXMoYS5vcGFjaXR5LFwidW5kZWZpbmVkXCIpJiZ4KGwse29wYWNpdHk6dS5vcGFjaXR5fSksIXQuaXModVtcImZpbGwtb3BhY2l0eVwiXSxcInVuZGVmaW5lZFwiKSYmdC5pcyhhW1wiZmlsbC1vcGFjaXR5XCJdLFwidW5kZWZpbmVkXCIpJiZ4KGwse1wiZmlsbC1vcGFjaXR5XCI6dVtcImZpbGwtb3BhY2l0eVwiXX0pO3pbZV0oXCJvcGFjaXR5XCIpJiZ4KGwse1wiZmlsbC1vcGFjaXR5XCI6ei5vcGFjaXR5PjE/ei5vcGFjaXR5LzEwMDp6Lm9wYWNpdHl9KTtjYXNlXCJzdHJva2VcIjp6PXQuZ2V0UkdCKGcpLGwuc2V0QXR0cmlidXRlKGQsei5oZXgpLFwic3Ryb2tlXCI9PWQmJnpbZV0oXCJvcGFjaXR5XCIpJiZ4KGwse1wic3Ryb2tlLW9wYWNpdHlcIjp6Lm9wYWNpdHk+MT96Lm9wYWNpdHkvMTAwOnoub3BhY2l0eX0pLFwic3Ryb2tlXCI9PWQmJmkuXy5hcnJvd3MmJihcInN0YXJ0U3RyaW5nXCJpbiBpLl8uYXJyb3dzJiZfKGksaS5fLmFycm93cy5zdGFydFN0cmluZyksXCJlbmRTdHJpbmdcImluIGkuXy5hcnJvd3MmJl8oaSxpLl8uYXJyb3dzLmVuZFN0cmluZywxKSk7YnJlYWs7Y2FzZVwiZ3JhZGllbnRcIjooXCJjaXJjbGVcIj09aS50eXBlfHxcImVsbGlwc2VcIj09aS50eXBlfHxcInJcIiE9cihnKS5jaGFyQXQoKSkmJnYoaSxnKTticmVhaztjYXNlXCJvcGFjaXR5XCI6dS5ncmFkaWVudCYmIXVbZV0oXCJzdHJva2Utb3BhY2l0eVwiKSYmeChsLHtcInN0cm9rZS1vcGFjaXR5XCI6Zz4xP2cvMTAwOmd9KTtjYXNlXCJmaWxsLW9wYWNpdHlcIjppZih1LmdyYWRpZW50KXtQPXQuX2cuZG9jLmdldEVsZW1lbnRCeUlkKGwuZ2V0QXR0cmlidXRlKFwiZmlsbFwiKS5yZXBsYWNlKC9edXJsXFwoI3xcXCkkL2csYykpLFAmJihGPVAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzdG9wXCIpLHgoRltGLmxlbmd0aC0xXSx7XCJzdG9wLW9wYWNpdHlcIjpnfSkpO2JyZWFrfWRlZmF1bHQ6XCJmb250LXNpemVcIj09ZCYmKGc9bihnLDEwKStcInB4XCIpO3ZhciBSPWQucmVwbGFjZSgvKFxcLS4pL2csZnVuY3Rpb24odCl7cmV0dXJuIHQuc3Vic3RyaW5nKDEpLnRvVXBwZXJDYXNlKCl9KTtsLnN0eWxlW1JdPWcsaS5fLmRpcnR5PTEsbC5zZXRBdHRyaWJ1dGUoZCxnKX19UyhpLGEpLGwuc3R5bGUudmlzaWJpbGl0eT1mfSxDPTEuMixTPWZ1bmN0aW9uKGksYSl7aWYoXCJ0ZXh0XCI9PWkudHlwZSYmKGFbZV0oXCJ0ZXh0XCIpfHxhW2VdKFwiZm9udFwiKXx8YVtlXShcImZvbnQtc2l6ZVwiKXx8YVtlXShcInhcIil8fGFbZV0oXCJ5XCIpKSl7dmFyIHM9aS5hdHRycyxvPWkubm9kZSxsPW8uZmlyc3RDaGlsZD9uKHQuX2cuZG9jLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoby5maXJzdENoaWxkLGMpLmdldFByb3BlcnR5VmFsdWUoXCJmb250LXNpemVcIiksMTApOjEwO2lmKGFbZV0oXCJ0ZXh0XCIpKXtmb3Iocy50ZXh0PWEudGV4dDtvLmZpcnN0Q2hpbGQ7KW8ucmVtb3ZlQ2hpbGQoby5maXJzdENoaWxkKTtmb3IodmFyIGg9cihhLnRleHQpLnNwbGl0KFwiXFxuXCIpLHU9W10sZixwPTAsZD1oLmxlbmd0aDtkPnA7cCsrKWY9eChcInRzcGFuXCIpLHAmJngoZix7ZHk6bCpDLHg6cy54fSksZi5hcHBlbmRDaGlsZCh0Ll9nLmRvYy5jcmVhdGVUZXh0Tm9kZShoW3BdKSksby5hcHBlbmRDaGlsZChmKSx1W3BdPWZ9ZWxzZSBmb3IodT1vLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidHNwYW5cIikscD0wLGQ9dS5sZW5ndGg7ZD5wO3ArKylwP3godVtwXSx7ZHk6bCpDLHg6cy54fSk6eCh1WzBdLHtkeTowfSk7eChvLHt4OnMueCx5OnMueX0pLGkuXy5kaXJ0eT0xO3ZhciBnPWkuX2dldEJCb3goKSx2PXMueS0oZy55K2cuaGVpZ2h0LzIpO3YmJnQuaXModixcImZpbml0ZVwiKSYmeCh1WzBdLHtkeTp2fSl9fSxUPWZ1bmN0aW9uKHQpe3JldHVybiB0LnBhcmVudE5vZGUmJlwiYVwiPT09dC5wYXJlbnROb2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKT90LnBhcmVudE5vZGU6dH0sQT1mdW5jdGlvbihlLHIpe3ZhciBpPTAsbj0wO3RoaXNbMF09dGhpcy5ub2RlPWUsZS5yYXBoYWVsPSEwLHRoaXMuaWQ9dC5fb2lkKyssZS5yYXBoYWVsaWQ9dGhpcy5pZCx0aGlzLm1hdHJpeD10Lm1hdHJpeCgpLHRoaXMucmVhbFBhdGg9bnVsbCx0aGlzLnBhcGVyPXIsdGhpcy5hdHRycz10aGlzLmF0dHJzfHx7fSx0aGlzLl89e3RyYW5zZm9ybTpbXSxzeDoxLHN5OjEsZGVnOjAsZHg6MCxkeTowLGRpcnR5OjF9LCFyLmJvdHRvbSYmKHIuYm90dG9tPXRoaXMpLHRoaXMucHJldj1yLnRvcCxyLnRvcCYmKHIudG9wLm5leHQ9dGhpcyksci50b3A9dGhpcyx0aGlzLm5leHQ9bnVsbH0sRT10LmVsO0EucHJvdG90eXBlPUUsRS5jb25zdHJ1Y3Rvcj1BLHQuX2VuZ2luZS5wYXRoPWZ1bmN0aW9uKHQsZSl7dmFyIHI9eChcInBhdGhcIik7ZS5jYW52YXMmJmUuY2FudmFzLmFwcGVuZENoaWxkKHIpO3ZhciBpPW5ldyBBKHIsZSk7cmV0dXJuIGkudHlwZT1cInBhdGhcIixCKGkse2ZpbGw6XCJub25lXCIsc3Ryb2tlOlwiIzAwMFwiLHBhdGg6dH0pLGl9LEUucm90YXRlPWZ1bmN0aW9uKHQsZSxuKXtpZih0aGlzLnJlbW92ZWQpcmV0dXJuIHRoaXM7aWYodD1yKHQpLnNwbGl0KGgpLHQubGVuZ3RoLTEmJihlPWkodFsxXSksbj1pKHRbMl0pKSx0PWkodFswXSksbnVsbD09biYmKGU9biksbnVsbD09ZXx8bnVsbD09bil7dmFyIGE9dGhpcy5nZXRCQm94KDEpO2U9YS54K2Eud2lkdGgvMixuPWEueSthLmhlaWdodC8yfXJldHVybiB0aGlzLnRyYW5zZm9ybSh0aGlzLl8udHJhbnNmb3JtLmNvbmNhdChbW1wiclwiLHQsZSxuXV0pKSx0aGlzfSxFLnNjYWxlPWZ1bmN0aW9uKHQsZSxuLGEpe2lmKHRoaXMucmVtb3ZlZClyZXR1cm4gdGhpcztpZih0PXIodCkuc3BsaXQoaCksdC5sZW5ndGgtMSYmKGU9aSh0WzFdKSxuPWkodFsyXSksYT1pKHRbM10pKSx0PWkodFswXSksbnVsbD09ZSYmKGU9dCksbnVsbD09YSYmKG49YSksbnVsbD09bnx8bnVsbD09YSl2YXIgcz10aGlzLmdldEJCb3goMSk7cmV0dXJuIG49bnVsbD09bj9zLngrcy53aWR0aC8yOm4sYT1udWxsPT1hP3MueStzLmhlaWdodC8yOmEsdGhpcy50cmFuc2Zvcm0odGhpcy5fLnRyYW5zZm9ybS5jb25jYXQoW1tcInNcIix0LGUsbixhXV0pKSx0aGlzfSxFLnRyYW5zbGF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnJlbW92ZWQ/dGhpczoodD1yKHQpLnNwbGl0KGgpLHQubGVuZ3RoLTEmJihlPWkodFsxXSkpLHQ9aSh0WzBdKXx8MCxlPStlfHwwLHRoaXMudHJhbnNmb3JtKHRoaXMuXy50cmFuc2Zvcm0uY29uY2F0KFtbXCJ0XCIsdCxlXV0pKSx0aGlzKX0sRS50cmFuc2Zvcm09ZnVuY3Rpb24ocil7dmFyIGk9dGhpcy5fO2lmKG51bGw9PXIpcmV0dXJuIGkudHJhbnNmb3JtO2lmKHQuX2V4dHJhY3RUcmFuc2Zvcm0odGhpcyxyKSx0aGlzLmNsaXAmJngodGhpcy5jbGlwLHt0cmFuc2Zvcm06dGhpcy5tYXRyaXguaW52ZXJ0KCl9KSx0aGlzLnBhdHRlcm4mJmIodGhpcyksdGhpcy5ub2RlJiZ4KHRoaXMubm9kZSx7dHJhbnNmb3JtOnRoaXMubWF0cml4fSksMSE9aS5zeHx8MSE9aS5zeSl7dmFyIG49dGhpcy5hdHRyc1tlXShcInN0cm9rZS13aWR0aFwiKT90aGlzLmF0dHJzW1wic3Ryb2tlLXdpZHRoXCJdOjE7dGhpcy5hdHRyKHtcInN0cm9rZS13aWR0aFwiOm59KX1yZXR1cm4gaS50cmFuc2Zvcm09dGhpcy5tYXRyaXgudG9UcmFuc2Zvcm1TdHJpbmcoKSx0aGlzfSxFLmhpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW1vdmVkfHwodGhpcy5ub2RlLnN0eWxlLmRpc3BsYXk9XCJub25lXCIpLHRoaXN9LEUuc2hvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbW92ZWR8fCh0aGlzLm5vZGUuc3R5bGUuZGlzcGxheT1cIlwiKSx0aGlzfSxFLnJlbW92ZT1mdW5jdGlvbigpe3ZhciBlPVQodGhpcy5ub2RlKTtpZighdGhpcy5yZW1vdmVkJiZlLnBhcmVudE5vZGUpe3ZhciByPXRoaXMucGFwZXI7ci5fX3NldF9fJiZyLl9fc2V0X18uZXhjbHVkZSh0aGlzKSx1LnVuYmluZChcInJhcGhhZWwuKi4qLlwiK3RoaXMuaWQpLHRoaXMuZ3JhZGllbnQmJnIuZGVmcy5yZW1vdmVDaGlsZCh0aGlzLmdyYWRpZW50KSx0Ll90ZWFyKHRoaXMsciksZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLHRoaXMucmVtb3ZlRGF0YSgpO2Zvcih2YXIgaSBpbiB0aGlzKXRoaXNbaV09XCJmdW5jdGlvblwiPT10eXBlb2YgdGhpc1tpXT90Ll9yZW1vdmVkRmFjdG9yeShpKTpudWxsO3RoaXMucmVtb3ZlZD0hMH19LEUuX2dldEJCb3g9ZnVuY3Rpb24oKXtpZihcIm5vbmVcIj09dGhpcy5ub2RlLnN0eWxlLmRpc3BsYXkpe3RoaXMuc2hvdygpO3ZhciB0PSEwfXZhciBlPSExLHI7dGhpcy5wYXBlci5jYW52YXMucGFyZW50RWxlbWVudD9yPXRoaXMucGFwZXIuY2FudmFzLnBhcmVudEVsZW1lbnQuc3R5bGU6dGhpcy5wYXBlci5jYW52YXMucGFyZW50Tm9kZSYmKHI9dGhpcy5wYXBlci5jYW52YXMucGFyZW50Tm9kZS5zdHlsZSksciYmXCJub25lXCI9PXIuZGlzcGxheSYmKGU9ITAsci5kaXNwbGF5PVwiXCIpO3ZhciBpPXt9O3RyeXtpPXRoaXMubm9kZS5nZXRCQm94KCl9Y2F0Y2gobil7aT17eDp0aGlzLm5vZGUuY2xpZW50TGVmdCx5OnRoaXMubm9kZS5jbGllbnRUb3Asd2lkdGg6dGhpcy5ub2RlLmNsaWVudFdpZHRoLGhlaWdodDp0aGlzLm5vZGUuY2xpZW50SGVpZ2h0fX1maW5hbGx5e2k9aXx8e30sZSYmKHIuZGlzcGxheT1cIm5vbmVcIil9cmV0dXJuIHQmJnRoaXMuaGlkZSgpLGl9LEUuYXR0cj1mdW5jdGlvbihyLGkpe2lmKHRoaXMucmVtb3ZlZClyZXR1cm4gdGhpcztpZihudWxsPT1yKXt2YXIgbj17fTtmb3IodmFyIGEgaW4gdGhpcy5hdHRycyl0aGlzLmF0dHJzW2VdKGEpJiYoblthXT10aGlzLmF0dHJzW2FdKTtyZXR1cm4gbi5ncmFkaWVudCYmXCJub25lXCI9PW4uZmlsbCYmKG4uZmlsbD1uLmdyYWRpZW50KSYmZGVsZXRlIG4uZ3JhZGllbnQsbi50cmFuc2Zvcm09dGhpcy5fLnRyYW5zZm9ybSxufWlmKG51bGw9PWkmJnQuaXMocixcInN0cmluZ1wiKSl7aWYoXCJmaWxsXCI9PXImJlwibm9uZVwiPT10aGlzLmF0dHJzLmZpbGwmJnRoaXMuYXR0cnMuZ3JhZGllbnQpcmV0dXJuIHRoaXMuYXR0cnMuZ3JhZGllbnQ7aWYoXCJ0cmFuc2Zvcm1cIj09cilyZXR1cm4gdGhpcy5fLnRyYW5zZm9ybTtmb3IodmFyIHM9ci5zcGxpdChoKSxvPXt9LGw9MCxjPXMubGVuZ3RoO2M+bDtsKyspcj1zW2xdLHIgaW4gdGhpcy5hdHRycz9vW3JdPXRoaXMuYXR0cnNbcl06dC5pcyh0aGlzLnBhcGVyLmN1c3RvbUF0dHJpYnV0ZXNbcl0sXCJmdW5jdGlvblwiKT9vW3JdPXRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1tyXS5kZWY6b1tyXT10Ll9hdmFpbGFibGVBdHRyc1tyXTtyZXR1cm4gYy0xP286b1tzWzBdXX1pZihudWxsPT1pJiZ0LmlzKHIsXCJhcnJheVwiKSl7Zm9yKG89e30sbD0wLGM9ci5sZW5ndGg7Yz5sO2wrKylvW3JbbF1dPXRoaXMuYXR0cihyW2xdKTtyZXR1cm4gb31pZihudWxsIT1pKXt2YXIgZj17fTtmW3JdPWl9ZWxzZSBudWxsIT1yJiZ0LmlzKHIsXCJvYmplY3RcIikmJihmPXIpO2Zvcih2YXIgcCBpbiBmKXUoXCJyYXBoYWVsLmF0dHIuXCIrcCtcIi5cIit0aGlzLmlkLHRoaXMsZltwXSk7Zm9yKHAgaW4gdGhpcy5wYXBlci5jdXN0b21BdHRyaWJ1dGVzKWlmKHRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1tlXShwKSYmZltlXShwKSYmdC5pcyh0aGlzLnBhcGVyLmN1c3RvbUF0dHJpYnV0ZXNbcF0sXCJmdW5jdGlvblwiKSl7dmFyIGQ9dGhpcy5wYXBlci5jdXN0b21BdHRyaWJ1dGVzW3BdLmFwcGx5KHRoaXMsW10uY29uY2F0KGZbcF0pKTt0aGlzLmF0dHJzW3BdPWZbcF07Zm9yKHZhciBnIGluIGQpZFtlXShnKSYmKGZbZ109ZFtnXSl9cmV0dXJuIEIodGhpcyxmKSx0aGlzfSxFLnRvRnJvbnQ9ZnVuY3Rpb24oKXtpZih0aGlzLnJlbW92ZWQpcmV0dXJuIHRoaXM7dmFyIGU9VCh0aGlzLm5vZGUpO2UucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChlKTt2YXIgcj10aGlzLnBhcGVyO3JldHVybiByLnRvcCE9dGhpcyYmdC5fdG9mcm9udCh0aGlzLHIpLHRoaXN9LEUudG9CYWNrPWZ1bmN0aW9uKCl7aWYodGhpcy5yZW1vdmVkKXJldHVybiB0aGlzO3ZhciBlPVQodGhpcy5ub2RlKSxyPWUucGFyZW50Tm9kZTtyLmluc2VydEJlZm9yZShlLHIuZmlyc3RDaGlsZCksdC5fdG9iYWNrKHRoaXMsdGhpcy5wYXBlcik7dmFyIGk9dGhpcy5wYXBlcjtyZXR1cm4gdGhpc30sRS5pbnNlcnRBZnRlcj1mdW5jdGlvbihlKXtpZih0aGlzLnJlbW92ZWR8fCFlKXJldHVybiB0aGlzO3ZhciByPVQodGhpcy5ub2RlKSxpPVQoZS5ub2RlfHxlW2UubGVuZ3RoLTFdLm5vZGUpO3JldHVybiBpLm5leHRTaWJsaW5nP2kucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocixpLm5leHRTaWJsaW5nKTppLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQociksdC5faW5zZXJ0YWZ0ZXIodGhpcyxlLHRoaXMucGFwZXIpLHRoaXN9LEUuaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKGUpe2lmKHRoaXMucmVtb3ZlZHx8IWUpcmV0dXJuIHRoaXM7dmFyIHI9VCh0aGlzLm5vZGUpLGk9VChlLm5vZGV8fGVbMF0ubm9kZSk7cmV0dXJuIGkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocixpKSx0Ll9pbnNlcnRiZWZvcmUodGhpcyxlLHRoaXMucGFwZXIpLHRoaXN9LEUuYmx1cj1mdW5jdGlvbihlKXt2YXIgcj10aGlzO2lmKDAhPT0rZSl7dmFyIGk9eChcImZpbHRlclwiKSxuPXgoXCJmZUdhdXNzaWFuQmx1clwiKTtyLmF0dHJzLmJsdXI9ZSxpLmlkPXQuY3JlYXRlVVVJRCgpLHgobix7c3RkRGV2aWF0aW9uOitlfHwxLjV9KSxpLmFwcGVuZENoaWxkKG4pLHIucGFwZXIuZGVmcy5hcHBlbmRDaGlsZChpKSxyLl9ibHVyPWkseChyLm5vZGUse2ZpbHRlcjpcInVybCgjXCIraS5pZCtcIilcIn0pfWVsc2Ugci5fYmx1ciYmKHIuX2JsdXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyLl9ibHVyKSxkZWxldGUgci5fYmx1cixkZWxldGUgci5hdHRycy5ibHVyKSxyLm5vZGUucmVtb3ZlQXR0cmlidXRlKFwiZmlsdGVyXCIpO3JldHVybiByfSx0Ll9lbmdpbmUuY2lyY2xlPWZ1bmN0aW9uKHQsZSxyLGkpe3ZhciBuPXgoXCJjaXJjbGVcIik7dC5jYW52YXMmJnQuY2FudmFzLmFwcGVuZENoaWxkKG4pO3ZhciBhPW5ldyBBKG4sdCk7cmV0dXJuIGEuYXR0cnM9e2N4OmUsY3k6cixyOmksZmlsbDpcIm5vbmVcIixzdHJva2U6XCIjMDAwXCJ9LGEudHlwZT1cImNpcmNsZVwiLHgobixhLmF0dHJzKSxhfSx0Ll9lbmdpbmUucmVjdD1mdW5jdGlvbih0LGUscixpLG4sYSl7dmFyIHM9eChcInJlY3RcIik7dC5jYW52YXMmJnQuY2FudmFzLmFwcGVuZENoaWxkKHMpO3ZhciBvPW5ldyBBKHMsdCk7cmV0dXJuIG8uYXR0cnM9e3g6ZSx5OnIsd2lkdGg6aSxoZWlnaHQ6bixyeDphfHwwLHJ5OmF8fDAsZmlsbDpcIm5vbmVcIixzdHJva2U6XCIjMDAwXCJ9LG8udHlwZT1cInJlY3RcIix4KHMsby5hdHRycyksb30sdC5fZW5naW5lLmVsbGlwc2U9ZnVuY3Rpb24odCxlLHIsaSxuKXt2YXIgYT14KFwiZWxsaXBzZVwiKTt0LmNhbnZhcyYmdC5jYW52YXMuYXBwZW5kQ2hpbGQoYSk7dmFyIHM9bmV3IEEoYSx0KTtyZXR1cm4gcy5hdHRycz17Y3g6ZSxjeTpyLHJ4Omkscnk6bixmaWxsOlwibm9uZVwiLHN0cm9rZTpcIiMwMDBcIn0scy50eXBlPVwiZWxsaXBzZVwiLHgoYSxzLmF0dHJzKSxzfSx0Ll9lbmdpbmUuaW1hZ2U9ZnVuY3Rpb24odCxlLHIsaSxuLGEpe3ZhciBzPXgoXCJpbWFnZVwiKTt4KHMse3g6cix5Omksd2lkdGg6bixoZWlnaHQ6YSxwcmVzZXJ2ZUFzcGVjdFJhdGlvOlwibm9uZVwifSkscy5zZXRBdHRyaWJ1dGVOUyhwLFwiaHJlZlwiLGUpLHQuY2FudmFzJiZ0LmNhbnZhcy5hcHBlbmRDaGlsZChzKTt2YXIgbz1uZXcgQShzLHQpO3JldHVybiBvLmF0dHJzPXt4OnIseTppLHdpZHRoOm4saGVpZ2h0OmEsc3JjOmV9LG8udHlwZT1cImltYWdlXCIsb30sdC5fZW5naW5lLnRleHQ9ZnVuY3Rpb24oZSxyLGksbil7dmFyIGE9eChcInRleHRcIik7ZS5jYW52YXMmJmUuY2FudmFzLmFwcGVuZENoaWxkKGEpO3ZhciBzPW5ldyBBKGEsZSk7cmV0dXJuIHMuYXR0cnM9e3g6cix5OmksXCJ0ZXh0LWFuY2hvclwiOlwibWlkZGxlXCIsdGV4dDpuLFwiZm9udC1mYW1pbHlcIjp0Ll9hdmFpbGFibGVBdHRyc1tcImZvbnQtZmFtaWx5XCJdLFwiZm9udC1zaXplXCI6dC5fYXZhaWxhYmxlQXR0cnNbXCJmb250LXNpemVcIl0sc3Ryb2tlOlwibm9uZVwiLGZpbGw6XCIjMDAwXCJ9LHMudHlwZT1cInRleHRcIixCKHMscy5hdHRycyksc30sdC5fZW5naW5lLnNldFNpemU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy53aWR0aD10fHx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0PWV8fHRoaXMuaGVpZ2h0LHRoaXMuY2FudmFzLnNldEF0dHJpYnV0ZShcIndpZHRoXCIsdGhpcy53aWR0aCksdGhpcy5jYW52YXMuc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsdGhpcy5oZWlnaHQpLHRoaXMuX3ZpZXdCb3gmJnRoaXMuc2V0Vmlld0JveC5hcHBseSh0aGlzLHRoaXMuX3ZpZXdCb3gpLHRoaXN9LHQuX2VuZ2luZS5jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgZT10Ll9nZXRDb250YWluZXIuYXBwbHkoMCxhcmd1bWVudHMpLHI9ZSYmZS5jb250YWluZXIsaT1lLngsbj1lLnksYT1lLndpZHRoLHM9ZS5oZWlnaHQ7aWYoIXIpdGhyb3cgbmV3IEVycm9yKFwiU1ZHIGNvbnRhaW5lciBub3QgZm91bmQuXCIpO3ZhciBvPXgoXCJzdmdcIiksbD1cIm92ZXJmbG93OmhpZGRlbjtcIixoO3JldHVybiBpPWl8fDAsbj1ufHwwLGE9YXx8NTEyLHM9c3x8MzQyLHgobyx7aGVpZ2h0OnMsdmVyc2lvbjoxLjEsd2lkdGg6YSx4bWxuczpcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXCJ4bWxuczp4bGlua1wiOlwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wifSksMT09cj8oby5zdHlsZS5jc3NUZXh0PWwrXCJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OlwiK2krXCJweDt0b3A6XCIrbitcInB4XCIsdC5fZy5kb2MuYm9keS5hcHBlbmRDaGlsZChvKSxoPTEpOihvLnN0eWxlLmNzc1RleHQ9bCtcInBvc2l0aW9uOnJlbGF0aXZlXCIsci5maXJzdENoaWxkP3IuaW5zZXJ0QmVmb3JlKG8sci5maXJzdENoaWxkKTpyLmFwcGVuZENoaWxkKG8pKSxyPW5ldyB0Ll9QYXBlcixyLndpZHRoPWEsci5oZWlnaHQ9cyxyLmNhbnZhcz1vLHIuY2xlYXIoKSxyLl9sZWZ0PXIuX3RvcD0wLGgmJihyLnJlbmRlcmZpeD1mdW5jdGlvbigpe30pLHIucmVuZGVyZml4KCkscn0sdC5fZW5naW5lLnNldFZpZXdCb3g9ZnVuY3Rpb24odCxlLHIsaSxuKXt1KFwicmFwaGFlbC5zZXRWaWV3Qm94XCIsdGhpcyx0aGlzLl92aWV3Qm94LFt0LGUscixpLG5dKTt2YXIgYT10aGlzLmdldFNpemUoKSxvPXMoci9hLndpZHRoLGkvYS5oZWlnaHQpLGw9dGhpcy50b3AsaD1uP1wieE1pZFlNaWQgbWVldFwiOlwieE1pbllNaW5cIixjLHA7Zm9yKG51bGw9PXQ/KHRoaXMuX3ZiU2l6ZSYmKG89MSksZGVsZXRlIHRoaXMuX3ZiU2l6ZSxjPVwiMCAwIFwiK3RoaXMud2lkdGgrZit0aGlzLmhlaWdodCk6KHRoaXMuX3ZiU2l6ZT1vLGM9dCtmK2UrZityK2YraSkseCh0aGlzLmNhbnZhcyx7dmlld0JveDpjLHByZXNlcnZlQXNwZWN0UmF0aW86aH0pO28mJmw7KXA9XCJzdHJva2Utd2lkdGhcImluIGwuYXR0cnM/bC5hdHRyc1tcInN0cm9rZS13aWR0aFwiXToxLGwuYXR0cih7XCJzdHJva2Utd2lkdGhcIjpwfSksbC5fLmRpcnR5PTEsbC5fLmRpcnR5VD0xLGw9bC5wcmV2O3JldHVybiB0aGlzLl92aWV3Qm94PVt0LGUscixpLCEhbl0sdGhpc30sdC5wcm90b3R5cGUucmVuZGVyZml4PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jYW52YXMsZT10LnN0eWxlLHI7dHJ5e3I9dC5nZXRTY3JlZW5DVE0oKXx8dC5jcmVhdGVTVkdNYXRyaXgoKX1jYXRjaChpKXtyPXQuY3JlYXRlU1ZHTWF0cml4KCl9dmFyIG49LXIuZSUxLGE9LXIuZiUxOyhufHxhKSYmKG4mJih0aGlzLl9sZWZ0PSh0aGlzLl9sZWZ0K24pJTEsZS5sZWZ0PXRoaXMuX2xlZnQrXCJweFwiKSxhJiYodGhpcy5fdG9wPSh0aGlzLl90b3ArYSklMSxlLnRvcD10aGlzLl90b3ArXCJweFwiKSl9LHQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dC5ldmUoXCJyYXBoYWVsLmNsZWFyXCIsdGhpcyk7Zm9yKHZhciBlPXRoaXMuY2FudmFzO2UuZmlyc3RDaGlsZDspZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpO3RoaXMuYm90dG9tPXRoaXMudG9wPW51bGwsKHRoaXMuZGVzYz14KFwiZGVzY1wiKSkuYXBwZW5kQ2hpbGQodC5fZy5kb2MuY3JlYXRlVGV4dE5vZGUoXCJDcmVhdGVkIHdpdGggUmFwaGHDq2wgXCIrdC52ZXJzaW9uKSksZS5hcHBlbmRDaGlsZCh0aGlzLmRlc2MpLGUuYXBwZW5kQ2hpbGQodGhpcy5kZWZzPXgoXCJkZWZzXCIpKX0sdC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dShcInJhcGhhZWwucmVtb3ZlXCIsdGhpcyksdGhpcy5jYW52YXMucGFyZW50Tm9kZSYmdGhpcy5jYW52YXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7Zm9yKHZhciBlIGluIHRoaXMpdGhpc1tlXT1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzW2VdP3QuX3JlbW92ZWRGYWN0b3J5KGUpOm51bGx9O3ZhciBOPXQuc3Q7Zm9yKHZhciBNIGluIEUpRVtlXShNKSYmIU5bZV0oTSkmJihOW01dPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHIpe3JbdF0uYXBwbHkocixlKX0pfX0oTSkpfX0uYXBwbHkoZSxpKSwhKHZvaWQgMCE9PW4mJih0LmV4cG9ydHM9bikpfSxmdW5jdGlvbih0LGUscil7dmFyIGksbjtpPVtyKDEpXSxuPWZ1bmN0aW9uKHQpe2lmKCF0fHx0LnZtbCl7dmFyIGU9XCJoYXNPd25Qcm9wZXJ0eVwiLHI9U3RyaW5nLGk9cGFyc2VGbG9hdCxuPU1hdGgsYT1uLnJvdW5kLHM9bi5tYXgsbz1uLm1pbixsPW4uYWJzLGg9XCJmaWxsXCIsdT0vWywgXSsvLGM9dC5ldmUsZj1cIiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnRcIixwPVwiIFwiLGQ9XCJcIixnPXtNOlwibVwiLEw6XCJsXCIsQzpcImNcIixaOlwieFwiLG06XCJ0XCIsbDpcInJcIixjOlwidlwiLHo6XCJ4XCJ9LHg9LyhbY2xtel0pLD8oW15jbG16XSopL2dpLHY9LyBwcm9naWQ6XFxTK0JsdXJcXChbXlxcKV0rXFwpL2cseT0vLT9bXixcXHMtXSsvZyxtPVwicG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3RvcDowO3dpZHRoOjFweDtoZWlnaHQ6MXB4O2JlaGF2aW9yOnVybCgjZGVmYXVsdCNWTUwpXCIsYj0yMTYwMCxfPXtwYXRoOjEscmVjdDoxLGltYWdlOjF9LHc9e2NpcmNsZToxLGVsbGlwc2U6MX0saz1mdW5jdGlvbihlKXt2YXIgaT0vW2FocXN0dl0vZ2ksbj10Ll9wYXRoVG9BYnNvbHV0ZTtpZihyKGUpLm1hdGNoKGkpJiYobj10Ll9wYXRoMmN1cnZlKSxpPS9bY2xtel0vZyxuPT10Ll9wYXRoVG9BYnNvbHV0ZSYmIXIoZSkubWF0Y2goaSkpe3ZhciBzPXIoZSkucmVwbGFjZSh4LGZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1bXSxuPVwibVwiPT1lLnRvTG93ZXJDYXNlKCkscz1nW2VdO3JldHVybiByLnJlcGxhY2UoeSxmdW5jdGlvbih0KXtuJiYyPT1pLmxlbmd0aCYmKHMrPWkrZ1tcIm1cIj09ZT9cImxcIjpcIkxcIl0saT1bXSksaS5wdXNoKGEodCpiKSl9KSxzK2l9KTtyZXR1cm4gc312YXIgbz1uKGUpLGwsaDtzPVtdO2Zvcih2YXIgdT0wLGM9by5sZW5ndGg7Yz51O3UrKyl7bD1vW3VdLGg9b1t1XVswXS50b0xvd2VyQ2FzZSgpLFwielwiPT1oJiYoaD1cInhcIik7Zm9yKHZhciBmPTEsdj1sLmxlbmd0aDt2PmY7ZisrKWgrPWEobFtmXSpiKSsoZiE9di0xP1wiLFwiOmQpO3MucHVzaChoKX1yZXR1cm4gcy5qb2luKHApfSxCPWZ1bmN0aW9uKGUscixpKXt2YXIgbj10Lm1hdHJpeCgpO3JldHVybiBuLnJvdGF0ZSgtZSwuNSwuNSkse2R4Om4ueChyLGkpLGR5Om4ueShyLGkpfX0sQz1mdW5jdGlvbih0LGUscixpLG4sYSl7dmFyIHM9dC5fLG89dC5tYXRyaXgsdT1zLmZpbGxwb3MsYz10Lm5vZGUsZj1jLnN0eWxlLGQ9MSxnPVwiXCIseCx2PWIvZSx5PWIvcjtpZihmLnZpc2liaWxpdHk9XCJoaWRkZW5cIixlJiZyKXtpZihjLmNvb3Jkc2l6ZT1sKHYpK3ArbCh5KSxmLnJvdGF0aW9uPWEqKDA+ZSpyPy0xOjEpLGEpe3ZhciBtPUIoYSxpLG4pO2k9bS5keCxuPW0uZHl9aWYoMD5lJiYoZys9XCJ4XCIpLDA+ciYmKGcrPVwiIHlcIikmJihkPS0xKSxmLmZsaXA9ZyxjLmNvb3Jkb3JpZ2luPWkqLXYrcCtuKi15LHV8fHMuZmlsbHNpemUpe3ZhciBfPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaCk7Xz1fJiZfWzBdLGMucmVtb3ZlQ2hpbGQoXyksdSYmKG09QihhLG8ueCh1WzBdLHVbMV0pLG8ueSh1WzBdLHVbMV0pKSxfLnBvc2l0aW9uPW0uZHgqZCtwK20uZHkqZCkscy5maWxsc2l6ZSYmKF8uc2l6ZT1zLmZpbGxzaXplWzBdKmwoZSkrcCtzLmZpbGxzaXplWzFdKmwocikpLGMuYXBwZW5kQ2hpbGQoXyl9Zi52aXNpYmlsaXR5PVwidmlzaWJsZVwifX07dC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVyblwiWW91ciBicm93c2VyIGRvZXNu4oCZdCBzdXBwb3J0IFNWRy4gRmFsbGluZyBkb3duIHRvIFZNTC5cXG5Zb3UgYXJlIHJ1bm5pbmcgUmFwaGHDq2wgXCIrdGhpcy52ZXJzaW9ufTt2YXIgUz1mdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBuPXIoZSkudG9Mb3dlckNhc2UoKS5zcGxpdChcIi1cIiksYT1pP1wiZW5kXCI6XCJzdGFydFwiLHM9bi5sZW5ndGgsbz1cImNsYXNzaWNcIixsPVwibWVkaXVtXCIsaD1cIm1lZGl1bVwiO3MtLTspc3dpdGNoKG5bc10pe2Nhc2VcImJsb2NrXCI6Y2FzZVwiY2xhc3NpY1wiOmNhc2VcIm92YWxcIjpjYXNlXCJkaWFtb25kXCI6Y2FzZVwib3BlblwiOmNhc2VcIm5vbmVcIjpvPW5bc107YnJlYWs7Y2FzZVwid2lkZVwiOmNhc2VcIm5hcnJvd1wiOmg9bltzXTticmVhaztjYXNlXCJsb25nXCI6Y2FzZVwic2hvcnRcIjpsPW5bc119dmFyIHU9dC5ub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic3Ryb2tlXCIpWzBdO3VbYStcImFycm93XCJdPW8sdVthK1wiYXJyb3dsZW5ndGhcIl09bCx1W2ErXCJhcnJvd3dpZHRoXCJdPWh9LFQ9ZnVuY3Rpb24obixsKXtuLmF0dHJzPW4uYXR0cnN8fHt9O3ZhciBjPW4ubm9kZSxmPW4uYXR0cnMsZz1jLnN0eWxlLHgsdj1fW24udHlwZV0mJihsLnghPWYueHx8bC55IT1mLnl8fGwud2lkdGghPWYud2lkdGh8fGwuaGVpZ2h0IT1mLmhlaWdodHx8bC5jeCE9Zi5jeHx8bC5jeSE9Zi5jeXx8bC5yeCE9Zi5yeHx8bC5yeSE9Zi5yeXx8bC5yIT1mLnIpLHk9d1tuLnR5cGVdJiYoZi5jeCE9bC5jeHx8Zi5jeSE9bC5jeXx8Zi5yIT1sLnJ8fGYucnghPWwucnh8fGYucnkhPWwucnkpLG09bjtmb3IodmFyIEIgaW4gbClsW2VdKEIpJiYoZltCXT1sW0JdKTtpZih2JiYoZi5wYXRoPXQuX2dldFBhdGhbbi50eXBlXShuKSxuLl8uZGlydHk9MSksbC5ocmVmJiYoYy5ocmVmPWwuaHJlZiksbC50aXRsZSYmKGMudGl0bGU9bC50aXRsZSksbC50YXJnZXQmJihjLnRhcmdldD1sLnRhcmdldCksbC5jdXJzb3ImJihnLmN1cnNvcj1sLmN1cnNvciksXCJibHVyXCJpbiBsJiZuLmJsdXIobC5ibHVyKSwobC5wYXRoJiZcInBhdGhcIj09bi50eXBlfHx2KSYmKGMucGF0aD1rKH5yKGYucGF0aCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwiclwiKT90Ll9wYXRoVG9BYnNvbHV0ZShmLnBhdGgpOmYucGF0aCksbi5fLmRpcnR5PTEsXCJpbWFnZVwiPT1uLnR5cGUmJihuLl8uZmlsbHBvcz1bZi54LGYueV0sbi5fLmZpbGxzaXplPVtmLndpZHRoLGYuaGVpZ2h0XSxDKG4sMSwxLDAsMCwwKSkpLFwidHJhbnNmb3JtXCJpbiBsJiZuLnRyYW5zZm9ybShsLnRyYW5zZm9ybSkseSl7dmFyIFQ9K2YuY3gsRT0rZi5jeSxOPStmLnJ4fHwrZi5yfHwwLEw9K2Yucnl8fCtmLnJ8fDA7Yy5wYXRoPXQuZm9ybWF0KFwiYXJ7MH0sezF9LHsyfSx7M30sezR9LHsxfSx7NH0sezF9eFwiLGEoKFQtTikqYiksYSgoRS1MKSpiKSxhKChUK04pKmIpLGEoKEUrTCkqYiksYShUKmIpKSxuLl8uZGlydHk9MX1pZihcImNsaXAtcmVjdFwiaW4gbCl7dmFyIHo9cihsW1wiY2xpcC1yZWN0XCJdKS5zcGxpdCh1KTtpZig0PT16Lmxlbmd0aCl7elsyXT0relsyXSsgK3pbMF0selszXT0relszXSsgK3pbMV07dmFyIFA9Yy5jbGlwUmVjdHx8dC5fZy5kb2MuY3JlYXRlRWxlbWVudChcImRpdlwiKSxGPVAuc3R5bGU7Ri5jbGlwPXQuZm9ybWF0KFwicmVjdCh7MX1weCB7Mn1weCB7M31weCB7MH1weClcIix6KSxjLmNsaXBSZWN0fHwoRi5wb3NpdGlvbj1cImFic29sdXRlXCIsRi50b3A9MCxGLmxlZnQ9MCxGLndpZHRoPW4ucGFwZXIud2lkdGgrXCJweFwiLEYuaGVpZ2h0PW4ucGFwZXIuaGVpZ2h0K1wicHhcIixjLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKFAsYyksUC5hcHBlbmRDaGlsZChjKSxjLmNsaXBSZWN0PVApfWxbXCJjbGlwLXJlY3RcIl18fGMuY2xpcFJlY3QmJihjLmNsaXBSZWN0LnN0eWxlLmNsaXA9XCJhdXRvXCIpfWlmKG4udGV4dHBhdGgpe3ZhciBSPW4udGV4dHBhdGguc3R5bGU7bC5mb250JiYoUi5mb250PWwuZm9udCksbFtcImZvbnQtZmFtaWx5XCJdJiYoUi5mb250RmFtaWx5PSdcIicrbFtcImZvbnQtZmFtaWx5XCJdLnNwbGl0KFwiLFwiKVswXS5yZXBsYWNlKC9eWydcIl0rfFsnXCJdKyQvZyxkKSsnXCInKSxsW1wiZm9udC1zaXplXCJdJiYoUi5mb250U2l6ZT1sW1wiZm9udC1zaXplXCJdKSxsW1wiZm9udC13ZWlnaHRcIl0mJihSLmZvbnRXZWlnaHQ9bFtcImZvbnQtd2VpZ2h0XCJdKSxsW1wiZm9udC1zdHlsZVwiXSYmKFIuZm9udFN0eWxlPWxbXCJmb250LXN0eWxlXCJdKX1pZihcImFycm93LXN0YXJ0XCJpbiBsJiZTKG0sbFtcImFycm93LXN0YXJ0XCJdKSxcImFycm93LWVuZFwiaW4gbCYmUyhtLGxbXCJhcnJvdy1lbmRcIl0sMSksbnVsbCE9bC5vcGFjaXR5fHxudWxsIT1sW1wic3Ryb2tlLXdpZHRoXCJdfHxudWxsIT1sLmZpbGx8fG51bGwhPWwuc3JjfHxudWxsIT1sLnN0cm9rZXx8bnVsbCE9bFtcInN0cm9rZS13aWR0aFwiXXx8bnVsbCE9bFtcInN0cm9rZS1vcGFjaXR5XCJdfHxudWxsIT1sW1wiZmlsbC1vcGFjaXR5XCJdfHxudWxsIT1sW1wic3Ryb2tlLWRhc2hhcnJheVwiXXx8bnVsbCE9bFtcInN0cm9rZS1taXRlcmxpbWl0XCJdfHxudWxsIT1sW1wic3Ryb2tlLWxpbmVqb2luXCJdfHxudWxsIT1sW1wic3Ryb2tlLWxpbmVjYXBcIl0pe3ZhciBJPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoaCksaj0hMTtpZihJPUkmJklbMF0sIUkmJihqPUk9TShoKSksXCJpbWFnZVwiPT1uLnR5cGUmJmwuc3JjJiYoSS5zcmM9bC5zcmMpLGwuZmlsbCYmKEkub249ITApLG51bGwhPUkub24mJlwibm9uZVwiIT1sLmZpbGwmJm51bGwhPT1sLmZpbGx8fChJLm9uPSExKSxJLm9uJiZsLmZpbGwpe3ZhciBxPXIobC5maWxsKS5tYXRjaCh0Ll9JU1VSTCk7aWYocSl7SS5wYXJlbnROb2RlPT1jJiZjLnJlbW92ZUNoaWxkKEkpLEkucm90YXRlPSEwLEkuc3JjPXFbMV0sSS50eXBlPVwidGlsZVwiO3ZhciBEPW4uZ2V0QkJveCgxKTtJLnBvc2l0aW9uPUQueCtwK0QueSxuLl8uZmlsbHBvcz1bRC54LEQueV0sdC5fcHJlbG9hZChxWzFdLGZ1bmN0aW9uKCl7bi5fLmZpbGxzaXplPVt0aGlzLm9mZnNldFdpZHRoLHRoaXMub2Zmc2V0SGVpZ2h0XX0pfWVsc2UgSS5jb2xvcj10LmdldFJHQihsLmZpbGwpLmhleCxJLnNyYz1kLEkudHlwZT1cInNvbGlkXCIsdC5nZXRSR0IobC5maWxsKS5lcnJvciYmKG0udHlwZSBpbntjaXJjbGU6MSxlbGxpcHNlOjF9fHxcInJcIiE9cihsLmZpbGwpLmNoYXJBdCgpKSYmQShtLGwuZmlsbCxJKSYmKGYuZmlsbD1cIm5vbmVcIixmLmdyYWRpZW50PWwuZmlsbCxJLnJvdGF0ZT0hMSl9aWYoXCJmaWxsLW9wYWNpdHlcImluIGx8fFwib3BhY2l0eVwiaW4gbCl7dmFyIFY9KCgrZltcImZpbGwtb3BhY2l0eVwiXSsxfHwyKS0xKSooKCtmLm9wYWNpdHkrMXx8MiktMSkqKCgrdC5nZXRSR0IobC5maWxsKS5vKzF8fDIpLTEpO1Y9byhzKFYsMCksMSksSS5vcGFjaXR5PVYsSS5zcmMmJihJLmNvbG9yPVwibm9uZVwiKX1jLmFwcGVuZENoaWxkKEkpO3ZhciBPPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzdHJva2VcIikmJmMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzdHJva2VcIilbMF0sWT0hMTshTyYmKFk9Tz1NKFwic3Ryb2tlXCIpKSwobC5zdHJva2UmJlwibm9uZVwiIT1sLnN0cm9rZXx8bFtcInN0cm9rZS13aWR0aFwiXXx8bnVsbCE9bFtcInN0cm9rZS1vcGFjaXR5XCJdfHxsW1wic3Ryb2tlLWRhc2hhcnJheVwiXXx8bFtcInN0cm9rZS1taXRlcmxpbWl0XCJdfHxsW1wic3Ryb2tlLWxpbmVqb2luXCJdfHxsW1wic3Ryb2tlLWxpbmVjYXBcIl0pJiYoTy5vbj0hMCksKFwibm9uZVwiPT1sLnN0cm9rZXx8bnVsbD09PWwuc3Ryb2tlfHxudWxsPT1PLm9ufHwwPT1sLnN0cm9rZXx8MD09bFtcInN0cm9rZS13aWR0aFwiXSkmJihPLm9uPSExKTt2YXIgVz10LmdldFJHQihsLnN0cm9rZSk7Ty5vbiYmbC5zdHJva2UmJihPLmNvbG9yPVcuaGV4KSxWPSgoK2ZbXCJzdHJva2Utb3BhY2l0eVwiXSsxfHwyKS0xKSooKCtmLm9wYWNpdHkrMXx8MiktMSkqKCgrVy5vKzF8fDIpLTEpO3ZhciBHPS43NSooaShsW1wic3Ryb2tlLXdpZHRoXCJdKXx8MSk7aWYoVj1vKHMoViwwKSwxKSxudWxsPT1sW1wic3Ryb2tlLXdpZHRoXCJdJiYoRz1mW1wic3Ryb2tlLXdpZHRoXCJdKSxsW1wic3Ryb2tlLXdpZHRoXCJdJiYoTy53ZWlnaHQ9RyksRyYmMT5HJiYoVio9RykmJihPLndlaWdodD0xKSxPLm9wYWNpdHk9VixsW1wic3Ryb2tlLWxpbmVqb2luXCJdJiYoTy5qb2luc3R5bGU9bFtcInN0cm9rZS1saW5lam9pblwiXXx8XCJtaXRlclwiKSxPLm1pdGVybGltaXQ9bFtcInN0cm9rZS1taXRlcmxpbWl0XCJdfHw4LGxbXCJzdHJva2UtbGluZWNhcFwiXSYmKE8uZW5kY2FwPVwiYnV0dFwiPT1sW1wic3Ryb2tlLWxpbmVjYXBcIl0/XCJmbGF0XCI6XCJzcXVhcmVcIj09bFtcInN0cm9rZS1saW5lY2FwXCJdP1wic3F1YXJlXCI6XCJyb3VuZFwiKSxcInN0cm9rZS1kYXNoYXJyYXlcImluIGwpe3ZhciBIPXtcIi1cIjpcInNob3J0ZGFzaFwiLFwiLlwiOlwic2hvcnRkb3RcIixcIi0uXCI6XCJzaG9ydGRhc2hkb3RcIixcIi0uLlwiOlwic2hvcnRkYXNoZG90ZG90XCIsXCIuIFwiOlwiZG90XCIsXCItIFwiOlwiZGFzaFwiLFwiLS1cIjpcImxvbmdkYXNoXCIsXCItIC5cIjpcImRhc2hkb3RcIixcIi0tLlwiOlwibG9uZ2Rhc2hkb3RcIixcIi0tLi5cIjpcImxvbmdkYXNoZG90ZG90XCJ9O08uZGFzaHN0eWxlPUhbZV0obFtcInN0cm9rZS1kYXNoYXJyYXlcIl0pP0hbbFtcInN0cm9rZS1kYXNoYXJyYXlcIl1dOmR9WSYmYy5hcHBlbmRDaGlsZChPKX1pZihcInRleHRcIj09bS50eXBlKXttLnBhcGVyLmNhbnZhcy5zdHlsZS5kaXNwbGF5PWQ7dmFyIFg9bS5wYXBlci5zcGFuLFU9MTAwLCQ9Zi5mb250JiZmLmZvbnQubWF0Y2goL1xcZCsoPzpcXC5cXGQqKT8oPz1weCkvKTtnPVguc3R5bGUsZi5mb250JiYoZy5mb250PWYuZm9udCksZltcImZvbnQtZmFtaWx5XCJdJiYoZy5mb250RmFtaWx5PWZbXCJmb250LWZhbWlseVwiXSksZltcImZvbnQtd2VpZ2h0XCJdJiYoZy5mb250V2VpZ2h0PWZbXCJmb250LXdlaWdodFwiXSksZltcImZvbnQtc3R5bGVcIl0mJihnLmZvbnRTdHlsZT1mW1wiZm9udC1zdHlsZVwiXSksJD1pKGZbXCJmb250LXNpemVcIl18fCQmJiRbMF0pfHwxMCxnLmZvbnRTaXplPSQqVStcInB4XCIsbS50ZXh0cGF0aC5zdHJpbmcmJihYLmlubmVySFRNTD1yKG0udGV4dHBhdGguc3RyaW5nKS5yZXBsYWNlKC88L2csXCImIzYwO1wiKS5yZXBsYWNlKC8mL2csXCImIzM4O1wiKS5yZXBsYWNlKC9cXG4vZyxcIjxicj5cIikpO3ZhciBaPVguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7bS5XPWYudz0oWi5yaWdodC1aLmxlZnQpL1UsbS5IPWYuaD0oWi5ib3R0b20tWi50b3ApL1UsbS5YPWYueCxtLlk9Zi55K20uSC8yLChcInhcImluIGx8fFwieVwiaW4gbCkmJihtLnBhdGgudj10LmZvcm1hdChcIm17MH0sezF9bHsyfSx7MX1cIixhKGYueCpiKSxhKGYueSpiKSxhKGYueCpiKSsxKSk7Zm9yKHZhciBRPVtcInhcIixcInlcIixcInRleHRcIixcImZvbnRcIixcImZvbnQtZmFtaWx5XCIsXCJmb250LXdlaWdodFwiLFwiZm9udC1zdHlsZVwiLFwiZm9udC1zaXplXCJdLEo9MCxLPVEubGVuZ3RoO0s+SjtKKyspaWYoUVtKXWluIGwpe20uXy5kaXJ0eT0xO2JyZWFrfXN3aXRjaChmW1widGV4dC1hbmNob3JcIl0pe2Nhc2VcInN0YXJ0XCI6bS50ZXh0cGF0aC5zdHlsZVtcInYtdGV4dC1hbGlnblwiXT1cImxlZnRcIixtLmJieD1tLlcvMjticmVhaztjYXNlXCJlbmRcIjptLnRleHRwYXRoLnN0eWxlW1widi10ZXh0LWFsaWduXCJdPVwicmlnaHRcIixtLmJieD0tbS5XLzI7YnJlYWs7ZGVmYXVsdDptLnRleHRwYXRoLnN0eWxlW1widi10ZXh0LWFsaWduXCJdPVwiY2VudGVyXCIsbS5iYng9MH1tLnRleHRwYXRoLnN0eWxlW1widi10ZXh0LWtlcm5cIl09ITB9fSxBPWZ1bmN0aW9uKGUsYSxzKXtlLmF0dHJzPWUuYXR0cnN8fHt9O3ZhciBvPWUuYXR0cnMsbD1NYXRoLnBvdyxoLHUsYz1cImxpbmVhclwiLGY9XCIuNSAuNVwiO2lmKGUuYXR0cnMuZ3JhZGllbnQ9YSxhPXIoYSkucmVwbGFjZSh0Ll9yYWRpYWxfZ3JhZGllbnQsZnVuY3Rpb24odCxlLHIpe3JldHVybiBjPVwicmFkaWFsXCIsZSYmciYmKGU9aShlKSxyPWkociksbChlLS41LDIpK2woci0uNSwyKT4uMjUmJihyPW4uc3FydCguMjUtbChlLS41LDIpKSooMioocj4uNSktMSkrLjUpLGY9ZStwK3IpLGR9KSxhPWEuc3BsaXQoL1xccypcXC1cXHMqLyksXCJsaW5lYXJcIj09Yyl7dmFyIGc9YS5zaGlmdCgpO2lmKGc9LWkoZyksaXNOYU4oZykpcmV0dXJuIG51bGx9dmFyIHg9dC5fcGFyc2VEb3RzKGEpO2lmKCF4KXJldHVybiBudWxsO2lmKGU9ZS5zaGFwZXx8ZS5ub2RlLHgubGVuZ3RoKXtlLnJlbW92ZUNoaWxkKHMpLHMub249ITAscy5tZXRob2Q9XCJub25lXCIscy5jb2xvcj14WzBdLmNvbG9yLHMuY29sb3IyPXhbeC5sZW5ndGgtMV0uY29sb3I7Zm9yKHZhciB2PVtdLHk9MCxtPXgubGVuZ3RoO20+eTt5KyspeFt5XS5vZmZzZXQmJnYucHVzaCh4W3ldLm9mZnNldCtwK3hbeV0uY29sb3IpO3MuY29sb3JzPXYubGVuZ3RoP3Yuam9pbigpOlwiMCUgXCIrcy5jb2xvcixcInJhZGlhbFwiPT1jPyhzLnR5cGU9XCJncmFkaWVudFRpdGxlXCIscy5mb2N1cz1cIjEwMCVcIixzLmZvY3Vzc2l6ZT1cIjAgMFwiLHMuZm9jdXNwb3NpdGlvbj1mLHMuYW5nbGU9MCk6KHMudHlwZT1cImdyYWRpZW50XCIscy5hbmdsZT0oMjcwLWcpJTM2MCksZS5hcHBlbmRDaGlsZChzKX1yZXR1cm4gMX0sRT1mdW5jdGlvbihlLHIpe3RoaXNbMF09dGhpcy5ub2RlPWUsZS5yYXBoYWVsPSEwLHRoaXMuaWQ9dC5fb2lkKyssZS5yYXBoYWVsaWQ9dGhpcy5pZCx0aGlzLlg9MCx0aGlzLlk9MCx0aGlzLmF0dHJzPXt9LHRoaXMucGFwZXI9cix0aGlzLm1hdHJpeD10Lm1hdHJpeCgpLHRoaXMuXz17dHJhbnNmb3JtOltdLHN4OjEsc3k6MSxkeDowLGR5OjAsZGVnOjAsZGlydHk6MSxkaXJ0eVQ6MX0sIXIuYm90dG9tJiYoci5ib3R0b209dGhpcyksdGhpcy5wcmV2PXIudG9wLHIudG9wJiYoci50b3AubmV4dD10aGlzKSxyLnRvcD10aGlzLHRoaXMubmV4dD1udWxsfSxOPXQuZWw7RS5wcm90b3R5cGU9TixOLmNvbnN0cnVjdG9yPUUsTi50cmFuc2Zvcm09ZnVuY3Rpb24oZSl7aWYobnVsbD09ZSlyZXR1cm4gdGhpcy5fLnRyYW5zZm9ybTt2YXIgaT10aGlzLnBhcGVyLl92aWV3Qm94U2hpZnQsbj1pP1wic1wiK1tpLnNjYWxlLGkuc2NhbGVdK1wiLTEtMXRcIitbaS5keCxpLmR5XTpkLGE7aSYmKGE9ZT1yKGUpLnJlcGxhY2UoL1xcLnszfXxcXHUyMDI2L2csdGhpcy5fLnRyYW5zZm9ybXx8ZCkpLHQuX2V4dHJhY3RUcmFuc2Zvcm0odGhpcyxuK2UpO3ZhciBzPXRoaXMubWF0cml4LmNsb25lKCksbz10aGlzLnNrZXcsbD10aGlzLm5vZGUsaCx1PX5yKHRoaXMuYXR0cnMuZmlsbCkuaW5kZXhPZihcIi1cIiksYz0hcih0aGlzLmF0dHJzLmZpbGwpLmluZGV4T2YoXCJ1cmwoXCIpO2lmKHMudHJhbnNsYXRlKDEsMSksY3x8dXx8XCJpbWFnZVwiPT10aGlzLnR5cGUpaWYoby5tYXRyaXg9XCIxIDAgMCAxXCIsby5vZmZzZXQ9XCIwIDBcIixoPXMuc3BsaXQoKSx1JiZoLm5vUm90YXRpb258fCFoLmlzU2ltcGxlKXtsLnN0eWxlLmZpbHRlcj1zLnRvRmlsdGVyKCk7dmFyIGY9dGhpcy5nZXRCQm94KCksZz10aGlzLmdldEJCb3goMSkseD1mLngtZy54LHY9Zi55LWcueTtsLmNvb3Jkb3JpZ2luPXgqLWIrcCt2Ki1iLEModGhpcywxLDEseCx2LDApfWVsc2UgbC5zdHlsZS5maWx0ZXI9ZCxDKHRoaXMsaC5zY2FsZXgsaC5zY2FsZXksaC5keCxoLmR5LGgucm90YXRlKTtlbHNlIGwuc3R5bGUuZmlsdGVyPWQsby5tYXRyaXg9cihzKSxvLm9mZnNldD1zLm9mZnNldCgpO3JldHVybiBudWxsIT09YSYmKHRoaXMuXy50cmFuc2Zvcm09YSx0Ll9leHRyYWN0VHJhbnNmb3JtKHRoaXMsYSkpLHRoaXN9LE4ucm90YXRlPWZ1bmN0aW9uKHQsZSxuKXtpZih0aGlzLnJlbW92ZWQpcmV0dXJuIHRoaXM7aWYobnVsbCE9dCl7aWYodD1yKHQpLnNwbGl0KHUpLHQubGVuZ3RoLTEmJihlPWkodFsxXSksbj1pKHRbMl0pKSx0PWkodFswXSksbnVsbD09biYmKGU9biksbnVsbD09ZXx8bnVsbD09bil7dmFyIGE9dGhpcy5nZXRCQm94KDEpO2U9YS54K2Eud2lkdGgvMixuPWEueSthLmhlaWdodC8yfXJldHVybiB0aGlzLl8uZGlydHlUPTEsdGhpcy50cmFuc2Zvcm0odGhpcy5fLnRyYW5zZm9ybS5jb25jYXQoW1tcInJcIix0LGUsbl1dKSksdGhpc319LE4udHJhbnNsYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucmVtb3ZlZD90aGlzOih0PXIodCkuc3BsaXQodSksdC5sZW5ndGgtMSYmKGU9aSh0WzFdKSksdD1pKHRbMF0pfHwwLGU9K2V8fDAsdGhpcy5fLmJib3gmJih0aGlzLl8uYmJveC54Kz10LHRoaXMuXy5iYm94LnkrPWUpLHRoaXMudHJhbnNmb3JtKHRoaXMuXy50cmFuc2Zvcm0uY29uY2F0KFtbXCJ0XCIsdCxlXV0pKSx0aGlzKX0sTi5zY2FsZT1mdW5jdGlvbih0LGUsbixhKXtpZih0aGlzLnJlbW92ZWQpcmV0dXJuIHRoaXM7aWYodD1yKHQpLnNwbGl0KHUpLHQubGVuZ3RoLTEmJihlPWkodFsxXSksbj1pKHRbMl0pLGE9aSh0WzNdKSxpc05hTihuKSYmKG49bnVsbCksaXNOYU4oYSkmJihhPW51bGwpKSx0PWkodFswXSksbnVsbD09ZSYmKGU9dCksbnVsbD09YSYmKG49YSksbnVsbD09bnx8bnVsbD09YSl2YXIgcz10aGlzLmdldEJCb3goMSk7cmV0dXJuIG49bnVsbD09bj9zLngrcy53aWR0aC8yOm4sYT1udWxsPT1hP3MueStzLmhlaWdodC8yOmEsdGhpcy50cmFuc2Zvcm0odGhpcy5fLnRyYW5zZm9ybS5jb25jYXQoW1tcInNcIix0LGUsbixhXV0pKSx0aGlzLl8uZGlydHlUPTEsdGhpc30sTi5oaWRlPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMucmVtb3ZlZCYmKHRoaXMubm9kZS5zdHlsZS5kaXNwbGF5PVwibm9uZVwiKSx0aGlzfSxOLnNob3c9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5yZW1vdmVkJiYodGhpcy5ub2RlLnN0eWxlLmRpc3BsYXk9ZCksdGhpc30sTi5hdXhHZXRCQm94PXQuZWwuZ2V0QkJveCxOLmdldEJCb3g9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmF1eEdldEJCb3goKTtpZih0aGlzLnBhcGVyJiZ0aGlzLnBhcGVyLl92aWV3Qm94U2hpZnQpe3ZhciBlPXt9LHI9MS90aGlzLnBhcGVyLl92aWV3Qm94U2hpZnQuc2NhbGU7cmV0dXJuIGUueD10LngtdGhpcy5wYXBlci5fdmlld0JveFNoaWZ0LmR4LGUueCo9cixlLnk9dC55LXRoaXMucGFwZXIuX3ZpZXdCb3hTaGlmdC5keSxlLnkqPXIsZS53aWR0aD10LndpZHRoKnIsZS5oZWlnaHQ9dC5oZWlnaHQqcixlLngyPWUueCtlLndpZHRoLGUueTI9ZS55K2UuaGVpZ2h0LGV9cmV0dXJuIHR9LE4uX2dldEJCb3g9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW1vdmVkP3t9Ont4OnRoaXMuWCsodGhpcy5iYnh8fDApLXRoaXMuVy8yLHk6dGhpcy5ZLXRoaXMuSCx3aWR0aDp0aGlzLlcsaGVpZ2h0OnRoaXMuSH19LE4ucmVtb3ZlPWZ1bmN0aW9uKCl7aWYoIXRoaXMucmVtb3ZlZCYmdGhpcy5ub2RlLnBhcmVudE5vZGUpe3RoaXMucGFwZXIuX19zZXRfXyYmdGhpcy5wYXBlci5fX3NldF9fLmV4Y2x1ZGUodGhpcyksdC5ldmUudW5iaW5kKFwicmFwaGFlbC4qLiouXCIrdGhpcy5pZCksdC5fdGVhcih0aGlzLHRoaXMucGFwZXIpLHRoaXMubm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubm9kZSksdGhpcy5zaGFwZSYmdGhpcy5zaGFwZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuc2hhcGUpO2Zvcih2YXIgZSBpbiB0aGlzKXRoaXNbZV09XCJmdW5jdGlvblwiPT10eXBlb2YgdGhpc1tlXT90Ll9yZW1vdmVkRmFjdG9yeShlKTpudWxsO3RoaXMucmVtb3ZlZD0hMH19LE4uYXR0cj1mdW5jdGlvbihyLGkpe2lmKHRoaXMucmVtb3ZlZClyZXR1cm4gdGhpcztpZihudWxsPT1yKXt2YXIgbj17fTtmb3IodmFyIGEgaW4gdGhpcy5hdHRycyl0aGlzLmF0dHJzW2VdKGEpJiYoblthXT10aGlzLmF0dHJzW2FdKTtyZXR1cm4gbi5ncmFkaWVudCYmXCJub25lXCI9PW4uZmlsbCYmKG4uZmlsbD1uLmdyYWRpZW50KSYmZGVsZXRlIG4uZ3JhZGllbnQsbi50cmFuc2Zvcm09dGhpcy5fLnRyYW5zZm9ybSxufWlmKG51bGw9PWkmJnQuaXMocixcInN0cmluZ1wiKSl7aWYocj09aCYmXCJub25lXCI9PXRoaXMuYXR0cnMuZmlsbCYmdGhpcy5hdHRycy5ncmFkaWVudClyZXR1cm4gdGhpcy5hdHRycy5ncmFkaWVudDtmb3IodmFyIHM9ci5zcGxpdCh1KSxvPXt9LGw9MCxmPXMubGVuZ3RoO2Y+bDtsKyspcj1zW2xdLHIgaW4gdGhpcy5hdHRycz9vW3JdPXRoaXMuYXR0cnNbcl06dC5pcyh0aGlzLnBhcGVyLmN1c3RvbUF0dHJpYnV0ZXNbcl0sXCJmdW5jdGlvblwiKT9vW3JdPXRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1tyXS5kZWY6b1tyXT10Ll9hdmFpbGFibGVBdHRyc1tyXTtyZXR1cm4gZi0xP286b1tzWzBdXX1pZih0aGlzLmF0dHJzJiZudWxsPT1pJiZ0LmlzKHIsXCJhcnJheVwiKSl7Zm9yKG89e30sbD0wLGY9ci5sZW5ndGg7Zj5sO2wrKylvW3JbbF1dPXRoaXMuYXR0cihyW2xdKTtyZXR1cm4gb312YXIgcDtudWxsIT1pJiYocD17fSxwW3JdPWkpLG51bGw9PWkmJnQuaXMocixcIm9iamVjdFwiKSYmKHA9cik7Zm9yKHZhciBkIGluIHApYyhcInJhcGhhZWwuYXR0ci5cIitkK1wiLlwiK3RoaXMuaWQsdGhpcyxwW2RdKTtpZihwKXtmb3IoZCBpbiB0aGlzLnBhcGVyLmN1c3RvbUF0dHJpYnV0ZXMpaWYodGhpcy5wYXBlci5jdXN0b21BdHRyaWJ1dGVzW2VdKGQpJiZwW2VdKGQpJiZ0LmlzKHRoaXMucGFwZXIuY3VzdG9tQXR0cmlidXRlc1tkXSxcImZ1bmN0aW9uXCIpKXt2YXIgZz10aGlzLnBhcGVyLmN1c3RvbUF0dHJpYnV0ZXNbZF0uYXBwbHkodGhpcyxbXS5jb25jYXQocFtkXSkpO3RoaXMuYXR0cnNbZF09cFtkXTtmb3IodmFyIHggaW4gZylnW2VdKHgpJiYocFt4XT1nW3hdKX1wLnRleHQmJlwidGV4dFwiPT10aGlzLnR5cGUmJih0aGlzLnRleHRwYXRoLnN0cmluZz1wLnRleHQpLFQodGhpcyxwKX1yZXR1cm4gdGhpc30sTi50b0Zyb250PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMucmVtb3ZlZCYmdGhpcy5ub2RlLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy5ub2RlKSx0aGlzLnBhcGVyJiZ0aGlzLnBhcGVyLnRvcCE9dGhpcyYmdC5fdG9mcm9udCh0aGlzLHRoaXMucGFwZXIpLHRoaXN9LE4udG9CYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVtb3ZlZD90aGlzOih0aGlzLm5vZGUucGFyZW50Tm9kZS5maXJzdENoaWxkIT10aGlzLm5vZGUmJih0aGlzLm5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLHRoaXMubm9kZS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpLHQuX3RvYmFjayh0aGlzLHRoaXMucGFwZXIpKSx0aGlzKX0sTi5pbnNlcnRBZnRlcj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZW1vdmVkP3RoaXM6KGUuY29uc3RydWN0b3I9PXQuc3QuY29uc3RydWN0b3ImJihlPWVbZS5sZW5ndGgtMV0pLGUubm9kZS5uZXh0U2libGluZz9lLm5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5ub2RlLGUubm9kZS5uZXh0U2libGluZyk6ZS5ub2RlLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcy5ub2RlKSx0Ll9pbnNlcnRhZnRlcih0aGlzLGUsdGhpcy5wYXBlciksdGhpcyl9LE4uaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnJlbW92ZWQ/dGhpczooZS5jb25zdHJ1Y3Rvcj09dC5zdC5jb25zdHJ1Y3RvciYmKGU9ZVswXSksZS5ub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMubm9kZSxlLm5vZGUpLHQuX2luc2VydGJlZm9yZSh0aGlzLGUsdGhpcy5wYXBlciksdGhpcyl9LE4uYmx1cj1mdW5jdGlvbihlKXt2YXIgcj10aGlzLm5vZGUucnVudGltZVN0eWxlLGk9ci5maWx0ZXI7cmV0dXJuIGk9aS5yZXBsYWNlKHYsZCksMCE9PStlPyh0aGlzLmF0dHJzLmJsdXI9ZSxyLmZpbHRlcj1pK3ArZitcIi5CbHVyKHBpeGVscmFkaXVzPVwiKygrZXx8MS41KStcIilcIixyLm1hcmdpbj10LmZvcm1hdChcIi17MH1weCAwIDAgLXswfXB4XCIsYSgrZXx8MS41KSkpOihyLmZpbHRlcj1pLHIubWFyZ2luPTAsZGVsZXRlIHRoaXMuYXR0cnMuYmx1ciksdGhpc30sdC5fZW5naW5lLnBhdGg9ZnVuY3Rpb24odCxlKXt2YXIgcj1NKFwic2hhcGVcIik7ci5zdHlsZS5jc3NUZXh0PW0sci5jb29yZHNpemU9YitwK2Isci5jb29yZG9yaWdpbj1lLmNvb3Jkb3JpZ2luO3ZhciBpPW5ldyBFKHIsZSksbj17ZmlsbDpcIm5vbmVcIixzdHJva2U6XCIjMDAwXCJ9O3QmJihuLnBhdGg9dCksaS50eXBlPVwicGF0aFwiLGkucGF0aD1bXSxpLlBhdGg9ZCxUKGksbiksZS5jYW52YXMmJmUuY2FudmFzLmFwcGVuZENoaWxkKHIpO3ZhciBhPU0oXCJza2V3XCIpO3JldHVybiBhLm9uPSEwLHIuYXBwZW5kQ2hpbGQoYSksaS5za2V3PWEsaS50cmFuc2Zvcm0oZCksaX0sdC5fZW5naW5lLnJlY3Q9ZnVuY3Rpb24oZSxyLGksbixhLHMpe3ZhciBvPXQuX3JlY3RQYXRoKHIsaSxuLGEscyksbD1lLnBhdGgobyksaD1sLmF0dHJzO3JldHVybiBsLlg9aC54PXIsbC5ZPWgueT1pLGwuVz1oLndpZHRoPW4sbC5IPWguaGVpZ2h0PWEsaC5yPXMsaC5wYXRoPW8sbC50eXBlPVwicmVjdFwiLGx9LHQuX2VuZ2luZS5lbGxpcHNlPWZ1bmN0aW9uKHQsZSxyLGksbil7dmFyIGE9dC5wYXRoKCkscz1hLmF0dHJzO3JldHVybiBhLlg9ZS1pLGEuWT1yLW4sYS5XPTIqaSxhLkg9MipuLGEudHlwZT1cImVsbGlwc2VcIixUKGEse2N4OmUsY3k6cixyeDppLHJ5Om59KSxhfSx0Ll9lbmdpbmUuY2lyY2xlPWZ1bmN0aW9uKHQsZSxyLGkpe3ZhciBuPXQucGF0aCgpLGE9bi5hdHRycztyZXR1cm4gbi5YPWUtaSxuLlk9ci1pLG4uVz1uLkg9MippLG4udHlwZT1cImNpcmNsZVwiLFQobix7Y3g6ZSxjeTpyLHI6aX0pLG59LHQuX2VuZ2luZS5pbWFnZT1mdW5jdGlvbihlLHIsaSxuLGEscyl7dmFyIG89dC5fcmVjdFBhdGgoaSxuLGEscyksbD1lLnBhdGgobykuYXR0cih7c3Ryb2tlOlwibm9uZVwifSksdT1sLmF0dHJzLGM9bC5ub2RlLGY9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZShoKVswXTtyZXR1cm4gdS5zcmM9cixsLlg9dS54PWksbC5ZPXUueT1uLGwuVz11LndpZHRoPWEsbC5IPXUuaGVpZ2h0PXMsdS5wYXRoPW8sbC50eXBlPVwiaW1hZ2VcIixmLnBhcmVudE5vZGU9PWMmJmMucmVtb3ZlQ2hpbGQoZiksZi5yb3RhdGU9ITAsZi5zcmM9cixmLnR5cGU9XCJ0aWxlXCIsbC5fLmZpbGxwb3M9W2ksbl0sbC5fLmZpbGxzaXplPVthLHNdLGMuYXBwZW5kQ2hpbGQoZiksQyhsLDEsMSwwLDAsMCksbH0sdC5fZW5naW5lLnRleHQ9ZnVuY3Rpb24oZSxpLG4scyl7dmFyIG89TShcInNoYXBlXCIpLGw9TShcInBhdGhcIiksaD1NKFwidGV4dHBhdGhcIik7aT1pfHwwLG49bnx8MCxzPXN8fFwiXCIsbC52PXQuZm9ybWF0KFwibXswfSx7MX1sezJ9LHsxfVwiLGEoaSpiKSxhKG4qYiksYShpKmIpKzEpLGwudGV4dHBhdGhvaz0hMCxoLnN0cmluZz1yKHMpLGgub249ITAsby5zdHlsZS5jc3NUZXh0PW0sby5jb29yZHNpemU9YitwK2Isby5jb29yZG9yaWdpbj1cIjAgMFwiO3ZhciB1PW5ldyBFKG8sZSksYz17ZmlsbDpcIiMwMDBcIixzdHJva2U6XCJub25lXCIsZm9udDp0Ll9hdmFpbGFibGVBdHRycy5mb250LHRleHQ6c307dS5zaGFwZT1vLHUucGF0aD1sLHUudGV4dHBhdGg9aCx1LnR5cGU9XCJ0ZXh0XCIsdS5hdHRycy50ZXh0PXIocyksdS5hdHRycy54PWksdS5hdHRycy55PW4sdS5hdHRycy53PTEsdS5hdHRycy5oPTEsVCh1LGMpLG8uYXBwZW5kQ2hpbGQoaCksby5hcHBlbmRDaGlsZChsKSxlLmNhbnZhcy5hcHBlbmRDaGlsZChvKTt2YXIgZj1NKFwic2tld1wiKTtyZXR1cm4gZi5vbj0hMCxvLmFwcGVuZENoaWxkKGYpLHUuc2tldz1mLHUudHJhbnNmb3JtKGQpLHV9LHQuX2VuZ2luZS5zZXRTaXplPWZ1bmN0aW9uKGUscil7dmFyIGk9dGhpcy5jYW52YXMuc3R5bGU7cmV0dXJuIHRoaXMud2lkdGg9ZSx0aGlzLmhlaWdodD1yLGU9PStlJiYoZSs9XCJweFwiKSxyPT0rciYmKHIrPVwicHhcIiksaS53aWR0aD1lLGkuaGVpZ2h0PXIsaS5jbGlwPVwicmVjdCgwIFwiK2UrXCIgXCIrcitcIiAwKVwiLHRoaXMuX3ZpZXdCb3gmJnQuX2VuZ2luZS5zZXRWaWV3Qm94LmFwcGx5KHRoaXMsdGhpcy5fdmlld0JveCksdGhpc30sdC5fZW5naW5lLnNldFZpZXdCb3g9ZnVuY3Rpb24oZSxyLGksbixhKXt0LmV2ZShcInJhcGhhZWwuc2V0Vmlld0JveFwiLHRoaXMsdGhpcy5fdmlld0JveCxbZSxyLGksbixhXSk7dmFyIHM9dGhpcy5nZXRTaXplKCksbz1zLndpZHRoLGw9cy5oZWlnaHQsaCx1O3JldHVybiBhJiYoaD1sL24sdT1vL2ksbz5pKmgmJihlLT0oby1pKmgpLzIvaCksbD5uKnUmJihyLT0obC1uKnUpLzIvdSkpLHRoaXMuX3ZpZXdCb3g9W2UscixpLG4sISFhXSx0aGlzLl92aWV3Qm94U2hpZnQ9e2R4Oi1lLGR5Oi1yLHNjYWxlOnN9LHRoaXMuZm9yRWFjaChmdW5jdGlvbih0KXt0LnRyYW5zZm9ybShcIi4uLlwiKX0pLHRoaXN9O3ZhciBNO3QuX2VuZ2luZS5pbml0V2luPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZG9jdW1lbnQ7ZS5zdHlsZVNoZWV0cy5sZW5ndGg8MzE/ZS5jcmVhdGVTdHlsZVNoZWV0KCkuYWRkUnVsZShcIi5ydm1sXCIsXCJiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKVwiKTplLnN0eWxlU2hlZXRzWzBdLmFkZFJ1bGUoXCIucnZtbFwiLFwiYmVoYXZpb3I6dXJsKCNkZWZhdWx0I1ZNTClcIik7dHJ5eyFlLm5hbWVzcGFjZXMucnZtbCYmZS5uYW1lc3BhY2VzLmFkZChcInJ2bWxcIixcInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sXCIpLE09ZnVuY3Rpb24odCl7cmV0dXJuIGUuY3JlYXRlRWxlbWVudChcIjxydm1sOlwiK3QrJyBjbGFzcz1cInJ2bWxcIj4nKX19Y2F0Y2gocil7TT1mdW5jdGlvbih0KXtyZXR1cm4gZS5jcmVhdGVFbGVtZW50KFwiPFwiK3QrJyB4bWxucz1cInVybjpzY2hlbWFzLW1pY3Jvc29mdC5jb206dm1sXCIgY2xhc3M9XCJydm1sXCI+Jyl9fX0sdC5fZW5naW5lLmluaXRXaW4odC5fZy53aW4pLHQuX2VuZ2luZS5jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgZT10Ll9nZXRDb250YWluZXIuYXBwbHkoMCxhcmd1bWVudHMpLHI9ZS5jb250YWluZXIsaT1lLmhlaWdodCxuLGE9ZS53aWR0aCxzPWUueCxvPWUueTtpZighcil0aHJvdyBuZXcgRXJyb3IoXCJWTUwgY29udGFpbmVyIG5vdCBmb3VuZC5cIik7dmFyIGw9bmV3IHQuX1BhcGVyLGg9bC5jYW52YXM9dC5fZy5kb2MuY3JlYXRlRWxlbWVudChcImRpdlwiKSx1PWguc3R5bGU7cmV0dXJuIHM9c3x8MCxvPW98fDAsYT1hfHw1MTIsaT1pfHwzNDIsbC53aWR0aD1hLGwuaGVpZ2h0PWksYT09K2EmJihhKz1cInB4XCIpLGk9PStpJiYoaSs9XCJweFwiKSxsLmNvb3Jkc2l6ZT0xZTMqYitwKzFlMypiLGwuY29vcmRvcmlnaW49XCIwIDBcIixsLnNwYW49dC5fZy5kb2MuY3JlYXRlRWxlbWVudChcInNwYW5cIiksbC5zcGFuLnN0eWxlLmNzc1RleHQ9XCJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi05OTk5ZW07dG9wOi05OTk5ZW07cGFkZGluZzowO21hcmdpbjowO2xpbmUtaGVpZ2h0OjE7XCIsaC5hcHBlbmRDaGlsZChsLnNwYW4pLHUuY3NzVGV4dD10LmZvcm1hdChcInRvcDowO2xlZnQ6MDt3aWR0aDp7MH07aGVpZ2h0OnsxfTtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTtjbGlwOnJlY3QoMCB7MH0gezF9IDApO292ZXJmbG93OmhpZGRlblwiLGEsaSksMT09cj8odC5fZy5kb2MuYm9keS5hcHBlbmRDaGlsZChoKSx1LmxlZnQ9cytcInB4XCIsdS50b3A9bytcInB4XCIsdS5wb3NpdGlvbj1cImFic29sdXRlXCIpOnIuZmlyc3RDaGlsZD9yLmluc2VydEJlZm9yZShoLHIuZmlyc3RDaGlsZCk6ci5hcHBlbmRDaGlsZChoKSxsLnJlbmRlcmZpeD1mdW5jdGlvbigpe30sbH0sdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0LmV2ZShcInJhcGhhZWwuY2xlYXJcIix0aGlzKSx0aGlzLmNhbnZhcy5pbm5lckhUTUw9ZCx0aGlzLnNwYW49dC5fZy5kb2MuY3JlYXRlRWxlbWVudChcInNwYW5cIiksdGhpcy5zcGFuLnN0eWxlLmNzc1RleHQ9XCJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi05OTk5ZW07dG9wOi05OTk5ZW07cGFkZGluZzowO21hcmdpbjowO2xpbmUtaGVpZ2h0OjE7ZGlzcGxheTppbmxpbmU7XCIsdGhpcy5jYW52YXMuYXBwZW5kQ2hpbGQodGhpcy5zcGFuKSx0aGlzLmJvdHRvbT10aGlzLnRvcD1udWxsfSx0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oKXt0LmV2ZShcInJhcGhhZWwucmVtb3ZlXCIsdGhpcyksdGhpcy5jYW52YXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7Zm9yKHZhciBlIGluIHRoaXMpdGhpc1tlXT1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzW2VdP3QuX3JlbW92ZWRGYWN0b3J5KGUpOm51bGw7cmV0dXJuITB9O3ZhciBMPXQuc3Q7Zm9yKHZhciB6IGluIE4pTltlXSh6KSYmIUxbZV0oeikmJihMW3pdPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHIpe3JbdF0uYXBwbHkocixlKX0pfX0oeikpfX0uYXBwbHkoZSxpKSwhKHZvaWQgMCE9PW4mJih0LmV4cG9ydHM9bikpfV0pfSk7IiwidmFyIFJhcGhhZWwgPSByZXF1aXJlKCdyYXBoYWVsJylcblxuZnVuY3Rpb24gbmV3UGFwZXIoZGlhbWV0ZXIpIHtcbiAgdmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gIGNvbnRhaW5lci5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnNTBweCdcbiAgY29udGFpbmVyLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbidcbiAgY29udGFpbmVyLnN0eWxlLnBhZGRpbmcgPSAnMHB4J1xuICBjb250YWluZXIuc3R5bGUubWFyZ2luID0gJzBweCdcbiAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gJycgKyBkaWFtZXRlciArICdweCdcbiAgY29udGFpbmVyLnN0eWxlLmhlaWdodCA9ICcnICsgZGlhbWV0ZXIgKyAncHgnXG4gIGNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jaydcbiAgdmFyIHBhcGVyID0gUmFwaGFlbChjb250YWluZXIsIDEwMCwgMTAwKTtcbiAgcmV0dXJuIHtcbiAgICBwYXBlcjogcGFwZXIsXG4gICAgY29udGFpbmVyOiBjb250YWluZXIsXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXdQYXBlclxuIiwidmFyIE1lcnNlbm5lVHdpc3RlciA9IHJlcXVpcmUoJ21lcnNlbm5lLXR3aXN0ZXInKTtcbnZhciBwYXBlckdlbiA9IHJlcXVpcmUoJy4vcGFwZXInKVxudmFyIENvbG9yID0gcmVxdWlyZSgnY29sb3InKVxudmFyIGNvbG9ycyA9IHJlcXVpcmUoJy4vY29sb3JzJylcbnZhciBzaGFwZUNvdW50ID0gNFxuXG5tb2R1bGUuZXhwb3J0cyA9IGdlbmVyYXRlSWRlbnRpY29uXG5cbnZhciBnZW5lcmF0b3JcbmZ1bmN0aW9uIGdlbmVyYXRlSWRlbnRpY29uKGRpYW1ldGVyLCBzZWVkKSB7XG4gIGdlbmVyYXRvciA9IG5ldyBNZXJzZW5uZVR3aXN0ZXIoc2VlZCk7XG5cbiAgdmFyIGVsZW1lbnRzID0gcGFwZXJHZW4oZGlhbWV0ZXIpXG4gIHZhciBwYXBlciA9IGVsZW1lbnRzLnBhcGVyXG4gIHZhciBjb250YWluZXIgPSBlbGVtZW50cy5jb250YWluZXJcblxuICB2YXIgcmVtYWluaW5nQ29sb3JzID0gaHVlU2hpZnQoY29sb3JzLnNsaWNlKCksIGdlbmVyYXRvcilcblxuXG4gIHZhciBia2duZCA9IHBhcGVyLnJlY3QoMCwgMCwgZGlhbWV0ZXIsIGRpYW1ldGVyKTtcbiAgYmtnbmQuYXR0cihcImZpbGxcIiwgZ2VuQ29sb3IocmVtYWluaW5nQ29sb3JzKSk7XG4gIGJrZ25kLmF0dHIoJ3N0cm9rZScsICdub25lJyk7XG5cbiAgZm9yKHZhciBpID0gMDsgaSA8IHNoYXBlQ291bnQgLSAxOyBpKyspIHtcbiAgICBnZW5TaGFwZShwYXBlciwgcmVtYWluaW5nQ29sb3JzLCBkaWFtZXRlciwgaSwgc2hhcGVDb3VudCAtIDEpXG4gIH1cblxuICByZXR1cm4gY29udGFpbmVyXG59XG5cbmZ1bmN0aW9uIGdlblNoYXBlKHBhcGVyLCByZW1haW5pbmdDb2xvcnMsIGRpYW1ldGVyLCBpLCB0b3RhbCkge1xuICB2YXIgc2hhcGUgPSBwYXBlci5yZWN0KDAsIDAsIGRpYW1ldGVyLCBkaWFtZXRlcik7XG4gIHNoYXBlLnJvdGF0ZSgzNjAgKiBnZW5lcmF0b3IucmFuZG9tKCkpXG5cbiAgdmFyIHRyYW5zID0gZGlhbWV0ZXIgLyB0b3RhbCAqIGdlbmVyYXRvci5yYW5kb20oKSArIChpICogZGlhbWV0ZXIgLyB0b3RhbClcbiAgc2hhcGUudHJhbnNsYXRlKHRyYW5zKVxuXG4gIHNoYXBlLnJvdGF0ZSgxODAgKiBnZW5lcmF0b3IucmFuZG9tKCkpXG4gIHNoYXBlLmF0dHIoJ2ZpbGwnLCBnZW5Db2xvcihyZW1haW5pbmdDb2xvcnMpKTtcbiAgc2hhcGUuYXR0cignc3Ryb2tlJywgJ25vbmUnKTtcbn1cblxuZnVuY3Rpb24gZ2VuQ29sb3IoY29sb3JzKSB7XG4gIHZhciByYW5kID0gZ2VuZXJhdG9yLnJhbmRvbSgpXG4gIHZhciBpZHggPSBNYXRoLmZsb29yKGNvbG9ycy5sZW5ndGggKiBnZW5lcmF0b3IucmFuZG9tKCkpXG4gIHZhciBjb2xvciA9IGNvbG9ycy5zcGxpY2UoaWR4LDEpWzBdXG4gIHJldHVybiBjb2xvclxufVxuXG52YXIgd29iYmxlID0gMzBcbmZ1bmN0aW9uIGh1ZVNoaWZ0KGNvbG9ycywgZ2VuZXJhdG9yKSB7XG4gIHZhciBhbW91bnQgPSAoZ2VuZXJhdG9yLnJhbmRvbSgpICogMzApIC0gKHdvYmJsZSAvIDIpXG4gIHJldHVybiBjb2xvcnMubWFwKGZ1bmN0aW9uKGhleCkge1xuICAgIHZhciBjb2xvciA9IENvbG9yKGhleClcbiAgICBjb2xvci5yb3RhdGUoYW1vdW50KVxuICAgIHJldHVybiBjb2xvci5oZXhTdHJpbmcoKVxuICB9KVxufVxuIl19 | |
| require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ | |
| /*! | |
| * Cross-Browser Split 1.1.1 | |
| * Copyright 2007-2012 Steven Levithan <stevenlevithan.com> | |
| * Available under the MIT License | |
| * ECMAScript compliant, uniform cross-browser split method | |
| */ | |
| /** | |
| * Splits a string into an array of strings using a regex or string separator. Matches of the | |
| * separator are not included in the result array. However, if `separator` is a regex that contains | |
| * capturing groups, backreferences are spliced into the result each time `separator` is matched. | |
| * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably | |
| * cross-browser. | |
| * @param {String} str String to split. | |
| * @param {RegExp|String} separator Regex or string to use for separating the string. | |
| * @param {Number} [limit] Maximum number of items to include in the result array. | |
| * @returns {Array} Array of substrings. | |
| * @example | |
| * | |
| * // Basic use | |
| * split('a b c d', ' '); | |
| * // -> ['a', 'b', 'c', 'd'] | |
| * | |
| * // With limit | |
| * split('a b c d', ' ', 2); | |
| * // -> ['a', 'b'] | |
| * | |
| * // Backreferences in result array | |
| * split('..word1 word2..', /([a-z]+)(\d+)/i); | |
| * // -> ['..', 'word', '1', ' ', 'word', '2', '..'] | |
| */ | |
| module.exports = (function split(undef) { | |
| var nativeSplit = String.prototype.split, | |
| compliantExecNpcg = /()??/.exec("")[1] === undef, | |
| // NPCG: nonparticipating capturing group | |
| self; | |
| self = function(str, separator, limit) { | |
| // If `separator` is not a regex, use `nativeSplit` | |
| if (Object.prototype.toString.call(separator) !== "[object RegExp]") { | |
| return nativeSplit.call(str, separator, limit); | |
| } | |
| var output = [], | |
| flags = (separator.ignoreCase ? "i" : "") + (separator.multiline ? "m" : "") + (separator.extended ? "x" : "") + // Proposed for ES6 | |
| (separator.sticky ? "y" : ""), | |
| // Firefox 3+ | |
| lastLastIndex = 0, | |
| // Make `global` and avoid `lastIndex` issues by working with a copy | |
| separator = new RegExp(separator.source, flags + "g"), | |
| separator2, match, lastIndex, lastLength; | |
| str += ""; // Type-convert | |
| if (!compliantExecNpcg) { | |
| // Doesn't need flags gy, but they don't hurt | |
| separator2 = new RegExp("^" + separator.source + "$(?!\\s)", flags); | |
| } | |
| /* Values for `limit`, per the spec: | |
| * If undefined: 4294967295 // Math.pow(2, 32) - 1 | |
| * If 0, Infinity, or NaN: 0 | |
| * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296; | |
| * If negative number: 4294967296 - Math.floor(Math.abs(limit)) | |
| * If other: Type-convert, then use the above rules | |
| */ | |
| limit = limit === undef ? -1 >>> 0 : // Math.pow(2, 32) - 1 | |
| limit >>> 0; // ToUint32(limit) | |
| while (match = separator.exec(str)) { | |
| // `separator.lastIndex` is not reliable cross-browser | |
| lastIndex = match.index + match[0].length; | |
| if (lastIndex > lastLastIndex) { | |
| output.push(str.slice(lastLastIndex, match.index)); | |
| // Fix browsers whose `exec` methods don't consistently return `undefined` for | |
| // nonparticipating capturing groups | |
| if (!compliantExecNpcg && match.length > 1) { | |
| match[0].replace(separator2, function() { | |
| for (var i = 1; i < arguments.length - 2; i++) { | |
| if (arguments[i] === undef) { | |
| match[i] = undef; | |
| } | |
| } | |
| }); | |
| } | |
| if (match.length > 1 && match.index < str.length) { | |
| Array.prototype.push.apply(output, match.slice(1)); | |
| } | |
| lastLength = match[0].length; | |
| lastLastIndex = lastIndex; | |
| if (output.length >= limit) { | |
| break; | |
| } | |
| } | |
| if (separator.lastIndex === match.index) { | |
| separator.lastIndex++; // Avoid an infinite loop | |
| } | |
| } | |
| if (lastLastIndex === str.length) { | |
| if (lastLength || !separator.test("")) { | |
| output.push(""); | |
| } | |
| } else { | |
| output.push(str.slice(lastLastIndex)); | |
| } | |
| return output.length > limit ? output.slice(0, limit) : output; | |
| }; | |
| return self; | |
| })(); | |
| },{}],2:[function(require,module,exports){ | |
| 'use strict'; | |
| var OneVersionConstraint = require('individual/one-version'); | |
| var MY_VERSION = '7'; | |
| OneVersionConstraint('ev-store', MY_VERSION); | |
| var hashKey = '__EV_STORE_KEY@' + MY_VERSION; | |
| module.exports = EvStore; | |
| function EvStore(elem) { | |
| var hash = elem[hashKey]; | |
| if (!hash) { | |
| hash = elem[hashKey] = {}; | |
| } | |
| return hash; | |
| } | |
| },{"individual/one-version":4}],3:[function(require,module,exports){ | |
| (function (global){ | |
| 'use strict'; | |
| /*global window, global*/ | |
| var root = typeof window !== 'undefined' ? | |
| window : typeof global !== 'undefined' ? | |
| global : {}; | |
| module.exports = Individual; | |
| function Individual(key, value) { | |
| if (key in root) { | |
| return root[key]; | |
| } | |
| root[key] = value; | |
| return value; | |
| } | |
| }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) | |
| //# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9ldi1zdG9yZS9ub2RlX21vZHVsZXMvaW5kaXZpZHVhbC9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKmdsb2JhbCB3aW5kb3csIGdsb2JhbCovXG5cbnZhciByb290ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgP1xuICAgIHdpbmRvdyA6IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID9cbiAgICBnbG9iYWwgOiB7fTtcblxubW9kdWxlLmV4cG9ydHMgPSBJbmRpdmlkdWFsO1xuXG5mdW5jdGlvbiBJbmRpdmlkdWFsKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5IGluIHJvb3QpIHtcbiAgICAgICAgcmV0dXJuIHJvb3Rba2V5XTtcbiAgICB9XG5cbiAgICByb290W2tleV0gPSB2YWx1ZTtcblxuICAgIHJldHVybiB2YWx1ZTtcbn1cbiJdfQ== | |
| },{}],4:[function(require,module,exports){ | |
| 'use strict'; | |
| var Individual = require('./index.js'); | |
| module.exports = OneVersion; | |
| function OneVersion(moduleName, version, defaultValue) { | |
| var key = '__INDIVIDUAL_ONE_VERSION_' + moduleName; | |
| var enforceKey = key + '_ENFORCE_SINGLETON'; | |
| var versionValue = Individual(enforceKey, version); | |
| if (versionValue !== version) { | |
| throw new Error('Can only have one copy of ' + | |
| moduleName + '.\n' + | |
| 'You already have version ' + versionValue + | |
| ' installed.\n' + | |
| 'This means you cannot install version ' + version); | |
| } | |
| return Individual(key, defaultValue); | |
| } | |
| },{"./index.js":3}],5:[function(require,module,exports){ | |
| var nativeIsArray = Array.isArray | |
| var toString = Object.prototype.toString | |
| module.exports = nativeIsArray || isArray | |
| function isArray(obj) { | |
| return toString.call(obj) === "[object Array]" | |
| } | |
| },{}],6:[function(require,module,exports){ | |
| 'use strict'; | |
| module.exports = AttributeHook; | |
| function AttributeHook(namespace, value) { | |
| if (!(this instanceof AttributeHook)) { | |
| return new AttributeHook(namespace, value); | |
| } | |
| this.namespace = namespace; | |
| this.value = value; | |
| } | |
| AttributeHook.prototype.hook = function (node, prop, prev) { | |
| if (prev && prev.type === 'AttributeHook' && | |
| prev.value === this.value && | |
| prev.namespace === this.namespace) { | |
| return; | |
| } | |
| node.setAttributeNS(this.namespace, prop, this.value); | |
| }; | |
| AttributeHook.prototype.unhook = function (node, prop, next) { | |
| if (next && next.type === 'AttributeHook' && | |
| next.namespace === this.namespace) { | |
| return; | |
| } | |
| var colonPosition = prop.indexOf(':'); | |
| var localName = colonPosition > -1 ? prop.substr(colonPosition + 1) : prop; | |
| node.removeAttributeNS(this.namespace, localName); | |
| }; | |
| AttributeHook.prototype.type = 'AttributeHook'; | |
| },{}],7:[function(require,module,exports){ | |
| 'use strict'; | |
| var EvStore = require('ev-store'); | |
| module.exports = EvHook; | |
| function EvHook(value) { | |
| if (!(this instanceof EvHook)) { | |
| return new EvHook(value); | |
| } | |
| this.value = value; | |
| } | |
| EvHook.prototype.hook = function (node, propertyName) { | |
| var es = EvStore(node); | |
| var propName = propertyName.substr(3); | |
| es[propName] = this.value; | |
| }; | |
| EvHook.prototype.unhook = function(node, propertyName) { | |
| var es = EvStore(node); | |
| var propName = propertyName.substr(3); | |
| es[propName] = undefined; | |
| }; | |
| },{"ev-store":2}],8:[function(require,module,exports){ | |
| 'use strict'; | |
| module.exports = SoftSetHook; | |
| function SoftSetHook(value) { | |
| if (!(this instanceof SoftSetHook)) { | |
| return new SoftSetHook(value); | |
| } | |
| this.value = value; | |
| } | |
| SoftSetHook.prototype.hook = function (node, propertyName) { | |
| if (node[propertyName] !== this.value) { | |
| node[propertyName] = this.value; | |
| } | |
| }; | |
| },{}],9:[function(require,module,exports){ | |
| 'use strict'; | |
| var isArray = require('x-is-array'); | |
| var VNode = require('../vnode/vnode.js'); | |
| var VText = require('../vnode/vtext.js'); | |
| var isVNode = require('../vnode/is-vnode'); | |
| var isVText = require('../vnode/is-vtext'); | |
| var isWidget = require('../vnode/is-widget'); | |
| var isHook = require('../vnode/is-vhook'); | |
| var isVThunk = require('../vnode/is-thunk'); | |
| var parseTag = require('./parse-tag.js'); | |
| var softSetHook = require('./hooks/soft-set-hook.js'); | |
| var evHook = require('./hooks/ev-hook.js'); | |
| module.exports = h; | |
| function h(tagName, properties, children) { | |
| var childNodes = []; | |
| var tag, props, key, namespace; | |
| if (!children && isChildren(properties)) { | |
| children = properties; | |
| props = {}; | |
| } | |
| props = props || properties || {}; | |
| tag = parseTag(tagName, props); | |
| // support keys | |
| if (props.hasOwnProperty('key')) { | |
| key = props.key; | |
| props.key = undefined; | |
| } | |
| // support namespace | |
| if (props.hasOwnProperty('namespace')) { | |
| namespace = props.namespace; | |
| props.namespace = undefined; | |
| } | |
| // fix cursor bug | |
| if (tag === 'INPUT' && | |
| !namespace && | |
| props.hasOwnProperty('value') && | |
| props.value !== undefined && | |
| !isHook(props.value) | |
| ) { | |
| props.value = softSetHook(props.value); | |
| } | |
| transformProperties(props); | |
| if (children !== undefined && children !== null) { | |
| addChild(children, childNodes, tag, props); | |
| } | |
| return new VNode(tag, props, childNodes, key, namespace); | |
| } | |
| function addChild(c, childNodes, tag, props) { | |
| if (typeof c === 'string') { | |
| childNodes.push(new VText(c)); | |
| } else if (typeof c === 'number') { | |
| childNodes.push(new VText(String(c))); | |
| } else if (isChild(c)) { | |
| childNodes.push(c); | |
| } else if (isArray(c)) { | |
| for (var i = 0; i < c.length; i++) { | |
| addChild(c[i], childNodes, tag, props); | |
| } | |
| } else if (c === null || c === undefined) { | |
| return; | |
| } else { | |
| throw UnexpectedVirtualElement({ | |
| foreignObject: c, | |
| parentVnode: { | |
| tagName: tag, | |
| properties: props | |
| } | |
| }); | |
| } | |
| } | |
| function transformProperties(props) { | |
| for (var propName in props) { | |
| if (props.hasOwnProperty(propName)) { | |
| var value = props[propName]; | |
| if (isHook(value)) { | |
| continue; | |
| } | |
| if (propName.substr(0, 3) === 'ev-') { | |
| // add ev-foo support | |
| props[propName] = evHook(value); | |
| } | |
| } | |
| } | |
| } | |
| function isChild(x) { | |
| return isVNode(x) || isVText(x) || isWidget(x) || isVThunk(x); | |
| } | |
| function isChildren(x) { | |
| return typeof x === 'string' || isArray(x) || isChild(x); | |
| } | |
| function UnexpectedVirtualElement(data) { | |
| var err = new Error(); | |
| err.type = 'virtual-hyperscript.unexpected.virtual-element'; | |
| err.message = 'Unexpected virtual child passed to h().\n' + | |
| 'Expected a VNode / Vthunk / VWidget / string but:\n' + | |
| 'got:\n' + | |
| errorString(data.foreignObject) + | |
| '.\n' + | |
| 'The parent vnode is:\n' + | |
| errorString(data.parentVnode) | |
| '\n' + | |
| 'Suggested fix: change your `h(..., [ ... ])` callsite.'; | |
| err.foreignObject = data.foreignObject; | |
| err.parentVnode = data.parentVnode; | |
| return err; | |
| } | |
| function errorString(obj) { | |
| try { | |
| return JSON.stringify(obj, null, ' '); | |
| } catch (e) { | |
| return String(obj); | |
| } | |
| } | |
| },{"../vnode/is-thunk":12,"../vnode/is-vhook":13,"../vnode/is-vnode":14,"../vnode/is-vtext":15,"../vnode/is-widget":16,"../vnode/vnode.js":18,"../vnode/vtext.js":19,"./hooks/ev-hook.js":7,"./hooks/soft-set-hook.js":8,"./parse-tag.js":10,"x-is-array":5}],10:[function(require,module,exports){ | |
| 'use strict'; | |
| var split = require('browser-split'); | |
| var classIdSplit = /([\.#]?[a-zA-Z0-9\u007F-\uFFFF_:-]+)/; | |
| var notClassId = /^\.|#/; | |
| module.exports = parseTag; | |
| function parseTag(tag, props) { | |
| if (!tag) { | |
| return 'DIV'; | |
| } | |
| var noId = !(props.hasOwnProperty('id')); | |
| var tagParts = split(tag, classIdSplit); | |
| var tagName = null; | |
| if (notClassId.test(tagParts[1])) { | |
| tagName = 'DIV'; | |
| } | |
| var classes, part, type, i; | |
| for (i = 0; i < tagParts.length; i++) { | |
| part = tagParts[i]; | |
| if (!part) { | |
| continue; | |
| } | |
| type = part.charAt(0); | |
| if (!tagName) { | |
| tagName = part; | |
| } else if (type === '.') { | |
| classes = classes || []; | |
| classes.push(part.substring(1, part.length)); | |
| } else if (type === '#' && noId) { | |
| props.id = part.substring(1, part.length); | |
| } | |
| } | |
| if (classes) { | |
| if (props.className) { | |
| classes.push(props.className); | |
| } | |
| props.className = classes.join(' '); | |
| } | |
| return props.namespace ? tagName : tagName.toUpperCase(); | |
| } | |
| },{"browser-split":1}],11:[function(require,module,exports){ | |
| 'use strict'; | |
| var DEFAULT_NAMESPACE = null; | |
| var EV_NAMESPACE = 'http://www.w3.org/2001/xml-events'; | |
| var XLINK_NAMESPACE = 'http://www.w3.org/1999/xlink'; | |
| var XML_NAMESPACE = 'http://www.w3.org/XML/1998/namespace'; | |
| // http://www.w3.org/TR/SVGTiny12/attributeTable.html | |
| // http://www.w3.org/TR/SVG/attindex.html | |
| var SVG_PROPERTIES = { | |
| 'about': DEFAULT_NAMESPACE, | |
| 'accent-height': DEFAULT_NAMESPACE, | |
| 'accumulate': DEFAULT_NAMESPACE, | |
| 'additive': DEFAULT_NAMESPACE, | |
| 'alignment-baseline': DEFAULT_NAMESPACE, | |
| 'alphabetic': DEFAULT_NAMESPACE, | |
| 'amplitude': DEFAULT_NAMESPACE, | |
| 'arabic-form': DEFAULT_NAMESPACE, | |
| 'ascent': DEFAULT_NAMESPACE, | |
| 'attributeName': DEFAULT_NAMESPACE, | |
| 'attributeType': DEFAULT_NAMESPACE, | |
| 'azimuth': DEFAULT_NAMESPACE, | |
| 'bandwidth': DEFAULT_NAMESPACE, | |
| 'baseFrequency': DEFAULT_NAMESPACE, | |
| 'baseProfile': DEFAULT_NAMESPACE, | |
| 'baseline-shift': DEFAULT_NAMESPACE, | |
| 'bbox': DEFAULT_NAMESPACE, | |
| 'begin': DEFAULT_NAMESPACE, | |
| 'bias': DEFAULT_NAMESPACE, | |
| 'by': DEFAULT_NAMESPACE, | |
| 'calcMode': DEFAULT_NAMESPACE, | |
| 'cap-height': DEFAULT_NAMESPACE, | |
| 'class': DEFAULT_NAMESPACE, | |
| 'clip': DEFAULT_NAMESPACE, | |
| 'clip-path': DEFAULT_NAMESPACE, | |
| 'clip-rule': DEFAULT_NAMESPACE, | |
| 'clipPathUnits': DEFAULT_NAMESPACE, | |
| 'color': DEFAULT_NAMESPACE, | |
| 'color-interpolation': DEFAULT_NAMESPACE, | |
| 'color-interpolation-filters': DEFAULT_NAMESPACE, | |
| 'color-profile': DEFAULT_NAMESPACE, | |
| 'color-rendering': DEFAULT_NAMESPACE, | |
| 'content': DEFAULT_NAMESPACE, | |
| 'contentScriptType': DEFAULT_NAMESPACE, | |
| 'contentStyleType': DEFAULT_NAMESPACE, | |
| 'cursor': DEFAULT_NAMESPACE, | |
| 'cx': DEFAULT_NAMESPACE, | |
| 'cy': DEFAULT_NAMESPACE, | |
| 'd': DEFAULT_NAMESPACE, | |
| 'datatype': DEFAULT_NAMESPACE, | |
| 'defaultAction': DEFAULT_NAMESPACE, | |
| 'descent': DEFAULT_NAMESPACE, | |
| 'diffuseConstant': DEFAULT_NAMESPACE, | |
| 'direction': DEFAULT_NAMESPACE, | |
| 'display': DEFAULT_NAMESPACE, | |
| 'divisor': DEFAULT_NAMESPACE, | |
| 'dominant-baseline': DEFAULT_NAMESPACE, | |
| 'dur': DEFAULT_NAMESPACE, | |
| 'dx': DEFAULT_NAMESPACE, | |
| 'dy': DEFAULT_NAMESPACE, | |
| 'edgeMode': DEFAULT_NAMESPACE, | |
| 'editable': DEFAULT_NAMESPACE, | |
| 'elevation': DEFAULT_NAMESPACE, | |
| 'enable-background': DEFAULT_NAMESPACE, | |
| 'end': DEFAULT_NAMESPACE, | |
| 'ev:event': EV_NAMESPACE, | |
| 'event': DEFAULT_NAMESPACE, | |
| 'exponent': DEFAULT_NAMESPACE, | |
| 'externalResourcesRequired': DEFAULT_NAMESPACE, | |
| 'fill': DEFAULT_NAMESPACE, | |
| 'fill-opacity': DEFAULT_NAMESPACE, | |
| 'fill-rule': DEFAULT_NAMESPACE, | |
| 'filter': DEFAULT_NAMESPACE, | |
| 'filterRes': DEFAULT_NAMESPACE, | |
| 'filterUnits': DEFAULT_NAMESPACE, | |
| 'flood-color': DEFAULT_NAMESPACE, | |
| 'flood-opacity': DEFAULT_NAMESPACE, | |
| 'focusHighlight': DEFAULT_NAMESPACE, | |
| 'focusable': DEFAULT_NAMESPACE, | |
| 'font-family': DEFAULT_NAMESPACE, | |
| 'font-size': DEFAULT_NAMESPACE, | |
| 'font-size-adjust': DEFAULT_NAMESPACE, | |
| 'font-stretch': DEFAULT_NAMESPACE, | |
| 'font-style': DEFAULT_NAMESPACE, | |
| 'font-variant': DEFAULT_NAMESPACE, | |
| 'font-weight': DEFAULT_NAMESPACE, | |
| 'format': DEFAULT_NAMESPACE, | |
| 'from': DEFAULT_NAMESPACE, | |
| 'fx': DEFAULT_NAMESPACE, | |
| 'fy': DEFAULT_NAMESPACE, | |
| 'g1': DEFAULT_NAMESPACE, | |
| 'g2': DEFAULT_NAMESPACE, | |
| 'glyph-name': DEFAULT_NAMESPACE, | |
| 'glyph-orientation-horizontal': DEFAULT_NAMESPACE, | |
| 'glyph-orientation-vertical': DEFAULT_NAMESPACE, | |
| 'glyphRef': DEFAULT_NAMESPACE, | |
| 'gradientTransform': DEFAULT_NAMESPACE, | |
| 'gradientUnits': DEFAULT_NAMESPACE, | |
| 'handler': DEFAULT_NAMESPACE, | |
| 'hanging': DEFAULT_NAMESPACE, | |
| 'height': DEFAULT_NAMESPACE, | |
| 'horiz-adv-x': DEFAULT_NAMESPACE, | |
| 'horiz-origin-x': DEFAULT_NAMESPACE, | |
| 'horiz-origin-y': DEFAULT_NAMESPACE, | |
| 'id': DEFAULT_NAMESPACE, | |
| 'ideographic': DEFAULT_NAMESPACE, | |
| 'image-rendering': DEFAULT_NAMESPACE, | |
| 'in': DEFAULT_NAMESPACE, | |
| 'in2': DEFAULT_NAMESPACE, | |
| 'initialVisibility': DEFAULT_NAMESPACE, | |
| 'intercept': DEFAULT_NAMESPACE, | |
| 'k': DEFAULT_NAMESPACE, | |
| 'k1': DEFAULT_NAMESPACE, | |
| 'k2': DEFAULT_NAMESPACE, | |
| 'k3': DEFAULT_NAMESPACE, | |
| 'k4': DEFAULT_NAMESPACE, | |
| 'kernelMatrix': DEFAULT_NAMESPACE, | |
| 'kernelUnitLength': DEFAULT_NAMESPACE, | |
| 'kerning': DEFAULT_NAMESPACE, | |
| 'keyPoints': DEFAULT_NAMESPACE, | |
| 'keySplines': DEFAULT_NAMESPACE, | |
| 'keyTimes': DEFAULT_NAMESPACE, | |
| 'lang': DEFAULT_NAMESPACE, | |
| 'lengthAdjust': DEFAULT_NAMESPACE, | |
| 'letter-spacing': DEFAULT_NAMESPACE, | |
| 'lighting-color': DEFAULT_NAMESPACE, | |
| 'limitingConeAngle': DEFAULT_NAMESPACE, | |
| 'local': DEFAULT_NAMESPACE, | |
| 'marker-end': DEFAULT_NAMESPACE, | |
| 'marker-mid': DEFAULT_NAMESPACE, | |
| 'marker-start': DEFAULT_NAMESPACE, | |
| 'markerHeight': DEFAULT_NAMESPACE, | |
| 'markerUnits': DEFAULT_NAMESPACE, | |
| 'markerWidth': DEFAULT_NAMESPACE, | |
| 'mask': DEFAULT_NAMESPACE, | |
| 'maskContentUnits': DEFAULT_NAMESPACE, | |
| 'maskUnits': DEFAULT_NAMESPACE, | |
| 'mathematical': DEFAULT_NAMESPACE, | |
| 'max': DEFAULT_NAMESPACE, | |
| 'media': DEFAULT_NAMESPACE, | |
| 'mediaCharacterEncoding': DEFAULT_NAMESPACE, | |
| 'mediaContentEncodings': DEFAULT_NAMESPACE, | |
| 'mediaSize': DEFAULT_NAMESPACE, | |
| 'mediaTime': DEFAULT_NAMESPACE, | |
| 'method': DEFAULT_NAMESPACE, | |
| 'min': DEFAULT_NAMESPACE, | |
| 'mode': DEFAULT_NAMESPACE, | |
| 'name': DEFAULT_NAMESPACE, | |
| 'nav-down': DEFAULT_NAMESPACE, | |
| 'nav-down-left': DEFAULT_NAMESPACE, | |
| 'nav-down-right': DEFAULT_NAMESPACE, | |
| 'nav-left': DEFAULT_NAMESPACE, | |
| 'nav-next': DEFAULT_NAMESPACE, | |
| 'nav-prev': DEFAULT_NAMESPACE, | |
| 'nav-right': DEFAULT_NAMESPACE, | |
| 'nav-up': DEFAULT_NAMESPACE, | |
| 'nav-up-left': DEFAULT_NAMESPACE, | |
| 'nav-up-right': DEFAULT_NAMESPACE, | |
| 'numOctaves': DEFAULT_NAMESPACE, | |
| 'observer': DEFAULT_NAMESPACE, | |
| 'offset': DEFAULT_NAMESPACE, | |
| 'opacity': DEFAULT_NAMESPACE, | |
| 'operator': DEFAULT_NAMESPACE, | |
| 'order': DEFAULT_NAMESPACE, | |
| 'orient': DEFAULT_NAMESPACE, | |
| 'orientation': DEFAULT_NAMESPACE, | |
| 'origin': DEFAULT_NAMESPACE, | |
| 'overflow': DEFAULT_NAMESPACE, | |
| 'overlay': DEFAULT_NAMESPACE, | |
| 'overline-position': DEFAULT_NAMESPACE, | |
| 'overline-thickness': DEFAULT_NAMESPACE, | |
| 'panose-1': DEFAULT_NAMESPACE, | |
| 'path': DEFAULT_NAMESPACE, | |
| 'pathLength': DEFAULT_NAMESPACE, | |
| 'patternContentUnits': DEFAULT_NAMESPACE, | |
| 'patternTransform': DEFAULT_NAMESPACE, | |
| 'patternUnits': DEFAULT_NAMESPACE, | |
| 'phase': DEFAULT_NAMESPACE, | |
| 'playbackOrder': DEFAULT_NAMESPACE, | |
| 'pointer-events': DEFAULT_NAMESPACE, | |
| 'points': DEFAULT_NAMESPACE, | |
| 'pointsAtX': DEFAULT_NAMESPACE, | |
| 'pointsAtY': DEFAULT_NAMESPACE, | |
| 'pointsAtZ': DEFAULT_NAMESPACE, | |
| 'preserveAlpha': DEFAULT_NAMESPACE, | |
| 'preserveAspectRatio': DEFAULT_NAMESPACE, | |
| 'primitiveUnits': DEFAULT_NAMESPACE, | |
| 'propagate': DEFAULT_NAMESPACE, | |
| 'property': DEFAULT_NAMESPACE, | |
| 'r': DEFAULT_NAMESPACE, | |
| 'radius': DEFAULT_NAMESPACE, | |
| 'refX': DEFAULT_NAMESPACE, | |
| 'refY': DEFAULT_NAMESPACE, | |
| 'rel': DEFAULT_NAMESPACE, | |
| 'rendering-intent': DEFAULT_NAMESPACE, | |
| 'repeatCount': DEFAULT_NAMESPACE, | |
| 'repeatDur': DEFAULT_NAMESPACE, | |
| 'requiredExtensions': DEFAULT_NAMESPACE, | |
| 'requiredFeatures': DEFAULT_NAMESPACE, | |
| 'requiredFonts': DEFAULT_NAMESPACE, | |
| 'requiredFormats': DEFAULT_NAMESPACE, | |
| 'resource': DEFAULT_NAMESPACE, | |
| 'restart': DEFAULT_NAMESPACE, | |
| 'result': DEFAULT_NAMESPACE, | |
| 'rev': DEFAULT_NAMESPACE, | |
| 'role': DEFAULT_NAMESPACE, | |
| 'rotate': DEFAULT_NAMESPACE, | |
| 'rx': DEFAULT_NAMESPACE, | |
| 'ry': DEFAULT_NAMESPACE, | |
| 'scale': DEFAULT_NAMESPACE, | |
| 'seed': DEFAULT_NAMESPACE, | |
| 'shape-rendering': DEFAULT_NAMESPACE, | |
| 'slope': DEFAULT_NAMESPACE, | |
| 'snapshotTime': DEFAULT_NAMESPACE, | |
| 'spacing': DEFAULT_NAMESPACE, | |
| 'specularConstant': DEFAULT_NAMESPACE, | |
| 'specularExponent': DEFAULT_NAMESPACE, | |
| 'spreadMethod': DEFAULT_NAMESPACE, | |
| 'startOffset': DEFAULT_NAMESPACE, | |
| 'stdDeviation': DEFAULT_NAMESPACE, | |
| 'stemh': DEFAULT_NAMESPACE, | |
| 'stemv': DEFAULT_NAMESPACE, | |
| 'stitchTiles': DEFAULT_NAMESPACE, | |
| 'stop-color': DEFAULT_NAMESPACE, | |
| 'stop-opacity': DEFAULT_NAMESPACE, | |
| 'strikethrough-position': DEFAULT_NAMESPACE, | |
| 'strikethrough-thickness': DEFAULT_NAMESPACE, | |
| 'string': DEFAULT_NAMESPACE, | |
| 'stroke': DEFAULT_NAMESPACE, | |
| 'stroke-dasharray': DEFAULT_NAMESPACE, | |
| 'stroke-dashoffset': DEFAULT_NAMESPACE, | |
| 'stroke-linecap': DEFAULT_NAMESPACE, | |
| 'stroke-linejoin': DEFAULT_NAMESPACE, | |
| 'stroke-miterlimit': DEFAULT_NAMESPACE, | |
| 'stroke-opacity': DEFAULT_NAMESPACE, | |
| 'stroke-width': DEFAULT_NAMESPACE, | |
| 'surfaceScale': DEFAULT_NAMESPACE, | |
| 'syncBehavior': DEFAULT_NAMESPACE, | |
| 'syncBehaviorDefault': DEFAULT_NAMESPACE, | |
| 'syncMaster': DEFAULT_NAMESPACE, | |
| 'syncTolerance': DEFAULT_NAMESPACE, | |
| 'syncToleranceDefault': DEFAULT_NAMESPACE, | |
| 'systemLanguage': DEFAULT_NAMESPACE, | |
| 'tableValues': DEFAULT_NAMESPACE, | |
| 'target': DEFAULT_NAMESPACE, | |
| 'targetX': DEFAULT_NAMESPACE, | |
| 'targetY': DEFAULT_NAMESPACE, | |
| 'text-anchor': DEFAULT_NAMESPACE, | |
| 'text-decoration': DEFAULT_NAMESPACE, | |
| 'text-rendering': DEFAULT_NAMESPACE, | |
| 'textLength': DEFAULT_NAMESPACE, | |
| 'timelineBegin': DEFAULT_NAMESPACE, | |
| 'title': DEFAULT_NAMESPACE, | |
| 'to': DEFAULT_NAMESPACE, | |
| 'transform': DEFAULT_NAMESPACE, | |
| 'transformBehavior': DEFAULT_NAMESPACE, | |
| 'type': DEFAULT_NAMESPACE, | |
| 'typeof': DEFAULT_NAMESPACE, | |
| 'u1': DEFAULT_NAMESPACE, | |
| 'u2': DEFAULT_NAMESPACE, | |
| 'underline-position': DEFAULT_NAMESPACE, | |
| 'underline-thickness': DEFAULT_NAMESPACE, | |
| 'unicode': DEFAULT_NAMESPACE, | |
| 'unicode-bidi': DEFAULT_NAMESPACE, | |
| 'unicode-range': DEFAULT_NAMESPACE, | |
| 'units-per-em': DEFAULT_NAMESPACE, | |
| 'v-alphabetic': DEFAULT_NAMESPACE, | |
| 'v-hanging': DEFAULT_NAMESPACE, | |
| 'v-ideographic': DEFAULT_NAMESPACE, | |
| 'v-mathematical': DEFAULT_NAMESPACE, | |
| 'values': DEFAULT_NAMESPACE, | |
| 'version': DEFAULT_NAMESPACE, | |
| 'vert-adv-y': DEFAULT_NAMESPACE, | |
| 'vert-origin-x': DEFAULT_NAMESPACE, | |
| 'vert-origin-y': DEFAULT_NAMESPACE, | |
| 'viewBox': DEFAULT_NAMESPACE, | |
| 'viewTarget': DEFAULT_NAMESPACE, | |
| 'visibility': DEFAULT_NAMESPACE, | |
| 'width': DEFAULT_NAMESPACE, | |
| 'widths': DEFAULT_NAMESPACE, | |
| 'word-spacing': DEFAULT_NAMESPACE, | |
| 'writing-mode': DEFAULT_NAMESPACE, | |
| 'x': DEFAULT_NAMESPACE, | |
| 'x-height': DEFAULT_NAMESPACE, | |
| 'x1': DEFAULT_NAMESPACE, | |
| 'x2': DEFAULT_NAMESPACE, | |
| 'xChannelSelector': DEFAULT_NAMESPACE, | |
| 'xlink:actuate': XLINK_NAMESPACE, | |
| 'xlink:arcrole': XLINK_NAMESPACE, | |
| 'xlink:href': XLINK_NAMESPACE, | |
| 'xlink:role': XLINK_NAMESPACE, | |
| 'xlink:show': XLINK_NAMESPACE, | |
| 'xlink:title': XLINK_NAMESPACE, | |
| 'xlink:type': XLINK_NAMESPACE, | |
| 'xml:base': XML_NAMESPACE, | |
| 'xml:id': XML_NAMESPACE, | |
| 'xml:lang': XML_NAMESPACE, | |
| 'xml:space': XML_NAMESPACE, | |
| 'y': DEFAULT_NAMESPACE, | |
| 'y1': DEFAULT_NAMESPACE, | |
| 'y2': DEFAULT_NAMESPACE, | |
| 'yChannelSelector': DEFAULT_NAMESPACE, | |
| 'z': DEFAULT_NAMESPACE, | |
| 'zoomAndPan': DEFAULT_NAMESPACE | |
| }; | |
| module.exports = SVGAttributeNamespace; | |
| function SVGAttributeNamespace(value) { | |
| if (SVG_PROPERTIES.hasOwnProperty(value)) { | |
| return SVG_PROPERTIES[value]; | |
| } | |
| } | |
| },{}],12:[function(require,module,exports){ | |
| module.exports = isThunk | |
| function isThunk(t) { | |
| return t && t.type === "Thunk" | |
| } | |
| },{}],13:[function(require,module,exports){ | |
| module.exports = isHook | |
| function isHook(hook) { | |
| return hook && | |
| (typeof hook.hook === "function" && !hook.hasOwnProperty("hook") || | |
| typeof hook.unhook === "function" && !hook.hasOwnProperty("unhook")) | |
| } | |
| },{}],14:[function(require,module,exports){ | |
| var version = require("./version") | |
| module.exports = isVirtualNode | |
| function isVirtualNode(x) { | |
| return x && x.type === "VirtualNode" && x.version === version | |
| } | |
| },{"./version":17}],15:[function(require,module,exports){ | |
| var version = require("./version") | |
| module.exports = isVirtualText | |
| function isVirtualText(x) { | |
| return x && x.type === "VirtualText" && x.version === version | |
| } | |
| },{"./version":17}],16:[function(require,module,exports){ | |
| module.exports = isWidget | |
| function isWidget(w) { | |
| return w && w.type === "Widget" | |
| } | |
| },{}],17:[function(require,module,exports){ | |
| module.exports = "2" | |
| },{}],18:[function(require,module,exports){ | |
| var version = require("./version") | |
| var isVNode = require("./is-vnode") | |
| var isWidget = require("./is-widget") | |
| var isThunk = require("./is-thunk") | |
| var isVHook = require("./is-vhook") | |
| module.exports = VirtualNode | |
| var noProperties = {} | |
| var noChildren = [] | |
| function VirtualNode(tagName, properties, children, key, namespace) { | |
| this.tagName = tagName | |
| this.properties = properties || noProperties | |
| this.children = children || noChildren | |
| this.key = key != null ? String(key) : undefined | |
| this.namespace = (typeof namespace === "string") ? namespace : null | |
| var count = (children && children.length) || 0 | |
| var descendants = 0 | |
| var hasWidgets = false | |
| var hasThunks = false | |
| var descendantHooks = false | |
| var hooks | |
| for (var propName in properties) { | |
| if (properties.hasOwnProperty(propName)) { | |
| var property = properties[propName] | |
| if (isVHook(property) && property.unhook) { | |
| if (!hooks) { | |
| hooks = {} | |
| } | |
| hooks[propName] = property | |
| } | |
| } | |
| } | |
| for (var i = 0; i < count; i++) { | |
| var child = children[i] | |
| if (isVNode(child)) { | |
| descendants += child.count || 0 | |
| if (!hasWidgets && child.hasWidgets) { | |
| hasWidgets = true | |
| } | |
| if (!hasThunks && child.hasThunks) { | |
| hasThunks = true | |
| } | |
| if (!descendantHooks && (child.hooks || child.descendantHooks)) { | |
| descendantHooks = true | |
| } | |
| } else if (!hasWidgets && isWidget(child)) { | |
| if (typeof child.destroy === "function") { | |
| hasWidgets = true | |
| } | |
| } else if (!hasThunks && isThunk(child)) { | |
| hasThunks = true; | |
| } | |
| } | |
| this.count = count + descendants | |
| this.hasWidgets = hasWidgets | |
| this.hasThunks = hasThunks | |
| this.hooks = hooks | |
| this.descendantHooks = descendantHooks | |
| } | |
| VirtualNode.prototype.version = version | |
| VirtualNode.prototype.type = "VirtualNode" | |
| },{"./is-thunk":12,"./is-vhook":13,"./is-vnode":14,"./is-widget":16,"./version":17}],19:[function(require,module,exports){ | |
| var version = require("./version") | |
| module.exports = VirtualText | |
| function VirtualText(text) { | |
| this.text = String(text) | |
| } | |
| VirtualText.prototype.version = version | |
| VirtualText.prototype.type = "VirtualText" | |
| },{"./version":17}],"virtual-dom/virtual-hyperscript/svg":[function(require,module,exports){ | |
| 'use strict'; | |
| var isArray = require('x-is-array'); | |
| var h = require('./index.js'); | |
| var SVGAttributeNamespace = require('./svg-attribute-namespace'); | |
| var attributeHook = require('./hooks/attribute-hook'); | |
| var SVG_NAMESPACE = 'http://www.w3.org/2000/svg'; | |
| module.exports = svg; | |
| function svg(tagName, properties, children) { | |
| if (!children && isChildren(properties)) { | |
| children = properties; | |
| properties = {}; | |
| } | |
| properties = properties || {}; | |
| // set namespace for svg | |
| properties.namespace = SVG_NAMESPACE; | |
| var attributes = properties.attributes || (properties.attributes = {}); | |
| for (var key in properties) { | |
| if (!properties.hasOwnProperty(key)) { | |
| continue; | |
| } | |
| var namespace = SVGAttributeNamespace(key); | |
| if (namespace === undefined) { // not a svg attribute | |
| continue; | |
| } | |
| var value = properties[key]; | |
| if (typeof value !== 'string' && | |
| typeof value !== 'number' && | |
| typeof value !== 'boolean' | |
| ) { | |
| continue; | |
| } | |
| if (namespace !== null) { // namespaced attribute | |
| properties[key] = attributeHook(namespace, value); | |
| continue; | |
| } | |
| attributes[key] = value | |
| properties[key] = undefined | |
| } | |
| return h(tagName, properties, children); | |
| } | |
| function isChildren(x) { | |
| return typeof x === 'string' || isArray(x); | |
| } | |
| },{"./hooks/attribute-hook":6,"./index.js":9,"./svg-attribute-namespace":11,"x-is-array":5}]},{},[]) | |
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2hvbWUvYWRtaW4vYnJvd3NlcmlmeS1jZG4vbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyLXNwbGl0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2V2LXN0b3JlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2V2LXN0b3JlL25vZGVfbW9kdWxlcy9pbmRpdmlkdWFsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2V2LXN0b3JlL25vZGVfbW9kdWxlcy9pbmRpdmlkdWFsL29uZS12ZXJzaW9uLmpzIiwibm9kZV9tb2R1bGVzL3gtaXMtYXJyYXkvaW5kZXguanMiLCJ2aXJ0dWFsLWh5cGVyc2NyaXB0L2hvb2tzL2F0dHJpYnV0ZS1ob29rLmpzIiwidmlydHVhbC1oeXBlcnNjcmlwdC9ob29rcy9ldi1ob29rLmpzIiwidmlydHVhbC1oeXBlcnNjcmlwdC9ob29rcy9zb2Z0LXNldC1ob29rLmpzIiwidmlydHVhbC1oeXBlcnNjcmlwdC9pbmRleC5qcyIsInZpcnR1YWwtaHlwZXJzY3JpcHQvcGFyc2UtdGFnLmpzIiwidmlydHVhbC1oeXBlcnNjcmlwdC9zdmctYXR0cmlidXRlLW5hbWVzcGFjZS5qcyIsInZub2RlL2lzLXRodW5rLmpzIiwidm5vZGUvaXMtdmhvb2suanMiLCJ2bm9kZS9pcy12bm9kZS5qcyIsInZub2RlL2lzLXZ0ZXh0LmpzIiwidm5vZGUvaXMtd2lkZ2V0LmpzIiwidm5vZGUvdmVyc2lvbi5qcyIsInZub2RlL3Zub2RlLmpzIiwidm5vZGUvdnRleHQuanMiLCJ2aXJ0dWFsLWh5cGVyc2NyaXB0L3N2Zy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6VEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIvKiFcbiAqIENyb3NzLUJyb3dzZXIgU3BsaXQgMS4xLjFcbiAqIENvcHlyaWdodCAyMDA3LTIwMTIgU3RldmVuIExldml0aGFuIDxzdGV2ZW5sZXZpdGhhbi5jb20+XG4gKiBBdmFpbGFibGUgdW5kZXIgdGhlIE1JVCBMaWNlbnNlXG4gKiBFQ01BU2NyaXB0IGNvbXBsaWFudCwgdW5pZm9ybSBjcm9zcy1icm93c2VyIHNwbGl0IG1ldGhvZFxuICovXG5cbi8qKlxuICogU3BsaXRzIGEgc3RyaW5nIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5ncyB1c2luZyBhIHJlZ2V4IG9yIHN0cmluZyBzZXBhcmF0b3IuIE1hdGNoZXMgb2YgdGhlXG4gKiBzZXBhcmF0b3IgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0IGFycmF5LiBIb3dldmVyLCBpZiBgc2VwYXJhdG9yYCBpcyBhIHJlZ2V4IHRoYXQgY29udGFpbnNcbiAqIGNhcHR1cmluZyBncm91cHMsIGJhY2tyZWZlcmVuY2VzIGFyZSBzcGxpY2VkIGludG8gdGhlIHJlc3VsdCBlYWNoIHRpbWUgYHNlcGFyYXRvcmAgaXMgbWF0Y2hlZC5cbiAqIEZpeGVzIGJyb3dzZXIgYnVncyBjb21wYXJlZCB0byB0aGUgbmF0aXZlIGBTdHJpbmcucHJvdG90eXBlLnNwbGl0YCBhbmQgY2FuIGJlIHVzZWQgcmVsaWFibHlcbiAqIGNyb3NzLWJyb3dzZXIuXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyIFN0cmluZyB0byBzcGxpdC5cbiAqIEBwYXJhbSB7UmVnRXhwfFN0cmluZ30gc2VwYXJhdG9yIFJlZ2V4IG9yIHN0cmluZyB0byB1c2UgZm9yIHNlcGFyYXRpbmcgdGhlIHN0cmluZy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbbGltaXRdIE1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRvIGluY2x1ZGUgaW4gdGhlIHJlc3VsdCBhcnJheS5cbiAqIEByZXR1cm5zIHtBcnJheX0gQXJyYXkgb2Ygc3Vic3RyaW5ncy5cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQmFzaWMgdXNlXG4gKiBzcGxpdCgnYSBiIGMgZCcsICcgJyk7XG4gKiAvLyAtPiBbJ2EnLCAnYicsICdjJywgJ2QnXVxuICpcbiAqIC8vIFdpdGggbGltaXRcbiAqIHNwbGl0KCdhIGIgYyBkJywgJyAnLCAyKTtcbiAqIC8vIC0+IFsnYScsICdiJ11cbiAqXG4gKiAvLyBCYWNrcmVmZXJlbmNlcyBpbiByZXN1bHQgYXJyYXlcbiAqIHNwbGl0KCcuLndvcmQxIHdvcmQyLi4nLCAvKFthLXpdKykoXFxkKykvaSk7XG4gKiAvLyAtPiBbJy4uJywgJ3dvcmQnLCAnMScsICcgJywgJ3dvcmQnLCAnMicsICcuLiddXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gKGZ1bmN0aW9uIHNwbGl0KHVuZGVmKSB7XG5cbiAgdmFyIG5hdGl2ZVNwbGl0ID0gU3RyaW5nLnByb3RvdHlwZS5zcGxpdCxcbiAgICBjb21wbGlhbnRFeGVjTnBjZyA9IC8oKT8/Ly5leGVjKFwiXCIpWzFdID09PSB1bmRlZixcbiAgICAvLyBOUENHOiBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cFxuICAgIHNlbGY7XG5cbiAgc2VsZiA9IGZ1bmN0aW9uKHN0ciwgc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgIC8vIElmIGBzZXBhcmF0b3JgIGlzIG5vdCBhIHJlZ2V4LCB1c2UgYG5hdGl2ZVNwbGl0YFxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc2VwYXJhdG9yKSAhPT0gXCJbb2JqZWN0IFJlZ0V4cF1cIikge1xuICAgICAgcmV0dXJuIG5hdGl2ZVNwbGl0LmNhbGwoc3RyLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9XG4gICAgdmFyIG91dHB1dCA9IFtdLFxuICAgICAgZmxhZ3MgPSAoc2VwYXJhdG9yLmlnbm9yZUNhc2UgPyBcImlcIiA6IFwiXCIpICsgKHNlcGFyYXRvci5tdWx0aWxpbmUgPyBcIm1cIiA6IFwiXCIpICsgKHNlcGFyYXRvci5leHRlbmRlZCA/IFwieFwiIDogXCJcIikgKyAvLyBQcm9wb3NlZCBmb3IgRVM2XG4gICAgICAoc2VwYXJhdG9yLnN0aWNreSA/IFwieVwiIDogXCJcIiksXG4gICAgICAvLyBGaXJlZm94IDMrXG4gICAgICBsYXN0TGFzdEluZGV4ID0gMCxcbiAgICAgIC8vIE1ha2UgYGdsb2JhbGAgYW5kIGF2b2lkIGBsYXN0SW5kZXhgIGlzc3VlcyBieSB3b3JraW5nIHdpdGggYSBjb3B5XG4gICAgICBzZXBhcmF0b3IgPSBuZXcgUmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsIGZsYWdzICsgXCJnXCIpLFxuICAgICAgc2VwYXJhdG9yMiwgbWF0Y2gsIGxhc3RJbmRleCwgbGFzdExlbmd0aDtcbiAgICBzdHIgKz0gXCJcIjsgLy8gVHlwZS1jb252ZXJ0XG4gICAgaWYgKCFjb21wbGlhbnRFeGVjTnBjZykge1xuICAgICAgLy8gRG9lc24ndCBuZWVkIGZsYWdzIGd5LCBidXQgdGhleSBkb24ndCBodXJ0XG4gICAgICBzZXBhcmF0b3IyID0gbmV3IFJlZ0V4cChcIl5cIiArIHNlcGFyYXRvci5zb3VyY2UgKyBcIiQoPyFcXFxccylcIiwgZmxhZ3MpO1xuICAgIH1cbiAgICAvKiBWYWx1ZXMgZm9yIGBsaW1pdGAsIHBlciB0aGUgc3BlYzpcbiAgICAgKiBJZiB1bmRlZmluZWQ6IDQyOTQ5NjcyOTUgLy8gTWF0aC5wb3coMiwgMzIpIC0gMVxuICAgICAqIElmIDAsIEluZmluaXR5LCBvciBOYU46IDBcbiAgICAgKiBJZiBwb3NpdGl2ZSBudW1iZXI6IGxpbWl0ID0gTWF0aC5mbG9vcihsaW1pdCk7IGlmIChsaW1pdCA+IDQyOTQ5NjcyOTUpIGxpbWl0IC09IDQyOTQ5NjcyOTY7XG4gICAgICogSWYgbmVnYXRpdmUgbnVtYmVyOiA0Mjk0OTY3Mjk2IC0gTWF0aC5mbG9vcihNYXRoLmFicyhsaW1pdCkpXG4gICAgICogSWYgb3RoZXI6IFR5cGUtY29udmVydCwgdGhlbiB1c2UgdGhlIGFib3ZlIHJ1bGVzXG4gICAgICovXG4gICAgbGltaXQgPSBsaW1pdCA9PT0gdW5kZWYgPyAtMSA+Pj4gMCA6IC8vIE1hdGgucG93KDIsIDMyKSAtIDFcbiAgICBsaW1pdCA+Pj4gMDsgLy8gVG9VaW50MzIobGltaXQpXG4gICAgd2hpbGUgKG1hdGNoID0gc2VwYXJhdG9yLmV4ZWMoc3RyKSkge1xuICAgICAgLy8gYHNlcGFyYXRvci5sYXN0SW5kZXhgIGlzIG5vdCByZWxpYWJsZSBjcm9zcy1icm93c2VyXG4gICAgICBsYXN0SW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgIGlmIChsYXN0SW5kZXggPiBsYXN0TGFzdEluZGV4KSB7XG4gICAgICAgIG91dHB1dC5wdXNoKHN0ci5zbGljZShsYXN0TGFzdEluZGV4LCBtYXRjaC5pbmRleCkpO1xuICAgICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYCBmb3JcbiAgICAgICAgLy8gbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBzXG4gICAgICAgIGlmICghY29tcGxpYW50RXhlY05wY2cgJiYgbWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgICAgIG1hdGNoWzBdLnJlcGxhY2Uoc2VwYXJhdG9yMiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAyOyBpKyspIHtcbiAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWYpIHtcbiAgICAgICAgICAgICAgICBtYXRjaFtpXSA9IHVuZGVmO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hdGNoLmxlbmd0aCA+IDEgJiYgbWF0Y2guaW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkob3V0cHV0LCBtYXRjaC5zbGljZSgxKSk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdExlbmd0aCA9IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgbGFzdExhc3RJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgICAgaWYgKG91dHB1dC5sZW5ndGggPj0gbGltaXQpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHNlcGFyYXRvci5sYXN0SW5kZXggPT09IG1hdGNoLmluZGV4KSB7XG4gICAgICAgIHNlcGFyYXRvci5sYXN0SW5kZXgrKzsgLy8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAobGFzdExhc3RJbmRleCA9PT0gc3RyLmxlbmd0aCkge1xuICAgICAgaWYgKGxhc3RMZW5ndGggfHwgIXNlcGFyYXRvci50ZXN0KFwiXCIpKSB7XG4gICAgICAgIG91dHB1dC5wdXNoKFwiXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaChzdHIuc2xpY2UobGFzdExhc3RJbmRleCkpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0Lmxlbmd0aCA+IGxpbWl0ID8gb3V0cHV0LnNsaWNlKDAsIGxpbWl0KSA6IG91dHB1dDtcbiAgfTtcblxuICByZXR1cm4gc2VsZjtcbn0pKCk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBPbmVWZXJzaW9uQ29uc3RyYWludCA9IHJlcXVpcmUoJ2luZGl2aWR1YWwvb25lLXZlcnNpb24nKTtcblxudmFyIE1ZX1ZFUlNJT04gPSAnNyc7XG5PbmVWZXJzaW9uQ29uc3RyYWludCgnZXYtc3RvcmUnLCBNWV9WRVJTSU9OKTtcblxudmFyIGhhc2hLZXkgPSAnX19FVl9TVE9SRV9LRVlAJyArIE1ZX1ZFUlNJT047XG5cbm1vZHVsZS5leHBvcnRzID0gRXZTdG9yZTtcblxuZnVuY3Rpb24gRXZTdG9yZShlbGVtKSB7XG4gICAgdmFyIGhhc2ggPSBlbGVtW2hhc2hLZXldO1xuXG4gICAgaWYgKCFoYXNoKSB7XG4gICAgICAgIGhhc2ggPSBlbGVtW2hhc2hLZXldID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhc2g7XG59XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCl7XG4ndXNlIHN0cmljdCc7XG5cbi8qZ2xvYmFsIHdpbmRvdywgZ2xvYmFsKi9cblxudmFyIHJvb3QgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/XG4gICAgd2luZG93IDogdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgP1xuICAgIGdsb2JhbCA6IHt9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEluZGl2aWR1YWw7XG5cbmZ1bmN0aW9uIEluZGl2aWR1YWwoa2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkgaW4gcm9vdCkge1xuICAgICAgICByZXR1cm4gcm9vdFtrZXldO1xuICAgIH1cblxuICAgIHJvb3Rba2V5XSA9IHZhbHVlO1xuXG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG59KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0OnV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkltNXZaR1ZmYlc5a2RXeGxjeTlsZGkxemRHOXlaUzl1YjJSbFgyMXZaSFZzWlhNdmFXNWthWFpwWkhWaGJDOXBibVJsZUM1cWN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaU8wRkJRVUU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFUdEJRVU5CTzBGQlEwRTdRVUZEUVR0QlFVTkJPMEZCUTBFN1FVRkRRVHRCUVVOQk8wRkJRMEU3UVVGRFFTSXNJbVpwYkdVaU9pSm5aVzVsY21GMFpXUXVhbk1pTENKemIzVnlZMlZTYjI5MElqb2lJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpSjNWelpTQnpkSEpwWTNRbk8xeHVYRzR2S21kc2IySmhiQ0IzYVc1a2IzY3NJR2RzYjJKaGJDb3ZYRzVjYm5aaGNpQnliMjkwSUQwZ2RIbHdaVzltSUhkcGJtUnZkeUFoUFQwZ0ozVnVaR1ZtYVc1bFpDY2dQMXh1SUNBZ0lIZHBibVJ2ZHlBNklIUjVjR1Z2WmlCbmJHOWlZV3dnSVQwOUlDZDFibVJsWm1sdVpXUW5JRDljYmlBZ0lDQm5iRzlpWVd3Z09pQjdmVHRjYmx4dWJXOWtkV3hsTG1WNGNHOXlkSE1nUFNCSmJtUnBkbWxrZFdGc08xeHVYRzVtZFc1amRHbHZiaUJKYm1ScGRtbGtkV0ZzS0d0bGVTd2dkbUZzZFdVcElIdGNiaUFnSUNCcFppQW9hMlY1SUdsdUlISnZiM1FwSUh0Y2JpQWdJQ0FnSUNBZ2NtVjBkWEp1SUhKdmIzUmJhMlY1WFR0Y2JpQWdJQ0I5WEc1Y2JpQWdJQ0J5YjI5MFcydGxlVjBnUFNCMllXeDFaVHRjYmx4dUlDQWdJSEpsZEhWeWJpQjJZV3gxWlR0Y2JuMWNiaUpkZlE9PSIsIid1c2Ugc3RyaWN0JztcblxudmFyIEluZGl2aWR1YWwgPSByZXF1aXJlKCcuL2luZGV4LmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gT25lVmVyc2lvbjtcblxuZnVuY3Rpb24gT25lVmVyc2lvbihtb2R1bGVOYW1lLCB2ZXJzaW9uLCBkZWZhdWx0VmFsdWUpIHtcbiAgICB2YXIga2V5ID0gJ19fSU5ESVZJRFVBTF9PTkVfVkVSU0lPTl8nICsgbW9kdWxlTmFtZTtcbiAgICB2YXIgZW5mb3JjZUtleSA9IGtleSArICdfRU5GT1JDRV9TSU5HTEVUT04nO1xuXG4gICAgdmFyIHZlcnNpb25WYWx1ZSA9IEluZGl2aWR1YWwoZW5mb3JjZUtleSwgdmVyc2lvbik7XG5cbiAgICBpZiAodmVyc2lvblZhbHVlICE9PSB2ZXJzaW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuIG9ubHkgaGF2ZSBvbmUgY29weSBvZiAnICtcbiAgICAgICAgICAgIG1vZHVsZU5hbWUgKyAnLlxcbicgK1xuICAgICAgICAgICAgJ1lvdSBhbHJlYWR5IGhhdmUgdmVyc2lvbiAnICsgdmVyc2lvblZhbHVlICtcbiAgICAgICAgICAgICcgaW5zdGFsbGVkLlxcbicgK1xuICAgICAgICAgICAgJ1RoaXMgbWVhbnMgeW91IGNhbm5vdCBpbnN0YWxsIHZlcnNpb24gJyArIHZlcnNpb24pO1xuICAgIH1cblxuICAgIHJldHVybiBJbmRpdmlkdWFsKGtleSwgZGVmYXVsdFZhbHVlKTtcbn1cbiIsInZhciBuYXRpdmVJc0FycmF5ID0gQXJyYXkuaXNBcnJheVxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdGl2ZUlzQXJyYXkgfHwgaXNBcnJheVxuXG5mdW5jdGlvbiBpc0FycmF5KG9iaikge1xuICAgIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09IFwiW29iamVjdCBBcnJheV1cIlxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEF0dHJpYnV0ZUhvb2s7XG5cbmZ1bmN0aW9uIEF0dHJpYnV0ZUhvb2sobmFtZXNwYWNlLCB2YWx1ZSkge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBBdHRyaWJ1dGVIb29rKSkge1xuICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZUhvb2sobmFtZXNwYWNlLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xufVxuXG5BdHRyaWJ1dGVIb29rLnByb3RvdHlwZS5ob29rID0gZnVuY3Rpb24gKG5vZGUsIHByb3AsIHByZXYpIHtcbiAgICBpZiAocHJldiAmJiBwcmV2LnR5cGUgPT09ICdBdHRyaWJ1dGVIb29rJyAmJlxuICAgICAgICBwcmV2LnZhbHVlID09PSB0aGlzLnZhbHVlICYmXG4gICAgICAgIHByZXYubmFtZXNwYWNlID09PSB0aGlzLm5hbWVzcGFjZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zZXRBdHRyaWJ1dGVOUyh0aGlzLm5hbWVzcGFjZSwgcHJvcCwgdGhpcy52YWx1ZSk7XG59O1xuXG5BdHRyaWJ1dGVIb29rLnByb3RvdHlwZS51bmhvb2sgPSBmdW5jdGlvbiAobm9kZSwgcHJvcCwgbmV4dCkge1xuICAgIGlmIChuZXh0ICYmIG5leHQudHlwZSA9PT0gJ0F0dHJpYnV0ZUhvb2snICYmXG4gICAgICAgIG5leHQubmFtZXNwYWNlID09PSB0aGlzLm5hbWVzcGFjZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGNvbG9uUG9zaXRpb24gPSBwcm9wLmluZGV4T2YoJzonKTtcbiAgICB2YXIgbG9jYWxOYW1lID0gY29sb25Qb3NpdGlvbiA+IC0xID8gcHJvcC5zdWJzdHIoY29sb25Qb3NpdGlvbiArIDEpIDogcHJvcDtcbiAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZU5TKHRoaXMubmFtZXNwYWNlLCBsb2NhbE5hbWUpO1xufTtcblxuQXR0cmlidXRlSG9vay5wcm90b3R5cGUudHlwZSA9ICdBdHRyaWJ1dGVIb29rJztcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIEV2U3RvcmUgPSByZXF1aXJlKCdldi1zdG9yZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV2SG9vaztcblxuZnVuY3Rpb24gRXZIb29rKHZhbHVlKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIEV2SG9vaykpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFdkhvb2sodmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbn1cblxuRXZIb29rLnByb3RvdHlwZS5ob29rID0gZnVuY3Rpb24gKG5vZGUsIHByb3BlcnR5TmFtZSkge1xuICAgIHZhciBlcyA9IEV2U3RvcmUobm9kZSk7XG4gICAgdmFyIHByb3BOYW1lID0gcHJvcGVydHlOYW1lLnN1YnN0cigzKTtcblxuICAgIGVzW3Byb3BOYW1lXSA9IHRoaXMudmFsdWU7XG59O1xuXG5Fdkhvb2sucHJvdG90eXBlLnVuaG9vayA9IGZ1bmN0aW9uKG5vZGUsIHByb3BlcnR5TmFtZSkge1xuICAgIHZhciBlcyA9IEV2U3RvcmUobm9kZSk7XG4gICAgdmFyIHByb3BOYW1lID0gcHJvcGVydHlOYW1lLnN1YnN0cigzKTtcblxuICAgIGVzW3Byb3BOYW1lXSA9IHVuZGVmaW5lZDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gU29mdFNldEhvb2s7XG5cbmZ1bmN0aW9uIFNvZnRTZXRIb29rKHZhbHVlKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFNvZnRTZXRIb29rKSkge1xuICAgICAgICByZXR1cm4gbmV3IFNvZnRTZXRIb29rKHZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG59XG5cblNvZnRTZXRIb29rLnByb3RvdHlwZS5ob29rID0gZnVuY3Rpb24gKG5vZGUsIHByb3BlcnR5TmFtZSkge1xuICAgIGlmIChub2RlW3Byb3BlcnR5TmFtZV0gIT09IHRoaXMudmFsdWUpIHtcbiAgICAgICAgbm9kZVtwcm9wZXJ0eU5hbWVdID0gdGhpcy52YWx1ZTtcbiAgICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ3gtaXMtYXJyYXknKTtcblxudmFyIFZOb2RlID0gcmVxdWlyZSgnLi4vdm5vZGUvdm5vZGUuanMnKTtcbnZhciBWVGV4dCA9IHJlcXVpcmUoJy4uL3Zub2RlL3Z0ZXh0LmpzJyk7XG52YXIgaXNWTm9kZSA9IHJlcXVpcmUoJy4uL3Zub2RlL2lzLXZub2RlJyk7XG52YXIgaXNWVGV4dCA9IHJlcXVpcmUoJy4uL3Zub2RlL2lzLXZ0ZXh0Jyk7XG52YXIgaXNXaWRnZXQgPSByZXF1aXJlKCcuLi92bm9kZS9pcy13aWRnZXQnKTtcbnZhciBpc0hvb2sgPSByZXF1aXJlKCcuLi92bm9kZS9pcy12aG9vaycpO1xudmFyIGlzVlRodW5rID0gcmVxdWlyZSgnLi4vdm5vZGUvaXMtdGh1bmsnKTtcblxudmFyIHBhcnNlVGFnID0gcmVxdWlyZSgnLi9wYXJzZS10YWcuanMnKTtcbnZhciBzb2Z0U2V0SG9vayA9IHJlcXVpcmUoJy4vaG9va3Mvc29mdC1zZXQtaG9vay5qcycpO1xudmFyIGV2SG9vayA9IHJlcXVpcmUoJy4vaG9va3MvZXYtaG9vay5qcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGg7XG5cbmZ1bmN0aW9uIGgodGFnTmFtZSwgcHJvcGVydGllcywgY2hpbGRyZW4pIHtcbiAgICB2YXIgY2hpbGROb2RlcyA9IFtdO1xuICAgIHZhciB0YWcsIHByb3BzLCBrZXksIG5hbWVzcGFjZTtcblxuICAgIGlmICghY2hpbGRyZW4gJiYgaXNDaGlsZHJlbihwcm9wZXJ0aWVzKSkge1xuICAgICAgICBjaGlsZHJlbiA9IHByb3BlcnRpZXM7XG4gICAgICAgIHByb3BzID0ge307XG4gICAgfVxuXG4gICAgcHJvcHMgPSBwcm9wcyB8fCBwcm9wZXJ0aWVzIHx8IHt9O1xuICAgIHRhZyA9IHBhcnNlVGFnKHRhZ05hbWUsIHByb3BzKTtcblxuICAgIC8vIHN1cHBvcnQga2V5c1xuICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eSgna2V5JykpIHtcbiAgICAgICAga2V5ID0gcHJvcHMua2V5O1xuICAgICAgICBwcm9wcy5rZXkgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gc3VwcG9ydCBuYW1lc3BhY2VcbiAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkoJ25hbWVzcGFjZScpKSB7XG4gICAgICAgIG5hbWVzcGFjZSA9IHByb3BzLm5hbWVzcGFjZTtcbiAgICAgICAgcHJvcHMubmFtZXNwYWNlID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIGZpeCBjdXJzb3IgYnVnXG4gICAgaWYgKHRhZyA9PT0gJ0lOUFVUJyAmJlxuICAgICAgICAhbmFtZXNwYWNlICYmXG4gICAgICAgIHByb3BzLmhhc093blByb3BlcnR5KCd2YWx1ZScpICYmXG4gICAgICAgIHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgIWlzSG9vayhwcm9wcy52YWx1ZSlcbiAgICApIHtcbiAgICAgICAgcHJvcHMudmFsdWUgPSBzb2Z0U2V0SG9vayhwcm9wcy52YWx1ZSk7XG4gICAgfVxuXG4gICAgdHJhbnNmb3JtUHJvcGVydGllcyhwcm9wcyk7XG5cbiAgICBpZiAoY2hpbGRyZW4gIT09IHVuZGVmaW5lZCAmJiBjaGlsZHJlbiAhPT0gbnVsbCkge1xuICAgICAgICBhZGRDaGlsZChjaGlsZHJlbiwgY2hpbGROb2RlcywgdGFnLCBwcm9wcyk7XG4gICAgfVxuXG5cbiAgICByZXR1cm4gbmV3IFZOb2RlKHRhZywgcHJvcHMsIGNoaWxkTm9kZXMsIGtleSwgbmFtZXNwYWNlKTtcbn1cblxuZnVuY3Rpb24gYWRkQ2hpbGQoYywgY2hpbGROb2RlcywgdGFnLCBwcm9wcykge1xuICAgIGlmICh0eXBlb2YgYyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY2hpbGROb2Rlcy5wdXNoKG5ldyBWVGV4dChjKSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY2hpbGROb2Rlcy5wdXNoKG5ldyBWVGV4dChTdHJpbmcoYykpKTtcbiAgICB9IGVsc2UgaWYgKGlzQ2hpbGQoYykpIHtcbiAgICAgICAgY2hpbGROb2Rlcy5wdXNoKGMpO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShjKSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFkZENoaWxkKGNbaV0sIGNoaWxkTm9kZXMsIHRhZywgcHJvcHMpO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChjID09PSBudWxsIHx8IGMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgVW5leHBlY3RlZFZpcnR1YWxFbGVtZW50KHtcbiAgICAgICAgICAgIGZvcmVpZ25PYmplY3Q6IGMsXG4gICAgICAgICAgICBwYXJlbnRWbm9kZToge1xuICAgICAgICAgICAgICAgIHRhZ05hbWU6IHRhZyxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBwcm9wc1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVByb3BlcnRpZXMocHJvcHMpIHtcbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBwcm9wcykge1xuICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG5cbiAgICAgICAgICAgIGlmIChpc0hvb2sodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wTmFtZS5zdWJzdHIoMCwgMykgPT09ICdldi0nKSB7XG4gICAgICAgICAgICAgICAgLy8gYWRkIGV2LWZvbyBzdXBwb3J0XG4gICAgICAgICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZXZIb29rKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNDaGlsZCh4KSB7XG4gICAgcmV0dXJuIGlzVk5vZGUoeCkgfHwgaXNWVGV4dCh4KSB8fCBpc1dpZGdldCh4KSB8fCBpc1ZUaHVuayh4KTtcbn1cblxuZnVuY3Rpb24gaXNDaGlsZHJlbih4KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnc3RyaW5nJyB8fCBpc0FycmF5KHgpIHx8IGlzQ2hpbGQoeCk7XG59XG5cbmZ1bmN0aW9uIFVuZXhwZWN0ZWRWaXJ0dWFsRWxlbWVudChkYXRhKSB7XG4gICAgdmFyIGVyciA9IG5ldyBFcnJvcigpO1xuXG4gICAgZXJyLnR5cGUgPSAndmlydHVhbC1oeXBlcnNjcmlwdC51bmV4cGVjdGVkLnZpcnR1YWwtZWxlbWVudCc7XG4gICAgZXJyLm1lc3NhZ2UgPSAnVW5leHBlY3RlZCB2aXJ0dWFsIGNoaWxkIHBhc3NlZCB0byBoKCkuXFxuJyArXG4gICAgICAgICdFeHBlY3RlZCBhIFZOb2RlIC8gVnRodW5rIC8gVldpZGdldCAvIHN0cmluZyBidXQ6XFxuJyArXG4gICAgICAgICdnb3Q6XFxuJyArXG4gICAgICAgIGVycm9yU3RyaW5nKGRhdGEuZm9yZWlnbk9iamVjdCkgK1xuICAgICAgICAnLlxcbicgK1xuICAgICAgICAnVGhlIHBhcmVudCB2bm9kZSBpczpcXG4nICtcbiAgICAgICAgZXJyb3JTdHJpbmcoZGF0YS5wYXJlbnRWbm9kZSlcbiAgICAgICAgJ1xcbicgK1xuICAgICAgICAnU3VnZ2VzdGVkIGZpeDogY2hhbmdlIHlvdXIgYGgoLi4uLCBbIC4uLiBdKWAgY2FsbHNpdGUuJztcbiAgICBlcnIuZm9yZWlnbk9iamVjdCA9IGRhdGEuZm9yZWlnbk9iamVjdDtcbiAgICBlcnIucGFyZW50Vm5vZGUgPSBkYXRhLnBhcmVudFZub2RlO1xuXG4gICAgcmV0dXJuIGVycjtcbn1cblxuZnVuY3Rpb24gZXJyb3JTdHJpbmcob2JqKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgJyAgICAnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcob2JqKTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBzcGxpdCA9IHJlcXVpcmUoJ2Jyb3dzZXItc3BsaXQnKTtcblxudmFyIGNsYXNzSWRTcGxpdCA9IC8oW1xcLiNdP1thLXpBLVowLTlcXHUwMDdGLVxcdUZGRkZfOi1dKykvO1xudmFyIG5vdENsYXNzSWQgPSAvXlxcLnwjLztcblxubW9kdWxlLmV4cG9ydHMgPSBwYXJzZVRhZztcblxuZnVuY3Rpb24gcGFyc2VUYWcodGFnLCBwcm9wcykge1xuICAgIGlmICghdGFnKSB7XG4gICAgICAgIHJldHVybiAnRElWJztcbiAgICB9XG5cbiAgICB2YXIgbm9JZCA9ICEocHJvcHMuaGFzT3duUHJvcGVydHkoJ2lkJykpO1xuXG4gICAgdmFyIHRhZ1BhcnRzID0gc3BsaXQodGFnLCBjbGFzc0lkU3BsaXQpO1xuICAgIHZhciB0YWdOYW1lID0gbnVsbDtcblxuICAgIGlmIChub3RDbGFzc0lkLnRlc3QodGFnUGFydHNbMV0pKSB7XG4gICAgICAgIHRhZ05hbWUgPSAnRElWJztcbiAgICB9XG5cbiAgICB2YXIgY2xhc3NlcywgcGFydCwgdHlwZSwgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCB0YWdQYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwYXJ0ID0gdGFnUGFydHNbaV07XG5cbiAgICAgICAgaWYgKCFwYXJ0KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHR5cGUgPSBwYXJ0LmNoYXJBdCgwKTtcblxuICAgICAgICBpZiAoIXRhZ05hbWUpIHtcbiAgICAgICAgICAgIHRhZ05hbWUgPSBwYXJ0O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICcuJykge1xuICAgICAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMgfHwgW107XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2gocGFydC5zdWJzdHJpbmcoMSwgcGFydC5sZW5ndGgpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnIycgJiYgbm9JZCkge1xuICAgICAgICAgICAgcHJvcHMuaWQgPSBwYXJ0LnN1YnN0cmluZygxLCBwYXJ0Lmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2xhc3Nlcykge1xuICAgICAgICBpZiAocHJvcHMuY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2gocHJvcHMuY2xhc3NOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb3BzLmNsYXNzTmFtZSA9IGNsYXNzZXMuam9pbignICcpO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9wcy5uYW1lc3BhY2UgPyB0YWdOYW1lIDogdGFnTmFtZS50b1VwcGVyQ2FzZSgpO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgREVGQVVMVF9OQU1FU1BBQ0UgPSBudWxsO1xudmFyIEVWX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC1ldmVudHMnO1xudmFyIFhMSU5LX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJztcbnZhciBYTUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSc7XG5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1NWR1RpbnkxMi9hdHRyaWJ1dGVUYWJsZS5odG1sXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcvYXR0aW5kZXguaHRtbFxudmFyIFNWR19QUk9QRVJUSUVTID0ge1xuICAgICdhYm91dCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdhY2NlbnQtaGVpZ2h0JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2FjY3VtdWxhdGUnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnYWRkaXRpdmUnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnYWxpZ25tZW50LWJhc2VsaW5lJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2FscGhhYmV0aWMnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnYW1wbGl0dWRlJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2FyYWJpYy1mb3JtJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2FzY2VudCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdhdHRyaWJ1dGVOYW1lJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2F0dHJpYnV0ZVR5cGUnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnYXppbXV0aCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdiYW5kd2lkdGgnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnYmFzZUZyZXF1ZW5jeSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdiYXNlUHJvZmlsZSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdiYXNlbGluZS1zaGlmdCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdiYm94JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2JlZ2luJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2JpYXMnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnYnknOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnY2FsY01vZGUnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnY2FwLWhlaWdodCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdjbGFzcyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdjbGlwJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2NsaXAtcGF0aCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdjbGlwLXJ1bGUnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnY2xpcFBhdGhVbml0cyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdjb2xvcic6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdjb2xvci1pbnRlcnBvbGF0aW9uJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdjb2xvci1wcm9maWxlJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2NvbG9yLXJlbmRlcmluZyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdjb250ZW50JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2NvbnRlbnRTY3JpcHRUeXBlJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2NvbnRlbnRTdHlsZVR5cGUnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnY3Vyc29yJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2N4JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2N5JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2QnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnZGF0YXR5cGUnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnZGVmYXVsdEFjdGlvbic6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdkZXNjZW50JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2RpZmZ1c2VDb25zdGFudCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdkaXJlY3Rpb24nOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnZGlzcGxheSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdkaXZpc29yJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2RvbWluYW50LWJhc2VsaW5lJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2R1cic6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdkeCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdkeSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdlZGdlTW9kZSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdlZGl0YWJsZSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdlbGV2YXRpb24nOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnZW5hYmxlLWJhY2tncm91bmQnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnZW5kJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2V2OmV2ZW50JzogRVZfTkFNRVNQQUNFLFxuICAgICdldmVudCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdleHBvbmVudCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2ZpbGwnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnZmlsbC1vcGFjaXR5JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2ZpbGwtcnVsZSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdmaWx0ZXInOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnZmlsdGVyUmVzJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2ZpbHRlclVuaXRzJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2Zsb29kLWNvbG9yJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2Zsb29kLW9wYWNpdHknOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnZm9jdXNIaWdobGlnaHQnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnZm9jdXNhYmxlJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2ZvbnQtZmFtaWx5JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2ZvbnQtc2l6ZSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdmb250LXNpemUtYWRqdXN0JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2ZvbnQtc3RyZXRjaCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdmb250LXN0eWxlJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2ZvbnQtdmFyaWFudCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdmb250LXdlaWdodCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdmb3JtYXQnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnZnJvbSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdmeCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdmeSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdnMSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdnMic6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdnbHlwaC1uYW1lJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnZ2x5cGhSZWYnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnZ3JhZGllbnRUcmFuc2Zvcm0nOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnZ3JhZGllbnRVbml0cyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdoYW5kbGVyJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2hhbmdpbmcnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnaGVpZ2h0JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2hvcml6LWFkdi14JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2hvcml6LW9yaWdpbi14JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2hvcml6LW9yaWdpbi15JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2lkJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2lkZW9ncmFwaGljJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2ltYWdlLXJlbmRlcmluZyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdpbic6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdpbjInOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnaW5pdGlhbFZpc2liaWxpdHknOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnaW50ZXJjZXB0JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2snOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnazEnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnazInOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnazMnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnazQnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAna2VybmVsTWF0cml4JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2tlcm5lbFVuaXRMZW5ndGgnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAna2VybmluZyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdrZXlQb2ludHMnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAna2V5U3BsaW5lcyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdrZXlUaW1lcyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdsYW5nJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ2xlbmd0aEFkanVzdCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdsZXR0ZXItc3BhY2luZyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdsaWdodGluZy1jb2xvcic6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdsaW1pdGluZ0NvbmVBbmdsZSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdsb2NhbCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdtYXJrZXItZW5kJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ21hcmtlci1taWQnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnbWFya2VyLXN0YXJ0JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ21hcmtlckhlaWdodCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdtYXJrZXJVbml0cyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdtYXJrZXJXaWR0aCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdtYXNrJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ21hc2tDb250ZW50VW5pdHMnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnbWFza1VuaXRzJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ21hdGhlbWF0aWNhbCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdtYXgnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnbWVkaWEnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnbWVkaWFDaGFyYWN0ZXJFbmNvZGluZyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdtZWRpYUNvbnRlbnRFbmNvZGluZ3MnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnbWVkaWFTaXplJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ21lZGlhVGltZSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdtZXRob2QnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnbWluJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ21vZGUnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnbmFtZSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICduYXYtZG93bic6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICduYXYtZG93bi1sZWZ0JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ25hdi1kb3duLXJpZ2h0JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ25hdi1sZWZ0JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ25hdi1uZXh0JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ25hdi1wcmV2JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ25hdi1yaWdodCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICduYXYtdXAnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnbmF2LXVwLWxlZnQnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnbmF2LXVwLXJpZ2h0JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ251bU9jdGF2ZXMnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnb2JzZXJ2ZXInOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnb2Zmc2V0JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ29wYWNpdHknOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnb3BlcmF0b3InOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnb3JkZXInOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnb3JpZW50JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ29yaWVudGF0aW9uJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ29yaWdpbic6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdvdmVyZmxvdyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdvdmVybGF5JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ292ZXJsaW5lLXBvc2l0aW9uJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ292ZXJsaW5lLXRoaWNrbmVzcyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdwYW5vc2UtMSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdwYXRoJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3BhdGhMZW5ndGgnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAncGF0dGVybkNvbnRlbnRVbml0cyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdwYXR0ZXJuVHJhbnNmb3JtJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3BhdHRlcm5Vbml0cyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdwaGFzZSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdwbGF5YmFja09yZGVyJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3BvaW50ZXItZXZlbnRzJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3BvaW50cyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdwb2ludHNBdFgnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAncG9pbnRzQXRZJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3BvaW50c0F0Wic6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdwcmVzZXJ2ZUFscGhhJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3ByZXNlcnZlQXNwZWN0UmF0aW8nOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAncHJpbWl0aXZlVW5pdHMnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAncHJvcGFnYXRlJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3Byb3BlcnR5JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3InOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAncmFkaXVzJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3JlZlgnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAncmVmWSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdyZWwnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAncmVuZGVyaW5nLWludGVudCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdyZXBlYXRDb3VudCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdyZXBlYXREdXInOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAncmVxdWlyZWRFeHRlbnNpb25zJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3JlcXVpcmVkRmVhdHVyZXMnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAncmVxdWlyZWRGb250cyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdyZXF1aXJlZEZvcm1hdHMnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAncmVzb3VyY2UnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAncmVzdGFydCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdyZXN1bHQnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAncmV2JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3JvbGUnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAncm90YXRlJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3J4JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3J5JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3NjYWxlJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3NlZWQnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnc2hhcGUtcmVuZGVyaW5nJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3Nsb3BlJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3NuYXBzaG90VGltZSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdzcGFjaW5nJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3NwZWN1bGFyQ29uc3RhbnQnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnc3BlY3VsYXJFeHBvbmVudCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdzcHJlYWRNZXRob2QnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnc3RhcnRPZmZzZXQnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnc3RkRGV2aWF0aW9uJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3N0ZW1oJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3N0ZW12JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3N0aXRjaFRpbGVzJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3N0b3AtY29sb3InOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnc3RvcC1vcGFjaXR5JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3N0cmlrZXRocm91Z2gtcG9zaXRpb24nOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnc3RyaWtldGhyb3VnaC10aGlja25lc3MnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnc3RyaW5nJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3N0cm9rZSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdzdHJva2UtZGFzaGFycmF5JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3N0cm9rZS1kYXNob2Zmc2V0JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3N0cm9rZS1saW5lY2FwJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3N0cm9rZS1saW5lam9pbic6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdzdHJva2UtbWl0ZXJsaW1pdCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdzdHJva2Utb3BhY2l0eSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdzdHJva2Utd2lkdGgnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnc3VyZmFjZVNjYWxlJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3N5bmNCZWhhdmlvcic6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdzeW5jQmVoYXZpb3JEZWZhdWx0JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3N5bmNNYXN0ZXInOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnc3luY1RvbGVyYW5jZSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdzeW5jVG9sZXJhbmNlRGVmYXVsdCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICdzeXN0ZW1MYW5ndWFnZSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICd0YWJsZVZhbHVlcyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICd0YXJnZXQnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAndGFyZ2V0WCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICd0YXJnZXRZJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3RleHQtYW5jaG9yJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3RleHQtZGVjb3JhdGlvbic6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICd0ZXh0LXJlbmRlcmluZyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICd0ZXh0TGVuZ3RoJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3RpbWVsaW5lQmVnaW4nOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAndGl0bGUnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAndG8nOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAndHJhbnNmb3JtJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3RyYW5zZm9ybUJlaGF2aW9yJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3R5cGUnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAndHlwZW9mJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3UxJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3UyJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3VuZGVybGluZS1wb3NpdGlvbic6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICd1bmRlcmxpbmUtdGhpY2tuZXNzJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3VuaWNvZGUnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAndW5pY29kZS1iaWRpJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3VuaWNvZGUtcmFuZ2UnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAndW5pdHMtcGVyLWVtJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3YtYWxwaGFiZXRpYyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICd2LWhhbmdpbmcnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAndi1pZGVvZ3JhcGhpYyc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICd2LW1hdGhlbWF0aWNhbCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICd2YWx1ZXMnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAndmVyc2lvbic6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICd2ZXJ0LWFkdi15JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3ZlcnQtb3JpZ2luLXgnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAndmVydC1vcmlnaW4teSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICd2aWV3Qm94JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3ZpZXdUYXJnZXQnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAndmlzaWJpbGl0eSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICd3aWR0aCc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICd3aWR0aHMnOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAnd29yZC1zcGFjaW5nJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3dyaXRpbmctbW9kZSc6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICd4JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3gtaGVpZ2h0JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3gxJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3gyJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3hDaGFubmVsU2VsZWN0b3InOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAneGxpbms6YWN0dWF0ZSc6IFhMSU5LX05BTUVTUEFDRSxcbiAgICAneGxpbms6YXJjcm9sZSc6IFhMSU5LX05BTUVTUEFDRSxcbiAgICAneGxpbms6aHJlZic6IFhMSU5LX05BTUVTUEFDRSxcbiAgICAneGxpbms6cm9sZSc6IFhMSU5LX05BTUVTUEFDRSxcbiAgICAneGxpbms6c2hvdyc6IFhMSU5LX05BTUVTUEFDRSxcbiAgICAneGxpbms6dGl0bGUnOiBYTElOS19OQU1FU1BBQ0UsXG4gICAgJ3hsaW5rOnR5cGUnOiBYTElOS19OQU1FU1BBQ0UsXG4gICAgJ3htbDpiYXNlJzogWE1MX05BTUVTUEFDRSxcbiAgICAneG1sOmlkJzogWE1MX05BTUVTUEFDRSxcbiAgICAneG1sOmxhbmcnOiBYTUxfTkFNRVNQQUNFLFxuICAgICd4bWw6c3BhY2UnOiBYTUxfTkFNRVNQQUNFLFxuICAgICd5JzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3kxJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3kyJzogREVGQVVMVF9OQU1FU1BBQ0UsXG4gICAgJ3lDaGFubmVsU2VsZWN0b3InOiBERUZBVUxUX05BTUVTUEFDRSxcbiAgICAneic6IERFRkFVTFRfTkFNRVNQQUNFLFxuICAgICd6b29tQW5kUGFuJzogREVGQVVMVF9OQU1FU1BBQ0Vcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gU1ZHQXR0cmlidXRlTmFtZXNwYWNlO1xuXG5mdW5jdGlvbiBTVkdBdHRyaWJ1dGVOYW1lc3BhY2UodmFsdWUpIHtcbiAgaWYgKFNWR19QUk9QRVJUSUVTLmhhc093blByb3BlcnR5KHZhbHVlKSkge1xuICAgIHJldHVybiBTVkdfUFJPUEVSVElFU1t2YWx1ZV07XG4gIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gaXNUaHVua1xyXG5cclxuZnVuY3Rpb24gaXNUaHVuayh0KSB7XHJcbiAgICByZXR1cm4gdCAmJiB0LnR5cGUgPT09IFwiVGh1bmtcIlxyXG59XHJcbiIsIm1vZHVsZS5leHBvcnRzID0gaXNIb29rXG5cbmZ1bmN0aW9uIGlzSG9vayhob29rKSB7XG4gICAgcmV0dXJuIGhvb2sgJiZcbiAgICAgICh0eXBlb2YgaG9vay5ob29rID09PSBcImZ1bmN0aW9uXCIgJiYgIWhvb2suaGFzT3duUHJvcGVydHkoXCJob29rXCIpIHx8XG4gICAgICAgdHlwZW9mIGhvb2sudW5ob29rID09PSBcImZ1bmN0aW9uXCIgJiYgIWhvb2suaGFzT3duUHJvcGVydHkoXCJ1bmhvb2tcIikpXG59XG4iLCJ2YXIgdmVyc2lvbiA9IHJlcXVpcmUoXCIuL3ZlcnNpb25cIilcblxubW9kdWxlLmV4cG9ydHMgPSBpc1ZpcnR1YWxOb2RlXG5cbmZ1bmN0aW9uIGlzVmlydHVhbE5vZGUoeCkge1xuICAgIHJldHVybiB4ICYmIHgudHlwZSA9PT0gXCJWaXJ0dWFsTm9kZVwiICYmIHgudmVyc2lvbiA9PT0gdmVyc2lvblxufVxuIiwidmFyIHZlcnNpb24gPSByZXF1aXJlKFwiLi92ZXJzaW9uXCIpXG5cbm1vZHVsZS5leHBvcnRzID0gaXNWaXJ0dWFsVGV4dFxuXG5mdW5jdGlvbiBpc1ZpcnR1YWxUZXh0KHgpIHtcbiAgICByZXR1cm4geCAmJiB4LnR5cGUgPT09IFwiVmlydHVhbFRleHRcIiAmJiB4LnZlcnNpb24gPT09IHZlcnNpb25cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gaXNXaWRnZXRcblxuZnVuY3Rpb24gaXNXaWRnZXQodykge1xuICAgIHJldHVybiB3ICYmIHcudHlwZSA9PT0gXCJXaWRnZXRcIlxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjJcIlxuIiwidmFyIHZlcnNpb24gPSByZXF1aXJlKFwiLi92ZXJzaW9uXCIpXG52YXIgaXNWTm9kZSA9IHJlcXVpcmUoXCIuL2lzLXZub2RlXCIpXG52YXIgaXNXaWRnZXQgPSByZXF1aXJlKFwiLi9pcy13aWRnZXRcIilcbnZhciBpc1RodW5rID0gcmVxdWlyZShcIi4vaXMtdGh1bmtcIilcbnZhciBpc1ZIb29rID0gcmVxdWlyZShcIi4vaXMtdmhvb2tcIilcblxubW9kdWxlLmV4cG9ydHMgPSBWaXJ0dWFsTm9kZVxuXG52YXIgbm9Qcm9wZXJ0aWVzID0ge31cbnZhciBub0NoaWxkcmVuID0gW11cblxuZnVuY3Rpb24gVmlydHVhbE5vZGUodGFnTmFtZSwgcHJvcGVydGllcywgY2hpbGRyZW4sIGtleSwgbmFtZXNwYWNlKSB7XG4gICAgdGhpcy50YWdOYW1lID0gdGFnTmFtZVxuICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXMgfHwgbm9Qcm9wZXJ0aWVzXG4gICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuIHx8IG5vQ2hpbGRyZW5cbiAgICB0aGlzLmtleSA9IGtleSAhPSBudWxsID8gU3RyaW5nKGtleSkgOiB1bmRlZmluZWRcbiAgICB0aGlzLm5hbWVzcGFjZSA9ICh0eXBlb2YgbmFtZXNwYWNlID09PSBcInN0cmluZ1wiKSA/IG5hbWVzcGFjZSA6IG51bGxcblxuICAgIHZhciBjb3VudCA9IChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHx8IDBcbiAgICB2YXIgZGVzY2VuZGFudHMgPSAwXG4gICAgdmFyIGhhc1dpZGdldHMgPSBmYWxzZVxuICAgIHZhciBoYXNUaHVua3MgPSBmYWxzZVxuICAgIHZhciBkZXNjZW5kYW50SG9va3MgPSBmYWxzZVxuICAgIHZhciBob29rc1xuXG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gcHJvcGVydGllcykge1xuICAgICAgICBpZiAocHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbcHJvcE5hbWVdXG4gICAgICAgICAgICBpZiAoaXNWSG9vayhwcm9wZXJ0eSkgJiYgcHJvcGVydHkudW5ob29rKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFob29rcykge1xuICAgICAgICAgICAgICAgICAgICBob29rcyA9IHt9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaG9va3NbcHJvcE5hbWVdID0gcHJvcGVydHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXVxuICAgICAgICBpZiAoaXNWTm9kZShjaGlsZCkpIHtcbiAgICAgICAgICAgIGRlc2NlbmRhbnRzICs9IGNoaWxkLmNvdW50IHx8IDBcblxuICAgICAgICAgICAgaWYgKCFoYXNXaWRnZXRzICYmIGNoaWxkLmhhc1dpZGdldHMpIHtcbiAgICAgICAgICAgICAgICBoYXNXaWRnZXRzID0gdHJ1ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWhhc1RodW5rcyAmJiBjaGlsZC5oYXNUaHVua3MpIHtcbiAgICAgICAgICAgICAgICBoYXNUaHVua3MgPSB0cnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghZGVzY2VuZGFudEhvb2tzICYmIChjaGlsZC5ob29rcyB8fCBjaGlsZC5kZXNjZW5kYW50SG9va3MpKSB7XG4gICAgICAgICAgICAgICAgZGVzY2VuZGFudEhvb2tzID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFoYXNXaWRnZXRzICYmIGlzV2lkZ2V0KGNoaWxkKSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjaGlsZC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBoYXNXaWRnZXRzID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCFoYXNUaHVua3MgJiYgaXNUaHVuayhjaGlsZCkpIHtcbiAgICAgICAgICAgIGhhc1RodW5rcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvdW50ID0gY291bnQgKyBkZXNjZW5kYW50c1xuICAgIHRoaXMuaGFzV2lkZ2V0cyA9IGhhc1dpZGdldHNcbiAgICB0aGlzLmhhc1RodW5rcyA9IGhhc1RodW5rc1xuICAgIHRoaXMuaG9va3MgPSBob29rc1xuICAgIHRoaXMuZGVzY2VuZGFudEhvb2tzID0gZGVzY2VuZGFudEhvb2tzXG59XG5cblZpcnR1YWxOb2RlLnByb3RvdHlwZS52ZXJzaW9uID0gdmVyc2lvblxuVmlydHVhbE5vZGUucHJvdG90eXBlLnR5cGUgPSBcIlZpcnR1YWxOb2RlXCJcbiIsInZhciB2ZXJzaW9uID0gcmVxdWlyZShcIi4vdmVyc2lvblwiKVxuXG5tb2R1bGUuZXhwb3J0cyA9IFZpcnR1YWxUZXh0XG5cbmZ1bmN0aW9uIFZpcnR1YWxUZXh0KHRleHQpIHtcbiAgICB0aGlzLnRleHQgPSBTdHJpbmcodGV4dClcbn1cblxuVmlydHVhbFRleHQucHJvdG90eXBlLnZlcnNpb24gPSB2ZXJzaW9uXG5WaXJ0dWFsVGV4dC5wcm90b3R5cGUudHlwZSA9IFwiVmlydHVhbFRleHRcIlxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ3gtaXMtYXJyYXknKTtcblxudmFyIGggPSByZXF1aXJlKCcuL2luZGV4LmpzJyk7XG5cblxudmFyIFNWR0F0dHJpYnV0ZU5hbWVzcGFjZSA9IHJlcXVpcmUoJy4vc3ZnLWF0dHJpYnV0ZS1uYW1lc3BhY2UnKTtcbnZhciBhdHRyaWJ1dGVIb29rID0gcmVxdWlyZSgnLi9ob29rcy9hdHRyaWJ1dGUtaG9vaycpO1xuXG52YXIgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG5cbm1vZHVsZS5leHBvcnRzID0gc3ZnO1xuXG5mdW5jdGlvbiBzdmcodGFnTmFtZSwgcHJvcGVydGllcywgY2hpbGRyZW4pIHtcbiAgICBpZiAoIWNoaWxkcmVuICYmIGlzQ2hpbGRyZW4ocHJvcGVydGllcykpIHtcbiAgICAgICAgY2hpbGRyZW4gPSBwcm9wZXJ0aWVzO1xuICAgICAgICBwcm9wZXJ0aWVzID0ge307XG4gICAgfVxuXG4gICAgcHJvcGVydGllcyA9IHByb3BlcnRpZXMgfHwge307XG5cbiAgICAvLyBzZXQgbmFtZXNwYWNlIGZvciBzdmdcbiAgICBwcm9wZXJ0aWVzLm5hbWVzcGFjZSA9IFNWR19OQU1FU1BBQ0U7XG5cbiAgICB2YXIgYXR0cmlidXRlcyA9IHByb3BlcnRpZXMuYXR0cmlidXRlcyB8fCAocHJvcGVydGllcy5hdHRyaWJ1dGVzID0ge30pO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHByb3BlcnRpZXMpIHtcbiAgICAgICAgaWYgKCFwcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG5hbWVzcGFjZSA9IFNWR0F0dHJpYnV0ZU5hbWVzcGFjZShrZXkpO1xuXG4gICAgICAgIGlmIChuYW1lc3BhY2UgPT09IHVuZGVmaW5lZCkgeyAvLyBub3QgYSBzdmcgYXR0cmlidXRlXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB2YWx1ZSA9IHByb3BlcnRpZXNba2V5XTtcblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlICE9PSAnYm9vbGVhbidcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuYW1lc3BhY2UgIT09IG51bGwpIHsgLy8gbmFtZXNwYWNlZCBhdHRyaWJ1dGVcbiAgICAgICAgICAgIHByb3BlcnRpZXNba2V5XSA9IGF0dHJpYnV0ZUhvb2sobmFtZXNwYWNlLCB2YWx1ZSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF0dHJpYnV0ZXNba2V5XSA9IHZhbHVlXG4gICAgICAgIHByb3BlcnRpZXNba2V5XSA9IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIHJldHVybiBoKHRhZ05hbWUsIHByb3BlcnRpZXMsIGNoaWxkcmVuKTtcbn1cblxuZnVuY3Rpb24gaXNDaGlsZHJlbih4KSB7XG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSAnc3RyaW5nJyB8fCBpc0FycmF5KHgpO1xufVxuIl19 | |
| var jazzicon = require('jazzicon') | |
| var h = require('virtual-dom/virtual-hyperscript/svg') | |
| var createElement = require('virtual-dom/create-element') | |
| var body = document.querySelector('body') | |
| for(var i = 0; i < 10; i++) { | |
| var fakeAccount = '0x' | |
| for (var x = 0; x < 10; x++) { | |
| fakeAccount += Math.round(Math.random() * 10) | |
| } | |
| var el = icon(50, fakeAccount) | |
| body.appendChild(el) | |
| } | |
| function icon(iconSize, seed) { | |
| console.log(seed) | |
| var textHeight = 12 | |
| var gapSize = 5 | |
| var size = iconSize + gapSize | |
| var icon = jazzicon(size, parseInt(seed)) | |
| icon.style.position = 'inline-block' | |
| icon.setAttribute('width', iconSize) | |
| icon.setAttribute('height', iconSize) | |
| icon.style.width = `${iconSize}px` | |
| icon.style.height = `${iconSize}px` | |
| // Title container: | |
| var el = document.createElement('div') | |
| el.style.display = 'inline-flex' | |
| el.style.justifyContent = 'center' | |
| el.style.alignItems = 'center' | |
| el.style.position = 'inherit' | |
| el.style.padding = `${textHeight}px` | |
| el.appendChild(icon) | |
| let iconId = `identicon-${seed}-${size}` | |
| var label = createElement(h('svg', { | |
| height: size + textHeight * 2, | |
| width: size + textHeight * 2, | |
| version: '1.1', | |
| style: { | |
| position: 'absolute', | |
| zIndex: 3, | |
| transform: `translateX(-${size + textHeight}px) translateY(-${textHeight}px)`, | |
| } | |
| }, [ | |
| h('g', [ | |
| h('path', { | |
| id: iconId, | |
| fill: 'none', | |
| strokeWidth: '10px', | |
| stroke: 'none', | |
| strokeLocation: 'outside', | |
| style: { | |
| opacity: 1, | |
| zIndex: 2, | |
| }, | |
| d: ` | |
| M ${(size/2) + textHeight + gapSize/2} ${(size + textHeight)/2 + gapSize} | |
| m -${size/2}, 0 | |
| a ${size/2}, ${size/2} 0 1,1 ${size},0 | |
| a ${size/2}, ${size/2} 0 1,1 -${size},0 | |
| ` | |
| }), | |
| h('text', { | |
| style: { | |
| textAnchor: 'middle', | |
| fontStyle: 'normal', | |
| fontVariant: 'normal', | |
| fontWeight: 'normal', | |
| fontSize: '12px', | |
| lineHeight: 'normal', | |
| fontFamily: 'monospace', | |
| fill: 'black' | |
| } | |
| }, [ | |
| h('textPath', { | |
| 'xmlns:xlink': 'http://www.w3.org/1999/xlink', | |
| 'xlink:href': `#${iconId}`, | |
| startOffset: '0%', | |
| }, [ | |
| seed, | |
| ]) | |
| ]) | |
| ]) | |
| ])) | |
| el.appendChild(label) | |
| return el | |
| } | |
| ;}, 0) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "name": "requirebin-sketch", | |
| "version": "1.0.0", | |
| "dependencies": { | |
| "virtual-dom": "2.1.1", | |
| "jazzicon": "1.1.5" | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!-- contents of this file will be placed inside the <body> --> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!-- contents of this file will be placed inside the <head> --> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment