83 lines
No EOL
1.6 MiB
Vendored
83 lines
No EOL
1.6 MiB
Vendored
/******/ (function(modules) { // webpackBootstrap
|
|
/******/ // The module cache
|
|
/******/ var installedModules = {};
|
|
/******/
|
|
/******/ // The require function
|
|
/******/ function __webpack_require__(moduleId) {
|
|
/******/
|
|
/******/ // Check if module is in cache
|
|
/******/ if(installedModules[moduleId]) {
|
|
/******/ return installedModules[moduleId].exports;
|
|
/******/ }
|
|
/******/ // Create a new module (and put it into the cache)
|
|
/******/ var module = installedModules[moduleId] = {
|
|
/******/ i: moduleId,
|
|
/******/ l: false,
|
|
/******/ exports: {}
|
|
/******/ };
|
|
/******/
|
|
/******/ // Execute the module function
|
|
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
|
/******/
|
|
/******/ // Flag the module as loaded
|
|
/******/ module.l = true;
|
|
/******/
|
|
/******/ // Return the exports of the module
|
|
/******/ return module.exports;
|
|
/******/ }
|
|
/******/
|
|
/******/
|
|
/******/ // expose the modules object (__webpack_modules__)
|
|
/******/ __webpack_require__.m = modules;
|
|
/******/
|
|
/******/ // expose the module cache
|
|
/******/ __webpack_require__.c = installedModules;
|
|
/******/
|
|
/******/ // define getter function for harmony exports
|
|
/******/ __webpack_require__.d = function(exports, name, getter) {
|
|
/******/ if(!__webpack_require__.o(exports, name)) {
|
|
/******/ Object.defineProperty(exports, name, {
|
|
/******/ configurable: false,
|
|
/******/ enumerable: true,
|
|
/******/ get: getter
|
|
/******/ });
|
|
/******/ }
|
|
/******/ };
|
|
/******/
|
|
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
|
/******/ __webpack_require__.n = function(module) {
|
|
/******/ var getter = module && module.__esModule ?
|
|
/******/ function getDefault() { return module['default']; } :
|
|
/******/ function getModuleExports() { return module; };
|
|
/******/ __webpack_require__.d(getter, 'a', getter);
|
|
/******/ return getter;
|
|
/******/ };
|
|
/******/
|
|
/******/ // Object.prototype.hasOwnProperty.call
|
|
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
|
|
/******/
|
|
/******/ // __webpack_public_path__
|
|
/******/ __webpack_require__.p = "/";
|
|
/******/
|
|
/******/ // Load entry module and return exports
|
|
/******/ return __webpack_require__(__webpack_require__.s = 6);
|
|
/******/ })
|
|
/************************************************************************/
|
|
/******/ ({
|
|
|
|
/***/ 6:
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
module.exports = __webpack_require__(7);
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ 7:
|
|
/***/ (function(module, exports, __webpack_require__) {
|
|
|
|
eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var require;var require;var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/*!\n * Chart.js\n * http://chartjs.org/\n * Version: 2.7.3\n *\n * Copyright 2018 Chart.js Contributors\n * Released under the MIT license\n * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md\n */\n(function (f) {\n\tif (( false ? \"undefined\" : _typeof(exports)) === \"object\" && typeof module !== \"undefined\") {\n\t\tmodule.exports = f();\n\t} else if (true) {\n\t\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (f),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t} else {\n\t\tvar g;if (typeof window !== \"undefined\") {\n\t\t\tg = window;\n\t\t} else if (typeof global !== \"undefined\") {\n\t\t\tg = global;\n\t\t} else if (typeof self !== \"undefined\") {\n\t\t\tg = self;\n\t\t} else {\n\t\t\tg = this;\n\t\t}g.Chart = f();\n\t}\n})(function () {\n\tvar define, module, exports;return function () {\n\t\tfunction r(e, n, t) {\n\t\t\tfunction o(i, f) {\n\t\t\t\tif (!n[i]) {\n\t\t\t\t\tif (!e[i]) {\n\t\t\t\t\t\tvar c = \"function\" == typeof require && require;if (!f && c) return require(i, !0);if (u) return u(i, !0);var a = new Error(\"Cannot find module '\" + i + \"'\");throw a.code = \"MODULE_NOT_FOUND\", a;\n\t\t\t\t\t}var p = n[i] = { exports: {} };e[i][0].call(p.exports, function (r) {\n\t\t\t\t\t\tvar n = e[i][1][r];return o(n || r);\n\t\t\t\t\t}, p, p.exports, r, e, n, t);\n\t\t\t\t}return n[i].exports;\n\t\t\t}for (var u = \"function\" == typeof require && require, i = 0; i < t.length; i++) {\n\t\t\t\to(t[i]);\n\t\t\t}return o;\n\t\t}return r;\n\t}()({ 1: [function (require, module, exports) {}, {}], 2: [function (require, module, exports) {\n\t\t\t/* MIT license */\n\t\t\tvar colorNames = require(6);\n\n\t\t\tmodule.exports = {\n\t\t\t\tgetRgba: getRgba,\n\t\t\t\tgetHsla: getHsla,\n\t\t\t\tgetRgb: getRgb,\n\t\t\t\tgetHsl: getHsl,\n\t\t\t\tgetHwb: getHwb,\n\t\t\t\tgetAlpha: getAlpha,\n\n\t\t\t\thexString: hexString,\n\t\t\t\trgbString: rgbString,\n\t\t\t\trgbaString: rgbaString,\n\t\t\t\tpercentString: percentString,\n\t\t\t\tpercentaString: percentaString,\n\t\t\t\thslString: hslString,\n\t\t\t\thslaString: hslaString,\n\t\t\t\thwbString: hwbString,\n\t\t\t\tkeyword: keyword\n\t\t\t};\n\n\t\t\tfunction getRgba(string) {\n\t\t\t\tif (!string) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar abbr = /^#([a-fA-F0-9]{3})$/i,\n\t\t\t\t hex = /^#([a-fA-F0-9]{6})$/i,\n\t\t\t\t rgba = /^rgba?\\(\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i,\n\t\t\t\t per = /^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i,\n\t\t\t\t keyword = /(\\w+)/;\n\n\t\t\t\tvar rgb = [0, 0, 0],\n\t\t\t\t a = 1,\n\t\t\t\t match = string.match(abbr);\n\t\t\t\tif (match) {\n\t\t\t\t\tmatch = match[1];\n\t\t\t\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\t\t\t\trgb[i] = parseInt(match[i] + match[i], 16);\n\t\t\t\t\t}\n\t\t\t\t} else if (match = string.match(hex)) {\n\t\t\t\t\tmatch = match[1];\n\t\t\t\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\t\t\t\trgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16);\n\t\t\t\t\t}\n\t\t\t\t} else if (match = string.match(rgba)) {\n\t\t\t\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\t\t\t\trgb[i] = parseInt(match[i + 1]);\n\t\t\t\t\t}\n\t\t\t\t\ta = parseFloat(match[4]);\n\t\t\t\t} else if (match = string.match(per)) {\n\t\t\t\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\t\t\t\trgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);\n\t\t\t\t\t}\n\t\t\t\t\ta = parseFloat(match[4]);\n\t\t\t\t} else if (match = string.match(keyword)) {\n\t\t\t\t\tif (match[1] == \"transparent\") {\n\t\t\t\t\t\treturn [0, 0, 0, 0];\n\t\t\t\t\t}\n\t\t\t\t\trgb = colorNames[match[1]];\n\t\t\t\t\tif (!rgb) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\t\t\trgb[i] = scale(rgb[i], 0, 255);\n\t\t\t\t}\n\t\t\t\tif (!a && a != 0) {\n\t\t\t\t\ta = 1;\n\t\t\t\t} else {\n\t\t\t\t\ta = scale(a, 0, 1);\n\t\t\t\t}\n\t\t\t\trgb[3] = a;\n\t\t\t\treturn rgb;\n\t\t\t}\n\n\t\t\tfunction getHsla(string) {\n\t\t\t\tif (!string) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar hsl = /^hsla?\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n\t\t\t\tvar match = string.match(hsl);\n\t\t\t\tif (match) {\n\t\t\t\t\tvar alpha = parseFloat(match[4]);\n\t\t\t\t\tvar h = scale(parseInt(match[1]), 0, 360),\n\t\t\t\t\t s = scale(parseFloat(match[2]), 0, 100),\n\t\t\t\t\t l = scale(parseFloat(match[3]), 0, 100),\n\t\t\t\t\t a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n\t\t\t\t\treturn [h, s, l, a];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction getHwb(string) {\n\t\t\t\tif (!string) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar hwb = /^hwb\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n\t\t\t\tvar match = string.match(hwb);\n\t\t\t\tif (match) {\n\t\t\t\t\tvar alpha = parseFloat(match[4]);\n\t\t\t\t\tvar h = scale(parseInt(match[1]), 0, 360),\n\t\t\t\t\t w = scale(parseFloat(match[2]), 0, 100),\n\t\t\t\t\t b = scale(parseFloat(match[3]), 0, 100),\n\t\t\t\t\t a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n\t\t\t\t\treturn [h, w, b, a];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction getRgb(string) {\n\t\t\t\tvar rgba = getRgba(string);\n\t\t\t\treturn rgba && rgba.slice(0, 3);\n\t\t\t}\n\n\t\t\tfunction getHsl(string) {\n\t\t\t\tvar hsla = getHsla(string);\n\t\t\t\treturn hsla && hsla.slice(0, 3);\n\t\t\t}\n\n\t\t\tfunction getAlpha(string) {\n\t\t\t\tvar vals = getRgba(string);\n\t\t\t\tif (vals) {\n\t\t\t\t\treturn vals[3];\n\t\t\t\t} else if (vals = getHsla(string)) {\n\t\t\t\t\treturn vals[3];\n\t\t\t\t} else if (vals = getHwb(string)) {\n\t\t\t\t\treturn vals[3];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// generators\n\t\t\tfunction hexString(rgb) {\n\t\t\t\treturn \"#\" + hexDouble(rgb[0]) + hexDouble(rgb[1]) + hexDouble(rgb[2]);\n\t\t\t}\n\n\t\t\tfunction rgbString(rgba, alpha) {\n\t\t\t\tif (alpha < 1 || rgba[3] && rgba[3] < 1) {\n\t\t\t\t\treturn rgbaString(rgba, alpha);\n\t\t\t\t}\n\t\t\t\treturn \"rgb(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2] + \")\";\n\t\t\t}\n\n\t\t\tfunction rgbaString(rgba, alpha) {\n\t\t\t\tif (alpha === undefined) {\n\t\t\t\t\talpha = rgba[3] !== undefined ? rgba[3] : 1;\n\t\t\t\t}\n\t\t\t\treturn \"rgba(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2] + \", \" + alpha + \")\";\n\t\t\t}\n\n\t\t\tfunction percentString(rgba, alpha) {\n\t\t\t\tif (alpha < 1 || rgba[3] && rgba[3] < 1) {\n\t\t\t\t\treturn percentaString(rgba, alpha);\n\t\t\t\t}\n\t\t\t\tvar r = Math.round(rgba[0] / 255 * 100),\n\t\t\t\t g = Math.round(rgba[1] / 255 * 100),\n\t\t\t\t b = Math.round(rgba[2] / 255 * 100);\n\n\t\t\t\treturn \"rgb(\" + r + \"%, \" + g + \"%, \" + b + \"%)\";\n\t\t\t}\n\n\t\t\tfunction percentaString(rgba, alpha) {\n\t\t\t\tvar r = Math.round(rgba[0] / 255 * 100),\n\t\t\t\t g = Math.round(rgba[1] / 255 * 100),\n\t\t\t\t b = Math.round(rgba[2] / 255 * 100);\n\t\t\t\treturn \"rgba(\" + r + \"%, \" + g + \"%, \" + b + \"%, \" + (alpha || rgba[3] || 1) + \")\";\n\t\t\t}\n\n\t\t\tfunction hslString(hsla, alpha) {\n\t\t\t\tif (alpha < 1 || hsla[3] && hsla[3] < 1) {\n\t\t\t\t\treturn hslaString(hsla, alpha);\n\t\t\t\t}\n\t\t\t\treturn \"hsl(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%)\";\n\t\t\t}\n\n\t\t\tfunction hslaString(hsla, alpha) {\n\t\t\t\tif (alpha === undefined) {\n\t\t\t\t\talpha = hsla[3] !== undefined ? hsla[3] : 1;\n\t\t\t\t}\n\t\t\t\treturn \"hsla(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%, \" + alpha + \")\";\n\t\t\t}\n\n\t\t\t// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax\n\t\t\t// (hwb have alpha optional & 1 is default value)\n\t\t\tfunction hwbString(hwb, alpha) {\n\t\t\t\tif (alpha === undefined) {\n\t\t\t\t\talpha = hwb[3] !== undefined ? hwb[3] : 1;\n\t\t\t\t}\n\t\t\t\treturn \"hwb(\" + hwb[0] + \", \" + hwb[1] + \"%, \" + hwb[2] + \"%\" + (alpha !== undefined && alpha !== 1 ? \", \" + alpha : \"\") + \")\";\n\t\t\t}\n\n\t\t\tfunction keyword(rgb) {\n\t\t\t\treturn reverseNames[rgb.slice(0, 3)];\n\t\t\t}\n\n\t\t\t// helpers\n\t\t\tfunction scale(num, min, max) {\n\t\t\t\treturn Math.min(Math.max(min, num), max);\n\t\t\t}\n\n\t\t\tfunction hexDouble(num) {\n\t\t\t\tvar str = num.toString(16).toUpperCase();\n\t\t\t\treturn str.length < 2 ? \"0\" + str : str;\n\t\t\t}\n\n\t\t\t//create a list of reverse color names\n\t\t\tvar reverseNames = {};\n\t\t\tfor (var name in colorNames) {\n\t\t\t\treverseNames[colorNames[name]] = name;\n\t\t\t}\n\t\t}, { \"6\": 6 }], 3: [function (require, module, exports) {\n\t\t\t/* MIT license */\n\t\t\tvar convert = require(5);\n\t\t\tvar string = require(2);\n\n\t\t\tvar Color = function Color(obj) {\n\t\t\t\tif (obj instanceof Color) {\n\t\t\t\t\treturn obj;\n\t\t\t\t}\n\t\t\t\tif (!(this instanceof Color)) {\n\t\t\t\t\treturn new Color(obj);\n\t\t\t\t}\n\n\t\t\t\tthis.valid = false;\n\t\t\t\tthis.values = {\n\t\t\t\t\trgb: [0, 0, 0],\n\t\t\t\t\thsl: [0, 0, 0],\n\t\t\t\t\thsv: [0, 0, 0],\n\t\t\t\t\thwb: [0, 0, 0],\n\t\t\t\t\tcmyk: [0, 0, 0, 0],\n\t\t\t\t\talpha: 1\n\t\t\t\t};\n\n\t\t\t\t// parse Color() argument\n\t\t\t\tvar vals;\n\t\t\t\tif (typeof obj === 'string') {\n\t\t\t\t\tvals = string.getRgba(obj);\n\t\t\t\t\tif (vals) {\n\t\t\t\t\t\tthis.setValues('rgb', vals);\n\t\t\t\t\t} else if (vals = string.getHsla(obj)) {\n\t\t\t\t\t\tthis.setValues('hsl', vals);\n\t\t\t\t\t} else if (vals = string.getHwb(obj)) {\n\t\t\t\t\t\tthis.setValues('hwb', vals);\n\t\t\t\t\t}\n\t\t\t\t} else if ((typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj)) === 'object') {\n\t\t\t\t\tvals = obj;\n\t\t\t\t\tif (vals.r !== undefined || vals.red !== undefined) {\n\t\t\t\t\t\tthis.setValues('rgb', vals);\n\t\t\t\t\t} else if (vals.l !== undefined || vals.lightness !== undefined) {\n\t\t\t\t\t\tthis.setValues('hsl', vals);\n\t\t\t\t\t} else if (vals.v !== undefined || vals.value !== undefined) {\n\t\t\t\t\t\tthis.setValues('hsv', vals);\n\t\t\t\t\t} else if (vals.w !== undefined || vals.whiteness !== undefined) {\n\t\t\t\t\t\tthis.setValues('hwb', vals);\n\t\t\t\t\t} else if (vals.c !== undefined || vals.cyan !== undefined) {\n\t\t\t\t\t\tthis.setValues('cmyk', vals);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tColor.prototype = {\n\t\t\t\tisValid: function isValid() {\n\t\t\t\t\treturn this.valid;\n\t\t\t\t},\n\t\t\t\trgb: function rgb() {\n\t\t\t\t\treturn this.setSpace('rgb', arguments);\n\t\t\t\t},\n\t\t\t\thsl: function hsl() {\n\t\t\t\t\treturn this.setSpace('hsl', arguments);\n\t\t\t\t},\n\t\t\t\thsv: function hsv() {\n\t\t\t\t\treturn this.setSpace('hsv', arguments);\n\t\t\t\t},\n\t\t\t\thwb: function hwb() {\n\t\t\t\t\treturn this.setSpace('hwb', arguments);\n\t\t\t\t},\n\t\t\t\tcmyk: function cmyk() {\n\t\t\t\t\treturn this.setSpace('cmyk', arguments);\n\t\t\t\t},\n\n\t\t\t\trgbArray: function rgbArray() {\n\t\t\t\t\treturn this.values.rgb;\n\t\t\t\t},\n\t\t\t\thslArray: function hslArray() {\n\t\t\t\t\treturn this.values.hsl;\n\t\t\t\t},\n\t\t\t\thsvArray: function hsvArray() {\n\t\t\t\t\treturn this.values.hsv;\n\t\t\t\t},\n\t\t\t\thwbArray: function hwbArray() {\n\t\t\t\t\tvar values = this.values;\n\t\t\t\t\tif (values.alpha !== 1) {\n\t\t\t\t\t\treturn values.hwb.concat([values.alpha]);\n\t\t\t\t\t}\n\t\t\t\t\treturn values.hwb;\n\t\t\t\t},\n\t\t\t\tcmykArray: function cmykArray() {\n\t\t\t\t\treturn this.values.cmyk;\n\t\t\t\t},\n\t\t\t\trgbaArray: function rgbaArray() {\n\t\t\t\t\tvar values = this.values;\n\t\t\t\t\treturn values.rgb.concat([values.alpha]);\n\t\t\t\t},\n\t\t\t\thslaArray: function hslaArray() {\n\t\t\t\t\tvar values = this.values;\n\t\t\t\t\treturn values.hsl.concat([values.alpha]);\n\t\t\t\t},\n\t\t\t\talpha: function alpha(val) {\n\t\t\t\t\tif (val === undefined) {\n\t\t\t\t\t\treturn this.values.alpha;\n\t\t\t\t\t}\n\t\t\t\t\tthis.setValues('alpha', val);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\tred: function red(val) {\n\t\t\t\t\treturn this.setChannel('rgb', 0, val);\n\t\t\t\t},\n\t\t\t\tgreen: function green(val) {\n\t\t\t\t\treturn this.setChannel('rgb', 1, val);\n\t\t\t\t},\n\t\t\t\tblue: function blue(val) {\n\t\t\t\t\treturn this.setChannel('rgb', 2, val);\n\t\t\t\t},\n\t\t\t\thue: function hue(val) {\n\t\t\t\t\tif (val) {\n\t\t\t\t\t\tval %= 360;\n\t\t\t\t\t\tval = val < 0 ? 360 + val : val;\n\t\t\t\t\t}\n\t\t\t\t\treturn this.setChannel('hsl', 0, val);\n\t\t\t\t},\n\t\t\t\tsaturation: function saturation(val) {\n\t\t\t\t\treturn this.setChannel('hsl', 1, val);\n\t\t\t\t},\n\t\t\t\tlightness: function lightness(val) {\n\t\t\t\t\treturn this.setChannel('hsl', 2, val);\n\t\t\t\t},\n\t\t\t\tsaturationv: function saturationv(val) {\n\t\t\t\t\treturn this.setChannel('hsv', 1, val);\n\t\t\t\t},\n\t\t\t\twhiteness: function whiteness(val) {\n\t\t\t\t\treturn this.setChannel('hwb', 1, val);\n\t\t\t\t},\n\t\t\t\tblackness: function blackness(val) {\n\t\t\t\t\treturn this.setChannel('hwb', 2, val);\n\t\t\t\t},\n\t\t\t\tvalue: function value(val) {\n\t\t\t\t\treturn this.setChannel('hsv', 2, val);\n\t\t\t\t},\n\t\t\t\tcyan: function cyan(val) {\n\t\t\t\t\treturn this.setChannel('cmyk', 0, val);\n\t\t\t\t},\n\t\t\t\tmagenta: function magenta(val) {\n\t\t\t\t\treturn this.setChannel('cmyk', 1, val);\n\t\t\t\t},\n\t\t\t\tyellow: function yellow(val) {\n\t\t\t\t\treturn this.setChannel('cmyk', 2, val);\n\t\t\t\t},\n\t\t\t\tblack: function black(val) {\n\t\t\t\t\treturn this.setChannel('cmyk', 3, val);\n\t\t\t\t},\n\n\t\t\t\thexString: function hexString() {\n\t\t\t\t\treturn string.hexString(this.values.rgb);\n\t\t\t\t},\n\t\t\t\trgbString: function rgbString() {\n\t\t\t\t\treturn string.rgbString(this.values.rgb, this.values.alpha);\n\t\t\t\t},\n\t\t\t\trgbaString: function rgbaString() {\n\t\t\t\t\treturn string.rgbaString(this.values.rgb, this.values.alpha);\n\t\t\t\t},\n\t\t\t\tpercentString: function percentString() {\n\t\t\t\t\treturn string.percentString(this.values.rgb, this.values.alpha);\n\t\t\t\t},\n\t\t\t\thslString: function hslString() {\n\t\t\t\t\treturn string.hslString(this.values.hsl, this.values.alpha);\n\t\t\t\t},\n\t\t\t\thslaString: function hslaString() {\n\t\t\t\t\treturn string.hslaString(this.values.hsl, this.values.alpha);\n\t\t\t\t},\n\t\t\t\thwbString: function hwbString() {\n\t\t\t\t\treturn string.hwbString(this.values.hwb, this.values.alpha);\n\t\t\t\t},\n\t\t\t\tkeyword: function keyword() {\n\t\t\t\t\treturn string.keyword(this.values.rgb, this.values.alpha);\n\t\t\t\t},\n\n\t\t\t\trgbNumber: function rgbNumber() {\n\t\t\t\t\tvar rgb = this.values.rgb;\n\t\t\t\t\treturn rgb[0] << 16 | rgb[1] << 8 | rgb[2];\n\t\t\t\t},\n\n\t\t\t\tluminosity: function luminosity() {\n\t\t\t\t\t// http://www.w3.org/TR/WCAG20/#relativeluminancedef\n\t\t\t\t\tvar rgb = this.values.rgb;\n\t\t\t\t\tvar lum = [];\n\t\t\t\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\t\t\t\tvar chan = rgb[i] / 255;\n\t\t\t\t\t\tlum[i] = chan <= 0.03928 ? chan / 12.92 : Math.pow((chan + 0.055) / 1.055, 2.4);\n\t\t\t\t\t}\n\t\t\t\t\treturn 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];\n\t\t\t\t},\n\n\t\t\t\tcontrast: function contrast(color2) {\n\t\t\t\t\t// http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n\t\t\t\t\tvar lum1 = this.luminosity();\n\t\t\t\t\tvar lum2 = color2.luminosity();\n\t\t\t\t\tif (lum1 > lum2) {\n\t\t\t\t\t\treturn (lum1 + 0.05) / (lum2 + 0.05);\n\t\t\t\t\t}\n\t\t\t\t\treturn (lum2 + 0.05) / (lum1 + 0.05);\n\t\t\t\t},\n\n\t\t\t\tlevel: function level(color2) {\n\t\t\t\t\tvar contrastRatio = this.contrast(color2);\n\t\t\t\t\tif (contrastRatio >= 7.1) {\n\t\t\t\t\t\treturn 'AAA';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn contrastRatio >= 4.5 ? 'AA' : '';\n\t\t\t\t},\n\n\t\t\t\tdark: function dark() {\n\t\t\t\t\t// YIQ equation from http://24ways.org/2010/calculating-color-contrast\n\t\t\t\t\tvar rgb = this.values.rgb;\n\t\t\t\t\tvar yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n\t\t\t\t\treturn yiq < 128;\n\t\t\t\t},\n\n\t\t\t\tlight: function light() {\n\t\t\t\t\treturn !this.dark();\n\t\t\t\t},\n\n\t\t\t\tnegate: function negate() {\n\t\t\t\t\tvar rgb = [];\n\t\t\t\t\tfor (var i = 0; i < 3; i++) {\n\t\t\t\t\t\trgb[i] = 255 - this.values.rgb[i];\n\t\t\t\t\t}\n\t\t\t\t\tthis.setValues('rgb', rgb);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\tlighten: function lighten(ratio) {\n\t\t\t\t\tvar hsl = this.values.hsl;\n\t\t\t\t\thsl[2] += hsl[2] * ratio;\n\t\t\t\t\tthis.setValues('hsl', hsl);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\tdarken: function darken(ratio) {\n\t\t\t\t\tvar hsl = this.values.hsl;\n\t\t\t\t\thsl[2] -= hsl[2] * ratio;\n\t\t\t\t\tthis.setValues('hsl', hsl);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\tsaturate: function saturate(ratio) {\n\t\t\t\t\tvar hsl = this.values.hsl;\n\t\t\t\t\thsl[1] += hsl[1] * ratio;\n\t\t\t\t\tthis.setValues('hsl', hsl);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\tdesaturate: function desaturate(ratio) {\n\t\t\t\t\tvar hsl = this.values.hsl;\n\t\t\t\t\thsl[1] -= hsl[1] * ratio;\n\t\t\t\t\tthis.setValues('hsl', hsl);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\twhiten: function whiten(ratio) {\n\t\t\t\t\tvar hwb = this.values.hwb;\n\t\t\t\t\thwb[1] += hwb[1] * ratio;\n\t\t\t\t\tthis.setValues('hwb', hwb);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\tblacken: function blacken(ratio) {\n\t\t\t\t\tvar hwb = this.values.hwb;\n\t\t\t\t\thwb[2] += hwb[2] * ratio;\n\t\t\t\t\tthis.setValues('hwb', hwb);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\tgreyscale: function greyscale() {\n\t\t\t\t\tvar rgb = this.values.rgb;\n\t\t\t\t\t// http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n\t\t\t\t\tvar val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n\t\t\t\t\tthis.setValues('rgb', [val, val, val]);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\tclearer: function clearer(ratio) {\n\t\t\t\t\tvar alpha = this.values.alpha;\n\t\t\t\t\tthis.setValues('alpha', alpha - alpha * ratio);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\topaquer: function opaquer(ratio) {\n\t\t\t\t\tvar alpha = this.values.alpha;\n\t\t\t\t\tthis.setValues('alpha', alpha + alpha * ratio);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\trotate: function rotate(degrees) {\n\t\t\t\t\tvar hsl = this.values.hsl;\n\t\t\t\t\tvar hue = (hsl[0] + degrees) % 360;\n\t\t\t\t\thsl[0] = hue < 0 ? 360 + hue : hue;\n\t\t\t\t\tthis.setValues('hsl', hsl);\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Ported from sass implementation in C\n * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n */\n\t\t\t\tmix: function mix(mixinColor, weight) {\n\t\t\t\t\tvar color1 = this;\n\t\t\t\t\tvar color2 = mixinColor;\n\t\t\t\t\tvar p = weight === undefined ? 0.5 : weight;\n\n\t\t\t\t\tvar w = 2 * p - 1;\n\t\t\t\t\tvar a = color1.alpha() - color2.alpha();\n\n\t\t\t\t\tvar w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n\t\t\t\t\tvar w2 = 1 - w1;\n\n\t\t\t\t\treturn 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));\n\t\t\t\t},\n\n\t\t\t\ttoJSON: function toJSON() {\n\t\t\t\t\treturn this.rgb();\n\t\t\t\t},\n\n\t\t\t\tclone: function clone() {\n\t\t\t\t\t// NOTE(SB): using node-clone creates a dependency to Buffer when using browserify,\n\t\t\t\t\t// making the final build way to big to embed in Chart.js. So let's do it manually,\n\t\t\t\t\t// assuming that values to clone are 1 dimension arrays containing only numbers,\n\t\t\t\t\t// except 'alpha' which is a number.\n\t\t\t\t\tvar result = new Color();\n\t\t\t\t\tvar source = this.values;\n\t\t\t\t\tvar target = result.values;\n\t\t\t\t\tvar value, type;\n\n\t\t\t\t\tfor (var prop in source) {\n\t\t\t\t\t\tif (source.hasOwnProperty(prop)) {\n\t\t\t\t\t\t\tvalue = source[prop];\n\t\t\t\t\t\t\ttype = {}.toString.call(value);\n\t\t\t\t\t\t\tif (type === '[object Array]') {\n\t\t\t\t\t\t\t\ttarget[prop] = value.slice(0);\n\t\t\t\t\t\t\t} else if (type === '[object Number]') {\n\t\t\t\t\t\t\t\ttarget[prop] = value;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconsole.error('unexpected color value:', value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tColor.prototype.spaces = {\n\t\t\t\trgb: ['red', 'green', 'blue'],\n\t\t\t\thsl: ['hue', 'saturation', 'lightness'],\n\t\t\t\thsv: ['hue', 'saturation', 'value'],\n\t\t\t\thwb: ['hue', 'whiteness', 'blackness'],\n\t\t\t\tcmyk: ['cyan', 'magenta', 'yellow', 'black']\n\t\t\t};\n\n\t\t\tColor.prototype.maxes = {\n\t\t\t\trgb: [255, 255, 255],\n\t\t\t\thsl: [360, 100, 100],\n\t\t\t\thsv: [360, 100, 100],\n\t\t\t\thwb: [360, 100, 100],\n\t\t\t\tcmyk: [100, 100, 100, 100]\n\t\t\t};\n\n\t\t\tColor.prototype.getValues = function (space) {\n\t\t\t\tvar values = this.values;\n\t\t\t\tvar vals = {};\n\n\t\t\t\tfor (var i = 0; i < space.length; i++) {\n\t\t\t\t\tvals[space.charAt(i)] = values[space][i];\n\t\t\t\t}\n\n\t\t\t\tif (values.alpha !== 1) {\n\t\t\t\t\tvals.a = values.alpha;\n\t\t\t\t}\n\n\t\t\t\t// {r: 255, g: 255, b: 255, a: 0.4}\n\t\t\t\treturn vals;\n\t\t\t};\n\n\t\t\tColor.prototype.setValues = function (space, vals) {\n\t\t\t\tvar values = this.values;\n\t\t\t\tvar spaces = this.spaces;\n\t\t\t\tvar maxes = this.maxes;\n\t\t\t\tvar alpha = 1;\n\t\t\t\tvar i;\n\n\t\t\t\tthis.valid = true;\n\n\t\t\t\tif (space === 'alpha') {\n\t\t\t\t\talpha = vals;\n\t\t\t\t} else if (vals.length) {\n\t\t\t\t\t// [10, 10, 10]\n\t\t\t\t\tvalues[space] = vals.slice(0, space.length);\n\t\t\t\t\talpha = vals[space.length];\n\t\t\t\t} else if (vals[space.charAt(0)] !== undefined) {\n\t\t\t\t\t// {r: 10, g: 10, b: 10}\n\t\t\t\t\tfor (i = 0; i < space.length; i++) {\n\t\t\t\t\t\tvalues[space][i] = vals[space.charAt(i)];\n\t\t\t\t\t}\n\n\t\t\t\t\talpha = vals.a;\n\t\t\t\t} else if (vals[spaces[space][0]] !== undefined) {\n\t\t\t\t\t// {red: 10, green: 10, blue: 10}\n\t\t\t\t\tvar chans = spaces[space];\n\n\t\t\t\t\tfor (i = 0; i < space.length; i++) {\n\t\t\t\t\t\tvalues[space][i] = vals[chans[i]];\n\t\t\t\t\t}\n\n\t\t\t\t\talpha = vals.alpha;\n\t\t\t\t}\n\n\t\t\t\tvalues.alpha = Math.max(0, Math.min(1, alpha === undefined ? values.alpha : alpha));\n\n\t\t\t\tif (space === 'alpha') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tvar capped;\n\n\t\t\t\t// cap values of the space prior converting all values\n\t\t\t\tfor (i = 0; i < space.length; i++) {\n\t\t\t\t\tcapped = Math.max(0, Math.min(maxes[space][i], values[space][i]));\n\t\t\t\t\tvalues[space][i] = Math.round(capped);\n\t\t\t\t}\n\n\t\t\t\t// convert to all the other color spaces\n\t\t\t\tfor (var sname in spaces) {\n\t\t\t\t\tif (sname !== space) {\n\t\t\t\t\t\tvalues[sname] = convert[space][sname](values[space]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t};\n\n\t\t\tColor.prototype.setSpace = function (space, args) {\n\t\t\t\tvar vals = args[0];\n\n\t\t\t\tif (vals === undefined) {\n\t\t\t\t\t// color.rgb()\n\t\t\t\t\treturn this.getValues(space);\n\t\t\t\t}\n\n\t\t\t\t// color.rgb(10, 10, 10)\n\t\t\t\tif (typeof vals === 'number') {\n\t\t\t\t\tvals = Array.prototype.slice.call(args);\n\t\t\t\t}\n\n\t\t\t\tthis.setValues(space, vals);\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\tColor.prototype.setChannel = function (space, index, val) {\n\t\t\t\tvar svalues = this.values[space];\n\t\t\t\tif (val === undefined) {\n\t\t\t\t\t// color.red()\n\t\t\t\t\treturn svalues[index];\n\t\t\t\t} else if (val === svalues[index]) {\n\t\t\t\t\t// color.red(color.red())\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t\t// color.red(100)\n\t\t\t\tsvalues[index] = val;\n\t\t\t\tthis.setValues(space, svalues);\n\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\tif (typeof window !== 'undefined') {\n\t\t\t\twindow.Color = Color;\n\t\t\t}\n\n\t\t\tmodule.exports = Color;\n\t\t}, { \"2\": 2, \"5\": 5 }], 4: [function (require, module, exports) {\n\t\t\t/* MIT license */\n\n\t\t\tmodule.exports = {\n\t\t\t\trgb2hsl: rgb2hsl,\n\t\t\t\trgb2hsv: rgb2hsv,\n\t\t\t\trgb2hwb: rgb2hwb,\n\t\t\t\trgb2cmyk: rgb2cmyk,\n\t\t\t\trgb2keyword: rgb2keyword,\n\t\t\t\trgb2xyz: rgb2xyz,\n\t\t\t\trgb2lab: rgb2lab,\n\t\t\t\trgb2lch: rgb2lch,\n\n\t\t\t\thsl2rgb: hsl2rgb,\n\t\t\t\thsl2hsv: hsl2hsv,\n\t\t\t\thsl2hwb: hsl2hwb,\n\t\t\t\thsl2cmyk: hsl2cmyk,\n\t\t\t\thsl2keyword: hsl2keyword,\n\n\t\t\t\thsv2rgb: hsv2rgb,\n\t\t\t\thsv2hsl: hsv2hsl,\n\t\t\t\thsv2hwb: hsv2hwb,\n\t\t\t\thsv2cmyk: hsv2cmyk,\n\t\t\t\thsv2keyword: hsv2keyword,\n\n\t\t\t\thwb2rgb: hwb2rgb,\n\t\t\t\thwb2hsl: hwb2hsl,\n\t\t\t\thwb2hsv: hwb2hsv,\n\t\t\t\thwb2cmyk: hwb2cmyk,\n\t\t\t\thwb2keyword: hwb2keyword,\n\n\t\t\t\tcmyk2rgb: cmyk2rgb,\n\t\t\t\tcmyk2hsl: cmyk2hsl,\n\t\t\t\tcmyk2hsv: cmyk2hsv,\n\t\t\t\tcmyk2hwb: cmyk2hwb,\n\t\t\t\tcmyk2keyword: cmyk2keyword,\n\n\t\t\t\tkeyword2rgb: keyword2rgb,\n\t\t\t\tkeyword2hsl: keyword2hsl,\n\t\t\t\tkeyword2hsv: keyword2hsv,\n\t\t\t\tkeyword2hwb: keyword2hwb,\n\t\t\t\tkeyword2cmyk: keyword2cmyk,\n\t\t\t\tkeyword2lab: keyword2lab,\n\t\t\t\tkeyword2xyz: keyword2xyz,\n\n\t\t\t\txyz2rgb: xyz2rgb,\n\t\t\t\txyz2lab: xyz2lab,\n\t\t\t\txyz2lch: xyz2lch,\n\n\t\t\t\tlab2xyz: lab2xyz,\n\t\t\t\tlab2rgb: lab2rgb,\n\t\t\t\tlab2lch: lab2lch,\n\n\t\t\t\tlch2lab: lch2lab,\n\t\t\t\tlch2xyz: lch2xyz,\n\t\t\t\tlch2rgb: lch2rgb\n\t\t\t};\n\n\t\t\tfunction rgb2hsl(rgb) {\n\t\t\t\tvar r = rgb[0] / 255,\n\t\t\t\t g = rgb[1] / 255,\n\t\t\t\t b = rgb[2] / 255,\n\t\t\t\t min = Math.min(r, g, b),\n\t\t\t\t max = Math.max(r, g, b),\n\t\t\t\t delta = max - min,\n\t\t\t\t h,\n\t\t\t\t s,\n\t\t\t\t l;\n\n\t\t\t\tif (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;\n\n\t\t\t\th = Math.min(h * 60, 360);\n\n\t\t\t\tif (h < 0) h += 360;\n\n\t\t\t\tl = (min + max) / 2;\n\n\t\t\t\tif (max == min) s = 0;else if (l <= 0.5) s = delta / (max + min);else s = delta / (2 - max - min);\n\n\t\t\t\treturn [h, s * 100, l * 100];\n\t\t\t}\n\n\t\t\tfunction rgb2hsv(rgb) {\n\t\t\t\tvar r = rgb[0],\n\t\t\t\t g = rgb[1],\n\t\t\t\t b = rgb[2],\n\t\t\t\t min = Math.min(r, g, b),\n\t\t\t\t max = Math.max(r, g, b),\n\t\t\t\t delta = max - min,\n\t\t\t\t h,\n\t\t\t\t s,\n\t\t\t\t v;\n\n\t\t\t\tif (max == 0) s = 0;else s = delta / max * 1000 / 10;\n\n\t\t\t\tif (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;\n\n\t\t\t\th = Math.min(h * 60, 360);\n\n\t\t\t\tif (h < 0) h += 360;\n\n\t\t\t\tv = max / 255 * 1000 / 10;\n\n\t\t\t\treturn [h, s, v];\n\t\t\t}\n\n\t\t\tfunction rgb2hwb(rgb) {\n\t\t\t\tvar r = rgb[0],\n\t\t\t\t g = rgb[1],\n\t\t\t\t b = rgb[2],\n\t\t\t\t h = rgb2hsl(rgb)[0],\n\t\t\t\t w = 1 / 255 * Math.min(r, Math.min(g, b)),\n\t\t\t\t b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\t\t\t\treturn [h, w * 100, b * 100];\n\t\t\t}\n\n\t\t\tfunction rgb2cmyk(rgb) {\n\t\t\t\tvar r = rgb[0] / 255,\n\t\t\t\t g = rgb[1] / 255,\n\t\t\t\t b = rgb[2] / 255,\n\t\t\t\t c,\n\t\t\t\t m,\n\t\t\t\t y,\n\t\t\t\t k;\n\n\t\t\t\tk = Math.min(1 - r, 1 - g, 1 - b);\n\t\t\t\tc = (1 - r - k) / (1 - k) || 0;\n\t\t\t\tm = (1 - g - k) / (1 - k) || 0;\n\t\t\t\ty = (1 - b - k) / (1 - k) || 0;\n\t\t\t\treturn [c * 100, m * 100, y * 100, k * 100];\n\t\t\t}\n\n\t\t\tfunction rgb2keyword(rgb) {\n\t\t\t\treturn reverseKeywords[JSON.stringify(rgb)];\n\t\t\t}\n\n\t\t\tfunction rgb2xyz(rgb) {\n\t\t\t\tvar r = rgb[0] / 255,\n\t\t\t\t g = rgb[1] / 255,\n\t\t\t\t b = rgb[2] / 255;\n\n\t\t\t\t// assume sRGB\n\t\t\t\tr = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;\n\t\t\t\tg = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;\n\t\t\t\tb = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;\n\n\t\t\t\tvar x = r * 0.4124 + g * 0.3576 + b * 0.1805;\n\t\t\t\tvar y = r * 0.2126 + g * 0.7152 + b * 0.0722;\n\t\t\t\tvar z = r * 0.0193 + g * 0.1192 + b * 0.9505;\n\n\t\t\t\treturn [x * 100, y * 100, z * 100];\n\t\t\t}\n\n\t\t\tfunction rgb2lab(rgb) {\n\t\t\t\tvar xyz = rgb2xyz(rgb),\n\t\t\t\t x = xyz[0],\n\t\t\t\t y = xyz[1],\n\t\t\t\t z = xyz[2],\n\t\t\t\t l,\n\t\t\t\t a,\n\t\t\t\t b;\n\n\t\t\t\tx /= 95.047;\n\t\t\t\ty /= 100;\n\t\t\t\tz /= 108.883;\n\n\t\t\t\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116;\n\t\t\t\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116;\n\t\t\t\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116;\n\n\t\t\t\tl = 116 * y - 16;\n\t\t\t\ta = 500 * (x - y);\n\t\t\t\tb = 200 * (y - z);\n\n\t\t\t\treturn [l, a, b];\n\t\t\t}\n\n\t\t\tfunction rgb2lch(args) {\n\t\t\t\treturn lab2lch(rgb2lab(args));\n\t\t\t}\n\n\t\t\tfunction hsl2rgb(hsl) {\n\t\t\t\tvar h = hsl[0] / 360,\n\t\t\t\t s = hsl[1] / 100,\n\t\t\t\t l = hsl[2] / 100,\n\t\t\t\t t1,\n\t\t\t\t t2,\n\t\t\t\t t3,\n\t\t\t\t rgb,\n\t\t\t\t val;\n\n\t\t\t\tif (s == 0) {\n\t\t\t\t\tval = l * 255;\n\t\t\t\t\treturn [val, val, val];\n\t\t\t\t}\n\n\t\t\t\tif (l < 0.5) t2 = l * (1 + s);else t2 = l + s - l * s;\n\t\t\t\tt1 = 2 * l - t2;\n\n\t\t\t\trgb = [0, 0, 0];\n\t\t\t\tfor (var i = 0; i < 3; i++) {\n\t\t\t\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\t\t\t\tt3 < 0 && t3++;\n\t\t\t\t\tt3 > 1 && t3--;\n\n\t\t\t\t\tif (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;\n\n\t\t\t\t\trgb[i] = val * 255;\n\t\t\t\t}\n\n\t\t\t\treturn rgb;\n\t\t\t}\n\n\t\t\tfunction hsl2hsv(hsl) {\n\t\t\t\tvar h = hsl[0],\n\t\t\t\t s = hsl[1] / 100,\n\t\t\t\t l = hsl[2] / 100,\n\t\t\t\t sv,\n\t\t\t\t v;\n\n\t\t\t\tif (l === 0) {\n\t\t\t\t\t// no need to do calc on black\n\t\t\t\t\t// also avoids divide by 0 error\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tl *= 2;\n\t\t\t\ts *= l <= 1 ? l : 2 - l;\n\t\t\t\tv = (l + s) / 2;\n\t\t\t\tsv = 2 * s / (l + s);\n\t\t\t\treturn [h, sv * 100, v * 100];\n\t\t\t}\n\n\t\t\tfunction hsl2hwb(args) {\n\t\t\t\treturn rgb2hwb(hsl2rgb(args));\n\t\t\t}\n\n\t\t\tfunction hsl2cmyk(args) {\n\t\t\t\treturn rgb2cmyk(hsl2rgb(args));\n\t\t\t}\n\n\t\t\tfunction hsl2keyword(args) {\n\t\t\t\treturn rgb2keyword(hsl2rgb(args));\n\t\t\t}\n\n\t\t\tfunction hsv2rgb(hsv) {\n\t\t\t\tvar h = hsv[0] / 60,\n\t\t\t\t s = hsv[1] / 100,\n\t\t\t\t v = hsv[2] / 100,\n\t\t\t\t hi = Math.floor(h) % 6;\n\n\t\t\t\tvar f = h - Math.floor(h),\n\t\t\t\t p = 255 * v * (1 - s),\n\t\t\t\t q = 255 * v * (1 - s * f),\n\t\t\t\t t = 255 * v * (1 - s * (1 - f)),\n\t\t\t\t v = 255 * v;\n\n\t\t\t\tswitch (hi) {\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\treturn [v, t, p];\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\treturn [q, v, p];\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\treturn [p, v, t];\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\treturn [p, q, v];\n\t\t\t\t\tcase 4:\n\t\t\t\t\t\treturn [t, p, v];\n\t\t\t\t\tcase 5:\n\t\t\t\t\t\treturn [v, p, q];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction hsv2hsl(hsv) {\n\t\t\t\tvar h = hsv[0],\n\t\t\t\t s = hsv[1] / 100,\n\t\t\t\t v = hsv[2] / 100,\n\t\t\t\t sl,\n\t\t\t\t l;\n\n\t\t\t\tl = (2 - s) * v;\n\t\t\t\tsl = s * v;\n\t\t\t\tsl /= l <= 1 ? l : 2 - l;\n\t\t\t\tsl = sl || 0;\n\t\t\t\tl /= 2;\n\t\t\t\treturn [h, sl * 100, l * 100];\n\t\t\t}\n\n\t\t\tfunction hsv2hwb(args) {\n\t\t\t\treturn rgb2hwb(hsv2rgb(args));\n\t\t\t}\n\n\t\t\tfunction hsv2cmyk(args) {\n\t\t\t\treturn rgb2cmyk(hsv2rgb(args));\n\t\t\t}\n\n\t\t\tfunction hsv2keyword(args) {\n\t\t\t\treturn rgb2keyword(hsv2rgb(args));\n\t\t\t}\n\n\t\t\t// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\n\t\t\tfunction hwb2rgb(hwb) {\n\t\t\t\tvar h = hwb[0] / 360,\n\t\t\t\t wh = hwb[1] / 100,\n\t\t\t\t bl = hwb[2] / 100,\n\t\t\t\t ratio = wh + bl,\n\t\t\t\t i,\n\t\t\t\t v,\n\t\t\t\t f,\n\t\t\t\t n;\n\n\t\t\t\t// wh + bl cant be > 1\n\t\t\t\tif (ratio > 1) {\n\t\t\t\t\twh /= ratio;\n\t\t\t\t\tbl /= ratio;\n\t\t\t\t}\n\n\t\t\t\ti = Math.floor(6 * h);\n\t\t\t\tv = 1 - bl;\n\t\t\t\tf = 6 * h - i;\n\t\t\t\tif ((i & 0x01) != 0) {\n\t\t\t\t\tf = 1 - f;\n\t\t\t\t}\n\t\t\t\tn = wh + f * (v - wh); // linear interpolation\n\n\t\t\t\tswitch (i) {\n\t\t\t\t\tdefault:\n\t\t\t\t\tcase 6:\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\tr = v;g = n;b = wh;break;\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tr = n;g = v;b = wh;break;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\tr = wh;g = v;b = n;break;\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\tr = wh;g = n;b = v;break;\n\t\t\t\t\tcase 4:\n\t\t\t\t\t\tr = n;g = wh;b = v;break;\n\t\t\t\t\tcase 5:\n\t\t\t\t\t\tr = v;g = wh;b = n;break;\n\t\t\t\t}\n\n\t\t\t\treturn [r * 255, g * 255, b * 255];\n\t\t\t}\n\n\t\t\tfunction hwb2hsl(args) {\n\t\t\t\treturn rgb2hsl(hwb2rgb(args));\n\t\t\t}\n\n\t\t\tfunction hwb2hsv(args) {\n\t\t\t\treturn rgb2hsv(hwb2rgb(args));\n\t\t\t}\n\n\t\t\tfunction hwb2cmyk(args) {\n\t\t\t\treturn rgb2cmyk(hwb2rgb(args));\n\t\t\t}\n\n\t\t\tfunction hwb2keyword(args) {\n\t\t\t\treturn rgb2keyword(hwb2rgb(args));\n\t\t\t}\n\n\t\t\tfunction cmyk2rgb(cmyk) {\n\t\t\t\tvar c = cmyk[0] / 100,\n\t\t\t\t m = cmyk[1] / 100,\n\t\t\t\t y = cmyk[2] / 100,\n\t\t\t\t k = cmyk[3] / 100,\n\t\t\t\t r,\n\t\t\t\t g,\n\t\t\t\t b;\n\n\t\t\t\tr = 1 - Math.min(1, c * (1 - k) + k);\n\t\t\t\tg = 1 - Math.min(1, m * (1 - k) + k);\n\t\t\t\tb = 1 - Math.min(1, y * (1 - k) + k);\n\t\t\t\treturn [r * 255, g * 255, b * 255];\n\t\t\t}\n\n\t\t\tfunction cmyk2hsl(args) {\n\t\t\t\treturn rgb2hsl(cmyk2rgb(args));\n\t\t\t}\n\n\t\t\tfunction cmyk2hsv(args) {\n\t\t\t\treturn rgb2hsv(cmyk2rgb(args));\n\t\t\t}\n\n\t\t\tfunction cmyk2hwb(args) {\n\t\t\t\treturn rgb2hwb(cmyk2rgb(args));\n\t\t\t}\n\n\t\t\tfunction cmyk2keyword(args) {\n\t\t\t\treturn rgb2keyword(cmyk2rgb(args));\n\t\t\t}\n\n\t\t\tfunction xyz2rgb(xyz) {\n\t\t\t\tvar x = xyz[0] / 100,\n\t\t\t\t y = xyz[1] / 100,\n\t\t\t\t z = xyz[2] / 100,\n\t\t\t\t r,\n\t\t\t\t g,\n\t\t\t\t b;\n\n\t\t\t\tr = x * 3.2406 + y * -1.5372 + z * -0.4986;\n\t\t\t\tg = x * -0.9689 + y * 1.8758 + z * 0.0415;\n\t\t\t\tb = x * 0.0557 + y * -0.2040 + z * 1.0570;\n\n\t\t\t\t// assume sRGB\n\t\t\t\tr = r > 0.0031308 ? 1.055 * Math.pow(r, 1.0 / 2.4) - 0.055 : r = r * 12.92;\n\n\t\t\t\tg = g > 0.0031308 ? 1.055 * Math.pow(g, 1.0 / 2.4) - 0.055 : g = g * 12.92;\n\n\t\t\t\tb = b > 0.0031308 ? 1.055 * Math.pow(b, 1.0 / 2.4) - 0.055 : b = b * 12.92;\n\n\t\t\t\tr = Math.min(Math.max(0, r), 1);\n\t\t\t\tg = Math.min(Math.max(0, g), 1);\n\t\t\t\tb = Math.min(Math.max(0, b), 1);\n\n\t\t\t\treturn [r * 255, g * 255, b * 255];\n\t\t\t}\n\n\t\t\tfunction xyz2lab(xyz) {\n\t\t\t\tvar x = xyz[0],\n\t\t\t\t y = xyz[1],\n\t\t\t\t z = xyz[2],\n\t\t\t\t l,\n\t\t\t\t a,\n\t\t\t\t b;\n\n\t\t\t\tx /= 95.047;\n\t\t\t\ty /= 100;\n\t\t\t\tz /= 108.883;\n\n\t\t\t\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116;\n\t\t\t\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116;\n\t\t\t\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116;\n\n\t\t\t\tl = 116 * y - 16;\n\t\t\t\ta = 500 * (x - y);\n\t\t\t\tb = 200 * (y - z);\n\n\t\t\t\treturn [l, a, b];\n\t\t\t}\n\n\t\t\tfunction xyz2lch(args) {\n\t\t\t\treturn lab2lch(xyz2lab(args));\n\t\t\t}\n\n\t\t\tfunction lab2xyz(lab) {\n\t\t\t\tvar l = lab[0],\n\t\t\t\t a = lab[1],\n\t\t\t\t b = lab[2],\n\t\t\t\t x,\n\t\t\t\t y,\n\t\t\t\t z,\n\t\t\t\t y2;\n\n\t\t\t\tif (l <= 8) {\n\t\t\t\t\ty = l * 100 / 903.3;\n\t\t\t\t\ty2 = 7.787 * (y / 100) + 16 / 116;\n\t\t\t\t} else {\n\t\t\t\t\ty = 100 * Math.pow((l + 16) / 116, 3);\n\t\t\t\t\ty2 = Math.pow(y / 100, 1 / 3);\n\t\t\t\t}\n\n\t\t\t\tx = x / 95.047 <= 0.008856 ? x = 95.047 * (a / 500 + y2 - 16 / 116) / 7.787 : 95.047 * Math.pow(a / 500 + y2, 3);\n\n\t\t\t\tz = z / 108.883 <= 0.008859 ? z = 108.883 * (y2 - b / 200 - 16 / 116) / 7.787 : 108.883 * Math.pow(y2 - b / 200, 3);\n\n\t\t\t\treturn [x, y, z];\n\t\t\t}\n\n\t\t\tfunction lab2lch(lab) {\n\t\t\t\tvar l = lab[0],\n\t\t\t\t a = lab[1],\n\t\t\t\t b = lab[2],\n\t\t\t\t hr,\n\t\t\t\t h,\n\t\t\t\t c;\n\n\t\t\t\thr = Math.atan2(b, a);\n\t\t\t\th = hr * 360 / 2 / Math.PI;\n\t\t\t\tif (h < 0) {\n\t\t\t\t\th += 360;\n\t\t\t\t}\n\t\t\t\tc = Math.sqrt(a * a + b * b);\n\t\t\t\treturn [l, c, h];\n\t\t\t}\n\n\t\t\tfunction lab2rgb(args) {\n\t\t\t\treturn xyz2rgb(lab2xyz(args));\n\t\t\t}\n\n\t\t\tfunction lch2lab(lch) {\n\t\t\t\tvar l = lch[0],\n\t\t\t\t c = lch[1],\n\t\t\t\t h = lch[2],\n\t\t\t\t a,\n\t\t\t\t b,\n\t\t\t\t hr;\n\n\t\t\t\thr = h / 360 * 2 * Math.PI;\n\t\t\t\ta = c * Math.cos(hr);\n\t\t\t\tb = c * Math.sin(hr);\n\t\t\t\treturn [l, a, b];\n\t\t\t}\n\n\t\t\tfunction lch2xyz(args) {\n\t\t\t\treturn lab2xyz(lch2lab(args));\n\t\t\t}\n\n\t\t\tfunction lch2rgb(args) {\n\t\t\t\treturn lab2rgb(lch2lab(args));\n\t\t\t}\n\n\t\t\tfunction keyword2rgb(keyword) {\n\t\t\t\treturn cssKeywords[keyword];\n\t\t\t}\n\n\t\t\tfunction keyword2hsl(args) {\n\t\t\t\treturn rgb2hsl(keyword2rgb(args));\n\t\t\t}\n\n\t\t\tfunction keyword2hsv(args) {\n\t\t\t\treturn rgb2hsv(keyword2rgb(args));\n\t\t\t}\n\n\t\t\tfunction keyword2hwb(args) {\n\t\t\t\treturn rgb2hwb(keyword2rgb(args));\n\t\t\t}\n\n\t\t\tfunction keyword2cmyk(args) {\n\t\t\t\treturn rgb2cmyk(keyword2rgb(args));\n\t\t\t}\n\n\t\t\tfunction keyword2lab(args) {\n\t\t\t\treturn rgb2lab(keyword2rgb(args));\n\t\t\t}\n\n\t\t\tfunction keyword2xyz(args) {\n\t\t\t\treturn rgb2xyz(keyword2rgb(args));\n\t\t\t}\n\n\t\t\tvar cssKeywords = {\n\t\t\t\taliceblue: [240, 248, 255],\n\t\t\t\tantiquewhite: [250, 235, 215],\n\t\t\t\taqua: [0, 255, 255],\n\t\t\t\taquamarine: [127, 255, 212],\n\t\t\t\tazure: [240, 255, 255],\n\t\t\t\tbeige: [245, 245, 220],\n\t\t\t\tbisque: [255, 228, 196],\n\t\t\t\tblack: [0, 0, 0],\n\t\t\t\tblanchedalmond: [255, 235, 205],\n\t\t\t\tblue: [0, 0, 255],\n\t\t\t\tblueviolet: [138, 43, 226],\n\t\t\t\tbrown: [165, 42, 42],\n\t\t\t\tburlywood: [222, 184, 135],\n\t\t\t\tcadetblue: [95, 158, 160],\n\t\t\t\tchartreuse: [127, 255, 0],\n\t\t\t\tchocolate: [210, 105, 30],\n\t\t\t\tcoral: [255, 127, 80],\n\t\t\t\tcornflowerblue: [100, 149, 237],\n\t\t\t\tcornsilk: [255, 248, 220],\n\t\t\t\tcrimson: [220, 20, 60],\n\t\t\t\tcyan: [0, 255, 255],\n\t\t\t\tdarkblue: [0, 0, 139],\n\t\t\t\tdarkcyan: [0, 139, 139],\n\t\t\t\tdarkgoldenrod: [184, 134, 11],\n\t\t\t\tdarkgray: [169, 169, 169],\n\t\t\t\tdarkgreen: [0, 100, 0],\n\t\t\t\tdarkgrey: [169, 169, 169],\n\t\t\t\tdarkkhaki: [189, 183, 107],\n\t\t\t\tdarkmagenta: [139, 0, 139],\n\t\t\t\tdarkolivegreen: [85, 107, 47],\n\t\t\t\tdarkorange: [255, 140, 0],\n\t\t\t\tdarkorchid: [153, 50, 204],\n\t\t\t\tdarkred: [139, 0, 0],\n\t\t\t\tdarksalmon: [233, 150, 122],\n\t\t\t\tdarkseagreen: [143, 188, 143],\n\t\t\t\tdarkslateblue: [72, 61, 139],\n\t\t\t\tdarkslategray: [47, 79, 79],\n\t\t\t\tdarkslategrey: [47, 79, 79],\n\t\t\t\tdarkturquoise: [0, 206, 209],\n\t\t\t\tdarkviolet: [148, 0, 211],\n\t\t\t\tdeeppink: [255, 20, 147],\n\t\t\t\tdeepskyblue: [0, 191, 255],\n\t\t\t\tdimgray: [105, 105, 105],\n\t\t\t\tdimgrey: [105, 105, 105],\n\t\t\t\tdodgerblue: [30, 144, 255],\n\t\t\t\tfirebrick: [178, 34, 34],\n\t\t\t\tfloralwhite: [255, 250, 240],\n\t\t\t\tforestgreen: [34, 139, 34],\n\t\t\t\tfuchsia: [255, 0, 255],\n\t\t\t\tgainsboro: [220, 220, 220],\n\t\t\t\tghostwhite: [248, 248, 255],\n\t\t\t\tgold: [255, 215, 0],\n\t\t\t\tgoldenrod: [218, 165, 32],\n\t\t\t\tgray: [128, 128, 128],\n\t\t\t\tgreen: [0, 128, 0],\n\t\t\t\tgreenyellow: [173, 255, 47],\n\t\t\t\tgrey: [128, 128, 128],\n\t\t\t\thoneydew: [240, 255, 240],\n\t\t\t\thotpink: [255, 105, 180],\n\t\t\t\tindianred: [205, 92, 92],\n\t\t\t\tindigo: [75, 0, 130],\n\t\t\t\tivory: [255, 255, 240],\n\t\t\t\tkhaki: [240, 230, 140],\n\t\t\t\tlavender: [230, 230, 250],\n\t\t\t\tlavenderblush: [255, 240, 245],\n\t\t\t\tlawngreen: [124, 252, 0],\n\t\t\t\tlemonchiffon: [255, 250, 205],\n\t\t\t\tlightblue: [173, 216, 230],\n\t\t\t\tlightcoral: [240, 128, 128],\n\t\t\t\tlightcyan: [224, 255, 255],\n\t\t\t\tlightgoldenrodyellow: [250, 250, 210],\n\t\t\t\tlightgray: [211, 211, 211],\n\t\t\t\tlightgreen: [144, 238, 144],\n\t\t\t\tlightgrey: [211, 211, 211],\n\t\t\t\tlightpink: [255, 182, 193],\n\t\t\t\tlightsalmon: [255, 160, 122],\n\t\t\t\tlightseagreen: [32, 178, 170],\n\t\t\t\tlightskyblue: [135, 206, 250],\n\t\t\t\tlightslategray: [119, 136, 153],\n\t\t\t\tlightslategrey: [119, 136, 153],\n\t\t\t\tlightsteelblue: [176, 196, 222],\n\t\t\t\tlightyellow: [255, 255, 224],\n\t\t\t\tlime: [0, 255, 0],\n\t\t\t\tlimegreen: [50, 205, 50],\n\t\t\t\tlinen: [250, 240, 230],\n\t\t\t\tmagenta: [255, 0, 255],\n\t\t\t\tmaroon: [128, 0, 0],\n\t\t\t\tmediumaquamarine: [102, 205, 170],\n\t\t\t\tmediumblue: [0, 0, 205],\n\t\t\t\tmediumorchid: [186, 85, 211],\n\t\t\t\tmediumpurple: [147, 112, 219],\n\t\t\t\tmediumseagreen: [60, 179, 113],\n\t\t\t\tmediumslateblue: [123, 104, 238],\n\t\t\t\tmediumspringgreen: [0, 250, 154],\n\t\t\t\tmediumturquoise: [72, 209, 204],\n\t\t\t\tmediumvioletred: [199, 21, 133],\n\t\t\t\tmidnightblue: [25, 25, 112],\n\t\t\t\tmintcream: [245, 255, 250],\n\t\t\t\tmistyrose: [255, 228, 225],\n\t\t\t\tmoccasin: [255, 228, 181],\n\t\t\t\tnavajowhite: [255, 222, 173],\n\t\t\t\tnavy: [0, 0, 128],\n\t\t\t\toldlace: [253, 245, 230],\n\t\t\t\tolive: [128, 128, 0],\n\t\t\t\tolivedrab: [107, 142, 35],\n\t\t\t\torange: [255, 165, 0],\n\t\t\t\torangered: [255, 69, 0],\n\t\t\t\torchid: [218, 112, 214],\n\t\t\t\tpalegoldenrod: [238, 232, 170],\n\t\t\t\tpalegreen: [152, 251, 152],\n\t\t\t\tpaleturquoise: [175, 238, 238],\n\t\t\t\tpalevioletred: [219, 112, 147],\n\t\t\t\tpapayawhip: [255, 239, 213],\n\t\t\t\tpeachpuff: [255, 218, 185],\n\t\t\t\tperu: [205, 133, 63],\n\t\t\t\tpink: [255, 192, 203],\n\t\t\t\tplum: [221, 160, 221],\n\t\t\t\tpowderblue: [176, 224, 230],\n\t\t\t\tpurple: [128, 0, 128],\n\t\t\t\trebeccapurple: [102, 51, 153],\n\t\t\t\tred: [255, 0, 0],\n\t\t\t\trosybrown: [188, 143, 143],\n\t\t\t\troyalblue: [65, 105, 225],\n\t\t\t\tsaddlebrown: [139, 69, 19],\n\t\t\t\tsalmon: [250, 128, 114],\n\t\t\t\tsandybrown: [244, 164, 96],\n\t\t\t\tseagreen: [46, 139, 87],\n\t\t\t\tseashell: [255, 245, 238],\n\t\t\t\tsienna: [160, 82, 45],\n\t\t\t\tsilver: [192, 192, 192],\n\t\t\t\tskyblue: [135, 206, 235],\n\t\t\t\tslateblue: [106, 90, 205],\n\t\t\t\tslategray: [112, 128, 144],\n\t\t\t\tslategrey: [112, 128, 144],\n\t\t\t\tsnow: [255, 250, 250],\n\t\t\t\tspringgreen: [0, 255, 127],\n\t\t\t\tsteelblue: [70, 130, 180],\n\t\t\t\ttan: [210, 180, 140],\n\t\t\t\tteal: [0, 128, 128],\n\t\t\t\tthistle: [216, 191, 216],\n\t\t\t\ttomato: [255, 99, 71],\n\t\t\t\tturquoise: [64, 224, 208],\n\t\t\t\tviolet: [238, 130, 238],\n\t\t\t\twheat: [245, 222, 179],\n\t\t\t\twhite: [255, 255, 255],\n\t\t\t\twhitesmoke: [245, 245, 245],\n\t\t\t\tyellow: [255, 255, 0],\n\t\t\t\tyellowgreen: [154, 205, 50]\n\t\t\t};\n\n\t\t\tvar reverseKeywords = {};\n\t\t\tfor (var key in cssKeywords) {\n\t\t\t\treverseKeywords[JSON.stringify(cssKeywords[key])] = key;\n\t\t\t}\n\t\t}, {}], 5: [function (require, module, exports) {\n\t\t\tvar conversions = require(4);\n\n\t\t\tvar convert = function convert() {\n\t\t\t\treturn new Converter();\n\t\t\t};\n\n\t\t\tfor (var func in conversions) {\n\t\t\t\t// export Raw versions\n\t\t\t\tconvert[func + \"Raw\"] = function (func) {\n\t\t\t\t\t// accept array or plain args\n\t\t\t\t\treturn function (arg) {\n\t\t\t\t\t\tif (typeof arg == \"number\") arg = Array.prototype.slice.call(arguments);\n\t\t\t\t\t\treturn conversions[func](arg);\n\t\t\t\t\t};\n\t\t\t\t}(func);\n\n\t\t\t\tvar pair = /(\\w+)2(\\w+)/.exec(func),\n\t\t\t\t from = pair[1],\n\t\t\t\t to = pair[2];\n\n\t\t\t\t// export rgb2hsl and [\"rgb\"][\"hsl\"]\n\t\t\t\tconvert[from] = convert[from] || {};\n\n\t\t\t\tconvert[from][to] = convert[func] = function (func) {\n\t\t\t\t\treturn function (arg) {\n\t\t\t\t\t\tif (typeof arg == \"number\") arg = Array.prototype.slice.call(arguments);\n\n\t\t\t\t\t\tvar val = conversions[func](arg);\n\t\t\t\t\t\tif (typeof val == \"string\" || val === undefined) return val; // keyword\n\n\t\t\t\t\t\tfor (var i = 0; i < val.length; i++) {\n\t\t\t\t\t\t\tval[i] = Math.round(val[i]);\n\t\t\t\t\t\t}return val;\n\t\t\t\t\t};\n\t\t\t\t}(func);\n\t\t\t}\n\n\t\t\t/* Converter does lazy conversion and caching */\n\t\t\tvar Converter = function Converter() {\n\t\t\t\tthis.convs = {};\n\t\t\t};\n\n\t\t\t/* Either get the values for a space or\n set the values for a space, depending on args */\n\t\t\tConverter.prototype.routeSpace = function (space, args) {\n\t\t\t\tvar values = args[0];\n\t\t\t\tif (values === undefined) {\n\t\t\t\t\t// color.rgb()\n\t\t\t\t\treturn this.getValues(space);\n\t\t\t\t}\n\t\t\t\t// color.rgb(10, 10, 10)\n\t\t\t\tif (typeof values == \"number\") {\n\t\t\t\t\tvalues = Array.prototype.slice.call(args);\n\t\t\t\t}\n\n\t\t\t\treturn this.setValues(space, values);\n\t\t\t};\n\n\t\t\t/* Set the values for a space, invalidating cache */\n\t\t\tConverter.prototype.setValues = function (space, values) {\n\t\t\t\tthis.space = space;\n\t\t\t\tthis.convs = {};\n\t\t\t\tthis.convs[space] = values;\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t/* Get the values for a space. If there's already\n a conversion for the space, fetch it, otherwise\n compute it */\n\t\t\tConverter.prototype.getValues = function (space) {\n\t\t\t\tvar vals = this.convs[space];\n\t\t\t\tif (!vals) {\n\t\t\t\t\tvar fspace = this.space,\n\t\t\t\t\t from = this.convs[fspace];\n\t\t\t\t\tvals = convert[fspace][space](from);\n\n\t\t\t\t\tthis.convs[space] = vals;\n\t\t\t\t}\n\t\t\t\treturn vals;\n\t\t\t};\n\n\t\t\t[\"rgb\", \"hsl\", \"hsv\", \"cmyk\", \"keyword\"].forEach(function (space) {\n\t\t\t\tConverter.prototype[space] = function (vals) {\n\t\t\t\t\treturn this.routeSpace(space, arguments);\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tmodule.exports = convert;\n\t\t}, { \"4\": 4 }], 6: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = {\n\t\t\t\t\"aliceblue\": [240, 248, 255],\n\t\t\t\t\"antiquewhite\": [250, 235, 215],\n\t\t\t\t\"aqua\": [0, 255, 255],\n\t\t\t\t\"aquamarine\": [127, 255, 212],\n\t\t\t\t\"azure\": [240, 255, 255],\n\t\t\t\t\"beige\": [245, 245, 220],\n\t\t\t\t\"bisque\": [255, 228, 196],\n\t\t\t\t\"black\": [0, 0, 0],\n\t\t\t\t\"blanchedalmond\": [255, 235, 205],\n\t\t\t\t\"blue\": [0, 0, 255],\n\t\t\t\t\"blueviolet\": [138, 43, 226],\n\t\t\t\t\"brown\": [165, 42, 42],\n\t\t\t\t\"burlywood\": [222, 184, 135],\n\t\t\t\t\"cadetblue\": [95, 158, 160],\n\t\t\t\t\"chartreuse\": [127, 255, 0],\n\t\t\t\t\"chocolate\": [210, 105, 30],\n\t\t\t\t\"coral\": [255, 127, 80],\n\t\t\t\t\"cornflowerblue\": [100, 149, 237],\n\t\t\t\t\"cornsilk\": [255, 248, 220],\n\t\t\t\t\"crimson\": [220, 20, 60],\n\t\t\t\t\"cyan\": [0, 255, 255],\n\t\t\t\t\"darkblue\": [0, 0, 139],\n\t\t\t\t\"darkcyan\": [0, 139, 139],\n\t\t\t\t\"darkgoldenrod\": [184, 134, 11],\n\t\t\t\t\"darkgray\": [169, 169, 169],\n\t\t\t\t\"darkgreen\": [0, 100, 0],\n\t\t\t\t\"darkgrey\": [169, 169, 169],\n\t\t\t\t\"darkkhaki\": [189, 183, 107],\n\t\t\t\t\"darkmagenta\": [139, 0, 139],\n\t\t\t\t\"darkolivegreen\": [85, 107, 47],\n\t\t\t\t\"darkorange\": [255, 140, 0],\n\t\t\t\t\"darkorchid\": [153, 50, 204],\n\t\t\t\t\"darkred\": [139, 0, 0],\n\t\t\t\t\"darksalmon\": [233, 150, 122],\n\t\t\t\t\"darkseagreen\": [143, 188, 143],\n\t\t\t\t\"darkslateblue\": [72, 61, 139],\n\t\t\t\t\"darkslategray\": [47, 79, 79],\n\t\t\t\t\"darkslategrey\": [47, 79, 79],\n\t\t\t\t\"darkturquoise\": [0, 206, 209],\n\t\t\t\t\"darkviolet\": [148, 0, 211],\n\t\t\t\t\"deeppink\": [255, 20, 147],\n\t\t\t\t\"deepskyblue\": [0, 191, 255],\n\t\t\t\t\"dimgray\": [105, 105, 105],\n\t\t\t\t\"dimgrey\": [105, 105, 105],\n\t\t\t\t\"dodgerblue\": [30, 144, 255],\n\t\t\t\t\"firebrick\": [178, 34, 34],\n\t\t\t\t\"floralwhite\": [255, 250, 240],\n\t\t\t\t\"forestgreen\": [34, 139, 34],\n\t\t\t\t\"fuchsia\": [255, 0, 255],\n\t\t\t\t\"gainsboro\": [220, 220, 220],\n\t\t\t\t\"ghostwhite\": [248, 248, 255],\n\t\t\t\t\"gold\": [255, 215, 0],\n\t\t\t\t\"goldenrod\": [218, 165, 32],\n\t\t\t\t\"gray\": [128, 128, 128],\n\t\t\t\t\"green\": [0, 128, 0],\n\t\t\t\t\"greenyellow\": [173, 255, 47],\n\t\t\t\t\"grey\": [128, 128, 128],\n\t\t\t\t\"honeydew\": [240, 255, 240],\n\t\t\t\t\"hotpink\": [255, 105, 180],\n\t\t\t\t\"indianred\": [205, 92, 92],\n\t\t\t\t\"indigo\": [75, 0, 130],\n\t\t\t\t\"ivory\": [255, 255, 240],\n\t\t\t\t\"khaki\": [240, 230, 140],\n\t\t\t\t\"lavender\": [230, 230, 250],\n\t\t\t\t\"lavenderblush\": [255, 240, 245],\n\t\t\t\t\"lawngreen\": [124, 252, 0],\n\t\t\t\t\"lemonchiffon\": [255, 250, 205],\n\t\t\t\t\"lightblue\": [173, 216, 230],\n\t\t\t\t\"lightcoral\": [240, 128, 128],\n\t\t\t\t\"lightcyan\": [224, 255, 255],\n\t\t\t\t\"lightgoldenrodyellow\": [250, 250, 210],\n\t\t\t\t\"lightgray\": [211, 211, 211],\n\t\t\t\t\"lightgreen\": [144, 238, 144],\n\t\t\t\t\"lightgrey\": [211, 211, 211],\n\t\t\t\t\"lightpink\": [255, 182, 193],\n\t\t\t\t\"lightsalmon\": [255, 160, 122],\n\t\t\t\t\"lightseagreen\": [32, 178, 170],\n\t\t\t\t\"lightskyblue\": [135, 206, 250],\n\t\t\t\t\"lightslategray\": [119, 136, 153],\n\t\t\t\t\"lightslategrey\": [119, 136, 153],\n\t\t\t\t\"lightsteelblue\": [176, 196, 222],\n\t\t\t\t\"lightyellow\": [255, 255, 224],\n\t\t\t\t\"lime\": [0, 255, 0],\n\t\t\t\t\"limegreen\": [50, 205, 50],\n\t\t\t\t\"linen\": [250, 240, 230],\n\t\t\t\t\"magenta\": [255, 0, 255],\n\t\t\t\t\"maroon\": [128, 0, 0],\n\t\t\t\t\"mediumaquamarine\": [102, 205, 170],\n\t\t\t\t\"mediumblue\": [0, 0, 205],\n\t\t\t\t\"mediumorchid\": [186, 85, 211],\n\t\t\t\t\"mediumpurple\": [147, 112, 219],\n\t\t\t\t\"mediumseagreen\": [60, 179, 113],\n\t\t\t\t\"mediumslateblue\": [123, 104, 238],\n\t\t\t\t\"mediumspringgreen\": [0, 250, 154],\n\t\t\t\t\"mediumturquoise\": [72, 209, 204],\n\t\t\t\t\"mediumvioletred\": [199, 21, 133],\n\t\t\t\t\"midnightblue\": [25, 25, 112],\n\t\t\t\t\"mintcream\": [245, 255, 250],\n\t\t\t\t\"mistyrose\": [255, 228, 225],\n\t\t\t\t\"moccasin\": [255, 228, 181],\n\t\t\t\t\"navajowhite\": [255, 222, 173],\n\t\t\t\t\"navy\": [0, 0, 128],\n\t\t\t\t\"oldlace\": [253, 245, 230],\n\t\t\t\t\"olive\": [128, 128, 0],\n\t\t\t\t\"olivedrab\": [107, 142, 35],\n\t\t\t\t\"orange\": [255, 165, 0],\n\t\t\t\t\"orangered\": [255, 69, 0],\n\t\t\t\t\"orchid\": [218, 112, 214],\n\t\t\t\t\"palegoldenrod\": [238, 232, 170],\n\t\t\t\t\"palegreen\": [152, 251, 152],\n\t\t\t\t\"paleturquoise\": [175, 238, 238],\n\t\t\t\t\"palevioletred\": [219, 112, 147],\n\t\t\t\t\"papayawhip\": [255, 239, 213],\n\t\t\t\t\"peachpuff\": [255, 218, 185],\n\t\t\t\t\"peru\": [205, 133, 63],\n\t\t\t\t\"pink\": [255, 192, 203],\n\t\t\t\t\"plum\": [221, 160, 221],\n\t\t\t\t\"powderblue\": [176, 224, 230],\n\t\t\t\t\"purple\": [128, 0, 128],\n\t\t\t\t\"rebeccapurple\": [102, 51, 153],\n\t\t\t\t\"red\": [255, 0, 0],\n\t\t\t\t\"rosybrown\": [188, 143, 143],\n\t\t\t\t\"royalblue\": [65, 105, 225],\n\t\t\t\t\"saddlebrown\": [139, 69, 19],\n\t\t\t\t\"salmon\": [250, 128, 114],\n\t\t\t\t\"sandybrown\": [244, 164, 96],\n\t\t\t\t\"seagreen\": [46, 139, 87],\n\t\t\t\t\"seashell\": [255, 245, 238],\n\t\t\t\t\"sienna\": [160, 82, 45],\n\t\t\t\t\"silver\": [192, 192, 192],\n\t\t\t\t\"skyblue\": [135, 206, 235],\n\t\t\t\t\"slateblue\": [106, 90, 205],\n\t\t\t\t\"slategray\": [112, 128, 144],\n\t\t\t\t\"slategrey\": [112, 128, 144],\n\t\t\t\t\"snow\": [255, 250, 250],\n\t\t\t\t\"springgreen\": [0, 255, 127],\n\t\t\t\t\"steelblue\": [70, 130, 180],\n\t\t\t\t\"tan\": [210, 180, 140],\n\t\t\t\t\"teal\": [0, 128, 128],\n\t\t\t\t\"thistle\": [216, 191, 216],\n\t\t\t\t\"tomato\": [255, 99, 71],\n\t\t\t\t\"turquoise\": [64, 224, 208],\n\t\t\t\t\"violet\": [238, 130, 238],\n\t\t\t\t\"wheat\": [245, 222, 179],\n\t\t\t\t\"white\": [255, 255, 255],\n\t\t\t\t\"whitesmoke\": [245, 245, 245],\n\t\t\t\t\"yellow\": [255, 255, 0],\n\t\t\t\t\"yellowgreen\": [154, 205, 50]\n\t\t\t};\n\t\t}, {}], 7: [function (require, module, exports) {\n\t\t\t/**\n * @namespace Chart\n */\n\t\t\tvar Chart = require(30)();\n\n\t\t\tChart.helpers = require(46);\n\n\t\t\t// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests!\n\t\t\trequire(28)(Chart);\n\n\t\t\tChart.Animation = require(22);\n\t\t\tChart.animationService = require(23);\n\t\t\tChart.defaults = require(26);\n\t\t\tChart.Element = require(27);\n\t\t\tChart.elements = require(41);\n\t\t\tChart.Interaction = require(29);\n\t\t\tChart.layouts = require(31);\n\t\t\tChart.platform = require(49);\n\t\t\tChart.plugins = require(32);\n\t\t\tChart.Scale = require(33);\n\t\t\tChart.scaleService = require(34);\n\t\t\tChart.Ticks = require(35);\n\t\t\tChart.Tooltip = require(36);\n\n\t\t\trequire(24)(Chart);\n\t\t\trequire(25)(Chart);\n\n\t\t\trequire(56)(Chart);\n\t\t\trequire(54)(Chart);\n\t\t\trequire(55)(Chart);\n\t\t\trequire(57)(Chart);\n\t\t\trequire(58)(Chart);\n\t\t\trequire(59)(Chart);\n\n\t\t\t// Controllers must be loaded after elements\n\t\t\t// See Chart.core.datasetController.dataElementType\n\t\t\trequire(15)(Chart);\n\t\t\trequire(16)(Chart);\n\t\t\trequire(17)(Chart);\n\t\t\trequire(18)(Chart);\n\t\t\trequire(19)(Chart);\n\t\t\trequire(20)(Chart);\n\t\t\trequire(21)(Chart);\n\n\t\t\trequire(8)(Chart);\n\t\t\trequire(9)(Chart);\n\t\t\trequire(10)(Chart);\n\t\t\trequire(11)(Chart);\n\t\t\trequire(12)(Chart);\n\t\t\trequire(13)(Chart);\n\t\t\trequire(14)(Chart);\n\n\t\t\t// Loading built-in plugins\n\t\t\tvar plugins = require(50);\n\t\t\tfor (var k in plugins) {\n\t\t\t\tif (plugins.hasOwnProperty(k)) {\n\t\t\t\t\tChart.plugins.register(plugins[k]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tChart.platform.initialize();\n\n\t\t\tmodule.exports = Chart;\n\t\t\tif (typeof window !== 'undefined') {\n\t\t\t\twindow.Chart = Chart;\n\t\t\t}\n\n\t\t\t// DEPRECATIONS\n\n\t\t\t/**\n * Provided for backward compatibility, not available anymore\n * @namespace Chart.Legend\n * @deprecated since version 2.1.5\n * @todo remove at version 3\n * @private\n */\n\t\t\tChart.Legend = plugins.legend._element;\n\n\t\t\t/**\n * Provided for backward compatibility, not available anymore\n * @namespace Chart.Title\n * @deprecated since version 2.1.5\n * @todo remove at version 3\n * @private\n */\n\t\t\tChart.Title = plugins.title._element;\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.plugins instead\n * @namespace Chart.pluginService\n * @deprecated since version 2.1.5\n * @todo remove at version 3\n * @private\n */\n\t\t\tChart.pluginService = Chart.plugins;\n\n\t\t\t/**\n * Provided for backward compatibility, inheriting from Chart.PlugingBase has no\n * effect, instead simply create/register plugins via plain JavaScript objects.\n * @interface Chart.PluginBase\n * @deprecated since version 2.5.0\n * @todo remove at version 3\n * @private\n */\n\t\t\tChart.PluginBase = Chart.Element.extend({});\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.helpers.canvas instead.\n * @namespace Chart.canvasHelpers\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\n\t\t\tChart.canvasHelpers = Chart.helpers.canvas;\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.layouts instead.\n * @namespace Chart.layoutService\n * @deprecated since version 2.8.0\n * @todo remove at version 3\n * @private\n */\n\t\t\tChart.layoutService = Chart.layouts;\n\t\t}, { \"10\": 10, \"11\": 11, \"12\": 12, \"13\": 13, \"14\": 14, \"15\": 15, \"16\": 16, \"17\": 17, \"18\": 18, \"19\": 19, \"20\": 20, \"21\": 21, \"22\": 22, \"23\": 23, \"24\": 24, \"25\": 25, \"26\": 26, \"27\": 27, \"28\": 28, \"29\": 29, \"30\": 30, \"31\": 31, \"32\": 32, \"33\": 33, \"34\": 34, \"35\": 35, \"36\": 36, \"41\": 41, \"46\": 46, \"49\": 49, \"50\": 50, \"54\": 54, \"55\": 55, \"56\": 56, \"57\": 57, \"58\": 58, \"59\": 59, \"8\": 8, \"9\": 9 }], 8: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.Bar = function (context, config) {\n\t\t\t\t\tconfig.type = 'bar';\n\n\t\t\t\t\treturn new Chart(context, config);\n\t\t\t\t};\n\t\t\t};\n\t\t}, {}], 9: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.Bubble = function (context, config) {\n\t\t\t\t\tconfig.type = 'bubble';\n\t\t\t\t\treturn new Chart(context, config);\n\t\t\t\t};\n\t\t\t};\n\t\t}, {}], 10: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.Doughnut = function (context, config) {\n\t\t\t\t\tconfig.type = 'doughnut';\n\n\t\t\t\t\treturn new Chart(context, config);\n\t\t\t\t};\n\t\t\t};\n\t\t}, {}], 11: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.Line = function (context, config) {\n\t\t\t\t\tconfig.type = 'line';\n\n\t\t\t\t\treturn new Chart(context, config);\n\t\t\t\t};\n\t\t\t};\n\t\t}, {}], 12: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.PolarArea = function (context, config) {\n\t\t\t\t\tconfig.type = 'polarArea';\n\n\t\t\t\t\treturn new Chart(context, config);\n\t\t\t\t};\n\t\t\t};\n\t\t}, {}], 13: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.Radar = function (context, config) {\n\t\t\t\t\tconfig.type = 'radar';\n\n\t\t\t\t\treturn new Chart(context, config);\n\t\t\t\t};\n\t\t\t};\n\t\t}, {}], 14: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = function (Chart) {\n\t\t\t\tChart.Scatter = function (context, config) {\n\t\t\t\t\tconfig.type = 'scatter';\n\t\t\t\t\treturn new Chart(context, config);\n\t\t\t\t};\n\t\t\t};\n\t\t}, {}], 15: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar elements = require(41);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('bar', {\n\t\t\t\thover: {\n\t\t\t\t\tmode: 'label'\n\t\t\t\t},\n\n\t\t\t\tscales: {\n\t\t\t\t\txAxes: [{\n\t\t\t\t\t\ttype: 'category',\n\n\t\t\t\t\t\t// Specific to Bar Controller\n\t\t\t\t\t\tcategoryPercentage: 0.8,\n\t\t\t\t\t\tbarPercentage: 0.9,\n\n\t\t\t\t\t\t// offset settings\n\t\t\t\t\t\toffset: true,\n\n\t\t\t\t\t\t// grid line settings\n\t\t\t\t\t\tgridLines: {\n\t\t\t\t\t\t\toffsetGridLines: true\n\t\t\t\t\t\t}\n\t\t\t\t\t}],\n\n\t\t\t\t\tyAxes: [{\n\t\t\t\t\t\ttype: 'linear'\n\t\t\t\t\t}]\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdefaults._set('horizontalBar', {\n\t\t\t\thover: {\n\t\t\t\t\tmode: 'index',\n\t\t\t\t\taxis: 'y'\n\t\t\t\t},\n\n\t\t\t\tscales: {\n\t\t\t\t\txAxes: [{\n\t\t\t\t\t\ttype: 'linear',\n\t\t\t\t\t\tposition: 'bottom'\n\t\t\t\t\t}],\n\n\t\t\t\t\tyAxes: [{\n\t\t\t\t\t\tposition: 'left',\n\t\t\t\t\t\ttype: 'category',\n\n\t\t\t\t\t\t// Specific to Horizontal Bar Controller\n\t\t\t\t\t\tcategoryPercentage: 0.8,\n\t\t\t\t\t\tbarPercentage: 0.9,\n\n\t\t\t\t\t\t// offset settings\n\t\t\t\t\t\toffset: true,\n\n\t\t\t\t\t\t// grid line settings\n\t\t\t\t\t\tgridLines: {\n\t\t\t\t\t\t\toffsetGridLines: true\n\t\t\t\t\t\t}\n\t\t\t\t\t}]\n\t\t\t\t},\n\n\t\t\t\telements: {\n\t\t\t\t\trectangle: {\n\t\t\t\t\t\tborderSkipped: 'left'\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\ttooltips: {\n\t\t\t\t\tcallbacks: {\n\t\t\t\t\t\ttitle: function title(item, data) {\n\t\t\t\t\t\t\t// Pick first xLabel for now\n\t\t\t\t\t\t\tvar title = '';\n\n\t\t\t\t\t\t\tif (item.length > 0) {\n\t\t\t\t\t\t\t\tif (item[0].yLabel) {\n\t\t\t\t\t\t\t\t\ttitle = item[0].yLabel;\n\t\t\t\t\t\t\t\t} else if (data.labels.length > 0 && item[0].index < data.labels.length) {\n\t\t\t\t\t\t\t\t\ttitle = data.labels[item[0].index];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn title;\n\t\t\t\t\t\t},\n\n\t\t\t\t\t\tlabel: function label(item, data) {\n\t\t\t\t\t\t\tvar datasetLabel = data.datasets[item.datasetIndex].label || '';\n\t\t\t\t\t\t\treturn datasetLabel + ': ' + item.xLabel;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tmode: 'index',\n\t\t\t\t\taxis: 'y'\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\n\t\t\tfunction computeMinSampleSize(scale, pixels) {\n\t\t\t\tvar min = scale.isHorizontal() ? scale.width : scale.height;\n\t\t\t\tvar ticks = scale.getTicks();\n\t\t\t\tvar prev, curr, i, ilen;\n\n\t\t\t\tfor (i = 1, ilen = pixels.length; i < ilen; ++i) {\n\t\t\t\t\tmin = Math.min(min, pixels[i] - pixels[i - 1]);\n\t\t\t\t}\n\n\t\t\t\tfor (i = 0, ilen = ticks.length; i < ilen; ++i) {\n\t\t\t\t\tcurr = scale.getPixelForTick(i);\n\t\t\t\t\tmin = i > 0 ? Math.min(min, curr - prev) : min;\n\t\t\t\t\tprev = curr;\n\t\t\t\t}\n\n\t\t\t\treturn min;\n\t\t\t}\n\n\t\t\t/**\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\n * @private\n */\n\t\t\tfunction computeFitCategoryTraits(index, ruler, options) {\n\t\t\t\tvar thickness = options.barThickness;\n\t\t\t\tvar count = ruler.stackCount;\n\t\t\t\tvar curr = ruler.pixels[index];\n\t\t\t\tvar size, ratio;\n\n\t\t\t\tif (helpers.isNullOrUndef(thickness)) {\n\t\t\t\t\tsize = ruler.min * options.categoryPercentage;\n\t\t\t\t\tratio = options.barPercentage;\n\t\t\t\t} else {\n\t\t\t\t\t// When bar thickness is enforced, category and bar percentages are ignored.\n\t\t\t\t\t// Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n\t\t\t\t\t// and deprecate barPercentage since this value is ignored when thickness is absolute.\n\t\t\t\t\tsize = thickness * count;\n\t\t\t\t\tratio = 1;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tchunk: size / count,\n\t\t\t\t\tratio: ratio,\n\t\t\t\t\tstart: curr - size / 2\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t/**\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\n * percentage options are 1), based on the previous and following categories. This mode\n * generates bars with different widths when data are not evenly spaced.\n * @private\n */\n\t\t\tfunction computeFlexCategoryTraits(index, ruler, options) {\n\t\t\t\tvar pixels = ruler.pixels;\n\t\t\t\tvar curr = pixels[index];\n\t\t\t\tvar prev = index > 0 ? pixels[index - 1] : null;\n\t\t\t\tvar next = index < pixels.length - 1 ? pixels[index + 1] : null;\n\t\t\t\tvar percent = options.categoryPercentage;\n\t\t\t\tvar start, size;\n\n\t\t\t\tif (prev === null) {\n\t\t\t\t\t// first data: its size is double based on the next point or,\n\t\t\t\t\t// if it's also the last data, we use the scale end extremity.\n\t\t\t\t\tprev = curr - (next === null ? ruler.end - curr : next - curr);\n\t\t\t\t}\n\n\t\t\t\tif (next === null) {\n\t\t\t\t\t// last data: its size is also double based on the previous point.\n\t\t\t\t\tnext = curr + curr - prev;\n\t\t\t\t}\n\n\t\t\t\tstart = curr - (curr - prev) / 2 * percent;\n\t\t\t\tsize = (next - prev) / 2 * percent;\n\n\t\t\t\treturn {\n\t\t\t\t\tchunk: size / ruler.stackCount,\n\t\t\t\t\tratio: options.barPercentage,\n\t\t\t\t\tstart: start\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.controllers.bar = Chart.DatasetController.extend({\n\n\t\t\t\t\tdataElementType: elements.Rectangle,\n\n\t\t\t\t\tinitialize: function initialize() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta;\n\n\t\t\t\t\t\tChart.DatasetController.prototype.initialize.apply(me, arguments);\n\n\t\t\t\t\t\tmeta = me.getMeta();\n\t\t\t\t\t\tmeta.stack = me.getDataset().stack;\n\t\t\t\t\t\tmeta.bar = true;\n\t\t\t\t\t},\n\n\t\t\t\t\tupdate: function update(reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar rects = me.getMeta().data;\n\t\t\t\t\t\tvar i, ilen;\n\n\t\t\t\t\t\tme._ruler = me.getRuler();\n\n\t\t\t\t\t\tfor (i = 0, ilen = rects.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tme.updateElement(rects[i], i, reset);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tupdateElement: function updateElement(rectangle, index, reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar custom = rectangle.custom || {};\n\t\t\t\t\t\tvar rectangleOptions = chart.options.elements.rectangle;\n\n\t\t\t\t\t\trectangle._xScale = me.getScaleForId(meta.xAxisID);\n\t\t\t\t\t\trectangle._yScale = me.getScaleForId(meta.yAxisID);\n\t\t\t\t\t\trectangle._datasetIndex = me.index;\n\t\t\t\t\t\trectangle._index = index;\n\n\t\t\t\t\t\trectangle._model = {\n\t\t\t\t\t\t\tdatasetLabel: dataset.label,\n\t\t\t\t\t\t\tlabel: chart.data.labels[index],\n\t\t\t\t\t\t\tborderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleOptions.borderSkipped,\n\t\t\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.backgroundColor, index, rectangleOptions.backgroundColor),\n\t\t\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.borderColor, index, rectangleOptions.borderColor),\n\t\t\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.borderWidth, index, rectangleOptions.borderWidth)\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tme.updateElementGeometry(rectangle, index, reset);\n\n\t\t\t\t\t\trectangle.pivot();\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tupdateElementGeometry: function updateElementGeometry(rectangle, index, reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar model = rectangle._model;\n\t\t\t\t\t\tvar vscale = me.getValueScale();\n\t\t\t\t\t\tvar base = vscale.getBasePixel();\n\t\t\t\t\t\tvar horizontal = vscale.isHorizontal();\n\t\t\t\t\t\tvar ruler = me._ruler || me.getRuler();\n\t\t\t\t\t\tvar vpixels = me.calculateBarValuePixels(me.index, index);\n\t\t\t\t\t\tvar ipixels = me.calculateBarIndexPixels(me.index, index, ruler);\n\n\t\t\t\t\t\tmodel.horizontal = horizontal;\n\t\t\t\t\t\tmodel.base = reset ? base : vpixels.base;\n\t\t\t\t\t\tmodel.x = horizontal ? reset ? base : vpixels.head : ipixels.center;\n\t\t\t\t\t\tmodel.y = horizontal ? ipixels.center : reset ? base : vpixels.head;\n\t\t\t\t\t\tmodel.height = horizontal ? ipixels.size : undefined;\n\t\t\t\t\t\tmodel.width = horizontal ? undefined : ipixels.size;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tgetValueScaleId: function getValueScaleId() {\n\t\t\t\t\t\treturn this.getMeta().yAxisID;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tgetIndexScaleId: function getIndexScaleId() {\n\t\t\t\t\t\treturn this.getMeta().xAxisID;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tgetValueScale: function getValueScale() {\n\t\t\t\t\t\treturn this.getScaleForId(this.getValueScaleId());\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tgetIndexScale: function getIndexScale() {\n\t\t\t\t\t\treturn this.getScaleForId(this.getIndexScaleId());\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Returns the stacks based on groups and bar visibility.\n * @param {Number} [last] - The dataset index\n * @returns {Array} The stack list\n * @private\n */\n\t\t\t\t\t_getStacks: function _getStacks(last) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar scale = me.getIndexScale();\n\t\t\t\t\t\tvar stacked = scale.options.stacked;\n\t\t\t\t\t\tvar ilen = last === undefined ? chart.data.datasets.length : last + 1;\n\t\t\t\t\t\tvar stacks = [];\n\t\t\t\t\t\tvar i, meta;\n\n\t\t\t\t\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\t\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t\t\t\tif (meta.bar && chart.isDatasetVisible(i) && (stacked === false || stacked === true && stacks.indexOf(meta.stack) === -1 || stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1))) {\n\t\t\t\t\t\t\t\tstacks.push(meta.stack);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn stacks;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Returns the effective number of stacks based on groups and bar visibility.\n * @private\n */\n\t\t\t\t\tgetStackCount: function getStackCount() {\n\t\t\t\t\t\treturn this._getStacks().length;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Returns the stack index for the given dataset based on groups and bar visibility.\n * @param {Number} [datasetIndex] - The dataset index\n * @param {String} [name] - The stack name to find\n * @returns {Number} The stack index\n * @private\n */\n\t\t\t\t\tgetStackIndex: function getStackIndex(datasetIndex, name) {\n\t\t\t\t\t\tvar stacks = this._getStacks(datasetIndex);\n\t\t\t\t\t\tvar index = name !== undefined ? stacks.indexOf(name) : -1; // indexOf returns -1 if element is not present\n\n\t\t\t\t\t\treturn index === -1 ? stacks.length - 1 : index;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tgetRuler: function getRuler() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar scale = me.getIndexScale();\n\t\t\t\t\t\tvar stackCount = me.getStackCount();\n\t\t\t\t\t\tvar datasetIndex = me.index;\n\t\t\t\t\t\tvar isHorizontal = scale.isHorizontal();\n\t\t\t\t\t\tvar start = isHorizontal ? scale.left : scale.top;\n\t\t\t\t\t\tvar end = start + (isHorizontal ? scale.width : scale.height);\n\t\t\t\t\t\tvar pixels = [];\n\t\t\t\t\t\tvar i, ilen, min;\n\n\t\t\t\t\t\tfor (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tpixels.push(scale.getPixelForValue(null, i, datasetIndex));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmin = helpers.isNullOrUndef(scale.options.barThickness) ? computeMinSampleSize(scale, pixels) : -1;\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tmin: min,\n\t\t\t\t\t\t\tpixels: pixels,\n\t\t\t\t\t\t\tstart: start,\n\t\t\t\t\t\t\tend: end,\n\t\t\t\t\t\t\tstackCount: stackCount,\n\t\t\t\t\t\t\tscale: scale\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Note: pixel values are not clamped to the scale area.\n * @private\n */\n\t\t\t\t\tcalculateBarValuePixels: function calculateBarValuePixels(datasetIndex, index) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar scale = me.getValueScale();\n\t\t\t\t\t\tvar datasets = chart.data.datasets;\n\t\t\t\t\t\tvar value = scale.getRightValue(datasets[datasetIndex].data[index]);\n\t\t\t\t\t\tvar stacked = scale.options.stacked;\n\t\t\t\t\t\tvar stack = meta.stack;\n\t\t\t\t\t\tvar start = 0;\n\t\t\t\t\t\tvar i, imeta, ivalue, base, head, size;\n\n\t\t\t\t\t\tif (stacked || stacked === undefined && stack !== undefined) {\n\t\t\t\t\t\t\tfor (i = 0; i < datasetIndex; ++i) {\n\t\t\t\t\t\t\t\timeta = chart.getDatasetMeta(i);\n\n\t\t\t\t\t\t\t\tif (imeta.bar && imeta.stack === stack && imeta.controller.getValueScaleId() === scale.id && chart.isDatasetVisible(i)) {\n\n\t\t\t\t\t\t\t\t\tivalue = scale.getRightValue(datasets[i].data[index]);\n\t\t\t\t\t\t\t\t\tif (value < 0 && ivalue < 0 || value >= 0 && ivalue > 0) {\n\t\t\t\t\t\t\t\t\t\tstart += ivalue;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbase = scale.getPixelForValue(start);\n\t\t\t\t\t\thead = scale.getPixelForValue(start + value);\n\t\t\t\t\t\tsize = (head - base) / 2;\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tsize: size,\n\t\t\t\t\t\t\tbase: base,\n\t\t\t\t\t\t\thead: head,\n\t\t\t\t\t\t\tcenter: head + size / 2\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tcalculateBarIndexPixels: function calculateBarIndexPixels(datasetIndex, index, ruler) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar options = ruler.scale.options;\n\t\t\t\t\t\tvar range = options.barThickness === 'flex' ? computeFlexCategoryTraits(index, ruler, options) : computeFitCategoryTraits(index, ruler, options);\n\n\t\t\t\t\t\tvar stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack);\n\t\t\t\t\t\tvar center = range.start + range.chunk * stackIndex + range.chunk / 2;\n\t\t\t\t\t\tvar size = Math.min(helpers.valueOrDefault(options.maxBarThickness, Infinity), range.chunk * range.ratio);\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tbase: center - size / 2,\n\t\t\t\t\t\t\thead: center + size / 2,\n\t\t\t\t\t\t\tcenter: center,\n\t\t\t\t\t\t\tsize: size\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\n\t\t\t\t\tdraw: function draw() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar scale = me.getValueScale();\n\t\t\t\t\t\tvar rects = me.getMeta().data;\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar ilen = rects.length;\n\t\t\t\t\t\tvar i = 0;\n\n\t\t\t\t\t\thelpers.canvas.clipArea(chart.ctx, chart.chartArea);\n\n\t\t\t\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\t\t\t\tif (!isNaN(scale.getRightValue(dataset.data[i]))) {\n\t\t\t\t\t\t\t\trects[i].draw();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thelpers.canvas.unclipArea(chart.ctx);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tChart.controllers.horizontalBar = Chart.controllers.bar.extend({\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tgetValueScaleId: function getValueScaleId() {\n\t\t\t\t\t\treturn this.getMeta().xAxisID;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tgetIndexScaleId: function getIndexScaleId() {\n\t\t\t\t\t\treturn this.getMeta().yAxisID;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t}, { \"26\": 26, \"41\": 41, \"46\": 46 }], 16: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar elements = require(41);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('bubble', {\n\t\t\t\thover: {\n\t\t\t\t\tmode: 'single'\n\t\t\t\t},\n\n\t\t\t\tscales: {\n\t\t\t\t\txAxes: [{\n\t\t\t\t\t\ttype: 'linear', // bubble should probably use a linear scale by default\n\t\t\t\t\t\tposition: 'bottom',\n\t\t\t\t\t\tid: 'x-axis-0' // need an ID so datasets can reference the scale\n\t\t\t\t\t}],\n\t\t\t\t\tyAxes: [{\n\t\t\t\t\t\ttype: 'linear',\n\t\t\t\t\t\tposition: 'left',\n\t\t\t\t\t\tid: 'y-axis-0'\n\t\t\t\t\t}]\n\t\t\t\t},\n\n\t\t\t\ttooltips: {\n\t\t\t\t\tcallbacks: {\n\t\t\t\t\t\ttitle: function title() {\n\t\t\t\t\t\t\t// Title doesn't make sense for scatter since we format the data as a point\n\t\t\t\t\t\t\treturn '';\n\t\t\t\t\t\t},\n\t\t\t\t\t\tlabel: function label(item, data) {\n\t\t\t\t\t\t\tvar datasetLabel = data.datasets[item.datasetIndex].label || '';\n\t\t\t\t\t\t\tvar dataPoint = data.datasets[item.datasetIndex].data[item.index];\n\t\t\t\t\t\t\treturn datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.controllers.bubble = Chart.DatasetController.extend({\n\t\t\t\t\t/**\n * @protected\n */\n\t\t\t\t\tdataElementType: elements.Point,\n\n\t\t\t\t\t/**\n * @protected\n */\n\t\t\t\t\tupdate: function update(reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar points = meta.data;\n\n\t\t\t\t\t\t// Update Points\n\t\t\t\t\t\thelpers.each(points, function (point, index) {\n\t\t\t\t\t\t\tme.updateElement(point, index, reset);\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @protected\n */\n\t\t\t\t\tupdateElement: function updateElement(point, index, reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar custom = point.custom || {};\n\t\t\t\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\t\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\t\t\t\tvar options = me._resolveElementOptions(point, index);\n\t\t\t\t\t\tvar data = me.getDataset().data[index];\n\t\t\t\t\t\tvar dsIndex = me.index;\n\n\t\t\t\t\t\tvar x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue((typeof data === \"undefined\" ? \"undefined\" : _typeof(data)) === 'object' ? data : NaN, index, dsIndex);\n\t\t\t\t\t\tvar y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex);\n\n\t\t\t\t\t\tpoint._xScale = xScale;\n\t\t\t\t\t\tpoint._yScale = yScale;\n\t\t\t\t\t\tpoint._options = options;\n\t\t\t\t\t\tpoint._datasetIndex = dsIndex;\n\t\t\t\t\t\tpoint._index = index;\n\t\t\t\t\t\tpoint._model = {\n\t\t\t\t\t\t\tbackgroundColor: options.backgroundColor,\n\t\t\t\t\t\t\tborderColor: options.borderColor,\n\t\t\t\t\t\t\tborderWidth: options.borderWidth,\n\t\t\t\t\t\t\thitRadius: options.hitRadius,\n\t\t\t\t\t\t\tpointStyle: options.pointStyle,\n\t\t\t\t\t\t\trotation: options.rotation,\n\t\t\t\t\t\t\tradius: reset ? 0 : options.radius,\n\t\t\t\t\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\n\t\t\t\t\t\t\tx: x,\n\t\t\t\t\t\t\ty: y\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tpoint.pivot();\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @protected\n */\n\t\t\t\t\tsetHoverStyle: function setHoverStyle(point) {\n\t\t\t\t\t\tvar model = point._model;\n\t\t\t\t\t\tvar options = point._options;\n\t\t\t\t\t\tpoint.$previousStyle = {\n\t\t\t\t\t\t\tbackgroundColor: model.backgroundColor,\n\t\t\t\t\t\t\tborderColor: model.borderColor,\n\t\t\t\t\t\t\tborderWidth: model.borderWidth,\n\t\t\t\t\t\t\tradius: model.radius\n\t\t\t\t\t\t};\n\t\t\t\t\t\tmodel.backgroundColor = helpers.valueOrDefault(options.hoverBackgroundColor, helpers.getHoverColor(options.backgroundColor));\n\t\t\t\t\t\tmodel.borderColor = helpers.valueOrDefault(options.hoverBorderColor, helpers.getHoverColor(options.borderColor));\n\t\t\t\t\t\tmodel.borderWidth = helpers.valueOrDefault(options.hoverBorderWidth, options.borderWidth);\n\t\t\t\t\t\tmodel.radius = options.radius + options.hoverRadius;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\t_resolveElementOptions: function _resolveElementOptions(point, index) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar datasets = chart.data.datasets;\n\t\t\t\t\t\tvar dataset = datasets[me.index];\n\t\t\t\t\t\tvar custom = point.custom || {};\n\t\t\t\t\t\tvar options = chart.options.elements.point;\n\t\t\t\t\t\tvar resolve = helpers.options.resolve;\n\t\t\t\t\t\tvar data = dataset.data[index];\n\t\t\t\t\t\tvar values = {};\n\t\t\t\t\t\tvar i, ilen, key;\n\n\t\t\t\t\t\t// Scriptable options\n\t\t\t\t\t\tvar context = {\n\t\t\t\t\t\t\tchart: chart,\n\t\t\t\t\t\t\tdataIndex: index,\n\t\t\t\t\t\t\tdataset: dataset,\n\t\t\t\t\t\t\tdatasetIndex: me.index\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tvar keys = ['backgroundColor', 'borderColor', 'borderWidth', 'hoverBackgroundColor', 'hoverBorderColor', 'hoverBorderWidth', 'hoverRadius', 'hitRadius', 'pointStyle', 'rotation'];\n\n\t\t\t\t\t\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tkey = keys[i];\n\t\t\t\t\t\t\tvalues[key] = resolve([custom[key], dataset[key], options[key]], context, index);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Custom radius resolution\n\t\t\t\t\t\tvalues.radius = resolve([custom.radius, data ? data.r : undefined, dataset.radius, options.radius], context, index);\n\t\t\t\t\t\treturn values;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t}, { \"26\": 26, \"41\": 41, \"46\": 46 }], 17: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar elements = require(41);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('doughnut', {\n\t\t\t\tanimation: {\n\t\t\t\t\t// Boolean - Whether we animate the rotation of the Doughnut\n\t\t\t\t\tanimateRotate: true,\n\t\t\t\t\t// Boolean - Whether we animate scaling the Doughnut from the centre\n\t\t\t\t\tanimateScale: false\n\t\t\t\t},\n\t\t\t\thover: {\n\t\t\t\t\tmode: 'single'\n\t\t\t\t},\n\t\t\t\tlegendCallback: function legendCallback(chart) {\n\t\t\t\t\tvar text = [];\n\t\t\t\t\ttext.push('<ul class=\"' + chart.id + '-legend\">');\n\n\t\t\t\t\tvar data = chart.data;\n\t\t\t\t\tvar datasets = data.datasets;\n\t\t\t\t\tvar labels = data.labels;\n\n\t\t\t\t\tif (datasets.length) {\n\t\t\t\t\t\tfor (var i = 0; i < datasets[0].data.length; ++i) {\n\t\t\t\t\t\t\ttext.push('<li><span style=\"background-color:' + datasets[0].backgroundColor[i] + '\"></span>');\n\t\t\t\t\t\t\tif (labels[i]) {\n\t\t\t\t\t\t\t\ttext.push(labels[i]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttext.push('</li>');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\ttext.push('</ul>');\n\t\t\t\t\treturn text.join('');\n\t\t\t\t},\n\t\t\t\tlegend: {\n\t\t\t\t\tlabels: {\n\t\t\t\t\t\tgenerateLabels: function generateLabels(chart) {\n\t\t\t\t\t\t\tvar data = chart.data;\n\t\t\t\t\t\t\tif (data.labels.length && data.datasets.length) {\n\t\t\t\t\t\t\t\treturn data.labels.map(function (label, i) {\n\t\t\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\n\t\t\t\t\t\t\t\t\tvar ds = data.datasets[0];\n\t\t\t\t\t\t\t\t\tvar arc = meta.data[i];\n\t\t\t\t\t\t\t\t\tvar custom = arc && arc.custom || {};\n\t\t\t\t\t\t\t\t\tvar valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\t\t\t\t\t\t\tvar arcOpts = chart.options.elements.arc;\n\t\t\t\t\t\t\t\t\tvar fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n\t\t\t\t\t\t\t\t\tvar stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n\t\t\t\t\t\t\t\t\tvar bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\ttext: label,\n\t\t\t\t\t\t\t\t\t\tfillStyle: fill,\n\t\t\t\t\t\t\t\t\t\tstrokeStyle: stroke,\n\t\t\t\t\t\t\t\t\t\tlineWidth: bw,\n\t\t\t\t\t\t\t\t\t\thidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n\t\t\t\t\t\t\t\t\t\t// Extra data used for toggling the correct item\n\t\t\t\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn [];\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tonClick: function onClick(e, legendItem) {\n\t\t\t\t\t\tvar index = legendItem.index;\n\t\t\t\t\t\tvar chart = this.chart;\n\t\t\t\t\t\tvar i, ilen, meta;\n\n\t\t\t\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t\t\t\t// toggle visibility of index if exists\n\t\t\t\t\t\t\tif (meta.data[index]) {\n\t\t\t\t\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tchart.update();\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t// The percentage of the chart that we cut out of the middle.\n\t\t\t\tcutoutPercentage: 50,\n\n\t\t\t\t// The rotation of the chart, where the first data arc begins.\n\t\t\t\trotation: Math.PI * -0.5,\n\n\t\t\t\t// The total circumference of the chart.\n\t\t\t\tcircumference: Math.PI * 2.0,\n\n\t\t\t\t// Need to override these to give a nice default\n\t\t\t\ttooltips: {\n\t\t\t\t\tcallbacks: {\n\t\t\t\t\t\ttitle: function title() {\n\t\t\t\t\t\t\treturn '';\n\t\t\t\t\t\t},\n\t\t\t\t\t\tlabel: function label(tooltipItem, data) {\n\t\t\t\t\t\t\tvar dataLabel = data.labels[tooltipItem.index];\n\t\t\t\t\t\t\tvar value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];\n\n\t\t\t\t\t\t\tif (helpers.isArray(dataLabel)) {\n\t\t\t\t\t\t\t\t// show value on first line of multiline label\n\t\t\t\t\t\t\t\t// need to clone because we are changing the value\n\t\t\t\t\t\t\t\tdataLabel = dataLabel.slice();\n\t\t\t\t\t\t\t\tdataLabel[0] += value;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdataLabel += value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn dataLabel;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdefaults._set('pie', helpers.clone(defaults.doughnut));\n\t\t\tdefaults._set('pie', {\n\t\t\t\tcutoutPercentage: 0\n\t\t\t});\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({\n\n\t\t\t\t\tdataElementType: elements.Arc,\n\n\t\t\t\t\tlinkScales: helpers.noop,\n\n\t\t\t\t\t// Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly\n\t\t\t\t\tgetRingIndex: function getRingIndex(datasetIndex) {\n\t\t\t\t\t\tvar ringIndex = 0;\n\n\t\t\t\t\t\tfor (var j = 0; j < datasetIndex; ++j) {\n\t\t\t\t\t\t\tif (this.chart.isDatasetVisible(j)) {\n\t\t\t\t\t\t\t\t++ringIndex;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn ringIndex;\n\t\t\t\t\t},\n\n\t\t\t\t\tupdate: function update(reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar chartArea = chart.chartArea;\n\t\t\t\t\t\tvar opts = chart.options;\n\t\t\t\t\t\tvar arcOpts = opts.elements.arc;\n\t\t\t\t\t\tvar availableWidth = chartArea.right - chartArea.left - arcOpts.borderWidth;\n\t\t\t\t\t\tvar availableHeight = chartArea.bottom - chartArea.top - arcOpts.borderWidth;\n\t\t\t\t\t\tvar minSize = Math.min(availableWidth, availableHeight);\n\t\t\t\t\t\tvar offset = { x: 0, y: 0 };\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar cutoutPercentage = opts.cutoutPercentage;\n\t\t\t\t\t\tvar circumference = opts.circumference;\n\n\t\t\t\t\t\t// If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc\n\t\t\t\t\t\tif (circumference < Math.PI * 2.0) {\n\t\t\t\t\t\t\tvar startAngle = opts.rotation % (Math.PI * 2.0);\n\t\t\t\t\t\t\tstartAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0);\n\t\t\t\t\t\t\tvar endAngle = startAngle + circumference;\n\t\t\t\t\t\t\tvar start = { x: Math.cos(startAngle), y: Math.sin(startAngle) };\n\t\t\t\t\t\t\tvar end = { x: Math.cos(endAngle), y: Math.sin(endAngle) };\n\t\t\t\t\t\t\tvar contains0 = startAngle <= 0 && endAngle >= 0 || startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle;\n\t\t\t\t\t\t\tvar contains90 = startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle || startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle;\n\t\t\t\t\t\t\tvar contains180 = startAngle <= -Math.PI && -Math.PI <= endAngle || startAngle <= Math.PI && Math.PI <= endAngle;\n\t\t\t\t\t\t\tvar contains270 = startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle || startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle;\n\t\t\t\t\t\t\tvar cutout = cutoutPercentage / 100.0;\n\t\t\t\t\t\t\tvar min = { x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout)) };\n\t\t\t\t\t\t\tvar max = { x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout)) };\n\t\t\t\t\t\t\tvar size = { width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5 };\n\t\t\t\t\t\t\tminSize = Math.min(availableWidth / size.width, availableHeight / size.height);\n\t\t\t\t\t\t\toffset = { x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5 };\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tchart.borderWidth = me.getMaxBorderWidth(meta.data);\n\t\t\t\t\t\tchart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0);\n\t\t\t\t\t\tchart.innerRadius = Math.max(cutoutPercentage ? chart.outerRadius / 100 * cutoutPercentage : 0, 0);\n\t\t\t\t\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\t\t\t\t\t\tchart.offsetX = offset.x * chart.outerRadius;\n\t\t\t\t\t\tchart.offsetY = offset.y * chart.outerRadius;\n\n\t\t\t\t\t\tmeta.total = me.calculateTotal();\n\n\t\t\t\t\t\tme.outerRadius = chart.outerRadius - chart.radiusLength * me.getRingIndex(me.index);\n\t\t\t\t\t\tme.innerRadius = Math.max(me.outerRadius - chart.radiusLength, 0);\n\n\t\t\t\t\t\thelpers.each(meta.data, function (arc, index) {\n\t\t\t\t\t\t\tme.updateElement(arc, index, reset);\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\n\t\t\t\t\tupdateElement: function updateElement(arc, index, reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar chartArea = chart.chartArea;\n\t\t\t\t\t\tvar opts = chart.options;\n\t\t\t\t\t\tvar animationOpts = opts.animation;\n\t\t\t\t\t\tvar centerX = (chartArea.left + chartArea.right) / 2;\n\t\t\t\t\t\tvar centerY = (chartArea.top + chartArea.bottom) / 2;\n\t\t\t\t\t\tvar startAngle = opts.rotation; // non reset case handled later\n\t\t\t\t\t\tvar endAngle = opts.rotation; // non reset case handled later\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI));\n\t\t\t\t\t\tvar innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius;\n\t\t\t\t\t\tvar outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius;\n\t\t\t\t\t\tvar valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\n\t\t\t\t\t\thelpers.extend(arc, {\n\t\t\t\t\t\t\t// Utility\n\t\t\t\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t\t\t\t_index: index,\n\n\t\t\t\t\t\t\t// Desired view properties\n\t\t\t\t\t\t\t_model: {\n\t\t\t\t\t\t\t\tx: centerX + chart.offsetX,\n\t\t\t\t\t\t\t\ty: centerY + chart.offsetY,\n\t\t\t\t\t\t\t\tstartAngle: startAngle,\n\t\t\t\t\t\t\t\tendAngle: endAngle,\n\t\t\t\t\t\t\t\tcircumference: circumference,\n\t\t\t\t\t\t\t\touterRadius: outerRadius,\n\t\t\t\t\t\t\t\tinnerRadius: innerRadius,\n\t\t\t\t\t\t\t\tlabel: valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tvar model = arc._model;\n\n\t\t\t\t\t\t// Resets the visual styles\n\t\t\t\t\t\tvar custom = arc.custom || {};\n\t\t\t\t\t\tvar valueOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\t\t\t\tvar elementOpts = this.chart.options.elements.arc;\n\t\t\t\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor);\n\t\t\t\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : valueOrDefault(dataset.borderColor, index, elementOpts.borderColor);\n\t\t\t\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : valueOrDefault(dataset.borderWidth, index, elementOpts.borderWidth);\n\n\t\t\t\t\t\t// Set correct angles if not resetting\n\t\t\t\t\t\tif (!reset || !animationOpts.animateRotate) {\n\t\t\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\t\t\tmodel.startAngle = opts.rotation;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tmodel.startAngle = me.getMeta().data[index - 1]._model.endAngle;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tmodel.endAngle = model.startAngle + model.circumference;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tarc.pivot();\n\t\t\t\t\t},\n\n\t\t\t\t\tcalculateTotal: function calculateTotal() {\n\t\t\t\t\t\tvar dataset = this.getDataset();\n\t\t\t\t\t\tvar meta = this.getMeta();\n\t\t\t\t\t\tvar total = 0;\n\t\t\t\t\t\tvar value;\n\n\t\t\t\t\t\thelpers.each(meta.data, function (element, index) {\n\t\t\t\t\t\t\tvalue = dataset.data[index];\n\t\t\t\t\t\t\tif (!isNaN(value) && !element.hidden) {\n\t\t\t\t\t\t\t\ttotal += Math.abs(value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t/* if (total === 0) {\n \ttotal = NaN;\n }*/\n\n\t\t\t\t\t\treturn total;\n\t\t\t\t\t},\n\n\t\t\t\t\tcalculateCircumference: function calculateCircumference(value) {\n\t\t\t\t\t\tvar total = this.getMeta().total;\n\t\t\t\t\t\tif (total > 0 && !isNaN(value)) {\n\t\t\t\t\t\t\treturn Math.PI * 2.0 * (Math.abs(value) / total);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t},\n\n\t\t\t\t\t// gets the max border or hover width to properly scale pie charts\n\t\t\t\t\tgetMaxBorderWidth: function getMaxBorderWidth(arcs) {\n\t\t\t\t\t\tvar max = 0;\n\t\t\t\t\t\tvar index = this.index;\n\t\t\t\t\t\tvar length = arcs.length;\n\t\t\t\t\t\tvar borderWidth;\n\t\t\t\t\t\tvar hoverWidth;\n\n\t\t\t\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\t\t\t\tborderWidth = arcs[i]._model ? arcs[i]._model.borderWidth : 0;\n\t\t\t\t\t\t\thoverWidth = arcs[i]._chart ? arcs[i]._chart.config.data.datasets[index].hoverBorderWidth : 0;\n\n\t\t\t\t\t\t\tmax = borderWidth > max ? borderWidth : max;\n\t\t\t\t\t\t\tmax = hoverWidth > max ? hoverWidth : max;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn max;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t}, { \"26\": 26, \"41\": 41, \"46\": 46 }], 18: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar elements = require(41);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('line', {\n\t\t\t\tshowLines: true,\n\t\t\t\tspanGaps: false,\n\n\t\t\t\thover: {\n\t\t\t\t\tmode: 'label'\n\t\t\t\t},\n\n\t\t\t\tscales: {\n\t\t\t\t\txAxes: [{\n\t\t\t\t\t\ttype: 'category',\n\t\t\t\t\t\tid: 'x-axis-0'\n\t\t\t\t\t}],\n\t\t\t\t\tyAxes: [{\n\t\t\t\t\t\ttype: 'linear',\n\t\t\t\t\t\tid: 'y-axis-0'\n\t\t\t\t\t}]\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tfunction lineEnabled(dataset, options) {\n\t\t\t\t\treturn helpers.valueOrDefault(dataset.showLine, options.showLines);\n\t\t\t\t}\n\n\t\t\t\tChart.controllers.line = Chart.DatasetController.extend({\n\n\t\t\t\t\tdatasetElementType: elements.Line,\n\n\t\t\t\t\tdataElementType: elements.Point,\n\n\t\t\t\t\tupdate: function update(reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar line = meta.dataset;\n\t\t\t\t\t\tvar points = meta.data || [];\n\t\t\t\t\t\tvar options = me.chart.options;\n\t\t\t\t\t\tvar lineElementOptions = options.elements.line;\n\t\t\t\t\t\tvar scale = me.getScaleForId(meta.yAxisID);\n\t\t\t\t\t\tvar i, ilen, custom;\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar showLine = lineEnabled(dataset, options);\n\n\t\t\t\t\t\t// Update Line\n\t\t\t\t\t\tif (showLine) {\n\t\t\t\t\t\t\tcustom = line.custom || {};\n\n\t\t\t\t\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\t\t\t\t\tif (dataset.tension !== undefined && dataset.lineTension === undefined) {\n\t\t\t\t\t\t\t\tdataset.lineTension = dataset.tension;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Utility\n\t\t\t\t\t\t\tline._scale = scale;\n\t\t\t\t\t\t\tline._datasetIndex = me.index;\n\t\t\t\t\t\t\t// Data\n\t\t\t\t\t\t\tline._children = points;\n\t\t\t\t\t\t\t// Model\n\t\t\t\t\t\t\tline._model = {\n\t\t\t\t\t\t\t\t// Appearance\n\t\t\t\t\t\t\t\t// The default behavior of lines is to break at null values, according\n\t\t\t\t\t\t\t\t// to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158\n\t\t\t\t\t\t\t\t// This option gives lines the ability to span gaps\n\t\t\t\t\t\t\t\tspanGaps: dataset.spanGaps ? dataset.spanGaps : options.spanGaps,\n\t\t\t\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension),\n\t\t\t\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : dataset.backgroundColor || lineElementOptions.backgroundColor,\n\t\t\t\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : dataset.borderWidth || lineElementOptions.borderWidth,\n\t\t\t\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : dataset.borderColor || lineElementOptions.borderColor,\n\t\t\t\t\t\t\t\tborderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : dataset.borderCapStyle || lineElementOptions.borderCapStyle,\n\t\t\t\t\t\t\t\tborderDash: custom.borderDash ? custom.borderDash : dataset.borderDash || lineElementOptions.borderDash,\n\t\t\t\t\t\t\t\tborderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : dataset.borderDashOffset || lineElementOptions.borderDashOffset,\n\t\t\t\t\t\t\t\tborderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : dataset.borderJoinStyle || lineElementOptions.borderJoinStyle,\n\t\t\t\t\t\t\t\tfill: custom.fill ? custom.fill : dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill,\n\t\t\t\t\t\t\t\tsteppedLine: custom.steppedLine ? custom.steppedLine : helpers.valueOrDefault(dataset.steppedLine, lineElementOptions.stepped),\n\t\t\t\t\t\t\t\tcubicInterpolationMode: custom.cubicInterpolationMode ? custom.cubicInterpolationMode : helpers.valueOrDefault(dataset.cubicInterpolationMode, lineElementOptions.cubicInterpolationMode)\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tline.pivot();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Update Points\n\t\t\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tme.updateElement(points[i], i, reset);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (showLine && line._model.tension !== 0) {\n\t\t\t\t\t\t\tme.updateBezierControlPoints();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Now pivot the point for animation\n\t\t\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tpoints[i].pivot();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tgetPointBackgroundColor: function getPointBackgroundColor(point, index) {\n\t\t\t\t\t\tvar backgroundColor = this.chart.options.elements.point.backgroundColor;\n\t\t\t\t\t\tvar dataset = this.getDataset();\n\t\t\t\t\t\tvar custom = point.custom || {};\n\n\t\t\t\t\t\tif (custom.backgroundColor) {\n\t\t\t\t\t\t\tbackgroundColor = custom.backgroundColor;\n\t\t\t\t\t\t} else if (dataset.pointBackgroundColor) {\n\t\t\t\t\t\t\tbackgroundColor = helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, backgroundColor);\n\t\t\t\t\t\t} else if (dataset.backgroundColor) {\n\t\t\t\t\t\t\tbackgroundColor = dataset.backgroundColor;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn backgroundColor;\n\t\t\t\t\t},\n\n\t\t\t\t\tgetPointBorderColor: function getPointBorderColor(point, index) {\n\t\t\t\t\t\tvar borderColor = this.chart.options.elements.point.borderColor;\n\t\t\t\t\t\tvar dataset = this.getDataset();\n\t\t\t\t\t\tvar custom = point.custom || {};\n\n\t\t\t\t\t\tif (custom.borderColor) {\n\t\t\t\t\t\t\tborderColor = custom.borderColor;\n\t\t\t\t\t\t} else if (dataset.pointBorderColor) {\n\t\t\t\t\t\t\tborderColor = helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, borderColor);\n\t\t\t\t\t\t} else if (dataset.borderColor) {\n\t\t\t\t\t\t\tborderColor = dataset.borderColor;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn borderColor;\n\t\t\t\t\t},\n\n\t\t\t\t\tgetPointBorderWidth: function getPointBorderWidth(point, index) {\n\t\t\t\t\t\tvar borderWidth = this.chart.options.elements.point.borderWidth;\n\t\t\t\t\t\tvar dataset = this.getDataset();\n\t\t\t\t\t\tvar custom = point.custom || {};\n\n\t\t\t\t\t\tif (!isNaN(custom.borderWidth)) {\n\t\t\t\t\t\t\tborderWidth = custom.borderWidth;\n\t\t\t\t\t\t} else if (!isNaN(dataset.pointBorderWidth) || helpers.isArray(dataset.pointBorderWidth)) {\n\t\t\t\t\t\t\tborderWidth = helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, borderWidth);\n\t\t\t\t\t\t} else if (!isNaN(dataset.borderWidth)) {\n\t\t\t\t\t\t\tborderWidth = dataset.borderWidth;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn borderWidth;\n\t\t\t\t\t},\n\n\t\t\t\t\tgetPointRotation: function getPointRotation(point, index) {\n\t\t\t\t\t\tvar pointRotation = this.chart.options.elements.point.rotation;\n\t\t\t\t\t\tvar dataset = this.getDataset();\n\t\t\t\t\t\tvar custom = point.custom || {};\n\n\t\t\t\t\t\tif (!isNaN(custom.rotation)) {\n\t\t\t\t\t\t\tpointRotation = custom.rotation;\n\t\t\t\t\t\t} else if (!isNaN(dataset.pointRotation) || helpers.isArray(dataset.pointRotation)) {\n\t\t\t\t\t\t\tpointRotation = helpers.valueAtIndexOrDefault(dataset.pointRotation, index, pointRotation);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn pointRotation;\n\t\t\t\t\t},\n\n\t\t\t\t\tupdateElement: function updateElement(point, index, reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar custom = point.custom || {};\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar datasetIndex = me.index;\n\t\t\t\t\t\tvar value = dataset.data[index];\n\t\t\t\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\t\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\t\t\t\tvar pointOptions = me.chart.options.elements.point;\n\t\t\t\t\t\tvar x, y;\n\n\t\t\t\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\t\t\t\tif (dataset.radius !== undefined && dataset.pointRadius === undefined) {\n\t\t\t\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (dataset.hitRadius !== undefined && dataset.pointHitRadius === undefined) {\n\t\t\t\t\t\t\tdataset.pointHitRadius = dataset.hitRadius;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tx = xScale.getPixelForValue((typeof value === \"undefined\" ? \"undefined\" : _typeof(value)) === 'object' ? value : NaN, index, datasetIndex);\n\t\t\t\t\t\ty = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);\n\n\t\t\t\t\t\t// Utility\n\t\t\t\t\t\tpoint._xScale = xScale;\n\t\t\t\t\t\tpoint._yScale = yScale;\n\t\t\t\t\t\tpoint._datasetIndex = datasetIndex;\n\t\t\t\t\t\tpoint._index = index;\n\n\t\t\t\t\t\t// Desired view properties\n\t\t\t\t\t\tpoint._model = {\n\t\t\t\t\t\t\tx: x,\n\t\t\t\t\t\t\ty: y,\n\t\t\t\t\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\n\t\t\t\t\t\t\t// Appearance\n\t\t\t\t\t\t\tradius: custom.radius || helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointOptions.radius),\n\t\t\t\t\t\t\tpointStyle: custom.pointStyle || helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointOptions.pointStyle),\n\t\t\t\t\t\t\trotation: me.getPointRotation(point, index),\n\t\t\t\t\t\t\tbackgroundColor: me.getPointBackgroundColor(point, index),\n\t\t\t\t\t\t\tborderColor: me.getPointBorderColor(point, index),\n\t\t\t\t\t\t\tborderWidth: me.getPointBorderWidth(point, index),\n\t\t\t\t\t\t\ttension: meta.dataset._model ? meta.dataset._model.tension : 0,\n\t\t\t\t\t\t\tsteppedLine: meta.dataset._model ? meta.dataset._model.steppedLine : false,\n\t\t\t\t\t\t\t// Tooltip\n\t\t\t\t\t\t\thitRadius: custom.hitRadius || helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointOptions.hitRadius)\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\n\t\t\t\t\tcalculatePointY: function calculatePointY(value, index, datasetIndex) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\t\t\t\tvar sumPos = 0;\n\t\t\t\t\t\tvar sumNeg = 0;\n\t\t\t\t\t\tvar i, ds, dsMeta;\n\n\t\t\t\t\t\tif (yScale.options.stacked) {\n\t\t\t\t\t\t\tfor (i = 0; i < datasetIndex; i++) {\n\t\t\t\t\t\t\t\tds = chart.data.datasets[i];\n\t\t\t\t\t\t\t\tdsMeta = chart.getDatasetMeta(i);\n\t\t\t\t\t\t\t\tif (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) {\n\t\t\t\t\t\t\t\t\tvar stackedRightValue = Number(yScale.getRightValue(ds.data[index]));\n\t\t\t\t\t\t\t\t\tif (stackedRightValue < 0) {\n\t\t\t\t\t\t\t\t\t\tsumNeg += stackedRightValue || 0;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tsumPos += stackedRightValue || 0;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar rightValue = Number(yScale.getRightValue(value));\n\t\t\t\t\t\t\tif (rightValue < 0) {\n\t\t\t\t\t\t\t\treturn yScale.getPixelForValue(sumNeg + rightValue);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn yScale.getPixelForValue(sumPos + rightValue);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn yScale.getPixelForValue(value);\n\t\t\t\t\t},\n\n\t\t\t\t\tupdateBezierControlPoints: function updateBezierControlPoints() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar area = me.chart.chartArea;\n\t\t\t\t\t\tvar points = meta.data || [];\n\t\t\t\t\t\tvar i, ilen, point, model, controlPoints;\n\n\t\t\t\t\t\t// Only consider points that are drawn in case the spanGaps option is used\n\t\t\t\t\t\tif (meta.dataset._model.spanGaps) {\n\t\t\t\t\t\t\tpoints = points.filter(function (pt) {\n\t\t\t\t\t\t\t\treturn !pt._model.skip;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfunction capControlPoint(pt, min, max) {\n\t\t\t\t\t\t\treturn Math.max(Math.min(pt, max), min);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (meta.dataset._model.cubicInterpolationMode === 'monotone') {\n\t\t\t\t\t\t\thelpers.splineCurveMonotone(points);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\t\t\t\tpoint = points[i];\n\t\t\t\t\t\t\t\tmodel = point._model;\n\t\t\t\t\t\t\t\tcontrolPoints = helpers.splineCurve(helpers.previousItem(points, i)._model, model, helpers.nextItem(points, i)._model, meta.dataset._model.tension);\n\t\t\t\t\t\t\t\tmodel.controlPointPreviousX = controlPoints.previous.x;\n\t\t\t\t\t\t\t\tmodel.controlPointPreviousY = controlPoints.previous.y;\n\t\t\t\t\t\t\t\tmodel.controlPointNextX = controlPoints.next.x;\n\t\t\t\t\t\t\t\tmodel.controlPointNextY = controlPoints.next.y;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (me.chart.options.elements.line.capBezierPoints) {\n\t\t\t\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\t\t\t\tmodel = points[i]._model;\n\t\t\t\t\t\t\t\tmodel.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right);\n\t\t\t\t\t\t\t\tmodel.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom);\n\t\t\t\t\t\t\t\tmodel.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right);\n\t\t\t\t\t\t\t\tmodel.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tdraw: function draw() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar points = meta.data || [];\n\t\t\t\t\t\tvar area = chart.chartArea;\n\t\t\t\t\t\tvar ilen = points.length;\n\t\t\t\t\t\tvar halfBorderWidth;\n\t\t\t\t\t\tvar i = 0;\n\n\t\t\t\t\t\tif (lineEnabled(me.getDataset(), chart.options)) {\n\t\t\t\t\t\t\thalfBorderWidth = (meta.dataset._model.borderWidth || 0) / 2;\n\n\t\t\t\t\t\t\thelpers.canvas.clipArea(chart.ctx, {\n\t\t\t\t\t\t\t\tleft: area.left,\n\t\t\t\t\t\t\t\tright: area.right,\n\t\t\t\t\t\t\t\ttop: area.top - halfBorderWidth,\n\t\t\t\t\t\t\t\tbottom: area.bottom + halfBorderWidth\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tmeta.dataset.draw();\n\n\t\t\t\t\t\t\thelpers.canvas.unclipArea(chart.ctx);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Draw the points\n\t\t\t\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\t\t\t\tpoints[i].draw(area);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tsetHoverStyle: function setHoverStyle(element) {\n\t\t\t\t\t\t// Point\n\t\t\t\t\t\tvar dataset = this.chart.data.datasets[element._datasetIndex];\n\t\t\t\t\t\tvar index = element._index;\n\t\t\t\t\t\tvar custom = element.custom || {};\n\t\t\t\t\t\tvar model = element._model;\n\n\t\t\t\t\t\telement.$previousStyle = {\n\t\t\t\t\t\t\tbackgroundColor: model.backgroundColor,\n\t\t\t\t\t\t\tborderColor: model.borderColor,\n\t\t\t\t\t\t\tborderWidth: model.borderWidth,\n\t\t\t\t\t\t\tradius: model.radius\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\t\t\t\tmodel.borderColor = custom.hoverBorderColor || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\t\t\t\tmodel.borderWidth = custom.hoverBorderWidth || helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n\t\t\t\t\t\tmodel.radius = custom.hoverRadius || helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t}, { \"26\": 26, \"41\": 41, \"46\": 46 }], 19: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar elements = require(41);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('polarArea', {\n\t\t\t\tscale: {\n\t\t\t\t\ttype: 'radialLinear',\n\t\t\t\t\tangleLines: {\n\t\t\t\t\t\tdisplay: false\n\t\t\t\t\t},\n\t\t\t\t\tgridLines: {\n\t\t\t\t\t\tcircular: true\n\t\t\t\t\t},\n\t\t\t\t\tpointLabels: {\n\t\t\t\t\t\tdisplay: false\n\t\t\t\t\t},\n\t\t\t\t\tticks: {\n\t\t\t\t\t\tbeginAtZero: true\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t// Boolean - Whether to animate the rotation of the chart\n\t\t\t\tanimation: {\n\t\t\t\t\tanimateRotate: true,\n\t\t\t\t\tanimateScale: true\n\t\t\t\t},\n\n\t\t\t\tstartAngle: -0.5 * Math.PI,\n\t\t\t\tlegendCallback: function legendCallback(chart) {\n\t\t\t\t\tvar text = [];\n\t\t\t\t\ttext.push('<ul class=\"' + chart.id + '-legend\">');\n\n\t\t\t\t\tvar data = chart.data;\n\t\t\t\t\tvar datasets = data.datasets;\n\t\t\t\t\tvar labels = data.labels;\n\n\t\t\t\t\tif (datasets.length) {\n\t\t\t\t\t\tfor (var i = 0; i < datasets[0].data.length; ++i) {\n\t\t\t\t\t\t\ttext.push('<li><span style=\"background-color:' + datasets[0].backgroundColor[i] + '\"></span>');\n\t\t\t\t\t\t\tif (labels[i]) {\n\t\t\t\t\t\t\t\ttext.push(labels[i]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttext.push('</li>');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\ttext.push('</ul>');\n\t\t\t\t\treturn text.join('');\n\t\t\t\t},\n\t\t\t\tlegend: {\n\t\t\t\t\tlabels: {\n\t\t\t\t\t\tgenerateLabels: function generateLabels(chart) {\n\t\t\t\t\t\t\tvar data = chart.data;\n\t\t\t\t\t\t\tif (data.labels.length && data.datasets.length) {\n\t\t\t\t\t\t\t\treturn data.labels.map(function (label, i) {\n\t\t\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\n\t\t\t\t\t\t\t\t\tvar ds = data.datasets[0];\n\t\t\t\t\t\t\t\t\tvar arc = meta.data[i];\n\t\t\t\t\t\t\t\t\tvar custom = arc.custom || {};\n\t\t\t\t\t\t\t\t\tvar valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\t\t\t\t\t\t\tvar arcOpts = chart.options.elements.arc;\n\t\t\t\t\t\t\t\t\tvar fill = custom.backgroundColor ? custom.backgroundColor : valueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n\t\t\t\t\t\t\t\t\tvar stroke = custom.borderColor ? custom.borderColor : valueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n\t\t\t\t\t\t\t\t\tvar bw = custom.borderWidth ? custom.borderWidth : valueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\ttext: label,\n\t\t\t\t\t\t\t\t\t\tfillStyle: fill,\n\t\t\t\t\t\t\t\t\t\tstrokeStyle: stroke,\n\t\t\t\t\t\t\t\t\t\tlineWidth: bw,\n\t\t\t\t\t\t\t\t\t\thidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n\t\t\t\t\t\t\t\t\t\t// Extra data used for toggling the correct item\n\t\t\t\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn [];\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tonClick: function onClick(e, legendItem) {\n\t\t\t\t\t\tvar index = legendItem.index;\n\t\t\t\t\t\tvar chart = this.chart;\n\t\t\t\t\t\tvar i, ilen, meta;\n\n\t\t\t\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tchart.update();\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t// Need to override these to give a nice default\n\t\t\t\ttooltips: {\n\t\t\t\t\tcallbacks: {\n\t\t\t\t\t\ttitle: function title() {\n\t\t\t\t\t\t\treturn '';\n\t\t\t\t\t\t},\n\t\t\t\t\t\tlabel: function label(item, data) {\n\t\t\t\t\t\t\treturn data.labels[item.index] + ': ' + item.yLabel;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.controllers.polarArea = Chart.DatasetController.extend({\n\n\t\t\t\t\tdataElementType: elements.Arc,\n\n\t\t\t\t\tlinkScales: helpers.noop,\n\n\t\t\t\t\tupdate: function update(reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar start = me.chart.options.startAngle || 0;\n\t\t\t\t\t\tvar starts = me._starts = [];\n\t\t\t\t\t\tvar angles = me._angles = [];\n\t\t\t\t\t\tvar i, ilen, angle;\n\n\t\t\t\t\t\tme._updateRadius();\n\n\t\t\t\t\t\tmeta.count = me.countVisibleElements();\n\n\t\t\t\t\t\tfor (i = 0, ilen = dataset.data.length; i < ilen; i++) {\n\t\t\t\t\t\t\tstarts[i] = start;\n\t\t\t\t\t\t\tangle = me._computeAngle(i);\n\t\t\t\t\t\t\tangles[i] = angle;\n\t\t\t\t\t\t\tstart += angle;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thelpers.each(meta.data, function (arc, index) {\n\t\t\t\t\t\t\tme.updateElement(arc, index, reset);\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\t_updateRadius: function _updateRadius() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar chartArea = chart.chartArea;\n\t\t\t\t\t\tvar opts = chart.options;\n\t\t\t\t\t\tvar arcOpts = opts.elements.arc;\n\t\t\t\t\t\tvar minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\n\t\t\t\t\t\tchart.outerRadius = Math.max((minSize - arcOpts.borderWidth / 2) / 2, 0);\n\t\t\t\t\t\tchart.innerRadius = Math.max(opts.cutoutPercentage ? chart.outerRadius / 100 * opts.cutoutPercentage : 1, 0);\n\t\t\t\t\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\n\t\t\t\t\t\tme.outerRadius = chart.outerRadius - chart.radiusLength * me.index;\n\t\t\t\t\t\tme.innerRadius = me.outerRadius - chart.radiusLength;\n\t\t\t\t\t},\n\n\t\t\t\t\tupdateElement: function updateElement(arc, index, reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar opts = chart.options;\n\t\t\t\t\t\tvar animationOpts = opts.animation;\n\t\t\t\t\t\tvar scale = chart.scale;\n\t\t\t\t\t\tvar labels = chart.data.labels;\n\n\t\t\t\t\t\tvar centerX = scale.xCenter;\n\t\t\t\t\t\tvar centerY = scale.yCenter;\n\n\t\t\t\t\t\t// var negHalfPI = -0.5 * Math.PI;\n\t\t\t\t\t\tvar datasetStartAngle = opts.startAngle;\n\t\t\t\t\t\tvar distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\t\t\t\t\t\tvar startAngle = me._starts[index];\n\t\t\t\t\t\tvar endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]);\n\n\t\t\t\t\t\tvar resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\n\t\t\t\t\t\thelpers.extend(arc, {\n\t\t\t\t\t\t\t// Utility\n\t\t\t\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t\t\t\t_index: index,\n\t\t\t\t\t\t\t_scale: scale,\n\n\t\t\t\t\t\t\t// Desired view properties\n\t\t\t\t\t\t\t_model: {\n\t\t\t\t\t\t\t\tx: centerX,\n\t\t\t\t\t\t\t\ty: centerY,\n\t\t\t\t\t\t\t\tinnerRadius: 0,\n\t\t\t\t\t\t\t\touterRadius: reset ? resetRadius : distance,\n\t\t\t\t\t\t\t\tstartAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle,\n\t\t\t\t\t\t\t\tendAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle,\n\t\t\t\t\t\t\t\tlabel: helpers.valueAtIndexOrDefault(labels, index, labels[index])\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// Apply border and fill style\n\t\t\t\t\t\tvar elementOpts = this.chart.options.elements.arc;\n\t\t\t\t\t\tvar custom = arc.custom || {};\n\t\t\t\t\t\tvar valueOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\t\t\t\tvar model = arc._model;\n\n\t\t\t\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor);\n\t\t\t\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : valueOrDefault(dataset.borderColor, index, elementOpts.borderColor);\n\t\t\t\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : valueOrDefault(dataset.borderWidth, index, elementOpts.borderWidth);\n\n\t\t\t\t\t\tarc.pivot();\n\t\t\t\t\t},\n\n\t\t\t\t\tcountVisibleElements: function countVisibleElements() {\n\t\t\t\t\t\tvar dataset = this.getDataset();\n\t\t\t\t\t\tvar meta = this.getMeta();\n\t\t\t\t\t\tvar count = 0;\n\n\t\t\t\t\t\thelpers.each(meta.data, function (element, index) {\n\t\t\t\t\t\t\tif (!isNaN(dataset.data[index]) && !element.hidden) {\n\t\t\t\t\t\t\t\tcount++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn count;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\t_computeAngle: function _computeAngle(index) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar count = this.getMeta().count;\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar meta = me.getMeta();\n\n\t\t\t\t\t\tif (isNaN(dataset.data[index]) || meta.data[index].hidden) {\n\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Scriptable options\n\t\t\t\t\t\tvar context = {\n\t\t\t\t\t\t\tchart: me.chart,\n\t\t\t\t\t\t\tdataIndex: index,\n\t\t\t\t\t\t\tdataset: dataset,\n\t\t\t\t\t\t\tdatasetIndex: me.index\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\treturn helpers.options.resolve([me.chart.options.elements.arc.angle, 2 * Math.PI / count], context, index);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t}, { \"26\": 26, \"41\": 41, \"46\": 46 }], 20: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar elements = require(41);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('radar', {\n\t\t\t\tscale: {\n\t\t\t\t\ttype: 'radialLinear'\n\t\t\t\t},\n\t\t\t\telements: {\n\t\t\t\t\tline: {\n\t\t\t\t\t\ttension: 0 // no bezier in radar\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tChart.controllers.radar = Chart.DatasetController.extend({\n\n\t\t\t\t\tdatasetElementType: elements.Line,\n\n\t\t\t\t\tdataElementType: elements.Point,\n\n\t\t\t\t\tlinkScales: helpers.noop,\n\n\t\t\t\t\tupdate: function update(reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar line = meta.dataset;\n\t\t\t\t\t\tvar points = meta.data;\n\t\t\t\t\t\tvar custom = line.custom || {};\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar lineElementOptions = me.chart.options.elements.line;\n\t\t\t\t\t\tvar scale = me.chart.scale;\n\n\t\t\t\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\t\t\t\tif (dataset.tension !== undefined && dataset.lineTension === undefined) {\n\t\t\t\t\t\t\tdataset.lineTension = dataset.tension;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thelpers.extend(meta.dataset, {\n\t\t\t\t\t\t\t// Utility\n\t\t\t\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t\t\t\t_scale: scale,\n\t\t\t\t\t\t\t// Data\n\t\t\t\t\t\t\t_children: points,\n\t\t\t\t\t\t\t_loop: true,\n\t\t\t\t\t\t\t// Model\n\t\t\t\t\t\t\t_model: {\n\t\t\t\t\t\t\t\t// Appearance\n\t\t\t\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, lineElementOptions.tension),\n\t\t\t\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : dataset.backgroundColor || lineElementOptions.backgroundColor,\n\t\t\t\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : dataset.borderWidth || lineElementOptions.borderWidth,\n\t\t\t\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : dataset.borderColor || lineElementOptions.borderColor,\n\t\t\t\t\t\t\t\tfill: custom.fill ? custom.fill : dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill,\n\t\t\t\t\t\t\t\tborderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : dataset.borderCapStyle || lineElementOptions.borderCapStyle,\n\t\t\t\t\t\t\t\tborderDash: custom.borderDash ? custom.borderDash : dataset.borderDash || lineElementOptions.borderDash,\n\t\t\t\t\t\t\t\tborderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : dataset.borderDashOffset || lineElementOptions.borderDashOffset,\n\t\t\t\t\t\t\t\tborderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : dataset.borderJoinStyle || lineElementOptions.borderJoinStyle\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tmeta.dataset.pivot();\n\n\t\t\t\t\t\t// Update Points\n\t\t\t\t\t\thelpers.each(points, function (point, index) {\n\t\t\t\t\t\t\tme.updateElement(point, index, reset);\n\t\t\t\t\t\t}, me);\n\n\t\t\t\t\t\t// Update bezier control points\n\t\t\t\t\t\tme.updateBezierControlPoints();\n\t\t\t\t\t},\n\t\t\t\t\tupdateElement: function updateElement(point, index, reset) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar custom = point.custom || {};\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar scale = me.chart.scale;\n\t\t\t\t\t\tvar pointElementOptions = me.chart.options.elements.point;\n\t\t\t\t\t\tvar pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);\n\n\t\t\t\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\t\t\t\tif (dataset.radius !== undefined && dataset.pointRadius === undefined) {\n\t\t\t\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (dataset.hitRadius !== undefined && dataset.pointHitRadius === undefined) {\n\t\t\t\t\t\t\tdataset.pointHitRadius = dataset.hitRadius;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thelpers.extend(point, {\n\t\t\t\t\t\t\t// Utility\n\t\t\t\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t\t\t\t_index: index,\n\t\t\t\t\t\t\t_scale: scale,\n\n\t\t\t\t\t\t\t// Desired view properties\n\t\t\t\t\t\t\t_model: {\n\t\t\t\t\t\t\t\tx: reset ? scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales\n\t\t\t\t\t\t\t\ty: reset ? scale.yCenter : pointPosition.y,\n\n\t\t\t\t\t\t\t\t// Appearance\n\t\t\t\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.valueOrDefault(dataset.lineTension, me.chart.options.elements.line.tension),\n\t\t\t\t\t\t\t\tradius: custom.radius ? custom.radius : helpers.valueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius),\n\t\t\t\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.valueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor),\n\t\t\t\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : helpers.valueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor),\n\t\t\t\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : helpers.valueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth),\n\t\t\t\t\t\t\t\tpointStyle: custom.pointStyle ? custom.pointStyle : helpers.valueAtIndexOrDefault(dataset.pointStyle, index, pointElementOptions.pointStyle),\n\t\t\t\t\t\t\t\trotation: custom.rotation ? custom.rotation : helpers.valueAtIndexOrDefault(dataset.pointRotation, index, pointElementOptions.rotation),\n\n\t\t\t\t\t\t\t\t// Tooltip\n\t\t\t\t\t\t\t\thitRadius: custom.hitRadius ? custom.hitRadius : helpers.valueAtIndexOrDefault(dataset.pointHitRadius, index, pointElementOptions.hitRadius)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tpoint._model.skip = custom.skip ? custom.skip : isNaN(point._model.x) || isNaN(point._model.y);\n\t\t\t\t\t},\n\t\t\t\t\tupdateBezierControlPoints: function updateBezierControlPoints() {\n\t\t\t\t\t\tvar chartArea = this.chart.chartArea;\n\t\t\t\t\t\tvar meta = this.getMeta();\n\n\t\t\t\t\t\thelpers.each(meta.data, function (point, index) {\n\t\t\t\t\t\t\tvar model = point._model;\n\t\t\t\t\t\t\tvar controlPoints = helpers.splineCurve(helpers.previousItem(meta.data, index, true)._model, model, helpers.nextItem(meta.data, index, true)._model, model.tension);\n\n\t\t\t\t\t\t\t// Prevent the bezier going outside of the bounds of the graph\n\t\t\t\t\t\t\tmodel.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, chartArea.right), chartArea.left);\n\t\t\t\t\t\t\tmodel.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, chartArea.bottom), chartArea.top);\n\n\t\t\t\t\t\t\tmodel.controlPointNextX = Math.max(Math.min(controlPoints.next.x, chartArea.right), chartArea.left);\n\t\t\t\t\t\t\tmodel.controlPointNextY = Math.max(Math.min(controlPoints.next.y, chartArea.bottom), chartArea.top);\n\n\t\t\t\t\t\t\t// Now pivot the point for animation\n\t\t\t\t\t\t\tpoint.pivot();\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\n\t\t\t\t\tsetHoverStyle: function setHoverStyle(point) {\n\t\t\t\t\t\t// Point\n\t\t\t\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\t\t\t\tvar custom = point.custom || {};\n\t\t\t\t\t\tvar index = point._index;\n\t\t\t\t\t\tvar model = point._model;\n\n\t\t\t\t\t\tpoint.$previousStyle = {\n\t\t\t\t\t\t\tbackgroundColor: model.backgroundColor,\n\t\t\t\t\t\t\tborderColor: model.borderColor,\n\t\t\t\t\t\t\tborderWidth: model.borderWidth,\n\t\t\t\t\t\t\tradius: model.radius\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tmodel.radius = custom.hoverRadius ? custom.hoverRadius : helpers.valueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n\t\t\t\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\t\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\t\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.valueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t}, { \"26\": 26, \"41\": 41, \"46\": 46 }], 21: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\n\t\t\tdefaults._set('scatter', {\n\t\t\t\thover: {\n\t\t\t\t\tmode: 'single'\n\t\t\t\t},\n\n\t\t\t\tscales: {\n\t\t\t\t\txAxes: [{\n\t\t\t\t\t\tid: 'x-axis-1', // need an ID so datasets can reference the scale\n\t\t\t\t\t\ttype: 'linear', // scatter should not use a category axis\n\t\t\t\t\t\tposition: 'bottom'\n\t\t\t\t\t}],\n\t\t\t\t\tyAxes: [{\n\t\t\t\t\t\tid: 'y-axis-1',\n\t\t\t\t\t\ttype: 'linear',\n\t\t\t\t\t\tposition: 'left'\n\t\t\t\t\t}]\n\t\t\t\t},\n\n\t\t\t\tshowLines: false,\n\n\t\t\t\ttooltips: {\n\t\t\t\t\tcallbacks: {\n\t\t\t\t\t\ttitle: function title() {\n\t\t\t\t\t\t\treturn ''; // doesn't make sense for scatter since data are formatted as a point\n\t\t\t\t\t\t},\n\t\t\t\t\t\tlabel: function label(item) {\n\t\t\t\t\t\t\treturn '(' + item.xLabel + ', ' + item.yLabel + ')';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\t// Scatter charts use line controllers\n\t\t\t\tChart.controllers.scatter = Chart.controllers.line;\n\t\t\t};\n\t\t}, { \"26\": 26 }], 22: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar Element = require(27);\n\n\t\t\tvar exports = module.exports = Element.extend({\n\t\t\t\tchart: null, // the animation associated chart instance\n\t\t\t\tcurrentStep: 0, // the current animation step\n\t\t\t\tnumSteps: 60, // default number of steps\n\t\t\t\teasing: '', // the easing to use for this animation\n\t\t\t\trender: null, // render function used by the animation service\n\n\t\t\t\tonAnimationProgress: null, // user specified callback to fire on each step of the animation\n\t\t\t\tonAnimationComplete: null // user specified callback to fire when the animation finishes\n\t\t\t});\n\n\t\t\t// DEPRECATIONS\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.Animation instead\n * @prop Chart.Animation#animationObject\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n */\n\t\t\tObject.defineProperty(exports.prototype, 'animationObject', {\n\t\t\t\tget: function get() {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.Animation#chart instead\n * @prop Chart.Animation#chartInstance\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n */\n\t\t\tObject.defineProperty(exports.prototype, 'chartInstance', {\n\t\t\t\tget: function get() {\n\t\t\t\t\treturn this.chart;\n\t\t\t\t},\n\t\t\t\tset: function set(value) {\n\t\t\t\t\tthis.chart = value;\n\t\t\t\t}\n\t\t\t});\n\t\t}, { \"27\": 27 }], 23: [function (require, module, exports) {\n\t\t\t/* global window: false */\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('global', {\n\t\t\t\tanimation: {\n\t\t\t\t\tduration: 1000,\n\t\t\t\t\teasing: 'easeOutQuart',\n\t\t\t\t\tonProgress: helpers.noop,\n\t\t\t\t\tonComplete: helpers.noop\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmodule.exports = {\n\t\t\t\tframeDuration: 17,\n\t\t\t\tanimations: [],\n\t\t\t\tdropFrames: 0,\n\t\t\t\trequest: null,\n\n\t\t\t\t/**\n * @param {Chart} chart - The chart to animate.\n * @param {Chart.Animation} animation - The animation that we will animate.\n * @param {Number} duration - The animation duration in ms.\n * @param {Boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions\n */\n\t\t\t\taddAnimation: function addAnimation(chart, animation, duration, lazy) {\n\t\t\t\t\tvar animations = this.animations;\n\t\t\t\t\tvar i, ilen;\n\n\t\t\t\t\tanimation.chart = chart;\n\n\t\t\t\t\tif (!lazy) {\n\t\t\t\t\t\tchart.animating = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (i = 0, ilen = animations.length; i < ilen; ++i) {\n\t\t\t\t\t\tif (animations[i].chart === chart) {\n\t\t\t\t\t\t\tanimations[i] = animation;\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tanimations.push(animation);\n\n\t\t\t\t\t// If there are no animations queued, manually kickstart a digest, for lack of a better word\n\t\t\t\t\tif (animations.length === 1) {\n\t\t\t\t\t\tthis.requestAnimationFrame();\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tcancelAnimation: function cancelAnimation(chart) {\n\t\t\t\t\tvar index = helpers.findIndex(this.animations, function (animation) {\n\t\t\t\t\t\treturn animation.chart === chart;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (index !== -1) {\n\t\t\t\t\t\tthis.animations.splice(index, 1);\n\t\t\t\t\t\tchart.animating = false;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\trequestAnimationFrame: function requestAnimationFrame() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tif (me.request === null) {\n\t\t\t\t\t\t// Skip animation frame requests until the active one is executed.\n\t\t\t\t\t\t// This can happen when processing mouse events, e.g. 'mousemove'\n\t\t\t\t\t\t// and 'mouseout' events will trigger multiple renders.\n\t\t\t\t\t\tme.request = helpers.requestAnimFrame.call(window, function () {\n\t\t\t\t\t\t\tme.request = null;\n\t\t\t\t\t\t\tme.startDigest();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n * @private\n */\n\t\t\t\tstartDigest: function startDigest() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar startTime = Date.now();\n\t\t\t\t\tvar framesToDrop = 0;\n\n\t\t\t\t\tif (me.dropFrames > 1) {\n\t\t\t\t\t\tframesToDrop = Math.floor(me.dropFrames);\n\t\t\t\t\t\tme.dropFrames = me.dropFrames % 1;\n\t\t\t\t\t}\n\n\t\t\t\t\tme.advance(1 + framesToDrop);\n\n\t\t\t\t\tvar endTime = Date.now();\n\n\t\t\t\t\tme.dropFrames += (endTime - startTime) / me.frameDuration;\n\n\t\t\t\t\t// Do we have more stuff to animate?\n\t\t\t\t\tif (me.animations.length > 0) {\n\t\t\t\t\t\tme.requestAnimationFrame();\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n * @private\n */\n\t\t\t\tadvance: function advance(count) {\n\t\t\t\t\tvar animations = this.animations;\n\t\t\t\t\tvar animation, chart;\n\t\t\t\t\tvar i = 0;\n\n\t\t\t\t\twhile (i < animations.length) {\n\t\t\t\t\t\tanimation = animations[i];\n\t\t\t\t\t\tchart = animation.chart;\n\n\t\t\t\t\t\tanimation.currentStep = (animation.currentStep || 0) + count;\n\t\t\t\t\t\tanimation.currentStep = Math.min(animation.currentStep, animation.numSteps);\n\n\t\t\t\t\t\thelpers.callback(animation.render, [chart, animation], chart);\n\t\t\t\t\t\thelpers.callback(animation.onAnimationProgress, [animation], chart);\n\n\t\t\t\t\t\tif (animation.currentStep >= animation.numSteps) {\n\t\t\t\t\t\t\thelpers.callback(animation.onAnimationComplete, [animation], chart);\n\t\t\t\t\t\t\tchart.animating = false;\n\t\t\t\t\t\t\tanimations.splice(i, 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t++i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}, { \"26\": 26, \"46\": 46 }], 24: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar Animation = require(22);\n\t\t\tvar animations = require(23);\n\t\t\tvar defaults = require(26);\n\t\t\tvar helpers = require(46);\n\t\t\tvar Interaction = require(29);\n\t\t\tvar layouts = require(31);\n\t\t\tvar platform = require(49);\n\t\t\tvar plugins = require(32);\n\t\t\tvar scaleService = require(34);\n\t\t\tvar Tooltip = require(36);\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\t// Create a dictionary of chart types, to allow for extension of existing types\n\t\t\t\tChart.types = {};\n\n\t\t\t\t// Store a reference to each instance - allowing us to globally resize chart instances on window resize.\n\t\t\t\t// Destroy method on the chart will remove the instance of the chart from this reference.\n\t\t\t\tChart.instances = {};\n\n\t\t\t\t// Controllers available for dataset visualization eg. bar, line, slice, etc.\n\t\t\t\tChart.controllers = {};\n\n\t\t\t\t/**\n * Initializes the given config with global and chart default values.\n */\n\t\t\t\tfunction initConfig(config) {\n\t\t\t\t\tconfig = config || {};\n\n\t\t\t\t\t// Do NOT use configMerge() for the data object because this method merges arrays\n\t\t\t\t\t// and so would change references to labels and datasets, preventing data updates.\n\t\t\t\t\tvar data = config.data = config.data || {};\n\t\t\t\t\tdata.datasets = data.datasets || [];\n\t\t\t\t\tdata.labels = data.labels || [];\n\n\t\t\t\t\tconfig.options = helpers.configMerge(defaults.global, defaults[config.type], config.options || {});\n\n\t\t\t\t\treturn config;\n\t\t\t\t}\n\n\t\t\t\t/**\n * Updates the config of the chart\n * @param chart {Chart} chart to update the options for\n */\n\t\t\t\tfunction updateConfig(chart) {\n\t\t\t\t\tvar newOptions = chart.options;\n\n\t\t\t\t\thelpers.each(chart.scales, function (scale) {\n\t\t\t\t\t\tlayouts.removeBox(chart, scale);\n\t\t\t\t\t});\n\n\t\t\t\t\tnewOptions = helpers.configMerge(Chart.defaults.global, Chart.defaults[chart.config.type], newOptions);\n\n\t\t\t\t\tchart.options = chart.config.options = newOptions;\n\t\t\t\t\tchart.ensureScalesHaveIDs();\n\t\t\t\t\tchart.buildOrUpdateScales();\n\t\t\t\t\t// Tooltip\n\t\t\t\t\tchart.tooltip._options = newOptions.tooltips;\n\t\t\t\t\tchart.tooltip.initialize();\n\t\t\t\t}\n\n\t\t\t\tfunction positionIsHorizontal(position) {\n\t\t\t\t\treturn position === 'top' || position === 'bottom';\n\t\t\t\t}\n\n\t\t\t\thelpers.extend(Chart.prototype, /** @lends Chart */{\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tconstruct: function construct(item, config) {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tconfig = initConfig(config);\n\n\t\t\t\t\t\tvar context = platform.acquireContext(item, config);\n\t\t\t\t\t\tvar canvas = context && context.canvas;\n\t\t\t\t\t\tvar height = canvas && canvas.height;\n\t\t\t\t\t\tvar width = canvas && canvas.width;\n\n\t\t\t\t\t\tme.id = helpers.uid();\n\t\t\t\t\t\tme.ctx = context;\n\t\t\t\t\t\tme.canvas = canvas;\n\t\t\t\t\t\tme.config = config;\n\t\t\t\t\t\tme.width = width;\n\t\t\t\t\t\tme.height = height;\n\t\t\t\t\t\tme.aspectRatio = height ? width / height : null;\n\t\t\t\t\t\tme.options = config.options;\n\t\t\t\t\t\tme._bufferedRender = false;\n\n\t\t\t\t\t\t/**\n * Provided for backward compatibility, Chart and Chart.Controller have been merged,\n * the \"instance\" still need to be defined since it might be called from plugins.\n * @prop Chart#chart\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\n\t\t\t\t\t\tme.chart = me;\n\t\t\t\t\t\tme.controller = me; // chart.chart.controller #inception\n\n\t\t\t\t\t\t// Add the chart instance to the global namespace\n\t\t\t\t\t\tChart.instances[me.id] = me;\n\n\t\t\t\t\t\t// Define alias to the config data: `chart.data === chart.config.data`\n\t\t\t\t\t\tObject.defineProperty(me, 'data', {\n\t\t\t\t\t\t\tget: function get() {\n\t\t\t\t\t\t\t\treturn me.config.data;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tset: function set(value) {\n\t\t\t\t\t\t\t\tme.config.data = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (!context || !canvas) {\n\t\t\t\t\t\t\t// The given item is not a compatible context2d element, let's return before finalizing\n\t\t\t\t\t\t\t// the chart initialization but after setting basic chart / controller properties that\n\t\t\t\t\t\t\t// can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n\t\t\t\t\t\t\t// https://github.com/chartjs/Chart.js/issues/2807\n\t\t\t\t\t\t\tconsole.error(\"Failed to create chart: can't acquire context from the given item\");\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tme.initialize();\n\t\t\t\t\t\tme.update();\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tinitialize: function initialize() {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\t// Before init plugin notification\n\t\t\t\t\t\tplugins.notify(me, 'beforeInit');\n\n\t\t\t\t\t\thelpers.retinaScale(me, me.options.devicePixelRatio);\n\n\t\t\t\t\t\tme.bindEvents();\n\n\t\t\t\t\t\tif (me.options.responsive) {\n\t\t\t\t\t\t\t// Initial resize before chart draws (must be silent to preserve initial animations).\n\t\t\t\t\t\t\tme.resize(true);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Make sure scales have IDs and are built before we build any controllers.\n\t\t\t\t\t\tme.ensureScalesHaveIDs();\n\t\t\t\t\t\tme.buildOrUpdateScales();\n\t\t\t\t\t\tme.initToolTip();\n\n\t\t\t\t\t\t// After init plugin notification\n\t\t\t\t\t\tplugins.notify(me, 'afterInit');\n\n\t\t\t\t\t\treturn me;\n\t\t\t\t\t},\n\n\t\t\t\t\tclear: function clear() {\n\t\t\t\t\t\thelpers.canvas.clear(this);\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t},\n\n\t\t\t\t\tstop: function stop() {\n\t\t\t\t\t\t// Stops any current animation loop occurring\n\t\t\t\t\t\tanimations.cancelAnimation(this);\n\t\t\t\t\t\treturn this;\n\t\t\t\t\t},\n\n\t\t\t\t\tresize: function resize(silent) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar options = me.options;\n\t\t\t\t\t\tvar canvas = me.canvas;\n\t\t\t\t\t\tvar aspectRatio = options.maintainAspectRatio && me.aspectRatio || null;\n\n\t\t\t\t\t\t// the canvas render width and height will be casted to integers so make sure that\n\t\t\t\t\t\t// the canvas display style uses the same integer values to avoid blurring effect.\n\n\t\t\t\t\t\t// Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collapsed\n\t\t\t\t\t\tvar newWidth = Math.max(0, Math.floor(helpers.getMaximumWidth(canvas)));\n\t\t\t\t\t\tvar newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers.getMaximumHeight(canvas)));\n\n\t\t\t\t\t\tif (me.width === newWidth && me.height === newHeight) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcanvas.width = me.width = newWidth;\n\t\t\t\t\t\tcanvas.height = me.height = newHeight;\n\t\t\t\t\t\tcanvas.style.width = newWidth + 'px';\n\t\t\t\t\t\tcanvas.style.height = newHeight + 'px';\n\n\t\t\t\t\t\thelpers.retinaScale(me, options.devicePixelRatio);\n\n\t\t\t\t\t\tif (!silent) {\n\t\t\t\t\t\t\t// Notify any plugins about the resize\n\t\t\t\t\t\t\tvar newSize = { width: newWidth, height: newHeight };\n\t\t\t\t\t\t\tplugins.notify(me, 'resize', [newSize]);\n\n\t\t\t\t\t\t\t// Notify of resize\n\t\t\t\t\t\t\tif (me.options.onResize) {\n\t\t\t\t\t\t\t\tme.options.onResize(me, newSize);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tme.stop();\n\t\t\t\t\t\t\tme.update({\n\t\t\t\t\t\t\t\tduration: me.options.responsiveAnimationDuration\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tensureScalesHaveIDs: function ensureScalesHaveIDs() {\n\t\t\t\t\t\tvar options = this.options;\n\t\t\t\t\t\tvar scalesOptions = options.scales || {};\n\t\t\t\t\t\tvar scaleOptions = options.scale;\n\n\t\t\t\t\t\thelpers.each(scalesOptions.xAxes, function (xAxisOptions, index) {\n\t\t\t\t\t\t\txAxisOptions.id = xAxisOptions.id || 'x-axis-' + index;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\thelpers.each(scalesOptions.yAxes, function (yAxisOptions, index) {\n\t\t\t\t\t\t\tyAxisOptions.id = yAxisOptions.id || 'y-axis-' + index;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (scaleOptions) {\n\t\t\t\t\t\t\tscaleOptions.id = scaleOptions.id || 'scale';\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Builds a map of scale ID to scale object for future lookup.\n */\n\t\t\t\t\tbuildOrUpdateScales: function buildOrUpdateScales() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar options = me.options;\n\t\t\t\t\t\tvar scales = me.scales || {};\n\t\t\t\t\t\tvar items = [];\n\t\t\t\t\t\tvar updated = Object.keys(scales).reduce(function (obj, id) {\n\t\t\t\t\t\t\tobj[id] = false;\n\t\t\t\t\t\t\treturn obj;\n\t\t\t\t\t\t}, {});\n\n\t\t\t\t\t\tif (options.scales) {\n\t\t\t\t\t\t\titems = items.concat((options.scales.xAxes || []).map(function (xAxisOptions) {\n\t\t\t\t\t\t\t\treturn { options: xAxisOptions, dtype: 'category', dposition: 'bottom' };\n\t\t\t\t\t\t\t}), (options.scales.yAxes || []).map(function (yAxisOptions) {\n\t\t\t\t\t\t\t\treturn { options: yAxisOptions, dtype: 'linear', dposition: 'left' };\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (options.scale) {\n\t\t\t\t\t\t\titems.push({\n\t\t\t\t\t\t\t\toptions: options.scale,\n\t\t\t\t\t\t\t\tdtype: 'radialLinear',\n\t\t\t\t\t\t\t\tisDefault: true,\n\t\t\t\t\t\t\t\tdposition: 'chartArea'\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thelpers.each(items, function (item) {\n\t\t\t\t\t\t\tvar scaleOptions = item.options;\n\t\t\t\t\t\t\tvar id = scaleOptions.id;\n\t\t\t\t\t\t\tvar scaleType = helpers.valueOrDefault(scaleOptions.type, item.dtype);\n\n\t\t\t\t\t\t\tif (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) {\n\t\t\t\t\t\t\t\tscaleOptions.position = item.dposition;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tupdated[id] = true;\n\t\t\t\t\t\t\tvar scale = null;\n\t\t\t\t\t\t\tif (id in scales && scales[id].type === scaleType) {\n\t\t\t\t\t\t\t\tscale = scales[id];\n\t\t\t\t\t\t\t\tscale.options = scaleOptions;\n\t\t\t\t\t\t\t\tscale.ctx = me.ctx;\n\t\t\t\t\t\t\t\tscale.chart = me;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tvar scaleClass = scaleService.getScaleConstructor(scaleType);\n\t\t\t\t\t\t\t\tif (!scaleClass) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tscale = new scaleClass({\n\t\t\t\t\t\t\t\t\tid: id,\n\t\t\t\t\t\t\t\t\ttype: scaleType,\n\t\t\t\t\t\t\t\t\toptions: scaleOptions,\n\t\t\t\t\t\t\t\t\tctx: me.ctx,\n\t\t\t\t\t\t\t\t\tchart: me\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tscales[scale.id] = scale;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tscale.mergeTicksOptions();\n\n\t\t\t\t\t\t\t// TODO(SB): I think we should be able to remove this custom case (options.scale)\n\t\t\t\t\t\t\t// and consider it as a regular scale part of the \"scales\"\" map only! This would\n\t\t\t\t\t\t\t// make the logic easier and remove some useless? custom code.\n\t\t\t\t\t\t\tif (item.isDefault) {\n\t\t\t\t\t\t\t\tme.scale = scale;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\t// clear up discarded scales\n\t\t\t\t\t\thelpers.each(updated, function (hasUpdated, id) {\n\t\t\t\t\t\t\tif (!hasUpdated) {\n\t\t\t\t\t\t\t\tdelete scales[id];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tme.scales = scales;\n\n\t\t\t\t\t\tscaleService.addScalesToLayout(this);\n\t\t\t\t\t},\n\n\t\t\t\t\tbuildOrUpdateControllers: function buildOrUpdateControllers() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar types = [];\n\t\t\t\t\t\tvar newControllers = [];\n\n\t\t\t\t\t\thelpers.each(me.data.datasets, function (dataset, datasetIndex) {\n\t\t\t\t\t\t\tvar meta = me.getDatasetMeta(datasetIndex);\n\t\t\t\t\t\t\tvar type = dataset.type || me.config.type;\n\n\t\t\t\t\t\t\tif (meta.type && meta.type !== type) {\n\t\t\t\t\t\t\t\tme.destroyDatasetMeta(datasetIndex);\n\t\t\t\t\t\t\t\tmeta = me.getDatasetMeta(datasetIndex);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tmeta.type = type;\n\n\t\t\t\t\t\t\ttypes.push(meta.type);\n\n\t\t\t\t\t\t\tif (meta.controller) {\n\t\t\t\t\t\t\t\tmeta.controller.updateIndex(datasetIndex);\n\t\t\t\t\t\t\t\tmeta.controller.linkScales();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tvar ControllerClass = Chart.controllers[meta.type];\n\t\t\t\t\t\t\t\tif (ControllerClass === undefined) {\n\t\t\t\t\t\t\t\t\tthrow new Error('\"' + meta.type + '\" is not a chart type.');\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tmeta.controller = new ControllerClass(me, datasetIndex);\n\t\t\t\t\t\t\t\tnewControllers.push(meta.controller);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, me);\n\n\t\t\t\t\t\treturn newControllers;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Reset the elements of all datasets\n * @private\n */\n\t\t\t\t\tresetElements: function resetElements() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\thelpers.each(me.data.datasets, function (dataset, datasetIndex) {\n\t\t\t\t\t\t\tme.getDatasetMeta(datasetIndex).controller.reset();\n\t\t\t\t\t\t}, me);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Resets the chart back to it's state before the initial animation\n */\n\t\t\t\t\treset: function reset() {\n\t\t\t\t\t\tthis.resetElements();\n\t\t\t\t\t\tthis.tooltip.initialize();\n\t\t\t\t\t},\n\n\t\t\t\t\tupdate: function update(config) {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tif (!config || (typeof config === \"undefined\" ? \"undefined\" : _typeof(config)) !== 'object') {\n\t\t\t\t\t\t\t// backwards compatibility\n\t\t\t\t\t\t\tconfig = {\n\t\t\t\t\t\t\t\tduration: config,\n\t\t\t\t\t\t\t\tlazy: arguments[1]\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tupdateConfig(me);\n\n\t\t\t\t\t\t// plugins options references might have change, let's invalidate the cache\n\t\t\t\t\t\t// https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n\t\t\t\t\t\tplugins._invalidate(me);\n\n\t\t\t\t\t\tif (plugins.notify(me, 'beforeUpdate') === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// In case the entire data object changed\n\t\t\t\t\t\tme.tooltip._data = me.data;\n\n\t\t\t\t\t\t// Make sure dataset controllers are updated and new controllers are reset\n\t\t\t\t\t\tvar newControllers = me.buildOrUpdateControllers();\n\n\t\t\t\t\t\t// Make sure all dataset controllers have correct meta data counts\n\t\t\t\t\t\thelpers.each(me.data.datasets, function (dataset, datasetIndex) {\n\t\t\t\t\t\t\tme.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements();\n\t\t\t\t\t\t}, me);\n\n\t\t\t\t\t\tme.updateLayout();\n\n\t\t\t\t\t\t// Can only reset the new controllers after the scales have been updated\n\t\t\t\t\t\tif (me.options.animation && me.options.animation.duration) {\n\t\t\t\t\t\t\thelpers.each(newControllers, function (controller) {\n\t\t\t\t\t\t\t\tcontroller.reset();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tme.updateDatasets();\n\n\t\t\t\t\t\t// Need to reset tooltip in case it is displayed with elements that are removed\n\t\t\t\t\t\t// after update.\n\t\t\t\t\t\tme.tooltip.initialize();\n\n\t\t\t\t\t\t// Last active contains items that were previously in the tooltip.\n\t\t\t\t\t\t// When we reset the tooltip, we need to clear it\n\t\t\t\t\t\tme.lastActive = [];\n\n\t\t\t\t\t\t// Do this before render so that any plugins that need final scale updates can use it\n\t\t\t\t\t\tplugins.notify(me, 'afterUpdate');\n\n\t\t\t\t\t\tif (me._bufferedRender) {\n\t\t\t\t\t\t\tme._bufferedRequest = {\n\t\t\t\t\t\t\t\tduration: config.duration,\n\t\t\t\t\t\t\t\teasing: config.easing,\n\t\t\t\t\t\t\t\tlazy: config.lazy\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tme.render(config);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n * hook, in which case, plugins will not be called on `afterLayout`.\n * @private\n */\n\t\t\t\t\tupdateLayout: function updateLayout() {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tif (plugins.notify(me, 'beforeLayout') === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlayouts.update(this, this.width, this.height);\n\n\t\t\t\t\t\t/**\n * Provided for backward compatibility, use `afterLayout` instead.\n * @method IPlugin#afterScaleUpdate\n * @deprecated since version 2.5.0\n * @todo remove at version 3\n * @private\n */\n\t\t\t\t\t\tplugins.notify(me, 'afterScaleUpdate');\n\t\t\t\t\t\tplugins.notify(me, 'afterLayout');\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n * @private\n */\n\t\t\t\t\tupdateDatasets: function updateDatasets() {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tif (plugins.notify(me, 'beforeDatasetsUpdate') === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tme.updateDataset(i);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tplugins.notify(me, 'afterDatasetsUpdate');\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n * @private\n */\n\t\t\t\t\tupdateDataset: function updateDataset(index) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getDatasetMeta(index);\n\t\t\t\t\t\tvar args = {\n\t\t\t\t\t\t\tmeta: meta,\n\t\t\t\t\t\t\tindex: index\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmeta.controller.update();\n\n\t\t\t\t\t\tplugins.notify(me, 'afterDatasetUpdate', [args]);\n\t\t\t\t\t},\n\n\t\t\t\t\trender: function render(config) {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tif (!config || (typeof config === \"undefined\" ? \"undefined\" : _typeof(config)) !== 'object') {\n\t\t\t\t\t\t\t// backwards compatibility\n\t\t\t\t\t\t\tconfig = {\n\t\t\t\t\t\t\t\tduration: config,\n\t\t\t\t\t\t\t\tlazy: arguments[1]\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar duration = config.duration;\n\t\t\t\t\t\tvar lazy = config.lazy;\n\n\t\t\t\t\t\tif (plugins.notify(me, 'beforeRender') === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar animationOptions = me.options.animation;\n\t\t\t\t\t\tvar onComplete = function onComplete(animation) {\n\t\t\t\t\t\t\tplugins.notify(me, 'afterRender');\n\t\t\t\t\t\t\thelpers.callback(animationOptions && animationOptions.onComplete, [animation], me);\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (animationOptions && (typeof duration !== 'undefined' && duration !== 0 || typeof duration === 'undefined' && animationOptions.duration !== 0)) {\n\t\t\t\t\t\t\tvar animation = new Animation({\n\t\t\t\t\t\t\t\tnumSteps: (duration || animationOptions.duration) / 16.66, // 60 fps\n\t\t\t\t\t\t\t\teasing: config.easing || animationOptions.easing,\n\n\t\t\t\t\t\t\t\trender: function render(chart, animationObject) {\n\t\t\t\t\t\t\t\t\tvar easingFunction = helpers.easing.effects[animationObject.easing];\n\t\t\t\t\t\t\t\t\tvar currentStep = animationObject.currentStep;\n\t\t\t\t\t\t\t\t\tvar stepDecimal = currentStep / animationObject.numSteps;\n\n\t\t\t\t\t\t\t\t\tchart.draw(easingFunction(stepDecimal), stepDecimal, currentStep);\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\tonAnimationProgress: animationOptions.onProgress,\n\t\t\t\t\t\t\t\tonAnimationComplete: onComplete\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tanimations.addAnimation(me, animation, duration, lazy);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tme.draw();\n\n\t\t\t\t\t\t\t// See https://github.com/chartjs/Chart.js/issues/3781\n\t\t\t\t\t\t\tonComplete(new Animation({ numSteps: 0, chart: me }));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn me;\n\t\t\t\t\t},\n\n\t\t\t\t\tdraw: function draw(easingValue) {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tme.clear();\n\n\t\t\t\t\t\tif (helpers.isNullOrUndef(easingValue)) {\n\t\t\t\t\t\t\teasingValue = 1;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tme.transition(easingValue);\n\n\t\t\t\t\t\tif (me.width <= 0 || me.height <= 0) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (plugins.notify(me, 'beforeDraw', [easingValue]) === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Draw all the scales\n\t\t\t\t\t\thelpers.each(me.boxes, function (box) {\n\t\t\t\t\t\t\tbox.draw(me.chartArea);\n\t\t\t\t\t\t}, me);\n\n\t\t\t\t\t\tif (me.scale) {\n\t\t\t\t\t\t\tme.scale.draw();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tme.drawDatasets(easingValue);\n\t\t\t\t\t\tme._drawTooltip(easingValue);\n\n\t\t\t\t\t\tplugins.notify(me, 'afterDraw', [easingValue]);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\ttransition: function transition(easingValue) {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tfor (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\t\t\t\tif (me.isDatasetVisible(i)) {\n\t\t\t\t\t\t\t\tme.getDatasetMeta(i).controller.transition(easingValue);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tme.tooltip.transition(easingValue);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n * @private\n */\n\t\t\t\t\tdrawDatasets: function drawDatasets(easingValue) {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tif (plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Draw datasets reversed to support proper line stacking\n\t\t\t\t\t\tfor (var i = (me.data.datasets || []).length - 1; i >= 0; --i) {\n\t\t\t\t\t\t\tif (me.isDatasetVisible(i)) {\n\t\t\t\t\t\t\t\tme.drawDataset(i, easingValue);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tplugins.notify(me, 'afterDatasetsDraw', [easingValue]);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n * @private\n */\n\t\t\t\t\tdrawDataset: function drawDataset(index, easingValue) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getDatasetMeta(index);\n\t\t\t\t\t\tvar args = {\n\t\t\t\t\t\t\tmeta: meta,\n\t\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\t\teasingValue: easingValue\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (plugins.notify(me, 'beforeDatasetDraw', [args]) === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmeta.controller.draw(easingValue);\n\n\t\t\t\t\t\tplugins.notify(me, 'afterDatasetDraw', [args]);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw`\n * hook, in which case, plugins will not be called on `afterTooltipDraw`.\n * @private\n */\n\t\t\t\t\t_drawTooltip: function _drawTooltip(easingValue) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar tooltip = me.tooltip;\n\t\t\t\t\t\tvar args = {\n\t\t\t\t\t\t\ttooltip: tooltip,\n\t\t\t\t\t\t\teasingValue: easingValue\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (plugins.notify(me, 'beforeTooltipDraw', [args]) === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttooltip.draw();\n\n\t\t\t\t\t\tplugins.notify(me, 'afterTooltipDraw', [args]);\n\t\t\t\t\t},\n\n\t\t\t\t\t// Get the single element that was clicked on\n\t\t\t\t\t// @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw\n\t\t\t\t\tgetElementAtEvent: function getElementAtEvent(e) {\n\t\t\t\t\t\treturn Interaction.modes.single(this, e);\n\t\t\t\t\t},\n\n\t\t\t\t\tgetElementsAtEvent: function getElementsAtEvent(e) {\n\t\t\t\t\t\treturn Interaction.modes.label(this, e, { intersect: true });\n\t\t\t\t\t},\n\n\t\t\t\t\tgetElementsAtXAxis: function getElementsAtXAxis(e) {\n\t\t\t\t\t\treturn Interaction.modes['x-axis'](this, e, { intersect: true });\n\t\t\t\t\t},\n\n\t\t\t\t\tgetElementsAtEventForMode: function getElementsAtEventForMode(e, mode, options) {\n\t\t\t\t\t\tvar method = Interaction.modes[mode];\n\t\t\t\t\t\tif (typeof method === 'function') {\n\t\t\t\t\t\t\treturn method(this, e, options);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t},\n\n\t\t\t\t\tgetDatasetAtEvent: function getDatasetAtEvent(e) {\n\t\t\t\t\t\treturn Interaction.modes.dataset(this, e, { intersect: true });\n\t\t\t\t\t},\n\n\t\t\t\t\tgetDatasetMeta: function getDatasetMeta(datasetIndex) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar dataset = me.data.datasets[datasetIndex];\n\t\t\t\t\t\tif (!dataset._meta) {\n\t\t\t\t\t\t\tdataset._meta = {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar meta = dataset._meta[me.id];\n\t\t\t\t\t\tif (!meta) {\n\t\t\t\t\t\t\tmeta = dataset._meta[me.id] = {\n\t\t\t\t\t\t\t\ttype: null,\n\t\t\t\t\t\t\t\tdata: [],\n\t\t\t\t\t\t\t\tdataset: null,\n\t\t\t\t\t\t\t\tcontroller: null,\n\t\t\t\t\t\t\t\thidden: null, // See isDatasetVisible() comment\n\t\t\t\t\t\t\t\txAxisID: null,\n\t\t\t\t\t\t\t\tyAxisID: null\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn meta;\n\t\t\t\t\t},\n\n\t\t\t\t\tgetVisibleDatasetCount: function getVisibleDatasetCount() {\n\t\t\t\t\t\tvar count = 0;\n\t\t\t\t\t\tfor (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tif (this.isDatasetVisible(i)) {\n\t\t\t\t\t\t\t\tcount++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn count;\n\t\t\t\t\t},\n\n\t\t\t\t\tisDatasetVisible: function isDatasetVisible(datasetIndex) {\n\t\t\t\t\t\tvar meta = this.getDatasetMeta(datasetIndex);\n\n\t\t\t\t\t\t// meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n\t\t\t\t\t\t// the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n\t\t\t\t\t\treturn typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden;\n\t\t\t\t\t},\n\n\t\t\t\t\tgenerateLegend: function generateLegend() {\n\t\t\t\t\t\treturn this.options.legendCallback(this);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tdestroyDatasetMeta: function destroyDatasetMeta(datasetIndex) {\n\t\t\t\t\t\tvar id = this.id;\n\t\t\t\t\t\tvar dataset = this.data.datasets[datasetIndex];\n\t\t\t\t\t\tvar meta = dataset._meta && dataset._meta[id];\n\n\t\t\t\t\t\tif (meta) {\n\t\t\t\t\t\t\tmeta.controller.destroy();\n\t\t\t\t\t\t\tdelete dataset._meta[id];\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tdestroy: function destroy() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar canvas = me.canvas;\n\t\t\t\t\t\tvar i, ilen;\n\n\t\t\t\t\t\tme.stop();\n\n\t\t\t\t\t\t// dataset controllers need to cleanup associated data\n\t\t\t\t\t\tfor (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tme.destroyDatasetMeta(i);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (canvas) {\n\t\t\t\t\t\t\tme.unbindEvents();\n\t\t\t\t\t\t\thelpers.canvas.clear(me);\n\t\t\t\t\t\t\tplatform.releaseContext(me.ctx);\n\t\t\t\t\t\t\tme.canvas = null;\n\t\t\t\t\t\t\tme.ctx = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tplugins.notify(me, 'destroy');\n\n\t\t\t\t\t\tdelete Chart.instances[me.id];\n\t\t\t\t\t},\n\n\t\t\t\t\ttoBase64Image: function toBase64Image() {\n\t\t\t\t\t\treturn this.canvas.toDataURL.apply(this.canvas, arguments);\n\t\t\t\t\t},\n\n\t\t\t\t\tinitToolTip: function initToolTip() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tme.tooltip = new Tooltip({\n\t\t\t\t\t\t\t_chart: me,\n\t\t\t\t\t\t\t_chartInstance: me, // deprecated, backward compatibility\n\t\t\t\t\t\t\t_data: me.data,\n\t\t\t\t\t\t\t_options: me.options.tooltips\n\t\t\t\t\t\t}, me);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tbindEvents: function bindEvents() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar listeners = me._listeners = {};\n\t\t\t\t\t\tvar listener = function listener() {\n\t\t\t\t\t\t\tme.eventHandler.apply(me, arguments);\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\thelpers.each(me.options.events, function (type) {\n\t\t\t\t\t\t\tplatform.addEventListener(me, type, listener);\n\t\t\t\t\t\t\tlisteners[type] = listener;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// Elements used to detect size change should not be injected for non responsive charts.\n\t\t\t\t\t\t// See https://github.com/chartjs/Chart.js/issues/2210\n\t\t\t\t\t\tif (me.options.responsive) {\n\t\t\t\t\t\t\tlistener = function listener() {\n\t\t\t\t\t\t\t\tme.resize();\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tplatform.addEventListener(me, 'resize', listener);\n\t\t\t\t\t\t\tlisteners.resize = listener;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tunbindEvents: function unbindEvents() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar listeners = me._listeners;\n\t\t\t\t\t\tif (!listeners) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdelete me._listeners;\n\t\t\t\t\t\thelpers.each(listeners, function (listener, type) {\n\t\t\t\t\t\t\tplatform.removeEventListener(me, type, listener);\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\n\t\t\t\t\tupdateHoverStyle: function updateHoverStyle(elements, mode, enabled) {\n\t\t\t\t\t\tvar method = enabled ? 'setHoverStyle' : 'removeHoverStyle';\n\t\t\t\t\t\tvar element, i, ilen;\n\n\t\t\t\t\t\tfor (i = 0, ilen = elements.length; i < ilen; ++i) {\n\t\t\t\t\t\t\telement = elements[i];\n\t\t\t\t\t\t\tif (element) {\n\t\t\t\t\t\t\t\tthis.getDatasetMeta(element._datasetIndex).controller[method](element);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\teventHandler: function eventHandler(e) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar tooltip = me.tooltip;\n\n\t\t\t\t\t\tif (plugins.notify(me, 'beforeEvent', [e]) === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Buffer any update calls so that renders do not occur\n\t\t\t\t\t\tme._bufferedRender = true;\n\t\t\t\t\t\tme._bufferedRequest = null;\n\n\t\t\t\t\t\tvar changed = me.handleEvent(e);\n\t\t\t\t\t\t// for smooth tooltip animations issue #4989\n\t\t\t\t\t\t// the tooltip should be the source of change\n\t\t\t\t\t\t// Animation check workaround:\n\t\t\t\t\t\t// tooltip._start will be null when tooltip isn't animating\n\t\t\t\t\t\tif (tooltip) {\n\t\t\t\t\t\t\tchanged = tooltip._start ? tooltip.handleEvent(e) : changed | tooltip.handleEvent(e);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tplugins.notify(me, 'afterEvent', [e]);\n\n\t\t\t\t\t\tvar bufferedRequest = me._bufferedRequest;\n\t\t\t\t\t\tif (bufferedRequest) {\n\t\t\t\t\t\t\t// If we have an update that was triggered, we need to do a normal render\n\t\t\t\t\t\t\tme.render(bufferedRequest);\n\t\t\t\t\t\t} else if (changed && !me.animating) {\n\t\t\t\t\t\t\t// If entering, leaving, or changing elements, animate the change via pivot\n\t\t\t\t\t\t\tme.stop();\n\n\t\t\t\t\t\t\t// We only need to render at this point. Updating will cause scales to be\n\t\t\t\t\t\t\t// recomputed generating flicker & using more memory than necessary.\n\t\t\t\t\t\t\tme.render({\n\t\t\t\t\t\t\t\tduration: me.options.hover.animationDuration,\n\t\t\t\t\t\t\t\tlazy: true\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tme._bufferedRender = false;\n\t\t\t\t\t\tme._bufferedRequest = null;\n\n\t\t\t\t\t\treturn me;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Handle an event\n * @private\n * @param {IEvent} event the event to handle\n * @return {Boolean} true if the chart needs to re-render\n */\n\t\t\t\t\thandleEvent: function handleEvent(e) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar options = me.options || {};\n\t\t\t\t\t\tvar hoverOptions = options.hover;\n\t\t\t\t\t\tvar changed = false;\n\n\t\t\t\t\t\tme.lastActive = me.lastActive || [];\n\n\t\t\t\t\t\t// Find Active Elements for hover and tooltips\n\t\t\t\t\t\tif (e.type === 'mouseout') {\n\t\t\t\t\t\t\tme.active = [];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tme.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Invoke onHover hook\n\t\t\t\t\t\t// Need to call with native event here to not break backwards compatibility\n\t\t\t\t\t\thelpers.callback(options.onHover || options.hover.onHover, [e.native, me.active], me);\n\n\t\t\t\t\t\tif (e.type === 'mouseup' || e.type === 'click') {\n\t\t\t\t\t\t\tif (options.onClick) {\n\t\t\t\t\t\t\t\t// Use e.native here for backwards compatibility\n\t\t\t\t\t\t\t\toptions.onClick.call(me, e.native, me.active);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Remove styling for last active (even if it may still be active)\n\t\t\t\t\t\tif (me.lastActive.length) {\n\t\t\t\t\t\t\tme.updateHoverStyle(me.lastActive, hoverOptions.mode, false);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Built in hover styling\n\t\t\t\t\t\tif (me.active.length && hoverOptions.mode) {\n\t\t\t\t\t\t\tme.updateHoverStyle(me.active, hoverOptions.mode, true);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tchanged = !helpers.arrayEquals(me.active, me.lastActive);\n\n\t\t\t\t\t\t// Remember Last Actives\n\t\t\t\t\t\tme.lastActive = me.active;\n\n\t\t\t\t\t\treturn changed;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t/**\n * Provided for backward compatibility, use Chart instead.\n * @class Chart.Controller\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\n\t\t\t\tChart.Controller = Chart;\n\t\t\t};\n\t\t}, { \"22\": 22, \"23\": 23, \"26\": 26, \"29\": 29, \"31\": 31, \"32\": 32, \"34\": 34, \"36\": 36, \"46\": 46, \"49\": 49 }], 25: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(46);\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tvar arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\n\n\t\t\t\t/**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments.\n */\n\t\t\t\tfunction listenArrayEvents(array, listener) {\n\t\t\t\t\tif (array._chartjs) {\n\t\t\t\t\t\tarray._chartjs.listeners.push(listener);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tObject.defineProperty(array, '_chartjs', {\n\t\t\t\t\t\tconfigurable: true,\n\t\t\t\t\t\tenumerable: false,\n\t\t\t\t\t\tvalue: {\n\t\t\t\t\t\t\tlisteners: [listener]\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tarrayEvents.forEach(function (key) {\n\t\t\t\t\t\tvar method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1);\n\t\t\t\t\t\tvar base = array[key];\n\n\t\t\t\t\t\tObject.defineProperty(array, key, {\n\t\t\t\t\t\t\tconfigurable: true,\n\t\t\t\t\t\t\tenumerable: false,\n\t\t\t\t\t\t\tvalue: function value() {\n\t\t\t\t\t\t\t\tvar args = Array.prototype.slice.call(arguments);\n\t\t\t\t\t\t\t\tvar res = base.apply(this, args);\n\n\t\t\t\t\t\t\t\thelpers.each(array._chartjs.listeners, function (object) {\n\t\t\t\t\t\t\t\t\tif (typeof object[method] === 'function') {\n\t\t\t\t\t\t\t\t\t\tobject[method].apply(object, args);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\treturn res;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t/**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\n\t\t\t\tfunction unlistenArrayEvents(array, listener) {\n\t\t\t\t\tvar stub = array._chartjs;\n\t\t\t\t\tif (!stub) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar listeners = stub.listeners;\n\t\t\t\t\tvar index = listeners.indexOf(listener);\n\t\t\t\t\tif (index !== -1) {\n\t\t\t\t\t\tlisteners.splice(index, 1);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (listeners.length > 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tarrayEvents.forEach(function (key) {\n\t\t\t\t\t\tdelete array[key];\n\t\t\t\t\t});\n\n\t\t\t\t\tdelete array._chartjs;\n\t\t\t\t}\n\n\t\t\t\t// Base class for all dataset controllers (line, bar, etc)\n\t\t\t\tChart.DatasetController = function (chart, datasetIndex) {\n\t\t\t\t\tthis.initialize(chart, datasetIndex);\n\t\t\t\t};\n\n\t\t\t\thelpers.extend(Chart.DatasetController.prototype, {\n\n\t\t\t\t\t/**\n * Element type used to generate a meta dataset (e.g. Chart.element.Line).\n * @type {Chart.core.element}\n */\n\t\t\t\t\tdatasetElementType: null,\n\n\t\t\t\t\t/**\n * Element type used to generate a meta data (e.g. Chart.element.Point).\n * @type {Chart.core.element}\n */\n\t\t\t\t\tdataElementType: null,\n\n\t\t\t\t\tinitialize: function initialize(chart, datasetIndex) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tme.chart = chart;\n\t\t\t\t\t\tme.index = datasetIndex;\n\t\t\t\t\t\tme.linkScales();\n\t\t\t\t\t\tme.addElements();\n\t\t\t\t\t},\n\n\t\t\t\t\tupdateIndex: function updateIndex(datasetIndex) {\n\t\t\t\t\t\tthis.index = datasetIndex;\n\t\t\t\t\t},\n\n\t\t\t\t\tlinkScales: function linkScales() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\n\t\t\t\t\t\tif (meta.xAxisID === null || !(meta.xAxisID in me.chart.scales)) {\n\t\t\t\t\t\t\tmeta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (meta.yAxisID === null || !(meta.yAxisID in me.chart.scales)) {\n\t\t\t\t\t\t\tmeta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tgetDataset: function getDataset() {\n\t\t\t\t\t\treturn this.chart.data.datasets[this.index];\n\t\t\t\t\t},\n\n\t\t\t\t\tgetMeta: function getMeta() {\n\t\t\t\t\t\treturn this.chart.getDatasetMeta(this.index);\n\t\t\t\t\t},\n\n\t\t\t\t\tgetScaleForId: function getScaleForId(scaleID) {\n\t\t\t\t\t\treturn this.chart.scales[scaleID];\n\t\t\t\t\t},\n\n\t\t\t\t\treset: function reset() {\n\t\t\t\t\t\tthis.update(true);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tdestroy: function destroy() {\n\t\t\t\t\t\tif (this._data) {\n\t\t\t\t\t\t\tunlistenArrayEvents(this._data, this);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tcreateMetaDataset: function createMetaDataset() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar type = me.datasetElementType;\n\t\t\t\t\t\treturn type && new type({\n\t\t\t\t\t\t\t_chart: me.chart,\n\t\t\t\t\t\t\t_datasetIndex: me.index\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\n\t\t\t\t\tcreateMetaData: function createMetaData(index) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar type = me.dataElementType;\n\t\t\t\t\t\treturn type && new type({\n\t\t\t\t\t\t\t_chart: me.chart,\n\t\t\t\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t\t\t\t_index: index\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\n\t\t\t\t\taddElements: function addElements() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar data = me.getDataset().data || [];\n\t\t\t\t\t\tvar metaData = meta.data;\n\t\t\t\t\t\tvar i, ilen;\n\n\t\t\t\t\t\tfor (i = 0, ilen = data.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tmetaData[i] = metaData[i] || me.createMetaData(i);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmeta.dataset = meta.dataset || me.createMetaDataset();\n\t\t\t\t\t},\n\n\t\t\t\t\taddElementAndReset: function addElementAndReset(index) {\n\t\t\t\t\t\tvar element = this.createMetaData(index);\n\t\t\t\t\t\tthis.getMeta().data.splice(index, 0, element);\n\t\t\t\t\t\tthis.updateElement(element, index, true);\n\t\t\t\t\t},\n\n\t\t\t\t\tbuildOrUpdateElements: function buildOrUpdateElements() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar dataset = me.getDataset();\n\t\t\t\t\t\tvar data = dataset.data || (dataset.data = []);\n\n\t\t\t\t\t\t// In order to correctly handle data addition/deletion animation (an thus simulate\n\t\t\t\t\t\t// real-time charts), we need to monitor these data modifications and synchronize\n\t\t\t\t\t\t// the internal meta data accordingly.\n\t\t\t\t\t\tif (me._data !== data) {\n\t\t\t\t\t\t\tif (me._data) {\n\t\t\t\t\t\t\t\t// This case happens when the user replaced the data array instance.\n\t\t\t\t\t\t\t\tunlistenArrayEvents(me._data, me);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlistenArrayEvents(data, me);\n\t\t\t\t\t\t\tme._data = data;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Re-sync meta data in case the user replaced the data array or if we missed\n\t\t\t\t\t\t// any updates and so make sure that we handle number of datapoints changing.\n\t\t\t\t\t\tme.resyncElements();\n\t\t\t\t\t},\n\n\t\t\t\t\tupdate: helpers.noop,\n\n\t\t\t\t\ttransition: function transition(easingValue) {\n\t\t\t\t\t\tvar meta = this.getMeta();\n\t\t\t\t\t\tvar elements = meta.data || [];\n\t\t\t\t\t\tvar ilen = elements.length;\n\t\t\t\t\t\tvar i = 0;\n\n\t\t\t\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\t\t\t\telements[i].transition(easingValue);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (meta.dataset) {\n\t\t\t\t\t\t\tmeta.dataset.transition(easingValue);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tdraw: function draw() {\n\t\t\t\t\t\tvar meta = this.getMeta();\n\t\t\t\t\t\tvar elements = meta.data || [];\n\t\t\t\t\t\tvar ilen = elements.length;\n\t\t\t\t\t\tvar i = 0;\n\n\t\t\t\t\t\tif (meta.dataset) {\n\t\t\t\t\t\t\tmeta.dataset.draw();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\t\t\t\telements[i].draw();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tremoveHoverStyle: function removeHoverStyle(element) {\n\t\t\t\t\t\thelpers.merge(element._model, element.$previousStyle || {});\n\t\t\t\t\t\tdelete element.$previousStyle;\n\t\t\t\t\t},\n\n\t\t\t\t\tsetHoverStyle: function setHoverStyle(element) {\n\t\t\t\t\t\tvar dataset = this.chart.data.datasets[element._datasetIndex];\n\t\t\t\t\t\tvar index = element._index;\n\t\t\t\t\t\tvar custom = element.custom || {};\n\t\t\t\t\t\tvar valueOrDefault = helpers.valueAtIndexOrDefault;\n\t\t\t\t\t\tvar getHoverColor = helpers.getHoverColor;\n\t\t\t\t\t\tvar model = element._model;\n\n\t\t\t\t\t\telement.$previousStyle = {\n\t\t\t\t\t\t\tbackgroundColor: model.backgroundColor,\n\t\t\t\t\t\t\tborderColor: model.borderColor,\n\t\t\t\t\t\t\tborderWidth: model.borderWidth\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueOrDefault(dataset.hoverBackgroundColor, index, getHoverColor(model.backgroundColor));\n\t\t\t\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : valueOrDefault(dataset.hoverBorderColor, index, getHoverColor(model.borderColor));\n\t\t\t\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : valueOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tresyncElements: function resyncElements() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar meta = me.getMeta();\n\t\t\t\t\t\tvar data = me.getDataset().data;\n\t\t\t\t\t\tvar numMeta = meta.data.length;\n\t\t\t\t\t\tvar numData = data.length;\n\n\t\t\t\t\t\tif (numData < numMeta) {\n\t\t\t\t\t\t\tmeta.data.splice(numData, numMeta - numData);\n\t\t\t\t\t\t} else if (numData > numMeta) {\n\t\t\t\t\t\t\tme.insertElements(numMeta, numData - numMeta);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tinsertElements: function insertElements(start, count) {\n\t\t\t\t\t\tfor (var i = 0; i < count; ++i) {\n\t\t\t\t\t\t\tthis.addElementAndReset(start + i);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tonDataPush: function onDataPush() {\n\t\t\t\t\t\tthis.insertElements(this.getDataset().data.length - 1, arguments.length);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tonDataPop: function onDataPop() {\n\t\t\t\t\t\tthis.getMeta().data.pop();\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tonDataShift: function onDataShift() {\n\t\t\t\t\t\tthis.getMeta().data.shift();\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tonDataSplice: function onDataSplice(start, count) {\n\t\t\t\t\t\tthis.getMeta().data.splice(start, count);\n\t\t\t\t\t\tthis.insertElements(start, arguments.length - 2);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tonDataUnshift: function onDataUnshift() {\n\t\t\t\t\t\tthis.insertElements(0, arguments.length);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tChart.DatasetController.extend = helpers.inherits;\n\t\t\t};\n\t\t}, { \"46\": 46 }], 26: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(46);\n\n\t\t\tmodule.exports = {\n\t\t\t\t/**\n * @private\n */\n\t\t\t\t_set: function _set(scope, values) {\n\t\t\t\t\treturn helpers.merge(this[scope] || (this[scope] = {}), values);\n\t\t\t\t}\n\t\t\t};\n\t\t}, { \"46\": 46 }], 27: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar color = require(3);\n\t\t\tvar helpers = require(46);\n\n\t\t\tfunction interpolate(start, view, model, ease) {\n\t\t\t\tvar keys = Object.keys(model);\n\t\t\t\tvar i, ilen, key, actual, origin, target, type, c0, c1;\n\n\t\t\t\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\n\t\t\t\t\tkey = keys[i];\n\n\t\t\t\t\ttarget = model[key];\n\n\t\t\t\t\t// if a value is added to the model after pivot() has been called, the view\n\t\t\t\t\t// doesn't contain it, so let's initialize the view to the target value.\n\t\t\t\t\tif (!view.hasOwnProperty(key)) {\n\t\t\t\t\t\tview[key] = target;\n\t\t\t\t\t}\n\n\t\t\t\t\tactual = view[key];\n\n\t\t\t\t\tif (actual === target || key[0] === '_') {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!start.hasOwnProperty(key)) {\n\t\t\t\t\t\tstart[key] = actual;\n\t\t\t\t\t}\n\n\t\t\t\t\torigin = start[key];\n\n\t\t\t\t\ttype = typeof target === \"undefined\" ? \"undefined\" : _typeof(target);\n\n\t\t\t\t\tif (type === (typeof origin === \"undefined\" ? \"undefined\" : _typeof(origin))) {\n\t\t\t\t\t\tif (type === 'string') {\n\t\t\t\t\t\t\tc0 = color(origin);\n\t\t\t\t\t\t\tif (c0.valid) {\n\t\t\t\t\t\t\t\tc1 = color(target);\n\t\t\t\t\t\t\t\tif (c1.valid) {\n\t\t\t\t\t\t\t\t\tview[key] = c1.mix(c0, ease).rgbString();\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (type === 'number' && isFinite(origin) && isFinite(target)) {\n\t\t\t\t\t\t\tview[key] = origin + (target - origin) * ease;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tview[key] = target;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar Element = function Element(configuration) {\n\t\t\t\thelpers.extend(this, configuration);\n\t\t\t\tthis.initialize.apply(this, arguments);\n\t\t\t};\n\n\t\t\thelpers.extend(Element.prototype, {\n\n\t\t\t\tinitialize: function initialize() {\n\t\t\t\t\tthis.hidden = false;\n\t\t\t\t},\n\n\t\t\t\tpivot: function pivot() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tif (!me._view) {\n\t\t\t\t\t\tme._view = helpers.clone(me._model);\n\t\t\t\t\t}\n\t\t\t\t\tme._start = {};\n\t\t\t\t\treturn me;\n\t\t\t\t},\n\n\t\t\t\ttransition: function transition(ease) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar model = me._model;\n\t\t\t\t\tvar start = me._start;\n\t\t\t\t\tvar view = me._view;\n\n\t\t\t\t\t// No animation -> No Transition\n\t\t\t\t\tif (!model || ease === 1) {\n\t\t\t\t\t\tme._view = model;\n\t\t\t\t\t\tme._start = null;\n\t\t\t\t\t\treturn me;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!view) {\n\t\t\t\t\t\tview = me._view = {};\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!start) {\n\t\t\t\t\t\tstart = me._start = {};\n\t\t\t\t\t}\n\n\t\t\t\t\tinterpolate(start, view, model, ease);\n\n\t\t\t\t\treturn me;\n\t\t\t\t},\n\n\t\t\t\ttooltipPosition: function tooltipPosition() {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: this._model.x,\n\t\t\t\t\t\ty: this._model.y\n\t\t\t\t\t};\n\t\t\t\t},\n\n\t\t\t\thasValue: function hasValue() {\n\t\t\t\t\treturn helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tElement.extend = helpers.inherits;\n\n\t\t\tmodule.exports = Element;\n\t\t}, { \"3\": 3, \"46\": 46 }], 28: [function (require, module, exports) {\n\t\t\t/* global window: false */\n\t\t\t/* global document: false */\n\t\t\t'use strict';\n\n\t\t\tvar color = require(3);\n\t\t\tvar defaults = require(26);\n\t\t\tvar helpers = require(46);\n\t\t\tvar scaleService = require(34);\n\n\t\t\tmodule.exports = function () {\n\n\t\t\t\t// -- Basic js utility methods\n\n\t\t\t\thelpers.configMerge = function () /* objects ... */{\n\t\t\t\t\treturn helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), {\n\t\t\t\t\t\tmerger: function merger(key, target, source, options) {\n\t\t\t\t\t\t\tvar tval = target[key] || {};\n\t\t\t\t\t\t\tvar sval = source[key];\n\n\t\t\t\t\t\t\tif (key === 'scales') {\n\t\t\t\t\t\t\t\t// scale config merging is complex. Add our own function here for that\n\t\t\t\t\t\t\t\ttarget[key] = helpers.scaleMerge(tval, sval);\n\t\t\t\t\t\t\t} else if (key === 'scale') {\n\t\t\t\t\t\t\t\t// used in polar area & radar charts since there is only one scale\n\t\t\t\t\t\t\t\ttarget[key] = helpers.merge(tval, [scaleService.getScaleDefaults(sval.type), sval]);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\thelpers._merger(key, target, source, options);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\thelpers.scaleMerge = function () /* objects ... */{\n\t\t\t\t\treturn helpers.merge(helpers.clone(arguments[0]), [].slice.call(arguments, 1), {\n\t\t\t\t\t\tmerger: function merger(key, target, source, options) {\n\t\t\t\t\t\t\tif (key === 'xAxes' || key === 'yAxes') {\n\t\t\t\t\t\t\t\tvar slen = source[key].length;\n\t\t\t\t\t\t\t\tvar i, type, scale;\n\n\t\t\t\t\t\t\t\tif (!target[key]) {\n\t\t\t\t\t\t\t\t\ttarget[key] = [];\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tfor (i = 0; i < slen; ++i) {\n\t\t\t\t\t\t\t\t\tscale = source[key][i];\n\t\t\t\t\t\t\t\t\ttype = helpers.valueOrDefault(scale.type, key === 'xAxes' ? 'category' : 'linear');\n\n\t\t\t\t\t\t\t\t\tif (i >= target[key].length) {\n\t\t\t\t\t\t\t\t\t\ttarget[key].push({});\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (!target[key][i].type || scale.type && scale.type !== target[key][i].type) {\n\t\t\t\t\t\t\t\t\t\t// new/untyped scale or type changed: let's apply the new defaults\n\t\t\t\t\t\t\t\t\t\t// then merge source scale to correctly overwrite the defaults.\n\t\t\t\t\t\t\t\t\t\thelpers.merge(target[key][i], [scaleService.getScaleDefaults(type), scale]);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t// scales type are the same\n\t\t\t\t\t\t\t\t\t\thelpers.merge(target[key][i], scale);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\thelpers._merger(key, target, source, options);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\thelpers.where = function (collection, filterCallback) {\n\t\t\t\t\tif (helpers.isArray(collection) && Array.prototype.filter) {\n\t\t\t\t\t\treturn collection.filter(filterCallback);\n\t\t\t\t\t}\n\t\t\t\t\tvar filtered = [];\n\n\t\t\t\t\thelpers.each(collection, function (item) {\n\t\t\t\t\t\tif (filterCallback(item)) {\n\t\t\t\t\t\t\tfiltered.push(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\treturn filtered;\n\t\t\t\t};\n\t\t\t\thelpers.findIndex = Array.prototype.findIndex ? function (array, callback, scope) {\n\t\t\t\t\treturn array.findIndex(callback, scope);\n\t\t\t\t} : function (array, callback, scope) {\n\t\t\t\t\tscope = scope === undefined ? array : scope;\n\t\t\t\t\tfor (var i = 0, ilen = array.length; i < ilen; ++i) {\n\t\t\t\t\t\tif (callback.call(scope, array[i], i, array)) {\n\t\t\t\t\t\t\treturn i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn -1;\n\t\t\t\t};\n\t\t\t\thelpers.findNextWhere = function (arrayToSearch, filterCallback, startIndex) {\n\t\t\t\t\t// Default to start of the array\n\t\t\t\t\tif (helpers.isNullOrUndef(startIndex)) {\n\t\t\t\t\t\tstartIndex = -1;\n\t\t\t\t\t}\n\t\t\t\t\tfor (var i = startIndex + 1; i < arrayToSearch.length; i++) {\n\t\t\t\t\t\tvar currentItem = arrayToSearch[i];\n\t\t\t\t\t\tif (filterCallback(currentItem)) {\n\t\t\t\t\t\t\treturn currentItem;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\thelpers.findPreviousWhere = function (arrayToSearch, filterCallback, startIndex) {\n\t\t\t\t\t// Default to end of the array\n\t\t\t\t\tif (helpers.isNullOrUndef(startIndex)) {\n\t\t\t\t\t\tstartIndex = arrayToSearch.length;\n\t\t\t\t\t}\n\t\t\t\t\tfor (var i = startIndex - 1; i >= 0; i--) {\n\t\t\t\t\t\tvar currentItem = arrayToSearch[i];\n\t\t\t\t\t\tif (filterCallback(currentItem)) {\n\t\t\t\t\t\t\treturn currentItem;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// -- Math methods\n\t\t\t\thelpers.isNumber = function (n) {\n\t\t\t\t\treturn !isNaN(parseFloat(n)) && isFinite(n);\n\t\t\t\t};\n\t\t\t\thelpers.almostEquals = function (x, y, epsilon) {\n\t\t\t\t\treturn Math.abs(x - y) < epsilon;\n\t\t\t\t};\n\t\t\t\thelpers.almostWhole = function (x, epsilon) {\n\t\t\t\t\tvar rounded = Math.round(x);\n\t\t\t\t\treturn rounded - epsilon < x && rounded + epsilon > x;\n\t\t\t\t};\n\t\t\t\thelpers.max = function (array) {\n\t\t\t\t\treturn array.reduce(function (max, value) {\n\t\t\t\t\t\tif (!isNaN(value)) {\n\t\t\t\t\t\t\treturn Math.max(max, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn max;\n\t\t\t\t\t}, Number.NEGATIVE_INFINITY);\n\t\t\t\t};\n\t\t\t\thelpers.min = function (array) {\n\t\t\t\t\treturn array.reduce(function (min, value) {\n\t\t\t\t\t\tif (!isNaN(value)) {\n\t\t\t\t\t\t\treturn Math.min(min, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn min;\n\t\t\t\t\t}, Number.POSITIVE_INFINITY);\n\t\t\t\t};\n\t\t\t\thelpers.sign = Math.sign ? function (x) {\n\t\t\t\t\treturn Math.sign(x);\n\t\t\t\t} : function (x) {\n\t\t\t\t\tx = +x; // convert to a number\n\t\t\t\t\tif (x === 0 || isNaN(x)) {\n\t\t\t\t\t\treturn x;\n\t\t\t\t\t}\n\t\t\t\t\treturn x > 0 ? 1 : -1;\n\t\t\t\t};\n\t\t\t\thelpers.log10 = Math.log10 ? function (x) {\n\t\t\t\t\treturn Math.log10(x);\n\t\t\t\t} : function (x) {\n\t\t\t\t\tvar exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10.\n\t\t\t\t\t// Check for whole powers of 10,\n\t\t\t\t\t// which due to floating point rounding error should be corrected.\n\t\t\t\t\tvar powerOf10 = Math.round(exponent);\n\t\t\t\t\tvar isPowerOf10 = x === Math.pow(10, powerOf10);\n\n\t\t\t\t\treturn isPowerOf10 ? powerOf10 : exponent;\n\t\t\t\t};\n\t\t\t\thelpers.toRadians = function (degrees) {\n\t\t\t\t\treturn degrees * (Math.PI / 180);\n\t\t\t\t};\n\t\t\t\thelpers.toDegrees = function (radians) {\n\t\t\t\t\treturn radians * (180 / Math.PI);\n\t\t\t\t};\n\t\t\t\t// Gets the angle from vertical upright to the point about a centre.\n\t\t\t\thelpers.getAngleFromPoint = function (centrePoint, anglePoint) {\n\t\t\t\t\tvar distanceFromXCenter = anglePoint.x - centrePoint.x;\n\t\t\t\t\tvar distanceFromYCenter = anglePoint.y - centrePoint.y;\n\t\t\t\t\tvar radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n\t\t\t\t\tvar angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n\t\t\t\t\tif (angle < -0.5 * Math.PI) {\n\t\t\t\t\t\tangle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tangle: angle,\n\t\t\t\t\t\tdistance: radialDistanceFromCenter\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\thelpers.distanceBetweenPoints = function (pt1, pt2) {\n\t\t\t\t\treturn Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n\t\t\t\t};\n\t\t\t\thelpers.aliasPixel = function (pixelWidth) {\n\t\t\t\t\treturn pixelWidth % 2 === 0 ? 0 : 0.5;\n\t\t\t\t};\n\t\t\t\thelpers.splineCurve = function (firstPoint, middlePoint, afterPoint, t) {\n\t\t\t\t\t// Props to Rob Spencer at scaled innovation for his post on splining between points\n\t\t\t\t\t// http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n\t\t\t\t\t// This function must also respect \"skipped\" points\n\n\t\t\t\t\tvar previous = firstPoint.skip ? middlePoint : firstPoint;\n\t\t\t\t\tvar current = middlePoint;\n\t\t\t\t\tvar next = afterPoint.skip ? middlePoint : afterPoint;\n\n\t\t\t\t\tvar d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));\n\t\t\t\t\tvar d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));\n\n\t\t\t\t\tvar s01 = d01 / (d01 + d12);\n\t\t\t\t\tvar s12 = d12 / (d01 + d12);\n\n\t\t\t\t\t// If all points are the same, s01 & s02 will be inf\n\t\t\t\t\ts01 = isNaN(s01) ? 0 : s01;\n\t\t\t\t\ts12 = isNaN(s12) ? 0 : s12;\n\n\t\t\t\t\tvar fa = t * s01; // scaling factor for triangle Ta\n\t\t\t\t\tvar fb = t * s12;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tprevious: {\n\t\t\t\t\t\t\tx: current.x - fa * (next.x - previous.x),\n\t\t\t\t\t\t\ty: current.y - fa * (next.y - previous.y)\n\t\t\t\t\t\t},\n\t\t\t\t\t\tnext: {\n\t\t\t\t\t\t\tx: current.x + fb * (next.x - previous.x),\n\t\t\t\t\t\t\ty: current.y + fb * (next.y - previous.y)\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t\thelpers.EPSILON = Number.EPSILON || 1e-14;\n\t\t\t\thelpers.splineCurveMonotone = function (points) {\n\t\t\t\t\t// This function calculates Bézier control points in a similar way than |splineCurve|,\n\t\t\t\t\t// but preserves monotonicity of the provided data and ensures no local extremums are added\n\t\t\t\t\t// between the dataset discrete points due to the interpolation.\n\t\t\t\t\t// See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n\n\t\t\t\t\tvar pointsWithTangents = (points || []).map(function (point) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tmodel: point._model,\n\t\t\t\t\t\t\tdeltaK: 0,\n\t\t\t\t\t\t\tmK: 0\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\n\t\t\t\t\t// Calculate slopes (deltaK) and initialize tangents (mK)\n\t\t\t\t\tvar pointsLen = pointsWithTangents.length;\n\t\t\t\t\tvar i, pointBefore, pointCurrent, pointAfter;\n\t\t\t\t\tfor (i = 0; i < pointsLen; ++i) {\n\t\t\t\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\t\t\t\tif (pointCurrent.model.skip) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n\t\t\t\t\t\tpointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n\t\t\t\t\t\tif (pointAfter && !pointAfter.model.skip) {\n\t\t\t\t\t\t\tvar slopeDeltaX = pointAfter.model.x - pointCurrent.model.x;\n\n\t\t\t\t\t\t\t// In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n\t\t\t\t\t\t\tpointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!pointBefore || pointBefore.model.skip) {\n\t\t\t\t\t\t\tpointCurrent.mK = pointCurrent.deltaK;\n\t\t\t\t\t\t} else if (!pointAfter || pointAfter.model.skip) {\n\t\t\t\t\t\t\tpointCurrent.mK = pointBefore.deltaK;\n\t\t\t\t\t\t} else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) {\n\t\t\t\t\t\t\tpointCurrent.mK = 0;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Adjust tangents to ensure monotonic properties\n\t\t\t\t\tvar alphaK, betaK, tauK, squaredMagnitude;\n\t\t\t\t\tfor (i = 0; i < pointsLen - 1; ++i) {\n\t\t\t\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\t\t\t\tpointAfter = pointsWithTangents[i + 1];\n\t\t\t\t\t\tif (pointCurrent.model.skip || pointAfter.model.skip) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (helpers.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) {\n\t\t\t\t\t\t\tpointCurrent.mK = pointAfter.mK = 0;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\talphaK = pointCurrent.mK / pointCurrent.deltaK;\n\t\t\t\t\t\tbetaK = pointAfter.mK / pointCurrent.deltaK;\n\t\t\t\t\t\tsquaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n\t\t\t\t\t\tif (squaredMagnitude <= 9) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttauK = 3 / Math.sqrt(squaredMagnitude);\n\t\t\t\t\t\tpointCurrent.mK = alphaK * tauK * pointCurrent.deltaK;\n\t\t\t\t\t\tpointAfter.mK = betaK * tauK * pointCurrent.deltaK;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Compute control points\n\t\t\t\t\tvar deltaX;\n\t\t\t\t\tfor (i = 0; i < pointsLen; ++i) {\n\t\t\t\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\t\t\t\tif (pointCurrent.model.skip) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n\t\t\t\t\t\tpointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n\t\t\t\t\t\tif (pointBefore && !pointBefore.model.skip) {\n\t\t\t\t\t\t\tdeltaX = (pointCurrent.model.x - pointBefore.model.x) / 3;\n\t\t\t\t\t\t\tpointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX;\n\t\t\t\t\t\t\tpointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (pointAfter && !pointAfter.model.skip) {\n\t\t\t\t\t\t\tdeltaX = (pointAfter.model.x - pointCurrent.model.x) / 3;\n\t\t\t\t\t\t\tpointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX;\n\t\t\t\t\t\t\tpointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\thelpers.nextItem = function (collection, index, loop) {\n\t\t\t\t\tif (loop) {\n\t\t\t\t\t\treturn index >= collection.length - 1 ? collection[0] : collection[index + 1];\n\t\t\t\t\t}\n\t\t\t\t\treturn index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1];\n\t\t\t\t};\n\t\t\t\thelpers.previousItem = function (collection, index, loop) {\n\t\t\t\t\tif (loop) {\n\t\t\t\t\t\treturn index <= 0 ? collection[collection.length - 1] : collection[index - 1];\n\t\t\t\t\t}\n\t\t\t\t\treturn index <= 0 ? collection[0] : collection[index - 1];\n\t\t\t\t};\n\t\t\t\t// Implementation of the nice number algorithm used in determining where axis labels will go\n\t\t\t\thelpers.niceNum = function (range, round) {\n\t\t\t\t\tvar exponent = Math.floor(helpers.log10(range));\n\t\t\t\t\tvar fraction = range / Math.pow(10, exponent);\n\t\t\t\t\tvar niceFraction;\n\n\t\t\t\t\tif (round) {\n\t\t\t\t\t\tif (fraction < 1.5) {\n\t\t\t\t\t\t\tniceFraction = 1;\n\t\t\t\t\t\t} else if (fraction < 3) {\n\t\t\t\t\t\t\tniceFraction = 2;\n\t\t\t\t\t\t} else if (fraction < 7) {\n\t\t\t\t\t\t\tniceFraction = 5;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tniceFraction = 10;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (fraction <= 1.0) {\n\t\t\t\t\t\tniceFraction = 1;\n\t\t\t\t\t} else if (fraction <= 2) {\n\t\t\t\t\t\tniceFraction = 2;\n\t\t\t\t\t} else if (fraction <= 5) {\n\t\t\t\t\t\tniceFraction = 5;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tniceFraction = 10;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn niceFraction * Math.pow(10, exponent);\n\t\t\t\t};\n\t\t\t\t// Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/\n\t\t\t\thelpers.requestAnimFrame = function () {\n\t\t\t\t\tif (typeof window === 'undefined') {\n\t\t\t\t\t\treturn function (callback) {\n\t\t\t\t\t\t\tcallback();\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\treturn window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) {\n\t\t\t\t\t\treturn window.setTimeout(callback, 1000 / 60);\n\t\t\t\t\t};\n\t\t\t\t}();\n\t\t\t\t// -- DOM methods\n\t\t\t\thelpers.getRelativePosition = function (evt, chart) {\n\t\t\t\t\tvar mouseX, mouseY;\n\t\t\t\t\tvar e = evt.originalEvent || evt;\n\t\t\t\t\tvar canvas = evt.target || evt.srcElement;\n\t\t\t\t\tvar boundingRect = canvas.getBoundingClientRect();\n\n\t\t\t\t\tvar touches = e.touches;\n\t\t\t\t\tif (touches && touches.length > 0) {\n\t\t\t\t\t\tmouseX = touches[0].clientX;\n\t\t\t\t\t\tmouseY = touches[0].clientY;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmouseX = e.clientX;\n\t\t\t\t\t\tmouseY = e.clientY;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Scale mouse coordinates into canvas coordinates\n\t\t\t\t\t// by following the pattern laid out by 'jerryj' in the comments of\n\t\t\t\t\t// http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/\n\t\t\t\t\tvar paddingLeft = parseFloat(helpers.getStyle(canvas, 'padding-left'));\n\t\t\t\t\tvar paddingTop = parseFloat(helpers.getStyle(canvas, 'padding-top'));\n\t\t\t\t\tvar paddingRight = parseFloat(helpers.getStyle(canvas, 'padding-right'));\n\t\t\t\t\tvar paddingBottom = parseFloat(helpers.getStyle(canvas, 'padding-bottom'));\n\t\t\t\t\tvar width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight;\n\t\t\t\t\tvar height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom;\n\n\t\t\t\t\t// We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However\n\t\t\t\t\t// the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here\n\t\t\t\t\tmouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / width * canvas.width / chart.currentDevicePixelRatio);\n\t\t\t\t\tmouseY = Math.round((mouseY - boundingRect.top - paddingTop) / height * canvas.height / chart.currentDevicePixelRatio);\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: mouseX,\n\t\t\t\t\t\ty: mouseY\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Private helper function to convert max-width/max-height values that may be percentages into a number\n\t\t\t\tfunction parseMaxStyle(styleValue, node, parentProperty) {\n\t\t\t\t\tvar valueInPixels;\n\t\t\t\t\tif (typeof styleValue === 'string') {\n\t\t\t\t\t\tvalueInPixels = parseInt(styleValue, 10);\n\n\t\t\t\t\t\tif (styleValue.indexOf('%') !== -1) {\n\t\t\t\t\t\t\t// percentage * size in dimension\n\t\t\t\t\t\t\tvalueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalueInPixels = styleValue;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn valueInPixels;\n\t\t\t\t}\n\n\t\t\t\t/**\n * Returns if the given value contains an effective constraint.\n * @private\n */\n\t\t\t\tfunction isConstrainedValue(value) {\n\t\t\t\t\treturn value !== undefined && value !== null && value !== 'none';\n\t\t\t\t}\n\n\t\t\t\t// Private helper to get a constraint dimension\n\t\t\t\t// @param domNode : the node to check the constraint on\n\t\t\t\t// @param maxStyle : the style that defines the maximum for the direction we are using (maxWidth / maxHeight)\n\t\t\t\t// @param percentageProperty : property of parent to use when calculating width as a percentage\n\t\t\t\t// @see http://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser\n\t\t\t\tfunction getConstraintDimension(domNode, maxStyle, percentageProperty) {\n\t\t\t\t\tvar view = document.defaultView;\n\t\t\t\t\tvar parentNode = helpers._getParentNode(domNode);\n\t\t\t\t\tvar constrainedNode = view.getComputedStyle(domNode)[maxStyle];\n\t\t\t\t\tvar constrainedContainer = view.getComputedStyle(parentNode)[maxStyle];\n\t\t\t\t\tvar hasCNode = isConstrainedValue(constrainedNode);\n\t\t\t\t\tvar hasCContainer = isConstrainedValue(constrainedContainer);\n\t\t\t\t\tvar infinity = Number.POSITIVE_INFINITY;\n\n\t\t\t\t\tif (hasCNode || hasCContainer) {\n\t\t\t\t\t\treturn Math.min(hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity, hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn 'none';\n\t\t\t\t}\n\t\t\t\t// returns Number or undefined if no constraint\n\t\t\t\thelpers.getConstraintWidth = function (domNode) {\n\t\t\t\t\treturn getConstraintDimension(domNode, 'max-width', 'clientWidth');\n\t\t\t\t};\n\t\t\t\t// returns Number or undefined if no constraint\n\t\t\t\thelpers.getConstraintHeight = function (domNode) {\n\t\t\t\t\treturn getConstraintDimension(domNode, 'max-height', 'clientHeight');\n\t\t\t\t};\n\t\t\t\t/**\n * @private\n \t */\n\t\t\t\thelpers._calculatePadding = function (container, padding, parentDimension) {\n\t\t\t\t\tpadding = helpers.getStyle(container, padding);\n\n\t\t\t\t\treturn padding.indexOf('%') > -1 ? parentDimension / parseInt(padding, 10) : parseInt(padding, 10);\n\t\t\t\t};\n\t\t\t\t/**\n * @private\n */\n\t\t\t\thelpers._getParentNode = function (domNode) {\n\t\t\t\t\tvar parent = domNode.parentNode;\n\t\t\t\t\tif (parent && parent.host) {\n\t\t\t\t\t\tparent = parent.host;\n\t\t\t\t\t}\n\t\t\t\t\treturn parent;\n\t\t\t\t};\n\t\t\t\thelpers.getMaximumWidth = function (domNode) {\n\t\t\t\t\tvar container = helpers._getParentNode(domNode);\n\t\t\t\t\tif (!container) {\n\t\t\t\t\t\treturn domNode.clientWidth;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar clientWidth = container.clientWidth;\n\t\t\t\t\tvar paddingLeft = helpers._calculatePadding(container, 'padding-left', clientWidth);\n\t\t\t\t\tvar paddingRight = helpers._calculatePadding(container, 'padding-right', clientWidth);\n\n\t\t\t\t\tvar w = clientWidth - paddingLeft - paddingRight;\n\t\t\t\t\tvar cw = helpers.getConstraintWidth(domNode);\n\t\t\t\t\treturn isNaN(cw) ? w : Math.min(w, cw);\n\t\t\t\t};\n\t\t\t\thelpers.getMaximumHeight = function (domNode) {\n\t\t\t\t\tvar container = helpers._getParentNode(domNode);\n\t\t\t\t\tif (!container) {\n\t\t\t\t\t\treturn domNode.clientHeight;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar clientHeight = container.clientHeight;\n\t\t\t\t\tvar paddingTop = helpers._calculatePadding(container, 'padding-top', clientHeight);\n\t\t\t\t\tvar paddingBottom = helpers._calculatePadding(container, 'padding-bottom', clientHeight);\n\n\t\t\t\t\tvar h = clientHeight - paddingTop - paddingBottom;\n\t\t\t\t\tvar ch = helpers.getConstraintHeight(domNode);\n\t\t\t\t\treturn isNaN(ch) ? h : Math.min(h, ch);\n\t\t\t\t};\n\t\t\t\thelpers.getStyle = function (el, property) {\n\t\t\t\t\treturn el.currentStyle ? el.currentStyle[property] : document.defaultView.getComputedStyle(el, null).getPropertyValue(property);\n\t\t\t\t};\n\t\t\t\thelpers.retinaScale = function (chart, forceRatio) {\n\t\t\t\t\tvar pixelRatio = chart.currentDevicePixelRatio = forceRatio || typeof window !== 'undefined' && window.devicePixelRatio || 1;\n\t\t\t\t\tif (pixelRatio === 1) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar canvas = chart.canvas;\n\t\t\t\t\tvar height = chart.height;\n\t\t\t\t\tvar width = chart.width;\n\n\t\t\t\t\tcanvas.height = height * pixelRatio;\n\t\t\t\t\tcanvas.width = width * pixelRatio;\n\t\t\t\t\tchart.ctx.scale(pixelRatio, pixelRatio);\n\n\t\t\t\t\t// If no style has been set on the canvas, the render size is used as display size,\n\t\t\t\t\t// making the chart visually bigger, so let's enforce it to the \"correct\" values.\n\t\t\t\t\t// See https://github.com/chartjs/Chart.js/issues/3575\n\t\t\t\t\tif (!canvas.style.height && !canvas.style.width) {\n\t\t\t\t\t\tcanvas.style.height = height + 'px';\n\t\t\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t// -- Canvas methods\n\t\t\t\thelpers.fontString = function (pixelSize, fontStyle, fontFamily) {\n\t\t\t\t\treturn fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n\t\t\t\t};\n\t\t\t\thelpers.longestText = function (ctx, font, arrayOfThings, cache) {\n\t\t\t\t\tcache = cache || {};\n\t\t\t\t\tvar data = cache.data = cache.data || {};\n\t\t\t\t\tvar gc = cache.garbageCollect = cache.garbageCollect || [];\n\n\t\t\t\t\tif (cache.font !== font) {\n\t\t\t\t\t\tdata = cache.data = {};\n\t\t\t\t\t\tgc = cache.garbageCollect = [];\n\t\t\t\t\t\tcache.font = font;\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.font = font;\n\t\t\t\t\tvar longest = 0;\n\t\t\t\t\thelpers.each(arrayOfThings, function (thing) {\n\t\t\t\t\t\t// Undefined strings and arrays should not be measured\n\t\t\t\t\t\tif (thing !== undefined && thing !== null && helpers.isArray(thing) !== true) {\n\t\t\t\t\t\t\tlongest = helpers.measureText(ctx, data, gc, longest, thing);\n\t\t\t\t\t\t} else if (helpers.isArray(thing)) {\n\t\t\t\t\t\t\t// if it is an array lets measure each element\n\t\t\t\t\t\t\t// to do maybe simplify this function a bit so we can do this more recursively?\n\t\t\t\t\t\t\thelpers.each(thing, function (nestedThing) {\n\t\t\t\t\t\t\t\t// Undefined strings and arrays should not be measured\n\t\t\t\t\t\t\t\tif (nestedThing !== undefined && nestedThing !== null && !helpers.isArray(nestedThing)) {\n\t\t\t\t\t\t\t\t\tlongest = helpers.measureText(ctx, data, gc, longest, nestedThing);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tvar gcLen = gc.length / 2;\n\t\t\t\t\tif (gcLen > arrayOfThings.length) {\n\t\t\t\t\t\tfor (var i = 0; i < gcLen; i++) {\n\t\t\t\t\t\t\tdelete data[gc[i]];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tgc.splice(0, gcLen);\n\t\t\t\t\t}\n\t\t\t\t\treturn longest;\n\t\t\t\t};\n\t\t\t\thelpers.measureText = function (ctx, data, gc, longest, string) {\n\t\t\t\t\tvar textWidth = data[string];\n\t\t\t\t\tif (!textWidth) {\n\t\t\t\t\t\ttextWidth = data[string] = ctx.measureText(string).width;\n\t\t\t\t\t\tgc.push(string);\n\t\t\t\t\t}\n\t\t\t\t\tif (textWidth > longest) {\n\t\t\t\t\t\tlongest = textWidth;\n\t\t\t\t\t}\n\t\t\t\t\treturn longest;\n\t\t\t\t};\n\t\t\t\thelpers.numberOfLabelLines = function (arrayOfThings) {\n\t\t\t\t\tvar numberOfLines = 1;\n\t\t\t\t\thelpers.each(arrayOfThings, function (thing) {\n\t\t\t\t\t\tif (helpers.isArray(thing)) {\n\t\t\t\t\t\t\tif (thing.length > numberOfLines) {\n\t\t\t\t\t\t\t\tnumberOfLines = thing.length;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\treturn numberOfLines;\n\t\t\t\t};\n\n\t\t\t\thelpers.color = !color ? function (value) {\n\t\t\t\t\tconsole.error('Color.js not found!');\n\t\t\t\t\treturn value;\n\t\t\t\t} : function (value) {\n\t\t\t\t\t/* global CanvasGradient */\n\t\t\t\t\tif (value instanceof CanvasGradient) {\n\t\t\t\t\t\tvalue = defaults.global.defaultColor;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn color(value);\n\t\t\t\t};\n\n\t\t\t\thelpers.getHoverColor = function (colorValue) {\n\t\t\t\t\t/* global CanvasPattern */\n\t\t\t\t\treturn colorValue instanceof CanvasPattern ? colorValue : helpers.color(colorValue).saturate(0.5).darken(0.1).rgbString();\n\t\t\t\t};\n\t\t\t};\n\t\t}, { \"26\": 26, \"3\": 3, \"34\": 34, \"46\": 46 }], 29: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(46);\n\n\t\t\t/**\n * Helper function to get relative position for an event\n * @param {Event|IEvent} event - The event to get the position for\n * @param {Chart} chart - The chart\n * @returns {Point} the event position\n */\n\t\t\tfunction getRelativePosition(e, chart) {\n\t\t\t\tif (e.native) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: e.x,\n\t\t\t\t\t\ty: e.y\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn helpers.getRelativePosition(e, chart);\n\t\t\t}\n\n\t\t\t/**\n * Helper function to traverse all of the visible elements in the chart\n * @param chart {chart} the chart\n * @param handler {Function} the callback to execute for each visible item\n */\n\t\t\tfunction parseVisibleItems(chart, handler) {\n\t\t\t\tvar datasets = chart.data.datasets;\n\t\t\t\tvar meta, i, j, ilen, jlen;\n\n\t\t\t\tfor (i = 0, ilen = datasets.length; i < ilen; ++i) {\n\t\t\t\t\tif (!chart.isDatasetVisible(i)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t\tfor (j = 0, jlen = meta.data.length; j < jlen; ++j) {\n\t\t\t\t\t\tvar element = meta.data[j];\n\t\t\t\t\t\tif (!element._view.skip) {\n\t\t\t\t\t\t\thandler(element);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n * Helper function to get the items that intersect the event position\n * @param items {ChartElement[]} elements to filter\n * @param position {Point} the point to be nearest to\n * @return {ChartElement[]} the nearest items\n */\n\t\t\tfunction getIntersectItems(chart, position) {\n\t\t\t\tvar elements = [];\n\n\t\t\t\tparseVisibleItems(chart, function (element) {\n\t\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\t\telements.push(element);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn elements;\n\t\t\t}\n\n\t\t\t/**\n * Helper function to get the items nearest to the event position considering all visible items in teh chart\n * @param chart {Chart} the chart to look at elements from\n * @param position {Point} the point to be nearest to\n * @param intersect {Boolean} if true, only consider items that intersect the position\n * @param distanceMetric {Function} function to provide the distance between points\n * @return {ChartElement[]} the nearest items\n */\n\t\t\tfunction getNearestItems(chart, position, intersect, distanceMetric) {\n\t\t\t\tvar minDistance = Number.POSITIVE_INFINITY;\n\t\t\t\tvar nearestItems = [];\n\n\t\t\t\tparseVisibleItems(chart, function (element) {\n\t\t\t\t\tif (intersect && !element.inRange(position.x, position.y)) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar center = element.getCenterPoint();\n\t\t\t\t\tvar distance = distanceMetric(position, center);\n\n\t\t\t\t\tif (distance < minDistance) {\n\t\t\t\t\t\tnearestItems = [element];\n\t\t\t\t\t\tminDistance = distance;\n\t\t\t\t\t} else if (distance === minDistance) {\n\t\t\t\t\t\t// Can have multiple items at the same distance in which case we sort by size\n\t\t\t\t\t\tnearestItems.push(element);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn nearestItems;\n\t\t\t}\n\n\t\t\t/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {String} axis the axis mode. x|y|xy\n */\n\t\t\tfunction getDistanceMetricForAxis(axis) {\n\t\t\t\tvar useX = axis.indexOf('x') !== -1;\n\t\t\t\tvar useY = axis.indexOf('y') !== -1;\n\n\t\t\t\treturn function (pt1, pt2) {\n\t\t\t\t\tvar deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n\t\t\t\t\tvar deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n\t\t\t\t\treturn Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tfunction indexMode(chart, e, options) {\n\t\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\t\t// Default axis for index mode is 'x' to match old behaviour\n\t\t\t\toptions.axis = options.axis || 'x';\n\t\t\t\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\n\t\t\t\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n\t\t\t\tvar elements = [];\n\n\t\t\t\tif (!items.length) {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\n\t\t\t\tchart.data.datasets.forEach(function (dataset, datasetIndex) {\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex)) {\n\t\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\t\tvar element = meta.data[items[0]._index];\n\n\t\t\t\t\t\t// don't count items that are skipped (null data)\n\t\t\t\t\t\tif (element && !element._view.skip) {\n\t\t\t\t\t\t\telements.push(element);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn elements;\n\t\t\t}\n\n\t\t\t/**\n * @interface IInteractionOptions\n */\n\t\t\t/**\n * If true, only consider items that intersect the point\n * @name IInterfaceOptions#boolean\n * @type Boolean\n */\n\n\t\t\t/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\n\t\t\tmodule.exports = {\n\t\t\t\t// Helper function for different modes\n\t\t\t\tmodes: {\n\t\t\t\t\tsingle: function single(chart, e) {\n\t\t\t\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\t\t\t\tvar elements = [];\n\n\t\t\t\t\t\tparseVisibleItems(chart, function (element) {\n\t\t\t\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\t\t\t\telements.push(element);\n\t\t\t\t\t\t\t\treturn elements;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn elements.slice(0, 1);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @function Chart.Interaction.modes.label\n * @deprecated since version 2.4.0\n * @todo remove at version 3\n * @private\n */\n\t\t\t\t\tlabel: indexMode,\n\n\t\t\t\t\t/**\n * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n * @function Chart.Interaction.modes.index\n * @since v2.4.0\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use during interaction\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n\t\t\t\t\tindex: indexMode,\n\n\t\t\t\t\t/**\n * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n * If the options.intersect is false, we find the nearest item and return the items in that dataset\n * @function Chart.Interaction.modes.dataset\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use during interaction\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n\t\t\t\t\tdataset: function dataset(chart, e, options) {\n\t\t\t\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\t\t\t\toptions.axis = options.axis || 'xy';\n\t\t\t\t\t\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\n\t\t\t\t\t\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n\n\t\t\t\t\t\tif (items.length > 0) {\n\t\t\t\t\t\t\titems = chart.getDatasetMeta(items[0]._datasetIndex).data;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn items;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @function Chart.Interaction.modes.x-axis\n * @deprecated since version 2.4.0. Use index mode and intersect == true\n * @todo remove at version 3\n * @private\n */\n\t\t\t\t\t'x-axis': function xAxis(chart, e) {\n\t\t\t\t\t\treturn indexMode(chart, e, { intersect: false });\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Point mode returns all elements that hit test based on the event position\n * of the event\n * @function Chart.Interaction.modes.intersect\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n\t\t\t\t\tpoint: function point(chart, e) {\n\t\t\t\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\t\t\t\treturn getIntersectItems(chart, position);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * nearest mode returns the element closest to the point\n * @function Chart.Interaction.modes.intersect\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n\t\t\t\t\tnearest: function nearest(chart, e, options) {\n\t\t\t\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\t\t\t\toptions.axis = options.axis || 'xy';\n\t\t\t\t\t\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\n\t\t\t\t\t\tvar nearestItems = getNearestItems(chart, position, options.intersect, distanceMetric);\n\n\t\t\t\t\t\t// We have multiple items at the same distance from the event. Now sort by smallest\n\t\t\t\t\t\tif (nearestItems.length > 1) {\n\t\t\t\t\t\t\tnearestItems.sort(function (a, b) {\n\t\t\t\t\t\t\t\tvar sizeA = a.getArea();\n\t\t\t\t\t\t\t\tvar sizeB = b.getArea();\n\t\t\t\t\t\t\t\tvar ret = sizeA - sizeB;\n\n\t\t\t\t\t\t\t\tif (ret === 0) {\n\t\t\t\t\t\t\t\t\t// if equal sort by dataset index\n\t\t\t\t\t\t\t\t\tret = a._datasetIndex - b._datasetIndex;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn ret;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Return only 1 item\n\t\t\t\t\t\treturn nearestItems.slice(0, 1);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * x mode returns the elements that hit-test at the current x coordinate\n * @function Chart.Interaction.modes.x\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n\t\t\t\t\tx: function x(chart, e, options) {\n\t\t\t\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\t\t\t\tvar items = [];\n\t\t\t\t\t\tvar intersectsItem = false;\n\n\t\t\t\t\t\tparseVisibleItems(chart, function (element) {\n\t\t\t\t\t\t\tif (element.inXRange(position.x)) {\n\t\t\t\t\t\t\t\titems.push(element);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\t\t\t\tintersectsItem = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// If we want to trigger on an intersect and we don't have any items\n\t\t\t\t\t\t// that intersect the position, return nothing\n\t\t\t\t\t\tif (options.intersect && !intersectsItem) {\n\t\t\t\t\t\t\titems = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn items;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * y mode returns the elements that hit-test at the current y coordinate\n * @function Chart.Interaction.modes.y\n * @param chart {chart} the chart we are returning items from\n * @param e {Event} the event we are find things at\n * @param options {IInteractionOptions} options to use\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n */\n\t\t\t\t\ty: function y(chart, e, options) {\n\t\t\t\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\t\t\t\tvar items = [];\n\t\t\t\t\t\tvar intersectsItem = false;\n\n\t\t\t\t\t\tparseVisibleItems(chart, function (element) {\n\t\t\t\t\t\t\tif (element.inYRange(position.y)) {\n\t\t\t\t\t\t\t\titems.push(element);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\t\t\t\tintersectsItem = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// If we want to trigger on an intersect and we don't have any items\n\t\t\t\t\t\t// that intersect the position, return nothing\n\t\t\t\t\t\tif (options.intersect && !intersectsItem) {\n\t\t\t\t\t\t\titems = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn items;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}, { \"46\": 46 }], 30: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\n\t\t\tdefaults._set('global', {\n\t\t\t\tresponsive: true,\n\t\t\t\tresponsiveAnimationDuration: 0,\n\t\t\t\tmaintainAspectRatio: true,\n\t\t\t\tevents: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'],\n\t\t\t\thover: {\n\t\t\t\t\tonHover: null,\n\t\t\t\t\tmode: 'nearest',\n\t\t\t\t\tintersect: true,\n\t\t\t\t\tanimationDuration: 400\n\t\t\t\t},\n\t\t\t\tonClick: null,\n\t\t\t\tdefaultColor: 'rgba(0,0,0,0.1)',\n\t\t\t\tdefaultFontColor: '#666',\n\t\t\t\tdefaultFontFamily: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n\t\t\t\tdefaultFontSize: 12,\n\t\t\t\tdefaultFontStyle: 'normal',\n\t\t\t\tshowLines: true,\n\n\t\t\t\t// Element defaults defined in element extensions\n\t\t\t\telements: {},\n\n\t\t\t\t// Layout options such as padding\n\t\t\t\tlayout: {\n\t\t\t\t\tpadding: {\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\tbottom: 0,\n\t\t\t\t\t\tleft: 0\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmodule.exports = function () {\n\n\t\t\t\t// Occupy the global variable of Chart, and create a simple base class\n\t\t\t\tvar Chart = function Chart(item, config) {\n\t\t\t\t\tthis.construct(item, config);\n\t\t\t\t\treturn this;\n\t\t\t\t};\n\n\t\t\t\tChart.Chart = Chart;\n\n\t\t\t\treturn Chart;\n\t\t\t};\n\t\t}, { \"26\": 26 }], 31: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(46);\n\n\t\t\tfunction filterByPosition(array, position) {\n\t\t\t\treturn helpers.where(array, function (v) {\n\t\t\t\t\treturn v.position === position;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfunction sortByWeight(array, reverse) {\n\t\t\t\tarray.forEach(function (v, i) {\n\t\t\t\t\tv._tmpIndex_ = i;\n\t\t\t\t\treturn v;\n\t\t\t\t});\n\t\t\t\tarray.sort(function (a, b) {\n\t\t\t\t\tvar v0 = reverse ? b : a;\n\t\t\t\t\tvar v1 = reverse ? a : b;\n\t\t\t\t\treturn v0.weight === v1.weight ? v0._tmpIndex_ - v1._tmpIndex_ : v0.weight - v1.weight;\n\t\t\t\t});\n\t\t\t\tarray.forEach(function (v) {\n\t\t\t\t\tdelete v._tmpIndex_;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t/**\n * @interface ILayoutItem\n * @prop {String} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {Number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {Boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down\n * @prop {Function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {Function} update - Takes two parameters: width and height. Returns size of item\n * @prop {Function} getPadding - Returns an object with padding on the edges\n * @prop {Number} width - Width of item. Must be valid after update()\n * @prop {Number} height - Height of item. Must be valid after update()\n * @prop {Number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {Number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {Number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {Number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n\t\t\t// The layout service is very self explanatory. It's responsible for the layout within a chart.\n\t\t\t// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n\t\t\t// It is this service's responsibility of carrying out that layout.\n\t\t\tmodule.exports = {\n\t\t\t\tdefaults: {},\n\n\t\t\t\t/**\n * Register a box to a chart.\n * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n * @param {Chart} chart - the chart to use\n * @param {ILayoutItem} item - the item to add to be layed out\n */\n\t\t\t\taddBox: function addBox(chart, item) {\n\t\t\t\t\tif (!chart.boxes) {\n\t\t\t\t\t\tchart.boxes = [];\n\t\t\t\t\t}\n\n\t\t\t\t\t// initialize item with default values\n\t\t\t\t\titem.fullWidth = item.fullWidth || false;\n\t\t\t\t\titem.position = item.position || 'top';\n\t\t\t\t\titem.weight = item.weight || 0;\n\n\t\t\t\t\tchart.boxes.push(item);\n\t\t\t\t},\n\n\t\t\t\t/**\n * Remove a layoutItem from a chart\n * @param {Chart} chart - the chart to remove the box from\n * @param {Object} layoutItem - the item to remove from the layout\n */\n\t\t\t\tremoveBox: function removeBox(chart, layoutItem) {\n\t\t\t\t\tvar index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n\t\t\t\t\tif (index !== -1) {\n\t\t\t\t\t\tchart.boxes.splice(index, 1);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n * Sets (or updates) options on the given `item`.\n * @param {Chart} chart - the chart in which the item lives (or will be added to)\n * @param {Object} item - the item to configure with the given options\n * @param {Object} options - the new item options.\n */\n\t\t\t\tconfigure: function configure(chart, item, options) {\n\t\t\t\t\tvar props = ['fullWidth', 'position', 'weight'];\n\t\t\t\t\tvar ilen = props.length;\n\t\t\t\t\tvar i = 0;\n\t\t\t\t\tvar prop;\n\n\t\t\t\t\tfor (; i < ilen; ++i) {\n\t\t\t\t\t\tprop = props[i];\n\t\t\t\t\t\tif (options.hasOwnProperty(prop)) {\n\t\t\t\t\t\t\titem[prop] = options[prop];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n * Fits boxes of the given chart into the given size by having each box measure itself\n * then running a fitting algorithm\n * @param {Chart} chart - the chart\n * @param {Number} width - the width to fit into\n * @param {Number} height - the height to fit into\n */\n\t\t\t\tupdate: function update(chart, width, height) {\n\t\t\t\t\tif (!chart) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar layoutOptions = chart.options.layout || {};\n\t\t\t\t\tvar padding = helpers.options.toPadding(layoutOptions.padding);\n\t\t\t\t\tvar leftPadding = padding.left;\n\t\t\t\t\tvar rightPadding = padding.right;\n\t\t\t\t\tvar topPadding = padding.top;\n\t\t\t\t\tvar bottomPadding = padding.bottom;\n\n\t\t\t\t\tvar leftBoxes = filterByPosition(chart.boxes, 'left');\n\t\t\t\t\tvar rightBoxes = filterByPosition(chart.boxes, 'right');\n\t\t\t\t\tvar topBoxes = filterByPosition(chart.boxes, 'top');\n\t\t\t\t\tvar bottomBoxes = filterByPosition(chart.boxes, 'bottom');\n\t\t\t\t\tvar chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea');\n\n\t\t\t\t\t// Sort boxes by weight. A higher weight is further away from the chart area\n\t\t\t\t\tsortByWeight(leftBoxes, true);\n\t\t\t\t\tsortByWeight(rightBoxes, false);\n\t\t\t\t\tsortByWeight(topBoxes, true);\n\t\t\t\t\tsortByWeight(bottomBoxes, false);\n\n\t\t\t\t\t// Essentially we now have any number of boxes on each of the 4 sides.\n\t\t\t\t\t// Our canvas looks like the following.\n\t\t\t\t\t// The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n\t\t\t\t\t// B1 is the bottom axis\n\t\t\t\t\t// There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n\t\t\t\t\t// These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n\t\t\t\t\t// an error will be thrown.\n\t\t\t\t\t//\n\t\t\t\t\t// |----------------------------------------------------|\n\t\t\t\t\t// | T1 (Full Width) |\n\t\t\t\t\t// |----------------------------------------------------|\n\t\t\t\t\t// | | | T2 | |\n\t\t\t\t\t// | |----|-------------------------------------|----|\n\t\t\t\t\t// | | | C1 | | C2 | |\n\t\t\t\t\t// | | |----| |----| |\n\t\t\t\t\t// | | | | |\n\t\t\t\t\t// | L1 | L2 | ChartArea (C0) | R1 |\n\t\t\t\t\t// | | | | |\n\t\t\t\t\t// | | |----| |----| |\n\t\t\t\t\t// | | | C3 | | C4 | |\n\t\t\t\t\t// | |----|-------------------------------------|----|\n\t\t\t\t\t// | | | B1 | |\n\t\t\t\t\t// |----------------------------------------------------|\n\t\t\t\t\t// | B2 (Full Width) |\n\t\t\t\t\t// |----------------------------------------------------|\n\t\t\t\t\t//\n\t\t\t\t\t// What we do to find the best sizing, we do the following\n\t\t\t\t\t// 1. Determine the minimum size of the chart area.\n\t\t\t\t\t// 2. Split the remaining width equally between each vertical axis\n\t\t\t\t\t// 3. Split the remaining height equally between each horizontal axis\n\t\t\t\t\t// 4. Give each layout the maximum size it can be. The layout will return it's minimum size\n\t\t\t\t\t// 5. Adjust the sizes of each axis based on it's minimum reported size.\n\t\t\t\t\t// 6. Refit each axis\n\t\t\t\t\t// 7. Position each axis in the final location\n\t\t\t\t\t// 8. Tell the chart the final location of the chart area\n\t\t\t\t\t// 9. Tell any axes that overlay the chart area the positions of the chart area\n\n\t\t\t\t\t// Step 1\n\t\t\t\t\tvar chartWidth = width - leftPadding - rightPadding;\n\t\t\t\t\tvar chartHeight = height - topPadding - bottomPadding;\n\t\t\t\t\tvar chartAreaWidth = chartWidth / 2; // min 50%\n\t\t\t\t\tvar chartAreaHeight = chartHeight / 2; // min 50%\n\n\t\t\t\t\t// Step 2\n\t\t\t\t\tvar verticalBoxWidth = (width - chartAreaWidth) / (leftBoxes.length + rightBoxes.length);\n\n\t\t\t\t\t// Step 3\n\t\t\t\t\tvar horizontalBoxHeight = (height - chartAreaHeight) / (topBoxes.length + bottomBoxes.length);\n\n\t\t\t\t\t// Step 4\n\t\t\t\t\tvar maxChartAreaWidth = chartWidth;\n\t\t\t\t\tvar maxChartAreaHeight = chartHeight;\n\t\t\t\t\tvar minBoxSizes = [];\n\n\t\t\t\t\tfunction getMinimumBoxSize(box) {\n\t\t\t\t\t\tvar minSize;\n\t\t\t\t\t\tvar isHorizontal = box.isHorizontal();\n\n\t\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t\tminSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, horizontalBoxHeight);\n\t\t\t\t\t\t\tmaxChartAreaHeight -= minSize.height;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tminSize = box.update(verticalBoxWidth, maxChartAreaHeight);\n\t\t\t\t\t\t\tmaxChartAreaWidth -= minSize.width;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tminBoxSizes.push({\n\t\t\t\t\t\t\thorizontal: isHorizontal,\n\t\t\t\t\t\t\tminSize: minSize,\n\t\t\t\t\t\t\tbox: box\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\thelpers.each(leftBoxes.concat(rightBoxes, topBoxes, bottomBoxes), getMinimumBoxSize);\n\n\t\t\t\t\t// If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478)\n\t\t\t\t\tvar maxHorizontalLeftPadding = 0;\n\t\t\t\t\tvar maxHorizontalRightPadding = 0;\n\t\t\t\t\tvar maxVerticalTopPadding = 0;\n\t\t\t\t\tvar maxVerticalBottomPadding = 0;\n\n\t\t\t\t\thelpers.each(topBoxes.concat(bottomBoxes), function (horizontalBox) {\n\t\t\t\t\t\tif (horizontalBox.getPadding) {\n\t\t\t\t\t\t\tvar boxPadding = horizontalBox.getPadding();\n\t\t\t\t\t\t\tmaxHorizontalLeftPadding = Math.max(maxHorizontalLeftPadding, boxPadding.left);\n\t\t\t\t\t\t\tmaxHorizontalRightPadding = Math.max(maxHorizontalRightPadding, boxPadding.right);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\thelpers.each(leftBoxes.concat(rightBoxes), function (verticalBox) {\n\t\t\t\t\t\tif (verticalBox.getPadding) {\n\t\t\t\t\t\t\tvar boxPadding = verticalBox.getPadding();\n\t\t\t\t\t\t\tmaxVerticalTopPadding = Math.max(maxVerticalTopPadding, boxPadding.top);\n\t\t\t\t\t\t\tmaxVerticalBottomPadding = Math.max(maxVerticalBottomPadding, boxPadding.bottom);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\t// At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could\n\t\t\t\t\t// be if the axes are drawn at their minimum sizes.\n\t\t\t\t\t// Steps 5 & 6\n\t\t\t\t\tvar totalLeftBoxesWidth = leftPadding;\n\t\t\t\t\tvar totalRightBoxesWidth = rightPadding;\n\t\t\t\t\tvar totalTopBoxesHeight = topPadding;\n\t\t\t\t\tvar totalBottomBoxesHeight = bottomPadding;\n\n\t\t\t\t\t// Function to fit a box\n\t\t\t\t\tfunction fitBox(box) {\n\t\t\t\t\t\tvar minBoxSize = helpers.findNextWhere(minBoxSizes, function (minBox) {\n\t\t\t\t\t\t\treturn minBox.box === box;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (minBoxSize) {\n\t\t\t\t\t\t\tif (box.isHorizontal()) {\n\t\t\t\t\t\t\t\tvar scaleMargin = {\n\t\t\t\t\t\t\t\t\tleft: Math.max(totalLeftBoxesWidth, maxHorizontalLeftPadding),\n\t\t\t\t\t\t\t\t\tright: Math.max(totalRightBoxesWidth, maxHorizontalRightPadding),\n\t\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\t\tbottom: 0\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\t// Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends\n\t\t\t\t\t\t\t\t// on the margin. Sometimes they need to increase in size slightly\n\t\t\t\t\t\t\t\tbox.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tbox.update(minBoxSize.minSize.width, maxChartAreaHeight);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Update, and calculate the left and right margins for the horizontal boxes\n\t\t\t\t\thelpers.each(leftBoxes.concat(rightBoxes), fitBox);\n\n\t\t\t\t\thelpers.each(leftBoxes, function (box) {\n\t\t\t\t\t\ttotalLeftBoxesWidth += box.width;\n\t\t\t\t\t});\n\n\t\t\t\t\thelpers.each(rightBoxes, function (box) {\n\t\t\t\t\t\ttotalRightBoxesWidth += box.width;\n\t\t\t\t\t});\n\n\t\t\t\t\t// Set the Left and Right margins for the horizontal boxes\n\t\t\t\t\thelpers.each(topBoxes.concat(bottomBoxes), fitBox);\n\n\t\t\t\t\t// Figure out how much margin is on the top and bottom of the vertical boxes\n\t\t\t\t\thelpers.each(topBoxes, function (box) {\n\t\t\t\t\t\ttotalTopBoxesHeight += box.height;\n\t\t\t\t\t});\n\n\t\t\t\t\thelpers.each(bottomBoxes, function (box) {\n\t\t\t\t\t\ttotalBottomBoxesHeight += box.height;\n\t\t\t\t\t});\n\n\t\t\t\t\tfunction finalFitVerticalBox(box) {\n\t\t\t\t\t\tvar minBoxSize = helpers.findNextWhere(minBoxSizes, function (minSize) {\n\t\t\t\t\t\t\treturn minSize.box === box;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tvar scaleMargin = {\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\t\ttop: totalTopBoxesHeight,\n\t\t\t\t\t\t\tbottom: totalBottomBoxesHeight\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (minBoxSize) {\n\t\t\t\t\t\t\tbox.update(minBoxSize.minSize.width, maxChartAreaHeight, scaleMargin);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Let the left layout know the final margin\n\t\t\t\t\thelpers.each(leftBoxes.concat(rightBoxes), finalFitVerticalBox);\n\n\t\t\t\t\t// Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance)\n\t\t\t\t\ttotalLeftBoxesWidth = leftPadding;\n\t\t\t\t\ttotalRightBoxesWidth = rightPadding;\n\t\t\t\t\ttotalTopBoxesHeight = topPadding;\n\t\t\t\t\ttotalBottomBoxesHeight = bottomPadding;\n\n\t\t\t\t\thelpers.each(leftBoxes, function (box) {\n\t\t\t\t\t\ttotalLeftBoxesWidth += box.width;\n\t\t\t\t\t});\n\n\t\t\t\t\thelpers.each(rightBoxes, function (box) {\n\t\t\t\t\t\ttotalRightBoxesWidth += box.width;\n\t\t\t\t\t});\n\n\t\t\t\t\thelpers.each(topBoxes, function (box) {\n\t\t\t\t\t\ttotalTopBoxesHeight += box.height;\n\t\t\t\t\t});\n\t\t\t\t\thelpers.each(bottomBoxes, function (box) {\n\t\t\t\t\t\ttotalBottomBoxesHeight += box.height;\n\t\t\t\t\t});\n\n\t\t\t\t\t// We may be adding some padding to account for rotated x axis labels\n\t\t\t\t\tvar leftPaddingAddition = Math.max(maxHorizontalLeftPadding - totalLeftBoxesWidth, 0);\n\t\t\t\t\ttotalLeftBoxesWidth += leftPaddingAddition;\n\t\t\t\t\ttotalRightBoxesWidth += Math.max(maxHorizontalRightPadding - totalRightBoxesWidth, 0);\n\n\t\t\t\t\tvar topPaddingAddition = Math.max(maxVerticalTopPadding - totalTopBoxesHeight, 0);\n\t\t\t\t\ttotalTopBoxesHeight += topPaddingAddition;\n\t\t\t\t\ttotalBottomBoxesHeight += Math.max(maxVerticalBottomPadding - totalBottomBoxesHeight, 0);\n\n\t\t\t\t\t// Figure out if our chart area changed. This would occur if the dataset layout label rotation\n\t\t\t\t\t// changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do\n\t\t\t\t\t// without calling `fit` again\n\t\t\t\t\tvar newMaxChartAreaHeight = height - totalTopBoxesHeight - totalBottomBoxesHeight;\n\t\t\t\t\tvar newMaxChartAreaWidth = width - totalLeftBoxesWidth - totalRightBoxesWidth;\n\n\t\t\t\t\tif (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) {\n\t\t\t\t\t\thelpers.each(leftBoxes, function (box) {\n\t\t\t\t\t\t\tbox.height = newMaxChartAreaHeight;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\thelpers.each(rightBoxes, function (box) {\n\t\t\t\t\t\t\tbox.height = newMaxChartAreaHeight;\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\thelpers.each(topBoxes, function (box) {\n\t\t\t\t\t\t\tif (!box.fullWidth) {\n\t\t\t\t\t\t\t\tbox.width = newMaxChartAreaWidth;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\thelpers.each(bottomBoxes, function (box) {\n\t\t\t\t\t\t\tif (!box.fullWidth) {\n\t\t\t\t\t\t\t\tbox.width = newMaxChartAreaWidth;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tmaxChartAreaHeight = newMaxChartAreaHeight;\n\t\t\t\t\t\tmaxChartAreaWidth = newMaxChartAreaWidth;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Step 7 - Position the boxes\n\t\t\t\t\tvar left = leftPadding + leftPaddingAddition;\n\t\t\t\t\tvar top = topPadding + topPaddingAddition;\n\n\t\t\t\t\tfunction placeBox(box) {\n\t\t\t\t\t\tif (box.isHorizontal()) {\n\t\t\t\t\t\t\tbox.left = box.fullWidth ? leftPadding : totalLeftBoxesWidth;\n\t\t\t\t\t\t\tbox.right = box.fullWidth ? width - rightPadding : totalLeftBoxesWidth + maxChartAreaWidth;\n\t\t\t\t\t\t\tbox.top = top;\n\t\t\t\t\t\t\tbox.bottom = top + box.height;\n\n\t\t\t\t\t\t\t// Move to next point\n\t\t\t\t\t\t\ttop = box.bottom;\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tbox.left = left;\n\t\t\t\t\t\t\tbox.right = left + box.width;\n\t\t\t\t\t\t\tbox.top = totalTopBoxesHeight;\n\t\t\t\t\t\t\tbox.bottom = totalTopBoxesHeight + maxChartAreaHeight;\n\n\t\t\t\t\t\t\t// Move to next point\n\t\t\t\t\t\t\tleft = box.right;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\thelpers.each(leftBoxes.concat(topBoxes), placeBox);\n\n\t\t\t\t\t// Account for chart width and height\n\t\t\t\t\tleft += maxChartAreaWidth;\n\t\t\t\t\ttop += maxChartAreaHeight;\n\n\t\t\t\t\thelpers.each(rightBoxes, placeBox);\n\t\t\t\t\thelpers.each(bottomBoxes, placeBox);\n\n\t\t\t\t\t// Step 8\n\t\t\t\t\tchart.chartArea = {\n\t\t\t\t\t\tleft: totalLeftBoxesWidth,\n\t\t\t\t\t\ttop: totalTopBoxesHeight,\n\t\t\t\t\t\tright: totalLeftBoxesWidth + maxChartAreaWidth,\n\t\t\t\t\t\tbottom: totalTopBoxesHeight + maxChartAreaHeight\n\t\t\t\t\t};\n\n\t\t\t\t\t// Step 9\n\t\t\t\t\thelpers.each(chartAreaBoxes, function (box) {\n\t\t\t\t\t\tbox.left = chart.chartArea.left;\n\t\t\t\t\t\tbox.top = chart.chartArea.top;\n\t\t\t\t\t\tbox.right = chart.chartArea.right;\n\t\t\t\t\t\tbox.bottom = chart.chartArea.bottom;\n\n\t\t\t\t\t\tbox.update(maxChartAreaWidth, maxChartAreaHeight);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\t\t}, { \"46\": 46 }], 32: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('global', {\n\t\t\t\tplugins: {}\n\t\t\t});\n\n\t\t\t/**\n * The plugin service singleton\n * @namespace Chart.plugins\n * @since 2.1.0\n */\n\t\t\tmodule.exports = {\n\t\t\t\t/**\n * Globally registered plugins.\n * @private\n */\n\t\t\t\t_plugins: [],\n\n\t\t\t\t/**\n * This identifier is used to invalidate the descriptors cache attached to each chart\n * when a global plugin is registered or unregistered. In this case, the cache ID is\n * incremented and descriptors are regenerated during following API calls.\n * @private\n */\n\t\t\t\t_cacheId: 0,\n\n\t\t\t\t/**\n * Registers the given plugin(s) if not already registered.\n * @param {Array|Object} plugins plugin instance(s).\n */\n\t\t\t\tregister: function register(plugins) {\n\t\t\t\t\tvar p = this._plugins;\n\t\t\t\t\t[].concat(plugins).forEach(function (plugin) {\n\t\t\t\t\t\tif (p.indexOf(plugin) === -1) {\n\t\t\t\t\t\t\tp.push(plugin);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tthis._cacheId++;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Unregisters the given plugin(s) only if registered.\n * @param {Array|Object} plugins plugin instance(s).\n */\n\t\t\t\tunregister: function unregister(plugins) {\n\t\t\t\t\tvar p = this._plugins;\n\t\t\t\t\t[].concat(plugins).forEach(function (plugin) {\n\t\t\t\t\t\tvar idx = p.indexOf(plugin);\n\t\t\t\t\t\tif (idx !== -1) {\n\t\t\t\t\t\t\tp.splice(idx, 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tthis._cacheId++;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Remove all registered plugins.\n * @since 2.1.5\n */\n\t\t\t\tclear: function clear() {\n\t\t\t\t\tthis._plugins = [];\n\t\t\t\t\tthis._cacheId++;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns the number of registered plugins?\n * @returns {Number}\n * @since 2.1.5\n */\n\t\t\t\tcount: function count() {\n\t\t\t\t\treturn this._plugins.length;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns all registered plugin instances.\n * @returns {Array} array of plugin objects.\n * @since 2.1.5\n */\n\t\t\t\tgetAll: function getAll() {\n\t\t\t\t\treturn this._plugins;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Calls enabled plugins for `chart` on the specified hook and with the given args.\n * This method immediately returns as soon as a plugin explicitly returns false. The\n * returned value can be used, for instance, to interrupt the current action.\n * @param {Object} chart - The chart instance for which plugins should be called.\n * @param {String} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n * @param {Array} [args] - Extra arguments to apply to the hook call.\n * @returns {Boolean} false if any of the plugins return false, else returns true.\n */\n\t\t\t\tnotify: function notify(chart, hook, args) {\n\t\t\t\t\tvar descriptors = this.descriptors(chart);\n\t\t\t\t\tvar ilen = descriptors.length;\n\t\t\t\t\tvar i, descriptor, plugin, params, method;\n\n\t\t\t\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\t\t\t\tdescriptor = descriptors[i];\n\t\t\t\t\t\tplugin = descriptor.plugin;\n\t\t\t\t\t\tmethod = plugin[hook];\n\t\t\t\t\t\tif (typeof method === 'function') {\n\t\t\t\t\t\t\tparams = [chart].concat(args || []);\n\t\t\t\t\t\t\tparams.push(descriptor.options);\n\t\t\t\t\t\t\tif (method.apply(plugin, params) === false) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns descriptors of enabled plugins for the given chart.\n * @returns {Array} [{ plugin, options }]\n * @private\n */\n\t\t\t\tdescriptors: function descriptors(chart) {\n\t\t\t\t\tvar cache = chart.$plugins || (chart.$plugins = {});\n\t\t\t\t\tif (cache.id === this._cacheId) {\n\t\t\t\t\t\treturn cache.descriptors;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar plugins = [];\n\t\t\t\t\tvar descriptors = [];\n\t\t\t\t\tvar config = chart && chart.config || {};\n\t\t\t\t\tvar options = config.options && config.options.plugins || {};\n\n\t\t\t\t\tthis._plugins.concat(config.plugins || []).forEach(function (plugin) {\n\t\t\t\t\t\tvar idx = plugins.indexOf(plugin);\n\t\t\t\t\t\tif (idx !== -1) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar id = plugin.id;\n\t\t\t\t\t\tvar opts = options[id];\n\t\t\t\t\t\tif (opts === false) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (opts === true) {\n\t\t\t\t\t\t\topts = helpers.clone(defaults.global.plugins[id]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tplugins.push(plugin);\n\t\t\t\t\t\tdescriptors.push({\n\t\t\t\t\t\t\tplugin: plugin,\n\t\t\t\t\t\t\toptions: opts || {}\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t\t\tcache.descriptors = descriptors;\n\t\t\t\t\tcache.id = this._cacheId;\n\t\t\t\t\treturn descriptors;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Invalidates cache for the given chart: descriptors hold a reference on plugin option,\n * but in some cases, this reference can be changed by the user when updating options.\n * https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n * @private\n */\n\t\t\t\t_invalidate: function _invalidate(chart) {\n\t\t\t\t\tdelete chart.$plugins;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t/**\n * Plugin extension hooks.\n * @interface IPlugin\n * @since 2.1.0\n */\n\t\t\t/**\n * @method IPlugin#beforeInit\n * @desc Called before initializing `chart`.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#afterInit\n * @desc Called after `chart` has been initialized and before the first update.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#beforeUpdate\n * @desc Called before updating `chart`. If any plugin returns `false`, the update\n * is cancelled (and thus subsequent render(s)) until another `update` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart update.\n */\n\t\t\t/**\n * @method IPlugin#afterUpdate\n * @desc Called after `chart` has been updated and before rendering. Note that this\n * hook will not be called if the chart update has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#beforeDatasetsUpdate\n * @desc Called before updating the `chart` datasets. If any plugin returns `false`,\n * the datasets update is cancelled until another `update` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} false to cancel the datasets update.\n * @since version 2.1.5\n */\n\t\t\t/**\n * @method IPlugin#afterDatasetsUpdate\n * @desc Called after the `chart` datasets have been updated. Note that this hook\n * will not be called if the datasets update has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @since version 2.1.5\n */\n\t\t\t/**\n * @method IPlugin#beforeDatasetUpdate\n * @desc Called before updating the `chart` dataset at the given `args.index`. If any plugin\n * returns `false`, the datasets update is cancelled until another `update` is triggered.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\n */\n\t\t\t/**\n * @method IPlugin#afterDatasetUpdate\n * @desc Called after the `chart` datasets at the given `args.index` has been updated. Note\n * that this hook will not be called if the datasets update has been previously cancelled.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#beforeLayout\n * @desc Called before laying out `chart`. If any plugin returns `false`,\n * the layout update is cancelled until another `update` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart layout.\n */\n\t\t\t/**\n * @method IPlugin#afterLayout\n * @desc Called after the `chart` has been layed out. Note that this hook will not\n * be called if the layout update has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#beforeRender\n * @desc Called before rendering `chart`. If any plugin returns `false`,\n * the rendering is cancelled until another `render` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart rendering.\n */\n\t\t\t/**\n * @method IPlugin#afterRender\n * @desc Called after the `chart` has been fully rendered (and animation completed). Note\n * that this hook will not be called if the rendering has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#beforeDraw\n * @desc Called before drawing `chart` at every animation frame specified by the given\n * easing value. If any plugin returns `false`, the frame drawing is cancelled until\n * another `render` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart drawing.\n */\n\t\t\t/**\n * @method IPlugin#afterDraw\n * @desc Called after the `chart` has been drawn for the specific easing value. Note\n * that this hook will not be called if the drawing has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#beforeDatasetsDraw\n * @desc Called before drawing the `chart` datasets. If any plugin returns `false`,\n * the datasets drawing is cancelled until another `render` is triggered.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\n */\n\t\t\t/**\n * @method IPlugin#afterDatasetsDraw\n * @desc Called after the `chart` datasets have been drawn. Note that this hook\n * will not be called if the datasets drawing has been previously cancelled.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#beforeDatasetDraw\n * @desc Called before drawing the `chart` dataset at the given `args.index` (datasets\n * are drawn in the reverse order). If any plugin returns `false`, the datasets drawing\n * is cancelled until another `render` is triggered.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\n */\n\t\t\t/**\n * @method IPlugin#afterDatasetDraw\n * @desc Called after the `chart` datasets at the given `args.index` have been drawn\n * (datasets are drawn in the reverse order). Note that this hook will not be called\n * if the datasets drawing has been previously cancelled.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Number} args.index - The dataset index.\n * @param {Object} args.meta - The dataset metadata.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#beforeTooltipDraw\n * @desc Called before drawing the `tooltip`. If any plugin returns `false`,\n * the tooltip drawing is cancelled until another `render` is triggered.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Object} args.tooltip - The tooltip.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n * @returns {Boolean} `false` to cancel the chart tooltip drawing.\n */\n\t\t\t/**\n * @method IPlugin#afterTooltipDraw\n * @desc Called after drawing the `tooltip`. Note that this hook will not\n * be called if the tooltip drawing has been previously cancelled.\n * @param {Chart} chart - The chart instance.\n * @param {Object} args - The call arguments.\n * @param {Object} args.tooltip - The tooltip.\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#beforeEvent\n * @desc Called before processing the specified `event`. If any plugin returns `false`,\n * the event will be discarded.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {IEvent} event - The event object.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#afterEvent\n * @desc Called after the `event` has been consumed. Note that this hook\n * will not be called if the `event` has been previously discarded.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {IEvent} event - The event object.\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#resize\n * @desc Called after the chart as been resized.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Number} size - The new canvas display size (eq. canvas.style width & height).\n * @param {Object} options - The plugin options.\n */\n\t\t\t/**\n * @method IPlugin#destroy\n * @desc Called after the chart as been destroyed.\n * @param {Chart.Controller} chart - The chart instance.\n * @param {Object} options - The plugin options.\n */\n\t\t}, { \"26\": 26, \"46\": 46 }], 33: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar Element = require(27);\n\t\t\tvar helpers = require(46);\n\t\t\tvar Ticks = require(35);\n\n\t\t\tdefaults._set('scale', {\n\t\t\t\tdisplay: true,\n\t\t\t\tposition: 'left',\n\t\t\t\toffset: false,\n\n\t\t\t\t// grid line settings\n\t\t\t\tgridLines: {\n\t\t\t\t\tdisplay: true,\n\t\t\t\t\tcolor: 'rgba(0, 0, 0, 0.1)',\n\t\t\t\t\tlineWidth: 1,\n\t\t\t\t\tdrawBorder: true,\n\t\t\t\t\tdrawOnChartArea: true,\n\t\t\t\t\tdrawTicks: true,\n\t\t\t\t\ttickMarkLength: 10,\n\t\t\t\t\tzeroLineWidth: 1,\n\t\t\t\t\tzeroLineColor: 'rgba(0,0,0,0.25)',\n\t\t\t\t\tzeroLineBorderDash: [],\n\t\t\t\t\tzeroLineBorderDashOffset: 0.0,\n\t\t\t\t\toffsetGridLines: false,\n\t\t\t\t\tborderDash: [],\n\t\t\t\t\tborderDashOffset: 0.0\n\t\t\t\t},\n\n\t\t\t\t// scale label\n\t\t\t\tscaleLabel: {\n\t\t\t\t\t// display property\n\t\t\t\t\tdisplay: false,\n\n\t\t\t\t\t// actual label\n\t\t\t\t\tlabelString: '',\n\n\t\t\t\t\t// line height\n\t\t\t\t\tlineHeight: 1.2,\n\n\t\t\t\t\t// top/bottom padding\n\t\t\t\t\tpadding: {\n\t\t\t\t\t\ttop: 4,\n\t\t\t\t\t\tbottom: 4\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t// label settings\n\t\t\t\tticks: {\n\t\t\t\t\tbeginAtZero: false,\n\t\t\t\t\tminRotation: 0,\n\t\t\t\t\tmaxRotation: 50,\n\t\t\t\t\tmirror: false,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\treverse: false,\n\t\t\t\t\tdisplay: true,\n\t\t\t\t\tautoSkip: true,\n\t\t\t\t\tautoSkipPadding: 0,\n\t\t\t\t\tlabelOffset: 0,\n\t\t\t\t\t// We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n\t\t\t\t\tcallback: Ticks.formatters.values,\n\t\t\t\t\tminor: {},\n\t\t\t\t\tmajor: {}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfunction labelsFromTicks(ticks) {\n\t\t\t\tvar labels = [];\n\t\t\t\tvar i, ilen;\n\n\t\t\t\tfor (i = 0, ilen = ticks.length; i < ilen; ++i) {\n\t\t\t\t\tlabels.push(ticks[i].label);\n\t\t\t\t}\n\n\t\t\t\treturn labels;\n\t\t\t}\n\n\t\t\tfunction getLineValue(scale, index, offsetGridLines) {\n\t\t\t\tvar lineValue = scale.getPixelForTick(index);\n\n\t\t\t\tif (offsetGridLines) {\n\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\tlineValue -= (scale.getPixelForTick(1) - lineValue) / 2;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn lineValue;\n\t\t\t}\n\n\t\t\tfunction computeTextSize(context, tick, font) {\n\t\t\t\treturn helpers.isArray(tick) ? helpers.longestText(context, font, tick) : context.measureText(tick).width;\n\t\t\t}\n\n\t\t\tfunction parseFontOptions(options) {\n\t\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\t\tvar globalDefaults = defaults.global;\n\t\t\t\tvar size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize);\n\t\t\t\tvar style = valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle);\n\t\t\t\tvar family = valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily);\n\n\t\t\t\treturn {\n\t\t\t\t\tsize: size,\n\t\t\t\t\tstyle: style,\n\t\t\t\t\tfamily: family,\n\t\t\t\t\tfont: helpers.fontString(size, style, family)\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tfunction parseLineHeight(options) {\n\t\t\t\treturn helpers.options.toLineHeight(helpers.valueOrDefault(options.lineHeight, 1.2), helpers.valueOrDefault(options.fontSize, defaults.global.defaultFontSize));\n\t\t\t}\n\n\t\t\tmodule.exports = Element.extend({\n\t\t\t\t/**\n * Get the padding needed for the scale\n * @method getPadding\n * @private\n * @returns {Padding} the necessary padding\n */\n\t\t\t\tgetPadding: function getPadding() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tleft: me.paddingLeft || 0,\n\t\t\t\t\t\ttop: me.paddingTop || 0,\n\t\t\t\t\t\tright: me.paddingRight || 0,\n\t\t\t\t\t\tbottom: me.paddingBottom || 0\n\t\t\t\t\t};\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns the scale tick objects ({label, major})\n * @since 2.7\n */\n\t\t\t\tgetTicks: function getTicks() {\n\t\t\t\t\treturn this._ticks;\n\t\t\t\t},\n\n\t\t\t\t// These methods are ordered by lifecyle. Utilities then follow.\n\t\t\t\t// Any function defined here is inherited by all scale types.\n\t\t\t\t// Any function can be extended by the scale type\n\n\t\t\t\tmergeTicksOptions: function mergeTicksOptions() {\n\t\t\t\t\tvar ticks = this.options.ticks;\n\t\t\t\t\tif (ticks.minor === false) {\n\t\t\t\t\t\tticks.minor = {\n\t\t\t\t\t\t\tdisplay: false\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tif (ticks.major === false) {\n\t\t\t\t\t\tticks.major = {\n\t\t\t\t\t\t\tdisplay: false\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tfor (var key in ticks) {\n\t\t\t\t\t\tif (key !== 'major' && key !== 'minor') {\n\t\t\t\t\t\t\tif (typeof ticks.minor[key] === 'undefined') {\n\t\t\t\t\t\t\t\tticks.minor[key] = ticks[key];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (typeof ticks.major[key] === 'undefined') {\n\t\t\t\t\t\t\t\tticks.major[key] = ticks[key];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tbeforeUpdate: function beforeUpdate() {\n\t\t\t\t\thelpers.callback(this.options.beforeUpdate, [this]);\n\t\t\t\t},\n\n\t\t\t\tupdate: function update(maxWidth, maxHeight, margins) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar i, ilen, labels, label, ticks, tick;\n\n\t\t\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\t\t\tme.beforeUpdate();\n\n\t\t\t\t\t// Absorb the master measurements\n\t\t\t\t\tme.maxWidth = maxWidth;\n\t\t\t\t\tme.maxHeight = maxHeight;\n\t\t\t\t\tme.margins = helpers.extend({\n\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\tright: 0,\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tbottom: 0\n\t\t\t\t\t}, margins);\n\t\t\t\t\tme.longestTextCache = me.longestTextCache || {};\n\n\t\t\t\t\t// Dimensions\n\t\t\t\t\tme.beforeSetDimensions();\n\t\t\t\t\tme.setDimensions();\n\t\t\t\t\tme.afterSetDimensions();\n\n\t\t\t\t\t// Data min/max\n\t\t\t\t\tme.beforeDataLimits();\n\t\t\t\t\tme.determineDataLimits();\n\t\t\t\t\tme.afterDataLimits();\n\n\t\t\t\t\t// Ticks - `this.ticks` is now DEPRECATED!\n\t\t\t\t\t// Internal ticks are now stored as objects in the PRIVATE `this._ticks` member\n\t\t\t\t\t// and must not be accessed directly from outside this class. `this.ticks` being\n\t\t\t\t\t// around for long time and not marked as private, we can't change its structure\n\t\t\t\t\t// without unexpected breaking changes. If you need to access the scale ticks,\n\t\t\t\t\t// use scale.getTicks() instead.\n\n\t\t\t\t\tme.beforeBuildTicks();\n\n\t\t\t\t\t// New implementations should return an array of objects but for BACKWARD COMPAT,\n\t\t\t\t\t// we still support no return (`this.ticks` internally set by calling this method).\n\t\t\t\t\tticks = me.buildTicks() || [];\n\n\t\t\t\t\tme.afterBuildTicks();\n\n\t\t\t\t\tme.beforeTickToLabelConversion();\n\n\t\t\t\t\t// New implementations should return the formatted tick labels but for BACKWARD\n\t\t\t\t\t// COMPAT, we still support no return (`this.ticks` internally changed by calling\n\t\t\t\t\t// this method and supposed to contain only string values).\n\t\t\t\t\tlabels = me.convertTicksToLabels(ticks) || me.ticks;\n\n\t\t\t\t\tme.afterTickToLabelConversion();\n\n\t\t\t\t\tme.ticks = labels; // BACKWARD COMPATIBILITY\n\n\t\t\t\t\t// IMPORTANT: from this point, we consider that `this.ticks` will NEVER change!\n\n\t\t\t\t\t// BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`)\n\t\t\t\t\tfor (i = 0, ilen = labels.length; i < ilen; ++i) {\n\t\t\t\t\t\tlabel = labels[i];\n\t\t\t\t\t\ttick = ticks[i];\n\t\t\t\t\t\tif (!tick) {\n\t\t\t\t\t\t\tticks.push(tick = {\n\t\t\t\t\t\t\t\tlabel: label,\n\t\t\t\t\t\t\t\tmajor: false\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttick.label = label;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tme._ticks = ticks;\n\n\t\t\t\t\t// Tick Rotation\n\t\t\t\t\tme.beforeCalculateTickRotation();\n\t\t\t\t\tme.calculateTickRotation();\n\t\t\t\t\tme.afterCalculateTickRotation();\n\t\t\t\t\t// Fit\n\t\t\t\t\tme.beforeFit();\n\t\t\t\t\tme.fit();\n\t\t\t\t\tme.afterFit();\n\t\t\t\t\t//\n\t\t\t\t\tme.afterUpdate();\n\n\t\t\t\t\treturn me.minSize;\n\t\t\t\t},\n\t\t\t\tafterUpdate: function afterUpdate() {\n\t\t\t\t\thelpers.callback(this.options.afterUpdate, [this]);\n\t\t\t\t},\n\n\t\t\t\t//\n\n\t\t\t\tbeforeSetDimensions: function beforeSetDimensions() {\n\t\t\t\t\thelpers.callback(this.options.beforeSetDimensions, [this]);\n\t\t\t\t},\n\t\t\t\tsetDimensions: function setDimensions() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\t// Reset position before calculating rotation\n\t\t\t\t\t\tme.width = me.maxWidth;\n\t\t\t\t\t\tme.left = 0;\n\t\t\t\t\t\tme.right = me.width;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t\t\t// Reset position before calculating rotation\n\t\t\t\t\t\tme.top = 0;\n\t\t\t\t\t\tme.bottom = me.height;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Reset padding\n\t\t\t\t\tme.paddingLeft = 0;\n\t\t\t\t\tme.paddingTop = 0;\n\t\t\t\t\tme.paddingRight = 0;\n\t\t\t\t\tme.paddingBottom = 0;\n\t\t\t\t},\n\t\t\t\tafterSetDimensions: function afterSetDimensions() {\n\t\t\t\t\thelpers.callback(this.options.afterSetDimensions, [this]);\n\t\t\t\t},\n\n\t\t\t\t// Data limits\n\t\t\t\tbeforeDataLimits: function beforeDataLimits() {\n\t\t\t\t\thelpers.callback(this.options.beforeDataLimits, [this]);\n\t\t\t\t},\n\t\t\t\tdetermineDataLimits: helpers.noop,\n\t\t\t\tafterDataLimits: function afterDataLimits() {\n\t\t\t\t\thelpers.callback(this.options.afterDataLimits, [this]);\n\t\t\t\t},\n\n\t\t\t\t//\n\t\t\t\tbeforeBuildTicks: function beforeBuildTicks() {\n\t\t\t\t\thelpers.callback(this.options.beforeBuildTicks, [this]);\n\t\t\t\t},\n\t\t\t\tbuildTicks: helpers.noop,\n\t\t\t\tafterBuildTicks: function afterBuildTicks() {\n\t\t\t\t\thelpers.callback(this.options.afterBuildTicks, [this]);\n\t\t\t\t},\n\n\t\t\t\tbeforeTickToLabelConversion: function beforeTickToLabelConversion() {\n\t\t\t\t\thelpers.callback(this.options.beforeTickToLabelConversion, [this]);\n\t\t\t\t},\n\t\t\t\tconvertTicksToLabels: function convertTicksToLabels() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\t// Convert ticks to strings\n\t\t\t\t\tvar tickOpts = me.options.ticks;\n\t\t\t\t\tme.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this);\n\t\t\t\t},\n\t\t\t\tafterTickToLabelConversion: function afterTickToLabelConversion() {\n\t\t\t\t\thelpers.callback(this.options.afterTickToLabelConversion, [this]);\n\t\t\t\t},\n\n\t\t\t\t//\n\n\t\t\t\tbeforeCalculateTickRotation: function beforeCalculateTickRotation() {\n\t\t\t\t\thelpers.callback(this.options.beforeCalculateTickRotation, [this]);\n\t\t\t\t},\n\t\t\t\tcalculateTickRotation: function calculateTickRotation() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar context = me.ctx;\n\t\t\t\t\tvar tickOpts = me.options.ticks;\n\t\t\t\t\tvar labels = labelsFromTicks(me._ticks);\n\n\t\t\t\t\t// Get the width of each grid by calculating the difference\n\t\t\t\t\t// between x offsets between 0 and 1.\n\t\t\t\t\tvar tickFont = parseFontOptions(tickOpts);\n\t\t\t\t\tcontext.font = tickFont.font;\n\n\t\t\t\t\tvar labelRotation = tickOpts.minRotation || 0;\n\n\t\t\t\t\tif (labels.length && me.options.display && me.isHorizontal()) {\n\t\t\t\t\t\tvar originalLabelWidth = helpers.longestText(context, tickFont.font, labels, me.longestTextCache);\n\t\t\t\t\t\tvar labelWidth = originalLabelWidth;\n\t\t\t\t\t\tvar cosRotation, sinRotation;\n\n\t\t\t\t\t\t// Allow 3 pixels x2 padding either side for label readability\n\t\t\t\t\t\tvar tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6;\n\n\t\t\t\t\t\t// Max label rotation can be set or default to 90 - also act as a loop counter\n\t\t\t\t\t\twhile (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) {\n\t\t\t\t\t\t\tvar angleRadians = helpers.toRadians(labelRotation);\n\t\t\t\t\t\t\tcosRotation = Math.cos(angleRadians);\n\t\t\t\t\t\t\tsinRotation = Math.sin(angleRadians);\n\n\t\t\t\t\t\t\tif (sinRotation * originalLabelWidth > me.maxHeight) {\n\t\t\t\t\t\t\t\t// go back one step\n\t\t\t\t\t\t\t\tlabelRotation--;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlabelRotation++;\n\t\t\t\t\t\t\tlabelWidth = cosRotation * originalLabelWidth;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tme.labelRotation = labelRotation;\n\t\t\t\t},\n\t\t\t\tafterCalculateTickRotation: function afterCalculateTickRotation() {\n\t\t\t\t\thelpers.callback(this.options.afterCalculateTickRotation, [this]);\n\t\t\t\t},\n\n\t\t\t\t//\n\n\t\t\t\tbeforeFit: function beforeFit() {\n\t\t\t\t\thelpers.callback(this.options.beforeFit, [this]);\n\t\t\t\t},\n\t\t\t\tfit: function fit() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\t// Reset\n\t\t\t\t\tvar minSize = me.minSize = {\n\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\theight: 0\n\t\t\t\t\t};\n\n\t\t\t\t\tvar labels = labelsFromTicks(me._ticks);\n\n\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\tvar tickOpts = opts.ticks;\n\t\t\t\t\tvar scaleLabelOpts = opts.scaleLabel;\n\t\t\t\t\tvar gridLineOpts = opts.gridLines;\n\t\t\t\t\tvar display = opts.display;\n\t\t\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\t\t\tvar tickFont = parseFontOptions(tickOpts);\n\t\t\t\t\tvar tickMarkLength = opts.gridLines.tickMarkLength;\n\n\t\t\t\t\t// Width\n\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t// subtract the margins to line up with the chartArea if we are a full width scale\n\t\t\t\t\t\tminSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tminSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t// height\n\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\tminSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t\t\t}\n\n\t\t\t\t\t// Are we showing a title for the scale?\n\t\t\t\t\tif (scaleLabelOpts.display && display) {\n\t\t\t\t\t\tvar scaleLabelLineHeight = parseLineHeight(scaleLabelOpts);\n\t\t\t\t\t\tvar scaleLabelPadding = helpers.options.toPadding(scaleLabelOpts.padding);\n\t\t\t\t\t\tvar deltaHeight = scaleLabelLineHeight + scaleLabelPadding.height;\n\n\t\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t\tminSize.height += deltaHeight;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tminSize.width += deltaHeight;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Don't bother fitting the ticks if we are not showing them\n\t\t\t\t\tif (tickOpts.display && display) {\n\t\t\t\t\t\tvar largestTextWidth = helpers.longestText(me.ctx, tickFont.font, labels, me.longestTextCache);\n\t\t\t\t\t\tvar tallestLabelHeightInLines = helpers.numberOfLabelLines(labels);\n\t\t\t\t\t\tvar lineSpace = tickFont.size * 0.5;\n\t\t\t\t\t\tvar tickPadding = me.options.ticks.padding;\n\n\t\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t\t// A horizontal axis is more constrained by the height.\n\t\t\t\t\t\t\tme.longestLabelWidth = largestTextWidth;\n\n\t\t\t\t\t\t\tvar angleRadians = helpers.toRadians(me.labelRotation);\n\t\t\t\t\t\t\tvar cosRotation = Math.cos(angleRadians);\n\t\t\t\t\t\t\tvar sinRotation = Math.sin(angleRadians);\n\n\t\t\t\t\t\t\t// TODO - improve this calculation\n\t\t\t\t\t\t\tvar labelHeight = sinRotation * largestTextWidth + tickFont.size * tallestLabelHeightInLines + lineSpace * (tallestLabelHeightInLines - 1) + lineSpace; // padding\n\n\t\t\t\t\t\t\tminSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding);\n\n\t\t\t\t\t\t\tme.ctx.font = tickFont.font;\n\t\t\t\t\t\t\tvar firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.font);\n\t\t\t\t\t\t\tvar lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.font);\n\n\t\t\t\t\t\t\t// Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n\t\t\t\t\t\t\t// which means that the right padding is dominated by the font height\n\t\t\t\t\t\t\tif (me.labelRotation !== 0) {\n\t\t\t\t\t\t\t\tme.paddingLeft = opts.position === 'bottom' ? cosRotation * firstLabelWidth + 3 : cosRotation * lineSpace + 3; // add 3 px to move away from canvas edges\n\t\t\t\t\t\t\t\tme.paddingRight = opts.position === 'bottom' ? cosRotation * lineSpace + 3 : cosRotation * lastLabelWidth + 3;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tme.paddingLeft = firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges\n\t\t\t\t\t\t\t\tme.paddingRight = lastLabelWidth / 2 + 3;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// A vertical axis is more constrained by the width. Labels are the\n\t\t\t\t\t\t\t// dominant factor here, so get that length first and account for padding\n\t\t\t\t\t\t\tif (tickOpts.mirror) {\n\t\t\t\t\t\t\t\tlargestTextWidth = 0;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// use lineSpace for consistency with horizontal axis\n\t\t\t\t\t\t\t\t// tickPadding is not implemented for horizontal\n\t\t\t\t\t\t\t\tlargestTextWidth += tickPadding + lineSpace;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tminSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth);\n\n\t\t\t\t\t\t\tme.paddingTop = tickFont.size / 2;\n\t\t\t\t\t\t\tme.paddingBottom = tickFont.size / 2;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tme.handleMargins();\n\n\t\t\t\t\tme.width = minSize.width;\n\t\t\t\t\tme.height = minSize.height;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Handle margins and padding interactions\n * @private\n */\n\t\t\t\thandleMargins: function handleMargins() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tif (me.margins) {\n\t\t\t\t\t\tme.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0);\n\t\t\t\t\t\tme.paddingTop = Math.max(me.paddingTop - me.margins.top, 0);\n\t\t\t\t\t\tme.paddingRight = Math.max(me.paddingRight - me.margins.right, 0);\n\t\t\t\t\t\tme.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tafterFit: function afterFit() {\n\t\t\t\t\thelpers.callback(this.options.afterFit, [this]);\n\t\t\t\t},\n\n\t\t\t\t// Shared Methods\n\t\t\t\tisHorizontal: function isHorizontal() {\n\t\t\t\t\treturn this.options.position === 'top' || this.options.position === 'bottom';\n\t\t\t\t},\n\t\t\t\tisFullWidth: function isFullWidth() {\n\t\t\t\t\treturn this.options.fullWidth;\n\t\t\t\t},\n\n\t\t\t\t// Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not\n\t\t\t\tgetRightValue: function getRightValue(rawValue) {\n\t\t\t\t\t// Null and undefined values first\n\t\t\t\t\tif (helpers.isNullOrUndef(rawValue)) {\n\t\t\t\t\t\treturn NaN;\n\t\t\t\t\t}\n\t\t\t\t\t// isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values\n\t\t\t\t\tif (typeof rawValue === 'number' && !isFinite(rawValue)) {\n\t\t\t\t\t\treturn NaN;\n\t\t\t\t\t}\n\t\t\t\t\t// If it is in fact an object, dive in one more level\n\t\t\t\t\tif (rawValue) {\n\t\t\t\t\t\tif (this.isHorizontal()) {\n\t\t\t\t\t\t\tif (rawValue.x !== undefined) {\n\t\t\t\t\t\t\t\treturn this.getRightValue(rawValue.x);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (rawValue.y !== undefined) {\n\t\t\t\t\t\t\treturn this.getRightValue(rawValue.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Value is good, return it\n\t\t\t\t\treturn rawValue;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Used to get the value to display in the tooltip for the data at the given index\n * @param index\n * @param datasetIndex\n */\n\t\t\t\tgetLabelForIndex: helpers.noop,\n\n\t\t\t\t/**\n * Returns the location of the given data point. Value can either be an index or a numerical value\n * The coordinate (0, 0) is at the upper-left corner of the canvas\n * @param value\n * @param index\n * @param datasetIndex\n */\n\t\t\t\tgetPixelForValue: helpers.noop,\n\n\t\t\t\t/**\n * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n * The coordinate (0, 0) is at the upper-left corner of the canvas\n * @param pixel\n */\n\t\t\t\tgetValueForPixel: helpers.noop,\n\n\t\t\t\t/**\n * Returns the location of the tick at the given index\n * The coordinate (0, 0) is at the upper-left corner of the canvas\n */\n\t\t\t\tgetPixelForTick: function getPixelForTick(index) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar offset = me.options.offset;\n\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\tvar innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n\t\t\t\t\t\tvar tickWidth = innerWidth / Math.max(me._ticks.length - (offset ? 0 : 1), 1);\n\t\t\t\t\t\tvar pixel = tickWidth * index + me.paddingLeft;\n\n\t\t\t\t\t\tif (offset) {\n\t\t\t\t\t\t\tpixel += tickWidth / 2;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar finalVal = me.left + Math.round(pixel);\n\t\t\t\t\t\tfinalVal += me.isFullWidth() ? me.margins.left : 0;\n\t\t\t\t\t\treturn finalVal;\n\t\t\t\t\t}\n\t\t\t\t\tvar innerHeight = me.height - (me.paddingTop + me.paddingBottom);\n\t\t\t\t\treturn me.top + index * (innerHeight / (me._ticks.length - 1));\n\t\t\t\t},\n\n\t\t\t\t/**\n * Utility for getting the pixel location of a percentage of scale\n * The coordinate (0, 0) is at the upper-left corner of the canvas\n */\n\t\t\t\tgetPixelForDecimal: function getPixelForDecimal(decimal) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\tvar innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n\t\t\t\t\t\tvar valueOffset = innerWidth * decimal + me.paddingLeft;\n\n\t\t\t\t\t\tvar finalVal = me.left + Math.round(valueOffset);\n\t\t\t\t\t\tfinalVal += me.isFullWidth() ? me.margins.left : 0;\n\t\t\t\t\t\treturn finalVal;\n\t\t\t\t\t}\n\t\t\t\t\treturn me.top + decimal * me.height;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns the pixel for the minimum chart value\n * The coordinate (0, 0) is at the upper-left corner of the canvas\n */\n\t\t\t\tgetBasePixel: function getBasePixel() {\n\t\t\t\t\treturn this.getPixelForValue(this.getBaseValue());\n\t\t\t\t},\n\n\t\t\t\tgetBaseValue: function getBaseValue() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar min = me.min;\n\t\t\t\t\tvar max = me.max;\n\n\t\t\t\t\treturn me.beginAtZero ? 0 : min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @private\n */\n\t\t\t\t_autoSkip: function _autoSkip(ticks) {\n\t\t\t\t\tvar skipRatio;\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\t\t\tvar optionTicks = me.options.ticks.minor;\n\t\t\t\t\tvar tickCount = ticks.length;\n\t\t\t\t\tvar labelRotationRadians = helpers.toRadians(me.labelRotation);\n\t\t\t\t\tvar cosRotation = Math.cos(labelRotationRadians);\n\t\t\t\t\tvar longestRotatedLabel = me.longestLabelWidth * cosRotation;\n\t\t\t\t\tvar result = [];\n\t\t\t\t\tvar i, tick, shouldSkip;\n\n\t\t\t\t\t// figure out the maximum number of gridlines to show\n\t\t\t\t\tvar maxTicks;\n\t\t\t\t\tif (optionTicks.maxTicksLimit) {\n\t\t\t\t\t\tmaxTicks = optionTicks.maxTicksLimit;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\tskipRatio = false;\n\n\t\t\t\t\t\tif ((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount > me.width - (me.paddingLeft + me.paddingRight)) {\n\t\t\t\t\t\t\tskipRatio = 1 + Math.floor((longestRotatedLabel + optionTicks.autoSkipPadding) * tickCount / (me.width - (me.paddingLeft + me.paddingRight)));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// if they defined a max number of optionTicks,\n\t\t\t\t\t\t// increase skipRatio until that number is met\n\t\t\t\t\t\tif (maxTicks && tickCount > maxTicks) {\n\t\t\t\t\t\t\tskipRatio = Math.max(skipRatio, Math.floor(tickCount / maxTicks));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (i = 0; i < tickCount; i++) {\n\t\t\t\t\t\ttick = ticks[i];\n\n\t\t\t\t\t\t// Since we always show the last tick,we need may need to hide the last shown one before\n\t\t\t\t\t\tshouldSkip = skipRatio > 1 && i % skipRatio > 0 || i % skipRatio === 0 && i + skipRatio >= tickCount;\n\t\t\t\t\t\tif (shouldSkip && i !== tickCount - 1) {\n\t\t\t\t\t\t\t// leave tick in place but make sure it's not displayed (#4635)\n\t\t\t\t\t\t\tdelete tick.label;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresult.push(tick);\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t},\n\n\t\t\t\t// Actually draw the scale on the canvas\n\t\t\t\t// @param {rectangle} chartArea : the area of the chart to draw full grid lines on\n\t\t\t\tdraw: function draw(chartArea) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar options = me.options;\n\t\t\t\t\tif (!options.display) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar context = me.ctx;\n\t\t\t\t\tvar globalDefaults = defaults.global;\n\t\t\t\t\tvar optionTicks = options.ticks.minor;\n\t\t\t\t\tvar optionMajorTicks = options.ticks.major || optionTicks;\n\t\t\t\t\tvar gridLines = options.gridLines;\n\t\t\t\t\tvar scaleLabel = options.scaleLabel;\n\n\t\t\t\t\tvar isRotated = me.labelRotation !== 0;\n\t\t\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\t\t\tvar ticks = optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks();\n\t\t\t\t\tvar tickFontColor = helpers.valueOrDefault(optionTicks.fontColor, globalDefaults.defaultFontColor);\n\t\t\t\t\tvar tickFont = parseFontOptions(optionTicks);\n\t\t\t\t\tvar majorTickFontColor = helpers.valueOrDefault(optionMajorTicks.fontColor, globalDefaults.defaultFontColor);\n\t\t\t\t\tvar majorTickFont = parseFontOptions(optionMajorTicks);\n\n\t\t\t\t\tvar tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0;\n\n\t\t\t\t\tvar scaleLabelFontColor = helpers.valueOrDefault(scaleLabel.fontColor, globalDefaults.defaultFontColor);\n\t\t\t\t\tvar scaleLabelFont = parseFontOptions(scaleLabel);\n\t\t\t\t\tvar scaleLabelPadding = helpers.options.toPadding(scaleLabel.padding);\n\t\t\t\t\tvar labelRotationRadians = helpers.toRadians(me.labelRotation);\n\n\t\t\t\t\tvar itemsToDraw = [];\n\n\t\t\t\t\tvar axisWidth = me.options.gridLines.lineWidth;\n\t\t\t\t\tvar xTickStart = options.position === 'right' ? me.left : me.right - axisWidth - tl;\n\t\t\t\t\tvar xTickEnd = options.position === 'right' ? me.left + tl : me.right;\n\t\t\t\t\tvar yTickStart = options.position === 'bottom' ? me.top + axisWidth : me.bottom - tl - axisWidth;\n\t\t\t\t\tvar yTickEnd = options.position === 'bottom' ? me.top + axisWidth + tl : me.bottom + axisWidth;\n\n\t\t\t\t\thelpers.each(ticks, function (tick, index) {\n\t\t\t\t\t\t// autoskipper skipped this tick (#4635)\n\t\t\t\t\t\tif (helpers.isNullOrUndef(tick.label)) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar label = tick.label;\n\t\t\t\t\t\tvar lineWidth, lineColor, borderDash, borderDashOffset;\n\t\t\t\t\t\tif (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) {\n\t\t\t\t\t\t\t// Draw the first index specially\n\t\t\t\t\t\t\tlineWidth = gridLines.zeroLineWidth;\n\t\t\t\t\t\t\tlineColor = gridLines.zeroLineColor;\n\t\t\t\t\t\t\tborderDash = gridLines.zeroLineBorderDash;\n\t\t\t\t\t\t\tborderDashOffset = gridLines.zeroLineBorderDashOffset;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, index);\n\t\t\t\t\t\t\tlineColor = helpers.valueAtIndexOrDefault(gridLines.color, index);\n\t\t\t\t\t\t\tborderDash = helpers.valueOrDefault(gridLines.borderDash, globalDefaults.borderDash);\n\t\t\t\t\t\t\tborderDashOffset = helpers.valueOrDefault(gridLines.borderDashOffset, globalDefaults.borderDashOffset);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Common properties\n\t\t\t\t\t\tvar tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY;\n\t\t\t\t\t\tvar textAlign = 'middle';\n\t\t\t\t\t\tvar textBaseline = 'middle';\n\t\t\t\t\t\tvar tickPadding = optionTicks.padding;\n\n\t\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t\tvar labelYOffset = tl + tickPadding;\n\n\t\t\t\t\t\t\tif (options.position === 'bottom') {\n\t\t\t\t\t\t\t\t// bottom\n\t\t\t\t\t\t\t\ttextBaseline = !isRotated ? 'top' : 'middle';\n\t\t\t\t\t\t\t\ttextAlign = !isRotated ? 'center' : 'right';\n\t\t\t\t\t\t\t\tlabelY = me.top + labelYOffset;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// top\n\t\t\t\t\t\t\t\ttextBaseline = !isRotated ? 'bottom' : 'middle';\n\t\t\t\t\t\t\t\ttextAlign = !isRotated ? 'center' : 'left';\n\t\t\t\t\t\t\t\tlabelY = me.bottom - labelYOffset;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar xLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1);\n\t\t\t\t\t\t\tif (xLineValue < me.left) {\n\t\t\t\t\t\t\t\tlineColor = 'rgba(0,0,0,0)';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\txLineValue += helpers.aliasPixel(lineWidth);\n\n\t\t\t\t\t\t\tlabelX = me.getPixelForTick(index) + optionTicks.labelOffset; // x values for optionTicks (need to consider offsetLabel option)\n\n\t\t\t\t\t\t\ttx1 = tx2 = x1 = x2 = xLineValue;\n\t\t\t\t\t\t\tty1 = yTickStart;\n\t\t\t\t\t\t\tty2 = yTickEnd;\n\t\t\t\t\t\t\ty1 = chartArea.top;\n\t\t\t\t\t\t\ty2 = chartArea.bottom + axisWidth;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar isLeft = options.position === 'left';\n\t\t\t\t\t\t\tvar labelXOffset;\n\n\t\t\t\t\t\t\tif (optionTicks.mirror) {\n\t\t\t\t\t\t\t\ttextAlign = isLeft ? 'left' : 'right';\n\t\t\t\t\t\t\t\tlabelXOffset = tickPadding;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttextAlign = isLeft ? 'right' : 'left';\n\t\t\t\t\t\t\t\tlabelXOffset = tl + tickPadding;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlabelX = isLeft ? me.right - labelXOffset : me.left + labelXOffset;\n\n\t\t\t\t\t\t\tvar yLineValue = getLineValue(me, index, gridLines.offsetGridLines && ticks.length > 1);\n\t\t\t\t\t\t\tif (yLineValue < me.top) {\n\t\t\t\t\t\t\t\tlineColor = 'rgba(0,0,0,0)';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tyLineValue += helpers.aliasPixel(lineWidth);\n\n\t\t\t\t\t\t\tlabelY = me.getPixelForTick(index) + optionTicks.labelOffset;\n\n\t\t\t\t\t\t\ttx1 = xTickStart;\n\t\t\t\t\t\t\ttx2 = xTickEnd;\n\t\t\t\t\t\t\tx1 = chartArea.left;\n\t\t\t\t\t\t\tx2 = chartArea.right + axisWidth;\n\t\t\t\t\t\t\tty1 = ty2 = y1 = y2 = yLineValue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\titemsToDraw.push({\n\t\t\t\t\t\t\ttx1: tx1,\n\t\t\t\t\t\t\tty1: ty1,\n\t\t\t\t\t\t\ttx2: tx2,\n\t\t\t\t\t\t\tty2: ty2,\n\t\t\t\t\t\t\tx1: x1,\n\t\t\t\t\t\t\ty1: y1,\n\t\t\t\t\t\t\tx2: x2,\n\t\t\t\t\t\t\ty2: y2,\n\t\t\t\t\t\t\tlabelX: labelX,\n\t\t\t\t\t\t\tlabelY: labelY,\n\t\t\t\t\t\t\tglWidth: lineWidth,\n\t\t\t\t\t\t\tglColor: lineColor,\n\t\t\t\t\t\t\tglBorderDash: borderDash,\n\t\t\t\t\t\t\tglBorderDashOffset: borderDashOffset,\n\t\t\t\t\t\t\trotation: -1 * labelRotationRadians,\n\t\t\t\t\t\t\tlabel: label,\n\t\t\t\t\t\t\tmajor: tick.major,\n\t\t\t\t\t\t\ttextBaseline: textBaseline,\n\t\t\t\t\t\t\ttextAlign: textAlign\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t\t\t// Draw all of the tick labels, tick marks, and grid lines at the correct places\n\t\t\t\t\thelpers.each(itemsToDraw, function (itemToDraw) {\n\t\t\t\t\t\tif (gridLines.display) {\n\t\t\t\t\t\t\tcontext.save();\n\t\t\t\t\t\t\tcontext.lineWidth = itemToDraw.glWidth;\n\t\t\t\t\t\t\tcontext.strokeStyle = itemToDraw.glColor;\n\t\t\t\t\t\t\tif (context.setLineDash) {\n\t\t\t\t\t\t\t\tcontext.setLineDash(itemToDraw.glBorderDash);\n\t\t\t\t\t\t\t\tcontext.lineDashOffset = itemToDraw.glBorderDashOffset;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcontext.beginPath();\n\n\t\t\t\t\t\t\tif (gridLines.drawTicks) {\n\t\t\t\t\t\t\t\tcontext.moveTo(itemToDraw.tx1, itemToDraw.ty1);\n\t\t\t\t\t\t\t\tcontext.lineTo(itemToDraw.tx2, itemToDraw.ty2);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (gridLines.drawOnChartArea) {\n\t\t\t\t\t\t\t\tcontext.moveTo(itemToDraw.x1, itemToDraw.y1);\n\t\t\t\t\t\t\t\tcontext.lineTo(itemToDraw.x2, itemToDraw.y2);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcontext.stroke();\n\t\t\t\t\t\t\tcontext.restore();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (optionTicks.display) {\n\t\t\t\t\t\t\t// Make sure we draw text in the correct color and font\n\t\t\t\t\t\t\tcontext.save();\n\t\t\t\t\t\t\tcontext.translate(itemToDraw.labelX, itemToDraw.labelY);\n\t\t\t\t\t\t\tcontext.rotate(itemToDraw.rotation);\n\t\t\t\t\t\t\tcontext.font = itemToDraw.major ? majorTickFont.font : tickFont.font;\n\t\t\t\t\t\t\tcontext.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor;\n\t\t\t\t\t\t\tcontext.textBaseline = itemToDraw.textBaseline;\n\t\t\t\t\t\t\tcontext.textAlign = itemToDraw.textAlign;\n\n\t\t\t\t\t\t\tvar label = itemToDraw.label;\n\t\t\t\t\t\t\tif (helpers.isArray(label)) {\n\t\t\t\t\t\t\t\tvar lineCount = label.length;\n\t\t\t\t\t\t\t\tvar lineHeight = tickFont.size * 1.5;\n\t\t\t\t\t\t\t\tvar y = me.isHorizontal() ? 0 : -lineHeight * (lineCount - 1) / 2;\n\n\t\t\t\t\t\t\t\tfor (var i = 0; i < lineCount; ++i) {\n\t\t\t\t\t\t\t\t\t// We just make sure the multiline element is a string here..\n\t\t\t\t\t\t\t\t\tcontext.fillText('' + label[i], 0, y);\n\t\t\t\t\t\t\t\t\t// apply same lineSpacing as calculated @ L#320\n\t\t\t\t\t\t\t\t\ty += lineHeight;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcontext.fillText(label, 0, 0);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontext.restore();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tif (scaleLabel.display) {\n\t\t\t\t\t\t// Draw the scale label\n\t\t\t\t\t\tvar scaleLabelX;\n\t\t\t\t\t\tvar scaleLabelY;\n\t\t\t\t\t\tvar rotation = 0;\n\t\t\t\t\t\tvar halfLineHeight = parseLineHeight(scaleLabel) / 2;\n\n\t\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t\tscaleLabelX = me.left + (me.right - me.left) / 2; // midpoint of the width\n\t\t\t\t\t\t\tscaleLabelY = options.position === 'bottom' ? me.bottom - halfLineHeight - scaleLabelPadding.bottom : me.top + halfLineHeight + scaleLabelPadding.top;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar isLeft = options.position === 'left';\n\t\t\t\t\t\t\tscaleLabelX = isLeft ? me.left + halfLineHeight + scaleLabelPadding.top : me.right - halfLineHeight - scaleLabelPadding.top;\n\t\t\t\t\t\t\tscaleLabelY = me.top + (me.bottom - me.top) / 2;\n\t\t\t\t\t\t\trotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontext.save();\n\t\t\t\t\t\tcontext.translate(scaleLabelX, scaleLabelY);\n\t\t\t\t\t\tcontext.rotate(rotation);\n\t\t\t\t\t\tcontext.textAlign = 'center';\n\t\t\t\t\t\tcontext.textBaseline = 'middle';\n\t\t\t\t\t\tcontext.fillStyle = scaleLabelFontColor; // render in correct colour\n\t\t\t\t\t\tcontext.font = scaleLabelFont.font;\n\t\t\t\t\t\tcontext.fillText(scaleLabel.labelString, 0, 0);\n\t\t\t\t\t\tcontext.restore();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (gridLines.drawBorder) {\n\t\t\t\t\t\t// Draw the line at the edge of the axis\n\t\t\t\t\t\tcontext.lineWidth = helpers.valueAtIndexOrDefault(gridLines.lineWidth, 0);\n\t\t\t\t\t\tcontext.strokeStyle = helpers.valueAtIndexOrDefault(gridLines.color, 0);\n\t\t\t\t\t\tvar x1 = me.left;\n\t\t\t\t\t\tvar x2 = me.right + axisWidth;\n\t\t\t\t\t\tvar y1 = me.top;\n\t\t\t\t\t\tvar y2 = me.bottom + axisWidth;\n\n\t\t\t\t\t\tvar aliasPixel = helpers.aliasPixel(context.lineWidth);\n\t\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t\ty1 = y2 = options.position === 'top' ? me.bottom : me.top;\n\t\t\t\t\t\t\ty1 += aliasPixel;\n\t\t\t\t\t\t\ty2 += aliasPixel;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tx1 = x2 = options.position === 'left' ? me.right : me.left;\n\t\t\t\t\t\t\tx1 += aliasPixel;\n\t\t\t\t\t\t\tx2 += aliasPixel;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontext.beginPath();\n\t\t\t\t\t\tcontext.moveTo(x1, y1);\n\t\t\t\t\t\tcontext.lineTo(x2, y2);\n\t\t\t\t\t\tcontext.stroke();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}, { \"26\": 26, \"27\": 27, \"35\": 35, \"46\": 46 }], 34: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar helpers = require(46);\n\t\t\tvar layouts = require(31);\n\n\t\t\tmodule.exports = {\n\t\t\t\t// Scale registration object. Extensions can register new scale types (such as log or DB scales) and then\n\t\t\t\t// use the new chart options to grab the correct scale\n\t\t\t\tconstructors: {},\n\t\t\t\t// Use a registration function so that we can move to an ES6 map when we no longer need to support\n\t\t\t\t// old browsers\n\n\t\t\t\t// Scale config defaults\n\t\t\t\tdefaults: {},\n\t\t\t\tregisterScaleType: function registerScaleType(type, scaleConstructor, scaleDefaults) {\n\t\t\t\t\tthis.constructors[type] = scaleConstructor;\n\t\t\t\t\tthis.defaults[type] = helpers.clone(scaleDefaults);\n\t\t\t\t},\n\t\t\t\tgetScaleConstructor: function getScaleConstructor(type) {\n\t\t\t\t\treturn this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined;\n\t\t\t\t},\n\t\t\t\tgetScaleDefaults: function getScaleDefaults(type) {\n\t\t\t\t\t// Return the scale defaults merged with the global settings so that we always use the latest ones\n\t\t\t\t\treturn this.defaults.hasOwnProperty(type) ? helpers.merge({}, [defaults.scale, this.defaults[type]]) : {};\n\t\t\t\t},\n\t\t\t\tupdateScaleDefaults: function updateScaleDefaults(type, additions) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tif (me.defaults.hasOwnProperty(type)) {\n\t\t\t\t\t\tme.defaults[type] = helpers.extend(me.defaults[type], additions);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\taddScalesToLayout: function addScalesToLayout(chart) {\n\t\t\t\t\t// Adds each scale to the chart.boxes array to be sized accordingly\n\t\t\t\t\thelpers.each(chart.scales, function (scale) {\n\t\t\t\t\t\t// Set ILayoutItem parameters for backwards compatibility\n\t\t\t\t\t\tscale.fullWidth = scale.options.fullWidth;\n\t\t\t\t\t\tscale.position = scale.options.position;\n\t\t\t\t\t\tscale.weight = scale.options.weight;\n\t\t\t\t\t\tlayouts.addBox(chart, scale);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\t\t}, { \"26\": 26, \"31\": 31, \"46\": 46 }], 35: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(46);\n\n\t\t\t/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\n\t\t\tmodule.exports = {\n\t\t\t\t/**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\n\t\t\t\tformatters: {\n\t\t\t\t\t/**\n * Formatter for value labels\n * @method Chart.Ticks.formatters.values\n * @param value the value to display\n * @return {String|Array} the label to display\n */\n\t\t\t\t\tvalues: function values(value) {\n\t\t\t\t\t\treturn helpers.isArray(value) ? value : '' + value;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Formatter for linear numeric ticks\n * @method Chart.Ticks.formatters.linear\n * @param tickValue {Number} the value to be formatted\n * @param index {Number} the position of the tickValue parameter in the ticks array\n * @param ticks {Array<Number>} the list of ticks being converted\n * @return {String} string representation of the tickValue parameter\n */\n\t\t\t\t\tlinear: function linear(tickValue, index, ticks) {\n\t\t\t\t\t\t// If we have lots of ticks, don't use the ones\n\t\t\t\t\t\tvar delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0];\n\n\t\t\t\t\t\t// If we have a number like 2.5 as the delta, figure out how many decimal places we need\n\t\t\t\t\t\tif (Math.abs(delta) > 1) {\n\t\t\t\t\t\t\tif (tickValue !== Math.floor(tickValue)) {\n\t\t\t\t\t\t\t\t// not an integer\n\t\t\t\t\t\t\t\tdelta = tickValue - Math.floor(tickValue);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar logDelta = helpers.log10(Math.abs(delta));\n\t\t\t\t\t\tvar tickString = '';\n\n\t\t\t\t\t\tif (tickValue !== 0) {\n\t\t\t\t\t\t\tvar maxTick = Math.max(Math.abs(ticks[0]), Math.abs(ticks[ticks.length - 1]));\n\t\t\t\t\t\t\tif (maxTick < 1e-4) {\n\t\t\t\t\t\t\t\t// all ticks are small numbers; use scientific notation\n\t\t\t\t\t\t\t\tvar logTick = helpers.log10(Math.abs(tickValue));\n\t\t\t\t\t\t\t\ttickString = tickValue.toExponential(Math.floor(logTick) - Math.floor(logDelta));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tvar numDecimal = -1 * Math.floor(logDelta);\n\t\t\t\t\t\t\t\tnumDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places\n\t\t\t\t\t\t\t\ttickString = tickValue.toFixed(numDecimal);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttickString = '0'; // never show decimal places for 0\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn tickString;\n\t\t\t\t\t},\n\n\t\t\t\t\tlogarithmic: function logarithmic(tickValue, index, ticks) {\n\t\t\t\t\t\tvar remain = tickValue / Math.pow(10, Math.floor(helpers.log10(tickValue)));\n\n\t\t\t\t\t\tif (tickValue === 0) {\n\t\t\t\t\t\t\treturn '0';\n\t\t\t\t\t\t} else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) {\n\t\t\t\t\t\t\treturn tickValue.toExponential();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn '';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}, { \"46\": 46 }], 36: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar Element = require(27);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('global', {\n\t\t\t\ttooltips: {\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tcustom: null,\n\t\t\t\t\tmode: 'nearest',\n\t\t\t\t\tposition: 'average',\n\t\t\t\t\tintersect: true,\n\t\t\t\t\tbackgroundColor: 'rgba(0,0,0,0.8)',\n\t\t\t\t\ttitleFontStyle: 'bold',\n\t\t\t\t\ttitleSpacing: 2,\n\t\t\t\t\ttitleMarginBottom: 6,\n\t\t\t\t\ttitleFontColor: '#fff',\n\t\t\t\t\ttitleAlign: 'left',\n\t\t\t\t\tbodySpacing: 2,\n\t\t\t\t\tbodyFontColor: '#fff',\n\t\t\t\t\tbodyAlign: 'left',\n\t\t\t\t\tfooterFontStyle: 'bold',\n\t\t\t\t\tfooterSpacing: 2,\n\t\t\t\t\tfooterMarginTop: 6,\n\t\t\t\t\tfooterFontColor: '#fff',\n\t\t\t\t\tfooterAlign: 'left',\n\t\t\t\t\tyPadding: 6,\n\t\t\t\t\txPadding: 6,\n\t\t\t\t\tcaretPadding: 2,\n\t\t\t\t\tcaretSize: 5,\n\t\t\t\t\tcornerRadius: 6,\n\t\t\t\t\tmultiKeyBackground: '#fff',\n\t\t\t\t\tdisplayColors: true,\n\t\t\t\t\tborderColor: 'rgba(0,0,0,0)',\n\t\t\t\t\tborderWidth: 0,\n\t\t\t\t\tcallbacks: {\n\t\t\t\t\t\t// Args are: (tooltipItems, data)\n\t\t\t\t\t\tbeforeTitle: helpers.noop,\n\t\t\t\t\t\ttitle: function title(tooltipItems, data) {\n\t\t\t\t\t\t\t// Pick first xLabel for now\n\t\t\t\t\t\t\tvar title = '';\n\t\t\t\t\t\t\tvar labels = data.labels;\n\t\t\t\t\t\t\tvar labelCount = labels ? labels.length : 0;\n\n\t\t\t\t\t\t\tif (tooltipItems.length > 0) {\n\t\t\t\t\t\t\t\tvar item = tooltipItems[0];\n\n\t\t\t\t\t\t\t\tif (item.xLabel) {\n\t\t\t\t\t\t\t\t\ttitle = item.xLabel;\n\t\t\t\t\t\t\t\t} else if (labelCount > 0 && item.index < labelCount) {\n\t\t\t\t\t\t\t\t\ttitle = labels[item.index];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn title;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tafterTitle: helpers.noop,\n\n\t\t\t\t\t\t// Args are: (tooltipItems, data)\n\t\t\t\t\t\tbeforeBody: helpers.noop,\n\n\t\t\t\t\t\t// Args are: (tooltipItem, data)\n\t\t\t\t\t\tbeforeLabel: helpers.noop,\n\t\t\t\t\t\tlabel: function label(tooltipItem, data) {\n\t\t\t\t\t\t\tvar label = data.datasets[tooltipItem.datasetIndex].label || '';\n\n\t\t\t\t\t\t\tif (label) {\n\t\t\t\t\t\t\t\tlabel += ': ';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlabel += tooltipItem.yLabel;\n\t\t\t\t\t\t\treturn label;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tlabelColor: function labelColor(tooltipItem, chart) {\n\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(tooltipItem.datasetIndex);\n\t\t\t\t\t\t\tvar activeElement = meta.data[tooltipItem.index];\n\t\t\t\t\t\t\tvar view = activeElement._view;\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tborderColor: view.borderColor,\n\t\t\t\t\t\t\t\tbackgroundColor: view.backgroundColor\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t},\n\t\t\t\t\t\tlabelTextColor: function labelTextColor() {\n\t\t\t\t\t\t\treturn this._options.bodyFontColor;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tafterLabel: helpers.noop,\n\n\t\t\t\t\t\t// Args are: (tooltipItems, data)\n\t\t\t\t\t\tafterBody: helpers.noop,\n\n\t\t\t\t\t\t// Args are: (tooltipItems, data)\n\t\t\t\t\t\tbeforeFooter: helpers.noop,\n\t\t\t\t\t\tfooter: helpers.noop,\n\t\t\t\t\t\tafterFooter: helpers.noop\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvar positioners = {\n\t\t\t\t/**\n * Average mode places the tooltip at the average position of the elements shown\n * @function Chart.Tooltip.positioners.average\n * @param elements {ChartElement[]} the elements being displayed in the tooltip\n * @returns {Point} tooltip position\n */\n\t\t\t\taverage: function average(elements) {\n\t\t\t\t\tif (!elements.length) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar i, len;\n\t\t\t\t\tvar x = 0;\n\t\t\t\t\tvar y = 0;\n\t\t\t\t\tvar count = 0;\n\n\t\t\t\t\tfor (i = 0, len = elements.length; i < len; ++i) {\n\t\t\t\t\t\tvar el = elements[i];\n\t\t\t\t\t\tif (el && el.hasValue()) {\n\t\t\t\t\t\t\tvar pos = el.tooltipPosition();\n\t\t\t\t\t\t\tx += pos.x;\n\t\t\t\t\t\t\ty += pos.y;\n\t\t\t\t\t\t\t++count;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: Math.round(x / count),\n\t\t\t\t\t\ty: Math.round(y / count)\n\t\t\t\t\t};\n\t\t\t\t},\n\n\t\t\t\t/**\n * Gets the tooltip position nearest of the item nearest to the event position\n * @function Chart.Tooltip.positioners.nearest\n * @param elements {Chart.Element[]} the tooltip elements\n * @param eventPosition {Point} the position of the event in canvas coordinates\n * @returns {Point} the tooltip position\n */\n\t\t\t\tnearest: function nearest(elements, eventPosition) {\n\t\t\t\t\tvar x = eventPosition.x;\n\t\t\t\t\tvar y = eventPosition.y;\n\t\t\t\t\tvar minDistance = Number.POSITIVE_INFINITY;\n\t\t\t\t\tvar i, len, nearestElement;\n\n\t\t\t\t\tfor (i = 0, len = elements.length; i < len; ++i) {\n\t\t\t\t\t\tvar el = elements[i];\n\t\t\t\t\t\tif (el && el.hasValue()) {\n\t\t\t\t\t\t\tvar center = el.getCenterPoint();\n\t\t\t\t\t\t\tvar d = helpers.distanceBetweenPoints(eventPosition, center);\n\n\t\t\t\t\t\t\tif (d < minDistance) {\n\t\t\t\t\t\t\t\tminDistance = d;\n\t\t\t\t\t\t\t\tnearestElement = el;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (nearestElement) {\n\t\t\t\t\t\tvar tp = nearestElement.tooltipPosition();\n\t\t\t\t\t\tx = tp.x;\n\t\t\t\t\t\ty = tp.y;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: x,\n\t\t\t\t\t\ty: y\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t/**\n * Helper method to merge the opacity into a color\n */\n\t\t\tfunction mergeOpacity(colorString, opacity) {\n\t\t\t\tvar color = helpers.color(colorString);\n\t\t\t\treturn color.alpha(opacity * color.alpha()).rgbaString();\n\t\t\t}\n\n\t\t\t// Helper to push or concat based on if the 2nd parameter is an array or not\n\t\t\tfunction pushOrConcat(base, toPush) {\n\t\t\t\tif (toPush) {\n\t\t\t\t\tif (helpers.isArray(toPush)) {\n\t\t\t\t\t\t// base = base.concat(toPush);\n\t\t\t\t\t\tArray.prototype.push.apply(base, toPush);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbase.push(toPush);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn base;\n\t\t\t}\n\n\t\t\t/**\n * Returns array of strings split by newline\n * @param {String} value - The value to split by newline.\n * @returns {Array} value if newline present - Returned from String split() method\n * @function\n */\n\t\t\tfunction splitNewlines(str) {\n\t\t\t\tif ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n\t\t\t\t\treturn str.split('\\n');\n\t\t\t\t}\n\t\t\t\treturn str;\n\t\t\t}\n\n\t\t\t// Private helper to create a tooltip item model\n\t\t\t// @param element : the chart element (point, arc, bar) to create the tooltip item for\n\t\t\t// @return : new tooltip item\n\t\t\tfunction createTooltipItem(element) {\n\t\t\t\tvar xScale = element._xScale;\n\t\t\t\tvar yScale = element._yScale || element._scale; // handle radar || polarArea charts\n\t\t\t\tvar index = element._index;\n\t\t\t\tvar datasetIndex = element._datasetIndex;\n\n\t\t\t\treturn {\n\t\t\t\t\txLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '',\n\t\t\t\t\tyLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '',\n\t\t\t\t\tindex: index,\n\t\t\t\t\tdatasetIndex: datasetIndex,\n\t\t\t\t\tx: element._model.x,\n\t\t\t\t\ty: element._model.y\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t/**\n * Helper to get the reset model for the tooltip\n * @param tooltipOpts {Object} the tooltip options\n */\n\t\t\tfunction getBaseModel(tooltipOpts) {\n\t\t\t\tvar globalDefaults = defaults.global;\n\t\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\n\t\t\t\treturn {\n\t\t\t\t\t// Positioning\n\t\t\t\t\txPadding: tooltipOpts.xPadding,\n\t\t\t\t\tyPadding: tooltipOpts.yPadding,\n\t\t\t\t\txAlign: tooltipOpts.xAlign,\n\t\t\t\t\tyAlign: tooltipOpts.yAlign,\n\n\t\t\t\t\t// Body\n\t\t\t\t\tbodyFontColor: tooltipOpts.bodyFontColor,\n\t\t\t\t\t_bodyFontFamily: valueOrDefault(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t\t\t_bodyFontStyle: valueOrDefault(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),\n\t\t\t\t\t_bodyAlign: tooltipOpts.bodyAlign,\n\t\t\t\t\tbodyFontSize: valueOrDefault(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),\n\t\t\t\t\tbodySpacing: tooltipOpts.bodySpacing,\n\n\t\t\t\t\t// Title\n\t\t\t\t\ttitleFontColor: tooltipOpts.titleFontColor,\n\t\t\t\t\t_titleFontFamily: valueOrDefault(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t\t\t_titleFontStyle: valueOrDefault(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),\n\t\t\t\t\ttitleFontSize: valueOrDefault(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),\n\t\t\t\t\t_titleAlign: tooltipOpts.titleAlign,\n\t\t\t\t\ttitleSpacing: tooltipOpts.titleSpacing,\n\t\t\t\t\ttitleMarginBottom: tooltipOpts.titleMarginBottom,\n\n\t\t\t\t\t// Footer\n\t\t\t\t\tfooterFontColor: tooltipOpts.footerFontColor,\n\t\t\t\t\t_footerFontFamily: valueOrDefault(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t\t\t_footerFontStyle: valueOrDefault(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),\n\t\t\t\t\tfooterFontSize: valueOrDefault(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),\n\t\t\t\t\t_footerAlign: tooltipOpts.footerAlign,\n\t\t\t\t\tfooterSpacing: tooltipOpts.footerSpacing,\n\t\t\t\t\tfooterMarginTop: tooltipOpts.footerMarginTop,\n\n\t\t\t\t\t// Appearance\n\t\t\t\t\tcaretSize: tooltipOpts.caretSize,\n\t\t\t\t\tcornerRadius: tooltipOpts.cornerRadius,\n\t\t\t\t\tbackgroundColor: tooltipOpts.backgroundColor,\n\t\t\t\t\topacity: 0,\n\t\t\t\t\tlegendColorBackground: tooltipOpts.multiKeyBackground,\n\t\t\t\t\tdisplayColors: tooltipOpts.displayColors,\n\t\t\t\t\tborderColor: tooltipOpts.borderColor,\n\t\t\t\t\tborderWidth: tooltipOpts.borderWidth\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t/**\n * Get the size of the tooltip\n */\n\t\t\tfunction getTooltipSize(tooltip, model) {\n\t\t\t\tvar ctx = tooltip._chart.ctx;\n\n\t\t\t\tvar height = model.yPadding * 2; // Tooltip Padding\n\t\t\t\tvar width = 0;\n\n\t\t\t\t// Count of all lines in the body\n\t\t\t\tvar body = model.body;\n\t\t\t\tvar combinedBodyLength = body.reduce(function (count, bodyItem) {\n\t\t\t\t\treturn count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length;\n\t\t\t\t}, 0);\n\t\t\t\tcombinedBodyLength += model.beforeBody.length + model.afterBody.length;\n\n\t\t\t\tvar titleLineCount = model.title.length;\n\t\t\t\tvar footerLineCount = model.footer.length;\n\t\t\t\tvar titleFontSize = model.titleFontSize;\n\t\t\t\tvar bodyFontSize = model.bodyFontSize;\n\t\t\t\tvar footerFontSize = model.footerFontSize;\n\n\t\t\t\theight += titleLineCount * titleFontSize; // Title Lines\n\t\t\t\theight += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing\n\t\t\t\theight += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin\n\t\t\t\theight += combinedBodyLength * bodyFontSize; // Body Lines\n\t\t\t\theight += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing\n\t\t\t\theight += footerLineCount ? model.footerMarginTop : 0; // Footer Margin\n\t\t\t\theight += footerLineCount * footerFontSize; // Footer Lines\n\t\t\t\theight += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing\n\n\t\t\t\t// Title width\n\t\t\t\tvar widthPadding = 0;\n\t\t\t\tvar maxLineWidth = function maxLineWidth(line) {\n\t\t\t\t\twidth = Math.max(width, ctx.measureText(line).width + widthPadding);\n\t\t\t\t};\n\n\t\t\t\tctx.font = helpers.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily);\n\t\t\t\thelpers.each(model.title, maxLineWidth);\n\n\t\t\t\t// Body width\n\t\t\t\tctx.font = helpers.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily);\n\t\t\t\thelpers.each(model.beforeBody.concat(model.afterBody), maxLineWidth);\n\n\t\t\t\t// Body lines may include some extra width due to the color box\n\t\t\t\twidthPadding = model.displayColors ? bodyFontSize + 2 : 0;\n\t\t\t\thelpers.each(body, function (bodyItem) {\n\t\t\t\t\thelpers.each(bodyItem.before, maxLineWidth);\n\t\t\t\t\thelpers.each(bodyItem.lines, maxLineWidth);\n\t\t\t\t\thelpers.each(bodyItem.after, maxLineWidth);\n\t\t\t\t});\n\n\t\t\t\t// Reset back to 0\n\t\t\t\twidthPadding = 0;\n\n\t\t\t\t// Footer width\n\t\t\t\tctx.font = helpers.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily);\n\t\t\t\thelpers.each(model.footer, maxLineWidth);\n\n\t\t\t\t// Add padding\n\t\t\t\twidth += 2 * model.xPadding;\n\n\t\t\t\treturn {\n\t\t\t\t\twidth: width,\n\t\t\t\t\theight: height\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t/**\n * Helper to get the alignment of a tooltip given the size\n */\n\t\t\tfunction determineAlignment(tooltip, size) {\n\t\t\t\tvar model = tooltip._model;\n\t\t\t\tvar chart = tooltip._chart;\n\t\t\t\tvar chartArea = tooltip._chart.chartArea;\n\t\t\t\tvar xAlign = 'center';\n\t\t\t\tvar yAlign = 'center';\n\n\t\t\t\tif (model.y < size.height) {\n\t\t\t\t\tyAlign = 'top';\n\t\t\t\t} else if (model.y > chart.height - size.height) {\n\t\t\t\t\tyAlign = 'bottom';\n\t\t\t\t}\n\n\t\t\t\tvar lf, rf; // functions to determine left, right alignment\n\t\t\t\tvar olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart\n\t\t\t\tvar yf; // function to get the y alignment if the tooltip goes outside of the left or right edges\n\t\t\t\tvar midX = (chartArea.left + chartArea.right) / 2;\n\t\t\t\tvar midY = (chartArea.top + chartArea.bottom) / 2;\n\n\t\t\t\tif (yAlign === 'center') {\n\t\t\t\t\tlf = function lf(x) {\n\t\t\t\t\t\treturn x <= midX;\n\t\t\t\t\t};\n\t\t\t\t\trf = function rf(x) {\n\t\t\t\t\t\treturn x > midX;\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tlf = function lf(x) {\n\t\t\t\t\t\treturn x <= size.width / 2;\n\t\t\t\t\t};\n\t\t\t\t\trf = function rf(x) {\n\t\t\t\t\t\treturn x >= chart.width - size.width / 2;\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tolf = function olf(x) {\n\t\t\t\t\treturn x + size.width + model.caretSize + model.caretPadding > chart.width;\n\t\t\t\t};\n\t\t\t\torf = function orf(x) {\n\t\t\t\t\treturn x - size.width - model.caretSize - model.caretPadding < 0;\n\t\t\t\t};\n\t\t\t\tyf = function yf(y) {\n\t\t\t\t\treturn y <= midY ? 'top' : 'bottom';\n\t\t\t\t};\n\n\t\t\t\tif (lf(model.x)) {\n\t\t\t\t\txAlign = 'left';\n\n\t\t\t\t\t// Is tooltip too wide and goes over the right side of the chart.?\n\t\t\t\t\tif (olf(model.x)) {\n\t\t\t\t\t\txAlign = 'center';\n\t\t\t\t\t\tyAlign = yf(model.y);\n\t\t\t\t\t}\n\t\t\t\t} else if (rf(model.x)) {\n\t\t\t\t\txAlign = 'right';\n\n\t\t\t\t\t// Is tooltip too wide and goes outside left edge of canvas?\n\t\t\t\t\tif (orf(model.x)) {\n\t\t\t\t\t\txAlign = 'center';\n\t\t\t\t\t\tyAlign = yf(model.y);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar opts = tooltip._options;\n\t\t\t\treturn {\n\t\t\t\t\txAlign: opts.xAlign ? opts.xAlign : xAlign,\n\t\t\t\t\tyAlign: opts.yAlign ? opts.yAlign : yAlign\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t/**\n * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n */\n\t\t\tfunction getBackgroundPoint(vm, size, alignment, chart) {\n\t\t\t\t// Background Position\n\t\t\t\tvar x = vm.x;\n\t\t\t\tvar y = vm.y;\n\n\t\t\t\tvar caretSize = vm.caretSize;\n\t\t\t\tvar caretPadding = vm.caretPadding;\n\t\t\t\tvar cornerRadius = vm.cornerRadius;\n\t\t\t\tvar xAlign = alignment.xAlign;\n\t\t\t\tvar yAlign = alignment.yAlign;\n\t\t\t\tvar paddingAndSize = caretSize + caretPadding;\n\t\t\t\tvar radiusAndPadding = cornerRadius + caretPadding;\n\n\t\t\t\tif (xAlign === 'right') {\n\t\t\t\t\tx -= size.width;\n\t\t\t\t} else if (xAlign === 'center') {\n\t\t\t\t\tx -= size.width / 2;\n\t\t\t\t\tif (x + size.width > chart.width) {\n\t\t\t\t\t\tx = chart.width - size.width;\n\t\t\t\t\t}\n\t\t\t\t\tif (x < 0) {\n\t\t\t\t\t\tx = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (yAlign === 'top') {\n\t\t\t\t\ty += paddingAndSize;\n\t\t\t\t} else if (yAlign === 'bottom') {\n\t\t\t\t\ty -= size.height + paddingAndSize;\n\t\t\t\t} else {\n\t\t\t\t\ty -= size.height / 2;\n\t\t\t\t}\n\n\t\t\t\tif (yAlign === 'center') {\n\t\t\t\t\tif (xAlign === 'left') {\n\t\t\t\t\t\tx += paddingAndSize;\n\t\t\t\t\t} else if (xAlign === 'right') {\n\t\t\t\t\t\tx -= paddingAndSize;\n\t\t\t\t\t}\n\t\t\t\t} else if (xAlign === 'left') {\n\t\t\t\t\tx -= radiusAndPadding;\n\t\t\t\t} else if (xAlign === 'right') {\n\t\t\t\t\tx += radiusAndPadding;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tx: x,\n\t\t\t\t\ty: y\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t/**\n * Helper to build before and after body lines\n */\n\t\t\tfunction getBeforeAfterBodyLines(callback) {\n\t\t\t\treturn pushOrConcat([], splitNewlines(callback));\n\t\t\t}\n\n\t\t\tvar exports = module.exports = Element.extend({\n\t\t\t\tinitialize: function initialize() {\n\t\t\t\t\tthis._model = getBaseModel(this._options);\n\t\t\t\t\tthis._lastActive = [];\n\t\t\t\t},\n\n\t\t\t\t// Get the title\n\t\t\t\t// Args are: (tooltipItem, data)\n\t\t\t\tgetTitle: function getTitle() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar opts = me._options;\n\t\t\t\t\tvar callbacks = opts.callbacks;\n\n\t\t\t\t\tvar beforeTitle = callbacks.beforeTitle.apply(me, arguments);\n\t\t\t\t\tvar title = callbacks.title.apply(me, arguments);\n\t\t\t\t\tvar afterTitle = callbacks.afterTitle.apply(me, arguments);\n\n\t\t\t\t\tvar lines = [];\n\t\t\t\t\tlines = pushOrConcat(lines, splitNewlines(beforeTitle));\n\t\t\t\t\tlines = pushOrConcat(lines, splitNewlines(title));\n\t\t\t\t\tlines = pushOrConcat(lines, splitNewlines(afterTitle));\n\n\t\t\t\t\treturn lines;\n\t\t\t\t},\n\n\t\t\t\t// Args are: (tooltipItem, data)\n\t\t\t\tgetBeforeBody: function getBeforeBody() {\n\t\t\t\t\treturn getBeforeAfterBodyLines(this._options.callbacks.beforeBody.apply(this, arguments));\n\t\t\t\t},\n\n\t\t\t\t// Args are: (tooltipItem, data)\n\t\t\t\tgetBody: function getBody(tooltipItems, data) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar callbacks = me._options.callbacks;\n\t\t\t\t\tvar bodyItems = [];\n\n\t\t\t\t\thelpers.each(tooltipItems, function (tooltipItem) {\n\t\t\t\t\t\tvar bodyItem = {\n\t\t\t\t\t\t\tbefore: [],\n\t\t\t\t\t\t\tlines: [],\n\t\t\t\t\t\t\tafter: []\n\t\t\t\t\t\t};\n\t\t\t\t\t\tpushOrConcat(bodyItem.before, splitNewlines(callbacks.beforeLabel.call(me, tooltipItem, data)));\n\t\t\t\t\t\tpushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data));\n\t\t\t\t\t\tpushOrConcat(bodyItem.after, splitNewlines(callbacks.afterLabel.call(me, tooltipItem, data)));\n\n\t\t\t\t\t\tbodyItems.push(bodyItem);\n\t\t\t\t\t});\n\n\t\t\t\t\treturn bodyItems;\n\t\t\t\t},\n\n\t\t\t\t// Args are: (tooltipItem, data)\n\t\t\t\tgetAfterBody: function getAfterBody() {\n\t\t\t\t\treturn getBeforeAfterBodyLines(this._options.callbacks.afterBody.apply(this, arguments));\n\t\t\t\t},\n\n\t\t\t\t// Get the footer and beforeFooter and afterFooter lines\n\t\t\t\t// Args are: (tooltipItem, data)\n\t\t\t\tgetFooter: function getFooter() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar callbacks = me._options.callbacks;\n\n\t\t\t\t\tvar beforeFooter = callbacks.beforeFooter.apply(me, arguments);\n\t\t\t\t\tvar footer = callbacks.footer.apply(me, arguments);\n\t\t\t\t\tvar afterFooter = callbacks.afterFooter.apply(me, arguments);\n\n\t\t\t\t\tvar lines = [];\n\t\t\t\t\tlines = pushOrConcat(lines, splitNewlines(beforeFooter));\n\t\t\t\t\tlines = pushOrConcat(lines, splitNewlines(footer));\n\t\t\t\t\tlines = pushOrConcat(lines, splitNewlines(afterFooter));\n\n\t\t\t\t\treturn lines;\n\t\t\t\t},\n\n\t\t\t\tupdate: function update(changed) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar opts = me._options;\n\n\t\t\t\t\t// Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition\n\t\t\t\t\t// that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time\n\t\t\t\t\t// which breaks any animations.\n\t\t\t\t\tvar existingModel = me._model;\n\t\t\t\t\tvar model = me._model = getBaseModel(opts);\n\t\t\t\t\tvar active = me._active;\n\n\t\t\t\t\tvar data = me._data;\n\n\t\t\t\t\t// In the case where active.length === 0 we need to keep these at existing values for good animations\n\t\t\t\t\tvar alignment = {\n\t\t\t\t\t\txAlign: existingModel.xAlign,\n\t\t\t\t\t\tyAlign: existingModel.yAlign\n\t\t\t\t\t};\n\t\t\t\t\tvar backgroundPoint = {\n\t\t\t\t\t\tx: existingModel.x,\n\t\t\t\t\t\ty: existingModel.y\n\t\t\t\t\t};\n\t\t\t\t\tvar tooltipSize = {\n\t\t\t\t\t\twidth: existingModel.width,\n\t\t\t\t\t\theight: existingModel.height\n\t\t\t\t\t};\n\t\t\t\t\tvar tooltipPosition = {\n\t\t\t\t\t\tx: existingModel.caretX,\n\t\t\t\t\t\ty: existingModel.caretY\n\t\t\t\t\t};\n\n\t\t\t\t\tvar i, len;\n\n\t\t\t\t\tif (active.length) {\n\t\t\t\t\t\tmodel.opacity = 1;\n\n\t\t\t\t\t\tvar labelColors = [];\n\t\t\t\t\t\tvar labelTextColors = [];\n\t\t\t\t\t\ttooltipPosition = positioners[opts.position].call(me, active, me._eventPosition);\n\n\t\t\t\t\t\tvar tooltipItems = [];\n\t\t\t\t\t\tfor (i = 0, len = active.length; i < len; ++i) {\n\t\t\t\t\t\t\ttooltipItems.push(createTooltipItem(active[i]));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If the user provided a filter function, use it to modify the tooltip items\n\t\t\t\t\t\tif (opts.filter) {\n\t\t\t\t\t\t\ttooltipItems = tooltipItems.filter(function (a) {\n\t\t\t\t\t\t\t\treturn opts.filter(a, data);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// If the user provided a sorting function, use it to modify the tooltip items\n\t\t\t\t\t\tif (opts.itemSort) {\n\t\t\t\t\t\t\ttooltipItems = tooltipItems.sort(function (a, b) {\n\t\t\t\t\t\t\t\treturn opts.itemSort(a, b, data);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Determine colors for boxes\n\t\t\t\t\t\thelpers.each(tooltipItems, function (tooltipItem) {\n\t\t\t\t\t\t\tlabelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart));\n\t\t\t\t\t\t\tlabelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart));\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// Build the Text Lines\n\t\t\t\t\t\tmodel.title = me.getTitle(tooltipItems, data);\n\t\t\t\t\t\tmodel.beforeBody = me.getBeforeBody(tooltipItems, data);\n\t\t\t\t\t\tmodel.body = me.getBody(tooltipItems, data);\n\t\t\t\t\t\tmodel.afterBody = me.getAfterBody(tooltipItems, data);\n\t\t\t\t\t\tmodel.footer = me.getFooter(tooltipItems, data);\n\n\t\t\t\t\t\t// Initial positioning and colors\n\t\t\t\t\t\tmodel.x = Math.round(tooltipPosition.x);\n\t\t\t\t\t\tmodel.y = Math.round(tooltipPosition.y);\n\t\t\t\t\t\tmodel.caretPadding = opts.caretPadding;\n\t\t\t\t\t\tmodel.labelColors = labelColors;\n\t\t\t\t\t\tmodel.labelTextColors = labelTextColors;\n\n\t\t\t\t\t\t// data points\n\t\t\t\t\t\tmodel.dataPoints = tooltipItems;\n\n\t\t\t\t\t\t// We need to determine alignment of the tooltip\n\t\t\t\t\t\ttooltipSize = getTooltipSize(this, model);\n\t\t\t\t\t\talignment = determineAlignment(this, tooltipSize);\n\t\t\t\t\t\t// Final Size and Position\n\t\t\t\t\t\tbackgroundPoint = getBackgroundPoint(model, tooltipSize, alignment, me._chart);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmodel.opacity = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tmodel.xAlign = alignment.xAlign;\n\t\t\t\t\tmodel.yAlign = alignment.yAlign;\n\t\t\t\t\tmodel.x = backgroundPoint.x;\n\t\t\t\t\tmodel.y = backgroundPoint.y;\n\t\t\t\t\tmodel.width = tooltipSize.width;\n\t\t\t\t\tmodel.height = tooltipSize.height;\n\n\t\t\t\t\t// Point where the caret on the tooltip points to\n\t\t\t\t\tmodel.caretX = tooltipPosition.x;\n\t\t\t\t\tmodel.caretY = tooltipPosition.y;\n\n\t\t\t\t\tme._model = model;\n\n\t\t\t\t\tif (changed && opts.custom) {\n\t\t\t\t\t\topts.custom.call(me, model);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn me;\n\t\t\t\t},\n\n\t\t\t\tdrawCaret: function drawCaret(tooltipPoint, size) {\n\t\t\t\t\tvar ctx = this._chart.ctx;\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\tvar caretPosition = this.getCaretPosition(tooltipPoint, size, vm);\n\n\t\t\t\t\tctx.lineTo(caretPosition.x1, caretPosition.y1);\n\t\t\t\t\tctx.lineTo(caretPosition.x2, caretPosition.y2);\n\t\t\t\t\tctx.lineTo(caretPosition.x3, caretPosition.y3);\n\t\t\t\t},\n\t\t\t\tgetCaretPosition: function getCaretPosition(tooltipPoint, size, vm) {\n\t\t\t\t\tvar x1, x2, x3, y1, y2, y3;\n\t\t\t\t\tvar caretSize = vm.caretSize;\n\t\t\t\t\tvar cornerRadius = vm.cornerRadius;\n\t\t\t\t\tvar xAlign = vm.xAlign;\n\t\t\t\t\tvar yAlign = vm.yAlign;\n\t\t\t\t\tvar ptX = tooltipPoint.x;\n\t\t\t\t\tvar ptY = tooltipPoint.y;\n\t\t\t\t\tvar width = size.width;\n\t\t\t\t\tvar height = size.height;\n\n\t\t\t\t\tif (yAlign === 'center') {\n\t\t\t\t\t\ty2 = ptY + height / 2;\n\n\t\t\t\t\t\tif (xAlign === 'left') {\n\t\t\t\t\t\t\tx1 = ptX;\n\t\t\t\t\t\t\tx2 = x1 - caretSize;\n\t\t\t\t\t\t\tx3 = x1;\n\n\t\t\t\t\t\t\ty1 = y2 + caretSize;\n\t\t\t\t\t\t\ty3 = y2 - caretSize;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tx1 = ptX + width;\n\t\t\t\t\t\t\tx2 = x1 + caretSize;\n\t\t\t\t\t\t\tx3 = x1;\n\n\t\t\t\t\t\t\ty1 = y2 - caretSize;\n\t\t\t\t\t\t\ty3 = y2 + caretSize;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (xAlign === 'left') {\n\t\t\t\t\t\t\tx2 = ptX + cornerRadius + caretSize;\n\t\t\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t\t\t} else if (xAlign === 'right') {\n\t\t\t\t\t\t\tx2 = ptX + width - cornerRadius - caretSize;\n\t\t\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tx2 = vm.caretX;\n\t\t\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (yAlign === 'top') {\n\t\t\t\t\t\t\ty1 = ptY;\n\t\t\t\t\t\t\ty2 = y1 - caretSize;\n\t\t\t\t\t\t\ty3 = y1;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ty1 = ptY + height;\n\t\t\t\t\t\t\ty2 = y1 + caretSize;\n\t\t\t\t\t\t\ty3 = y1;\n\t\t\t\t\t\t\t// invert drawing order\n\t\t\t\t\t\t\tvar tmp = x3;\n\t\t\t\t\t\t\tx3 = x1;\n\t\t\t\t\t\t\tx1 = tmp;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn { x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3 };\n\t\t\t\t},\n\n\t\t\t\tdrawTitle: function drawTitle(pt, vm, ctx, opacity) {\n\t\t\t\t\tvar title = vm.title;\n\n\t\t\t\t\tif (title.length) {\n\t\t\t\t\t\tctx.textAlign = vm._titleAlign;\n\t\t\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\t\t\tvar titleFontSize = vm.titleFontSize;\n\t\t\t\t\t\tvar titleSpacing = vm.titleSpacing;\n\n\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.titleFontColor, opacity);\n\t\t\t\t\t\tctx.font = helpers.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\n\n\t\t\t\t\t\tvar i, len;\n\t\t\t\t\t\tfor (i = 0, len = title.length; i < len; ++i) {\n\t\t\t\t\t\t\tctx.fillText(title[i], pt.x, pt.y);\n\t\t\t\t\t\t\tpt.y += titleFontSize + titleSpacing; // Line Height and spacing\n\n\t\t\t\t\t\t\tif (i + 1 === title.length) {\n\t\t\t\t\t\t\t\tpt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tdrawBody: function drawBody(pt, vm, ctx, opacity) {\n\t\t\t\t\tvar bodyFontSize = vm.bodyFontSize;\n\t\t\t\t\tvar bodySpacing = vm.bodySpacing;\n\t\t\t\t\tvar body = vm.body;\n\n\t\t\t\t\tctx.textAlign = vm._bodyAlign;\n\t\t\t\t\tctx.textBaseline = 'top';\n\t\t\t\t\tctx.font = helpers.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\n\n\t\t\t\t\t// Before Body\n\t\t\t\t\tvar xLinePadding = 0;\n\t\t\t\t\tvar fillLineOfText = function fillLineOfText(line) {\n\t\t\t\t\t\tctx.fillText(line, pt.x + xLinePadding, pt.y);\n\t\t\t\t\t\tpt.y += bodyFontSize + bodySpacing;\n\t\t\t\t\t};\n\n\t\t\t\t\t// Before body lines\n\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.bodyFontColor, opacity);\n\t\t\t\t\thelpers.each(vm.beforeBody, fillLineOfText);\n\n\t\t\t\t\tvar drawColorBoxes = vm.displayColors;\n\t\t\t\t\txLinePadding = drawColorBoxes ? bodyFontSize + 2 : 0;\n\n\t\t\t\t\t// Draw body lines now\n\t\t\t\t\thelpers.each(body, function (bodyItem, i) {\n\t\t\t\t\t\tvar textColor = mergeOpacity(vm.labelTextColors[i], opacity);\n\t\t\t\t\t\tctx.fillStyle = textColor;\n\t\t\t\t\t\thelpers.each(bodyItem.before, fillLineOfText);\n\n\t\t\t\t\t\thelpers.each(bodyItem.lines, function (line) {\n\t\t\t\t\t\t\t// Draw Legend-like boxes if needed\n\t\t\t\t\t\t\tif (drawColorBoxes) {\n\t\t\t\t\t\t\t\t// Fill a white rect so that colours merge nicely if the opacity is < 1\n\t\t\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.legendColorBackground, opacity);\n\t\t\t\t\t\t\t\tctx.fillRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n\t\t\t\t\t\t\t\t// Border\n\t\t\t\t\t\t\t\tctx.lineWidth = 1;\n\t\t\t\t\t\t\t\tctx.strokeStyle = mergeOpacity(vm.labelColors[i].borderColor, opacity);\n\t\t\t\t\t\t\t\tctx.strokeRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n\t\t\t\t\t\t\t\t// Inner square\n\t\t\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.labelColors[i].backgroundColor, opacity);\n\t\t\t\t\t\t\t\tctx.fillRect(pt.x + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);\n\t\t\t\t\t\t\t\tctx.fillStyle = textColor;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tfillLineOfText(line);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\thelpers.each(bodyItem.after, fillLineOfText);\n\t\t\t\t\t});\n\n\t\t\t\t\t// Reset back to 0 for after body\n\t\t\t\t\txLinePadding = 0;\n\n\t\t\t\t\t// After body lines\n\t\t\t\t\thelpers.each(vm.afterBody, fillLineOfText);\n\t\t\t\t\tpt.y -= bodySpacing; // Remove last body spacing\n\t\t\t\t},\n\n\t\t\t\tdrawFooter: function drawFooter(pt, vm, ctx, opacity) {\n\t\t\t\t\tvar footer = vm.footer;\n\n\t\t\t\t\tif (footer.length) {\n\t\t\t\t\t\tpt.y += vm.footerMarginTop;\n\n\t\t\t\t\t\tctx.textAlign = vm._footerAlign;\n\t\t\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.footerFontColor, opacity);\n\t\t\t\t\t\tctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\n\n\t\t\t\t\t\thelpers.each(footer, function (line) {\n\t\t\t\t\t\t\tctx.fillText(line, pt.x, pt.y);\n\t\t\t\t\t\t\tpt.y += vm.footerFontSize + vm.footerSpacing;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tdrawBackground: function drawBackground(pt, vm, ctx, tooltipSize, opacity) {\n\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.backgroundColor, opacity);\n\t\t\t\t\tctx.strokeStyle = mergeOpacity(vm.borderColor, opacity);\n\t\t\t\t\tctx.lineWidth = vm.borderWidth;\n\t\t\t\t\tvar xAlign = vm.xAlign;\n\t\t\t\t\tvar yAlign = vm.yAlign;\n\t\t\t\t\tvar x = pt.x;\n\t\t\t\t\tvar y = pt.y;\n\t\t\t\t\tvar width = tooltipSize.width;\n\t\t\t\t\tvar height = tooltipSize.height;\n\t\t\t\t\tvar radius = vm.cornerRadius;\n\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.moveTo(x + radius, y);\n\t\t\t\t\tif (yAlign === 'top') {\n\t\t\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t\t\t}\n\t\t\t\t\tctx.lineTo(x + width - radius, y);\n\t\t\t\t\tctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n\t\t\t\t\tif (yAlign === 'center' && xAlign === 'right') {\n\t\t\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t\t\t}\n\t\t\t\t\tctx.lineTo(x + width, y + height - radius);\n\t\t\t\t\tctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n\t\t\t\t\tif (yAlign === 'bottom') {\n\t\t\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t\t\t}\n\t\t\t\t\tctx.lineTo(x + radius, y + height);\n\t\t\t\t\tctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n\t\t\t\t\tif (yAlign === 'center' && xAlign === 'left') {\n\t\t\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t\t\t}\n\t\t\t\t\tctx.lineTo(x, y + radius);\n\t\t\t\t\tctx.quadraticCurveTo(x, y, x + radius, y);\n\t\t\t\t\tctx.closePath();\n\n\t\t\t\t\tctx.fill();\n\n\t\t\t\t\tif (vm.borderWidth > 0) {\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tdraw: function draw() {\n\t\t\t\t\tvar ctx = this._chart.ctx;\n\t\t\t\t\tvar vm = this._view;\n\n\t\t\t\t\tif (vm.opacity === 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar tooltipSize = {\n\t\t\t\t\t\twidth: vm.width,\n\t\t\t\t\t\theight: vm.height\n\t\t\t\t\t};\n\t\t\t\t\tvar pt = {\n\t\t\t\t\t\tx: vm.x,\n\t\t\t\t\t\ty: vm.y\n\t\t\t\t\t};\n\n\t\t\t\t\t// IE11/Edge does not like very small opacities, so snap to 0\n\t\t\t\t\tvar opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity;\n\n\t\t\t\t\t// Truthy/falsey value for empty tooltip\n\t\t\t\t\tvar hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length;\n\n\t\t\t\t\tif (this._options.enabled && hasTooltipContent) {\n\t\t\t\t\t\t// Draw Background\n\t\t\t\t\t\tthis.drawBackground(pt, vm, ctx, tooltipSize, opacity);\n\n\t\t\t\t\t\t// Draw Title, Body, and Footer\n\t\t\t\t\t\tpt.x += vm.xPadding;\n\t\t\t\t\t\tpt.y += vm.yPadding;\n\n\t\t\t\t\t\t// Titles\n\t\t\t\t\t\tthis.drawTitle(pt, vm, ctx, opacity);\n\n\t\t\t\t\t\t// Body\n\t\t\t\t\t\tthis.drawBody(pt, vm, ctx, opacity);\n\n\t\t\t\t\t\t// Footer\n\t\t\t\t\t\tthis.drawFooter(pt, vm, ctx, opacity);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n * Handle an event\n * @private\n * @param {IEvent} event - The event to handle\n * @returns {Boolean} true if the tooltip changed\n */\n\t\t\t\thandleEvent: function handleEvent(e) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar options = me._options;\n\t\t\t\t\tvar changed = false;\n\n\t\t\t\t\tme._lastActive = me._lastActive || [];\n\n\t\t\t\t\t// Find Active Elements for tooltips\n\t\t\t\t\tif (e.type === 'mouseout') {\n\t\t\t\t\t\tme._active = [];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tme._active = me._chart.getElementsAtEventForMode(e, options.mode, options);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remember Last Actives\n\t\t\t\t\tchanged = !helpers.arrayEquals(me._active, me._lastActive);\n\n\t\t\t\t\t// Only handle target event on tooltip change\n\t\t\t\t\tif (changed) {\n\t\t\t\t\t\tme._lastActive = me._active;\n\n\t\t\t\t\t\tif (options.enabled || options.custom) {\n\t\t\t\t\t\t\tme._eventPosition = {\n\t\t\t\t\t\t\t\tx: e.x,\n\t\t\t\t\t\t\t\ty: e.y\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tme.update(true);\n\t\t\t\t\t\t\tme.pivot();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn changed;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/**\n * @namespace Chart.Tooltip.positioners\n */\n\t\t\texports.positioners = positioners;\n\t\t}, { \"26\": 26, \"27\": 27, \"46\": 46 }], 37: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar Element = require(27);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('global', {\n\t\t\t\telements: {\n\t\t\t\t\tarc: {\n\t\t\t\t\t\tbackgroundColor: defaults.global.defaultColor,\n\t\t\t\t\t\tborderColor: '#fff',\n\t\t\t\t\t\tborderWidth: 2\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmodule.exports = Element.extend({\n\t\t\t\tinLabelRange: function inLabelRange(mouseX) {\n\t\t\t\t\tvar vm = this._view;\n\n\t\t\t\t\tif (vm) {\n\t\t\t\t\t\treturn Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2);\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\n\t\t\t\tinRange: function inRange(chartX, chartY) {\n\t\t\t\t\tvar vm = this._view;\n\n\t\t\t\t\tif (vm) {\n\t\t\t\t\t\tvar pointRelativePosition = helpers.getAngleFromPoint(vm, { x: chartX, y: chartY });\n\t\t\t\t\t\tvar angle = pointRelativePosition.angle;\n\t\t\t\t\t\tvar distance = pointRelativePosition.distance;\n\n\t\t\t\t\t\t// Sanitise angle range\n\t\t\t\t\t\tvar startAngle = vm.startAngle;\n\t\t\t\t\t\tvar endAngle = vm.endAngle;\n\t\t\t\t\t\twhile (endAngle < startAngle) {\n\t\t\t\t\t\t\tendAngle += 2.0 * Math.PI;\n\t\t\t\t\t\t}\n\t\t\t\t\t\twhile (angle > endAngle) {\n\t\t\t\t\t\t\tangle -= 2.0 * Math.PI;\n\t\t\t\t\t\t}\n\t\t\t\t\t\twhile (angle < startAngle) {\n\t\t\t\t\t\t\tangle += 2.0 * Math.PI;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Check if within the range of the open/close angle\n\t\t\t\t\t\tvar betweenAngles = angle >= startAngle && angle <= endAngle;\n\t\t\t\t\t\tvar withinRadius = distance >= vm.innerRadius && distance <= vm.outerRadius;\n\n\t\t\t\t\t\treturn betweenAngles && withinRadius;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\n\t\t\t\tgetCenterPoint: function getCenterPoint() {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\tvar halfAngle = (vm.startAngle + vm.endAngle) / 2;\n\t\t\t\t\tvar halfRadius = (vm.innerRadius + vm.outerRadius) / 2;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: vm.x + Math.cos(halfAngle) * halfRadius,\n\t\t\t\t\t\ty: vm.y + Math.sin(halfAngle) * halfRadius\n\t\t\t\t\t};\n\t\t\t\t},\n\n\t\t\t\tgetArea: function getArea() {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\treturn Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2));\n\t\t\t\t},\n\n\t\t\t\ttooltipPosition: function tooltipPosition() {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\tvar centreAngle = vm.startAngle + (vm.endAngle - vm.startAngle) / 2;\n\t\t\t\t\tvar rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: vm.x + Math.cos(centreAngle) * rangeFromCentre,\n\t\t\t\t\t\ty: vm.y + Math.sin(centreAngle) * rangeFromCentre\n\t\t\t\t\t};\n\t\t\t\t},\n\n\t\t\t\tdraw: function draw() {\n\t\t\t\t\tvar ctx = this._chart.ctx;\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\tvar sA = vm.startAngle;\n\t\t\t\t\tvar eA = vm.endAngle;\n\n\t\t\t\t\tctx.beginPath();\n\n\t\t\t\t\tctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA);\n\t\t\t\t\tctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);\n\n\t\t\t\t\tctx.closePath();\n\t\t\t\t\tctx.strokeStyle = vm.borderColor;\n\t\t\t\t\tctx.lineWidth = vm.borderWidth;\n\n\t\t\t\t\tctx.fillStyle = vm.backgroundColor;\n\n\t\t\t\t\tctx.fill();\n\t\t\t\t\tctx.lineJoin = 'bevel';\n\n\t\t\t\t\tif (vm.borderWidth) {\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}, { \"26\": 26, \"27\": 27, \"46\": 46 }], 38: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar Element = require(27);\n\t\t\tvar helpers = require(46);\n\n\t\t\tvar globalDefaults = defaults.global;\n\n\t\t\tdefaults._set('global', {\n\t\t\t\telements: {\n\t\t\t\t\tline: {\n\t\t\t\t\t\ttension: 0.4,\n\t\t\t\t\t\tbackgroundColor: globalDefaults.defaultColor,\n\t\t\t\t\t\tborderWidth: 3,\n\t\t\t\t\t\tborderColor: globalDefaults.defaultColor,\n\t\t\t\t\t\tborderCapStyle: 'butt',\n\t\t\t\t\t\tborderDash: [],\n\t\t\t\t\t\tborderDashOffset: 0.0,\n\t\t\t\t\t\tborderJoinStyle: 'miter',\n\t\t\t\t\t\tcapBezierPoints: true,\n\t\t\t\t\t\tfill: true // do we fill in the area between the line and its base axis\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmodule.exports = Element.extend({\n\t\t\t\tdraw: function draw() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar vm = me._view;\n\t\t\t\t\tvar ctx = me._chart.ctx;\n\t\t\t\t\tvar spanGaps = vm.spanGaps;\n\t\t\t\t\tvar points = me._children.slice(); // clone array\n\t\t\t\t\tvar globalOptionLineElements = globalDefaults.elements.line;\n\t\t\t\t\tvar lastDrawnIndex = -1;\n\t\t\t\t\tvar index, current, previous, currentVM;\n\n\t\t\t\t\t// If we are looping, adding the first point again\n\t\t\t\t\tif (me._loop && points.length) {\n\t\t\t\t\t\tpoints.push(points[0]);\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.save();\n\n\t\t\t\t\t// Stroke Line Options\n\t\t\t\t\tctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle;\n\n\t\t\t\t\t// IE 9 and 10 do not support line dash\n\t\t\t\t\tif (ctx.setLineDash) {\n\t\t\t\t\t\tctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash);\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.lineDashOffset = vm.borderDashOffset || globalOptionLineElements.borderDashOffset;\n\t\t\t\t\tctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle;\n\t\t\t\t\tctx.lineWidth = vm.borderWidth || globalOptionLineElements.borderWidth;\n\t\t\t\t\tctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor;\n\n\t\t\t\t\t// Stroke Line\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tlastDrawnIndex = -1;\n\n\t\t\t\t\tfor (index = 0; index < points.length; ++index) {\n\t\t\t\t\t\tcurrent = points[index];\n\t\t\t\t\t\tprevious = helpers.previousItem(points, index);\n\t\t\t\t\t\tcurrentVM = current._view;\n\n\t\t\t\t\t\t// First point moves to it's starting position no matter what\n\t\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\t\tif (!currentVM.skip) {\n\t\t\t\t\t\t\t\tctx.moveTo(currentVM.x, currentVM.y);\n\t\t\t\t\t\t\t\tlastDrawnIndex = index;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tprevious = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex];\n\n\t\t\t\t\t\t\tif (!currentVM.skip) {\n\t\t\t\t\t\t\t\tif (lastDrawnIndex !== index - 1 && !spanGaps || lastDrawnIndex === -1) {\n\t\t\t\t\t\t\t\t\t// There was a gap and this is the first point after the gap\n\t\t\t\t\t\t\t\t\tctx.moveTo(currentVM.x, currentVM.y);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// Line to next point\n\t\t\t\t\t\t\t\t\thelpers.canvas.lineTo(ctx, previous._view, current._view);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlastDrawnIndex = index;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.stroke();\n\t\t\t\t\tctx.restore();\n\t\t\t\t}\n\t\t\t});\n\t\t}, { \"26\": 26, \"27\": 27, \"46\": 46 }], 39: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar Element = require(27);\n\t\t\tvar helpers = require(46);\n\n\t\t\tvar defaultColor = defaults.global.defaultColor;\n\n\t\t\tdefaults._set('global', {\n\t\t\t\telements: {\n\t\t\t\t\tpoint: {\n\t\t\t\t\t\tradius: 3,\n\t\t\t\t\t\tpointStyle: 'circle',\n\t\t\t\t\t\tbackgroundColor: defaultColor,\n\t\t\t\t\t\tborderColor: defaultColor,\n\t\t\t\t\t\tborderWidth: 1,\n\t\t\t\t\t\t// Hover\n\t\t\t\t\t\thitRadius: 1,\n\t\t\t\t\t\thoverRadius: 4,\n\t\t\t\t\t\thoverBorderWidth: 1\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfunction xRange(mouseX) {\n\t\t\t\tvar vm = this._view;\n\t\t\t\treturn vm ? Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius : false;\n\t\t\t}\n\n\t\t\tfunction yRange(mouseY) {\n\t\t\t\tvar vm = this._view;\n\t\t\t\treturn vm ? Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius : false;\n\t\t\t}\n\n\t\t\tmodule.exports = Element.extend({\n\t\t\t\tinRange: function inRange(mouseX, mouseY) {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\treturn vm ? Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2) < Math.pow(vm.hitRadius + vm.radius, 2) : false;\n\t\t\t\t},\n\n\t\t\t\tinLabelRange: xRange,\n\t\t\t\tinXRange: xRange,\n\t\t\t\tinYRange: yRange,\n\n\t\t\t\tgetCenterPoint: function getCenterPoint() {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: vm.x,\n\t\t\t\t\t\ty: vm.y\n\t\t\t\t\t};\n\t\t\t\t},\n\n\t\t\t\tgetArea: function getArea() {\n\t\t\t\t\treturn Math.PI * Math.pow(this._view.radius, 2);\n\t\t\t\t},\n\n\t\t\t\ttooltipPosition: function tooltipPosition() {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: vm.x,\n\t\t\t\t\t\ty: vm.y,\n\t\t\t\t\t\tpadding: vm.radius + vm.borderWidth\n\t\t\t\t\t};\n\t\t\t\t},\n\n\t\t\t\tdraw: function draw(chartArea) {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\tvar model = this._model;\n\t\t\t\t\tvar ctx = this._chart.ctx;\n\t\t\t\t\tvar pointStyle = vm.pointStyle;\n\t\t\t\t\tvar rotation = vm.rotation;\n\t\t\t\t\tvar radius = vm.radius;\n\t\t\t\t\tvar x = vm.x;\n\t\t\t\t\tvar y = vm.y;\n\t\t\t\t\tvar errMargin = 1.01; // 1.01 is margin for Accumulated error. (Especially Edge, IE.)\n\n\t\t\t\t\tif (vm.skip) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Clipping for Points.\n\t\t\t\t\tif (chartArea === undefined || model.x >= chartArea.left && chartArea.right * errMargin >= model.x && model.y >= chartArea.top && chartArea.bottom * errMargin >= model.y) {\n\t\t\t\t\t\tctx.strokeStyle = vm.borderColor || defaultColor;\n\t\t\t\t\t\tctx.lineWidth = helpers.valueOrDefault(vm.borderWidth, defaults.global.elements.point.borderWidth);\n\t\t\t\t\t\tctx.fillStyle = vm.backgroundColor || defaultColor;\n\t\t\t\t\t\thelpers.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}, { \"26\": 26, \"27\": 27, \"46\": 46 }], 40: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar Element = require(27);\n\n\t\t\tdefaults._set('global', {\n\t\t\t\telements: {\n\t\t\t\t\trectangle: {\n\t\t\t\t\t\tbackgroundColor: defaults.global.defaultColor,\n\t\t\t\t\t\tborderColor: defaults.global.defaultColor,\n\t\t\t\t\t\tborderSkipped: 'bottom',\n\t\t\t\t\t\tborderWidth: 0\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfunction isVertical(bar) {\n\t\t\t\treturn bar._view.width !== undefined;\n\t\t\t}\n\n\t\t\t/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param bar {Chart.Element.Rectangle} the bar\n * @return {Bounds} bounds of the bar\n * @private\n */\n\t\t\tfunction getBarBounds(bar) {\n\t\t\t\tvar vm = bar._view;\n\t\t\t\tvar x1, x2, y1, y2;\n\n\t\t\t\tif (isVertical(bar)) {\n\t\t\t\t\t// vertical\n\t\t\t\t\tvar halfWidth = vm.width / 2;\n\t\t\t\t\tx1 = vm.x - halfWidth;\n\t\t\t\t\tx2 = vm.x + halfWidth;\n\t\t\t\t\ty1 = Math.min(vm.y, vm.base);\n\t\t\t\t\ty2 = Math.max(vm.y, vm.base);\n\t\t\t\t} else {\n\t\t\t\t\t// horizontal bar\n\t\t\t\t\tvar halfHeight = vm.height / 2;\n\t\t\t\t\tx1 = Math.min(vm.x, vm.base);\n\t\t\t\t\tx2 = Math.max(vm.x, vm.base);\n\t\t\t\t\ty1 = vm.y - halfHeight;\n\t\t\t\t\ty2 = vm.y + halfHeight;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tleft: x1,\n\t\t\t\t\ttop: y1,\n\t\t\t\t\tright: x2,\n\t\t\t\t\tbottom: y2\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tmodule.exports = Element.extend({\n\t\t\t\tdraw: function draw() {\n\t\t\t\t\tvar ctx = this._chart.ctx;\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\tvar left, right, top, bottom, signX, signY, borderSkipped;\n\t\t\t\t\tvar borderWidth = vm.borderWidth;\n\n\t\t\t\t\tif (!vm.horizontal) {\n\t\t\t\t\t\t// bar\n\t\t\t\t\t\tleft = vm.x - vm.width / 2;\n\t\t\t\t\t\tright = vm.x + vm.width / 2;\n\t\t\t\t\t\ttop = vm.y;\n\t\t\t\t\t\tbottom = vm.base;\n\t\t\t\t\t\tsignX = 1;\n\t\t\t\t\t\tsignY = bottom > top ? 1 : -1;\n\t\t\t\t\t\tborderSkipped = vm.borderSkipped || 'bottom';\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// horizontal bar\n\t\t\t\t\t\tleft = vm.base;\n\t\t\t\t\t\tright = vm.x;\n\t\t\t\t\t\ttop = vm.y - vm.height / 2;\n\t\t\t\t\t\tbottom = vm.y + vm.height / 2;\n\t\t\t\t\t\tsignX = right > left ? 1 : -1;\n\t\t\t\t\t\tsignY = 1;\n\t\t\t\t\t\tborderSkipped = vm.borderSkipped || 'left';\n\t\t\t\t\t}\n\n\t\t\t\t\t// Canvas doesn't allow us to stroke inside the width so we can\n\t\t\t\t\t// adjust the sizes to fit if we're setting a stroke on the line\n\t\t\t\t\tif (borderWidth) {\n\t\t\t\t\t\t// borderWidth shold be less than bar width and bar height.\n\t\t\t\t\t\tvar barSize = Math.min(Math.abs(left - right), Math.abs(top - bottom));\n\t\t\t\t\t\tborderWidth = borderWidth > barSize ? barSize : borderWidth;\n\t\t\t\t\t\tvar halfStroke = borderWidth / 2;\n\t\t\t\t\t\t// Adjust borderWidth when bar top position is near vm.base(zero).\n\t\t\t\t\t\tvar borderLeft = left + (borderSkipped !== 'left' ? halfStroke * signX : 0);\n\t\t\t\t\t\tvar borderRight = right + (borderSkipped !== 'right' ? -halfStroke * signX : 0);\n\t\t\t\t\t\tvar borderTop = top + (borderSkipped !== 'top' ? halfStroke * signY : 0);\n\t\t\t\t\t\tvar borderBottom = bottom + (borderSkipped !== 'bottom' ? -halfStroke * signY : 0);\n\t\t\t\t\t\t// not become a vertical line?\n\t\t\t\t\t\tif (borderLeft !== borderRight) {\n\t\t\t\t\t\t\ttop = borderTop;\n\t\t\t\t\t\t\tbottom = borderBottom;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// not become a horizontal line?\n\t\t\t\t\t\tif (borderTop !== borderBottom) {\n\t\t\t\t\t\t\tleft = borderLeft;\n\t\t\t\t\t\t\tright = borderRight;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.fillStyle = vm.backgroundColor;\n\t\t\t\t\tctx.strokeStyle = vm.borderColor;\n\t\t\t\t\tctx.lineWidth = borderWidth;\n\n\t\t\t\t\t// Corner points, from bottom-left to bottom-right clockwise\n\t\t\t\t\t// | 1 2 |\n\t\t\t\t\t// | 0 3 |\n\t\t\t\t\tvar corners = [[left, bottom], [left, top], [right, top], [right, bottom]];\n\n\t\t\t\t\t// Find first (starting) corner with fallback to 'bottom'\n\t\t\t\t\tvar borders = ['bottom', 'left', 'top', 'right'];\n\t\t\t\t\tvar startCorner = borders.indexOf(borderSkipped, 0);\n\t\t\t\t\tif (startCorner === -1) {\n\t\t\t\t\t\tstartCorner = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tfunction cornerAt(index) {\n\t\t\t\t\t\treturn corners[(startCorner + index) % 4];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Draw rectangle from 'startCorner'\n\t\t\t\t\tvar corner = cornerAt(0);\n\t\t\t\t\tctx.moveTo(corner[0], corner[1]);\n\n\t\t\t\t\tfor (var i = 1; i < 4; i++) {\n\t\t\t\t\t\tcorner = cornerAt(i);\n\t\t\t\t\t\tctx.lineTo(corner[0], corner[1]);\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.fill();\n\t\t\t\t\tif (borderWidth) {\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\theight: function height() {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\treturn vm.base - vm.y;\n\t\t\t\t},\n\n\t\t\t\tinRange: function inRange(mouseX, mouseY) {\n\t\t\t\t\tvar inRange = false;\n\n\t\t\t\t\tif (this._view) {\n\t\t\t\t\t\tvar bounds = getBarBounds(this);\n\t\t\t\t\t\tinRange = mouseX >= bounds.left && mouseX <= bounds.right && mouseY >= bounds.top && mouseY <= bounds.bottom;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn inRange;\n\t\t\t\t},\n\n\t\t\t\tinLabelRange: function inLabelRange(mouseX, mouseY) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tif (!me._view) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar inRange = false;\n\t\t\t\t\tvar bounds = getBarBounds(me);\n\n\t\t\t\t\tif (isVertical(me)) {\n\t\t\t\t\t\tinRange = mouseX >= bounds.left && mouseX <= bounds.right;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tinRange = mouseY >= bounds.top && mouseY <= bounds.bottom;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn inRange;\n\t\t\t\t},\n\n\t\t\t\tinXRange: function inXRange(mouseX) {\n\t\t\t\t\tvar bounds = getBarBounds(this);\n\t\t\t\t\treturn mouseX >= bounds.left && mouseX <= bounds.right;\n\t\t\t\t},\n\n\t\t\t\tinYRange: function inYRange(mouseY) {\n\t\t\t\t\tvar bounds = getBarBounds(this);\n\t\t\t\t\treturn mouseY >= bounds.top && mouseY <= bounds.bottom;\n\t\t\t\t},\n\n\t\t\t\tgetCenterPoint: function getCenterPoint() {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\tvar x, y;\n\t\t\t\t\tif (isVertical(this)) {\n\t\t\t\t\t\tx = vm.x;\n\t\t\t\t\t\ty = (vm.y + vm.base) / 2;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tx = (vm.x + vm.base) / 2;\n\t\t\t\t\t\ty = vm.y;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn { x: x, y: y };\n\t\t\t\t},\n\n\t\t\t\tgetArea: function getArea() {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\treturn vm.width * Math.abs(vm.y - vm.base);\n\t\t\t\t},\n\n\t\t\t\ttooltipPosition: function tooltipPosition() {\n\t\t\t\t\tvar vm = this._view;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tx: vm.x,\n\t\t\t\t\t\ty: vm.y\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t});\n\t\t}, { \"26\": 26, \"27\": 27 }], 41: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = {};\n\t\t\tmodule.exports.Arc = require(37);\n\t\t\tmodule.exports.Line = require(38);\n\t\t\tmodule.exports.Point = require(39);\n\t\t\tmodule.exports.Rectangle = require(40);\n\t\t}, { \"37\": 37, \"38\": 38, \"39\": 39, \"40\": 40 }], 42: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(43);\n\n\t\t\t/**\n * @namespace Chart.helpers.canvas\n */\n\t\t\tvar exports = module.exports = {\n\t\t\t\t/**\n * Clears the entire canvas associated to the given `chart`.\n * @param {Chart} chart - The chart for which to clear the canvas.\n */\n\t\t\t\tclear: function clear(chart) {\n\t\t\t\t\tchart.ctx.clearRect(0, 0, chart.width, chart.height);\n\t\t\t\t},\n\n\t\t\t\t/**\n * Creates a \"path\" for a rectangle with rounded corners at position (x, y) with a\n * given size (width, height) and the same `radius` for all corners.\n * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context.\n * @param {Number} x - The x axis of the coordinate for the rectangle starting point.\n * @param {Number} y - The y axis of the coordinate for the rectangle starting point.\n * @param {Number} width - The rectangle's width.\n * @param {Number} height - The rectangle's height.\n * @param {Number} radius - The rounded amount (in pixels) for the four corners.\n * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object?\n */\n\t\t\t\troundedRect: function roundedRect(ctx, x, y, width, height, radius) {\n\t\t\t\t\tif (radius) {\n\t\t\t\t\t\t// NOTE(SB) `epsilon` helps to prevent minor artifacts appearing\n\t\t\t\t\t\t// on Chrome when `r` is exactly half the height or the width.\n\t\t\t\t\t\tvar epsilon = 0.0000001;\n\t\t\t\t\t\tvar r = Math.min(radius, height / 2 - epsilon, width / 2 - epsilon);\n\n\t\t\t\t\t\tctx.moveTo(x + r, y);\n\t\t\t\t\t\tctx.lineTo(x + width - r, y);\n\t\t\t\t\t\tctx.arcTo(x + width, y, x + width, y + r, r);\n\t\t\t\t\t\tctx.lineTo(x + width, y + height - r);\n\t\t\t\t\t\tctx.arcTo(x + width, y + height, x + width - r, y + height, r);\n\t\t\t\t\t\tctx.lineTo(x + r, y + height);\n\t\t\t\t\t\tctx.arcTo(x, y + height, x, y + height - r, r);\n\t\t\t\t\t\tctx.lineTo(x, y + r);\n\t\t\t\t\t\tctx.arcTo(x, y, x + r, y, r);\n\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t\tctx.moveTo(x, y);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tctx.rect(x, y, width, height);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tdrawPoint: function drawPoint(ctx, style, radius, x, y, rotation) {\n\t\t\t\t\tvar type, edgeLength, xOffset, yOffset, height, size;\n\t\t\t\t\trotation = rotation || 0;\n\n\t\t\t\t\tif (style && (typeof style === \"undefined\" ? \"undefined\" : _typeof(style)) === 'object') {\n\t\t\t\t\t\ttype = style.toString();\n\t\t\t\t\t\tif (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n\t\t\t\t\t\t\tctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isNaN(radius) || radius <= 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.save();\n\t\t\t\t\tctx.translate(x, y);\n\t\t\t\t\tctx.rotate(rotation * Math.PI / 180);\n\t\t\t\t\tctx.beginPath();\n\n\t\t\t\t\tswitch (style) {\n\t\t\t\t\t\t// Default includes circle\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tctx.arc(0, 0, radius, 0, Math.PI * 2);\n\t\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'triangle':\n\t\t\t\t\t\t\tedgeLength = 3 * radius / Math.sqrt(3);\n\t\t\t\t\t\t\theight = edgeLength * Math.sqrt(3) / 2;\n\t\t\t\t\t\t\tctx.moveTo(-edgeLength / 2, height / 3);\n\t\t\t\t\t\t\tctx.lineTo(edgeLength / 2, height / 3);\n\t\t\t\t\t\t\tctx.lineTo(0, -2 * height / 3);\n\t\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'rect':\n\t\t\t\t\t\t\tsize = 1 / Math.SQRT2 * radius;\n\t\t\t\t\t\t\tctx.rect(-size, -size, 2 * size, 2 * size);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'rectRounded':\n\t\t\t\t\t\t\tvar offset = radius / Math.SQRT2;\n\t\t\t\t\t\t\tvar leftX = -offset;\n\t\t\t\t\t\t\tvar topY = -offset;\n\t\t\t\t\t\t\tvar sideSize = Math.SQRT2 * radius;\n\n\t\t\t\t\t\t\t// NOTE(SB) the rounded rect implementation changed to use `arcTo`\n\t\t\t\t\t\t\t// instead of `quadraticCurveTo` since it generates better results\n\t\t\t\t\t\t\t// when rect is almost a circle. 0.425 (instead of 0.5) produces\n\t\t\t\t\t\t\t// results visually closer to the previous impl.\n\t\t\t\t\t\t\tthis.roundedRect(ctx, leftX, topY, sideSize, sideSize, radius * 0.425);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'rectRot':\n\t\t\t\t\t\t\tsize = 1 / Math.SQRT2 * radius;\n\t\t\t\t\t\t\tctx.moveTo(-size, 0);\n\t\t\t\t\t\t\tctx.lineTo(0, size);\n\t\t\t\t\t\t\tctx.lineTo(size, 0);\n\t\t\t\t\t\t\tctx.lineTo(0, -size);\n\t\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'cross':\n\t\t\t\t\t\t\tctx.moveTo(0, radius);\n\t\t\t\t\t\t\tctx.lineTo(0, -radius);\n\t\t\t\t\t\t\tctx.moveTo(-radius, 0);\n\t\t\t\t\t\t\tctx.lineTo(radius, 0);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'crossRot':\n\t\t\t\t\t\t\txOffset = Math.cos(Math.PI / 4) * radius;\n\t\t\t\t\t\t\tyOffset = Math.sin(Math.PI / 4) * radius;\n\t\t\t\t\t\t\tctx.moveTo(-xOffset, -yOffset);\n\t\t\t\t\t\t\tctx.lineTo(xOffset, yOffset);\n\t\t\t\t\t\t\tctx.moveTo(-xOffset, yOffset);\n\t\t\t\t\t\t\tctx.lineTo(xOffset, -yOffset);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'star':\n\t\t\t\t\t\t\tctx.moveTo(0, radius);\n\t\t\t\t\t\t\tctx.lineTo(0, -radius);\n\t\t\t\t\t\t\tctx.moveTo(-radius, 0);\n\t\t\t\t\t\t\tctx.lineTo(radius, 0);\n\t\t\t\t\t\t\txOffset = Math.cos(Math.PI / 4) * radius;\n\t\t\t\t\t\t\tyOffset = Math.sin(Math.PI / 4) * radius;\n\t\t\t\t\t\t\tctx.moveTo(-xOffset, -yOffset);\n\t\t\t\t\t\t\tctx.lineTo(xOffset, yOffset);\n\t\t\t\t\t\t\tctx.moveTo(-xOffset, yOffset);\n\t\t\t\t\t\t\tctx.lineTo(xOffset, -yOffset);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'line':\n\t\t\t\t\t\t\tctx.moveTo(-radius, 0);\n\t\t\t\t\t\t\tctx.lineTo(radius, 0);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'dash':\n\t\t\t\t\t\t\tctx.moveTo(0, 0);\n\t\t\t\t\t\t\tctx.lineTo(radius, 0);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.fill();\n\t\t\t\t\tctx.stroke();\n\t\t\t\t\tctx.restore();\n\t\t\t\t},\n\n\t\t\t\tclipArea: function clipArea(ctx, area) {\n\t\t\t\t\tctx.save();\n\t\t\t\t\tctx.beginPath();\n\t\t\t\t\tctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n\t\t\t\t\tctx.clip();\n\t\t\t\t},\n\n\t\t\t\tunclipArea: function unclipArea(ctx) {\n\t\t\t\t\tctx.restore();\n\t\t\t\t},\n\n\t\t\t\tlineTo: function lineTo(ctx, previous, target, flip) {\n\t\t\t\t\tif (target.steppedLine) {\n\t\t\t\t\t\tif (target.steppedLine === 'after' && !flip || target.steppedLine !== 'after' && flip) {\n\t\t\t\t\t\t\tctx.lineTo(previous.x, target.y);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tctx.lineTo(target.x, previous.y);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tctx.lineTo(target.x, target.y);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!target.tension) {\n\t\t\t\t\t\tctx.lineTo(target.x, target.y);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.bezierCurveTo(flip ? previous.controlPointPreviousX : previous.controlPointNextX, flip ? previous.controlPointPreviousY : previous.controlPointNextY, flip ? target.controlPointNextX : target.controlPointPreviousX, flip ? target.controlPointNextY : target.controlPointPreviousY, target.x, target.y);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// DEPRECATIONS\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.helpers.canvas.clear instead.\n * @namespace Chart.helpers.clear\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n\t\t\thelpers.clear = exports.clear;\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead.\n * @namespace Chart.helpers.drawRoundedRectangle\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n\t\t\thelpers.drawRoundedRectangle = function (ctx) {\n\t\t\t\tctx.beginPath();\n\t\t\t\texports.roundedRect.apply(exports, arguments);\n\t\t\t};\n\t\t}, { \"43\": 43 }], 43: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\t/**\n * @namespace Chart.helpers\n */\n\n\t\t\tvar helpers = {\n\t\t\t\t/**\n * An empty function that can be used, for example, for optional callback.\n */\n\t\t\t\tnoop: function noop() {},\n\n\t\t\t\t/**\n * Returns a unique id, sequentially generated from a global variable.\n * @returns {Number}\n * @function\n */\n\t\t\t\tuid: function () {\n\t\t\t\t\tvar id = 0;\n\t\t\t\t\treturn function () {\n\t\t\t\t\t\treturn id++;\n\t\t\t\t\t};\n\t\t\t\t}(),\n\n\t\t\t\t/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param {*} value - The value to test.\n * @returns {Boolean}\n * @since 2.7.0\n */\n\t\t\t\tisNullOrUndef: function isNullOrUndef(value) {\n\t\t\t\t\treturn value === null || typeof value === 'undefined';\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns true if `value` is an array, else returns false.\n * @param {*} value - The value to test.\n * @returns {Boolean}\n * @function\n */\n\t\t\t\tisArray: Array.isArray ? Array.isArray : function (value) {\n\t\t\t\t\treturn Object.prototype.toString.call(value) === '[object Array]';\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param {*} value - The value to test.\n * @returns {Boolean}\n * @since 2.7.0\n */\n\t\t\t\tisObject: function isObject(value) {\n\t\t\t\t\treturn value !== null && Object.prototype.toString.call(value) === '[object Object]';\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param {*} value - The value to return if defined.\n * @param {*} defaultValue - The value to return if `value` is undefined.\n * @returns {*}\n */\n\t\t\t\tvalueOrDefault: function valueOrDefault(value, defaultValue) {\n\t\t\t\t\treturn typeof value === 'undefined' ? defaultValue : value;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns value at the given `index` in array if defined, else returns `defaultValue`.\n * @param {Array} value - The array to lookup for value at `index`.\n * @param {Number} index - The index in `value` to lookup for value.\n * @param {*} defaultValue - The value to return if `value[index]` is undefined.\n * @returns {*}\n */\n\t\t\t\tvalueAtIndexOrDefault: function valueAtIndexOrDefault(value, index, defaultValue) {\n\t\t\t\t\treturn helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue);\n\t\t\t\t},\n\n\t\t\t\t/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param {Function} fn - The function to call.\n * @param {Array|undefined|null} args - The arguments with which `fn` should be called.\n * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`.\n * @returns {*}\n */\n\t\t\t\tcallback: function callback(fn, args, thisArg) {\n\t\t\t\t\tif (fn && typeof fn.call === 'function') {\n\t\t\t\t\t\treturn fn.apply(thisArg, args);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param {Object|Array} loopable - The object or array to be iterated.\n * @param {Function} fn - The function to call for each item.\n * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`.\n * @param {Boolean} [reverse] - If true, iterates backward on the loopable.\n */\n\t\t\t\teach: function each(loopable, fn, thisArg, reverse) {\n\t\t\t\t\tvar i, len, keys;\n\t\t\t\t\tif (helpers.isArray(loopable)) {\n\t\t\t\t\t\tlen = loopable.length;\n\t\t\t\t\t\tif (reverse) {\n\t\t\t\t\t\t\tfor (i = len - 1; i >= 0; i--) {\n\t\t\t\t\t\t\t\tfn.call(thisArg, loopable[i], i);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\t\t\t\t\tfn.call(thisArg, loopable[i], i);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (helpers.isObject(loopable)) {\n\t\t\t\t\t\tkeys = Object.keys(loopable);\n\t\t\t\t\t\tlen = keys.length;\n\t\t\t\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\t\t\t\tfn.call(thisArg, loopable[keys[i]], keys[i]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @see http://stackoverflow.com/a/14853974\n * @param {Array} a0 - The array to compare\n * @param {Array} a1 - The array to compare\n * @returns {Boolean}\n */\n\t\t\t\tarrayEquals: function arrayEquals(a0, a1) {\n\t\t\t\t\tvar i, ilen, v0, v1;\n\n\t\t\t\t\tif (!a0 || !a1 || a0.length !== a1.length) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (i = 0, ilen = a0.length; i < ilen; ++i) {\n\t\t\t\t\t\tv0 = a0[i];\n\t\t\t\t\t\tv1 = a1[i];\n\n\t\t\t\t\t\tif (v0 instanceof Array && v1 instanceof Array) {\n\t\t\t\t\t\t\tif (!helpers.arrayEquals(v0, v1)) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (v0 !== v1) {\n\t\t\t\t\t\t\t// NOTE: two different object instances will never be equal: {x:20} != {x:20}\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param {*} source - The value to clone.\n * @returns {*}\n */\n\t\t\t\tclone: function clone(source) {\n\t\t\t\t\tif (helpers.isArray(source)) {\n\t\t\t\t\t\treturn source.map(helpers.clone);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (helpers.isObject(source)) {\n\t\t\t\t\t\tvar target = {};\n\t\t\t\t\t\tvar keys = Object.keys(source);\n\t\t\t\t\t\tvar klen = keys.length;\n\t\t\t\t\t\tvar k = 0;\n\n\t\t\t\t\t\tfor (; k < klen; ++k) {\n\t\t\t\t\t\t\ttarget[keys[k]] = helpers.clone(source[keys[k]]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn target;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn source;\n\t\t\t\t},\n\n\t\t\t\t/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): this method is also used by configMerge and scaleMerge as fallback.\n * @private\n */\n\t\t\t\t_merger: function _merger(key, target, source, options) {\n\t\t\t\t\tvar tval = target[key];\n\t\t\t\t\tvar sval = source[key];\n\n\t\t\t\t\tif (helpers.isObject(tval) && helpers.isObject(sval)) {\n\t\t\t\t\t\thelpers.merge(tval, sval, options);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttarget[key] = helpers.clone(sval);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\n\t\t\t\t_mergerIf: function _mergerIf(key, target, source) {\n\t\t\t\t\tvar tval = target[key];\n\t\t\t\t\tvar sval = source[key];\n\n\t\t\t\t\tif (helpers.isObject(tval) && helpers.isObject(sval)) {\n\t\t\t\t\t\thelpers.mergeIf(tval, sval);\n\t\t\t\t\t} else if (!target.hasOwnProperty(key)) {\n\t\t\t\t\t\ttarget[key] = helpers.clone(sval);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param {Object} target - The target object in which all sources are merged into.\n * @param {Object|Array(Object)} source - Object(s) to merge into `target`.\n * @param {Object} [options] - Merging options:\n * @param {Function} [options.merger] - The merge method (key, target, source, options)\n * @returns {Object} The `target` object.\n */\n\t\t\t\tmerge: function merge(target, source, options) {\n\t\t\t\t\tvar sources = helpers.isArray(source) ? source : [source];\n\t\t\t\t\tvar ilen = sources.length;\n\t\t\t\t\tvar merge, i, keys, klen, k;\n\n\t\t\t\t\tif (!helpers.isObject(target)) {\n\t\t\t\t\t\treturn target;\n\t\t\t\t\t}\n\n\t\t\t\t\toptions = options || {};\n\t\t\t\t\tmerge = options.merger || helpers._merger;\n\n\t\t\t\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\t\t\t\tsource = sources[i];\n\t\t\t\t\t\tif (!helpers.isObject(source)) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tkeys = Object.keys(source);\n\t\t\t\t\t\tfor (k = 0, klen = keys.length; k < klen; ++k) {\n\t\t\t\t\t\t\tmerge(keys[k], target, source, options);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn target;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param {Object} target - The target object in which all sources are merged into.\n * @param {Object|Array(Object)} source - Object(s) to merge into `target`.\n * @returns {Object} The `target` object.\n */\n\t\t\t\tmergeIf: function mergeIf(target, source) {\n\t\t\t\t\treturn helpers.merge(target, source, { merger: helpers._mergerIf });\n\t\t\t\t},\n\n\t\t\t\t/**\n * Applies the contents of two or more objects together into the first object.\n * @param {Object} target - The target object in which all objects are merged into.\n * @param {Object} arg1 - Object containing additional properties to merge in target.\n * @param {Object} argN - Additional objects containing properties to merge in target.\n * @returns {Object} The `target` object.\n */\n\t\t\t\textend: function extend(target) {\n\t\t\t\t\tvar setFn = function setFn(value, key) {\n\t\t\t\t\t\ttarget[key] = value;\n\t\t\t\t\t};\n\t\t\t\t\tfor (var i = 1, ilen = arguments.length; i < ilen; ++i) {\n\t\t\t\t\t\thelpers.each(arguments[i], setFn);\n\t\t\t\t\t}\n\t\t\t\t\treturn target;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Basic javascript inheritance based on the model created in Backbone.js\n */\n\t\t\t\tinherits: function inherits(extensions) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar ChartElement = extensions && extensions.hasOwnProperty('constructor') ? extensions.constructor : function () {\n\t\t\t\t\t\treturn me.apply(this, arguments);\n\t\t\t\t\t};\n\n\t\t\t\t\tvar Surrogate = function Surrogate() {\n\t\t\t\t\t\tthis.constructor = ChartElement;\n\t\t\t\t\t};\n\n\t\t\t\t\tSurrogate.prototype = me.prototype;\n\t\t\t\t\tChartElement.prototype = new Surrogate();\n\t\t\t\t\tChartElement.extend = helpers.inherits;\n\n\t\t\t\t\tif (extensions) {\n\t\t\t\t\t\thelpers.extend(ChartElement.prototype, extensions);\n\t\t\t\t\t}\n\n\t\t\t\t\tChartElement.__super__ = me.prototype;\n\t\t\t\t\treturn ChartElement;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tmodule.exports = helpers;\n\n\t\t\t// DEPRECATIONS\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.helpers.callback instead.\n * @function Chart.helpers.callCallback\n * @deprecated since version 2.6.0\n * @todo remove at version 3\n * @private\n */\n\t\t\thelpers.callCallback = helpers.callback;\n\n\t\t\t/**\n * Provided for backward compatibility, use Array.prototype.indexOf instead.\n * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+\n * @function Chart.helpers.indexOf\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n\t\t\thelpers.indexOf = function (array, item, fromIndex) {\n\t\t\t\treturn Array.prototype.indexOf.call(array, item, fromIndex);\n\t\t\t};\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead.\n * @function Chart.helpers.getValueOrDefault\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n\t\t\thelpers.getValueOrDefault = helpers.valueOrDefault;\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead.\n * @function Chart.helpers.getValueAtIndexOrDefault\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n\t\t\thelpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\t\t}, {}], 44: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(43);\n\n\t\t\t/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easingEffects\n * @see http://www.robertpenner.com/easing/\n */\n\t\t\tvar effects = {\n\t\t\t\tlinear: function linear(t) {\n\t\t\t\t\treturn t;\n\t\t\t\t},\n\n\t\t\t\teaseInQuad: function easeInQuad(t) {\n\t\t\t\t\treturn t * t;\n\t\t\t\t},\n\n\t\t\t\teaseOutQuad: function easeOutQuad(t) {\n\t\t\t\t\treturn -t * (t - 2);\n\t\t\t\t},\n\n\t\t\t\teaseInOutQuad: function easeInOutQuad(t) {\n\t\t\t\t\tif ((t /= 0.5) < 1) {\n\t\t\t\t\t\treturn 0.5 * t * t;\n\t\t\t\t\t}\n\t\t\t\t\treturn -0.5 * (--t * (t - 2) - 1);\n\t\t\t\t},\n\n\t\t\t\teaseInCubic: function easeInCubic(t) {\n\t\t\t\t\treturn t * t * t;\n\t\t\t\t},\n\n\t\t\t\teaseOutCubic: function easeOutCubic(t) {\n\t\t\t\t\treturn (t = t - 1) * t * t + 1;\n\t\t\t\t},\n\n\t\t\t\teaseInOutCubic: function easeInOutCubic(t) {\n\t\t\t\t\tif ((t /= 0.5) < 1) {\n\t\t\t\t\t\treturn 0.5 * t * t * t;\n\t\t\t\t\t}\n\t\t\t\t\treturn 0.5 * ((t -= 2) * t * t + 2);\n\t\t\t\t},\n\n\t\t\t\teaseInQuart: function easeInQuart(t) {\n\t\t\t\t\treturn t * t * t * t;\n\t\t\t\t},\n\n\t\t\t\teaseOutQuart: function easeOutQuart(t) {\n\t\t\t\t\treturn -((t = t - 1) * t * t * t - 1);\n\t\t\t\t},\n\n\t\t\t\teaseInOutQuart: function easeInOutQuart(t) {\n\t\t\t\t\tif ((t /= 0.5) < 1) {\n\t\t\t\t\t\treturn 0.5 * t * t * t * t;\n\t\t\t\t\t}\n\t\t\t\t\treturn -0.5 * ((t -= 2) * t * t * t - 2);\n\t\t\t\t},\n\n\t\t\t\teaseInQuint: function easeInQuint(t) {\n\t\t\t\t\treturn t * t * t * t * t;\n\t\t\t\t},\n\n\t\t\t\teaseOutQuint: function easeOutQuint(t) {\n\t\t\t\t\treturn (t = t - 1) * t * t * t * t + 1;\n\t\t\t\t},\n\n\t\t\t\teaseInOutQuint: function easeInOutQuint(t) {\n\t\t\t\t\tif ((t /= 0.5) < 1) {\n\t\t\t\t\t\treturn 0.5 * t * t * t * t * t;\n\t\t\t\t\t}\n\t\t\t\t\treturn 0.5 * ((t -= 2) * t * t * t * t + 2);\n\t\t\t\t},\n\n\t\t\t\teaseInSine: function easeInSine(t) {\n\t\t\t\t\treturn -Math.cos(t * (Math.PI / 2)) + 1;\n\t\t\t\t},\n\n\t\t\t\teaseOutSine: function easeOutSine(t) {\n\t\t\t\t\treturn Math.sin(t * (Math.PI / 2));\n\t\t\t\t},\n\n\t\t\t\teaseInOutSine: function easeInOutSine(t) {\n\t\t\t\t\treturn -0.5 * (Math.cos(Math.PI * t) - 1);\n\t\t\t\t},\n\n\t\t\t\teaseInExpo: function easeInExpo(t) {\n\t\t\t\t\treturn t === 0 ? 0 : Math.pow(2, 10 * (t - 1));\n\t\t\t\t},\n\n\t\t\t\teaseOutExpo: function easeOutExpo(t) {\n\t\t\t\t\treturn t === 1 ? 1 : -Math.pow(2, -10 * t) + 1;\n\t\t\t\t},\n\n\t\t\t\teaseInOutExpo: function easeInOutExpo(t) {\n\t\t\t\t\tif (t === 0) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\tif (t === 1) {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t\tif ((t /= 0.5) < 1) {\n\t\t\t\t\t\treturn 0.5 * Math.pow(2, 10 * (t - 1));\n\t\t\t\t\t}\n\t\t\t\t\treturn 0.5 * (-Math.pow(2, -10 * --t) + 2);\n\t\t\t\t},\n\n\t\t\t\teaseInCirc: function easeInCirc(t) {\n\t\t\t\t\tif (t >= 1) {\n\t\t\t\t\t\treturn t;\n\t\t\t\t\t}\n\t\t\t\t\treturn -(Math.sqrt(1 - t * t) - 1);\n\t\t\t\t},\n\n\t\t\t\teaseOutCirc: function easeOutCirc(t) {\n\t\t\t\t\treturn Math.sqrt(1 - (t = t - 1) * t);\n\t\t\t\t},\n\n\t\t\t\teaseInOutCirc: function easeInOutCirc(t) {\n\t\t\t\t\tif ((t /= 0.5) < 1) {\n\t\t\t\t\t\treturn -0.5 * (Math.sqrt(1 - t * t) - 1);\n\t\t\t\t\t}\n\t\t\t\t\treturn 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);\n\t\t\t\t},\n\n\t\t\t\teaseInElastic: function easeInElastic(t) {\n\t\t\t\t\tvar s = 1.70158;\n\t\t\t\t\tvar p = 0;\n\t\t\t\t\tvar a = 1;\n\t\t\t\t\tif (t === 0) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\tif (t === 1) {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t\tif (!p) {\n\t\t\t\t\t\tp = 0.3;\n\t\t\t\t\t}\n\t\t\t\t\tif (a < 1) {\n\t\t\t\t\t\ta = 1;\n\t\t\t\t\t\ts = p / 4;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t\t\t\t}\n\t\t\t\t\treturn -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n\t\t\t\t},\n\n\t\t\t\teaseOutElastic: function easeOutElastic(t) {\n\t\t\t\t\tvar s = 1.70158;\n\t\t\t\t\tvar p = 0;\n\t\t\t\t\tvar a = 1;\n\t\t\t\t\tif (t === 0) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\tif (t === 1) {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t\tif (!p) {\n\t\t\t\t\t\tp = 0.3;\n\t\t\t\t\t}\n\t\t\t\t\tif (a < 1) {\n\t\t\t\t\t\ta = 1;\n\t\t\t\t\t\ts = p / 4;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t\t\t\t}\n\t\t\t\t\treturn a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1;\n\t\t\t\t},\n\n\t\t\t\teaseInOutElastic: function easeInOutElastic(t) {\n\t\t\t\t\tvar s = 1.70158;\n\t\t\t\t\tvar p = 0;\n\t\t\t\t\tvar a = 1;\n\t\t\t\t\tif (t === 0) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\t\t\t\t\tif ((t /= 0.5) === 2) {\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}\n\t\t\t\t\tif (!p) {\n\t\t\t\t\t\tp = 0.45;\n\t\t\t\t\t}\n\t\t\t\t\tif (a < 1) {\n\t\t\t\t\t\ta = 1;\n\t\t\t\t\t\ts = p / 4;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t\t\t\t}\n\t\t\t\t\tif (t < 1) {\n\t\t\t\t\t\treturn -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\n\t\t\t\t\t}\n\t\t\t\t\treturn a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1;\n\t\t\t\t},\n\t\t\t\teaseInBack: function easeInBack(t) {\n\t\t\t\t\tvar s = 1.70158;\n\t\t\t\t\treturn t * t * ((s + 1) * t - s);\n\t\t\t\t},\n\n\t\t\t\teaseOutBack: function easeOutBack(t) {\n\t\t\t\t\tvar s = 1.70158;\n\t\t\t\t\treturn (t = t - 1) * t * ((s + 1) * t + s) + 1;\n\t\t\t\t},\n\n\t\t\t\teaseInOutBack: function easeInOutBack(t) {\n\t\t\t\t\tvar s = 1.70158;\n\t\t\t\t\tif ((t /= 0.5) < 1) {\n\t\t\t\t\t\treturn 0.5 * (t * t * (((s *= 1.525) + 1) * t - s));\n\t\t\t\t\t}\n\t\t\t\t\treturn 0.5 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2);\n\t\t\t\t},\n\n\t\t\t\teaseInBounce: function easeInBounce(t) {\n\t\t\t\t\treturn 1 - effects.easeOutBounce(1 - t);\n\t\t\t\t},\n\n\t\t\t\teaseOutBounce: function easeOutBounce(t) {\n\t\t\t\t\tif (t < 1 / 2.75) {\n\t\t\t\t\t\treturn 7.5625 * t * t;\n\t\t\t\t\t}\n\t\t\t\t\tif (t < 2 / 2.75) {\n\t\t\t\t\t\treturn 7.5625 * (t -= 1.5 / 2.75) * t + 0.75;\n\t\t\t\t\t}\n\t\t\t\t\tif (t < 2.5 / 2.75) {\n\t\t\t\t\t\treturn 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375;\n\t\t\t\t\t}\n\t\t\t\t\treturn 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375;\n\t\t\t\t},\n\n\t\t\t\teaseInOutBounce: function easeInOutBounce(t) {\n\t\t\t\t\tif (t < 0.5) {\n\t\t\t\t\t\treturn effects.easeInBounce(t * 2) * 0.5;\n\t\t\t\t\t}\n\t\t\t\t\treturn effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tmodule.exports = {\n\t\t\t\teffects: effects\n\t\t\t};\n\n\t\t\t// DEPRECATIONS\n\n\t\t\t/**\n * Provided for backward compatibility, use Chart.helpers.easing.effects instead.\n * @function Chart.helpers.easingEffects\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n\t\t\thelpers.easingEffects = effects;\n\t\t}, { \"43\": 43 }], 45: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(43);\n\n\t\t\t/**\n * @alias Chart.helpers.options\n * @namespace\n */\n\t\t\tmodule.exports = {\n\t\t\t\t/**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param {Number|String} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param {Number} size - The font size (in pixels) used to resolve relative `value`.\n * @returns {Number} The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\n\t\t\t\ttoLineHeight: function toLineHeight(value, size) {\n\t\t\t\t\tvar matches = ('' + value).match(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);\n\t\t\t\t\tif (!matches || matches[1] === 'normal') {\n\t\t\t\t\t\treturn size * 1.2;\n\t\t\t\t\t}\n\n\t\t\t\t\tvalue = +matches[2];\n\n\t\t\t\t\tswitch (matches[3]) {\n\t\t\t\t\t\tcase 'px':\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\tcase '%':\n\t\t\t\t\t\t\tvalue /= 100;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn size * value;\n\t\t\t\t},\n\n\t\t\t\t/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param {Number|Object} value - If a number, set the value to all TRBL component,\n * else, if and object, use defined properties and sets undefined ones to 0.\n * @returns {Object} The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\n\t\t\t\ttoPadding: function toPadding(value) {\n\t\t\t\t\tvar t, r, b, l;\n\n\t\t\t\t\tif (helpers.isObject(value)) {\n\t\t\t\t\t\tt = +value.top || 0;\n\t\t\t\t\t\tr = +value.right || 0;\n\t\t\t\t\t\tb = +value.bottom || 0;\n\t\t\t\t\t\tl = +value.left || 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tt = r = b = l = +value || 0;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttop: t,\n\t\t\t\t\t\tright: r,\n\t\t\t\t\t\tbottom: b,\n\t\t\t\t\t\tleft: l,\n\t\t\t\t\t\theight: t + b,\n\t\t\t\t\t\twidth: l + r\n\t\t\t\t\t};\n\t\t\t\t},\n\n\t\t\t\t/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param {Array[]} inputs - An array of values, falling back to the last value.\n * @param {Object} [context] - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param {Number} [index] - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @since 2.7.0\n */\n\t\t\t\tresolve: function resolve(inputs, context, index) {\n\t\t\t\t\tvar i, ilen, value;\n\n\t\t\t\t\tfor (i = 0, ilen = inputs.length; i < ilen; ++i) {\n\t\t\t\t\t\tvalue = inputs[i];\n\t\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (context !== undefined && typeof value === 'function') {\n\t\t\t\t\t\t\tvalue = value(context);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (index !== undefined && helpers.isArray(value)) {\n\t\t\t\t\t\t\tvalue = value[index];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (value !== undefined) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}, { \"43\": 43 }], 46: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = require(43);\n\t\t\tmodule.exports.easing = require(44);\n\t\t\tmodule.exports.canvas = require(42);\n\t\t\tmodule.exports.options = require(45);\n\t\t}, { \"42\": 42, \"43\": 43, \"44\": 44, \"45\": 45 }], 47: [function (require, module, exports) {\n\t\t\t/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\n\t\t\tmodule.exports = {\n\t\t\t\tacquireContext: function acquireContext(item) {\n\t\t\t\t\tif (item && item.canvas) {\n\t\t\t\t\t\t// Support for any object associated to a canvas (including a context2d)\n\t\t\t\t\t\titem = item.canvas;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn item && item.getContext('2d') || null;\n\t\t\t\t}\n\t\t\t};\n\t\t}, {}], 48: [function (require, module, exports) {\n\t\t\t/**\n * Chart.Platform implementation for targeting a web browser\n */\n\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(46);\n\n\t\t\tvar EXPANDO_KEY = '$chartjs';\n\t\t\tvar CSS_PREFIX = 'chartjs-';\n\t\t\tvar CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor';\n\t\t\tvar CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation';\n\t\t\tvar ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart'];\n\n\t\t\t/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\n\t\t\tvar EVENT_TYPES = {\n\t\t\t\ttouchstart: 'mousedown',\n\t\t\t\ttouchmove: 'mousemove',\n\t\t\t\ttouchend: 'mouseup',\n\t\t\t\tpointerenter: 'mouseenter',\n\t\t\t\tpointerdown: 'mousedown',\n\t\t\t\tpointermove: 'mousemove',\n\t\t\t\tpointerup: 'mouseup',\n\t\t\t\tpointerleave: 'mouseout',\n\t\t\t\tpointerout: 'mouseout'\n\t\t\t};\n\n\t\t\t/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns {Number} Size in pixels or undefined if unknown.\n */\n\t\t\tfunction readUsedSize(element, property) {\n\t\t\t\tvar value = helpers.getStyle(element, property);\n\t\t\t\tvar matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n\t\t\t\treturn matches ? Number(matches[1]) : undefined;\n\t\t\t}\n\n\t\t\t/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n */\n\t\t\tfunction initCanvas(canvas, config) {\n\t\t\t\tvar style = canvas.style;\n\n\t\t\t\t// NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n\t\t\t\t// returns null or '' if no explicit value has been set to the canvas attribute.\n\t\t\t\tvar renderHeight = canvas.getAttribute('height');\n\t\t\t\tvar renderWidth = canvas.getAttribute('width');\n\n\t\t\t\t// Chart.js modifies some canvas values that we want to restore on destroy\n\t\t\t\tcanvas[EXPANDO_KEY] = {\n\t\t\t\t\tinitial: {\n\t\t\t\t\t\theight: renderHeight,\n\t\t\t\t\t\twidth: renderWidth,\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\tdisplay: style.display,\n\t\t\t\t\t\t\theight: style.height,\n\t\t\t\t\t\t\twidth: style.width\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Force canvas to display as block to avoid extra space caused by inline\n\t\t\t\t// elements, which would interfere with the responsive resize process.\n\t\t\t\t// https://github.com/chartjs/Chart.js/issues/2538\n\t\t\t\tstyle.display = style.display || 'block';\n\n\t\t\t\tif (renderWidth === null || renderWidth === '') {\n\t\t\t\t\tvar displayWidth = readUsedSize(canvas, 'width');\n\t\t\t\t\tif (displayWidth !== undefined) {\n\t\t\t\t\t\tcanvas.width = displayWidth;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (renderHeight === null || renderHeight === '') {\n\t\t\t\t\tif (canvas.style.height === '') {\n\t\t\t\t\t\t// If no explicit render height and style height, let's apply the aspect ratio,\n\t\t\t\t\t\t// which one can be specified by the user but also by charts as default option\n\t\t\t\t\t\t// (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n\t\t\t\t\t\tcanvas.height = canvas.width / (config.options.aspectRatio || 2);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar displayHeight = readUsedSize(canvas, 'height');\n\t\t\t\t\t\tif (displayWidth !== undefined) {\n\t\t\t\t\t\t\tcanvas.height = displayHeight;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn canvas;\n\t\t\t}\n\n\t\t\t/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\n\t\t\tvar supportsEventListenerOptions = function () {\n\t\t\t\tvar supports = false;\n\t\t\t\ttry {\n\t\t\t\t\tvar options = Object.defineProperty({}, 'passive', {\n\t\t\t\t\t\tget: function get() {\n\t\t\t\t\t\t\tsupports = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\twindow.addEventListener('e', null, options);\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// continue regardless of error\n\t\t\t\t}\n\t\t\t\treturn supports;\n\t\t\t}();\n\n\t\t\t// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n\t\t\t// https://github.com/chartjs/Chart.js/issues/4287\n\t\t\tvar eventListenerOptions = supportsEventListenerOptions ? { passive: true } : false;\n\n\t\t\tfunction _addEventListener(node, type, listener) {\n\t\t\t\tnode.addEventListener(type, listener, eventListenerOptions);\n\t\t\t}\n\n\t\t\tfunction _removeEventListener(node, type, listener) {\n\t\t\t\tnode.removeEventListener(type, listener, eventListenerOptions);\n\t\t\t}\n\n\t\t\tfunction createEvent(type, chart, x, y, nativeEvent) {\n\t\t\t\treturn {\n\t\t\t\t\ttype: type,\n\t\t\t\t\tchart: chart,\n\t\t\t\t\tnative: nativeEvent || null,\n\t\t\t\t\tx: x !== undefined ? x : null,\n\t\t\t\t\ty: y !== undefined ? y : null\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tfunction fromNativeEvent(event, chart) {\n\t\t\t\tvar type = EVENT_TYPES[event.type] || event.type;\n\t\t\t\tvar pos = helpers.getRelativePosition(event, chart);\n\t\t\t\treturn createEvent(type, chart, pos.x, pos.y, event);\n\t\t\t}\n\n\t\t\tfunction throttled(fn, thisArg) {\n\t\t\t\tvar ticking = false;\n\t\t\t\tvar args = [];\n\n\t\t\t\treturn function () {\n\t\t\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t\t\t\tthisArg = thisArg || this;\n\n\t\t\t\t\tif (!ticking) {\n\t\t\t\t\t\tticking = true;\n\t\t\t\t\t\thelpers.requestAnimFrame.call(window, function () {\n\t\t\t\t\t\t\tticking = false;\n\t\t\t\t\t\t\tfn.apply(thisArg, args);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Implementation based on https://github.com/marcj/css-element-queries\n\t\t\tfunction createResizer(handler) {\n\t\t\t\tvar resizer = document.createElement('div');\n\t\t\t\tvar cls = CSS_PREFIX + 'size-monitor';\n\t\t\t\tvar maxSize = 1000000;\n\t\t\t\tvar style = 'position:absolute;' + 'left:0;' + 'top:0;' + 'right:0;' + 'bottom:0;' + 'overflow:hidden;' + 'pointer-events:none;' + 'visibility:hidden;' + 'z-index:-1;';\n\n\t\t\t\tresizer.style.cssText = style;\n\t\t\t\tresizer.className = cls;\n\t\t\t\tresizer.innerHTML = '<div class=\"' + cls + '-expand\" style=\"' + style + '\">' + '<div style=\"' + 'position:absolute;' + 'width:' + maxSize + 'px;' + 'height:' + maxSize + 'px;' + 'left:0;' + 'top:0\">' + '</div>' + '</div>' + '<div class=\"' + cls + '-shrink\" style=\"' + style + '\">' + '<div style=\"' + 'position:absolute;' + 'width:200%;' + 'height:200%;' + 'left:0; ' + 'top:0\">' + '</div>' + '</div>';\n\n\t\t\t\tvar expand = resizer.childNodes[0];\n\t\t\t\tvar shrink = resizer.childNodes[1];\n\n\t\t\t\tresizer._reset = function () {\n\t\t\t\t\texpand.scrollLeft = maxSize;\n\t\t\t\t\texpand.scrollTop = maxSize;\n\t\t\t\t\tshrink.scrollLeft = maxSize;\n\t\t\t\t\tshrink.scrollTop = maxSize;\n\t\t\t\t};\n\t\t\t\tvar onScroll = function onScroll() {\n\t\t\t\t\tresizer._reset();\n\t\t\t\t\thandler();\n\t\t\t\t};\n\n\t\t\t\t_addEventListener(expand, 'scroll', onScroll.bind(expand, 'expand'));\n\t\t\t\t_addEventListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink'));\n\n\t\t\t\treturn resizer;\n\t\t\t}\n\n\t\t\t// https://davidwalsh.name/detect-node-insertion\n\t\t\tfunction watchForRender(node, handler) {\n\t\t\t\tvar expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n\t\t\t\tvar proxy = expando.renderProxy = function (e) {\n\t\t\t\t\tif (e.animationName === CSS_RENDER_ANIMATION) {\n\t\t\t\t\t\thandler();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\thelpers.each(ANIMATION_START_EVENTS, function (type) {\n\t\t\t\t\t_addEventListener(node, type, proxy);\n\t\t\t\t});\n\n\t\t\t\t// #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class\n\t\t\t\t// is removed then added back immediately (same animation frame?). Accessing the\n\t\t\t\t// `offsetParent` property will force a reflow and re-evaluate the CSS animation.\n\t\t\t\t// https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics\n\t\t\t\t// https://github.com/chartjs/Chart.js/issues/4737\n\t\t\t\texpando.reflow = !!node.offsetParent;\n\n\t\t\t\tnode.classList.add(CSS_RENDER_MONITOR);\n\t\t\t}\n\n\t\t\tfunction unwatchForRender(node) {\n\t\t\t\tvar expando = node[EXPANDO_KEY] || {};\n\t\t\t\tvar proxy = expando.renderProxy;\n\n\t\t\t\tif (proxy) {\n\t\t\t\t\thelpers.each(ANIMATION_START_EVENTS, function (type) {\n\t\t\t\t\t\t_removeEventListener(node, type, proxy);\n\t\t\t\t\t});\n\n\t\t\t\t\tdelete expando.renderProxy;\n\t\t\t\t}\n\n\t\t\t\tnode.classList.remove(CSS_RENDER_MONITOR);\n\t\t\t}\n\n\t\t\tfunction addResizeListener(node, listener, chart) {\n\t\t\t\tvar expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\n\n\t\t\t\t// Let's keep track of this added resizer and thus avoid DOM query when removing it.\n\t\t\t\tvar resizer = expando.resizer = createResizer(throttled(function () {\n\t\t\t\t\tif (expando.resizer) {\n\t\t\t\t\t\treturn listener(createEvent('resize', chart));\n\t\t\t\t\t}\n\t\t\t\t}));\n\n\t\t\t\t// The resizer needs to be attached to the node parent, so we first need to be\n\t\t\t\t// sure that `node` is attached to the DOM before injecting the resizer element.\n\t\t\t\twatchForRender(node, function () {\n\t\t\t\t\tif (expando.resizer) {\n\t\t\t\t\t\tvar container = node.parentNode;\n\t\t\t\t\t\tif (container && container !== resizer.parentNode) {\n\t\t\t\t\t\t\tcontainer.insertBefore(resizer, container.firstChild);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// The container size might have changed, let's reset the resizer state.\n\t\t\t\t\t\tresizer._reset();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfunction removeResizeListener(node) {\n\t\t\t\tvar expando = node[EXPANDO_KEY] || {};\n\t\t\t\tvar resizer = expando.resizer;\n\n\t\t\t\tdelete expando.resizer;\n\t\t\t\tunwatchForRender(node);\n\n\t\t\t\tif (resizer && resizer.parentNode) {\n\t\t\t\t\tresizer.parentNode.removeChild(resizer);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction injectCSS(platform, css) {\n\t\t\t\t// http://stackoverflow.com/q/3922139\n\t\t\t\tvar style = platform._style || document.createElement('style');\n\t\t\t\tif (!platform._style) {\n\t\t\t\t\tplatform._style = style;\n\t\t\t\t\tcss = '/* Chart.js */\\n' + css;\n\t\t\t\t\tstyle.setAttribute('type', 'text/css');\n\t\t\t\t\tdocument.getElementsByTagName('head')[0].appendChild(style);\n\t\t\t\t}\n\n\t\t\t\tstyle.appendChild(document.createTextNode(css));\n\t\t\t}\n\n\t\t\tmodule.exports = {\n\t\t\t\t/**\n * This property holds whether this platform is enabled for the current environment.\n * Currently used by platform.js to select the proper implementation.\n * @private\n */\n\t\t\t\t_enabled: typeof window !== 'undefined' && typeof document !== 'undefined',\n\n\t\t\t\tinitialize: function initialize() {\n\t\t\t\t\tvar keyframes = 'from{opacity:0.99}to{opacity:1}';\n\n\t\t\t\t\tinjectCSS(this,\n\t\t\t\t\t// DOM rendering detection\n\t\t\t\t\t// https://davidwalsh.name/detect-node-insertion\n\t\t\t\t\t'@-webkit-keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' + '@keyframes ' + CSS_RENDER_ANIMATION + '{' + keyframes + '}' + '.' + CSS_RENDER_MONITOR + '{' + '-webkit-animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' + 'animation:' + CSS_RENDER_ANIMATION + ' 0.001s;' + '}');\n\t\t\t\t},\n\n\t\t\t\tacquireContext: function acquireContext(item, config) {\n\t\t\t\t\tif (typeof item === 'string') {\n\t\t\t\t\t\titem = document.getElementById(item);\n\t\t\t\t\t} else if (item.length) {\n\t\t\t\t\t\t// Support for array based queries (such as jQuery)\n\t\t\t\t\t\titem = item[0];\n\t\t\t\t\t}\n\n\t\t\t\t\tif (item && item.canvas) {\n\t\t\t\t\t\t// Support for any object associated to a canvas (including a context2d)\n\t\t\t\t\t\titem = item.canvas;\n\t\t\t\t\t}\n\n\t\t\t\t\t// To prevent canvas fingerprinting, some add-ons undefine the getContext\n\t\t\t\t\t// method, for example: https://github.com/kkapsner/CanvasBlocker\n\t\t\t\t\t// https://github.com/chartjs/Chart.js/issues/2807\n\t\t\t\t\tvar context = item && item.getContext && item.getContext('2d');\n\n\t\t\t\t\t// `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is\n\t\t\t\t\t// inside an iframe or when running in a protected environment. We could guess the\n\t\t\t\t\t// types from their toString() value but let's keep things flexible and assume it's\n\t\t\t\t\t// a sufficient condition if the item has a context2D which has item as `canvas`.\n\t\t\t\t\t// https://github.com/chartjs/Chart.js/issues/3887\n\t\t\t\t\t// https://github.com/chartjs/Chart.js/issues/4102\n\t\t\t\t\t// https://github.com/chartjs/Chart.js/issues/4152\n\t\t\t\t\tif (context && context.canvas === item) {\n\t\t\t\t\t\tinitCanvas(item, config);\n\t\t\t\t\t\treturn context;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn null;\n\t\t\t\t},\n\n\t\t\t\treleaseContext: function releaseContext(context) {\n\t\t\t\t\tvar canvas = context.canvas;\n\t\t\t\t\tif (!canvas[EXPANDO_KEY]) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar initial = canvas[EXPANDO_KEY].initial;\n\t\t\t\t\t['height', 'width'].forEach(function (prop) {\n\t\t\t\t\t\tvar value = initial[prop];\n\t\t\t\t\t\tif (helpers.isNullOrUndef(value)) {\n\t\t\t\t\t\t\tcanvas.removeAttribute(prop);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcanvas.setAttribute(prop, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\thelpers.each(initial.style || {}, function (value, key) {\n\t\t\t\t\t\tcanvas.style[key] = value;\n\t\t\t\t\t});\n\n\t\t\t\t\t// The canvas render size might have been changed (and thus the state stack discarded),\n\t\t\t\t\t// we can't use save() and restore() to restore the initial state. So make sure that at\n\t\t\t\t\t// least the canvas context is reset to the default state by setting the canvas width.\n\t\t\t\t\t// https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n\t\t\t\t\tcanvas.width = canvas.width;\n\n\t\t\t\t\tdelete canvas[EXPANDO_KEY];\n\t\t\t\t},\n\n\t\t\t\taddEventListener: function addEventListener(chart, type, listener) {\n\t\t\t\t\tvar canvas = chart.canvas;\n\t\t\t\t\tif (type === 'resize') {\n\t\t\t\t\t\t// Note: the resize event is not supported on all browsers.\n\t\t\t\t\t\taddResizeListener(canvas, listener, chart);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {});\n\t\t\t\t\tvar proxies = expando.proxies || (expando.proxies = {});\n\t\t\t\t\tvar proxy = proxies[chart.id + '_' + type] = function (event) {\n\t\t\t\t\t\tlistener(fromNativeEvent(event, chart));\n\t\t\t\t\t};\n\n\t\t\t\t\t_addEventListener(canvas, type, proxy);\n\t\t\t\t},\n\n\t\t\t\tremoveEventListener: function removeEventListener(chart, type, listener) {\n\t\t\t\t\tvar canvas = chart.canvas;\n\t\t\t\t\tif (type === 'resize') {\n\t\t\t\t\t\t// Note: the resize event is not supported on all browsers.\n\t\t\t\t\t\tremoveResizeListener(canvas, listener);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar expando = listener[EXPANDO_KEY] || {};\n\t\t\t\t\tvar proxies = expando.proxies || {};\n\t\t\t\t\tvar proxy = proxies[chart.id + '_' + type];\n\t\t\t\t\tif (!proxy) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t_removeEventListener(canvas, type, proxy);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// DEPRECATIONS\n\n\t\t\t/**\n * Provided for backward compatibility, use EventTarget.addEventListener instead.\n * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\n * @function Chart.helpers.addEvent\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n\t\t\thelpers.addEvent = _addEventListener;\n\n\t\t\t/**\n * Provided for backward compatibility, use EventTarget.removeEventListener instead.\n * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener\n * @function Chart.helpers.removeEvent\n * @deprecated since version 2.7.0\n * @todo remove at version 3\n * @private\n */\n\t\t\thelpers.removeEvent = _removeEventListener;\n\t\t}, { \"46\": 46 }], 49: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(46);\n\t\t\tvar basic = require(47);\n\t\t\tvar dom = require(48);\n\n\t\t\t// @TODO Make possible to select another platform at build time.\n\t\t\tvar implementation = dom._enabled ? dom : basic;\n\n\t\t\t/**\n * @namespace Chart.platform\n * @see https://chartjs.gitbooks.io/proposals/content/Platform.html\n * @since 2.4.0\n */\n\t\t\tmodule.exports = helpers.extend({\n\t\t\t\t/**\n * @since 2.7.0\n */\n\t\t\t\tinitialize: function initialize() {},\n\n\t\t\t\t/**\n * Called at chart construction time, returns a context2d instance implementing\n * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n * @param {*} item - The native item from which to acquire context (platform specific)\n * @param {Object} options - The chart options\n * @returns {CanvasRenderingContext2D} context2d instance\n */\n\t\t\t\tacquireContext: function acquireContext() {},\n\n\t\t\t\t/**\n * Called at chart destruction time, releases any resources associated to the context\n * previously returned by the acquireContext() method.\n * @param {CanvasRenderingContext2D} context - The context2d instance\n * @returns {Boolean} true if the method succeeded, else false\n */\n\t\t\t\treleaseContext: function releaseContext() {},\n\n\t\t\t\t/**\n * Registers the specified listener on the given chart.\n * @param {Chart} chart - Chart from which to listen for event\n * @param {String} type - The ({@link IEvent}) type to listen for\n * @param {Function} listener - Receives a notification (an object that implements\n * the {@link IEvent} interface) when an event of the specified type occurs.\n */\n\t\t\t\taddEventListener: function addEventListener() {},\n\n\t\t\t\t/**\n * Removes the specified listener previously registered with addEventListener.\n * @param {Chart} chart -Chart from which to remove the listener\n * @param {String} type - The ({@link IEvent}) type to remove\n * @param {Function} listener - The listener function to remove from the event target.\n */\n\t\t\t\tremoveEventListener: function removeEventListener() {}\n\n\t\t\t}, implementation);\n\n\t\t\t/**\n * @interface IPlatform\n * Allows abstracting platform dependencies away from the chart\n * @borrows Chart.platform.acquireContext as acquireContext\n * @borrows Chart.platform.releaseContext as releaseContext\n * @borrows Chart.platform.addEventListener as addEventListener\n * @borrows Chart.platform.removeEventListener as removeEventListener\n */\n\n\t\t\t/**\n * @interface IEvent\n * @prop {String} type - The event type name, possible values are:\n * 'contextmenu', 'mouseenter', 'mousedown', 'mousemove', 'mouseup', 'mouseout',\n * 'click', 'dblclick', 'keydown', 'keypress', 'keyup' and 'resize'\n * @prop {*} native - The original native event (null for emulated events, e.g. 'resize')\n * @prop {Number} x - The mouse x position, relative to the canvas (null for incompatible events)\n * @prop {Number} y - The mouse y position, relative to the canvas (null for incompatible events)\n */\n\t\t}, { \"46\": 46, \"47\": 47, \"48\": 48 }], 50: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tmodule.exports = {};\n\t\t\tmodule.exports.filler = require(51);\n\t\t\tmodule.exports.legend = require(52);\n\t\t\tmodule.exports.title = require(53);\n\t\t}, { \"51\": 51, \"52\": 52, \"53\": 53 }], 51: [function (require, module, exports) {\n\t\t\t/**\n * Plugin based on discussion from the following Chart.js issues:\n * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\n * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\n */\n\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar elements = require(41);\n\t\t\tvar helpers = require(46);\n\n\t\t\tdefaults._set('global', {\n\t\t\t\tplugins: {\n\t\t\t\t\tfiller: {\n\t\t\t\t\t\tpropagate: true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvar mappers = {\n\t\t\t\tdataset: function dataset(source) {\n\t\t\t\t\tvar index = source.fill;\n\t\t\t\t\tvar chart = source.chart;\n\t\t\t\t\tvar meta = chart.getDatasetMeta(index);\n\t\t\t\t\tvar visible = meta && chart.isDatasetVisible(index);\n\t\t\t\t\tvar points = visible && meta.dataset._children || [];\n\t\t\t\t\tvar length = points.length || 0;\n\n\t\t\t\t\treturn !length ? null : function (point, i) {\n\t\t\t\t\t\treturn i < length && points[i]._view || null;\n\t\t\t\t\t};\n\t\t\t\t},\n\n\t\t\t\tboundary: function boundary(source) {\n\t\t\t\t\tvar boundary = source.boundary;\n\t\t\t\t\tvar x = boundary ? boundary.x : null;\n\t\t\t\t\tvar y = boundary ? boundary.y : null;\n\n\t\t\t\t\treturn function (point) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tx: x === null ? point.x : x,\n\t\t\t\t\t\t\ty: y === null ? point.y : y\n\t\t\t\t\t\t};\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// @todo if (fill[0] === '#')\n\t\t\tfunction decodeFill(el, index, count) {\n\t\t\t\tvar model = el._model || {};\n\t\t\t\tvar fill = model.fill;\n\t\t\t\tvar target;\n\n\t\t\t\tif (fill === undefined) {\n\t\t\t\t\tfill = !!model.backgroundColor;\n\t\t\t\t}\n\n\t\t\t\tif (fill === false || fill === null) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif (fill === true) {\n\t\t\t\t\treturn 'origin';\n\t\t\t\t}\n\n\t\t\t\ttarget = parseFloat(fill, 10);\n\t\t\t\tif (isFinite(target) && Math.floor(target) === target) {\n\t\t\t\t\tif (fill[0] === '-' || fill[0] === '+') {\n\t\t\t\t\t\ttarget = index + target;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (target === index || target < 0 || target >= count) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn target;\n\t\t\t\t}\n\n\t\t\t\tswitch (fill) {\n\t\t\t\t\t// compatibility\n\t\t\t\t\tcase 'bottom':\n\t\t\t\t\t\treturn 'start';\n\t\t\t\t\tcase 'top':\n\t\t\t\t\t\treturn 'end';\n\t\t\t\t\tcase 'zero':\n\t\t\t\t\t\treturn 'origin';\n\t\t\t\t\t// supported boundaries\n\t\t\t\t\tcase 'origin':\n\t\t\t\t\tcase 'start':\n\t\t\t\t\tcase 'end':\n\t\t\t\t\t\treturn fill;\n\t\t\t\t\t// invalid fill values\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction computeBoundary(source) {\n\t\t\t\tvar model = source.el._model || {};\n\t\t\t\tvar scale = source.el._scale || {};\n\t\t\t\tvar fill = source.fill;\n\t\t\t\tvar target = null;\n\t\t\t\tvar horizontal;\n\n\t\t\t\tif (isFinite(fill)) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\t// Backward compatibility: until v3, we still need to support boundary values set on\n\t\t\t\t// the model (scaleTop, scaleBottom and scaleZero) because some external plugins and\n\t\t\t\t// controllers might still use it (e.g. the Smith chart).\n\n\t\t\t\tif (fill === 'start') {\n\t\t\t\t\ttarget = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom;\n\t\t\t\t} else if (fill === 'end') {\n\t\t\t\t\ttarget = model.scaleTop === undefined ? scale.top : model.scaleTop;\n\t\t\t\t} else if (model.scaleZero !== undefined) {\n\t\t\t\t\ttarget = model.scaleZero;\n\t\t\t\t} else if (scale.getBasePosition) {\n\t\t\t\t\ttarget = scale.getBasePosition();\n\t\t\t\t} else if (scale.getBasePixel) {\n\t\t\t\t\ttarget = scale.getBasePixel();\n\t\t\t\t}\n\n\t\t\t\tif (target !== undefined && target !== null) {\n\t\t\t\t\tif (target.x !== undefined && target.y !== undefined) {\n\t\t\t\t\t\treturn target;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (typeof target === 'number' && isFinite(target)) {\n\t\t\t\t\t\thorizontal = scale.isHorizontal();\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tx: horizontal ? target : null,\n\t\t\t\t\t\t\ty: horizontal ? null : target\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tfunction resolveTarget(sources, index, propagate) {\n\t\t\t\tvar source = sources[index];\n\t\t\t\tvar fill = source.fill;\n\t\t\t\tvar visited = [index];\n\t\t\t\tvar target;\n\n\t\t\t\tif (!propagate) {\n\t\t\t\t\treturn fill;\n\t\t\t\t}\n\n\t\t\t\twhile (fill !== false && visited.indexOf(fill) === -1) {\n\t\t\t\t\tif (!isFinite(fill)) {\n\t\t\t\t\t\treturn fill;\n\t\t\t\t\t}\n\n\t\t\t\t\ttarget = sources[fill];\n\t\t\t\t\tif (!target) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (target.visible) {\n\t\t\t\t\t\treturn fill;\n\t\t\t\t\t}\n\n\t\t\t\t\tvisited.push(fill);\n\t\t\t\t\tfill = target.fill;\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tfunction createMapper(source) {\n\t\t\t\tvar fill = source.fill;\n\t\t\t\tvar type = 'dataset';\n\n\t\t\t\tif (fill === false) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tif (!isFinite(fill)) {\n\t\t\t\t\ttype = 'boundary';\n\t\t\t\t}\n\n\t\t\t\treturn mappers[type](source);\n\t\t\t}\n\n\t\t\tfunction isDrawable(point) {\n\t\t\t\treturn point && !point.skip;\n\t\t\t}\n\n\t\t\tfunction drawArea(ctx, curve0, curve1, len0, len1) {\n\t\t\t\tvar i;\n\n\t\t\t\tif (!len0 || !len1) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// building first area curve (normal)\n\t\t\t\tctx.moveTo(curve0[0].x, curve0[0].y);\n\t\t\t\tfor (i = 1; i < len0; ++i) {\n\t\t\t\t\thelpers.canvas.lineTo(ctx, curve0[i - 1], curve0[i]);\n\t\t\t\t}\n\n\t\t\t\t// joining the two area curves\n\t\t\t\tctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y);\n\n\t\t\t\t// building opposite area curve (reverse)\n\t\t\t\tfor (i = len1 - 1; i > 0; --i) {\n\t\t\t\t\thelpers.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction doFill(ctx, points, mapper, view, color, loop) {\n\t\t\t\tvar count = points.length;\n\t\t\t\tvar span = view.spanGaps;\n\t\t\t\tvar curve0 = [];\n\t\t\t\tvar curve1 = [];\n\t\t\t\tvar len0 = 0;\n\t\t\t\tvar len1 = 0;\n\t\t\t\tvar i, ilen, index, p0, p1, d0, d1;\n\n\t\t\t\tctx.beginPath();\n\n\t\t\t\tfor (i = 0, ilen = count + !!loop; i < ilen; ++i) {\n\t\t\t\t\tindex = i % count;\n\t\t\t\t\tp0 = points[index]._view;\n\t\t\t\t\tp1 = mapper(p0, index, view);\n\t\t\t\t\td0 = isDrawable(p0);\n\t\t\t\t\td1 = isDrawable(p1);\n\n\t\t\t\t\tif (d0 && d1) {\n\t\t\t\t\t\tlen0 = curve0.push(p0);\n\t\t\t\t\t\tlen1 = curve1.push(p1);\n\t\t\t\t\t} else if (len0 && len1) {\n\t\t\t\t\t\tif (!span) {\n\t\t\t\t\t\t\tdrawArea(ctx, curve0, curve1, len0, len1);\n\t\t\t\t\t\t\tlen0 = len1 = 0;\n\t\t\t\t\t\t\tcurve0 = [];\n\t\t\t\t\t\t\tcurve1 = [];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (d0) {\n\t\t\t\t\t\t\t\tcurve0.push(p0);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (d1) {\n\t\t\t\t\t\t\t\tcurve1.push(p1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tdrawArea(ctx, curve0, curve1, len0, len1);\n\n\t\t\t\tctx.closePath();\n\t\t\t\tctx.fillStyle = color;\n\t\t\t\tctx.fill();\n\t\t\t}\n\n\t\t\tmodule.exports = {\n\t\t\t\tid: 'filler',\n\n\t\t\t\tafterDatasetsUpdate: function afterDatasetsUpdate(chart, options) {\n\t\t\t\t\tvar count = (chart.data.datasets || []).length;\n\t\t\t\t\tvar propagate = options.propagate;\n\t\t\t\t\tvar sources = [];\n\t\t\t\t\tvar meta, i, el, source;\n\n\t\t\t\t\tfor (i = 0; i < count; ++i) {\n\t\t\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t\t\tel = meta.dataset;\n\t\t\t\t\t\tsource = null;\n\n\t\t\t\t\t\tif (el && el._model && el instanceof elements.Line) {\n\t\t\t\t\t\t\tsource = {\n\t\t\t\t\t\t\t\tvisible: chart.isDatasetVisible(i),\n\t\t\t\t\t\t\t\tfill: decodeFill(el, i, count),\n\t\t\t\t\t\t\t\tchart: chart,\n\t\t\t\t\t\t\t\tel: el\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmeta.$filler = source;\n\t\t\t\t\t\tsources.push(source);\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (i = 0; i < count; ++i) {\n\t\t\t\t\t\tsource = sources[i];\n\t\t\t\t\t\tif (!source) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsource.fill = resolveTarget(sources, i, propagate);\n\t\t\t\t\t\tsource.boundary = computeBoundary(source);\n\t\t\t\t\t\tsource.mapper = createMapper(source);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tbeforeDatasetDraw: function beforeDatasetDraw(chart, args) {\n\t\t\t\t\tvar meta = args.meta.$filler;\n\t\t\t\t\tif (!meta) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar ctx = chart.ctx;\n\t\t\t\t\tvar el = meta.el;\n\t\t\t\t\tvar view = el._view;\n\t\t\t\t\tvar points = el._children || [];\n\t\t\t\t\tvar mapper = meta.mapper;\n\t\t\t\t\tvar color = view.backgroundColor || defaults.global.defaultColor;\n\n\t\t\t\t\tif (mapper && color && points.length) {\n\t\t\t\t\t\thelpers.canvas.clipArea(ctx, chart.chartArea);\n\t\t\t\t\t\tdoFill(ctx, points, mapper, view, color, el._loop);\n\t\t\t\t\t\thelpers.canvas.unclipArea(ctx);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}, { \"26\": 26, \"41\": 41, \"46\": 46 }], 52: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar Element = require(27);\n\t\t\tvar helpers = require(46);\n\t\t\tvar layouts = require(31);\n\n\t\t\tvar noop = helpers.noop;\n\n\t\t\tdefaults._set('global', {\n\t\t\t\tlegend: {\n\t\t\t\t\tdisplay: true,\n\t\t\t\t\tposition: 'top',\n\t\t\t\t\tfullWidth: true,\n\t\t\t\t\treverse: false,\n\t\t\t\t\tweight: 1000,\n\n\t\t\t\t\t// a callback that will handle\n\t\t\t\t\tonClick: function onClick(e, legendItem) {\n\t\t\t\t\t\tvar index = legendItem.datasetIndex;\n\t\t\t\t\t\tvar ci = this.chart;\n\t\t\t\t\t\tvar meta = ci.getDatasetMeta(index);\n\n\t\t\t\t\t\t// See controller.isDatasetVisible comment\n\t\t\t\t\t\tmeta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null;\n\n\t\t\t\t\t\t// We hid a dataset ... rerender the chart\n\t\t\t\t\t\tci.update();\n\t\t\t\t\t},\n\n\t\t\t\t\tonHover: null,\n\n\t\t\t\t\tlabels: {\n\t\t\t\t\t\tboxWidth: 40,\n\t\t\t\t\t\tpadding: 10,\n\t\t\t\t\t\t// Generates labels shown in the legend\n\t\t\t\t\t\t// Valid properties to return:\n\t\t\t\t\t\t// text : text to display\n\t\t\t\t\t\t// fillStyle : fill of coloured box\n\t\t\t\t\t\t// strokeStyle: stroke of coloured box\n\t\t\t\t\t\t// hidden : if this legend item refers to a hidden item\n\t\t\t\t\t\t// lineCap : cap style for line\n\t\t\t\t\t\t// lineDash\n\t\t\t\t\t\t// lineDashOffset :\n\t\t\t\t\t\t// lineJoin :\n\t\t\t\t\t\t// lineWidth :\n\t\t\t\t\t\tgenerateLabels: function generateLabels(chart) {\n\t\t\t\t\t\t\tvar data = chart.data;\n\t\t\t\t\t\t\treturn helpers.isArray(data.datasets) ? data.datasets.map(function (dataset, i) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\ttext: dataset.label,\n\t\t\t\t\t\t\t\t\tfillStyle: !helpers.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0],\n\t\t\t\t\t\t\t\t\thidden: !chart.isDatasetVisible(i),\n\t\t\t\t\t\t\t\t\tlineCap: dataset.borderCapStyle,\n\t\t\t\t\t\t\t\t\tlineDash: dataset.borderDash,\n\t\t\t\t\t\t\t\t\tlineDashOffset: dataset.borderDashOffset,\n\t\t\t\t\t\t\t\t\tlineJoin: dataset.borderJoinStyle,\n\t\t\t\t\t\t\t\t\tlineWidth: dataset.borderWidth,\n\t\t\t\t\t\t\t\t\tstrokeStyle: dataset.borderColor,\n\t\t\t\t\t\t\t\t\tpointStyle: dataset.pointStyle,\n\n\t\t\t\t\t\t\t\t\t// Below is extra data used for toggling the datasets\n\t\t\t\t\t\t\t\t\tdatasetIndex: i\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}, this) : [];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tlegendCallback: function legendCallback(chart) {\n\t\t\t\t\tvar text = [];\n\t\t\t\t\ttext.push('<ul class=\"' + chart.id + '-legend\">');\n\t\t\t\t\tfor (var i = 0; i < chart.data.datasets.length; i++) {\n\t\t\t\t\t\ttext.push('<li><span style=\"background-color:' + chart.data.datasets[i].backgroundColor + '\"></span>');\n\t\t\t\t\t\tif (chart.data.datasets[i].label) {\n\t\t\t\t\t\t\ttext.push(chart.data.datasets[i].label);\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttext.push('</li>');\n\t\t\t\t\t}\n\t\t\t\t\ttext.push('</ul>');\n\t\t\t\t\treturn text.join('');\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/**\n * Helper function to get the box width based on the usePointStyle option\n * @param labelopts {Object} the label options on the legend\n * @param fontSize {Number} the label font size\n * @return {Number} width of the color box area\n */\n\t\t\tfunction getBoxWidth(labelOpts, fontSize) {\n\t\t\t\treturn labelOpts.usePointStyle ? fontSize * Math.SQRT2 : labelOpts.boxWidth;\n\t\t\t}\n\n\t\t\t/**\n * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required!\n */\n\t\t\tvar Legend = Element.extend({\n\n\t\t\t\tinitialize: function initialize(config) {\n\t\t\t\t\thelpers.extend(this, config);\n\n\t\t\t\t\t// Contains hit boxes for each dataset (in dataset order)\n\t\t\t\t\tthis.legendHitBoxes = [];\n\n\t\t\t\t\t// Are we in doughnut mode which has a different data type\n\t\t\t\t\tthis.doughnutMode = false;\n\t\t\t\t},\n\n\t\t\t\t// These methods are ordered by lifecycle. Utilities then follow.\n\t\t\t\t// Any function defined here is inherited by all legend types.\n\t\t\t\t// Any function can be extended by the legend type\n\n\t\t\t\tbeforeUpdate: noop,\n\t\t\t\tupdate: function update(maxWidth, maxHeight, margins) {\n\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\t\t\tme.beforeUpdate();\n\n\t\t\t\t\t// Absorb the master measurements\n\t\t\t\t\tme.maxWidth = maxWidth;\n\t\t\t\t\tme.maxHeight = maxHeight;\n\t\t\t\t\tme.margins = margins;\n\n\t\t\t\t\t// Dimensions\n\t\t\t\t\tme.beforeSetDimensions();\n\t\t\t\t\tme.setDimensions();\n\t\t\t\t\tme.afterSetDimensions();\n\t\t\t\t\t// Labels\n\t\t\t\t\tme.beforeBuildLabels();\n\t\t\t\t\tme.buildLabels();\n\t\t\t\t\tme.afterBuildLabels();\n\n\t\t\t\t\t// Fit\n\t\t\t\t\tme.beforeFit();\n\t\t\t\t\tme.fit();\n\t\t\t\t\tme.afterFit();\n\t\t\t\t\t//\n\t\t\t\t\tme.afterUpdate();\n\n\t\t\t\t\treturn me.minSize;\n\t\t\t\t},\n\t\t\t\tafterUpdate: noop,\n\n\t\t\t\t//\n\n\t\t\t\tbeforeSetDimensions: noop,\n\t\t\t\tsetDimensions: function setDimensions() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\t// Reset position before calculating rotation\n\t\t\t\t\t\tme.width = me.maxWidth;\n\t\t\t\t\t\tme.left = 0;\n\t\t\t\t\t\tme.right = me.width;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t\t\t// Reset position before calculating rotation\n\t\t\t\t\t\tme.top = 0;\n\t\t\t\t\t\tme.bottom = me.height;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Reset padding\n\t\t\t\t\tme.paddingLeft = 0;\n\t\t\t\t\tme.paddingTop = 0;\n\t\t\t\t\tme.paddingRight = 0;\n\t\t\t\t\tme.paddingBottom = 0;\n\n\t\t\t\t\t// Reset minSize\n\t\t\t\t\tme.minSize = {\n\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\theight: 0\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tafterSetDimensions: noop,\n\n\t\t\t\t//\n\n\t\t\t\tbeforeBuildLabels: noop,\n\t\t\t\tbuildLabels: function buildLabels() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar labelOpts = me.options.labels || {};\n\t\t\t\t\tvar legendItems = helpers.callback(labelOpts.generateLabels, [me.chart], me) || [];\n\n\t\t\t\t\tif (labelOpts.filter) {\n\t\t\t\t\t\tlegendItems = legendItems.filter(function (item) {\n\t\t\t\t\t\t\treturn labelOpts.filter(item, me.chart.data);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (me.options.reverse) {\n\t\t\t\t\t\tlegendItems.reverse();\n\t\t\t\t\t}\n\n\t\t\t\t\tme.legendItems = legendItems;\n\t\t\t\t},\n\t\t\t\tafterBuildLabels: noop,\n\n\t\t\t\t//\n\n\t\t\t\tbeforeFit: noop,\n\t\t\t\tfit: function fit() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\tvar labelOpts = opts.labels;\n\t\t\t\t\tvar display = opts.display;\n\n\t\t\t\t\tvar ctx = me.ctx;\n\n\t\t\t\t\tvar globalDefault = defaults.global;\n\t\t\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\t\t\tvar fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize);\n\t\t\t\t\tvar fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle);\n\t\t\t\t\tvar fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily);\n\t\t\t\t\tvar labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n\t\t\t\t\t// Reset hit boxes\n\t\t\t\t\tvar hitboxes = me.legendHitBoxes = [];\n\n\t\t\t\t\tvar minSize = me.minSize;\n\t\t\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\tminSize.width = me.maxWidth; // fill all the width\n\t\t\t\t\t\tminSize.height = display ? 10 : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tminSize.width = display ? 10 : 0;\n\t\t\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t\t\t}\n\n\t\t\t\t\t// Increase sizes here\n\t\t\t\t\tif (display) {\n\t\t\t\t\t\tctx.font = labelFont;\n\n\t\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t\t// Labels\n\n\t\t\t\t\t\t\t// Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n\t\t\t\t\t\t\tvar lineWidths = me.lineWidths = [0];\n\t\t\t\t\t\t\tvar totalHeight = me.legendItems.length ? fontSize + labelOpts.padding : 0;\n\n\t\t\t\t\t\t\tctx.textAlign = 'left';\n\t\t\t\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\t\t\t\thelpers.each(me.legendItems, function (legendItem, i) {\n\t\t\t\t\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\t\t\t\t\tvar width = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width;\n\n\t\t\t\t\t\t\t\tif (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= me.width) {\n\t\t\t\t\t\t\t\t\ttotalHeight += fontSize + labelOpts.padding;\n\t\t\t\t\t\t\t\t\tlineWidths[lineWidths.length] = me.left;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Store the hitbox width and height here. Final position will be updated in `draw`\n\t\t\t\t\t\t\t\thitboxes[i] = {\n\t\t\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\t\twidth: width,\n\t\t\t\t\t\t\t\t\theight: fontSize\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tlineWidths[lineWidths.length - 1] += width + labelOpts.padding;\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tminSize.height += totalHeight;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar vPadding = labelOpts.padding;\n\t\t\t\t\t\t\tvar columnWidths = me.columnWidths = [];\n\t\t\t\t\t\t\tvar totalWidth = labelOpts.padding;\n\t\t\t\t\t\t\tvar currentColWidth = 0;\n\t\t\t\t\t\t\tvar currentColHeight = 0;\n\t\t\t\t\t\t\tvar itemHeight = fontSize + vPadding;\n\n\t\t\t\t\t\t\thelpers.each(me.legendItems, function (legendItem, i) {\n\t\t\t\t\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\t\t\t\t\tvar itemWidth = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width;\n\n\t\t\t\t\t\t\t\t// If too tall, go to new column\n\t\t\t\t\t\t\t\tif (currentColHeight + itemHeight > minSize.height) {\n\t\t\t\t\t\t\t\t\ttotalWidth += currentColWidth + labelOpts.padding;\n\t\t\t\t\t\t\t\t\tcolumnWidths.push(currentColWidth); // previous column width\n\n\t\t\t\t\t\t\t\t\tcurrentColWidth = 0;\n\t\t\t\t\t\t\t\t\tcurrentColHeight = 0;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Get max width\n\t\t\t\t\t\t\t\tcurrentColWidth = Math.max(currentColWidth, itemWidth);\n\t\t\t\t\t\t\t\tcurrentColHeight += itemHeight;\n\n\t\t\t\t\t\t\t\t// Store the hitbox width and height here. Final position will be updated in `draw`\n\t\t\t\t\t\t\t\thitboxes[i] = {\n\t\t\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t\t\twidth: itemWidth,\n\t\t\t\t\t\t\t\t\theight: fontSize\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\ttotalWidth += currentColWidth;\n\t\t\t\t\t\t\tcolumnWidths.push(currentColWidth);\n\t\t\t\t\t\t\tminSize.width += totalWidth;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tme.width = minSize.width;\n\t\t\t\t\tme.height = minSize.height;\n\t\t\t\t},\n\t\t\t\tafterFit: noop,\n\n\t\t\t\t// Shared Methods\n\t\t\t\tisHorizontal: function isHorizontal() {\n\t\t\t\t\treturn this.options.position === 'top' || this.options.position === 'bottom';\n\t\t\t\t},\n\n\t\t\t\t// Actually draw the legend on the canvas\n\t\t\t\tdraw: function draw() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\tvar labelOpts = opts.labels;\n\t\t\t\t\tvar globalDefault = defaults.global;\n\t\t\t\t\tvar lineDefault = globalDefault.elements.line;\n\t\t\t\t\tvar legendWidth = me.width;\n\t\t\t\t\tvar lineWidths = me.lineWidths;\n\n\t\t\t\t\tif (opts.display) {\n\t\t\t\t\t\tvar ctx = me.ctx;\n\t\t\t\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\t\t\t\tvar fontColor = valueOrDefault(labelOpts.fontColor, globalDefault.defaultFontColor);\n\t\t\t\t\t\tvar fontSize = valueOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize);\n\t\t\t\t\t\tvar fontStyle = valueOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle);\n\t\t\t\t\t\tvar fontFamily = valueOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily);\n\t\t\t\t\t\tvar labelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\t\t\t\t\t\tvar cursor;\n\n\t\t\t\t\t\t// Canvas setup\n\t\t\t\t\t\tctx.textAlign = 'left';\n\t\t\t\t\t\tctx.textBaseline = 'middle';\n\t\t\t\t\t\tctx.lineWidth = 0.5;\n\t\t\t\t\t\tctx.strokeStyle = fontColor; // for strikethrough effect\n\t\t\t\t\t\tctx.fillStyle = fontColor; // render in correct colour\n\t\t\t\t\t\tctx.font = labelFont;\n\n\t\t\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\t\t\tvar hitboxes = me.legendHitBoxes;\n\n\t\t\t\t\t\t// current position\n\t\t\t\t\t\tvar drawLegendBox = function drawLegendBox(x, y, legendItem) {\n\t\t\t\t\t\t\tif (isNaN(boxWidth) || boxWidth <= 0) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Set the ctx for the box\n\t\t\t\t\t\t\tctx.save();\n\n\t\t\t\t\t\t\tctx.fillStyle = valueOrDefault(legendItem.fillStyle, globalDefault.defaultColor);\n\t\t\t\t\t\t\tctx.lineCap = valueOrDefault(legendItem.lineCap, lineDefault.borderCapStyle);\n\t\t\t\t\t\t\tctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, lineDefault.borderDashOffset);\n\t\t\t\t\t\t\tctx.lineJoin = valueOrDefault(legendItem.lineJoin, lineDefault.borderJoinStyle);\n\t\t\t\t\t\t\tctx.lineWidth = valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth);\n\t\t\t\t\t\t\tctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, globalDefault.defaultColor);\n\t\t\t\t\t\t\tvar isLineWidthZero = valueOrDefault(legendItem.lineWidth, lineDefault.borderWidth) === 0;\n\n\t\t\t\t\t\t\tif (ctx.setLineDash) {\n\t\t\t\t\t\t\t\t// IE 9 and 10 do not support line dash\n\t\t\t\t\t\t\t\tctx.setLineDash(valueOrDefault(legendItem.lineDash, lineDefault.borderDash));\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (opts.labels && opts.labels.usePointStyle) {\n\t\t\t\t\t\t\t\t// Recalculate x and y for drawPoint() because its expecting\n\t\t\t\t\t\t\t\t// x and y to be center of figure (instead of top left)\n\t\t\t\t\t\t\t\tvar radius = fontSize * Math.SQRT2 / 2;\n\t\t\t\t\t\t\t\tvar offSet = radius / Math.SQRT2;\n\t\t\t\t\t\t\t\tvar centerX = x + offSet;\n\t\t\t\t\t\t\t\tvar centerY = y + offSet;\n\n\t\t\t\t\t\t\t\t// Draw pointStyle as legend symbol\n\t\t\t\t\t\t\t\thelpers.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Draw box as legend symbol\n\t\t\t\t\t\t\t\tif (!isLineWidthZero) {\n\t\t\t\t\t\t\t\t\tctx.strokeRect(x, y, boxWidth, fontSize);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tctx.fillRect(x, y, boxWidth, fontSize);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tctx.restore();\n\t\t\t\t\t\t};\n\t\t\t\t\t\tvar fillText = function fillText(x, y, legendItem, textWidth) {\n\t\t\t\t\t\t\tvar halfFontSize = fontSize / 2;\n\t\t\t\t\t\t\tvar xLeft = boxWidth + halfFontSize + x;\n\t\t\t\t\t\t\tvar yMiddle = y + halfFontSize;\n\n\t\t\t\t\t\t\tctx.fillText(legendItem.text, xLeft, yMiddle);\n\n\t\t\t\t\t\t\tif (legendItem.hidden) {\n\t\t\t\t\t\t\t\t// Strikethrough the text if hidden\n\t\t\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\t\t\tctx.lineWidth = 2;\n\t\t\t\t\t\t\t\tctx.moveTo(xLeft, yMiddle);\n\t\t\t\t\t\t\t\tctx.lineTo(xLeft + textWidth, yMiddle);\n\t\t\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// Horizontal\n\t\t\t\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t\tcursor = {\n\t\t\t\t\t\t\t\tx: me.left + (legendWidth - lineWidths[0]) / 2,\n\t\t\t\t\t\t\t\ty: me.top + labelOpts.padding,\n\t\t\t\t\t\t\t\tline: 0\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcursor = {\n\t\t\t\t\t\t\t\tx: me.left + labelOpts.padding,\n\t\t\t\t\t\t\t\ty: me.top + labelOpts.padding,\n\t\t\t\t\t\t\t\tline: 0\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar itemHeight = fontSize + labelOpts.padding;\n\t\t\t\t\t\thelpers.each(me.legendItems, function (legendItem, i) {\n\t\t\t\t\t\t\tvar textWidth = ctx.measureText(legendItem.text).width;\n\t\t\t\t\t\t\tvar width = boxWidth + fontSize / 2 + textWidth;\n\t\t\t\t\t\t\tvar x = cursor.x;\n\t\t\t\t\t\t\tvar y = cursor.y;\n\n\t\t\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t\t\tif (x + width >= legendWidth) {\n\t\t\t\t\t\t\t\t\ty = cursor.y += itemHeight;\n\t\t\t\t\t\t\t\t\tcursor.line++;\n\t\t\t\t\t\t\t\t\tx = cursor.x = me.left + (legendWidth - lineWidths[cursor.line]) / 2;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (y + itemHeight > me.bottom) {\n\t\t\t\t\t\t\t\tx = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;\n\t\t\t\t\t\t\t\ty = cursor.y = me.top + labelOpts.padding;\n\t\t\t\t\t\t\t\tcursor.line++;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tdrawLegendBox(x, y, legendItem);\n\n\t\t\t\t\t\t\thitboxes[i].left = x;\n\t\t\t\t\t\t\thitboxes[i].top = y;\n\n\t\t\t\t\t\t\t// Fill the actual label\n\t\t\t\t\t\t\tfillText(x, y, legendItem, textWidth);\n\n\t\t\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\t\t\tcursor.x += width + labelOpts.padding;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcursor.y += itemHeight;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t/**\n * Handle an event\n * @private\n * @param {IEvent} event - The event to handle\n * @return {Boolean} true if a change occured\n */\n\t\t\t\thandleEvent: function handleEvent(e) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\tvar type = e.type === 'mouseup' ? 'click' : e.type;\n\t\t\t\t\tvar changed = false;\n\n\t\t\t\t\tif (type === 'mousemove') {\n\t\t\t\t\t\tif (!opts.onHover) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (type === 'click') {\n\t\t\t\t\t\tif (!opts.onClick) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Chart event already has relative position in it\n\t\t\t\t\tvar x = e.x;\n\t\t\t\t\tvar y = e.y;\n\n\t\t\t\t\tif (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {\n\t\t\t\t\t\t// See if we are touching one of the dataset boxes\n\t\t\t\t\t\tvar lh = me.legendHitBoxes;\n\t\t\t\t\t\tfor (var i = 0; i < lh.length; ++i) {\n\t\t\t\t\t\t\tvar hitBox = lh[i];\n\n\t\t\t\t\t\t\tif (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {\n\t\t\t\t\t\t\t\t// Touching an element\n\t\t\t\t\t\t\t\tif (type === 'click') {\n\t\t\t\t\t\t\t\t\t// use e.native for backwards compatibility\n\t\t\t\t\t\t\t\t\topts.onClick.call(me, e.native, me.legendItems[i]);\n\t\t\t\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t} else if (type === 'mousemove') {\n\t\t\t\t\t\t\t\t\t// use e.native for backwards compatibility\n\t\t\t\t\t\t\t\t\topts.onHover.call(me, e.native, me.legendItems[i]);\n\t\t\t\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn changed;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfunction createNewLegendAndAttach(chart, legendOpts) {\n\t\t\t\tvar legend = new Legend({\n\t\t\t\t\tctx: chart.ctx,\n\t\t\t\t\toptions: legendOpts,\n\t\t\t\t\tchart: chart\n\t\t\t\t});\n\n\t\t\t\tlayouts.configure(chart, legend, legendOpts);\n\t\t\t\tlayouts.addBox(chart, legend);\n\t\t\t\tchart.legend = legend;\n\t\t\t}\n\n\t\t\tmodule.exports = {\n\t\t\t\tid: 'legend',\n\n\t\t\t\t/**\n * Backward compatibility: since 2.1.5, the legend is registered as a plugin, making\n * Chart.Legend obsolete. To avoid a breaking change, we export the Legend as part of\n * the plugin, which one will be re-exposed in the chart.js file.\n * https://github.com/chartjs/Chart.js/pull/2640\n * @private\n */\n\t\t\t\t_element: Legend,\n\n\t\t\t\tbeforeInit: function beforeInit(chart) {\n\t\t\t\t\tvar legendOpts = chart.options.legend;\n\n\t\t\t\t\tif (legendOpts) {\n\t\t\t\t\t\tcreateNewLegendAndAttach(chart, legendOpts);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tbeforeUpdate: function beforeUpdate(chart) {\n\t\t\t\t\tvar legendOpts = chart.options.legend;\n\t\t\t\t\tvar legend = chart.legend;\n\n\t\t\t\t\tif (legendOpts) {\n\t\t\t\t\t\thelpers.mergeIf(legendOpts, defaults.global.legend);\n\n\t\t\t\t\t\tif (legend) {\n\t\t\t\t\t\t\tlayouts.configure(chart, legend, legendOpts);\n\t\t\t\t\t\t\tlegend.options = legendOpts;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcreateNewLegendAndAttach(chart, legendOpts);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (legend) {\n\t\t\t\t\t\tlayouts.removeBox(chart, legend);\n\t\t\t\t\t\tdelete chart.legend;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tafterEvent: function afterEvent(chart, e) {\n\t\t\t\t\tvar legend = chart.legend;\n\t\t\t\t\tif (legend) {\n\t\t\t\t\t\tlegend.handleEvent(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}, { \"26\": 26, \"27\": 27, \"31\": 31, \"46\": 46 }], 53: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar Element = require(27);\n\t\t\tvar helpers = require(46);\n\t\t\tvar layouts = require(31);\n\n\t\t\tvar noop = helpers.noop;\n\n\t\t\tdefaults._set('global', {\n\t\t\t\ttitle: {\n\t\t\t\t\tdisplay: false,\n\t\t\t\t\tfontStyle: 'bold',\n\t\t\t\t\tfullWidth: true,\n\t\t\t\t\tlineHeight: 1.2,\n\t\t\t\t\tpadding: 10,\n\t\t\t\t\tposition: 'top',\n\t\t\t\t\ttext: '',\n\t\t\t\t\tweight: 2000 // by default greater than legend (1000) to be above\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/**\n * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required!\n */\n\t\t\tvar Title = Element.extend({\n\t\t\t\tinitialize: function initialize(config) {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\thelpers.extend(me, config);\n\n\t\t\t\t\t// Contains hit boxes for each dataset (in dataset order)\n\t\t\t\t\tme.legendHitBoxes = [];\n\t\t\t\t},\n\n\t\t\t\t// These methods are ordered by lifecycle. Utilities then follow.\n\n\t\t\t\tbeforeUpdate: noop,\n\t\t\t\tupdate: function update(maxWidth, maxHeight, margins) {\n\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\t\t\tme.beforeUpdate();\n\n\t\t\t\t\t// Absorb the master measurements\n\t\t\t\t\tme.maxWidth = maxWidth;\n\t\t\t\t\tme.maxHeight = maxHeight;\n\t\t\t\t\tme.margins = margins;\n\n\t\t\t\t\t// Dimensions\n\t\t\t\t\tme.beforeSetDimensions();\n\t\t\t\t\tme.setDimensions();\n\t\t\t\t\tme.afterSetDimensions();\n\t\t\t\t\t// Labels\n\t\t\t\t\tme.beforeBuildLabels();\n\t\t\t\t\tme.buildLabels();\n\t\t\t\t\tme.afterBuildLabels();\n\n\t\t\t\t\t// Fit\n\t\t\t\t\tme.beforeFit();\n\t\t\t\t\tme.fit();\n\t\t\t\t\tme.afterFit();\n\t\t\t\t\t//\n\t\t\t\t\tme.afterUpdate();\n\n\t\t\t\t\treturn me.minSize;\n\t\t\t\t},\n\t\t\t\tafterUpdate: noop,\n\n\t\t\t\t//\n\n\t\t\t\tbeforeSetDimensions: noop,\n\t\t\t\tsetDimensions: function setDimensions() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\t// Reset position before calculating rotation\n\t\t\t\t\t\tme.width = me.maxWidth;\n\t\t\t\t\t\tme.left = 0;\n\t\t\t\t\t\tme.right = me.width;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t\t\t// Reset position before calculating rotation\n\t\t\t\t\t\tme.top = 0;\n\t\t\t\t\t\tme.bottom = me.height;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Reset padding\n\t\t\t\t\tme.paddingLeft = 0;\n\t\t\t\t\tme.paddingTop = 0;\n\t\t\t\t\tme.paddingRight = 0;\n\t\t\t\t\tme.paddingBottom = 0;\n\n\t\t\t\t\t// Reset minSize\n\t\t\t\t\tme.minSize = {\n\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\theight: 0\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tafterSetDimensions: noop,\n\n\t\t\t\t//\n\n\t\t\t\tbeforeBuildLabels: noop,\n\t\t\t\tbuildLabels: noop,\n\t\t\t\tafterBuildLabels: noop,\n\n\t\t\t\t//\n\n\t\t\t\tbeforeFit: noop,\n\t\t\t\tfit: function fit() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\tvar display = opts.display;\n\t\t\t\t\tvar fontSize = valueOrDefault(opts.fontSize, defaults.global.defaultFontSize);\n\t\t\t\t\tvar minSize = me.minSize;\n\t\t\t\t\tvar lineCount = helpers.isArray(opts.text) ? opts.text.length : 1;\n\t\t\t\t\tvar lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize);\n\t\t\t\t\tvar textSize = display ? lineCount * lineHeight + opts.padding * 2 : 0;\n\n\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\tminSize.width = me.maxWidth; // fill all the width\n\t\t\t\t\t\tminSize.height = textSize;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tminSize.width = textSize;\n\t\t\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t\t\t}\n\n\t\t\t\t\tme.width = minSize.width;\n\t\t\t\t\tme.height = minSize.height;\n\t\t\t\t},\n\t\t\t\tafterFit: noop,\n\n\t\t\t\t// Shared Methods\n\t\t\t\tisHorizontal: function isHorizontal() {\n\t\t\t\t\tvar pos = this.options.position;\n\t\t\t\t\treturn pos === 'top' || pos === 'bottom';\n\t\t\t\t},\n\n\t\t\t\t// Actually draw the title block on the canvas\n\t\t\t\tdraw: function draw() {\n\t\t\t\t\tvar me = this;\n\t\t\t\t\tvar ctx = me.ctx;\n\t\t\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\tvar globalDefaults = defaults.global;\n\n\t\t\t\t\tif (opts.display) {\n\t\t\t\t\t\tvar fontSize = valueOrDefault(opts.fontSize, globalDefaults.defaultFontSize);\n\t\t\t\t\t\tvar fontStyle = valueOrDefault(opts.fontStyle, globalDefaults.defaultFontStyle);\n\t\t\t\t\t\tvar fontFamily = valueOrDefault(opts.fontFamily, globalDefaults.defaultFontFamily);\n\t\t\t\t\t\tvar titleFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\t\t\t\t\t\tvar lineHeight = helpers.options.toLineHeight(opts.lineHeight, fontSize);\n\t\t\t\t\t\tvar offset = lineHeight / 2 + opts.padding;\n\t\t\t\t\t\tvar rotation = 0;\n\t\t\t\t\t\tvar top = me.top;\n\t\t\t\t\t\tvar left = me.left;\n\t\t\t\t\t\tvar bottom = me.bottom;\n\t\t\t\t\t\tvar right = me.right;\n\t\t\t\t\t\tvar maxWidth, titleX, titleY;\n\n\t\t\t\t\t\tctx.fillStyle = valueOrDefault(opts.fontColor, globalDefaults.defaultFontColor); // render in correct colour\n\t\t\t\t\t\tctx.font = titleFont;\n\n\t\t\t\t\t\t// Horizontal\n\t\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\t\ttitleX = left + (right - left) / 2; // midpoint of the width\n\t\t\t\t\t\t\ttitleY = top + offset;\n\t\t\t\t\t\t\tmaxWidth = right - left;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttitleX = opts.position === 'left' ? left + offset : right - offset;\n\t\t\t\t\t\t\ttitleY = top + (bottom - top) / 2;\n\t\t\t\t\t\t\tmaxWidth = bottom - top;\n\t\t\t\t\t\t\trotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tctx.save();\n\t\t\t\t\t\tctx.translate(titleX, titleY);\n\t\t\t\t\t\tctx.rotate(rotation);\n\t\t\t\t\t\tctx.textAlign = 'center';\n\t\t\t\t\t\tctx.textBaseline = 'middle';\n\n\t\t\t\t\t\tvar text = opts.text;\n\t\t\t\t\t\tif (helpers.isArray(text)) {\n\t\t\t\t\t\t\tvar y = 0;\n\t\t\t\t\t\t\tfor (var i = 0; i < text.length; ++i) {\n\t\t\t\t\t\t\t\tctx.fillText(text[i], 0, y, maxWidth);\n\t\t\t\t\t\t\t\ty += lineHeight;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tctx.fillText(text, 0, 0, maxWidth);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tctx.restore();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tfunction createNewTitleBlockAndAttach(chart, titleOpts) {\n\t\t\t\tvar title = new Title({\n\t\t\t\t\tctx: chart.ctx,\n\t\t\t\t\toptions: titleOpts,\n\t\t\t\t\tchart: chart\n\t\t\t\t});\n\n\t\t\t\tlayouts.configure(chart, title, titleOpts);\n\t\t\t\tlayouts.addBox(chart, title);\n\t\t\t\tchart.titleBlock = title;\n\t\t\t}\n\n\t\t\tmodule.exports = {\n\t\t\t\tid: 'title',\n\n\t\t\t\t/**\n * Backward compatibility: since 2.1.5, the title is registered as a plugin, making\n * Chart.Title obsolete. To avoid a breaking change, we export the Title as part of\n * the plugin, which one will be re-exposed in the chart.js file.\n * https://github.com/chartjs/Chart.js/pull/2640\n * @private\n */\n\t\t\t\t_element: Title,\n\n\t\t\t\tbeforeInit: function beforeInit(chart) {\n\t\t\t\t\tvar titleOpts = chart.options.title;\n\n\t\t\t\t\tif (titleOpts) {\n\t\t\t\t\t\tcreateNewTitleBlockAndAttach(chart, titleOpts);\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tbeforeUpdate: function beforeUpdate(chart) {\n\t\t\t\t\tvar titleOpts = chart.options.title;\n\t\t\t\t\tvar titleBlock = chart.titleBlock;\n\n\t\t\t\t\tif (titleOpts) {\n\t\t\t\t\t\thelpers.mergeIf(titleOpts, defaults.global.title);\n\n\t\t\t\t\t\tif (titleBlock) {\n\t\t\t\t\t\t\tlayouts.configure(chart, titleBlock, titleOpts);\n\t\t\t\t\t\t\ttitleBlock.options = titleOpts;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcreateNewTitleBlockAndAttach(chart, titleOpts);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (titleBlock) {\n\t\t\t\t\t\tlayouts.removeBox(chart, titleBlock);\n\t\t\t\t\t\tdelete chart.titleBlock;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}, { \"26\": 26, \"27\": 27, \"31\": 31, \"46\": 46 }], 54: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar Scale = require(33);\n\t\t\tvar scaleService = require(34);\n\n\t\t\tmodule.exports = function () {\n\n\t\t\t\t// Default config for a category scale\n\t\t\t\tvar defaultConfig = {\n\t\t\t\t\tposition: 'bottom'\n\t\t\t\t};\n\n\t\t\t\tvar DatasetScale = Scale.extend({\n\t\t\t\t\t/**\n * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those\n * else fall back to data.labels\n * @private\n */\n\t\t\t\t\tgetLabels: function getLabels() {\n\t\t\t\t\t\tvar data = this.chart.data;\n\t\t\t\t\t\treturn this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels;\n\t\t\t\t\t},\n\n\t\t\t\t\tdetermineDataLimits: function determineDataLimits() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar labels = me.getLabels();\n\t\t\t\t\t\tme.minIndex = 0;\n\t\t\t\t\t\tme.maxIndex = labels.length - 1;\n\t\t\t\t\t\tvar findIndex;\n\n\t\t\t\t\t\tif (me.options.ticks.min !== undefined) {\n\t\t\t\t\t\t\t// user specified min value\n\t\t\t\t\t\t\tfindIndex = labels.indexOf(me.options.ticks.min);\n\t\t\t\t\t\t\tme.minIndex = findIndex !== -1 ? findIndex : me.minIndex;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (me.options.ticks.max !== undefined) {\n\t\t\t\t\t\t\t// user specified max value\n\t\t\t\t\t\t\tfindIndex = labels.indexOf(me.options.ticks.max);\n\t\t\t\t\t\t\tme.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tme.min = labels[me.minIndex];\n\t\t\t\t\t\tme.max = labels[me.maxIndex];\n\t\t\t\t\t},\n\n\t\t\t\t\tbuildTicks: function buildTicks() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar labels = me.getLabels();\n\t\t\t\t\t\t// If we are viewing some subset of labels, slice the original array\n\t\t\t\t\t\tme.ticks = me.minIndex === 0 && me.maxIndex === labels.length - 1 ? labels : labels.slice(me.minIndex, me.maxIndex + 1);\n\t\t\t\t\t},\n\n\t\t\t\t\tgetLabelForIndex: function getLabelForIndex(index, datasetIndex) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar data = me.chart.data;\n\t\t\t\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\t\t\t\tif (data.yLabels && !isHorizontal) {\n\t\t\t\t\t\t\treturn me.getRightValue(data.datasets[datasetIndex].data[index]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn me.ticks[index - me.minIndex];\n\t\t\t\t\t},\n\n\t\t\t\t\t// Used to get data value locations. Value can either be an index or a numerical value\n\t\t\t\t\tgetPixelForValue: function getPixelForValue(value, index) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar offset = me.options.offset;\n\t\t\t\t\t\t// 1 is added because we need the length but we have the indexes\n\t\t\t\t\t\tvar offsetAmt = Math.max(me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1), 1);\n\n\t\t\t\t\t\t// If value is a data object, then index is the index in the data array,\n\t\t\t\t\t\t// not the index of the scale. We need to change that.\n\t\t\t\t\t\tvar valueCategory;\n\t\t\t\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\t\t\t\tvalueCategory = me.isHorizontal() ? value.x : value.y;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (valueCategory !== undefined || value !== undefined && isNaN(index)) {\n\t\t\t\t\t\t\tvar labels = me.getLabels();\n\t\t\t\t\t\t\tvalue = valueCategory || value;\n\t\t\t\t\t\t\tvar idx = labels.indexOf(value);\n\t\t\t\t\t\t\tindex = idx !== -1 ? idx : index;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\t\tvar valueWidth = me.width / offsetAmt;\n\t\t\t\t\t\t\tvar widthOffset = valueWidth * (index - me.minIndex);\n\n\t\t\t\t\t\t\tif (offset) {\n\t\t\t\t\t\t\t\twidthOffset += valueWidth / 2;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn me.left + Math.round(widthOffset);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar valueHeight = me.height / offsetAmt;\n\t\t\t\t\t\tvar heightOffset = valueHeight * (index - me.minIndex);\n\n\t\t\t\t\t\tif (offset) {\n\t\t\t\t\t\t\theightOffset += valueHeight / 2;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn me.top + Math.round(heightOffset);\n\t\t\t\t\t},\n\t\t\t\t\tgetPixelForTick: function getPixelForTick(index) {\n\t\t\t\t\t\treturn this.getPixelForValue(this.ticks[index], index + this.minIndex, null);\n\t\t\t\t\t},\n\t\t\t\t\tgetValueForPixel: function getValueForPixel(pixel) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar offset = me.options.offset;\n\t\t\t\t\t\tvar value;\n\t\t\t\t\t\tvar offsetAmt = Math.max(me._ticks.length - (offset ? 0 : 1), 1);\n\t\t\t\t\t\tvar horz = me.isHorizontal();\n\t\t\t\t\t\tvar valueDimension = (horz ? me.width : me.height) / offsetAmt;\n\n\t\t\t\t\t\tpixel -= horz ? me.left : me.top;\n\n\t\t\t\t\t\tif (offset) {\n\t\t\t\t\t\t\tpixel -= valueDimension / 2;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (pixel <= 0) {\n\t\t\t\t\t\t\tvalue = 0;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvalue = Math.round(pixel / valueDimension);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn value + me.minIndex;\n\t\t\t\t\t},\n\t\t\t\t\tgetBasePixel: function getBasePixel() {\n\t\t\t\t\t\treturn this.bottom;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tscaleService.registerScaleType('category', DatasetScale, defaultConfig);\n\t\t\t};\n\t\t}, { \"33\": 33, \"34\": 34 }], 55: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar helpers = require(46);\n\t\t\tvar scaleService = require(34);\n\t\t\tvar Ticks = require(35);\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tvar defaultConfig = {\n\t\t\t\t\tposition: 'left',\n\t\t\t\t\tticks: {\n\t\t\t\t\t\tcallback: Ticks.formatters.linear\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tvar LinearScale = Chart.LinearScaleBase.extend({\n\n\t\t\t\t\tdetermineDataLimits: function determineDataLimits() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar data = chart.data;\n\t\t\t\t\t\tvar datasets = data.datasets;\n\t\t\t\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\t\t\t\tvar DEFAULT_MIN = 0;\n\t\t\t\t\t\tvar DEFAULT_MAX = 1;\n\n\t\t\t\t\t\tfunction IDMatches(meta) {\n\t\t\t\t\t\t\treturn isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// First Calculate the range\n\t\t\t\t\t\tme.min = null;\n\t\t\t\t\t\tme.max = null;\n\n\t\t\t\t\t\tvar hasStacks = opts.stacked;\n\t\t\t\t\t\tif (hasStacks === undefined) {\n\t\t\t\t\t\t\thelpers.each(datasets, function (dataset, datasetIndex) {\n\t\t\t\t\t\t\t\tif (hasStacks) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && meta.stack !== undefined) {\n\t\t\t\t\t\t\t\t\thasStacks = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (opts.stacked || hasStacks) {\n\t\t\t\t\t\t\tvar valuesPerStack = {};\n\n\t\t\t\t\t\t\thelpers.each(datasets, function (dataset, datasetIndex) {\n\t\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\t\t\t\tvar key = [meta.type,\n\t\t\t\t\t\t\t\t// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n\t\t\t\t\t\t\t\topts.stacked === undefined && meta.stack === undefined ? datasetIndex : '', meta.stack].join('.');\n\n\t\t\t\t\t\t\t\tif (valuesPerStack[key] === undefined) {\n\t\t\t\t\t\t\t\t\tvaluesPerStack[key] = {\n\t\t\t\t\t\t\t\t\t\tpositiveValues: [],\n\t\t\t\t\t\t\t\t\t\tnegativeValues: []\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Store these per type\n\t\t\t\t\t\t\t\tvar positiveValues = valuesPerStack[key].positiveValues;\n\t\t\t\t\t\t\t\tvar negativeValues = valuesPerStack[key].negativeValues;\n\n\t\t\t\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\t\t\t\thelpers.each(dataset.data, function (rawValue, index) {\n\t\t\t\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tpositiveValues[index] = positiveValues[index] || 0;\n\t\t\t\t\t\t\t\t\t\tnegativeValues[index] = negativeValues[index] || 0;\n\n\t\t\t\t\t\t\t\t\t\tif (opts.relativePoints) {\n\t\t\t\t\t\t\t\t\t\t\tpositiveValues[index] = 100;\n\t\t\t\t\t\t\t\t\t\t} else if (value < 0) {\n\t\t\t\t\t\t\t\t\t\t\tnegativeValues[index] += value;\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tpositiveValues[index] += value;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\thelpers.each(valuesPerStack, function (valuesForType) {\n\t\t\t\t\t\t\t\tvar values = valuesForType.positiveValues.concat(valuesForType.negativeValues);\n\t\t\t\t\t\t\t\tvar minVal = helpers.min(values);\n\t\t\t\t\t\t\t\tvar maxVal = helpers.max(values);\n\t\t\t\t\t\t\t\tme.min = me.min === null ? minVal : Math.min(me.min, minVal);\n\t\t\t\t\t\t\t\tme.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thelpers.each(datasets, function (dataset, datasetIndex) {\n\t\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\t\t\t\thelpers.each(dataset.data, function (rawValue, index) {\n\t\t\t\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t\t\t\t} else if (value < me.min) {\n\t\t\t\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t\t\t\t} else if (value > me.max) {\n\t\t\t\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tme.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN;\n\t\t\t\t\t\tme.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX;\n\n\t\t\t\t\t\t// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n\t\t\t\t\t\tthis.handleTickRangeOptions();\n\t\t\t\t\t},\n\t\t\t\t\tgetTickLimit: function getTickLimit() {\n\t\t\t\t\t\tvar maxTicks;\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar tickOpts = me.options.ticks;\n\n\t\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\t\tmaxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.width / 50));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// The factor of 2 used to scale the font size has been experimentally determined.\n\t\t\t\t\t\t\tvar tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, defaults.global.defaultFontSize);\n\t\t\t\t\t\t\tmaxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.height / (2 * tickFontSize)));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn maxTicks;\n\t\t\t\t\t},\n\t\t\t\t\t// Called after the ticks are built. We need\n\t\t\t\t\thandleDirectionalChanges: function handleDirectionalChanges() {\n\t\t\t\t\t\tif (!this.isHorizontal()) {\n\t\t\t\t\t\t\t// We are in a vertical orientation. The top value is the highest. So reverse the array\n\t\t\t\t\t\t\tthis.ticks.reverse();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tgetLabelForIndex: function getLabelForIndex(index, datasetIndex) {\n\t\t\t\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t\t\t\t},\n\t\t\t\t\t// Utils\n\t\t\t\t\tgetPixelForValue: function getPixelForValue(value) {\n\t\t\t\t\t\t// This must be called after fit has been run so that\n\t\t\t\t\t\t// this.left, this.top, this.right, and this.bottom have been defined\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar start = me.start;\n\n\t\t\t\t\t\tvar rightValue = +me.getRightValue(value);\n\t\t\t\t\t\tvar pixel;\n\t\t\t\t\t\tvar range = me.end - start;\n\n\t\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\t\tpixel = me.left + me.width / range * (rightValue - start);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpixel = me.bottom - me.height / range * (rightValue - start);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn pixel;\n\t\t\t\t\t},\n\t\t\t\t\tgetValueForPixel: function getValueForPixel(pixel) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\t\t\t\tvar innerDimension = isHorizontal ? me.width : me.height;\n\t\t\t\t\t\tvar offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension;\n\t\t\t\t\t\treturn me.start + (me.end - me.start) * offset;\n\t\t\t\t\t},\n\t\t\t\t\tgetPixelForTick: function getPixelForTick(index) {\n\t\t\t\t\t\treturn this.getPixelForValue(this.ticksAsNumbers[index]);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tscaleService.registerScaleType('linear', LinearScale, defaultConfig);\n\t\t\t};\n\t\t}, { \"26\": 26, \"34\": 34, \"35\": 35, \"46\": 46 }], 56: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(46);\n\t\t\tvar Scale = require(33);\n\n\t\t\t/**\n * Generate a set of linear ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {Array<Number>} array of tick values\n */\n\t\t\tfunction generateTicks(generationOptions, dataRange) {\n\t\t\t\tvar ticks = [];\n\t\t\t\t// To get a \"nice\" value for the tick spacing, we will use the appropriately named\n\t\t\t\t// \"nice number\" algorithm. See http://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n\t\t\t\t// for details.\n\n\t\t\t\tvar factor;\n\t\t\t\tvar precision;\n\t\t\t\tvar spacing;\n\n\t\t\t\tif (generationOptions.stepSize && generationOptions.stepSize > 0) {\n\t\t\t\t\tspacing = generationOptions.stepSize;\n\t\t\t\t} else {\n\t\t\t\t\tvar niceRange = helpers.niceNum(dataRange.max - dataRange.min, false);\n\t\t\t\t\tspacing = helpers.niceNum(niceRange / (generationOptions.maxTicks - 1), true);\n\n\t\t\t\t\tprecision = generationOptions.precision;\n\t\t\t\t\tif (precision !== undefined) {\n\t\t\t\t\t\t// If the user specified a precision, round to that number of decimal places\n\t\t\t\t\t\tfactor = Math.pow(10, precision);\n\t\t\t\t\t\tspacing = Math.ceil(spacing * factor) / factor;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvar niceMin = Math.floor(dataRange.min / spacing) * spacing;\n\t\t\t\tvar niceMax = Math.ceil(dataRange.max / spacing) * spacing;\n\n\t\t\t\t// If min, max and stepSize is set and they make an evenly spaced scale use it.\n\t\t\t\tif (!helpers.isNullOrUndef(generationOptions.min) && !helpers.isNullOrUndef(generationOptions.max) && generationOptions.stepSize) {\n\t\t\t\t\t// If very close to our whole number, use it.\n\t\t\t\t\tif (helpers.almostWhole((generationOptions.max - generationOptions.min) / generationOptions.stepSize, spacing / 1000)) {\n\t\t\t\t\t\tniceMin = generationOptions.min;\n\t\t\t\t\t\tniceMax = generationOptions.max;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar numSpaces = (niceMax - niceMin) / spacing;\n\t\t\t\t// If very close to our rounded value, use it.\n\t\t\t\tif (helpers.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n\t\t\t\t\tnumSpaces = Math.round(numSpaces);\n\t\t\t\t} else {\n\t\t\t\t\tnumSpaces = Math.ceil(numSpaces);\n\t\t\t\t}\n\n\t\t\t\tprecision = 1;\n\t\t\t\tif (spacing < 1) {\n\t\t\t\t\tprecision = Math.pow(10, 1 - Math.floor(helpers.log10(spacing)));\n\t\t\t\t\tniceMin = Math.round(niceMin * precision) / precision;\n\t\t\t\t\tniceMax = Math.round(niceMax * precision) / precision;\n\t\t\t\t}\n\t\t\t\tticks.push(generationOptions.min !== undefined ? generationOptions.min : niceMin);\n\t\t\t\tfor (var j = 1; j < numSpaces; ++j) {\n\t\t\t\t\tticks.push(Math.round((niceMin + j * spacing) * precision) / precision);\n\t\t\t\t}\n\t\t\t\tticks.push(generationOptions.max !== undefined ? generationOptions.max : niceMax);\n\n\t\t\t\treturn ticks;\n\t\t\t}\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tvar noop = helpers.noop;\n\n\t\t\t\tChart.LinearScaleBase = Scale.extend({\n\t\t\t\t\tgetRightValue: function getRightValue(value) {\n\t\t\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\t\t\treturn +value;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn Scale.prototype.getRightValue.call(this, value);\n\t\t\t\t\t},\n\n\t\t\t\t\thandleTickRangeOptions: function handleTickRangeOptions() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\t\t\t\t// If we are forcing it to begin at 0, but 0 will already be rendered on the chart,\n\t\t\t\t\t\t// do nothing since that would make the chart weird. If the user really wants a weird chart\n\t\t\t\t\t\t// axis, they can manually override it\n\t\t\t\t\t\tif (tickOpts.beginAtZero) {\n\t\t\t\t\t\t\tvar minSign = helpers.sign(me.min);\n\t\t\t\t\t\t\tvar maxSign = helpers.sign(me.max);\n\n\t\t\t\t\t\t\tif (minSign < 0 && maxSign < 0) {\n\t\t\t\t\t\t\t\t// move the top up to 0\n\t\t\t\t\t\t\t\tme.max = 0;\n\t\t\t\t\t\t\t} else if (minSign > 0 && maxSign > 0) {\n\t\t\t\t\t\t\t\t// move the bottom down to 0\n\t\t\t\t\t\t\t\tme.min = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined;\n\t\t\t\t\t\tvar setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined;\n\n\t\t\t\t\t\tif (tickOpts.min !== undefined) {\n\t\t\t\t\t\t\tme.min = tickOpts.min;\n\t\t\t\t\t\t} else if (tickOpts.suggestedMin !== undefined) {\n\t\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\t\tme.min = tickOpts.suggestedMin;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tme.min = Math.min(me.min, tickOpts.suggestedMin);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (tickOpts.max !== undefined) {\n\t\t\t\t\t\t\tme.max = tickOpts.max;\n\t\t\t\t\t\t} else if (tickOpts.suggestedMax !== undefined) {\n\t\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\t\tme.max = tickOpts.suggestedMax;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tme.max = Math.max(me.max, tickOpts.suggestedMax);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (setMin !== setMax) {\n\t\t\t\t\t\t\t// We set the min or the max but not both.\n\t\t\t\t\t\t\t// So ensure that our range is good\n\t\t\t\t\t\t\t// Inverted or 0 length range can happen when\n\t\t\t\t\t\t\t// ticks.min is set, and no datasets are visible\n\t\t\t\t\t\t\tif (me.min >= me.max) {\n\t\t\t\t\t\t\t\tif (setMin) {\n\t\t\t\t\t\t\t\t\tme.max = me.min + 1;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tme.min = me.max - 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (me.min === me.max) {\n\t\t\t\t\t\t\tme.max++;\n\n\t\t\t\t\t\t\tif (!tickOpts.beginAtZero) {\n\t\t\t\t\t\t\t\tme.min--;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tgetTickLimit: noop,\n\t\t\t\t\thandleDirectionalChanges: noop,\n\n\t\t\t\t\tbuildTicks: function buildTicks() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\t\t\t\t// Figure out what the max number of ticks we can support it is based on the size of\n\t\t\t\t\t\t// the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n\t\t\t\t\t\t// We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n\t\t\t\t\t\t// the graph. Make sure we always have at least 2 ticks\n\t\t\t\t\t\tvar maxTicks = me.getTickLimit();\n\t\t\t\t\t\tmaxTicks = Math.max(2, maxTicks);\n\n\t\t\t\t\t\tvar numericGeneratorOptions = {\n\t\t\t\t\t\t\tmaxTicks: maxTicks,\n\t\t\t\t\t\t\tmin: tickOpts.min,\n\t\t\t\t\t\t\tmax: tickOpts.max,\n\t\t\t\t\t\t\tprecision: tickOpts.precision,\n\t\t\t\t\t\t\tstepSize: helpers.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize)\n\t\t\t\t\t\t};\n\t\t\t\t\t\tvar ticks = me.ticks = generateTicks(numericGeneratorOptions, me);\n\n\t\t\t\t\t\tme.handleDirectionalChanges();\n\n\t\t\t\t\t\t// At this point, we need to update our max and min given the tick values since we have expanded the\n\t\t\t\t\t\t// range of the scale\n\t\t\t\t\t\tme.max = helpers.max(ticks);\n\t\t\t\t\t\tme.min = helpers.min(ticks);\n\n\t\t\t\t\t\tif (tickOpts.reverse) {\n\t\t\t\t\t\t\tticks.reverse();\n\n\t\t\t\t\t\t\tme.start = me.max;\n\t\t\t\t\t\t\tme.end = me.min;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tme.start = me.min;\n\t\t\t\t\t\t\tme.end = me.max;\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tconvertTicksToLabels: function convertTicksToLabels() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tme.ticksAsNumbers = me.ticks.slice();\n\t\t\t\t\t\tme.zeroLineIndex = me.ticks.indexOf(0);\n\n\t\t\t\t\t\tScale.prototype.convertTicksToLabels.call(me);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t}, { \"33\": 33, \"46\": 46 }], 57: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar helpers = require(46);\n\t\t\tvar Scale = require(33);\n\t\t\tvar scaleService = require(34);\n\t\t\tvar Ticks = require(35);\n\n\t\t\t/**\n * Generate a set of logarithmic ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {Array<Number>} array of tick values\n */\n\t\t\tfunction generateTicks(generationOptions, dataRange) {\n\t\t\t\tvar ticks = [];\n\t\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\n\t\t\t\t// Figure out what the max number of ticks we can support it is based on the size of\n\t\t\t\t// the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n\t\t\t\t// We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n\t\t\t\t// the graph\n\t\t\t\tvar tickVal = valueOrDefault(generationOptions.min, Math.pow(10, Math.floor(helpers.log10(dataRange.min))));\n\n\t\t\t\tvar endExp = Math.floor(helpers.log10(dataRange.max));\n\t\t\t\tvar endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\n\t\t\t\tvar exp, significand;\n\n\t\t\t\tif (tickVal === 0) {\n\t\t\t\t\texp = Math.floor(helpers.log10(dataRange.minNotZero));\n\t\t\t\t\tsignificand = Math.floor(dataRange.minNotZero / Math.pow(10, exp));\n\n\t\t\t\t\tticks.push(tickVal);\n\t\t\t\t\ttickVal = significand * Math.pow(10, exp);\n\t\t\t\t} else {\n\t\t\t\t\texp = Math.floor(helpers.log10(tickVal));\n\t\t\t\t\tsignificand = Math.floor(tickVal / Math.pow(10, exp));\n\t\t\t\t}\n\t\t\t\tvar precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n\n\t\t\t\tdo {\n\t\t\t\t\tticks.push(tickVal);\n\n\t\t\t\t\t++significand;\n\t\t\t\t\tif (significand === 10) {\n\t\t\t\t\t\tsignificand = 1;\n\t\t\t\t\t\t++exp;\n\t\t\t\t\t\tprecision = exp >= 0 ? 1 : precision;\n\t\t\t\t\t}\n\n\t\t\t\t\ttickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision;\n\t\t\t\t} while (exp < endExp || exp === endExp && significand < endSignificand);\n\n\t\t\t\tvar lastTick = valueOrDefault(generationOptions.max, tickVal);\n\t\t\t\tticks.push(lastTick);\n\n\t\t\t\treturn ticks;\n\t\t\t}\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tvar defaultConfig = {\n\t\t\t\t\tposition: 'left',\n\n\t\t\t\t\t// label settings\n\t\t\t\t\tticks: {\n\t\t\t\t\t\tcallback: Ticks.formatters.logarithmic\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tvar LogarithmicScale = Scale.extend({\n\t\t\t\t\tdetermineDataLimits: function determineDataLimits() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar data = chart.data;\n\t\t\t\t\t\tvar datasets = data.datasets;\n\t\t\t\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\t\t\t\tfunction IDMatches(meta) {\n\t\t\t\t\t\t\treturn isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Calculate Range\n\t\t\t\t\t\tme.min = null;\n\t\t\t\t\t\tme.max = null;\n\t\t\t\t\t\tme.minNotZero = null;\n\n\t\t\t\t\t\tvar hasStacks = opts.stacked;\n\t\t\t\t\t\tif (hasStacks === undefined) {\n\t\t\t\t\t\t\thelpers.each(datasets, function (dataset, datasetIndex) {\n\t\t\t\t\t\t\t\tif (hasStacks) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && meta.stack !== undefined) {\n\t\t\t\t\t\t\t\t\thasStacks = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (opts.stacked || hasStacks) {\n\t\t\t\t\t\t\tvar valuesPerStack = {};\n\n\t\t\t\t\t\t\thelpers.each(datasets, function (dataset, datasetIndex) {\n\t\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\t\t\t\tvar key = [meta.type,\n\t\t\t\t\t\t\t\t// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n\t\t\t\t\t\t\t\topts.stacked === undefined && meta.stack === undefined ? datasetIndex : '', meta.stack].join('.');\n\n\t\t\t\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\t\t\t\tif (valuesPerStack[key] === undefined) {\n\t\t\t\t\t\t\t\t\t\tvaluesPerStack[key] = [];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\thelpers.each(dataset.data, function (rawValue, index) {\n\t\t\t\t\t\t\t\t\t\tvar values = valuesPerStack[key];\n\t\t\t\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\t\t\t\t// invalid, hidden and negative values are ignored\n\t\t\t\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden || value < 0) {\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tvalues[index] = values[index] || 0;\n\t\t\t\t\t\t\t\t\t\tvalues[index] += value;\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\thelpers.each(valuesPerStack, function (valuesForType) {\n\t\t\t\t\t\t\t\tif (valuesForType.length > 0) {\n\t\t\t\t\t\t\t\t\tvar minVal = helpers.min(valuesForType);\n\t\t\t\t\t\t\t\t\tvar maxVal = helpers.max(valuesForType);\n\t\t\t\t\t\t\t\t\tme.min = me.min === null ? minVal : Math.min(me.min, minVal);\n\t\t\t\t\t\t\t\t\tme.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thelpers.each(datasets, function (dataset, datasetIndex) {\n\t\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\t\t\t\thelpers.each(dataset.data, function (rawValue, index) {\n\t\t\t\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\t\t\t\t// invalid, hidden and negative values are ignored\n\t\t\t\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden || value < 0) {\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t\t\t\t} else if (value < me.min) {\n\t\t\t\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t\t\t\t} else if (value > me.max) {\n\t\t\t\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) {\n\t\t\t\t\t\t\t\t\t\t\tme.minNotZero = value;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Common base implementation to handle ticks.min, ticks.max\n\t\t\t\t\t\tthis.handleTickRangeOptions();\n\t\t\t\t\t},\n\t\t\t\t\thandleTickRangeOptions: function handleTickRangeOptions() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\t\tvar tickOpts = opts.ticks;\n\t\t\t\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\t\t\t\t\t\tvar DEFAULT_MIN = 1;\n\t\t\t\t\t\tvar DEFAULT_MAX = 10;\n\n\t\t\t\t\t\tme.min = valueOrDefault(tickOpts.min, me.min);\n\t\t\t\t\t\tme.max = valueOrDefault(tickOpts.max, me.max);\n\n\t\t\t\t\t\tif (me.min === me.max) {\n\t\t\t\t\t\t\tif (me.min !== 0 && me.min !== null) {\n\t\t\t\t\t\t\t\tme.min = Math.pow(10, Math.floor(helpers.log10(me.min)) - 1);\n\t\t\t\t\t\t\t\tme.max = Math.pow(10, Math.floor(helpers.log10(me.max)) + 1);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tme.min = DEFAULT_MIN;\n\t\t\t\t\t\t\t\tme.max = DEFAULT_MAX;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\tme.min = Math.pow(10, Math.floor(helpers.log10(me.max)) - 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\tme.max = me.min !== 0 ? Math.pow(10, Math.floor(helpers.log10(me.min)) + 1) : DEFAULT_MAX;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (me.minNotZero === null) {\n\t\t\t\t\t\t\tif (me.min > 0) {\n\t\t\t\t\t\t\t\tme.minNotZero = me.min;\n\t\t\t\t\t\t\t} else if (me.max < 1) {\n\t\t\t\t\t\t\t\tme.minNotZero = Math.pow(10, Math.floor(helpers.log10(me.max)));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tme.minNotZero = DEFAULT_MIN;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tbuildTicks: function buildTicks() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\t\tvar tickOpts = opts.ticks;\n\t\t\t\t\t\tvar reverse = !me.isHorizontal();\n\n\t\t\t\t\t\tvar generationOptions = {\n\t\t\t\t\t\t\tmin: tickOpts.min,\n\t\t\t\t\t\t\tmax: tickOpts.max\n\t\t\t\t\t\t};\n\t\t\t\t\t\tvar ticks = me.ticks = generateTicks(generationOptions, me);\n\n\t\t\t\t\t\t// At this point, we need to update our max and min given the tick values since we have expanded the\n\t\t\t\t\t\t// range of the scale\n\t\t\t\t\t\tme.max = helpers.max(ticks);\n\t\t\t\t\t\tme.min = helpers.min(ticks);\n\n\t\t\t\t\t\tif (tickOpts.reverse) {\n\t\t\t\t\t\t\treverse = !reverse;\n\t\t\t\t\t\t\tme.start = me.max;\n\t\t\t\t\t\t\tme.end = me.min;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tme.start = me.min;\n\t\t\t\t\t\t\tme.end = me.max;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (reverse) {\n\t\t\t\t\t\t\tticks.reverse();\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tconvertTicksToLabels: function convertTicksToLabels() {\n\t\t\t\t\t\tthis.tickValues = this.ticks.slice();\n\n\t\t\t\t\t\tScale.prototype.convertTicksToLabels.call(this);\n\t\t\t\t\t},\n\t\t\t\t\t// Get the correct tooltip label\n\t\t\t\t\tgetLabelForIndex: function getLabelForIndex(index, datasetIndex) {\n\t\t\t\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t\t\t\t},\n\t\t\t\t\tgetPixelForTick: function getPixelForTick(index) {\n\t\t\t\t\t\treturn this.getPixelForValue(this.tickValues[index]);\n\t\t\t\t\t},\n\t\t\t\t\t/**\n * Returns the value of the first tick.\n * @param {Number} value - The minimum not zero value.\n * @return {Number} The first tick value.\n * @private\n */\n\t\t\t\t\t_getFirstTickValue: function _getFirstTickValue(value) {\n\t\t\t\t\t\tvar exp = Math.floor(helpers.log10(value));\n\t\t\t\t\t\tvar significand = Math.floor(value / Math.pow(10, exp));\n\n\t\t\t\t\t\treturn significand * Math.pow(10, exp);\n\t\t\t\t\t},\n\t\t\t\t\tgetPixelForValue: function getPixelForValue(value) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar reverse = me.options.ticks.reverse;\n\t\t\t\t\t\tvar log10 = helpers.log10;\n\t\t\t\t\t\tvar firstTickValue = me._getFirstTickValue(me.minNotZero);\n\t\t\t\t\t\tvar offset = 0;\n\t\t\t\t\t\tvar innerDimension, pixel, start, end, sign;\n\n\t\t\t\t\t\tvalue = +me.getRightValue(value);\n\t\t\t\t\t\tif (reverse) {\n\t\t\t\t\t\t\tstart = me.end;\n\t\t\t\t\t\t\tend = me.start;\n\t\t\t\t\t\t\tsign = -1;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tstart = me.start;\n\t\t\t\t\t\t\tend = me.end;\n\t\t\t\t\t\t\tsign = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\t\tinnerDimension = me.width;\n\t\t\t\t\t\t\tpixel = reverse ? me.right : me.left;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tinnerDimension = me.height;\n\t\t\t\t\t\t\tsign *= -1; // invert, since the upper-left corner of the canvas is at pixel (0, 0)\n\t\t\t\t\t\t\tpixel = reverse ? me.top : me.bottom;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (value !== start) {\n\t\t\t\t\t\t\tif (start === 0) {\n\t\t\t\t\t\t\t\t// include zero tick\n\t\t\t\t\t\t\t\toffset = helpers.getValueOrDefault(me.options.ticks.fontSize, Chart.defaults.global.defaultFontSize);\n\t\t\t\t\t\t\t\tinnerDimension -= offset;\n\t\t\t\t\t\t\t\tstart = firstTickValue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (value !== 0) {\n\t\t\t\t\t\t\t\toffset += innerDimension / (log10(end) - log10(start)) * (log10(value) - log10(start));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tpixel += sign * offset;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn pixel;\n\t\t\t\t\t},\n\t\t\t\t\tgetValueForPixel: function getValueForPixel(pixel) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar reverse = me.options.ticks.reverse;\n\t\t\t\t\t\tvar log10 = helpers.log10;\n\t\t\t\t\t\tvar firstTickValue = me._getFirstTickValue(me.minNotZero);\n\t\t\t\t\t\tvar innerDimension, start, end, value;\n\n\t\t\t\t\t\tif (reverse) {\n\t\t\t\t\t\t\tstart = me.end;\n\t\t\t\t\t\t\tend = me.start;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tstart = me.start;\n\t\t\t\t\t\t\tend = me.end;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\t\t\tinnerDimension = me.width;\n\t\t\t\t\t\t\tvalue = reverse ? me.right - pixel : pixel - me.left;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tinnerDimension = me.height;\n\t\t\t\t\t\t\tvalue = reverse ? pixel - me.top : me.bottom - pixel;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (value !== start) {\n\t\t\t\t\t\t\tif (start === 0) {\n\t\t\t\t\t\t\t\t// include zero tick\n\t\t\t\t\t\t\t\tvar offset = helpers.getValueOrDefault(me.options.ticks.fontSize, Chart.defaults.global.defaultFontSize);\n\t\t\t\t\t\t\t\tvalue -= offset;\n\t\t\t\t\t\t\t\tinnerDimension -= offset;\n\t\t\t\t\t\t\t\tstart = firstTickValue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvalue *= log10(end) - log10(start);\n\t\t\t\t\t\t\tvalue /= innerDimension;\n\t\t\t\t\t\t\tvalue = Math.pow(10, log10(start) + value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn value;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tscaleService.registerScaleType('logarithmic', LogarithmicScale, defaultConfig);\n\t\t\t};\n\t\t}, { \"33\": 33, \"34\": 34, \"35\": 35, \"46\": 46 }], 58: [function (require, module, exports) {\n\t\t\t'use strict';\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar helpers = require(46);\n\t\t\tvar scaleService = require(34);\n\t\t\tvar Ticks = require(35);\n\n\t\t\tmodule.exports = function (Chart) {\n\n\t\t\t\tvar globalDefaults = defaults.global;\n\n\t\t\t\tvar defaultConfig = {\n\t\t\t\t\tdisplay: true,\n\n\t\t\t\t\t// Boolean - Whether to animate scaling the chart from the centre\n\t\t\t\t\tanimate: true,\n\t\t\t\t\tposition: 'chartArea',\n\n\t\t\t\t\tangleLines: {\n\t\t\t\t\t\tdisplay: true,\n\t\t\t\t\t\tcolor: 'rgba(0, 0, 0, 0.1)',\n\t\t\t\t\t\tlineWidth: 1\n\t\t\t\t\t},\n\n\t\t\t\t\tgridLines: {\n\t\t\t\t\t\tcircular: false\n\t\t\t\t\t},\n\n\t\t\t\t\t// label settings\n\t\t\t\t\tticks: {\n\t\t\t\t\t\t// Boolean - Show a backdrop to the scale label\n\t\t\t\t\t\tshowLabelBackdrop: true,\n\n\t\t\t\t\t\t// String - The colour of the label backdrop\n\t\t\t\t\t\tbackdropColor: 'rgba(255,255,255,0.75)',\n\n\t\t\t\t\t\t// Number - The backdrop padding above & below the label in pixels\n\t\t\t\t\t\tbackdropPaddingY: 2,\n\n\t\t\t\t\t\t// Number - The backdrop padding to the side of the label in pixels\n\t\t\t\t\t\tbackdropPaddingX: 2,\n\n\t\t\t\t\t\tcallback: Ticks.formatters.linear\n\t\t\t\t\t},\n\n\t\t\t\t\tpointLabels: {\n\t\t\t\t\t\t// Boolean - if true, show point labels\n\t\t\t\t\t\tdisplay: true,\n\n\t\t\t\t\t\t// Number - Point label font size in pixels\n\t\t\t\t\t\tfontSize: 10,\n\n\t\t\t\t\t\t// Function - Used to convert point labels\n\t\t\t\t\t\tcallback: function callback(label) {\n\t\t\t\t\t\t\treturn label;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tfunction getValueCount(scale) {\n\t\t\t\t\tvar opts = scale.options;\n\t\t\t\t\treturn opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0;\n\t\t\t\t}\n\n\t\t\t\tfunction getPointLabelFontOptions(scale) {\n\t\t\t\t\tvar pointLabelOptions = scale.options.pointLabels;\n\t\t\t\t\tvar fontSize = helpers.valueOrDefault(pointLabelOptions.fontSize, globalDefaults.defaultFontSize);\n\t\t\t\t\tvar fontStyle = helpers.valueOrDefault(pointLabelOptions.fontStyle, globalDefaults.defaultFontStyle);\n\t\t\t\t\tvar fontFamily = helpers.valueOrDefault(pointLabelOptions.fontFamily, globalDefaults.defaultFontFamily);\n\t\t\t\t\tvar font = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsize: fontSize,\n\t\t\t\t\t\tstyle: fontStyle,\n\t\t\t\t\t\tfamily: fontFamily,\n\t\t\t\t\t\tfont: font\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tfunction measureLabelSize(ctx, fontSize, label) {\n\t\t\t\t\tif (helpers.isArray(label)) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tw: helpers.longestText(ctx, ctx.font, label),\n\t\t\t\t\t\t\th: label.length * fontSize + (label.length - 1) * 1.5 * fontSize\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tw: ctx.measureText(label).width,\n\t\t\t\t\t\th: fontSize\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tfunction determineLimits(angle, pos, size, min, max) {\n\t\t\t\t\tif (angle === min || angle === max) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstart: pos - size / 2,\n\t\t\t\t\t\t\tend: pos + size / 2\n\t\t\t\t\t\t};\n\t\t\t\t\t} else if (angle < min || angle > max) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstart: pos - size - 5,\n\t\t\t\t\t\t\tend: pos\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstart: pos,\n\t\t\t\t\t\tend: pos + size + 5\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t/**\n * Helper function to fit a radial linear scale with point labels\n */\n\t\t\t\tfunction fitWithPointLabels(scale) {\n\t\t\t\t\t/*\n * Right, this is really confusing and there is a lot of maths going on here\n * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n *\n * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n *\n * Solution:\n *\n * We assume the radius of the polygon is half the size of the canvas at first\n * at each index we check if the text overlaps.\n *\n * Where it does, we store that angle and that index.\n *\n * After finding the largest index and angle we calculate how much we need to remove\n * from the shape radius to move the point inwards by that x.\n *\n * We average the left and right distances to get the maximum shape radius that can fit in the box\n * along with labels.\n *\n * Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n * on each side, removing that from the size, halving it and adding the left x protrusion width.\n *\n * This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n * and position it in the most space efficient manner\n *\n * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n */\n\n\t\t\t\t\tvar plFont = getPointLabelFontOptions(scale);\n\n\t\t\t\t\t// Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n\t\t\t\t\t// Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n\t\t\t\t\tvar largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n\t\t\t\t\tvar furthestLimits = {\n\t\t\t\t\t\tr: scale.width,\n\t\t\t\t\t\tl: 0,\n\t\t\t\t\t\tt: scale.height,\n\t\t\t\t\t\tb: 0\n\t\t\t\t\t};\n\t\t\t\t\tvar furthestAngles = {};\n\t\t\t\t\tvar i, textSize, pointPosition;\n\n\t\t\t\t\tscale.ctx.font = plFont.font;\n\t\t\t\t\tscale._pointLabelSizes = [];\n\n\t\t\t\t\tvar valueCount = getValueCount(scale);\n\t\t\t\t\tfor (i = 0; i < valueCount; i++) {\n\t\t\t\t\t\tpointPosition = scale.getPointPosition(i, largestPossibleRadius);\n\t\t\t\t\t\ttextSize = measureLabelSize(scale.ctx, plFont.size, scale.pointLabels[i] || '');\n\t\t\t\t\t\tscale._pointLabelSizes[i] = textSize;\n\n\t\t\t\t\t\t// Add quarter circle to make degree 0 mean top of circle\n\t\t\t\t\t\tvar angleRadians = scale.getIndexAngle(i);\n\t\t\t\t\t\tvar angle = helpers.toDegrees(angleRadians) % 360;\n\t\t\t\t\t\tvar hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n\t\t\t\t\t\tvar vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n\n\t\t\t\t\t\tif (hLimits.start < furthestLimits.l) {\n\t\t\t\t\t\t\tfurthestLimits.l = hLimits.start;\n\t\t\t\t\t\t\tfurthestAngles.l = angleRadians;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (hLimits.end > furthestLimits.r) {\n\t\t\t\t\t\t\tfurthestLimits.r = hLimits.end;\n\t\t\t\t\t\t\tfurthestAngles.r = angleRadians;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (vLimits.start < furthestLimits.t) {\n\t\t\t\t\t\t\tfurthestLimits.t = vLimits.start;\n\t\t\t\t\t\t\tfurthestAngles.t = angleRadians;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (vLimits.end > furthestLimits.b) {\n\t\t\t\t\t\t\tfurthestLimits.b = vLimits.end;\n\t\t\t\t\t\t\tfurthestAngles.b = angleRadians;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tscale.setReductions(largestPossibleRadius, furthestLimits, furthestAngles);\n\t\t\t\t}\n\n\t\t\t\t/**\n * Helper function to fit a radial linear scale with no point labels\n */\n\t\t\t\tfunction _fit(scale) {\n\t\t\t\t\tvar largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n\t\t\t\t\tscale.drawingArea = Math.round(largestPossibleRadius);\n\t\t\t\t\tscale.setCenterPoint(0, 0, 0, 0);\n\t\t\t\t}\n\n\t\t\t\tfunction getTextAlignForAngle(angle) {\n\t\t\t\t\tif (angle === 0 || angle === 180) {\n\t\t\t\t\t\treturn 'center';\n\t\t\t\t\t} else if (angle < 180) {\n\t\t\t\t\t\treturn 'left';\n\t\t\t\t\t}\n\n\t\t\t\t\treturn 'right';\n\t\t\t\t}\n\n\t\t\t\tfunction fillText(ctx, text, position, fontSize) {\n\t\t\t\t\tif (helpers.isArray(text)) {\n\t\t\t\t\t\tvar y = position.y;\n\t\t\t\t\t\tvar spacing = 1.5 * fontSize;\n\n\t\t\t\t\t\tfor (var i = 0; i < text.length; ++i) {\n\t\t\t\t\t\t\tctx.fillText(text[i], position.x, y);\n\t\t\t\t\t\t\ty += spacing;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tctx.fillText(text, position.x, position.y);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction adjustPointPositionForLabelHeight(angle, textSize, position) {\n\t\t\t\t\tif (angle === 90 || angle === 270) {\n\t\t\t\t\t\tposition.y -= textSize.h / 2;\n\t\t\t\t\t} else if (angle > 270 || angle < 90) {\n\t\t\t\t\t\tposition.y -= textSize.h;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction drawPointLabels(scale) {\n\t\t\t\t\tvar ctx = scale.ctx;\n\t\t\t\t\tvar opts = scale.options;\n\t\t\t\t\tvar angleLineOpts = opts.angleLines;\n\t\t\t\t\tvar pointLabelOpts = opts.pointLabels;\n\n\t\t\t\t\tctx.lineWidth = angleLineOpts.lineWidth;\n\t\t\t\t\tctx.strokeStyle = angleLineOpts.color;\n\n\t\t\t\t\tvar outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max);\n\n\t\t\t\t\t// Point Label Font\n\t\t\t\t\tvar plFont = getPointLabelFontOptions(scale);\n\n\t\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\t\tfor (var i = getValueCount(scale) - 1; i >= 0; i--) {\n\t\t\t\t\t\tif (angleLineOpts.display) {\n\t\t\t\t\t\t\tvar outerPosition = scale.getPointPosition(i, outerDistance);\n\t\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\t\tctx.moveTo(scale.xCenter, scale.yCenter);\n\t\t\t\t\t\t\tctx.lineTo(outerPosition.x, outerPosition.y);\n\t\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (pointLabelOpts.display) {\n\t\t\t\t\t\t\t// Extra 3px out for some label spacing\n\t\t\t\t\t\t\tvar pointLabelPosition = scale.getPointPosition(i, outerDistance + 5);\n\n\t\t\t\t\t\t\t// Keep this in loop since we may support array properties here\n\t\t\t\t\t\t\tvar pointLabelFontColor = helpers.valueAtIndexOrDefault(pointLabelOpts.fontColor, i, globalDefaults.defaultFontColor);\n\t\t\t\t\t\t\tctx.font = plFont.font;\n\t\t\t\t\t\t\tctx.fillStyle = pointLabelFontColor;\n\n\t\t\t\t\t\t\tvar angleRadians = scale.getIndexAngle(i);\n\t\t\t\t\t\t\tvar angle = helpers.toDegrees(angleRadians);\n\t\t\t\t\t\t\tctx.textAlign = getTextAlignForAngle(angle);\n\t\t\t\t\t\t\tadjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition);\n\t\t\t\t\t\t\tfillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.size);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction drawRadiusLine(scale, gridLineOpts, radius, index) {\n\t\t\t\t\tvar ctx = scale.ctx;\n\t\t\t\t\tctx.strokeStyle = helpers.valueAtIndexOrDefault(gridLineOpts.color, index - 1);\n\t\t\t\t\tctx.lineWidth = helpers.valueAtIndexOrDefault(gridLineOpts.lineWidth, index - 1);\n\n\t\t\t\t\tif (scale.options.gridLines.circular) {\n\t\t\t\t\t\t// Draw circular arcs between the points\n\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\tctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2);\n\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Draw straight lines connecting each index\n\t\t\t\t\t\tvar valueCount = getValueCount(scale);\n\n\t\t\t\t\t\tif (valueCount === 0) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\tvar pointPosition = scale.getPointPosition(0, radius);\n\t\t\t\t\t\tctx.moveTo(pointPosition.x, pointPosition.y);\n\n\t\t\t\t\t\tfor (var i = 1; i < valueCount; i++) {\n\t\t\t\t\t\t\tpointPosition = scale.getPointPosition(i, radius);\n\t\t\t\t\t\t\tctx.lineTo(pointPosition.x, pointPosition.y);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tctx.closePath();\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction numberOrZero(param) {\n\t\t\t\t\treturn helpers.isNumber(param) ? param : 0;\n\t\t\t\t}\n\n\t\t\t\tvar LinearRadialScale = Chart.LinearScaleBase.extend({\n\t\t\t\t\tsetDimensions: function setDimensions() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\t\tvar tickOpts = opts.ticks;\n\t\t\t\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\t\t\t\tme.width = me.maxWidth;\n\t\t\t\t\t\tme.height = me.maxHeight;\n\t\t\t\t\t\tme.xCenter = Math.round(me.width / 2);\n\t\t\t\t\t\tme.yCenter = Math.round(me.height / 2);\n\n\t\t\t\t\t\tvar minSize = helpers.min([me.height, me.width]);\n\t\t\t\t\t\tvar tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\t\t\t\tme.drawingArea = opts.display ? minSize / 2 - (tickFontSize / 2 + tickOpts.backdropPaddingY) : minSize / 2;\n\t\t\t\t\t},\n\t\t\t\t\tdetermineDataLimits: function determineDataLimits() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar min = Number.POSITIVE_INFINITY;\n\t\t\t\t\t\tvar max = Number.NEGATIVE_INFINITY;\n\n\t\t\t\t\t\thelpers.each(chart.data.datasets, function (dataset, datasetIndex) {\n\t\t\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex)) {\n\t\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\n\t\t\t\t\t\t\t\thelpers.each(dataset.data, function (rawValue, index) {\n\t\t\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tmin = Math.min(value, min);\n\t\t\t\t\t\t\t\t\tmax = Math.max(value, max);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tme.min = min === Number.POSITIVE_INFINITY ? 0 : min;\n\t\t\t\t\t\tme.max = max === Number.NEGATIVE_INFINITY ? 0 : max;\n\n\t\t\t\t\t\t// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n\t\t\t\t\t\tme.handleTickRangeOptions();\n\t\t\t\t\t},\n\t\t\t\t\tgetTickLimit: function getTickLimit() {\n\t\t\t\t\t\tvar tickOpts = this.options.ticks;\n\t\t\t\t\t\tvar tickFontSize = helpers.valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\t\t\t\treturn Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * tickFontSize)));\n\t\t\t\t\t},\n\t\t\t\t\tconvertTicksToLabels: function convertTicksToLabels() {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tChart.LinearScaleBase.prototype.convertTicksToLabels.call(me);\n\n\t\t\t\t\t\t// Point labels\n\t\t\t\t\t\tme.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me);\n\t\t\t\t\t},\n\t\t\t\t\tgetLabelForIndex: function getLabelForIndex(index, datasetIndex) {\n\t\t\t\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t\t\t\t},\n\t\t\t\t\tfit: function fit() {\n\t\t\t\t\t\tif (this.options.pointLabels.display) {\n\t\t\t\t\t\t\tfitWithPointLabels(this);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t_fit(this);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t/**\n * Set radius reductions and determine new radius and center point\n * @private\n */\n\t\t\t\t\tsetReductions: function setReductions(largestPossibleRadius, furthestLimits, furthestAngles) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l);\n\t\t\t\t\t\tvar radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r);\n\t\t\t\t\t\tvar radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t);\n\t\t\t\t\t\tvar radiusReductionBottom = -Math.max(furthestLimits.b - me.height, 0) / Math.cos(furthestAngles.b);\n\n\t\t\t\t\t\tradiusReductionLeft = numberOrZero(radiusReductionLeft);\n\t\t\t\t\t\tradiusReductionRight = numberOrZero(radiusReductionRight);\n\t\t\t\t\t\tradiusReductionTop = numberOrZero(radiusReductionTop);\n\t\t\t\t\t\tradiusReductionBottom = numberOrZero(radiusReductionBottom);\n\n\t\t\t\t\t\tme.drawingArea = Math.min(Math.round(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2), Math.round(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2));\n\t\t\t\t\t\tme.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom);\n\t\t\t\t\t},\n\t\t\t\t\tsetCenterPoint: function setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar maxRight = me.width - rightMovement - me.drawingArea;\n\t\t\t\t\t\tvar maxLeft = leftMovement + me.drawingArea;\n\t\t\t\t\t\tvar maxTop = topMovement + me.drawingArea;\n\t\t\t\t\t\tvar maxBottom = me.height - bottomMovement - me.drawingArea;\n\n\t\t\t\t\t\tme.xCenter = Math.round((maxLeft + maxRight) / 2 + me.left);\n\t\t\t\t\t\tme.yCenter = Math.round((maxTop + maxBottom) / 2 + me.top);\n\t\t\t\t\t},\n\n\t\t\t\t\tgetIndexAngle: function getIndexAngle(index) {\n\t\t\t\t\t\tvar angleMultiplier = Math.PI * 2 / getValueCount(this);\n\t\t\t\t\t\tvar startAngle = this.chart.options && this.chart.options.startAngle ? this.chart.options.startAngle : 0;\n\n\t\t\t\t\t\tvar startAngleRadians = startAngle * Math.PI * 2 / 360;\n\n\t\t\t\t\t\t// Start from the top instead of right, so remove a quarter of the circle\n\t\t\t\t\t\treturn index * angleMultiplier + startAngleRadians;\n\t\t\t\t\t},\n\t\t\t\t\tgetDistanceFromCenterForValue: function getDistanceFromCenterForValue(value) {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tif (value === null) {\n\t\t\t\t\t\t\treturn 0; // null always in center\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Take into account half font size + the yPadding of the top value\n\t\t\t\t\t\tvar scalingFactor = me.drawingArea / (me.max - me.min);\n\t\t\t\t\t\tif (me.options.ticks.reverse) {\n\t\t\t\t\t\t\treturn (me.max - value) * scalingFactor;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn (value - me.min) * scalingFactor;\n\t\t\t\t\t},\n\t\t\t\t\tgetPointPosition: function getPointPosition(index, distanceFromCenter) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar thisAngle = me.getIndexAngle(index) - Math.PI / 2;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tx: Math.round(Math.cos(thisAngle) * distanceFromCenter) + me.xCenter,\n\t\t\t\t\t\t\ty: Math.round(Math.sin(thisAngle) * distanceFromCenter) + me.yCenter\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t\tgetPointPositionForValue: function getPointPositionForValue(index, value) {\n\t\t\t\t\t\treturn this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n\t\t\t\t\t},\n\n\t\t\t\t\tgetBasePosition: function getBasePosition() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar min = me.min;\n\t\t\t\t\t\tvar max = me.max;\n\n\t\t\t\t\t\treturn me.getPointPositionForValue(0, me.beginAtZero ? 0 : min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0);\n\t\t\t\t\t},\n\n\t\t\t\t\tdraw: function draw() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar opts = me.options;\n\t\t\t\t\t\tvar gridLineOpts = opts.gridLines;\n\t\t\t\t\t\tvar tickOpts = opts.ticks;\n\t\t\t\t\t\tvar valueOrDefault = helpers.valueOrDefault;\n\n\t\t\t\t\t\tif (opts.display) {\n\t\t\t\t\t\t\tvar ctx = me.ctx;\n\t\t\t\t\t\t\tvar startAngle = this.getIndexAngle(0);\n\n\t\t\t\t\t\t\t// Tick Font\n\t\t\t\t\t\t\tvar tickFontSize = valueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\t\t\t\t\tvar tickFontStyle = valueOrDefault(tickOpts.fontStyle, globalDefaults.defaultFontStyle);\n\t\t\t\t\t\t\tvar tickFontFamily = valueOrDefault(tickOpts.fontFamily, globalDefaults.defaultFontFamily);\n\t\t\t\t\t\t\tvar tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);\n\n\t\t\t\t\t\t\thelpers.each(me.ticks, function (label, index) {\n\t\t\t\t\t\t\t\t// Don't draw a centre value (if it is minimum)\n\t\t\t\t\t\t\t\tif (index > 0 || tickOpts.reverse) {\n\t\t\t\t\t\t\t\t\tvar yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);\n\n\t\t\t\t\t\t\t\t\t// Draw circular lines around the scale\n\t\t\t\t\t\t\t\t\tif (gridLineOpts.display && index !== 0) {\n\t\t\t\t\t\t\t\t\t\tdrawRadiusLine(me, gridLineOpts, yCenterOffset, index);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (tickOpts.display) {\n\t\t\t\t\t\t\t\t\t\tvar tickFontColor = valueOrDefault(tickOpts.fontColor, globalDefaults.defaultFontColor);\n\t\t\t\t\t\t\t\t\t\tctx.font = tickLabelFont;\n\n\t\t\t\t\t\t\t\t\t\tctx.save();\n\t\t\t\t\t\t\t\t\t\tctx.translate(me.xCenter, me.yCenter);\n\t\t\t\t\t\t\t\t\t\tctx.rotate(startAngle);\n\n\t\t\t\t\t\t\t\t\t\tif (tickOpts.showLabelBackdrop) {\n\t\t\t\t\t\t\t\t\t\t\tvar labelWidth = ctx.measureText(label).width;\n\t\t\t\t\t\t\t\t\t\t\tctx.fillStyle = tickOpts.backdropColor;\n\t\t\t\t\t\t\t\t\t\t\tctx.fillRect(-labelWidth / 2 - tickOpts.backdropPaddingX, -yCenterOffset - tickFontSize / 2 - tickOpts.backdropPaddingY, labelWidth + tickOpts.backdropPaddingX * 2, tickFontSize + tickOpts.backdropPaddingY * 2);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tctx.textAlign = 'center';\n\t\t\t\t\t\t\t\t\t\tctx.textBaseline = 'middle';\n\t\t\t\t\t\t\t\t\t\tctx.fillStyle = tickFontColor;\n\t\t\t\t\t\t\t\t\t\tctx.fillText(label, 0, -yCenterOffset);\n\t\t\t\t\t\t\t\t\t\tctx.restore();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (opts.angleLines.display || opts.pointLabels.display) {\n\t\t\t\t\t\t\t\tdrawPointLabels(me);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tscaleService.registerScaleType('radialLinear', LinearRadialScale, defaultConfig);\n\t\t\t};\n\t\t}, { \"26\": 26, \"34\": 34, \"35\": 35, \"46\": 46 }], 59: [function (require, module, exports) {\n\t\t\t/* global window: false */\n\t\t\t'use strict';\n\n\t\t\tvar moment = require(1);\n\t\t\tmoment = typeof moment === 'function' ? moment : window.moment;\n\n\t\t\tvar defaults = require(26);\n\t\t\tvar helpers = require(46);\n\t\t\tvar Scale = require(33);\n\t\t\tvar scaleService = require(34);\n\n\t\t\t// Integer constants are from the ES6 spec.\n\t\t\tvar MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\n\t\t\tvar MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n\n\t\t\tvar INTERVALS = {\n\t\t\t\tmillisecond: {\n\t\t\t\t\tcommon: true,\n\t\t\t\t\tsize: 1,\n\t\t\t\t\tsteps: [1, 2, 5, 10, 20, 50, 100, 250, 500]\n\t\t\t\t},\n\t\t\t\tsecond: {\n\t\t\t\t\tcommon: true,\n\t\t\t\t\tsize: 1000,\n\t\t\t\t\tsteps: [1, 2, 5, 10, 15, 30]\n\t\t\t\t},\n\t\t\t\tminute: {\n\t\t\t\t\tcommon: true,\n\t\t\t\t\tsize: 60000,\n\t\t\t\t\tsteps: [1, 2, 5, 10, 15, 30]\n\t\t\t\t},\n\t\t\t\thour: {\n\t\t\t\t\tcommon: true,\n\t\t\t\t\tsize: 3600000,\n\t\t\t\t\tsteps: [1, 2, 3, 6, 12]\n\t\t\t\t},\n\t\t\t\tday: {\n\t\t\t\t\tcommon: true,\n\t\t\t\t\tsize: 86400000,\n\t\t\t\t\tsteps: [1, 2, 5]\n\t\t\t\t},\n\t\t\t\tweek: {\n\t\t\t\t\tcommon: false,\n\t\t\t\t\tsize: 604800000,\n\t\t\t\t\tsteps: [1, 2, 3, 4]\n\t\t\t\t},\n\t\t\t\tmonth: {\n\t\t\t\t\tcommon: true,\n\t\t\t\t\tsize: 2.628e9,\n\t\t\t\t\tsteps: [1, 2, 3]\n\t\t\t\t},\n\t\t\t\tquarter: {\n\t\t\t\t\tcommon: false,\n\t\t\t\t\tsize: 7.884e9,\n\t\t\t\t\tsteps: [1, 2, 3, 4]\n\t\t\t\t},\n\t\t\t\tyear: {\n\t\t\t\t\tcommon: true,\n\t\t\t\t\tsize: 3.154e10\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar UNITS = Object.keys(INTERVALS);\n\n\t\t\tfunction sorter(a, b) {\n\t\t\t\treturn a - b;\n\t\t\t}\n\n\t\t\tfunction arrayUnique(items) {\n\t\t\t\tvar hash = {};\n\t\t\t\tvar out = [];\n\t\t\t\tvar i, ilen, item;\n\n\t\t\t\tfor (i = 0, ilen = items.length; i < ilen; ++i) {\n\t\t\t\t\titem = items[i];\n\t\t\t\t\tif (!hash[item]) {\n\t\t\t\t\t\thash[item] = true;\n\t\t\t\t\t\tout.push(item);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn out;\n\t\t\t}\n\n\t\t\t/**\n * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n * extremity (left + width or top + height). Note that it would be more optimized to directly\n * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n *\n * @param {Number[]} timestamps - timestamps sorted from lowest to highest.\n * @param {String} distribution - If 'linear', timestamps will be spread linearly along the min\n * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}.\n * If 'series', timestamps will be positioned at the same distance from each other. In this\n * case, only timestamps that break the time linearity are registered, meaning that in the\n * best case, all timestamps are linear, the table contains only min and max.\n */\n\t\t\tfunction buildLookupTable(timestamps, min, max, distribution) {\n\t\t\t\tif (distribution === 'linear' || !timestamps.length) {\n\t\t\t\t\treturn [{ time: min, pos: 0 }, { time: max, pos: 1 }];\n\t\t\t\t}\n\n\t\t\t\tvar table = [];\n\t\t\t\tvar items = [min];\n\t\t\t\tvar i, ilen, prev, curr, next;\n\n\t\t\t\tfor (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n\t\t\t\t\tcurr = timestamps[i];\n\t\t\t\t\tif (curr > min && curr < max) {\n\t\t\t\t\t\titems.push(curr);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\titems.push(max);\n\n\t\t\t\tfor (i = 0, ilen = items.length; i < ilen; ++i) {\n\t\t\t\t\tnext = items[i + 1];\n\t\t\t\t\tprev = items[i - 1];\n\t\t\t\t\tcurr = items[i];\n\n\t\t\t\t\t// only add points that breaks the scale linearity\n\t\t\t\t\tif (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) {\n\t\t\t\t\t\ttable.push({ time: curr, pos: i / (ilen - 1) });\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn table;\n\t\t\t}\n\n\t\t\t// @see adapted from http://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/\n\t\t\tfunction lookup(table, key, value) {\n\t\t\t\tvar lo = 0;\n\t\t\t\tvar hi = table.length - 1;\n\t\t\t\tvar mid, i0, i1;\n\n\t\t\t\twhile (lo >= 0 && lo <= hi) {\n\t\t\t\t\tmid = lo + hi >> 1;\n\t\t\t\t\ti0 = table[mid - 1] || null;\n\t\t\t\t\ti1 = table[mid];\n\n\t\t\t\t\tif (!i0) {\n\t\t\t\t\t\t// given value is outside table (before first item)\n\t\t\t\t\t\treturn { lo: null, hi: i1 };\n\t\t\t\t\t} else if (i1[key] < value) {\n\t\t\t\t\t\tlo = mid + 1;\n\t\t\t\t\t} else if (i0[key] > value) {\n\t\t\t\t\t\thi = mid - 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn { lo: i0, hi: i1 };\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// given value is outside table (after last item)\n\t\t\t\treturn { lo: i1, hi: null };\n\t\t\t}\n\n\t\t\t/**\n * Linearly interpolates the given source `value` using the table items `skey` values and\n * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos')\n * returns the position for a timestamp equal to 42. If value is out of bounds, values at\n * index [0, 1] or [n - 1, n] are used for the interpolation.\n */\n\t\t\tfunction interpolate(table, skey, sval, tkey) {\n\t\t\t\tvar range = lookup(table, skey, sval);\n\n\t\t\t\t// Note: the lookup table ALWAYS contains at least 2 items (min and max)\n\t\t\t\tvar prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo;\n\t\t\t\tvar next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi;\n\n\t\t\t\tvar span = next[skey] - prev[skey];\n\t\t\t\tvar ratio = span ? (sval - prev[skey]) / span : 0;\n\t\t\t\tvar offset = (next[tkey] - prev[tkey]) * ratio;\n\n\t\t\t\treturn prev[tkey] + offset;\n\t\t\t}\n\n\t\t\t/**\n * Convert the given value to a moment object using the given time options.\n * @see http://momentjs.com/docs/#/parsing/\n */\n\t\t\tfunction momentify(value, options) {\n\t\t\t\tvar parser = options.parser;\n\t\t\t\tvar format = options.parser || options.format;\n\n\t\t\t\tif (typeof parser === 'function') {\n\t\t\t\t\treturn parser(value);\n\t\t\t\t}\n\n\t\t\t\tif (typeof value === 'string' && typeof format === 'string') {\n\t\t\t\t\treturn moment(value, format);\n\t\t\t\t}\n\n\t\t\t\tif (!(value instanceof moment)) {\n\t\t\t\t\tvalue = moment(value);\n\t\t\t\t}\n\n\t\t\t\tif (value.isValid()) {\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\n\t\t\t\t// Labels are in an incompatible moment format and no `parser` has been provided.\n\t\t\t\t// The user might still use the deprecated `format` option to convert his inputs.\n\t\t\t\tif (typeof format === 'function') {\n\t\t\t\t\treturn format(value);\n\t\t\t\t}\n\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\tfunction parse(input, scale) {\n\t\t\t\tif (helpers.isNullOrUndef(input)) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tvar options = scale.options.time;\n\t\t\t\tvar value = momentify(scale.getRightValue(input), options);\n\t\t\t\tif (!value.isValid()) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\tif (options.round) {\n\t\t\t\t\tvalue.startOf(options.round);\n\t\t\t\t}\n\n\t\t\t\treturn value.valueOf();\n\t\t\t}\n\n\t\t\t/**\n * Returns the number of unit to skip to be able to display up to `capacity` number of ticks\n * in `unit` for the given `min` / `max` range and respecting the interval steps constraints.\n */\n\t\t\tfunction determineStepSize(min, max, unit, capacity) {\n\t\t\t\tvar range = max - min;\n\t\t\t\tvar interval = INTERVALS[unit];\n\t\t\t\tvar milliseconds = interval.size;\n\t\t\t\tvar steps = interval.steps;\n\t\t\t\tvar i, ilen, factor;\n\n\t\t\t\tif (!steps) {\n\t\t\t\t\treturn Math.ceil(range / (capacity * milliseconds));\n\t\t\t\t}\n\n\t\t\t\tfor (i = 0, ilen = steps.length; i < ilen; ++i) {\n\t\t\t\t\tfactor = steps[i];\n\t\t\t\t\tif (Math.ceil(range / (milliseconds * factor)) <= capacity) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn factor;\n\t\t\t}\n\n\t\t\t/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n */\n\t\t\tfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n\t\t\t\tvar ilen = UNITS.length;\n\t\t\t\tvar i, interval, factor;\n\n\t\t\t\tfor (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n\t\t\t\t\tinterval = INTERVALS[UNITS[i]];\n\t\t\t\t\tfactor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER;\n\n\t\t\t\t\tif (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n\t\t\t\t\t\treturn UNITS[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn UNITS[ilen - 1];\n\t\t\t}\n\n\t\t\t/**\n * Figures out what unit to format a set of ticks with\n */\n\t\t\tfunction determineUnitForFormatting(ticks, minUnit, min, max) {\n\t\t\t\tvar duration = moment.duration(moment(max).diff(moment(min)));\n\t\t\t\tvar ilen = UNITS.length;\n\t\t\t\tvar i, unit;\n\n\t\t\t\tfor (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) {\n\t\t\t\t\tunit = UNITS[i];\n\t\t\t\t\tif (INTERVALS[unit].common && duration.as(unit) >= ticks.length) {\n\t\t\t\t\t\treturn unit;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n\t\t\t}\n\n\t\t\tfunction determineMajorUnit(unit) {\n\t\t\t\tfor (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n\t\t\t\t\tif (INTERVALS[UNITS[i]].common) {\n\t\t\t\t\t\treturn UNITS[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n * `minor` unit, aligned on the `major` unit and using the given scale time `options`.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n */\n\t\t\tfunction generate(min, max, capacity, options) {\n\t\t\t\tvar timeOpts = options.time;\n\t\t\t\tvar minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity);\n\t\t\t\tvar major = determineMajorUnit(minor);\n\t\t\t\tvar stepSize = helpers.valueOrDefault(timeOpts.stepSize, timeOpts.unitStepSize);\n\t\t\t\tvar weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n\t\t\t\tvar majorTicksEnabled = options.ticks.major.enabled;\n\t\t\t\tvar interval = INTERVALS[minor];\n\t\t\t\tvar first = moment(min);\n\t\t\t\tvar last = moment(max);\n\t\t\t\tvar ticks = [];\n\t\t\t\tvar time;\n\n\t\t\t\tif (!stepSize) {\n\t\t\t\t\tstepSize = determineStepSize(min, max, minor, capacity);\n\t\t\t\t}\n\n\t\t\t\t// For 'week' unit, handle the first day of week option\n\t\t\t\tif (weekday) {\n\t\t\t\t\tfirst = first.isoWeekday(weekday);\n\t\t\t\t\tlast = last.isoWeekday(weekday);\n\t\t\t\t}\n\n\t\t\t\t// Align first/last ticks on unit\n\t\t\t\tfirst = first.startOf(weekday ? 'day' : minor);\n\t\t\t\tlast = last.startOf(weekday ? 'day' : minor);\n\n\t\t\t\t// Make sure that the last tick include max\n\t\t\t\tif (last < max) {\n\t\t\t\t\tlast.add(1, minor);\n\t\t\t\t}\n\n\t\t\t\ttime = moment(first);\n\n\t\t\t\tif (majorTicksEnabled && major && !weekday && !timeOpts.round) {\n\t\t\t\t\t// Align the first tick on the previous `minor` unit aligned on the `major` unit:\n\t\t\t\t\t// we first aligned time on the previous `major` unit then add the number of full\n\t\t\t\t\t// stepSize there is between first and the previous major time.\n\t\t\t\t\ttime.startOf(major);\n\t\t\t\t\ttime.add(~~((first - time) / (interval.size * stepSize)) * stepSize, minor);\n\t\t\t\t}\n\n\t\t\t\tfor (; time < last; time.add(stepSize, minor)) {\n\t\t\t\t\tticks.push(+time);\n\t\t\t\t}\n\n\t\t\t\tticks.push(+time);\n\n\t\t\t\treturn ticks;\n\t\t\t}\n\n\t\t\t/**\n * Returns the right and left offsets from edges in the form of {left, right}.\n * Offsets are added when the `offset` option is true.\n */\n\t\t\tfunction computeOffsets(table, ticks, min, max, options) {\n\t\t\t\tvar left = 0;\n\t\t\t\tvar right = 0;\n\t\t\t\tvar upper, lower;\n\n\t\t\t\tif (options.offset && ticks.length) {\n\t\t\t\t\tif (!options.time.min) {\n\t\t\t\t\t\tupper = ticks.length > 1 ? ticks[1] : max;\n\t\t\t\t\t\tlower = ticks[0];\n\t\t\t\t\t\tleft = (interpolate(table, 'time', upper, 'pos') - interpolate(table, 'time', lower, 'pos')) / 2;\n\t\t\t\t\t}\n\t\t\t\t\tif (!options.time.max) {\n\t\t\t\t\t\tupper = ticks[ticks.length - 1];\n\t\t\t\t\t\tlower = ticks.length > 1 ? ticks[ticks.length - 2] : min;\n\t\t\t\t\t\tright = (interpolate(table, 'time', upper, 'pos') - interpolate(table, 'time', lower, 'pos')) / 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn { left: left, right: right };\n\t\t\t}\n\n\t\t\tfunction ticksFromTimestamps(values, majorUnit) {\n\t\t\t\tvar ticks = [];\n\t\t\t\tvar i, ilen, value, major;\n\n\t\t\t\tfor (i = 0, ilen = values.length; i < ilen; ++i) {\n\t\t\t\t\tvalue = values[i];\n\t\t\t\t\tmajor = majorUnit ? value === +moment(value).startOf(majorUnit) : false;\n\n\t\t\t\t\tticks.push({\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tmajor: major\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn ticks;\n\t\t\t}\n\n\t\t\tfunction determineLabelFormat(data, timeOpts) {\n\t\t\t\tvar i, momentDate, hasTime;\n\t\t\t\tvar ilen = data.length;\n\n\t\t\t\t// find the label with the most parts (milliseconds, minutes, etc.)\n\t\t\t\t// format all labels with the same level of detail as the most specific label\n\t\t\t\tfor (i = 0; i < ilen; i++) {\n\t\t\t\t\tmomentDate = momentify(data[i], timeOpts);\n\t\t\t\t\tif (momentDate.millisecond() !== 0) {\n\t\t\t\t\t\treturn 'MMM D, YYYY h:mm:ss.SSS a';\n\t\t\t\t\t}\n\t\t\t\t\tif (momentDate.second() !== 0 || momentDate.minute() !== 0 || momentDate.hour() !== 0) {\n\t\t\t\t\t\thasTime = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (hasTime) {\n\t\t\t\t\treturn 'MMM D, YYYY h:mm:ss a';\n\t\t\t\t}\n\t\t\t\treturn 'MMM D, YYYY';\n\t\t\t}\n\n\t\t\tmodule.exports = function () {\n\n\t\t\t\tvar defaultConfig = {\n\t\t\t\t\tposition: 'bottom',\n\n\t\t\t\t\t/**\n * Data distribution along the scale:\n * - 'linear': data are spread according to their time (distances can vary),\n * - 'series': data are spread at the same distance from each other.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n\t\t\t\t\tdistribution: 'linear',\n\n\t\t\t\t\t/**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 2.7.0\n */\n\t\t\t\t\tbounds: 'data',\n\n\t\t\t\t\ttime: {\n\t\t\t\t\t\tparser: false, // false == a pattern string from http://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment\n\t\t\t\t\t\tformat: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from http://momentjs.com/docs/#/parsing/string-format/\n\t\t\t\t\t\tunit: false, // false == automatic or override with week, month, year, etc.\n\t\t\t\t\t\tround: false, // none, or override with week, month, year, etc.\n\t\t\t\t\t\tdisplayFormat: false, // DEPRECATED\n\t\t\t\t\t\tisoWeekday: false, // override week start day - see http://momentjs.com/docs/#/get-set/iso-weekday/\n\t\t\t\t\t\tminUnit: 'millisecond',\n\n\t\t\t\t\t\t// defaults to unit's corresponding unitFormat below or override using pattern string from http://momentjs.com/docs/#/displaying/format/\n\t\t\t\t\t\tdisplayFormats: {\n\t\t\t\t\t\t\tmillisecond: 'h:mm:ss.SSS a', // 11:20:01.123 AM,\n\t\t\t\t\t\t\tsecond: 'h:mm:ss a', // 11:20:01 AM\n\t\t\t\t\t\t\tminute: 'h:mm a', // 11:20 AM\n\t\t\t\t\t\t\thour: 'hA', // 5PM\n\t\t\t\t\t\t\tday: 'MMM D', // Sep 4\n\t\t\t\t\t\t\tweek: 'll', // Week 46, or maybe \"[W]WW - YYYY\" ?\n\t\t\t\t\t\t\tmonth: 'MMM YYYY', // Sept 2015\n\t\t\t\t\t\t\tquarter: '[Q]Q - YYYY', // Q3\n\t\t\t\t\t\t\tyear: 'YYYY' // 2015\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tticks: {\n\t\t\t\t\t\tautoSkip: false,\n\n\t\t\t\t\t\t/**\n * Ticks generation input values:\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n\t\t\t\t\t\tsource: 'auto',\n\n\t\t\t\t\t\tmajor: {\n\t\t\t\t\t\t\tenabled: false\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tvar TimeScale = Scale.extend({\n\t\t\t\t\tinitialize: function initialize() {\n\t\t\t\t\t\tif (!moment) {\n\t\t\t\t\t\t\tthrow new Error('Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.mergeTicksOptions();\n\n\t\t\t\t\t\tScale.prototype.initialize.call(this);\n\t\t\t\t\t},\n\n\t\t\t\t\tupdate: function update() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar options = me.options;\n\n\t\t\t\t\t\t// DEPRECATIONS: output a message only one time per update\n\t\t\t\t\t\tif (options.time && options.time.format) {\n\t\t\t\t\t\t\tconsole.warn('options.time.format is deprecated and replaced by options.time.parser.');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn Scale.prototype.update.apply(me, arguments);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Allows data to be referenced via 't' attribute\n */\n\t\t\t\t\tgetRightValue: function getRightValue(rawValue) {\n\t\t\t\t\t\tif (rawValue && rawValue.t !== undefined) {\n\t\t\t\t\t\t\trawValue = rawValue.t;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn Scale.prototype.getRightValue.call(this, rawValue);\n\t\t\t\t\t},\n\n\t\t\t\t\tdetermineDataLimits: function determineDataLimits() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar chart = me.chart;\n\t\t\t\t\t\tvar timeOpts = me.options.time;\n\t\t\t\t\t\tvar unit = timeOpts.unit || 'day';\n\t\t\t\t\t\tvar min = MAX_INTEGER;\n\t\t\t\t\t\tvar max = MIN_INTEGER;\n\t\t\t\t\t\tvar timestamps = [];\n\t\t\t\t\t\tvar datasets = [];\n\t\t\t\t\t\tvar labels = [];\n\t\t\t\t\t\tvar i, j, ilen, jlen, data, timestamp;\n\n\t\t\t\t\t\t// Convert labels to timestamps\n\t\t\t\t\t\tfor (i = 0, ilen = chart.data.labels.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tlabels.push(parse(chart.data.labels[i], me));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Convert data to timestamps\n\t\t\t\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\t\t\t\tif (chart.isDatasetVisible(i)) {\n\t\t\t\t\t\t\t\tdata = chart.data.datasets[i].data;\n\n\t\t\t\t\t\t\t\t// Let's consider that all data have the same format.\n\t\t\t\t\t\t\t\tif (helpers.isObject(data[0])) {\n\t\t\t\t\t\t\t\t\tdatasets[i] = [];\n\n\t\t\t\t\t\t\t\t\tfor (j = 0, jlen = data.length; j < jlen; ++j) {\n\t\t\t\t\t\t\t\t\t\ttimestamp = parse(data[j], me);\n\t\t\t\t\t\t\t\t\t\ttimestamps.push(timestamp);\n\t\t\t\t\t\t\t\t\t\tdatasets[i][j] = timestamp;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\ttimestamps.push.apply(timestamps, labels);\n\t\t\t\t\t\t\t\t\tdatasets[i] = labels.slice(0);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdatasets[i] = [];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (labels.length) {\n\t\t\t\t\t\t\t// Sort labels **after** data have been converted\n\t\t\t\t\t\t\tlabels = arrayUnique(labels).sort(sorter);\n\t\t\t\t\t\t\tmin = Math.min(min, labels[0]);\n\t\t\t\t\t\t\tmax = Math.max(max, labels[labels.length - 1]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (timestamps.length) {\n\t\t\t\t\t\t\ttimestamps = arrayUnique(timestamps).sort(sorter);\n\t\t\t\t\t\t\tmin = Math.min(min, timestamps[0]);\n\t\t\t\t\t\t\tmax = Math.max(max, timestamps[timestamps.length - 1]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmin = parse(timeOpts.min, me) || min;\n\t\t\t\t\t\tmax = parse(timeOpts.max, me) || max;\n\n\t\t\t\t\t\t// In case there is no valid min/max, set limits based on unit time option\n\t\t\t\t\t\tmin = min === MAX_INTEGER ? +moment().startOf(unit) : min;\n\t\t\t\t\t\tmax = max === MIN_INTEGER ? +moment().endOf(unit) + 1 : max;\n\n\t\t\t\t\t\t// Make sure that max is strictly higher than min (required by the lookup table)\n\t\t\t\t\t\tme.min = Math.min(min, max);\n\t\t\t\t\t\tme.max = Math.max(min + 1, max);\n\n\t\t\t\t\t\t// PRIVATE\n\t\t\t\t\t\tme._horizontal = me.isHorizontal();\n\t\t\t\t\t\tme._table = [];\n\t\t\t\t\t\tme._timestamps = {\n\t\t\t\t\t\t\tdata: timestamps,\n\t\t\t\t\t\t\tdatasets: datasets,\n\t\t\t\t\t\t\tlabels: labels\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\n\t\t\t\t\tbuildTicks: function buildTicks() {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar min = me.min;\n\t\t\t\t\t\tvar max = me.max;\n\t\t\t\t\t\tvar options = me.options;\n\t\t\t\t\t\tvar timeOpts = options.time;\n\t\t\t\t\t\tvar timestamps = [];\n\t\t\t\t\t\tvar ticks = [];\n\t\t\t\t\t\tvar i, ilen, timestamp;\n\n\t\t\t\t\t\tswitch (options.ticks.source) {\n\t\t\t\t\t\t\tcase 'data':\n\t\t\t\t\t\t\t\ttimestamps = me._timestamps.data;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'labels':\n\t\t\t\t\t\t\t\ttimestamps = me._timestamps.labels;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'auto':\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\ttimestamps = generate(min, max, me.getLabelCapacity(min), options);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (options.bounds === 'ticks' && timestamps.length) {\n\t\t\t\t\t\t\tmin = timestamps[0];\n\t\t\t\t\t\t\tmax = timestamps[timestamps.length - 1];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Enforce limits with user min/max options\n\t\t\t\t\t\tmin = parse(timeOpts.min, me) || min;\n\t\t\t\t\t\tmax = parse(timeOpts.max, me) || max;\n\n\t\t\t\t\t\t// Remove ticks outside the min/max range\n\t\t\t\t\t\tfor (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n\t\t\t\t\t\t\ttimestamp = timestamps[i];\n\t\t\t\t\t\t\tif (timestamp >= min && timestamp <= max) {\n\t\t\t\t\t\t\t\tticks.push(timestamp);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tme.min = min;\n\t\t\t\t\t\tme.max = max;\n\n\t\t\t\t\t\t// PRIVATE\n\t\t\t\t\t\tme._unit = timeOpts.unit || determineUnitForFormatting(ticks, timeOpts.minUnit, me.min, me.max);\n\t\t\t\t\t\tme._majorUnit = determineMajorUnit(me._unit);\n\t\t\t\t\t\tme._table = buildLookupTable(me._timestamps.data, min, max, options.distribution);\n\t\t\t\t\t\tme._offsets = computeOffsets(me._table, ticks, min, max, options);\n\t\t\t\t\t\tme._labelFormat = determineLabelFormat(me._timestamps.data, timeOpts);\n\n\t\t\t\t\t\treturn ticksFromTimestamps(ticks, me._majorUnit);\n\t\t\t\t\t},\n\n\t\t\t\t\tgetLabelForIndex: function getLabelForIndex(index, datasetIndex) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar data = me.chart.data;\n\t\t\t\t\t\tvar timeOpts = me.options.time;\n\t\t\t\t\t\tvar label = data.labels && index < data.labels.length ? data.labels[index] : '';\n\t\t\t\t\t\tvar value = data.datasets[datasetIndex].data[index];\n\n\t\t\t\t\t\tif (helpers.isObject(value)) {\n\t\t\t\t\t\t\tlabel = me.getRightValue(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (timeOpts.tooltipFormat) {\n\t\t\t\t\t\t\treturn momentify(label, timeOpts).format(timeOpts.tooltipFormat);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (typeof label === 'string') {\n\t\t\t\t\t\t\treturn label;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn momentify(label, timeOpts).format(me._labelFormat);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Function to format an individual tick mark\n * @private\n */\n\t\t\t\t\ttickFormatFunction: function tickFormatFunction(tick, index, ticks, formatOverride) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar options = me.options;\n\t\t\t\t\t\tvar time = tick.valueOf();\n\t\t\t\t\t\tvar formats = options.time.displayFormats;\n\t\t\t\t\t\tvar minorFormat = formats[me._unit];\n\t\t\t\t\t\tvar majorUnit = me._majorUnit;\n\t\t\t\t\t\tvar majorFormat = formats[majorUnit];\n\t\t\t\t\t\tvar majorTime = tick.clone().startOf(majorUnit).valueOf();\n\t\t\t\t\t\tvar majorTickOpts = options.ticks.major;\n\t\t\t\t\t\tvar major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime;\n\t\t\t\t\t\tvar label = tick.format(formatOverride ? formatOverride : major ? majorFormat : minorFormat);\n\t\t\t\t\t\tvar tickOpts = major ? majorTickOpts : options.ticks.minor;\n\t\t\t\t\t\tvar formatter = helpers.valueOrDefault(tickOpts.callback, tickOpts.userCallback);\n\n\t\t\t\t\t\treturn formatter ? formatter(label, index, ticks) : label;\n\t\t\t\t\t},\n\n\t\t\t\t\tconvertTicksToLabels: function convertTicksToLabels(ticks) {\n\t\t\t\t\t\tvar labels = [];\n\t\t\t\t\t\tvar i, ilen;\n\n\t\t\t\t\t\tfor (i = 0, ilen = ticks.length; i < ilen; ++i) {\n\t\t\t\t\t\t\tlabels.push(this.tickFormatFunction(moment(ticks[i].value), i, ticks));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn labels;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tgetPixelForOffset: function getPixelForOffset(time) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar size = me._horizontal ? me.width : me.height;\n\t\t\t\t\t\tvar start = me._horizontal ? me.left : me.top;\n\t\t\t\t\t\tvar pos = interpolate(me._table, 'time', time, 'pos');\n\n\t\t\t\t\t\treturn start + size * (me._offsets.left + pos) / (me._offsets.left + 1 + me._offsets.right);\n\t\t\t\t\t},\n\n\t\t\t\t\tgetPixelForValue: function getPixelForValue(value, index, datasetIndex) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar time = null;\n\n\t\t\t\t\t\tif (index !== undefined && datasetIndex !== undefined) {\n\t\t\t\t\t\t\ttime = me._timestamps.datasets[datasetIndex][index];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (time === null) {\n\t\t\t\t\t\t\ttime = parse(value, me);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (time !== null) {\n\t\t\t\t\t\t\treturn me.getPixelForOffset(time);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\n\t\t\t\t\tgetPixelForTick: function getPixelForTick(index) {\n\t\t\t\t\t\tvar ticks = this.getTicks();\n\t\t\t\t\t\treturn index >= 0 && index < ticks.length ? this.getPixelForOffset(ticks[index].value) : null;\n\t\t\t\t\t},\n\n\t\t\t\t\tgetValueForPixel: function getValueForPixel(pixel) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar size = me._horizontal ? me.width : me.height;\n\t\t\t\t\t\tvar start = me._horizontal ? me.left : me.top;\n\t\t\t\t\t\tvar pos = (size ? (pixel - start) / size : 0) * (me._offsets.left + 1 + me._offsets.left) - me._offsets.right;\n\t\t\t\t\t\tvar time = interpolate(me._table, 'pos', pos, 'time');\n\n\t\t\t\t\t\treturn moment(time);\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * Crude approximation of what the label width might be\n * @private\n */\n\t\t\t\t\tgetLabelWidth: function getLabelWidth(label) {\n\t\t\t\t\t\tvar me = this;\n\t\t\t\t\t\tvar ticksOpts = me.options.ticks;\n\t\t\t\t\t\tvar tickLabelWidth = me.ctx.measureText(label).width;\n\t\t\t\t\t\tvar angle = helpers.toRadians(ticksOpts.maxRotation);\n\t\t\t\t\t\tvar cosRotation = Math.cos(angle);\n\t\t\t\t\t\tvar sinRotation = Math.sin(angle);\n\t\t\t\t\t\tvar tickFontSize = helpers.valueOrDefault(ticksOpts.fontSize, defaults.global.defaultFontSize);\n\n\t\t\t\t\t\treturn tickLabelWidth * cosRotation + tickFontSize * sinRotation;\n\t\t\t\t\t},\n\n\t\t\t\t\t/**\n * @private\n */\n\t\t\t\t\tgetLabelCapacity: function getLabelCapacity(exampleTime) {\n\t\t\t\t\t\tvar me = this;\n\n\t\t\t\t\t\tvar formatOverride = me.options.time.displayFormats.millisecond; // Pick the longest format for guestimation\n\n\t\t\t\t\t\tvar exampleLabel = me.tickFormatFunction(moment(exampleTime), 0, [], formatOverride);\n\t\t\t\t\t\tvar tickLabelWidth = me.getLabelWidth(exampleLabel);\n\t\t\t\t\t\tvar innerWidth = me.isHorizontal() ? me.width : me.height;\n\n\t\t\t\t\t\tvar capacity = Math.floor(innerWidth / tickLabelWidth);\n\t\t\t\t\t\treturn capacity > 0 ? capacity : 1;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tscaleService.registerScaleType('time', TimeScale, defaultConfig);\n\t\t\t};\n\t\t}, { \"1\": 1, \"26\": 26, \"33\": 33, \"34\": 34, \"46\": 46 }] }, {}, [7])(7);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvQ2hhcnQuanM/NDA0ZSJdLCJuYW1lcyI6WyJmIiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImciLCJ3aW5kb3ciLCJnbG9iYWwiLCJzZWxmIiwiQ2hhcnQiLCJyIiwiZSIsIm4iLCJ0IiwibyIsImkiLCJjIiwicmVxdWlyZSIsInUiLCJhIiwiRXJyb3IiLCJjb2RlIiwicCIsImNhbGwiLCJsZW5ndGgiLCJjb2xvck5hbWVzIiwiZ2V0UmdiYSIsImdldEhzbGEiLCJnZXRSZ2IiLCJnZXRIc2wiLCJnZXRId2IiLCJnZXRBbHBoYSIsImhleFN0cmluZyIsInJnYlN0cmluZyIsInJnYmFTdHJpbmciLCJwZXJjZW50U3RyaW5nIiwicGVyY2VudGFTdHJpbmciLCJoc2xTdHJpbmciLCJoc2xhU3RyaW5nIiwiaHdiU3RyaW5nIiwia2V5d29yZCIsInN0cmluZyIsImFiYnIiLCJoZXgiLCJyZ2JhIiwicGVyIiwicmdiIiwibWF0Y2giLCJwYXJzZUludCIsInNsaWNlIiwicGFyc2VGbG9hdCIsIk1hdGgiLCJyb3VuZCIsInNjYWxlIiwiaHNsIiwiYWxwaGEiLCJoIiwicyIsImwiLCJpc05hTiIsImh3YiIsInciLCJiIiwiaHNsYSIsInZhbHMiLCJoZXhEb3VibGUiLCJ1bmRlZmluZWQiLCJyZXZlcnNlTmFtZXMiLCJudW0iLCJtaW4iLCJtYXgiLCJzdHIiLCJ0b1N0cmluZyIsInRvVXBwZXJDYXNlIiwibmFtZSIsImNvbnZlcnQiLCJDb2xvciIsIm9iaiIsInZhbGlkIiwidmFsdWVzIiwiaHN2IiwiY215ayIsInNldFZhbHVlcyIsInJlZCIsImxpZ2h0bmVzcyIsInYiLCJ2YWx1ZSIsIndoaXRlbmVzcyIsImN5YW4iLCJwcm90b3R5cGUiLCJpc1ZhbGlkIiwic2V0U3BhY2UiLCJhcmd1bWVudHMiLCJyZ2JBcnJheSIsImhzbEFycmF5IiwiaHN2QXJyYXkiLCJod2JBcnJheSIsImNvbmNhdCIsImNteWtBcnJheSIsInJnYmFBcnJheSIsImhzbGFBcnJheSIsInZhbCIsInNldENoYW5uZWwiLCJncmVlbiIsImJsdWUiLCJodWUiLCJzYXR1cmF0aW9uIiwic2F0dXJhdGlvbnYiLCJibGFja25lc3MiLCJtYWdlbnRhIiwieWVsbG93IiwiYmxhY2siLCJyZ2JOdW1iZXIiLCJsdW1pbm9zaXR5IiwibHVtIiwiY2hhbiIsInBvdyIsImNvbnRyYXN0IiwiY29sb3IyIiwibHVtMSIsImx1bTIiLCJsZXZlbCIsImNvbnRyYXN0UmF0aW8iLCJkYXJrIiwieWlxIiwibGlnaHQiLCJuZWdhdGUiLCJsaWdodGVuIiwicmF0aW8iLCJkYXJrZW4iLCJzYXR1cmF0ZSIsImRlc2F0dXJhdGUiLCJ3aGl0ZW4iLCJibGFja2VuIiwiZ3JleXNjYWxlIiwiY2xlYXJlciIsIm9wYXF1ZXIiLCJyb3RhdGUiLCJkZWdyZWVzIiwibWl4IiwibWl4aW5Db2xvciIsIndlaWdodCIsImNvbG9yMSIsIncxIiwidzIiLCJ0b0pTT04iLCJjbG9uZSIsInJlc3VsdCIsInNvdXJjZSIsInRhcmdldCIsInR5cGUiLCJwcm9wIiwiaGFzT3duUHJvcGVydHkiLCJjb25zb2xlIiwiZXJyb3IiLCJzcGFjZXMiLCJtYXhlcyIsImdldFZhbHVlcyIsInNwYWNlIiwiY2hhckF0IiwiY2hhbnMiLCJjYXBwZWQiLCJzbmFtZSIsImFyZ3MiLCJBcnJheSIsImluZGV4Iiwic3ZhbHVlcyIsInJnYjJoc2wiLCJyZ2IyaHN2IiwicmdiMmh3YiIsInJnYjJjbXlrIiwicmdiMmtleXdvcmQiLCJyZ2IyeHl6IiwicmdiMmxhYiIsInJnYjJsY2giLCJoc2wycmdiIiwiaHNsMmhzdiIsImhzbDJod2IiLCJoc2wyY215ayIsImhzbDJrZXl3b3JkIiwiaHN2MnJnYiIsImhzdjJoc2wiLCJoc3YyaHdiIiwiaHN2MmNteWsiLCJoc3Yya2V5d29yZCIsImh3YjJyZ2IiLCJod2IyaHNsIiwiaHdiMmhzdiIsImh3YjJjbXlrIiwiaHdiMmtleXdvcmQiLCJjbXlrMnJnYiIsImNteWsyaHNsIiwiY215azJoc3YiLCJjbXlrMmh3YiIsImNteWsya2V5d29yZCIsImtleXdvcmQycmdiIiwia2V5d29yZDJoc2wiLCJrZXl3b3JkMmhzdiIsImtleXdvcmQyaHdiIiwia2V5d29yZDJjbXlrIiwia2V5d29yZDJsYWIiLCJrZXl3b3JkMnh5eiIsInh5ejJyZ2IiLCJ4eXoybGFiIiwieHl6MmxjaCIsImxhYjJ4eXoiLCJsYWIycmdiIiwibGFiMmxjaCIsImxjaDJsYWIiLCJsY2gyeHl6IiwibGNoMnJnYiIsImRlbHRhIiwibSIsInkiLCJrIiwicmV2ZXJzZUtleXdvcmRzIiwiSlNPTiIsInN0cmluZ2lmeSIsIngiLCJ6IiwieHl6IiwidDEiLCJ0MiIsInQzIiwic3YiLCJoaSIsImZsb29yIiwicSIsInNsIiwid2giLCJibCIsImxhYiIsInkyIiwiaHIiLCJhdGFuMiIsIlBJIiwic3FydCIsImxjaCIsImNvcyIsInNpbiIsImNzc0tleXdvcmRzIiwiYWxpY2VibHVlIiwiYW50aXF1ZXdoaXRlIiwiYXF1YSIsImFxdWFtYXJpbmUiLCJhenVyZSIsImJlaWdlIiwiYmlzcXVlIiwiYmxhbmNoZWRhbG1vbmQiLCJibHVldmlvbGV0IiwiYnJvd24iLCJidXJseXdvb2QiLCJjYWRldGJsdWUiLCJjaGFydHJldXNlIiwiY2hvY29sYXRlIiwiY29yYWwiLCJjb3JuZmxvd2VyYmx1ZSIsImNvcm5zaWxrIiwiY3JpbXNvbiIsImRhcmtibHVlIiwiZGFya2N5YW4iLCJkYXJrZ29sZGVucm9kIiwiZGFya2dyYXkiLCJkYXJrZ3JlZW4iLCJkYXJrZ3JleSIsImRhcmtraGFraSIsImRhcmttYWdlbnRhIiwiZGFya29saXZlZ3JlZW4iLCJkYXJrb3JhbmdlIiwiZGFya29yY2hpZCIsImRhcmtyZWQiLCJkYXJrc2FsbW9uIiwiZGFya3NlYWdyZWVuIiwiZGFya3NsYXRlYmx1ZSIsImRhcmtzbGF0ZWdyYXkiLCJkYXJrc2xhdGVncmV5IiwiZGFya3R1cnF1b2lzZSIsImRhcmt2aW9sZXQiLCJkZWVwcGluayIsImRlZXBza3libHVlIiwiZGltZ3JheSIsImRpbWdyZXkiLCJkb2RnZXJibHVlIiwiZmlyZWJyaWNrIiwiZmxvcmFsd2hpdGUiLCJmb3Jlc3RncmVlbiIsImZ1Y2hzaWEiLCJnYWluc2Jvcm8iLCJnaG9zdHdoaXRlIiwiZ29sZCIsImdvbGRlbnJvZCIsImdyYXkiLCJncmVlbnllbGxvdyIsImdyZXkiLCJob25leWRldyIsImhvdHBpbmsiLCJpbmRpYW5yZWQiLCJpbmRpZ28iLCJpdm9yeSIsImtoYWtpIiwibGF2ZW5kZXIiLCJsYXZlbmRlcmJsdXNoIiwibGF3bmdyZWVuIiwibGVtb25jaGlmZm9uIiwibGlnaHRibHVlIiwibGlnaHRjb3JhbCIsImxpZ2h0Y3lhbiIsImxpZ2h0Z29sZGVucm9keWVsbG93IiwibGlnaHRncmF5IiwibGlnaHRncmVlbiIsImxpZ2h0Z3JleSIsImxpZ2h0cGluayIsImxpZ2h0c2FsbW9uIiwibGlnaHRzZWFncmVlbiIsImxpZ2h0c2t5Ymx1ZSIsImxpZ2h0c2xhdGVncmF5IiwibGlnaHRzbGF0ZWdyZXkiLCJsaWdodHN0ZWVsYmx1ZSIsImxpZ2h0eWVsbG93IiwibGltZSIsImxpbWVncmVlbiIsImxpbmVuIiwibWFyb29uIiwibWVkaXVtYXF1YW1hcmluZSIsIm1lZGl1bWJsdWUiLCJtZWRpdW1vcmNoaWQiLCJtZWRpdW1wdXJwbGUiLCJtZWRpdW1zZWFncmVlbiIsIm1lZGl1bXNsYXRlYmx1ZSIsIm1lZGl1bXNwcmluZ2dyZWVuIiwibWVkaXVtdHVycXVvaXNlIiwibWVkaXVtdmlvbGV0cmVkIiwibWlkbmlnaHRibHVlIiwibWludGNyZWFtIiwibWlzdHlyb3NlIiwibW9jY2FzaW4iLCJuYXZham93aGl0ZSIsIm5hdnkiLCJvbGRsYWNlIiwib2xpdmUiLCJvbGl2ZWRyYWIiLCJvcmFuZ2UiLCJvcmFuZ2VyZWQiLCJvcmNoaWQiLCJwYWxlZ29sZGVucm9kIiwicGFsZWdyZWVuIiwicGFsZXR1cnF1b2lzZSIsInBhbGV2aW9sZXRyZWQiLCJwYXBheWF3aGlwIiwicGVhY2hwdWZmIiwicGVydSIsInBpbmsiLCJwbHVtIiwicG93ZGVyYmx1ZSIsInB1cnBsZSIsInJlYmVjY2FwdXJwbGUiLCJyb3N5YnJvd24iLCJyb3lhbGJsdWUiLCJzYWRkbGVicm93biIsInNhbG1vbiIsInNhbmR5YnJvd24iLCJzZWFncmVlbiIsInNlYXNoZWxsIiwic2llbm5hIiwic2lsdmVyIiwic2t5Ymx1ZSIsInNsYXRlYmx1ZSIsInNsYXRlZ3JheSIsInNsYXRlZ3JleSIsInNub3ciLCJzcHJpbmdncmVlbiIsInN0ZWVsYmx1ZSIsInRhbiIsInRlYWwiLCJ0aGlzdGxlIiwidG9tYXRvIiwidHVycXVvaXNlIiwidmlvbGV0Iiwid2hlYXQiLCJ3aGl0ZSIsIndoaXRlc21va2UiLCJ5ZWxsb3dncmVlbiIsImtleSIsImNvbnZlcnNpb25zIiwiQ29udmVydGVyIiwiZnVuYyIsImFyZyIsInBhaXIiLCJleGVjIiwiZnJvbSIsInRvIiwiY29udnMiLCJyb3V0ZVNwYWNlIiwiZnNwYWNlIiwiZm9yRWFjaCIsImhlbHBlcnMiLCJBbmltYXRpb24iLCJhbmltYXRpb25TZXJ2aWNlIiwiZGVmYXVsdHMiLCJFbGVtZW50IiwiZWxlbWVudHMiLCJJbnRlcmFjdGlvbiIsImxheW91dHMiLCJwbGF0Zm9ybSIsInBsdWdpbnMiLCJTY2FsZSIsInNjYWxlU2VydmljZSIsIlRpY2tzIiwiVG9vbHRpcCIsInJlZ2lzdGVyIiwiaW5pdGlhbGl6ZSIsIkxlZ2VuZCIsImxlZ2VuZCIsIl9lbGVtZW50IiwiVGl0bGUiLCJ0aXRsZSIsInBsdWdpblNlcnZpY2UiLCJQbHVnaW5CYXNlIiwiZXh0ZW5kIiwiY2FudmFzSGVscGVycyIsImNhbnZhcyIsImxheW91dFNlcnZpY2UiLCJCYXIiLCJjb250ZXh0IiwiY29uZmlnIiwiQnViYmxlIiwiRG91Z2hudXQiLCJMaW5lIiwiUG9sYXJBcmVhIiwiUmFkYXIiLCJTY2F0dGVyIiwiX3NldCIsImhvdmVyIiwibW9kZSIsInNjYWxlcyIsInhBeGVzIiwiY2F0ZWdvcnlQZXJjZW50YWdlIiwiYmFyUGVyY2VudGFnZSIsIm9mZnNldCIsImdyaWRMaW5lcyIsIm9mZnNldEdyaWRMaW5lcyIsInlBeGVzIiwiYXhpcyIsInBvc2l0aW9uIiwicmVjdGFuZ2xlIiwiYm9yZGVyU2tpcHBlZCIsInRvb2x0aXBzIiwiY2FsbGJhY2tzIiwiaXRlbSIsImRhdGEiLCJ5TGFiZWwiLCJsYWJlbHMiLCJsYWJlbCIsImRhdGFzZXRMYWJlbCIsImRhdGFzZXRzIiwiZGF0YXNldEluZGV4IiwieExhYmVsIiwiY29tcHV0ZU1pblNhbXBsZVNpemUiLCJwaXhlbHMiLCJpc0hvcml6b250YWwiLCJ3aWR0aCIsImhlaWdodCIsInRpY2tzIiwiZ2V0VGlja3MiLCJwcmV2IiwiY3VyciIsImlsZW4iLCJnZXRQaXhlbEZvclRpY2siLCJjb21wdXRlRml0Q2F0ZWdvcnlUcmFpdHMiLCJydWxlciIsIm9wdGlvbnMiLCJ0aGlja25lc3MiLCJiYXJUaGlja25lc3MiLCJjb3VudCIsInN0YWNrQ291bnQiLCJzaXplIiwiaXNOdWxsT3JVbmRlZiIsImNodW5rIiwic3RhcnQiLCJjb21wdXRlRmxleENhdGVnb3J5VHJhaXRzIiwibmV4dCIsInBlcmNlbnQiLCJlbmQiLCJjb250cm9sbGVycyIsImJhciIsIkRhdGFzZXRDb250cm9sbGVyIiwiZGF0YUVsZW1lbnRUeXBlIiwiUmVjdGFuZ2xlIiwibWUiLCJtZXRhIiwiYXBwbHkiLCJnZXRNZXRhIiwic3RhY2siLCJnZXREYXRhc2V0IiwidXBkYXRlIiwicmVzZXQiLCJyZWN0cyIsIl9ydWxlciIsImdldFJ1bGVyIiwidXBkYXRlRWxlbWVudCIsImNoYXJ0IiwiZGF0YXNldCIsImN1c3RvbSIsInJlY3RhbmdsZU9wdGlvbnMiLCJfeFNjYWxlIiwiZ2V0U2NhbGVGb3JJZCIsInhBeGlzSUQiLCJfeVNjYWxlIiwieUF4aXNJRCIsIl9kYXRhc2V0SW5kZXgiLCJfaW5kZXgiLCJfbW9kZWwiLCJiYWNrZ3JvdW5kQ29sb3IiLCJ2YWx1ZUF0SW5kZXhPckRlZmF1bHQiLCJib3JkZXJDb2xvciIsImJvcmRlcldpZHRoIiwidXBkYXRlRWxlbWVudEdlb21ldHJ5IiwicGl2b3QiLCJtb2RlbCIsInZzY2FsZSIsImdldFZhbHVlU2NhbGUiLCJiYXNlIiwiZ2V0QmFzZVBpeGVsIiwiaG9yaXpvbnRhbCIsInZwaXhlbHMiLCJjYWxjdWxhdGVCYXJWYWx1ZVBpeGVscyIsImlwaXhlbHMiLCJjYWxjdWxhdGVCYXJJbmRleFBpeGVscyIsImhlYWQiLCJjZW50ZXIiLCJnZXRWYWx1ZVNjYWxlSWQiLCJnZXRJbmRleFNjYWxlSWQiLCJnZXRJbmRleFNjYWxlIiwiX2dldFN0YWNrcyIsImxhc3QiLCJzdGFja2VkIiwic3RhY2tzIiwiZ2V0RGF0YXNldE1ldGEiLCJpc0RhdGFzZXRWaXNpYmxlIiwiaW5kZXhPZiIsInB1c2giLCJnZXRTdGFja0NvdW50IiwiZ2V0U3RhY2tJbmRleCIsImxlZnQiLCJ0b3AiLCJnZXRQaXhlbEZvclZhbHVlIiwiZ2V0UmlnaHRWYWx1ZSIsImltZXRhIiwiaXZhbHVlIiwiY29udHJvbGxlciIsImlkIiwicmFuZ2UiLCJzdGFja0luZGV4IiwidmFsdWVPckRlZmF1bHQiLCJtYXhCYXJUaGlja25lc3MiLCJJbmZpbml0eSIsImRyYXciLCJjbGlwQXJlYSIsImN0eCIsImNoYXJ0QXJlYSIsInVuY2xpcEFyZWEiLCJob3Jpem9udGFsQmFyIiwiZGF0YVBvaW50IiwiYnViYmxlIiwiUG9pbnQiLCJwb2ludHMiLCJlYWNoIiwicG9pbnQiLCJ4U2NhbGUiLCJ5U2NhbGUiLCJfcmVzb2x2ZUVsZW1lbnRPcHRpb25zIiwiZHNJbmRleCIsImdldFBpeGVsRm9yRGVjaW1hbCIsIk5hTiIsIl9vcHRpb25zIiwiaGl0UmFkaXVzIiwicG9pbnRTdHlsZSIsInJvdGF0aW9uIiwicmFkaXVzIiwic2tpcCIsInNldEhvdmVyU3R5bGUiLCIkcHJldmlvdXNTdHlsZSIsImhvdmVyQmFja2dyb3VuZENvbG9yIiwiZ2V0SG92ZXJDb2xvciIsImhvdmVyQm9yZGVyQ29sb3IiLCJob3ZlckJvcmRlcldpZHRoIiwiaG92ZXJSYWRpdXMiLCJyZXNvbHZlIiwiZGF0YUluZGV4Iiwia2V5cyIsImFuaW1hdGlvbiIsImFuaW1hdGVSb3RhdGUiLCJhbmltYXRlU2NhbGUiLCJsZWdlbmRDYWxsYmFjayIsInRleHQiLCJqb2luIiwiZ2VuZXJhdGVMYWJlbHMiLCJtYXAiLCJkcyIsImFyYyIsImFyY09wdHMiLCJmaWxsIiwic3Ryb2tlIiwiYnciLCJmaWxsU3R5bGUiLCJzdHJva2VTdHlsZSIsImxpbmVXaWR0aCIsImhpZGRlbiIsIm9uQ2xpY2siLCJsZWdlbmRJdGVtIiwiY3V0b3V0UGVyY2VudGFnZSIsImNpcmN1bWZlcmVuY2UiLCJ0b29sdGlwSXRlbSIsImRhdGFMYWJlbCIsImlzQXJyYXkiLCJkb3VnaG51dCIsInBpZSIsIkFyYyIsImxpbmtTY2FsZXMiLCJub29wIiwiZ2V0UmluZ0luZGV4IiwicmluZ0luZGV4IiwiaiIsIm9wdHMiLCJhdmFpbGFibGVXaWR0aCIsInJpZ2h0IiwiYXZhaWxhYmxlSGVpZ2h0IiwiYm90dG9tIiwibWluU2l6ZSIsInN0YXJ0QW5nbGUiLCJlbmRBbmdsZSIsImNvbnRhaW5zMCIsImNvbnRhaW5zOTAiLCJjb250YWluczE4MCIsImNvbnRhaW5zMjcwIiwiY3V0b3V0IiwiZ2V0TWF4Qm9yZGVyV2lkdGgiLCJvdXRlclJhZGl1cyIsImlubmVyUmFkaXVzIiwicmFkaXVzTGVuZ3RoIiwiZ2V0VmlzaWJsZURhdGFzZXRDb3VudCIsIm9mZnNldFgiLCJvZmZzZXRZIiwidG90YWwiLCJjYWxjdWxhdGVUb3RhbCIsImFuaW1hdGlvbk9wdHMiLCJjZW50ZXJYIiwiY2VudGVyWSIsImNhbGN1bGF0ZUNpcmN1bWZlcmVuY2UiLCJlbGVtZW50T3B0cyIsImVsZW1lbnQiLCJhYnMiLCJhcmNzIiwiaG92ZXJXaWR0aCIsIl9jaGFydCIsInNob3dMaW5lcyIsInNwYW5HYXBzIiwibGluZUVuYWJsZWQiLCJzaG93TGluZSIsImxpbmUiLCJkYXRhc2V0RWxlbWVudFR5cGUiLCJsaW5lRWxlbWVudE9wdGlvbnMiLCJ0ZW5zaW9uIiwibGluZVRlbnNpb24iLCJfc2NhbGUiLCJfY2hpbGRyZW4iLCJib3JkZXJDYXBTdHlsZSIsImJvcmRlckRhc2giLCJib3JkZXJEYXNoT2Zmc2V0IiwiYm9yZGVySm9pblN0eWxlIiwic3RlcHBlZExpbmUiLCJzdGVwcGVkIiwiY3ViaWNJbnRlcnBvbGF0aW9uTW9kZSIsInVwZGF0ZUJlemllckNvbnRyb2xQb2ludHMiLCJnZXRQb2ludEJhY2tncm91bmRDb2xvciIsInBvaW50QmFja2dyb3VuZENvbG9yIiwiZ2V0UG9pbnRCb3JkZXJDb2xvciIsInBvaW50Qm9yZGVyQ29sb3IiLCJnZXRQb2ludEJvcmRlcldpZHRoIiwicG9pbnRCb3JkZXJXaWR0aCIsImdldFBvaW50Um90YXRpb24iLCJwb2ludFJvdGF0aW9uIiwicG9pbnRPcHRpb25zIiwicG9pbnRSYWRpdXMiLCJwb2ludEhpdFJhZGl1cyIsImNhbGN1bGF0ZVBvaW50WSIsInN1bVBvcyIsInN1bU5lZyIsImRzTWV0YSIsInN0YWNrZWRSaWdodFZhbHVlIiwiTnVtYmVyIiwicmlnaHRWYWx1ZSIsImFyZWEiLCJjb250cm9sUG9pbnRzIiwiZmlsdGVyIiwicHQiLCJjYXBDb250cm9sUG9pbnQiLCJzcGxpbmVDdXJ2ZU1vbm90b25lIiwic3BsaW5lQ3VydmUiLCJwcmV2aW91c0l0ZW0iLCJuZXh0SXRlbSIsImNvbnRyb2xQb2ludFByZXZpb3VzWCIsInByZXZpb3VzIiwiY29udHJvbFBvaW50UHJldmlvdXNZIiwiY29udHJvbFBvaW50TmV4dFgiLCJjb250cm9sUG9pbnROZXh0WSIsImNhcEJlemllclBvaW50cyIsImhhbGZCb3JkZXJXaWR0aCIsInBvaW50SG92ZXJCYWNrZ3JvdW5kQ29sb3IiLCJwb2ludEhvdmVyQm9yZGVyQ29sb3IiLCJwb2ludEhvdmVyQm9yZGVyV2lkdGgiLCJwb2ludEhvdmVyUmFkaXVzIiwiYW5nbGVMaW5lcyIsImRpc3BsYXkiLCJjaXJjdWxhciIsInBvaW50TGFiZWxzIiwiYmVnaW5BdFplcm8iLCJwb2xhckFyZWEiLCJzdGFydHMiLCJfc3RhcnRzIiwiYW5nbGVzIiwiX2FuZ2xlcyIsImFuZ2xlIiwiX3VwZGF0ZVJhZGl1cyIsImNvdW50VmlzaWJsZUVsZW1lbnRzIiwiX2NvbXB1dGVBbmdsZSIsInhDZW50ZXIiLCJ5Q2VudGVyIiwiZGF0YXNldFN0YXJ0QW5nbGUiLCJkaXN0YW5jZSIsImdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlIiwicmVzZXRSYWRpdXMiLCJyYWRhciIsIl9sb29wIiwicG9pbnRFbGVtZW50T3B0aW9ucyIsInBvaW50UG9zaXRpb24iLCJnZXRQb2ludFBvc2l0aW9uRm9yVmFsdWUiLCJzY2F0dGVyIiwiY3VycmVudFN0ZXAiLCJudW1TdGVwcyIsImVhc2luZyIsInJlbmRlciIsIm9uQW5pbWF0aW9uUHJvZ3Jlc3MiLCJvbkFuaW1hdGlvbkNvbXBsZXRlIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXQiLCJzZXQiLCJkdXJhdGlvbiIsIm9uUHJvZ3Jlc3MiLCJvbkNvbXBsZXRlIiwiZnJhbWVEdXJhdGlvbiIsImFuaW1hdGlvbnMiLCJkcm9wRnJhbWVzIiwicmVxdWVzdCIsImFkZEFuaW1hdGlvbiIsImxhenkiLCJhbmltYXRpbmciLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJjYW5jZWxBbmltYXRpb24iLCJmaW5kSW5kZXgiLCJzcGxpY2UiLCJyZXF1ZXN0QW5pbUZyYW1lIiwic3RhcnREaWdlc3QiLCJzdGFydFRpbWUiLCJEYXRlIiwibm93IiwiZnJhbWVzVG9Ecm9wIiwiYWR2YW5jZSIsImVuZFRpbWUiLCJjYWxsYmFjayIsInR5cGVzIiwiaW5zdGFuY2VzIiwiaW5pdENvbmZpZyIsImNvbmZpZ01lcmdlIiwidXBkYXRlQ29uZmlnIiwibmV3T3B0aW9ucyIsInJlbW92ZUJveCIsImVuc3VyZVNjYWxlc0hhdmVJRHMiLCJidWlsZE9yVXBkYXRlU2NhbGVzIiwidG9vbHRpcCIsInBvc2l0aW9uSXNIb3Jpem9udGFsIiwiY29uc3RydWN0IiwiYWNxdWlyZUNvbnRleHQiLCJ1aWQiLCJhc3BlY3RSYXRpbyIsIl9idWZmZXJlZFJlbmRlciIsIm5vdGlmeSIsInJldGluYVNjYWxlIiwiZGV2aWNlUGl4ZWxSYXRpbyIsImJpbmRFdmVudHMiLCJyZXNwb25zaXZlIiwicmVzaXplIiwiaW5pdFRvb2xUaXAiLCJjbGVhciIsInN0b3AiLCJzaWxlbnQiLCJtYWludGFpbkFzcGVjdFJhdGlvIiwibmV3V2lkdGgiLCJnZXRNYXhpbXVtV2lkdGgiLCJuZXdIZWlnaHQiLCJnZXRNYXhpbXVtSGVpZ2h0Iiwic3R5bGUiLCJuZXdTaXplIiwib25SZXNpemUiLCJyZXNwb25zaXZlQW5pbWF0aW9uRHVyYXRpb24iLCJzY2FsZXNPcHRpb25zIiwic2NhbGVPcHRpb25zIiwieEF4aXNPcHRpb25zIiwieUF4aXNPcHRpb25zIiwiaXRlbXMiLCJ1cGRhdGVkIiwicmVkdWNlIiwiZHR5cGUiLCJkcG9zaXRpb24iLCJpc0RlZmF1bHQiLCJzY2FsZVR5cGUiLCJzY2FsZUNsYXNzIiwiZ2V0U2NhbGVDb25zdHJ1Y3RvciIsIm1lcmdlVGlja3NPcHRpb25zIiwiaGFzVXBkYXRlZCIsImFkZFNjYWxlc1RvTGF5b3V0IiwiYnVpbGRPclVwZGF0ZUNvbnRyb2xsZXJzIiwibmV3Q29udHJvbGxlcnMiLCJkZXN0cm95RGF0YXNldE1ldGEiLCJ1cGRhdGVJbmRleCIsIkNvbnRyb2xsZXJDbGFzcyIsInJlc2V0RWxlbWVudHMiLCJfaW52YWxpZGF0ZSIsIl9kYXRhIiwiYnVpbGRPclVwZGF0ZUVsZW1lbnRzIiwidXBkYXRlTGF5b3V0IiwidXBkYXRlRGF0YXNldHMiLCJsYXN0QWN0aXZlIiwiX2J1ZmZlcmVkUmVxdWVzdCIsInVwZGF0ZURhdGFzZXQiLCJhbmltYXRpb25PcHRpb25zIiwiYW5pbWF0aW9uT2JqZWN0IiwiZWFzaW5nRnVuY3Rpb24iLCJlZmZlY3RzIiwic3RlcERlY2ltYWwiLCJlYXNpbmdWYWx1ZSIsInRyYW5zaXRpb24iLCJib3hlcyIsImJveCIsImRyYXdEYXRhc2V0cyIsIl9kcmF3VG9vbHRpcCIsImRyYXdEYXRhc2V0IiwiZ2V0RWxlbWVudEF0RXZlbnQiLCJtb2RlcyIsInNpbmdsZSIsImdldEVsZW1lbnRzQXRFdmVudCIsImludGVyc2VjdCIsImdldEVsZW1lbnRzQXRYQXhpcyIsImdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUiLCJtZXRob2QiLCJnZXREYXRhc2V0QXRFdmVudCIsIl9tZXRhIiwiZ2VuZXJhdGVMZWdlbmQiLCJkZXN0cm95IiwidW5iaW5kRXZlbnRzIiwicmVsZWFzZUNvbnRleHQiLCJ0b0Jhc2U2NEltYWdlIiwidG9EYXRhVVJMIiwiX2NoYXJ0SW5zdGFuY2UiLCJsaXN0ZW5lcnMiLCJfbGlzdGVuZXJzIiwibGlzdGVuZXIiLCJldmVudEhhbmRsZXIiLCJldmVudHMiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInVwZGF0ZUhvdmVyU3R5bGUiLCJlbmFibGVkIiwiY2hhbmdlZCIsImhhbmRsZUV2ZW50IiwiX3N0YXJ0IiwiYnVmZmVyZWRSZXF1ZXN0IiwiYW5pbWF0aW9uRHVyYXRpb24iLCJob3Zlck9wdGlvbnMiLCJhY3RpdmUiLCJvbkhvdmVyIiwibmF0aXZlIiwiYXJyYXlFcXVhbHMiLCJDb250cm9sbGVyIiwiYXJyYXlFdmVudHMiLCJsaXN0ZW5BcnJheUV2ZW50cyIsImFycmF5IiwiX2NoYXJ0anMiLCJjb25maWd1cmFibGUiLCJlbnVtZXJhYmxlIiwicmVzIiwib2JqZWN0IiwidW5saXN0ZW5BcnJheUV2ZW50cyIsInN0dWIiLCJhZGRFbGVtZW50cyIsInNjYWxlSUQiLCJjcmVhdGVNZXRhRGF0YXNldCIsImNyZWF0ZU1ldGFEYXRhIiwibWV0YURhdGEiLCJhZGRFbGVtZW50QW5kUmVzZXQiLCJyZXN5bmNFbGVtZW50cyIsInJlbW92ZUhvdmVyU3R5bGUiLCJtZXJnZSIsIm51bU1ldGEiLCJudW1EYXRhIiwiaW5zZXJ0RWxlbWVudHMiLCJvbkRhdGFQdXNoIiwib25EYXRhUG9wIiwicG9wIiwib25EYXRhU2hpZnQiLCJzaGlmdCIsIm9uRGF0YVNwbGljZSIsIm9uRGF0YVVuc2hpZnQiLCJpbmhlcml0cyIsInNjb3BlIiwiY29sb3IiLCJpbnRlcnBvbGF0ZSIsInZpZXciLCJlYXNlIiwiYWN0dWFsIiwib3JpZ2luIiwiYzAiLCJjMSIsImlzRmluaXRlIiwiY29uZmlndXJhdGlvbiIsIl92aWV3IiwidG9vbHRpcFBvc2l0aW9uIiwiaGFzVmFsdWUiLCJpc051bWJlciIsIm1lcmdlciIsInR2YWwiLCJzdmFsIiwic2NhbGVNZXJnZSIsImdldFNjYWxlRGVmYXVsdHMiLCJfbWVyZ2VyIiwic2xlbiIsIndoZXJlIiwiY29sbGVjdGlvbiIsImZpbHRlckNhbGxiYWNrIiwiZmlsdGVyZWQiLCJmaW5kTmV4dFdoZXJlIiwiYXJyYXlUb1NlYXJjaCIsInN0YXJ0SW5kZXgiLCJjdXJyZW50SXRlbSIsImZpbmRQcmV2aW91c1doZXJlIiwiYWxtb3N0RXF1YWxzIiwiZXBzaWxvbiIsImFsbW9zdFdob2xlIiwicm91bmRlZCIsIk5FR0FUSVZFX0lORklOSVRZIiwiUE9TSVRJVkVfSU5GSU5JVFkiLCJzaWduIiwibG9nMTAiLCJleHBvbmVudCIsImxvZyIsIkxPRzEwRSIsInBvd2VyT2YxMCIsImlzUG93ZXJPZjEwIiwidG9SYWRpYW5zIiwidG9EZWdyZWVzIiwicmFkaWFucyIsImdldEFuZ2xlRnJvbVBvaW50IiwiY2VudHJlUG9pbnQiLCJhbmdsZVBvaW50IiwiZGlzdGFuY2VGcm9tWENlbnRlciIsImRpc3RhbmNlRnJvbVlDZW50ZXIiLCJyYWRpYWxEaXN0YW5jZUZyb21DZW50ZXIiLCJkaXN0YW5jZUJldHdlZW5Qb2ludHMiLCJwdDEiLCJwdDIiLCJhbGlhc1BpeGVsIiwicGl4ZWxXaWR0aCIsImZpcnN0UG9pbnQiLCJtaWRkbGVQb2ludCIsImFmdGVyUG9pbnQiLCJjdXJyZW50IiwiZDAxIiwiZDEyIiwiczAxIiwiczEyIiwiZmEiLCJmYiIsIkVQU0lMT04iLCJwb2ludHNXaXRoVGFuZ2VudHMiLCJkZWx0YUsiLCJtSyIsInBvaW50c0xlbiIsInBvaW50QmVmb3JlIiwicG9pbnRDdXJyZW50IiwicG9pbnRBZnRlciIsInNsb3BlRGVsdGFYIiwiYWxwaGFLIiwiYmV0YUsiLCJ0YXVLIiwic3F1YXJlZE1hZ25pdHVkZSIsImRlbHRhWCIsImxvb3AiLCJuaWNlTnVtIiwiZnJhY3Rpb24iLCJuaWNlRnJhY3Rpb24iLCJ3ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJtb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJvUmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwibXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJzZXRUaW1lb3V0IiwiZ2V0UmVsYXRpdmVQb3NpdGlvbiIsImV2dCIsIm1vdXNlWCIsIm1vdXNlWSIsIm9yaWdpbmFsRXZlbnQiLCJzcmNFbGVtZW50IiwiYm91bmRpbmdSZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwidG91Y2hlcyIsImNsaWVudFgiLCJjbGllbnRZIiwicGFkZGluZ0xlZnQiLCJnZXRTdHlsZSIsInBhZGRpbmdUb3AiLCJwYWRkaW5nUmlnaHQiLCJwYWRkaW5nQm90dG9tIiwiY3VycmVudERldmljZVBpeGVsUmF0aW8iLCJwYXJzZU1heFN0eWxlIiwic3R5bGVWYWx1ZSIsIm5vZGUiLCJwYXJlbnRQcm9wZXJ0eSIsInZhbHVlSW5QaXhlbHMiLCJwYXJlbnROb2RlIiwiaXNDb25zdHJhaW5lZFZhbHVlIiwiZ2V0Q29uc3RyYWludERpbWVuc2lvbiIsImRvbU5vZGUiLCJtYXhTdHlsZSIsInBlcmNlbnRhZ2VQcm9wZXJ0eSIsImRvY3VtZW50IiwiZGVmYXVsdFZpZXciLCJfZ2V0UGFyZW50Tm9kZSIsImNvbnN0cmFpbmVkTm9kZSIsImdldENvbXB1dGVkU3R5bGUiLCJjb25zdHJhaW5lZENvbnRhaW5lciIsImhhc0NOb2RlIiwiaGFzQ0NvbnRhaW5lciIsImluZmluaXR5IiwiZ2V0Q29uc3RyYWludFdpZHRoIiwiZ2V0Q29uc3RyYWludEhlaWdodCIsIl9jYWxjdWxhdGVQYWRkaW5nIiwiY29udGFpbmVyIiwicGFkZGluZyIsInBhcmVudERpbWVuc2lvbiIsInBhcmVudCIsImhvc3QiLCJjbGllbnRXaWR0aCIsImN3IiwiY2xpZW50SGVpZ2h0IiwiY2giLCJlbCIsInByb3BlcnR5IiwiY3VycmVudFN0eWxlIiwiZ2V0UHJvcGVydHlWYWx1ZSIsImZvcmNlUmF0aW8iLCJwaXhlbFJhdGlvIiwiZm9udFN0cmluZyIsInBpeGVsU2l6ZSIsImZvbnRTdHlsZSIsImZvbnRGYW1pbHkiLCJsb25nZXN0VGV4dCIsImZvbnQiLCJhcnJheU9mVGhpbmdzIiwiY2FjaGUiLCJnYyIsImdhcmJhZ2VDb2xsZWN0IiwibG9uZ2VzdCIsInRoaW5nIiwibWVhc3VyZVRleHQiLCJuZXN0ZWRUaGluZyIsImdjTGVuIiwidGV4dFdpZHRoIiwibnVtYmVyT2ZMYWJlbExpbmVzIiwibnVtYmVyT2ZMaW5lcyIsIkNhbnZhc0dyYWRpZW50IiwiZGVmYXVsdENvbG9yIiwiY29sb3JWYWx1ZSIsIkNhbnZhc1BhdHRlcm4iLCJwYXJzZVZpc2libGVJdGVtcyIsImhhbmRsZXIiLCJqbGVuIiwiZ2V0SW50ZXJzZWN0SXRlbXMiLCJpblJhbmdlIiwiZ2V0TmVhcmVzdEl0ZW1zIiwiZGlzdGFuY2VNZXRyaWMiLCJtaW5EaXN0YW5jZSIsIm5lYXJlc3RJdGVtcyIsImdldENlbnRlclBvaW50IiwiZ2V0RGlzdGFuY2VNZXRyaWNGb3JBeGlzIiwidXNlWCIsInVzZVkiLCJkZWx0YVkiLCJpbmRleE1vZGUiLCJuZWFyZXN0Iiwic29ydCIsInNpemVBIiwiZ2V0QXJlYSIsInNpemVCIiwicmV0IiwiaW50ZXJzZWN0c0l0ZW0iLCJpblhSYW5nZSIsImluWVJhbmdlIiwiZGVmYXVsdEZvbnRDb2xvciIsImRlZmF1bHRGb250RmFtaWx5IiwiZGVmYXVsdEZvbnRTaXplIiwiZGVmYXVsdEZvbnRTdHlsZSIsImxheW91dCIsImZpbHRlckJ5UG9zaXRpb24iLCJzb3J0QnlXZWlnaHQiLCJyZXZlcnNlIiwiX3RtcEluZGV4XyIsInYwIiwidjEiLCJhZGRCb3giLCJmdWxsV2lkdGgiLCJsYXlvdXRJdGVtIiwiY29uZmlndXJlIiwicHJvcHMiLCJsYXlvdXRPcHRpb25zIiwidG9QYWRkaW5nIiwibGVmdFBhZGRpbmciLCJyaWdodFBhZGRpbmciLCJ0b3BQYWRkaW5nIiwiYm90dG9tUGFkZGluZyIsImxlZnRCb3hlcyIsInJpZ2h0Qm94ZXMiLCJ0b3BCb3hlcyIsImJvdHRvbUJveGVzIiwiY2hhcnRBcmVhQm94ZXMiLCJjaGFydFdpZHRoIiwiY2hhcnRIZWlnaHQiLCJjaGFydEFyZWFXaWR0aCIsImNoYXJ0QXJlYUhlaWdodCIsInZlcnRpY2FsQm94V2lkdGgiLCJob3Jpem9udGFsQm94SGVpZ2h0IiwibWF4Q2hhcnRBcmVhV2lkdGgiLCJtYXhDaGFydEFyZWFIZWlnaHQiLCJtaW5Cb3hTaXplcyIsImdldE1pbmltdW1Cb3hTaXplIiwibWF4SG9yaXpvbnRhbExlZnRQYWRkaW5nIiwibWF4SG9yaXpvbnRhbFJpZ2h0UGFkZGluZyIsIm1heFZlcnRpY2FsVG9wUGFkZGluZyIsIm1heFZlcnRpY2FsQm90dG9tUGFkZGluZyIsImhvcml6b250YWxCb3giLCJnZXRQYWRkaW5nIiwiYm94UGFkZGluZyIsInZlcnRpY2FsQm94IiwidG90YWxMZWZ0Qm94ZXNXaWR0aCIsInRvdGFsUmlnaHRCb3hlc1dpZHRoIiwidG90YWxUb3BCb3hlc0hlaWdodCIsInRvdGFsQm90dG9tQm94ZXNIZWlnaHQiLCJmaXRCb3giLCJtaW5Cb3hTaXplIiwibWluQm94Iiwic2NhbGVNYXJnaW4iLCJmaW5hbEZpdFZlcnRpY2FsQm94IiwibGVmdFBhZGRpbmdBZGRpdGlvbiIsInRvcFBhZGRpbmdBZGRpdGlvbiIsIm5ld01heENoYXJ0QXJlYUhlaWdodCIsIm5ld01heENoYXJ0QXJlYVdpZHRoIiwicGxhY2VCb3giLCJfcGx1Z2lucyIsIl9jYWNoZUlkIiwicGx1Z2luIiwidW5yZWdpc3RlciIsImlkeCIsImdldEFsbCIsImhvb2siLCJkZXNjcmlwdG9ycyIsImRlc2NyaXB0b3IiLCJwYXJhbXMiLCIkcGx1Z2lucyIsImRyYXdCb3JkZXIiLCJkcmF3T25DaGFydEFyZWEiLCJkcmF3VGlja3MiLCJ0aWNrTWFya0xlbmd0aCIsInplcm9MaW5lV2lkdGgiLCJ6ZXJvTGluZUNvbG9yIiwiemVyb0xpbmVCb3JkZXJEYXNoIiwiemVyb0xpbmVCb3JkZXJEYXNoT2Zmc2V0Iiwic2NhbGVMYWJlbCIsImxhYmVsU3RyaW5nIiwibGluZUhlaWdodCIsIm1pblJvdGF0aW9uIiwibWF4Um90YXRpb24iLCJtaXJyb3IiLCJhdXRvU2tpcCIsImF1dG9Ta2lwUGFkZGluZyIsImxhYmVsT2Zmc2V0IiwiZm9ybWF0dGVycyIsIm1pbm9yIiwibWFqb3IiLCJsYWJlbHNGcm9tVGlja3MiLCJnZXRMaW5lVmFsdWUiLCJsaW5lVmFsdWUiLCJjb21wdXRlVGV4dFNpemUiLCJ0aWNrIiwicGFyc2VGb250T3B0aW9ucyIsImdsb2JhbERlZmF1bHRzIiwiZm9udFNpemUiLCJmYW1pbHkiLCJwYXJzZUxpbmVIZWlnaHQiLCJ0b0xpbmVIZWlnaHQiLCJfdGlja3MiLCJiZWZvcmVVcGRhdGUiLCJtYXhXaWR0aCIsIm1heEhlaWdodCIsIm1hcmdpbnMiLCJsb25nZXN0VGV4dENhY2hlIiwiYmVmb3JlU2V0RGltZW5zaW9ucyIsInNldERpbWVuc2lvbnMiLCJhZnRlclNldERpbWVuc2lvbnMiLCJiZWZvcmVEYXRhTGltaXRzIiwiZGV0ZXJtaW5lRGF0YUxpbWl0cyIsImFmdGVyRGF0YUxpbWl0cyIsImJlZm9yZUJ1aWxkVGlja3MiLCJidWlsZFRpY2tzIiwiYWZ0ZXJCdWlsZFRpY2tzIiwiYmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uIiwiY29udmVydFRpY2tzVG9MYWJlbHMiLCJhZnRlclRpY2tUb0xhYmVsQ29udmVyc2lvbiIsImJlZm9yZUNhbGN1bGF0ZVRpY2tSb3RhdGlvbiIsImNhbGN1bGF0ZVRpY2tSb3RhdGlvbiIsImFmdGVyQ2FsY3VsYXRlVGlja1JvdGF0aW9uIiwiYmVmb3JlRml0IiwiZml0IiwiYWZ0ZXJGaXQiLCJhZnRlclVwZGF0ZSIsInRpY2tPcHRzIiwidXNlckNhbGxiYWNrIiwidGlja0ZvbnQiLCJsYWJlbFJvdGF0aW9uIiwib3JpZ2luYWxMYWJlbFdpZHRoIiwibGFiZWxXaWR0aCIsImNvc1JvdGF0aW9uIiwic2luUm90YXRpb24iLCJ0aWNrV2lkdGgiLCJhbmdsZVJhZGlhbnMiLCJzY2FsZUxhYmVsT3B0cyIsImdyaWRMaW5lT3B0cyIsImlzRnVsbFdpZHRoIiwic2NhbGVMYWJlbExpbmVIZWlnaHQiLCJzY2FsZUxhYmVsUGFkZGluZyIsImRlbHRhSGVpZ2h0IiwibGFyZ2VzdFRleHRXaWR0aCIsInRhbGxlc3RMYWJlbEhlaWdodEluTGluZXMiLCJsaW5lU3BhY2UiLCJ0aWNrUGFkZGluZyIsImxvbmdlc3RMYWJlbFdpZHRoIiwibGFiZWxIZWlnaHQiLCJmaXJzdExhYmVsV2lkdGgiLCJsYXN0TGFiZWxXaWR0aCIsImhhbmRsZU1hcmdpbnMiLCJyYXdWYWx1ZSIsImdldExhYmVsRm9ySW5kZXgiLCJnZXRWYWx1ZUZvclBpeGVsIiwiaW5uZXJXaWR0aCIsInBpeGVsIiwiZmluYWxWYWwiLCJpbm5lckhlaWdodCIsImRlY2ltYWwiLCJ2YWx1ZU9mZnNldCIsImdldEJhc2VWYWx1ZSIsIl9hdXRvU2tpcCIsInNraXBSYXRpbyIsIm9wdGlvblRpY2tzIiwidGlja0NvdW50IiwibGFiZWxSb3RhdGlvblJhZGlhbnMiLCJsb25nZXN0Um90YXRlZExhYmVsIiwic2hvdWxkU2tpcCIsIm1heFRpY2tzIiwibWF4VGlja3NMaW1pdCIsIm9wdGlvbk1ham9yVGlja3MiLCJpc1JvdGF0ZWQiLCJ0aWNrRm9udENvbG9yIiwiZm9udENvbG9yIiwibWFqb3JUaWNrRm9udENvbG9yIiwibWFqb3JUaWNrRm9udCIsInRsIiwic2NhbGVMYWJlbEZvbnRDb2xvciIsInNjYWxlTGFiZWxGb250IiwiaXRlbXNUb0RyYXciLCJheGlzV2lkdGgiLCJ4VGlja1N0YXJ0IiwieFRpY2tFbmQiLCJ5VGlja1N0YXJ0IiwieVRpY2tFbmQiLCJsaW5lQ29sb3IiLCJ6ZXJvTGluZUluZGV4IiwidHgxIiwidHkxIiwidHgyIiwidHkyIiwieDEiLCJ5MSIsIngyIiwibGFiZWxYIiwibGFiZWxZIiwidGV4dEFsaWduIiwidGV4dEJhc2VsaW5lIiwibGFiZWxZT2Zmc2V0IiwieExpbmVWYWx1ZSIsImlzTGVmdCIsImxhYmVsWE9mZnNldCIsInlMaW5lVmFsdWUiLCJnbFdpZHRoIiwiZ2xDb2xvciIsImdsQm9yZGVyRGFzaCIsImdsQm9yZGVyRGFzaE9mZnNldCIsIml0ZW1Ub0RyYXciLCJzYXZlIiwic2V0TGluZURhc2giLCJsaW5lRGFzaE9mZnNldCIsImJlZ2luUGF0aCIsIm1vdmVUbyIsImxpbmVUbyIsInJlc3RvcmUiLCJ0cmFuc2xhdGUiLCJsaW5lQ291bnQiLCJmaWxsVGV4dCIsInNjYWxlTGFiZWxYIiwic2NhbGVMYWJlbFkiLCJoYWxmTGluZUhlaWdodCIsImNvbnN0cnVjdG9ycyIsInJlZ2lzdGVyU2NhbGVUeXBlIiwic2NhbGVDb25zdHJ1Y3RvciIsInNjYWxlRGVmYXVsdHMiLCJ1cGRhdGVTY2FsZURlZmF1bHRzIiwiYWRkaXRpb25zIiwibGluZWFyIiwidGlja1ZhbHVlIiwibG9nRGVsdGEiLCJ0aWNrU3RyaW5nIiwibWF4VGljayIsImxvZ1RpY2siLCJ0b0V4cG9uZW50aWFsIiwibnVtRGVjaW1hbCIsInRvRml4ZWQiLCJsb2dhcml0aG1pYyIsInJlbWFpbiIsInRpdGxlRm9udFN0eWxlIiwidGl0bGVTcGFjaW5nIiwidGl0bGVNYXJnaW5Cb3R0b20iLCJ0aXRsZUZvbnRDb2xvciIsInRpdGxlQWxpZ24iLCJib2R5U3BhY2luZyIsImJvZHlGb250Q29sb3IiLCJib2R5QWxpZ24iLCJmb290ZXJGb250U3R5bGUiLCJmb290ZXJTcGFjaW5nIiwiZm9vdGVyTWFyZ2luVG9wIiwiZm9vdGVyRm9udENvbG9yIiwiZm9vdGVyQWxpZ24iLCJ5UGFkZGluZyIsInhQYWRkaW5nIiwiY2FyZXRQYWRkaW5nIiwiY2FyZXRTaXplIiwiY29ybmVyUmFkaXVzIiwibXVsdGlLZXlCYWNrZ3JvdW5kIiwiZGlzcGxheUNvbG9ycyIsImJlZm9yZVRpdGxlIiwidG9vbHRpcEl0ZW1zIiwibGFiZWxDb3VudCIsImFmdGVyVGl0bGUiLCJiZWZvcmVCb2R5IiwiYmVmb3JlTGFiZWwiLCJsYWJlbENvbG9yIiwiYWN0aXZlRWxlbWVudCIsImxhYmVsVGV4dENvbG9yIiwiYWZ0ZXJMYWJlbCIsImFmdGVyQm9keSIsImJlZm9yZUZvb3RlciIsImZvb3RlciIsImFmdGVyRm9vdGVyIiwicG9zaXRpb25lcnMiLCJhdmVyYWdlIiwibGVuIiwicG9zIiwiZXZlbnRQb3NpdGlvbiIsIm5lYXJlc3RFbGVtZW50IiwiZCIsInRwIiwibWVyZ2VPcGFjaXR5IiwiY29sb3JTdHJpbmciLCJvcGFjaXR5IiwicHVzaE9yQ29uY2F0IiwidG9QdXNoIiwic3BsaXROZXdsaW5lcyIsIlN0cmluZyIsInNwbGl0IiwiY3JlYXRlVG9vbHRpcEl0ZW0iLCJnZXRCYXNlTW9kZWwiLCJ0b29sdGlwT3B0cyIsInhBbGlnbiIsInlBbGlnbiIsIl9ib2R5Rm9udEZhbWlseSIsImJvZHlGb250RmFtaWx5IiwiX2JvZHlGb250U3R5bGUiLCJib2R5Rm9udFN0eWxlIiwiX2JvZHlBbGlnbiIsImJvZHlGb250U2l6ZSIsIl90aXRsZUZvbnRGYW1pbHkiLCJ0aXRsZUZvbnRGYW1pbHkiLCJfdGl0bGVGb250U3R5bGUiLCJ0aXRsZUZvbnRTaXplIiwiX3RpdGxlQWxpZ24iLCJfZm9vdGVyRm9udEZhbWlseSIsImZvb3RlckZvbnRGYW1pbHkiLCJfZm9vdGVyRm9udFN0eWxlIiwiZm9vdGVyRm9udFNpemUiLCJfZm9vdGVyQWxpZ24iLCJsZWdlbmRDb2xvckJhY2tncm91bmQiLCJnZXRUb29sdGlwU2l6ZSIsImJvZHkiLCJjb21iaW5lZEJvZHlMZW5ndGgiLCJib2R5SXRlbSIsImJlZm9yZSIsImxpbmVzIiwiYWZ0ZXIiLCJ0aXRsZUxpbmVDb3VudCIsImZvb3RlckxpbmVDb3VudCIsIndpZHRoUGFkZGluZyIsIm1heExpbmVXaWR0aCIsImRldGVybWluZUFsaWdubWVudCIsImxmIiwicmYiLCJvbGYiLCJvcmYiLCJ5ZiIsIm1pZFgiLCJtaWRZIiwiZ2V0QmFja2dyb3VuZFBvaW50Iiwidm0iLCJhbGlnbm1lbnQiLCJwYWRkaW5nQW5kU2l6ZSIsInJhZGl1c0FuZFBhZGRpbmciLCJnZXRCZWZvcmVBZnRlckJvZHlMaW5lcyIsIl9sYXN0QWN0aXZlIiwiZ2V0VGl0bGUiLCJnZXRCZWZvcmVCb2R5IiwiZ2V0Qm9keSIsImJvZHlJdGVtcyIsImdldEFmdGVyQm9keSIsImdldEZvb3RlciIsImV4aXN0aW5nTW9kZWwiLCJfYWN0aXZlIiwiYmFja2dyb3VuZFBvaW50IiwidG9vbHRpcFNpemUiLCJjYXJldFgiLCJjYXJldFkiLCJsYWJlbENvbG9ycyIsImxhYmVsVGV4dENvbG9ycyIsIl9ldmVudFBvc2l0aW9uIiwiaXRlbVNvcnQiLCJkYXRhUG9pbnRzIiwiZHJhd0NhcmV0IiwidG9vbHRpcFBvaW50IiwiY2FyZXRQb3NpdGlvbiIsImdldENhcmV0UG9zaXRpb24iLCJ4MyIsInkzIiwicHRYIiwicHRZIiwidG1wIiwiZHJhd1RpdGxlIiwiZHJhd0JvZHkiLCJ4TGluZVBhZGRpbmciLCJmaWxsTGluZU9mVGV4dCIsImRyYXdDb2xvckJveGVzIiwidGV4dENvbG9yIiwiZmlsbFJlY3QiLCJzdHJva2VSZWN0IiwiZHJhd0Zvb3RlciIsImRyYXdCYWNrZ3JvdW5kIiwicXVhZHJhdGljQ3VydmVUbyIsImNsb3NlUGF0aCIsImhhc1Rvb2x0aXBDb250ZW50IiwiaW5MYWJlbFJhbmdlIiwiY2hhcnRYIiwiY2hhcnRZIiwicG9pbnRSZWxhdGl2ZVBvc2l0aW9uIiwiYmV0d2VlbkFuZ2xlcyIsIndpdGhpblJhZGl1cyIsImhhbGZBbmdsZSIsImhhbGZSYWRpdXMiLCJjZW50cmVBbmdsZSIsInJhbmdlRnJvbUNlbnRyZSIsInNBIiwiZUEiLCJsaW5lSm9pbiIsImdsb2JhbE9wdGlvbkxpbmVFbGVtZW50cyIsImxhc3REcmF3bkluZGV4IiwiY3VycmVudFZNIiwibGluZUNhcCIsInhSYW5nZSIsInlSYW5nZSIsImVyck1hcmdpbiIsImRyYXdQb2ludCIsImlzVmVydGljYWwiLCJnZXRCYXJCb3VuZHMiLCJoYWxmV2lkdGgiLCJoYWxmSGVpZ2h0Iiwic2lnblgiLCJzaWduWSIsImJhclNpemUiLCJoYWxmU3Ryb2tlIiwiYm9yZGVyTGVmdCIsImJvcmRlclJpZ2h0IiwiYm9yZGVyVG9wIiwiYm9yZGVyQm90dG9tIiwiY29ybmVycyIsImJvcmRlcnMiLCJzdGFydENvcm5lciIsImNvcm5lckF0IiwiY29ybmVyIiwiYm91bmRzIiwiY2xlYXJSZWN0Iiwicm91bmRlZFJlY3QiLCJhcmNUbyIsInJlY3QiLCJlZGdlTGVuZ3RoIiwieE9mZnNldCIsInlPZmZzZXQiLCJkcmF3SW1hZ2UiLCJTUVJUMiIsImxlZnRYIiwidG9wWSIsInNpZGVTaXplIiwiY2xpcCIsImZsaXAiLCJiZXppZXJDdXJ2ZVRvIiwiZHJhd1JvdW5kZWRSZWN0YW5nbGUiLCJpc09iamVjdCIsImRlZmF1bHRWYWx1ZSIsImZuIiwidGhpc0FyZyIsImxvb3BhYmxlIiwiYTAiLCJhMSIsImtsZW4iLCJfbWVyZ2VySWYiLCJtZXJnZUlmIiwic291cmNlcyIsInNldEZuIiwiZXh0ZW5zaW9ucyIsIkNoYXJ0RWxlbWVudCIsImNvbnN0cnVjdG9yIiwiU3Vycm9nYXRlIiwiX19zdXBlcl9fIiwiY2FsbENhbGxiYWNrIiwiZnJvbUluZGV4IiwiZ2V0VmFsdWVPckRlZmF1bHQiLCJnZXRWYWx1ZUF0SW5kZXhPckRlZmF1bHQiLCJlYXNlSW5RdWFkIiwiZWFzZU91dFF1YWQiLCJlYXNlSW5PdXRRdWFkIiwiZWFzZUluQ3ViaWMiLCJlYXNlT3V0Q3ViaWMiLCJlYXNlSW5PdXRDdWJpYyIsImVhc2VJblF1YXJ0IiwiZWFzZU91dFF1YXJ0IiwiZWFzZUluT3V0UXVhcnQiLCJlYXNlSW5RdWludCIsImVhc2VPdXRRdWludCIsImVhc2VJbk91dFF1aW50IiwiZWFzZUluU2luZSIsImVhc2VPdXRTaW5lIiwiZWFzZUluT3V0U2luZSIsImVhc2VJbkV4cG8iLCJlYXNlT3V0RXhwbyIsImVhc2VJbk91dEV4cG8iLCJlYXNlSW5DaXJjIiwiZWFzZU91dENpcmMiLCJlYXNlSW5PdXRDaXJjIiwiZWFzZUluRWxhc3RpYyIsImFzaW4iLCJlYXNlT3V0RWxhc3RpYyIsImVhc2VJbk91dEVsYXN0aWMiLCJlYXNlSW5CYWNrIiwiZWFzZU91dEJhY2siLCJlYXNlSW5PdXRCYWNrIiwiZWFzZUluQm91bmNlIiwiZWFzZU91dEJvdW5jZSIsImVhc2VJbk91dEJvdW5jZSIsImVhc2luZ0VmZmVjdHMiLCJtYXRjaGVzIiwiaW5wdXRzIiwiZ2V0Q29udGV4dCIsIkVYUEFORE9fS0VZIiwiQ1NTX1BSRUZJWCIsIkNTU19SRU5ERVJfTU9OSVRPUiIsIkNTU19SRU5ERVJfQU5JTUFUSU9OIiwiQU5JTUFUSU9OX1NUQVJUX0VWRU5UUyIsIkVWRU5UX1RZUEVTIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSIsInRvdWNoZW5kIiwicG9pbnRlcmVudGVyIiwicG9pbnRlcmRvd24iLCJwb2ludGVybW92ZSIsInBvaW50ZXJ1cCIsInBvaW50ZXJsZWF2ZSIsInBvaW50ZXJvdXQiLCJyZWFkVXNlZFNpemUiLCJpbml0Q2FudmFzIiwicmVuZGVySGVpZ2h0IiwiZ2V0QXR0cmlidXRlIiwicmVuZGVyV2lkdGgiLCJpbml0aWFsIiwiZGlzcGxheVdpZHRoIiwiZGlzcGxheUhlaWdodCIsInN1cHBvcnRzRXZlbnRMaXN0ZW5lck9wdGlvbnMiLCJzdXBwb3J0cyIsImV2ZW50TGlzdGVuZXJPcHRpb25zIiwicGFzc2l2ZSIsImNyZWF0ZUV2ZW50IiwibmF0aXZlRXZlbnQiLCJmcm9tTmF0aXZlRXZlbnQiLCJldmVudCIsInRocm90dGxlZCIsInRpY2tpbmciLCJjcmVhdGVSZXNpemVyIiwicmVzaXplciIsImNyZWF0ZUVsZW1lbnQiLCJjbHMiLCJtYXhTaXplIiwiY3NzVGV4dCIsImNsYXNzTmFtZSIsImlubmVySFRNTCIsImV4cGFuZCIsImNoaWxkTm9kZXMiLCJzaHJpbmsiLCJfcmVzZXQiLCJzY3JvbGxMZWZ0Iiwic2Nyb2xsVG9wIiwib25TY3JvbGwiLCJiaW5kIiwid2F0Y2hGb3JSZW5kZXIiLCJleHBhbmRvIiwicHJveHkiLCJyZW5kZXJQcm94eSIsImFuaW1hdGlvbk5hbWUiLCJyZWZsb3ciLCJvZmZzZXRQYXJlbnQiLCJjbGFzc0xpc3QiLCJhZGQiLCJ1bndhdGNoRm9yUmVuZGVyIiwicmVtb3ZlIiwiYWRkUmVzaXplTGlzdGVuZXIiLCJpbnNlcnRCZWZvcmUiLCJmaXJzdENoaWxkIiwicmVtb3ZlUmVzaXplTGlzdGVuZXIiLCJyZW1vdmVDaGlsZCIsImluamVjdENTUyIsImNzcyIsIl9zdHlsZSIsInNldEF0dHJpYnV0ZSIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiYXBwZW5kQ2hpbGQiLCJjcmVhdGVUZXh0Tm9kZSIsIl9lbmFibGVkIiwia2V5ZnJhbWVzIiwiZ2V0RWxlbWVudEJ5SWQiLCJyZW1vdmVBdHRyaWJ1dGUiLCJwcm94aWVzIiwiYWRkRXZlbnQiLCJyZW1vdmVFdmVudCIsImJhc2ljIiwiZG9tIiwiaW1wbGVtZW50YXRpb24iLCJmaWxsZXIiLCJwcm9wYWdhdGUiLCJtYXBwZXJzIiwidmlzaWJsZSIsImJvdW5kYXJ5IiwiZGVjb2RlRmlsbCIsImNvbXB1dGVCb3VuZGFyeSIsInNjYWxlQm90dG9tIiwic2NhbGVUb3AiLCJzY2FsZVplcm8iLCJnZXRCYXNlUG9zaXRpb24iLCJyZXNvbHZlVGFyZ2V0IiwidmlzaXRlZCIsImNyZWF0ZU1hcHBlciIsImlzRHJhd2FibGUiLCJkcmF3QXJlYSIsImN1cnZlMCIsImN1cnZlMSIsImxlbjAiLCJsZW4xIiwiZG9GaWxsIiwibWFwcGVyIiwic3BhbiIsInAwIiwicDEiLCJkMCIsImQxIiwiYWZ0ZXJEYXRhc2V0c1VwZGF0ZSIsIiRmaWxsZXIiLCJiZWZvcmVEYXRhc2V0RHJhdyIsImNpIiwiYm94V2lkdGgiLCJsaW5lRGFzaCIsImdldEJveFdpZHRoIiwibGFiZWxPcHRzIiwidXNlUG9pbnRTdHlsZSIsImxlZ2VuZEhpdEJveGVzIiwiZG91Z2hudXRNb2RlIiwiYmVmb3JlQnVpbGRMYWJlbHMiLCJidWlsZExhYmVscyIsImFmdGVyQnVpbGRMYWJlbHMiLCJsZWdlbmRJdGVtcyIsImdsb2JhbERlZmF1bHQiLCJsYWJlbEZvbnQiLCJoaXRib3hlcyIsImxpbmVXaWR0aHMiLCJ0b3RhbEhlaWdodCIsInZQYWRkaW5nIiwiY29sdW1uV2lkdGhzIiwidG90YWxXaWR0aCIsImN1cnJlbnRDb2xXaWR0aCIsImN1cnJlbnRDb2xIZWlnaHQiLCJpdGVtSGVpZ2h0IiwiaXRlbVdpZHRoIiwibGluZURlZmF1bHQiLCJsZWdlbmRXaWR0aCIsImN1cnNvciIsImRyYXdMZWdlbmRCb3giLCJpc0xpbmVXaWR0aFplcm8iLCJvZmZTZXQiLCJoYWxmRm9udFNpemUiLCJ4TGVmdCIsInlNaWRkbGUiLCJsaCIsImhpdEJveCIsImNyZWF0ZU5ld0xlZ2VuZEFuZEF0dGFjaCIsImxlZ2VuZE9wdHMiLCJiZWZvcmVJbml0IiwiYWZ0ZXJFdmVudCIsInRleHRTaXplIiwidGl0bGVGb250IiwidGl0bGVYIiwidGl0bGVZIiwiY3JlYXRlTmV3VGl0bGVCbG9ja0FuZEF0dGFjaCIsInRpdGxlT3B0cyIsInRpdGxlQmxvY2siLCJkZWZhdWx0Q29uZmlnIiwiRGF0YXNldFNjYWxlIiwiZ2V0TGFiZWxzIiwieExhYmVscyIsInlMYWJlbHMiLCJtaW5JbmRleCIsIm1heEluZGV4Iiwib2Zmc2V0QW10IiwidmFsdWVDYXRlZ29yeSIsInZhbHVlV2lkdGgiLCJ3aWR0aE9mZnNldCIsInZhbHVlSGVpZ2h0IiwiaGVpZ2h0T2Zmc2V0IiwiaG9yeiIsInZhbHVlRGltZW5zaW9uIiwiTGluZWFyU2NhbGUiLCJMaW5lYXJTY2FsZUJhc2UiLCJERUZBVUxUX01JTiIsIkRFRkFVTFRfTUFYIiwiSURNYXRjaGVzIiwiaGFzU3RhY2tzIiwidmFsdWVzUGVyU3RhY2siLCJwb3NpdGl2ZVZhbHVlcyIsIm5lZ2F0aXZlVmFsdWVzIiwicmVsYXRpdmVQb2ludHMiLCJ2YWx1ZXNGb3JUeXBlIiwibWluVmFsIiwibWF4VmFsIiwiaGFuZGxlVGlja1JhbmdlT3B0aW9ucyIsImdldFRpY2tMaW1pdCIsImNlaWwiLCJ0aWNrRm9udFNpemUiLCJoYW5kbGVEaXJlY3Rpb25hbENoYW5nZXMiLCJpbm5lckRpbWVuc2lvbiIsInRpY2tzQXNOdW1iZXJzIiwiZ2VuZXJhdGVUaWNrcyIsImdlbmVyYXRpb25PcHRpb25zIiwiZGF0YVJhbmdlIiwiZmFjdG9yIiwicHJlY2lzaW9uIiwic3BhY2luZyIsInN0ZXBTaXplIiwibmljZVJhbmdlIiwibmljZU1pbiIsIm5pY2VNYXgiLCJudW1TcGFjZXMiLCJtaW5TaWduIiwibWF4U2lnbiIsInNldE1pbiIsInN1Z2dlc3RlZE1pbiIsInNldE1heCIsInN1Z2dlc3RlZE1heCIsIm51bWVyaWNHZW5lcmF0b3JPcHRpb25zIiwiZml4ZWRTdGVwU2l6ZSIsInRpY2tWYWwiLCJlbmRFeHAiLCJlbmRTaWduaWZpY2FuZCIsImV4cCIsInNpZ25pZmljYW5kIiwibWluTm90WmVybyIsImxhc3RUaWNrIiwiTG9nYXJpdGhtaWNTY2FsZSIsInRpY2tWYWx1ZXMiLCJfZ2V0Rmlyc3RUaWNrVmFsdWUiLCJmaXJzdFRpY2tWYWx1ZSIsImFuaW1hdGUiLCJzaG93TGFiZWxCYWNrZHJvcCIsImJhY2tkcm9wQ29sb3IiLCJiYWNrZHJvcFBhZGRpbmdZIiwiYmFja2Ryb3BQYWRkaW5nWCIsImdldFZhbHVlQ291bnQiLCJnZXRQb2ludExhYmVsRm9udE9wdGlvbnMiLCJwb2ludExhYmVsT3B0aW9ucyIsIm1lYXN1cmVMYWJlbFNpemUiLCJkZXRlcm1pbmVMaW1pdHMiLCJmaXRXaXRoUG9pbnRMYWJlbHMiLCJwbEZvbnQiLCJsYXJnZXN0UG9zc2libGVSYWRpdXMiLCJmdXJ0aGVzdExpbWl0cyIsImZ1cnRoZXN0QW5nbGVzIiwiX3BvaW50TGFiZWxTaXplcyIsInZhbHVlQ291bnQiLCJnZXRQb2ludFBvc2l0aW9uIiwiZ2V0SW5kZXhBbmdsZSIsImhMaW1pdHMiLCJ2TGltaXRzIiwic2V0UmVkdWN0aW9ucyIsImRyYXdpbmdBcmVhIiwic2V0Q2VudGVyUG9pbnQiLCJnZXRUZXh0QWxpZ25Gb3JBbmdsZSIsImFkanVzdFBvaW50UG9zaXRpb25Gb3JMYWJlbEhlaWdodCIsImRyYXdQb2ludExhYmVscyIsImFuZ2xlTGluZU9wdHMiLCJwb2ludExhYmVsT3B0cyIsIm91dGVyRGlzdGFuY2UiLCJvdXRlclBvc2l0aW9uIiwicG9pbnRMYWJlbFBvc2l0aW9uIiwicG9pbnRMYWJlbEZvbnRDb2xvciIsImRyYXdSYWRpdXNMaW5lIiwibnVtYmVyT3JaZXJvIiwicGFyYW0iLCJMaW5lYXJSYWRpYWxTY2FsZSIsInJhZGl1c1JlZHVjdGlvbkxlZnQiLCJyYWRpdXNSZWR1Y3Rpb25SaWdodCIsInJhZGl1c1JlZHVjdGlvblRvcCIsInJhZGl1c1JlZHVjdGlvbkJvdHRvbSIsImxlZnRNb3ZlbWVudCIsInJpZ2h0TW92ZW1lbnQiLCJ0b3BNb3ZlbWVudCIsImJvdHRvbU1vdmVtZW50IiwibWF4UmlnaHQiLCJtYXhMZWZ0IiwibWF4VG9wIiwibWF4Qm90dG9tIiwiYW5nbGVNdWx0aXBsaWVyIiwic3RhcnRBbmdsZVJhZGlhbnMiLCJzY2FsaW5nRmFjdG9yIiwiZGlzdGFuY2VGcm9tQ2VudGVyIiwidGhpc0FuZ2xlIiwidGlja0ZvbnRTdHlsZSIsInRpY2tGb250RmFtaWx5IiwidGlja0xhYmVsRm9udCIsInlDZW50ZXJPZmZzZXQiLCJtb21lbnQiLCJNSU5fSU5URUdFUiIsIk1JTl9TQUZFX0lOVEVHRVIiLCJNQVhfSU5URUdFUiIsIk1BWF9TQUZFX0lOVEVHRVIiLCJJTlRFUlZBTFMiLCJtaWxsaXNlY29uZCIsImNvbW1vbiIsInN0ZXBzIiwic2Vjb25kIiwibWludXRlIiwiaG91ciIsImRheSIsIndlZWsiLCJtb250aCIsInF1YXJ0ZXIiLCJ5ZWFyIiwiVU5JVFMiLCJzb3J0ZXIiLCJhcnJheVVuaXF1ZSIsImhhc2giLCJvdXQiLCJidWlsZExvb2t1cFRhYmxlIiwidGltZXN0YW1wcyIsImRpc3RyaWJ1dGlvbiIsInRpbWUiLCJ0YWJsZSIsImxvb2t1cCIsImxvIiwibWlkIiwiaTAiLCJpMSIsInNrZXkiLCJ0a2V5IiwibW9tZW50aWZ5IiwicGFyc2VyIiwiZm9ybWF0IiwicGFyc2UiLCJpbnB1dCIsInN0YXJ0T2YiLCJ2YWx1ZU9mIiwiZGV0ZXJtaW5lU3RlcFNpemUiLCJ1bml0IiwiY2FwYWNpdHkiLCJpbnRlcnZhbCIsIm1pbGxpc2Vjb25kcyIsImRldGVybWluZVVuaXRGb3JBdXRvVGlja3MiLCJtaW5Vbml0IiwiZGV0ZXJtaW5lVW5pdEZvckZvcm1hdHRpbmciLCJkaWZmIiwiYXMiLCJkZXRlcm1pbmVNYWpvclVuaXQiLCJnZW5lcmF0ZSIsInRpbWVPcHRzIiwidW5pdFN0ZXBTaXplIiwid2Vla2RheSIsImlzb1dlZWtkYXkiLCJtYWpvclRpY2tzRW5hYmxlZCIsImZpcnN0IiwiY29tcHV0ZU9mZnNldHMiLCJ1cHBlciIsImxvd2VyIiwidGlja3NGcm9tVGltZXN0YW1wcyIsIm1ham9yVW5pdCIsImRldGVybWluZUxhYmVsRm9ybWF0IiwibW9tZW50RGF0ZSIsImhhc1RpbWUiLCJkaXNwbGF5Rm9ybWF0IiwiZGlzcGxheUZvcm1hdHMiLCJUaW1lU2NhbGUiLCJ3YXJuIiwidGltZXN0YW1wIiwiZW5kT2YiLCJfaG9yaXpvbnRhbCIsIl90YWJsZSIsIl90aW1lc3RhbXBzIiwiZ2V0TGFiZWxDYXBhY2l0eSIsIl91bml0IiwiX21ham9yVW5pdCIsIl9vZmZzZXRzIiwiX2xhYmVsRm9ybWF0IiwidG9vbHRpcEZvcm1hdCIsInRpY2tGb3JtYXRGdW5jdGlvbiIsImZvcm1hdE92ZXJyaWRlIiwiZm9ybWF0cyIsIm1pbm9yRm9ybWF0IiwibWFqb3JGb3JtYXQiLCJtYWpvclRpbWUiLCJtYWpvclRpY2tPcHRzIiwiZm9ybWF0dGVyIiwiZ2V0UGl4ZWxGb3JPZmZzZXQiLCJnZXRMYWJlbFdpZHRoIiwidGlja3NPcHRzIiwidGlja0xhYmVsV2lkdGgiLCJleGFtcGxlVGlt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QWtEaE0sYUFBbEQ7QUFDQSxJQXBXRDtBQXNXQyxHQW54QnVDLEVBbXhCdEMsRUFBQyxLQUFJLENBQUwsRUFBTyxNQUFLLEVBQVosRUFBZSxNQUFLLEVBQXBCLEVBQXVCLE1BQUssRUFBNUIsRUFBK0IsTUFBSyxFQUFwQyxFQW54QnNDLENBMTFhaXhCLEVBQTVjLEVBNm1jalUsRUE3bWNpVSxFQTZtYzlULENBQUMsQ0FBRCxDQTdtYzhULEVBNm1jelQsQ0E3bWN5VCxDQUFQO0FBOG1jclcsQ0E5bWNEIiwiZmlsZSI6IjcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIENoYXJ0LmpzXG4gKiBodHRwOi8vY2hhcnRqcy5vcmcvXG4gKiBWZXJzaW9uOiAyLjcuM1xuICpcbiAqIENvcHlyaWdodCAyMDE4IENoYXJ0LmpzIENvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9ibG9iL21hc3Rlci9MSUNFTlNFLm1kXG4gKi9cbihmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PVwib2JqZWN0XCImJnR5cGVvZiBtb2R1bGUhPT1cInVuZGVmaW5lZFwiKXttb2R1bGUuZXhwb3J0cz1mKCl9ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT09XCJmdW5jdGlvblwiJiZkZWZpbmUuYW1kKXtkZWZpbmUoW10sZil9ZWxzZXt2YXIgZztpZih0eXBlb2Ygd2luZG93IT09XCJ1bmRlZmluZWRcIil7Zz13aW5kb3d9ZWxzZSBpZih0eXBlb2YgZ2xvYmFsIT09XCJ1bmRlZmluZWRcIil7Zz1nbG9iYWx9ZWxzZSBpZih0eXBlb2Ygc2VsZiE9PVwidW5kZWZpbmVkXCIpe2c9c2VsZn1lbHNle2c9dGhpc31nLkNoYXJ0ID0gZigpfX0pKGZ1bmN0aW9uKCl7dmFyIGRlZmluZSxtb2R1bGUsZXhwb3J0cztyZXR1cm4gKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSh7MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG5cbn0se31dLDI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuLyogTUlUIGxpY2Vuc2UgKi9cbnZhciBjb2xvck5hbWVzID0gcmVxdWlyZSg2KTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICBnZXRSZ2JhOiBnZXRSZ2JhLFxuICAgZ2V0SHNsYTogZ2V0SHNsYSxcbiAgIGdldFJnYjogZ2V0UmdiLFxuICAgZ2V0SHNsOiBnZXRIc2wsXG4gICBnZXRId2I6IGdldEh3YixcbiAgIGdldEFscGhhOiBnZXRBbHBoYSxcblxuICAgaGV4U3RyaW5nOiBoZXhTdHJpbmcsXG4gICByZ2JTdHJpbmc6IHJnYlN0cmluZyxcbiAgIHJnYmFTdHJpbmc6IHJnYmFTdHJpbmcsXG4gICBwZXJjZW50U3RyaW5nOiBwZXJjZW50U3RyaW5nLFxuICAgcGVyY2VudGFTdHJpbmc6IHBlcmNlbnRhU3RyaW5nLFxuICAgaHNsU3RyaW5nOiBoc2xTdHJpbmcsXG4gICBoc2xhU3RyaW5nOiBoc2xhU3RyaW5nLFxuICAgaHdiU3RyaW5nOiBod2JTdHJpbmcsXG4gICBrZXl3b3JkOiBrZXl3b3JkXG59XG5cbmZ1bmN0aW9uIGdldFJnYmEoc3RyaW5nKSB7XG4gICBpZiAoIXN0cmluZykge1xuICAgICAgcmV0dXJuO1xuICAgfVxuICAgdmFyIGFiYnIgPSAgL14jKFthLWZBLUYwLTldezN9KSQvaSxcbiAgICAgICBoZXggPSAgL14jKFthLWZBLUYwLTldezZ9KSQvaSxcbiAgICAgICByZ2JhID0gL15yZ2JhP1xcKFxccyooWystXT9cXGQrKVxccyosXFxzKihbKy1dP1xcZCspXFxzKixcXHMqKFsrLV0/XFxkKylcXHMqKD86LFxccyooWystXT9bXFxkXFwuXSspXFxzKik/XFwpJC9pLFxuICAgICAgIHBlciA9IC9ecmdiYT9cXChcXHMqKFsrLV0/W1xcZFxcLl0rKVxcJVxccyosXFxzKihbKy1dP1tcXGRcXC5dKylcXCVcXHMqLFxccyooWystXT9bXFxkXFwuXSspXFwlXFxzKig/OixcXHMqKFsrLV0/W1xcZFxcLl0rKVxccyopP1xcKSQvaSxcbiAgICAgICBrZXl3b3JkID0gLyhcXHcrKS87XG5cbiAgIHZhciByZ2IgPSBbMCwgMCwgMF0sXG4gICAgICAgYSA9IDEsXG4gICAgICAgbWF0Y2ggPSBzdHJpbmcubWF0Y2goYWJicik7XG4gICBpZiAobWF0Y2gpIHtcbiAgICAgIG1hdGNoID0gbWF0Y2hbMV07XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJnYi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgcmdiW2ldID0gcGFyc2VJbnQobWF0Y2hbaV0gKyBtYXRjaFtpXSwgMTYpO1xuICAgICAgfVxuICAgfVxuICAgZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goaGV4KSkge1xuICAgICAgbWF0Y2ggPSBtYXRjaFsxXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmdiLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICByZ2JbaV0gPSBwYXJzZUludChtYXRjaC5zbGljZShpICogMiwgaSAqIDIgKyAyKSwgMTYpO1xuICAgICAgfVxuICAgfVxuICAgZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2gocmdiYSkpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmdiLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICByZ2JbaV0gPSBwYXJzZUludChtYXRjaFtpICsgMV0pO1xuICAgICAgfVxuICAgICAgYSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pO1xuICAgfVxuICAgZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2gocGVyKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZ2IubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgIHJnYltpXSA9IE1hdGgucm91bmQocGFyc2VGbG9hdChtYXRjaFtpICsgMV0pICogMi41NSk7XG4gICAgICB9XG4gICAgICBhID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG4gICB9XG4gICBlbHNlIGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChrZXl3b3JkKSkge1xuICAgICAgaWYgKG1hdGNoWzFdID09IFwidHJhbnNwYXJlbnRcIikge1xuICAgICAgICAgcmV0dXJuIFswLCAwLCAwLCAwXTtcbiAgICAgIH1cbiAgICAgIHJnYiA9IGNvbG9yTmFtZXNbbWF0Y2hbMV1dO1xuICAgICAgaWYgKCFyZ2IpIHtcbiAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgIH1cblxuICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZ2IubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJnYltpXSA9IHNjYWxlKHJnYltpXSwgMCwgMjU1KTtcbiAgIH1cbiAgIGlmICghYSAmJiBhICE9IDApIHtcbiAgICAgIGEgPSAxO1xuICAgfVxuICAgZWxzZSB7XG4gICAgICBhID0gc2NhbGUoYSwgMCwgMSk7XG4gICB9XG4gICByZ2JbM10gPSBhO1xuICAgcmV0dXJuIHJnYjtcbn1cblxuZnVuY3Rpb24gZ2V0SHNsYShzdHJpbmcpIHtcbiAgIGlmICghc3RyaW5nKSB7XG4gICAgICByZXR1cm47XG4gICB9XG4gICB2YXIgaHNsID0gL15oc2xhP1xcKFxccyooWystXT9cXGQrKSg/OmRlZyk/XFxzKixcXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqLFxccyooWystXT9bXFxkXFwuXSspJVxccyooPzosXFxzKihbKy1dP1tcXGRcXC5dKylcXHMqKT9cXCkvO1xuICAgdmFyIG1hdGNoID0gc3RyaW5nLm1hdGNoKGhzbCk7XG4gICBpZiAobWF0Y2gpIHtcbiAgICAgIHZhciBhbHBoYSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pO1xuICAgICAgdmFyIGggPSBzY2FsZShwYXJzZUludChtYXRjaFsxXSksIDAsIDM2MCksXG4gICAgICAgICAgcyA9IHNjYWxlKHBhcnNlRmxvYXQobWF0Y2hbMl0pLCAwLCAxMDApLFxuICAgICAgICAgIGwgPSBzY2FsZShwYXJzZUZsb2F0KG1hdGNoWzNdKSwgMCwgMTAwKSxcbiAgICAgICAgICBhID0gc2NhbGUoaXNOYU4oYWxwaGEpID8gMSA6IGFscGhhLCAwLCAxKTtcbiAgICAgIHJldHVybiBbaCwgcywgbCwgYV07XG4gICB9XG59XG5cbmZ1bmN0aW9uIGdldEh3YihzdHJpbmcpIHtcbiAgIGlmICghc3RyaW5nKSB7XG4gICAgICByZXR1cm47XG4gICB9XG4gICB2YXIgaHdiID0gL15od2JcXChcXHMqKFsrLV0/XFxkKykoPzpkZWcpP1xccyosXFxzKihbKy1dP1tcXGRcXC5dKyklXFxzKixcXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqKD86LFxccyooWystXT9bXFxkXFwuXSspXFxzKik/XFwpLztcbiAgIHZhciBtYXRjaCA9IHN0cmluZy5tYXRjaChod2IpO1xuICAgaWYgKG1hdGNoKSB7XG4gICAgdmFyIGFscGhhID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG4gICAgICB2YXIgaCA9IHNjYWxlKHBhcnNlSW50KG1hdGNoWzFdKSwgMCwgMzYwKSxcbiAgICAgICAgICB3ID0gc2NhbGUocGFyc2VGbG9hdChtYXRjaFsyXSksIDAsIDEwMCksXG4gICAgICAgICAgYiA9IHNjYWxlKHBhcnNlRmxvYXQobWF0Y2hbM10pLCAwLCAxMDApLFxuICAgICAgICAgIGEgPSBzY2FsZShpc05hTihhbHBoYSkgPyAxIDogYWxwaGEsIDAsIDEpO1xuICAgICAgcmV0dXJuIFtoLCB3LCBiLCBhXTtcbiAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmdiKHN0cmluZykge1xuICAgdmFyIHJnYmEgPSBnZXRSZ2JhKHN0cmluZyk7XG4gICByZXR1cm4gcmdiYSAmJiByZ2JhLnNsaWNlKDAsIDMpO1xufVxuXG5mdW5jdGlvbiBnZXRIc2woc3RyaW5nKSB7XG4gIHZhciBoc2xhID0gZ2V0SHNsYShzdHJpbmcpO1xuICByZXR1cm4gaHNsYSAmJiBoc2xhLnNsaWNlKDAsIDMpO1xufVxuXG5mdW5jdGlvbiBnZXRBbHBoYShzdHJpbmcpIHtcbiAgIHZhciB2YWxzID0gZ2V0UmdiYShzdHJpbmcpO1xuICAgaWYgKHZhbHMpIHtcbiAgICAgIHJldHVybiB2YWxzWzNdO1xuICAgfVxuICAgZWxzZSBpZiAodmFscyA9IGdldEhzbGEoc3RyaW5nKSkge1xuICAgICAgcmV0dXJuIHZhbHNbM107XG4gICB9XG4gICBlbHNlIGlmICh2YWxzID0gZ2V0SHdiKHN0cmluZykpIHtcbiAgICAgIHJldHVybiB2YWxzWzNdO1xuICAgfVxufVxuXG4vLyBnZW5lcmF0b3JzXG5mdW5jdGlvbiBoZXhTdHJpbmcocmdiKSB7XG4gICByZXR1cm4gXCIjXCIgKyBoZXhEb3VibGUocmdiWzBdKSArIGhleERvdWJsZShyZ2JbMV0pXG4gICAgICAgICAgICAgICsgaGV4RG91YmxlKHJnYlsyXSk7XG59XG5cbmZ1bmN0aW9uIHJnYlN0cmluZyhyZ2JhLCBhbHBoYSkge1xuICAgaWYgKGFscGhhIDwgMSB8fCAocmdiYVszXSAmJiByZ2JhWzNdIDwgMSkpIHtcbiAgICAgIHJldHVybiByZ2JhU3RyaW5nKHJnYmEsIGFscGhhKTtcbiAgIH1cbiAgIHJldHVybiBcInJnYihcIiArIHJnYmFbMF0gKyBcIiwgXCIgKyByZ2JhWzFdICsgXCIsIFwiICsgcmdiYVsyXSArIFwiKVwiO1xufVxuXG5mdW5jdGlvbiByZ2JhU3RyaW5nKHJnYmEsIGFscGhhKSB7XG4gICBpZiAoYWxwaGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWxwaGEgPSAocmdiYVszXSAhPT0gdW5kZWZpbmVkID8gcmdiYVszXSA6IDEpO1xuICAgfVxuICAgcmV0dXJuIFwicmdiYShcIiArIHJnYmFbMF0gKyBcIiwgXCIgKyByZ2JhWzFdICsgXCIsIFwiICsgcmdiYVsyXVxuICAgICAgICAgICArIFwiLCBcIiArIGFscGhhICsgXCIpXCI7XG59XG5cbmZ1bmN0aW9uIHBlcmNlbnRTdHJpbmcocmdiYSwgYWxwaGEpIHtcbiAgIGlmIChhbHBoYSA8IDEgfHwgKHJnYmFbM10gJiYgcmdiYVszXSA8IDEpKSB7XG4gICAgICByZXR1cm4gcGVyY2VudGFTdHJpbmcocmdiYSwgYWxwaGEpO1xuICAgfVxuICAgdmFyIHIgPSBNYXRoLnJvdW5kKHJnYmFbMF0vMjU1ICogMTAwKSxcbiAgICAgICBnID0gTWF0aC5yb3VuZChyZ2JhWzFdLzI1NSAqIDEwMCksXG4gICAgICAgYiA9IE1hdGgucm91bmQocmdiYVsyXS8yNTUgKiAxMDApO1xuXG4gICByZXR1cm4gXCJyZ2IoXCIgKyByICsgXCIlLCBcIiArIGcgKyBcIiUsIFwiICsgYiArIFwiJSlcIjtcbn1cblxuZnVuY3Rpb24gcGVyY2VudGFTdHJpbmcocmdiYSwgYWxwaGEpIHtcbiAgIHZhciByID0gTWF0aC5yb3VuZChyZ2JhWzBdLzI1NSAqIDEwMCksXG4gICAgICAgZyA9IE1hdGgucm91bmQocmdiYVsxXS8yNTUgKiAxMDApLFxuICAgICAgIGIgPSBNYXRoLnJvdW5kKHJnYmFbMl0vMjU1ICogMTAwKTtcbiAgIHJldHVybiBcInJnYmEoXCIgKyByICsgXCIlLCBcIiArIGcgKyBcIiUsIFwiICsgYiArIFwiJSwgXCIgKyAoYWxwaGEgfHwgcmdiYVszXSB8fCAxKSArIFwiKVwiO1xufVxuXG5mdW5jdGlvbiBoc2xTdHJpbmcoaHNsYSwgYWxwaGEpIHtcbiAgIGlmIChhbHBoYSA8IDEgfHwgKGhzbGFbM10gJiYgaHNsYVszXSA8IDEpKSB7XG4gICAgICByZXR1cm4gaHNsYVN0cmluZyhoc2xhLCBhbHBoYSk7XG4gICB9XG4gICByZXR1cm4gXCJoc2woXCIgKyBoc2xhWzBdICsgXCIsIFwiICsgaHNsYVsxXSArIFwiJSwgXCIgKyBoc2xhWzJdICsgXCIlKVwiO1xufVxuXG5mdW5jdGlvbiBoc2xhU3RyaW5nKGhzbGEsIGFscGhhKSB7XG4gICBpZiAoYWxwaGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWxwaGEgPSAoaHNsYVszXSAhPT0gdW5kZWZpbmVkID8gaHNsYVszXSA6IDEpO1xuICAgfVxuICAgcmV0dXJuIFwiaHNsYShcIiArIGhzbGFbMF0gKyBcIiwgXCIgKyBoc2xhWzFdICsgXCIlLCBcIiArIGhzbGFbMl0gKyBcIiUsIFwiXG4gICAgICAgICAgICsgYWxwaGEgKyBcIilcIjtcbn1cblxuLy8gaHdiIGlzIGEgYml0IGRpZmZlcmVudCB0aGFuIHJnYihhKSAmIGhzbChhKSBzaW5jZSB0aGVyZSBpcyBubyBhbHBoYSBzcGVjaWZpYyBzeW50YXhcbi8vIChod2IgaGF2ZSBhbHBoYSBvcHRpb25hbCAmIDEgaXMgZGVmYXVsdCB2YWx1ZSlcbmZ1bmN0aW9uIGh3YlN0cmluZyhod2IsIGFscGhhKSB7XG4gICBpZiAoYWxwaGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYWxwaGEgPSAoaHdiWzNdICE9PSB1bmRlZmluZWQgPyBod2JbM10gOiAxKTtcbiAgIH1cbiAgIHJldHVybiBcImh3YihcIiArIGh3YlswXSArIFwiLCBcIiArIGh3YlsxXSArIFwiJSwgXCIgKyBod2JbMl0gKyBcIiVcIlxuICAgICAgICAgICArIChhbHBoYSAhPT0gdW5kZWZpbmVkICYmIGFscGhhICE9PSAxID8gXCIsIFwiICsgYWxwaGEgOiBcIlwiKSArIFwiKVwiO1xufVxuXG5mdW5jdGlvbiBrZXl3b3JkKHJnYikge1xuICByZXR1cm4gcmV2ZXJzZU5hbWVzW3JnYi5zbGljZSgwLCAzKV07XG59XG5cbi8vIGhlbHBlcnNcbmZ1bmN0aW9uIHNjYWxlKG51bSwgbWluLCBtYXgpIHtcbiAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChtaW4sIG51bSksIG1heCk7XG59XG5cbmZ1bmN0aW9uIGhleERvdWJsZShudW0pIHtcbiAgdmFyIHN0ciA9IG51bS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgcmV0dXJuIChzdHIubGVuZ3RoIDwgMikgPyBcIjBcIiArIHN0ciA6IHN0cjtcbn1cblxuXG4vL2NyZWF0ZSBhIGxpc3Qgb2YgcmV2ZXJzZSBjb2xvciBuYW1lc1xudmFyIHJldmVyc2VOYW1lcyA9IHt9O1xuZm9yICh2YXIgbmFtZSBpbiBjb2xvck5hbWVzKSB7XG4gICByZXZlcnNlTmFtZXNbY29sb3JOYW1lc1tuYW1lXV0gPSBuYW1lO1xufVxuXG59LHtcIjZcIjo2fV0sMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4vKiBNSVQgbGljZW5zZSAqL1xudmFyIGNvbnZlcnQgPSByZXF1aXJlKDUpO1xudmFyIHN0cmluZyA9IHJlcXVpcmUoMik7XG5cbnZhciBDb2xvciA9IGZ1bmN0aW9uIChvYmopIHtcblx0aWYgKG9iaiBpbnN0YW5jZW9mIENvbG9yKSB7XG5cdFx0cmV0dXJuIG9iajtcblx0fVxuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgQ29sb3IpKSB7XG5cdFx0cmV0dXJuIG5ldyBDb2xvcihvYmopO1xuXHR9XG5cblx0dGhpcy52YWxpZCA9IGZhbHNlO1xuXHR0aGlzLnZhbHVlcyA9IHtcblx0XHRyZ2I6IFswLCAwLCAwXSxcblx0XHRoc2w6IFswLCAwLCAwXSxcblx0XHRoc3Y6IFswLCAwLCAwXSxcblx0XHRod2I6IFswLCAwLCAwXSxcblx0XHRjbXlrOiBbMCwgMCwgMCwgMF0sXG5cdFx0YWxwaGE6IDFcblx0fTtcblxuXHQvLyBwYXJzZSBDb2xvcigpIGFyZ3VtZW50XG5cdHZhciB2YWxzO1xuXHRpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcblx0XHR2YWxzID0gc3RyaW5nLmdldFJnYmEob2JqKTtcblx0XHRpZiAodmFscykge1xuXHRcdFx0dGhpcy5zZXRWYWx1ZXMoJ3JnYicsIHZhbHMpO1xuXHRcdH0gZWxzZSBpZiAodmFscyA9IHN0cmluZy5nZXRIc2xhKG9iaikpIHtcblx0XHRcdHRoaXMuc2V0VmFsdWVzKCdoc2wnLCB2YWxzKTtcblx0XHR9IGVsc2UgaWYgKHZhbHMgPSBzdHJpbmcuZ2V0SHdiKG9iaikpIHtcblx0XHRcdHRoaXMuc2V0VmFsdWVzKCdod2InLCB2YWxzKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcblx0XHR2YWxzID0gb2JqO1xuXHRcdGlmICh2YWxzLnIgIT09IHVuZGVmaW5lZCB8fCB2YWxzLnJlZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLnNldFZhbHVlcygncmdiJywgdmFscyk7XG5cdFx0fSBlbHNlIGlmICh2YWxzLmwgIT09IHVuZGVmaW5lZCB8fCB2YWxzLmxpZ2h0bmVzcyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLnNldFZhbHVlcygnaHNsJywgdmFscyk7XG5cdFx0fSBlbHNlIGlmICh2YWxzLnYgIT09IHVuZGVmaW5lZCB8fCB2YWxzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuc2V0VmFsdWVzKCdoc3YnLCB2YWxzKTtcblx0XHR9IGVsc2UgaWYgKHZhbHMudyAhPT0gdW5kZWZpbmVkIHx8IHZhbHMud2hpdGVuZXNzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuc2V0VmFsdWVzKCdod2InLCB2YWxzKTtcblx0XHR9IGVsc2UgaWYgKHZhbHMuYyAhPT0gdW5kZWZpbmVkIHx8IHZhbHMuY3lhbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLnNldFZhbHVlcygnY215aycsIHZhbHMpO1xuXHRcdH1cblx0fVxufTtcblxuQ29sb3IucHJvdG90eXBlID0ge1xuXHRpc1ZhbGlkOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMudmFsaWQ7XG5cdH0sXG5cdHJnYjogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnNldFNwYWNlKCdyZ2InLCBhcmd1bWVudHMpO1xuXHR9LFxuXHRoc2w6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRTcGFjZSgnaHNsJywgYXJndW1lbnRzKTtcblx0fSxcblx0aHN2OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0U3BhY2UoJ2hzdicsIGFyZ3VtZW50cyk7XG5cdH0sXG5cdGh3YjogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnNldFNwYWNlKCdod2InLCBhcmd1bWVudHMpO1xuXHR9LFxuXHRjbXlrOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0U3BhY2UoJ2NteWsnLCBhcmd1bWVudHMpO1xuXHR9LFxuXG5cdHJnYkFycmF5OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHRoaXMudmFsdWVzLnJnYjtcblx0fSxcblx0aHNsQXJyYXk6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy52YWx1ZXMuaHNsO1xuXHR9LFxuXHRoc3ZBcnJheTogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnZhbHVlcy5oc3Y7XG5cdH0sXG5cdGh3YkFycmF5OiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHZhbHVlcyA9IHRoaXMudmFsdWVzO1xuXHRcdGlmICh2YWx1ZXMuYWxwaGEgIT09IDEpIHtcblx0XHRcdHJldHVybiB2YWx1ZXMuaHdiLmNvbmNhdChbdmFsdWVzLmFscGhhXSk7XG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZXMuaHdiO1xuXHR9LFxuXHRjbXlrQXJyYXk6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gdGhpcy52YWx1ZXMuY215aztcblx0fSxcblx0cmdiYUFycmF5OiBmdW5jdGlvbiAoKSB7XG5cdFx0dmFyIHZhbHVlcyA9IHRoaXMudmFsdWVzO1xuXHRcdHJldHVybiB2YWx1ZXMucmdiLmNvbmNhdChbdmFsdWVzLmFscGhhXSk7XG5cdH0sXG5cdGhzbGFBcnJheTogZnVuY3Rpb24gKCkge1xuXHRcdHZhciB2YWx1ZXMgPSB0aGlzLnZhbHVlcztcblx0XHRyZXR1cm4gdmFsdWVzLmhzbC5jb25jYXQoW3ZhbHVlcy5hbHBoYV0pO1xuXHR9LFxuXHRhbHBoYTogZnVuY3Rpb24gKHZhbCkge1xuXHRcdGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMudmFsdWVzLmFscGhhO1xuXHRcdH1cblx0XHR0aGlzLnNldFZhbHVlcygnYWxwaGEnLCB2YWwpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHJlZDogZnVuY3Rpb24gKHZhbCkge1xuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ3JnYicsIDAsIHZhbCk7XG5cdH0sXG5cdGdyZWVuOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgncmdiJywgMSwgdmFsKTtcblx0fSxcblx0Ymx1ZTogZnVuY3Rpb24gKHZhbCkge1xuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ3JnYicsIDIsIHZhbCk7XG5cdH0sXG5cdGh1ZTogZnVuY3Rpb24gKHZhbCkge1xuXHRcdGlmICh2YWwpIHtcblx0XHRcdHZhbCAlPSAzNjA7XG5cdFx0XHR2YWwgPSB2YWwgPCAwID8gMzYwICsgdmFsIDogdmFsO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdoc2wnLCAwLCB2YWwpO1xuXHR9LFxuXHRzYXR1cmF0aW9uOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgnaHNsJywgMSwgdmFsKTtcblx0fSxcblx0bGlnaHRuZXNzOiBmdW5jdGlvbiAodmFsKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgnaHNsJywgMiwgdmFsKTtcblx0fSxcblx0c2F0dXJhdGlvbnY6IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdoc3YnLCAxLCB2YWwpO1xuXHR9LFxuXHR3aGl0ZW5lc3M6IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdod2InLCAxLCB2YWwpO1xuXHR9LFxuXHRibGFja25lc3M6IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdod2InLCAyLCB2YWwpO1xuXHR9LFxuXHR2YWx1ZTogZnVuY3Rpb24gKHZhbCkge1xuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ2hzdicsIDIsIHZhbCk7XG5cdH0sXG5cdGN5YW46IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdjbXlrJywgMCwgdmFsKTtcblx0fSxcblx0bWFnZW50YTogZnVuY3Rpb24gKHZhbCkge1xuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ2NteWsnLCAxLCB2YWwpO1xuXHR9LFxuXHR5ZWxsb3c6IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdjbXlrJywgMiwgdmFsKTtcblx0fSxcblx0YmxhY2s6IGZ1bmN0aW9uICh2YWwpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdjbXlrJywgMywgdmFsKTtcblx0fSxcblxuXHRoZXhTdHJpbmc6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gc3RyaW5nLmhleFN0cmluZyh0aGlzLnZhbHVlcy5yZ2IpO1xuXHR9LFxuXHRyZ2JTdHJpbmc6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gc3RyaW5nLnJnYlN0cmluZyh0aGlzLnZhbHVlcy5yZ2IsIHRoaXMudmFsdWVzLmFscGhhKTtcblx0fSxcblx0cmdiYVN0cmluZzogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBzdHJpbmcucmdiYVN0cmluZyh0aGlzLnZhbHVlcy5yZ2IsIHRoaXMudmFsdWVzLmFscGhhKTtcblx0fSxcblx0cGVyY2VudFN0cmluZzogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBzdHJpbmcucGVyY2VudFN0cmluZyh0aGlzLnZhbHVlcy5yZ2IsIHRoaXMudmFsdWVzLmFscGhhKTtcblx0fSxcblx0aHNsU3RyaW5nOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHN0cmluZy5oc2xTdHJpbmcodGhpcy52YWx1ZXMuaHNsLCB0aGlzLnZhbHVlcy5hbHBoYSk7XG5cdH0sXG5cdGhzbGFTdHJpbmc6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gc3RyaW5nLmhzbGFTdHJpbmcodGhpcy52YWx1ZXMuaHNsLCB0aGlzLnZhbHVlcy5hbHBoYSk7XG5cdH0sXG5cdGh3YlN0cmluZzogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBzdHJpbmcuaHdiU3RyaW5nKHRoaXMudmFsdWVzLmh3YiwgdGhpcy52YWx1ZXMuYWxwaGEpO1xuXHR9LFxuXHRrZXl3b3JkOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIHN0cmluZy5rZXl3b3JkKHRoaXMudmFsdWVzLnJnYiwgdGhpcy52YWx1ZXMuYWxwaGEpO1xuXHR9LFxuXG5cdHJnYk51bWJlcjogZnVuY3Rpb24gKCkge1xuXHRcdHZhciByZ2IgPSB0aGlzLnZhbHVlcy5yZ2I7XG5cdFx0cmV0dXJuIChyZ2JbMF0gPDwgMTYpIHwgKHJnYlsxXSA8PCA4KSB8IHJnYlsyXTtcblx0fSxcblxuXHRsdW1pbm9zaXR5OiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxuXHRcdHZhciByZ2IgPSB0aGlzLnZhbHVlcy5yZ2I7XG5cdFx0dmFyIGx1bSA9IFtdO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgcmdiLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgY2hhbiA9IHJnYltpXSAvIDI1NTtcblx0XHRcdGx1bVtpXSA9IChjaGFuIDw9IDAuMDM5MjgpID8gY2hhbiAvIDEyLjkyIDogTWF0aC5wb3coKChjaGFuICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpO1xuXHRcdH1cblx0XHRyZXR1cm4gMC4yMTI2ICogbHVtWzBdICsgMC43MTUyICogbHVtWzFdICsgMC4wNzIyICogbHVtWzJdO1xuXHR9LFxuXG5cdGNvbnRyYXN0OiBmdW5jdGlvbiAoY29sb3IyKSB7XG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNjb250cmFzdC1yYXRpb2RlZlxuXHRcdHZhciBsdW0xID0gdGhpcy5sdW1pbm9zaXR5KCk7XG5cdFx0dmFyIGx1bTIgPSBjb2xvcjIubHVtaW5vc2l0eSgpO1xuXHRcdGlmIChsdW0xID4gbHVtMikge1xuXHRcdFx0cmV0dXJuIChsdW0xICsgMC4wNSkgLyAobHVtMiArIDAuMDUpO1xuXHRcdH1cblx0XHRyZXR1cm4gKGx1bTIgKyAwLjA1KSAvIChsdW0xICsgMC4wNSk7XG5cdH0sXG5cblx0bGV2ZWw6IGZ1bmN0aW9uIChjb2xvcjIpIHtcblx0XHR2YXIgY29udHJhc3RSYXRpbyA9IHRoaXMuY29udHJhc3QoY29sb3IyKTtcblx0XHRpZiAoY29udHJhc3RSYXRpbyA+PSA3LjEpIHtcblx0XHRcdHJldHVybiAnQUFBJztcblx0XHR9XG5cblx0XHRyZXR1cm4gKGNvbnRyYXN0UmF0aW8gPj0gNC41KSA/ICdBQScgOiAnJztcblx0fSxcblxuXHRkYXJrOiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gWUlRIGVxdWF0aW9uIGZyb20gaHR0cDovLzI0d2F5cy5vcmcvMjAxMC9jYWxjdWxhdGluZy1jb2xvci1jb250cmFzdFxuXHRcdHZhciByZ2IgPSB0aGlzLnZhbHVlcy5yZ2I7XG5cdFx0dmFyIHlpcSA9IChyZ2JbMF0gKiAyOTkgKyByZ2JbMV0gKiA1ODcgKyByZ2JbMl0gKiAxMTQpIC8gMTAwMDtcblx0XHRyZXR1cm4geWlxIDwgMTI4O1xuXHR9LFxuXG5cdGxpZ2h0OiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuICF0aGlzLmRhcmsoKTtcblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmdiID0gW107XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdHJnYltpXSA9IDI1NSAtIHRoaXMudmFsdWVzLnJnYltpXTtcblx0XHR9XG5cdFx0dGhpcy5zZXRWYWx1ZXMoJ3JnYicsIHJnYik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0bGlnaHRlbjogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMudmFsdWVzLmhzbDtcblx0XHRoc2xbMl0gKz0gaHNsWzJdICogcmF0aW87XG5cdFx0dGhpcy5zZXRWYWx1ZXMoJ2hzbCcsIGhzbCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0ZGFya2VuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHNsID0gdGhpcy52YWx1ZXMuaHNsO1xuXHRcdGhzbFsyXSAtPSBoc2xbMl0gKiByYXRpbztcblx0XHR0aGlzLnNldFZhbHVlcygnaHNsJywgaHNsKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRzYXR1cmF0ZTogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMudmFsdWVzLmhzbDtcblx0XHRoc2xbMV0gKz0gaHNsWzFdICogcmF0aW87XG5cdFx0dGhpcy5zZXRWYWx1ZXMoJ2hzbCcsIGhzbCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0ZGVzYXR1cmF0ZTogZnVuY3Rpb24gKHJhdGlvKSB7XG5cdFx0dmFyIGhzbCA9IHRoaXMudmFsdWVzLmhzbDtcblx0XHRoc2xbMV0gLT0gaHNsWzFdICogcmF0aW87XG5cdFx0dGhpcy5zZXRWYWx1ZXMoJ2hzbCcsIGhzbCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0d2hpdGVuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHdiID0gdGhpcy52YWx1ZXMuaHdiO1xuXHRcdGh3YlsxXSArPSBod2JbMV0gKiByYXRpbztcblx0XHR0aGlzLnNldFZhbHVlcygnaHdiJywgaHdiKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRibGFja2VuOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgaHdiID0gdGhpcy52YWx1ZXMuaHdiO1xuXHRcdGh3YlsyXSArPSBod2JbMl0gKiByYXRpbztcblx0XHR0aGlzLnNldFZhbHVlcygnaHdiJywgaHdiKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRncmV5c2NhbGU6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgcmdiID0gdGhpcy52YWx1ZXMucmdiO1xuXHRcdC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR3JheXNjYWxlI0NvbnZlcnRpbmdfY29sb3JfdG9fZ3JheXNjYWxlXG5cdFx0dmFyIHZhbCA9IHJnYlswXSAqIDAuMyArIHJnYlsxXSAqIDAuNTkgKyByZ2JbMl0gKiAwLjExO1xuXHRcdHRoaXMuc2V0VmFsdWVzKCdyZ2InLCBbdmFsLCB2YWwsIHZhbF0pO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdGNsZWFyZXI6IGZ1bmN0aW9uIChyYXRpbykge1xuXHRcdHZhciBhbHBoYSA9IHRoaXMudmFsdWVzLmFscGhhO1xuXHRcdHRoaXMuc2V0VmFsdWVzKCdhbHBoYScsIGFscGhhIC0gKGFscGhhICogcmF0aW8pKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRvcGFxdWVyOiBmdW5jdGlvbiAocmF0aW8pIHtcblx0XHR2YXIgYWxwaGEgPSB0aGlzLnZhbHVlcy5hbHBoYTtcblx0XHR0aGlzLnNldFZhbHVlcygnYWxwaGEnLCBhbHBoYSArIChhbHBoYSAqIHJhdGlvKSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0cm90YXRlOiBmdW5jdGlvbiAoZGVncmVlcykge1xuXHRcdHZhciBoc2wgPSB0aGlzLnZhbHVlcy5oc2w7XG5cdFx0dmFyIGh1ZSA9IChoc2xbMF0gKyBkZWdyZWVzKSAlIDM2MDtcblx0XHRoc2xbMF0gPSBodWUgPCAwID8gMzYwICsgaHVlIDogaHVlO1xuXHRcdHRoaXMuc2V0VmFsdWVzKCdoc2wnLCBoc2wpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBQb3J0ZWQgZnJvbSBzYXNzIGltcGxlbWVudGF0aW9uIGluIENcblx0ICogaHR0cHM6Ly9naXRodWIuY29tL3Nhc3MvbGlic2Fzcy9ibG9iLzBlNmI0YTI4NTAwOTIzNTZhYTNlY2UwN2M2YjI0OWYwMjIxY2FjZWQvZnVuY3Rpb25zLmNwcCNMMjA5XG5cdCAqL1xuXHRtaXg6IGZ1bmN0aW9uIChtaXhpbkNvbG9yLCB3ZWlnaHQpIHtcblx0XHR2YXIgY29sb3IxID0gdGhpcztcblx0XHR2YXIgY29sb3IyID0gbWl4aW5Db2xvcjtcblx0XHR2YXIgcCA9IHdlaWdodCA9PT0gdW5kZWZpbmVkID8gMC41IDogd2VpZ2h0O1xuXG5cdFx0dmFyIHcgPSAyICogcCAtIDE7XG5cdFx0dmFyIGEgPSBjb2xvcjEuYWxwaGEoKSAtIGNvbG9yMi5hbHBoYSgpO1xuXG5cdFx0dmFyIHcxID0gKCgodyAqIGEgPT09IC0xKSA/IHcgOiAodyArIGEpIC8gKDEgKyB3ICogYSkpICsgMSkgLyAyLjA7XG5cdFx0dmFyIHcyID0gMSAtIHcxO1xuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5yZ2IoXG5cdFx0XHRcdHcxICogY29sb3IxLnJlZCgpICsgdzIgKiBjb2xvcjIucmVkKCksXG5cdFx0XHRcdHcxICogY29sb3IxLmdyZWVuKCkgKyB3MiAqIGNvbG9yMi5ncmVlbigpLFxuXHRcdFx0XHR3MSAqIGNvbG9yMS5ibHVlKCkgKyB3MiAqIGNvbG9yMi5ibHVlKClcblx0XHRcdClcblx0XHRcdC5hbHBoYShjb2xvcjEuYWxwaGEoKSAqIHAgKyBjb2xvcjIuYWxwaGEoKSAqICgxIC0gcCkpO1xuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB0aGlzLnJnYigpO1xuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cdFx0Ly8gTk9URShTQik6IHVzaW5nIG5vZGUtY2xvbmUgY3JlYXRlcyBhIGRlcGVuZGVuY3kgdG8gQnVmZmVyIHdoZW4gdXNpbmcgYnJvd3NlcmlmeSxcblx0XHQvLyBtYWtpbmcgdGhlIGZpbmFsIGJ1aWxkIHdheSB0byBiaWcgdG8gZW1iZWQgaW4gQ2hhcnQuanMuIFNvIGxldCdzIGRvIGl0IG1hbnVhbGx5LFxuXHRcdC8vIGFzc3VtaW5nIHRoYXQgdmFsdWVzIHRvIGNsb25lIGFyZSAxIGRpbWVuc2lvbiBhcnJheXMgY29udGFpbmluZyBvbmx5IG51bWJlcnMsXG5cdFx0Ly8gZXhjZXB0ICdhbHBoYScgd2hpY2ggaXMgYSBudW1iZXIuXG5cdFx0dmFyIHJlc3VsdCA9IG5ldyBDb2xvcigpO1xuXHRcdHZhciBzb3VyY2UgPSB0aGlzLnZhbHVlcztcblx0XHR2YXIgdGFyZ2V0ID0gcmVzdWx0LnZhbHVlcztcblx0XHR2YXIgdmFsdWUsIHR5cGU7XG5cblx0XHRmb3IgKHZhciBwcm9wIGluIHNvdXJjZSkge1xuXHRcdFx0aWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuXHRcdFx0XHR2YWx1ZSA9IHNvdXJjZVtwcm9wXTtcblx0XHRcdFx0dHlwZSA9ICh7fSkudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG5cdFx0XHRcdGlmICh0eXBlID09PSAnW29iamVjdCBBcnJheV0nKSB7XG5cdFx0XHRcdFx0dGFyZ2V0W3Byb3BdID0gdmFsdWUuc2xpY2UoMCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gJ1tvYmplY3QgTnVtYmVyXScpIHtcblx0XHRcdFx0XHR0YXJnZXRbcHJvcF0gPSB2YWx1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCd1bmV4cGVjdGVkIGNvbG9yIHZhbHVlOicsIHZhbHVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn07XG5cbkNvbG9yLnByb3RvdHlwZS5zcGFjZXMgPSB7XG5cdHJnYjogWydyZWQnLCAnZ3JlZW4nLCAnYmx1ZSddLFxuXHRoc2w6IFsnaHVlJywgJ3NhdHVyYXRpb24nLCAnbGlnaHRuZXNzJ10sXG5cdGhzdjogWydodWUnLCAnc2F0dXJhdGlvbicsICd2YWx1ZSddLFxuXHRod2I6IFsnaHVlJywgJ3doaXRlbmVzcycsICdibGFja25lc3MnXSxcblx0Y215azogWydjeWFuJywgJ21hZ2VudGEnLCAneWVsbG93JywgJ2JsYWNrJ11cbn07XG5cbkNvbG9yLnByb3RvdHlwZS5tYXhlcyA9IHtcblx0cmdiOiBbMjU1LCAyNTUsIDI1NV0sXG5cdGhzbDogWzM2MCwgMTAwLCAxMDBdLFxuXHRoc3Y6IFszNjAsIDEwMCwgMTAwXSxcblx0aHdiOiBbMzYwLCAxMDAsIDEwMF0sXG5cdGNteWs6IFsxMDAsIDEwMCwgMTAwLCAxMDBdXG59O1xuXG5Db2xvci5wcm90b3R5cGUuZ2V0VmFsdWVzID0gZnVuY3Rpb24gKHNwYWNlKSB7XG5cdHZhciB2YWx1ZXMgPSB0aGlzLnZhbHVlcztcblx0dmFyIHZhbHMgPSB7fTtcblxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHNwYWNlLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFsc1tzcGFjZS5jaGFyQXQoaSldID0gdmFsdWVzW3NwYWNlXVtpXTtcblx0fVxuXG5cdGlmICh2YWx1ZXMuYWxwaGEgIT09IDEpIHtcblx0XHR2YWxzLmEgPSB2YWx1ZXMuYWxwaGE7XG5cdH1cblxuXHQvLyB7cjogMjU1LCBnOiAyNTUsIGI6IDI1NSwgYTogMC40fVxuXHRyZXR1cm4gdmFscztcbn07XG5cbkNvbG9yLnByb3RvdHlwZS5zZXRWYWx1ZXMgPSBmdW5jdGlvbiAoc3BhY2UsIHZhbHMpIHtcblx0dmFyIHZhbHVlcyA9IHRoaXMudmFsdWVzO1xuXHR2YXIgc3BhY2VzID0gdGhpcy5zcGFjZXM7XG5cdHZhciBtYXhlcyA9IHRoaXMubWF4ZXM7XG5cdHZhciBhbHBoYSA9IDE7XG5cdHZhciBpO1xuXG5cdHRoaXMudmFsaWQgPSB0cnVlO1xuXG5cdGlmIChzcGFjZSA9PT0gJ2FscGhhJykge1xuXHRcdGFscGhhID0gdmFscztcblx0fSBlbHNlIGlmICh2YWxzLmxlbmd0aCkge1xuXHRcdC8vIFsxMCwgMTAsIDEwXVxuXHRcdHZhbHVlc1tzcGFjZV0gPSB2YWxzLnNsaWNlKDAsIHNwYWNlLmxlbmd0aCk7XG5cdFx0YWxwaGEgPSB2YWxzW3NwYWNlLmxlbmd0aF07XG5cdH0gZWxzZSBpZiAodmFsc1tzcGFjZS5jaGFyQXQoMCldICE9PSB1bmRlZmluZWQpIHtcblx0XHQvLyB7cjogMTAsIGc6IDEwLCBiOiAxMH1cblx0XHRmb3IgKGkgPSAwOyBpIDwgc3BhY2UubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhbHVlc1tzcGFjZV1baV0gPSB2YWxzW3NwYWNlLmNoYXJBdChpKV07XG5cdFx0fVxuXG5cdFx0YWxwaGEgPSB2YWxzLmE7XG5cdH0gZWxzZSBpZiAodmFsc1tzcGFjZXNbc3BhY2VdWzBdXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8ge3JlZDogMTAsIGdyZWVuOiAxMCwgYmx1ZTogMTB9XG5cdFx0dmFyIGNoYW5zID0gc3BhY2VzW3NwYWNlXTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBzcGFjZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFsdWVzW3NwYWNlXVtpXSA9IHZhbHNbY2hhbnNbaV1dO1xuXHRcdH1cblxuXHRcdGFscGhhID0gdmFscy5hbHBoYTtcblx0fVxuXG5cdHZhbHVlcy5hbHBoYSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIChhbHBoYSA9PT0gdW5kZWZpbmVkID8gdmFsdWVzLmFscGhhIDogYWxwaGEpKSk7XG5cblx0aWYgKHNwYWNlID09PSAnYWxwaGEnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0dmFyIGNhcHBlZDtcblxuXHQvLyBjYXAgdmFsdWVzIG9mIHRoZSBzcGFjZSBwcmlvciBjb252ZXJ0aW5nIGFsbCB2YWx1ZXNcblx0Zm9yIChpID0gMDsgaSA8IHNwYWNlLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y2FwcGVkID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obWF4ZXNbc3BhY2VdW2ldLCB2YWx1ZXNbc3BhY2VdW2ldKSk7XG5cdFx0dmFsdWVzW3NwYWNlXVtpXSA9IE1hdGgucm91bmQoY2FwcGVkKTtcblx0fVxuXG5cdC8vIGNvbnZlcnQgdG8gYWxsIHRoZSBvdGhlciBjb2xvciBzcGFjZXNcblx0Zm9yICh2YXIgc25hbWUgaW4gc3BhY2VzKSB7XG5cdFx0aWYgKHNuYW1lICE9PSBzcGFjZSkge1xuXHRcdFx0dmFsdWVzW3NuYW1lXSA9IGNvbnZlcnRbc3BhY2VdW3NuYW1lXSh2YWx1ZXNbc3BhY2VdKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcbn07XG5cbkNvbG9yLnByb3RvdHlwZS5zZXRTcGFjZSA9IGZ1bmN0aW9uIChzcGFjZSwgYXJncykge1xuXHR2YXIgdmFscyA9IGFyZ3NbMF07XG5cblx0aWYgKHZhbHMgPT09IHVuZGVmaW5lZCkge1xuXHRcdC8vIGNvbG9yLnJnYigpXG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmFsdWVzKHNwYWNlKTtcblx0fVxuXG5cdC8vIGNvbG9yLnJnYigxMCwgMTAsIDEwKVxuXHRpZiAodHlwZW9mIHZhbHMgPT09ICdudW1iZXInKSB7XG5cdFx0dmFscyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3MpO1xuXHR9XG5cblx0dGhpcy5zZXRWYWx1ZXMoc3BhY2UsIHZhbHMpO1xuXHRyZXR1cm4gdGhpcztcbn07XG5cbkNvbG9yLnByb3RvdHlwZS5zZXRDaGFubmVsID0gZnVuY3Rpb24gKHNwYWNlLCBpbmRleCwgdmFsKSB7XG5cdHZhciBzdmFsdWVzID0gdGhpcy52YWx1ZXNbc3BhY2VdO1xuXHRpZiAodmFsID09PSB1bmRlZmluZWQpIHtcblx0XHQvLyBjb2xvci5yZWQoKVxuXHRcdHJldHVybiBzdmFsdWVzW2luZGV4XTtcblx0fSBlbHNlIGlmICh2YWwgPT09IHN2YWx1ZXNbaW5kZXhdKSB7XG5cdFx0Ly8gY29sb3IucmVkKGNvbG9yLnJlZCgpKVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0Ly8gY29sb3IucmVkKDEwMClcblx0c3ZhbHVlc1tpbmRleF0gPSB2YWw7XG5cdHRoaXMuc2V0VmFsdWVzKHNwYWNlLCBzdmFsdWVzKTtcblxuXHRyZXR1cm4gdGhpcztcbn07XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuXHR3aW5kb3cuQ29sb3IgPSBDb2xvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBDb2xvcjtcblxufSx7XCIyXCI6MixcIjVcIjo1fV0sNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4vKiBNSVQgbGljZW5zZSAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgcmdiMmhzbDogcmdiMmhzbCxcbiAgcmdiMmhzdjogcmdiMmhzdixcbiAgcmdiMmh3YjogcmdiMmh3YixcbiAgcmdiMmNteWs6IHJnYjJjbXlrLFxuICByZ2Iya2V5d29yZDogcmdiMmtleXdvcmQsXG4gIHJnYjJ4eXo6IHJnYjJ4eXosXG4gIHJnYjJsYWI6IHJnYjJsYWIsXG4gIHJnYjJsY2g6IHJnYjJsY2gsXG5cbiAgaHNsMnJnYjogaHNsMnJnYixcbiAgaHNsMmhzdjogaHNsMmhzdixcbiAgaHNsMmh3YjogaHNsMmh3YixcbiAgaHNsMmNteWs6IGhzbDJjbXlrLFxuICBoc2wya2V5d29yZDogaHNsMmtleXdvcmQsXG5cbiAgaHN2MnJnYjogaHN2MnJnYixcbiAgaHN2MmhzbDogaHN2MmhzbCxcbiAgaHN2Mmh3YjogaHN2Mmh3YixcbiAgaHN2MmNteWs6IGhzdjJjbXlrLFxuICBoc3Yya2V5d29yZDogaHN2MmtleXdvcmQsXG5cbiAgaHdiMnJnYjogaHdiMnJnYixcbiAgaHdiMmhzbDogaHdiMmhzbCxcbiAgaHdiMmhzdjogaHdiMmhzdixcbiAgaHdiMmNteWs6IGh3YjJjbXlrLFxuICBod2Iya2V5d29yZDogaHdiMmtleXdvcmQsXG5cbiAgY215azJyZ2I6IGNteWsycmdiLFxuICBjbXlrMmhzbDogY215azJoc2wsXG4gIGNteWsyaHN2OiBjbXlrMmhzdixcbiAgY215azJod2I6IGNteWsyaHdiLFxuICBjbXlrMmtleXdvcmQ6IGNteWsya2V5d29yZCxcblxuICBrZXl3b3JkMnJnYjoga2V5d29yZDJyZ2IsXG4gIGtleXdvcmQyaHNsOiBrZXl3b3JkMmhzbCxcbiAga2V5d29yZDJoc3Y6IGtleXdvcmQyaHN2LFxuICBrZXl3b3JkMmh3Yjoga2V5d29yZDJod2IsXG4gIGtleXdvcmQyY215azoga2V5d29yZDJjbXlrLFxuICBrZXl3b3JkMmxhYjoga2V5d29yZDJsYWIsXG4gIGtleXdvcmQyeHl6OiBrZXl3b3JkMnh5eixcblxuICB4eXoycmdiOiB4eXoycmdiLFxuICB4eXoybGFiOiB4eXoybGFiLFxuICB4eXoybGNoOiB4eXoybGNoLFxuXG4gIGxhYjJ4eXo6IGxhYjJ4eXosXG4gIGxhYjJyZ2I6IGxhYjJyZ2IsXG4gIGxhYjJsY2g6IGxhYjJsY2gsXG5cbiAgbGNoMmxhYjogbGNoMmxhYixcbiAgbGNoMnh5ejogbGNoMnh5eixcbiAgbGNoMnJnYjogbGNoMnJnYlxufVxuXG5cbmZ1bmN0aW9uIHJnYjJoc2wocmdiKSB7XG4gIHZhciByID0gcmdiWzBdLzI1NSxcbiAgICAgIGcgPSByZ2JbMV0vMjU1LFxuICAgICAgYiA9IHJnYlsyXS8yNTUsXG4gICAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKSxcbiAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLFxuICAgICAgZGVsdGEgPSBtYXggLSBtaW4sXG4gICAgICBoLCBzLCBsO1xuXG4gIGlmIChtYXggPT0gbWluKVxuICAgIGggPSAwO1xuICBlbHNlIGlmIChyID09IG1heClcbiAgICBoID0gKGcgLSBiKSAvIGRlbHRhO1xuICBlbHNlIGlmIChnID09IG1heClcbiAgICBoID0gMiArIChiIC0gcikgLyBkZWx0YTtcbiAgZWxzZSBpZiAoYiA9PSBtYXgpXG4gICAgaCA9IDQgKyAociAtIGcpLyBkZWx0YTtcblxuICBoID0gTWF0aC5taW4oaCAqIDYwLCAzNjApO1xuXG4gIGlmIChoIDwgMClcbiAgICBoICs9IDM2MDtcblxuICBsID0gKG1pbiArIG1heCkgLyAyO1xuXG4gIGlmIChtYXggPT0gbWluKVxuICAgIHMgPSAwO1xuICBlbHNlIGlmIChsIDw9IDAuNSlcbiAgICBzID0gZGVsdGEgLyAobWF4ICsgbWluKTtcbiAgZWxzZVxuICAgIHMgPSBkZWx0YSAvICgyIC0gbWF4IC0gbWluKTtcblxuICByZXR1cm4gW2gsIHMgKiAxMDAsIGwgKiAxMDBdO1xufVxuXG5mdW5jdGlvbiByZ2IyaHN2KHJnYikge1xuICB2YXIgciA9IHJnYlswXSxcbiAgICAgIGcgPSByZ2JbMV0sXG4gICAgICBiID0gcmdiWzJdLFxuICAgICAgbWluID0gTWF0aC5taW4ociwgZywgYiksXG4gICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSxcbiAgICAgIGRlbHRhID0gbWF4IC0gbWluLFxuICAgICAgaCwgcywgdjtcblxuICBpZiAobWF4ID09IDApXG4gICAgcyA9IDA7XG4gIGVsc2VcbiAgICBzID0gKGRlbHRhL21heCAqIDEwMDApLzEwO1xuXG4gIGlmIChtYXggPT0gbWluKVxuICAgIGggPSAwO1xuICBlbHNlIGlmIChyID09IG1heClcbiAgICBoID0gKGcgLSBiKSAvIGRlbHRhO1xuICBlbHNlIGlmIChnID09IG1heClcbiAgICBoID0gMiArIChiIC0gcikgLyBkZWx0YTtcbiAgZWxzZSBpZiAoYiA9PSBtYXgpXG4gICAgaCA9IDQgKyAociAtIGcpIC8gZGVsdGE7XG5cbiAgaCA9IE1hdGgubWluKGggKiA2MCwgMzYwKTtcblxuICBpZiAoaCA8IDApXG4gICAgaCArPSAzNjA7XG5cbiAgdiA9ICgobWF4IC8gMjU1KSAqIDEwMDApIC8gMTA7XG5cbiAgcmV0dXJuIFtoLCBzLCB2XTtcbn1cblxuZnVuY3Rpb24gcmdiMmh3YihyZ2IpIHtcbiAgdmFyIHIgPSByZ2JbMF0sXG4gICAgICBnID0gcmdiWzFdLFxuICAgICAgYiA9IHJnYlsyXSxcbiAgICAgIGggPSByZ2IyaHNsKHJnYilbMF0sXG4gICAgICB3ID0gMS8yNTUgKiBNYXRoLm1pbihyLCBNYXRoLm1pbihnLCBiKSksXG4gICAgICBiID0gMSAtIDEvMjU1ICogTWF0aC5tYXgociwgTWF0aC5tYXgoZywgYikpO1xuXG4gIHJldHVybiBbaCwgdyAqIDEwMCwgYiAqIDEwMF07XG59XG5cbmZ1bmN0aW9uIHJnYjJjbXlrKHJnYikge1xuICB2YXIgciA9IHJnYlswXSAvIDI1NSxcbiAgICAgIGcgPSByZ2JbMV0gLyAyNTUsXG4gICAgICBiID0gcmdiWzJdIC8gMjU1LFxuICAgICAgYywgbSwgeSwgaztcblxuICBrID0gTWF0aC5taW4oMSAtIHIsIDEgLSBnLCAxIC0gYik7XG4gIGMgPSAoMSAtIHIgLSBrKSAvICgxIC0gaykgfHwgMDtcbiAgbSA9ICgxIC0gZyAtIGspIC8gKDEgLSBrKSB8fCAwO1xuICB5ID0gKDEgLSBiIC0gaykgLyAoMSAtIGspIHx8IDA7XG4gIHJldHVybiBbYyAqIDEwMCwgbSAqIDEwMCwgeSAqIDEwMCwgayAqIDEwMF07XG59XG5cbmZ1bmN0aW9uIHJnYjJrZXl3b3JkKHJnYikge1xuICByZXR1cm4gcmV2ZXJzZUtleXdvcmRzW0pTT04uc3RyaW5naWZ5KHJnYildO1xufVxuXG5mdW5jdGlvbiByZ2IyeHl6KHJnYikge1xuICB2YXIgciA9IHJnYlswXSAvIDI1NSxcbiAgICAgIGcgPSByZ2JbMV0gLyAyNTUsXG4gICAgICBiID0gcmdiWzJdIC8gMjU1O1xuXG4gIC8vIGFzc3VtZSBzUkdCXG4gIHIgPSByID4gMC4wNDA0NSA/IE1hdGgucG93KCgociArIDAuMDU1KSAvIDEuMDU1KSwgMi40KSA6IChyIC8gMTIuOTIpO1xuICBnID0gZyA+IDAuMDQwNDUgPyBNYXRoLnBvdygoKGcgKyAwLjA1NSkgLyAxLjA1NSksIDIuNCkgOiAoZyAvIDEyLjkyKTtcbiAgYiA9IGIgPiAwLjA0MDQ1ID8gTWF0aC5wb3coKChiICsgMC4wNTUpIC8gMS4wNTUpLCAyLjQpIDogKGIgLyAxMi45Mik7XG5cbiAgdmFyIHggPSAociAqIDAuNDEyNCkgKyAoZyAqIDAuMzU3NikgKyAoYiAqIDAuMTgwNSk7XG4gIHZhciB5ID0gKHIgKiAwLjIxMjYpICsgKGcgKiAwLjcxNTIpICsgKGIgKiAwLjA3MjIpO1xuICB2YXIgeiA9IChyICogMC4wMTkzKSArIChnICogMC4xMTkyKSArIChiICogMC45NTA1KTtcblxuICByZXR1cm4gW3ggKiAxMDAsIHkgKjEwMCwgeiAqIDEwMF07XG59XG5cbmZ1bmN0aW9uIHJnYjJsYWIocmdiKSB7XG4gIHZhciB4eXogPSByZ2IyeHl6KHJnYiksXG4gICAgICAgIHggPSB4eXpbMF0sXG4gICAgICAgIHkgPSB4eXpbMV0sXG4gICAgICAgIHogPSB4eXpbMl0sXG4gICAgICAgIGwsIGEsIGI7XG5cbiAgeCAvPSA5NS4wNDc7XG4gIHkgLz0gMTAwO1xuICB6IC89IDEwOC44ODM7XG5cbiAgeCA9IHggPiAwLjAwODg1NiA/IE1hdGgucG93KHgsIDEvMykgOiAoNy43ODcgKiB4KSArICgxNiAvIDExNik7XG4gIHkgPSB5ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh5LCAxLzMpIDogKDcuNzg3ICogeSkgKyAoMTYgLyAxMTYpO1xuICB6ID0geiA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeiwgMS8zKSA6ICg3Ljc4NyAqIHopICsgKDE2IC8gMTE2KTtcblxuICBsID0gKDExNiAqIHkpIC0gMTY7XG4gIGEgPSA1MDAgKiAoeCAtIHkpO1xuICBiID0gMjAwICogKHkgLSB6KTtcblxuICByZXR1cm4gW2wsIGEsIGJdO1xufVxuXG5mdW5jdGlvbiByZ2IybGNoKGFyZ3MpIHtcbiAgcmV0dXJuIGxhYjJsY2gocmdiMmxhYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGhzbDJyZ2IoaHNsKSB7XG4gIHZhciBoID0gaHNsWzBdIC8gMzYwLFxuICAgICAgcyA9IGhzbFsxXSAvIDEwMCxcbiAgICAgIGwgPSBoc2xbMl0gLyAxMDAsXG4gICAgICB0MSwgdDIsIHQzLCByZ2IsIHZhbDtcblxuICBpZiAocyA9PSAwKSB7XG4gICAgdmFsID0gbCAqIDI1NTtcbiAgICByZXR1cm4gW3ZhbCwgdmFsLCB2YWxdO1xuICB9XG5cbiAgaWYgKGwgPCAwLjUpXG4gICAgdDIgPSBsICogKDEgKyBzKTtcbiAgZWxzZVxuICAgIHQyID0gbCArIHMgLSBsICogcztcbiAgdDEgPSAyICogbCAtIHQyO1xuXG4gIHJnYiA9IFswLCAwLCAwXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICB0MyA9IGggKyAxIC8gMyAqIC0gKGkgLSAxKTtcbiAgICB0MyA8IDAgJiYgdDMrKztcbiAgICB0MyA+IDEgJiYgdDMtLTtcblxuICAgIGlmICg2ICogdDMgPCAxKVxuICAgICAgdmFsID0gdDEgKyAodDIgLSB0MSkgKiA2ICogdDM7XG4gICAgZWxzZSBpZiAoMiAqIHQzIDwgMSlcbiAgICAgIHZhbCA9IHQyO1xuICAgIGVsc2UgaWYgKDMgKiB0MyA8IDIpXG4gICAgICB2YWwgPSB0MSArICh0MiAtIHQxKSAqICgyIC8gMyAtIHQzKSAqIDY7XG4gICAgZWxzZVxuICAgICAgdmFsID0gdDE7XG5cbiAgICByZ2JbaV0gPSB2YWwgKiAyNTU7XG4gIH1cblxuICByZXR1cm4gcmdiO1xufVxuXG5mdW5jdGlvbiBoc2wyaHN2KGhzbCkge1xuICB2YXIgaCA9IGhzbFswXSxcbiAgICAgIHMgPSBoc2xbMV0gLyAxMDAsXG4gICAgICBsID0gaHNsWzJdIC8gMTAwLFxuICAgICAgc3YsIHY7XG5cbiAgaWYobCA9PT0gMCkge1xuICAgICAgLy8gbm8gbmVlZCB0byBkbyBjYWxjIG9uIGJsYWNrXG4gICAgICAvLyBhbHNvIGF2b2lkcyBkaXZpZGUgYnkgMCBlcnJvclxuICAgICAgcmV0dXJuIFswLCAwLCAwXTtcbiAgfVxuXG4gIGwgKj0gMjtcbiAgcyAqPSAobCA8PSAxKSA/IGwgOiAyIC0gbDtcbiAgdiA9IChsICsgcykgLyAyO1xuICBzdiA9ICgyICogcykgLyAobCArIHMpO1xuICByZXR1cm4gW2gsIHN2ICogMTAwLCB2ICogMTAwXTtcbn1cblxuZnVuY3Rpb24gaHNsMmh3YihhcmdzKSB7XG4gIHJldHVybiByZ2IyaHdiKGhzbDJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBoc2wyY215ayhhcmdzKSB7XG4gIHJldHVybiByZ2IyY215ayhoc2wycmdiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24gaHNsMmtleXdvcmQoYXJncykge1xuICByZXR1cm4gcmdiMmtleXdvcmQoaHNsMnJnYihhcmdzKSk7XG59XG5cblxuZnVuY3Rpb24gaHN2MnJnYihoc3YpIHtcbiAgdmFyIGggPSBoc3ZbMF0gLyA2MCxcbiAgICAgIHMgPSBoc3ZbMV0gLyAxMDAsXG4gICAgICB2ID0gaHN2WzJdIC8gMTAwLFxuICAgICAgaGkgPSBNYXRoLmZsb29yKGgpICUgNjtcblxuICB2YXIgZiA9IGggLSBNYXRoLmZsb29yKGgpLFxuICAgICAgcCA9IDI1NSAqIHYgKiAoMSAtIHMpLFxuICAgICAgcSA9IDI1NSAqIHYgKiAoMSAtIChzICogZikpLFxuICAgICAgdCA9IDI1NSAqIHYgKiAoMSAtIChzICogKDEgLSBmKSkpLFxuICAgICAgdiA9IDI1NSAqIHY7XG5cbiAgc3dpdGNoKGhpKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIFt2LCB0LCBwXTtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gW3EsIHYsIHBdO1xuICAgIGNhc2UgMjpcbiAgICAgIHJldHVybiBbcCwgdiwgdF07XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIFtwLCBxLCB2XTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gW3QsIHAsIHZdO1xuICAgIGNhc2UgNTpcbiAgICAgIHJldHVybiBbdiwgcCwgcV07XG4gIH1cbn1cblxuZnVuY3Rpb24gaHN2MmhzbChoc3YpIHtcbiAgdmFyIGggPSBoc3ZbMF0sXG4gICAgICBzID0gaHN2WzFdIC8gMTAwLFxuICAgICAgdiA9IGhzdlsyXSAvIDEwMCxcbiAgICAgIHNsLCBsO1xuXG4gIGwgPSAoMiAtIHMpICogdjtcbiAgc2wgPSBzICogdjtcbiAgc2wgLz0gKGwgPD0gMSkgPyBsIDogMiAtIGw7XG4gIHNsID0gc2wgfHwgMDtcbiAgbCAvPSAyO1xuICByZXR1cm4gW2gsIHNsICogMTAwLCBsICogMTAwXTtcbn1cblxuZnVuY3Rpb24gaHN2Mmh3YihhcmdzKSB7XG4gIHJldHVybiByZ2IyaHdiKGhzdjJyZ2IoYXJncykpXG59XG5cbmZ1bmN0aW9uIGhzdjJjbXlrKGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJjbXlrKGhzdjJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBoc3Yya2V5d29yZChhcmdzKSB7XG4gIHJldHVybiByZ2Iya2V5d29yZChoc3YycmdiKGFyZ3MpKTtcbn1cblxuLy8gaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzLWNvbG9yLyNod2ItdG8tcmdiXG5mdW5jdGlvbiBod2IycmdiKGh3Yikge1xuICB2YXIgaCA9IGh3YlswXSAvIDM2MCxcbiAgICAgIHdoID0gaHdiWzFdIC8gMTAwLFxuICAgICAgYmwgPSBod2JbMl0gLyAxMDAsXG4gICAgICByYXRpbyA9IHdoICsgYmwsXG4gICAgICBpLCB2LCBmLCBuO1xuXG4gIC8vIHdoICsgYmwgY2FudCBiZSA+IDFcbiAgaWYgKHJhdGlvID4gMSkge1xuICAgIHdoIC89IHJhdGlvO1xuICAgIGJsIC89IHJhdGlvO1xuICB9XG5cbiAgaSA9IE1hdGguZmxvb3IoNiAqIGgpO1xuICB2ID0gMSAtIGJsO1xuICBmID0gNiAqIGggLSBpO1xuICBpZiAoKGkgJiAweDAxKSAhPSAwKSB7XG4gICAgZiA9IDEgLSBmO1xuICB9XG4gIG4gPSB3aCArIGYgKiAodiAtIHdoKTsgIC8vIGxpbmVhciBpbnRlcnBvbGF0aW9uXG5cbiAgc3dpdGNoIChpKSB7XG4gICAgZGVmYXVsdDpcbiAgICBjYXNlIDY6XG4gICAgY2FzZSAwOiByID0gdjsgZyA9IG47IGIgPSB3aDsgYnJlYWs7XG4gICAgY2FzZSAxOiByID0gbjsgZyA9IHY7IGIgPSB3aDsgYnJlYWs7XG4gICAgY2FzZSAyOiByID0gd2g7IGcgPSB2OyBiID0gbjsgYnJlYWs7XG4gICAgY2FzZSAzOiByID0gd2g7IGcgPSBuOyBiID0gdjsgYnJlYWs7XG4gICAgY2FzZSA0OiByID0gbjsgZyA9IHdoOyBiID0gdjsgYnJlYWs7XG4gICAgY2FzZSA1OiByID0gdjsgZyA9IHdoOyBiID0gbjsgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xufVxuXG5mdW5jdGlvbiBod2IyaHNsKGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJoc2woaHdiMnJnYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGh3YjJoc3YoYXJncykge1xuICByZXR1cm4gcmdiMmhzdihod2IycmdiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24gaHdiMmNteWsoYXJncykge1xuICByZXR1cm4gcmdiMmNteWsoaHdiMnJnYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGh3YjJrZXl3b3JkKGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJrZXl3b3JkKGh3YjJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBjbXlrMnJnYihjbXlrKSB7XG4gIHZhciBjID0gY215a1swXSAvIDEwMCxcbiAgICAgIG0gPSBjbXlrWzFdIC8gMTAwLFxuICAgICAgeSA9IGNteWtbMl0gLyAxMDAsXG4gICAgICBrID0gY215a1szXSAvIDEwMCxcbiAgICAgIHIsIGcsIGI7XG5cbiAgciA9IDEgLSBNYXRoLm1pbigxLCBjICogKDEgLSBrKSArIGspO1xuICBnID0gMSAtIE1hdGgubWluKDEsIG0gKiAoMSAtIGspICsgayk7XG4gIGIgPSAxIC0gTWF0aC5taW4oMSwgeSAqICgxIC0gaykgKyBrKTtcbiAgcmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn1cblxuZnVuY3Rpb24gY215azJoc2woYXJncykge1xuICByZXR1cm4gcmdiMmhzbChjbXlrMnJnYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGNteWsyaHN2KGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJoc3YoY215azJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBjbXlrMmh3YihhcmdzKSB7XG4gIHJldHVybiByZ2IyaHdiKGNteWsycmdiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24gY215azJrZXl3b3JkKGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJrZXl3b3JkKGNteWsycmdiKGFyZ3MpKTtcbn1cblxuXG5mdW5jdGlvbiB4eXoycmdiKHh5eikge1xuICB2YXIgeCA9IHh5elswXSAvIDEwMCxcbiAgICAgIHkgPSB4eXpbMV0gLyAxMDAsXG4gICAgICB6ID0geHl6WzJdIC8gMTAwLFxuICAgICAgciwgZywgYjtcblxuICByID0gKHggKiAzLjI0MDYpICsgKHkgKiAtMS41MzcyKSArICh6ICogLTAuNDk4Nik7XG4gIGcgPSAoeCAqIC0wLjk2ODkpICsgKHkgKiAxLjg3NTgpICsgKHogKiAwLjA0MTUpO1xuICBiID0gKHggKiAwLjA1NTcpICsgKHkgKiAtMC4yMDQwKSArICh6ICogMS4wNTcwKTtcblxuICAvLyBhc3N1bWUgc1JHQlxuICByID0gciA+IDAuMDAzMTMwOCA/ICgoMS4wNTUgKiBNYXRoLnBvdyhyLCAxLjAgLyAyLjQpKSAtIDAuMDU1KVxuICAgIDogciA9IChyICogMTIuOTIpO1xuXG4gIGcgPSBnID4gMC4wMDMxMzA4ID8gKCgxLjA1NSAqIE1hdGgucG93KGcsIDEuMCAvIDIuNCkpIC0gMC4wNTUpXG4gICAgOiBnID0gKGcgKiAxMi45Mik7XG5cbiAgYiA9IGIgPiAwLjAwMzEzMDggPyAoKDEuMDU1ICogTWF0aC5wb3coYiwgMS4wIC8gMi40KSkgLSAwLjA1NSlcbiAgICA6IGIgPSAoYiAqIDEyLjkyKTtcblxuICByID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgciksIDEpO1xuICBnID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgZyksIDEpO1xuICBiID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgYiksIDEpO1xuXG4gIHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59XG5cbmZ1bmN0aW9uIHh5ejJsYWIoeHl6KSB7XG4gIHZhciB4ID0geHl6WzBdLFxuICAgICAgeSA9IHh5elsxXSxcbiAgICAgIHogPSB4eXpbMl0sXG4gICAgICBsLCBhLCBiO1xuXG4gIHggLz0gOTUuMDQ3O1xuICB5IC89IDEwMDtcbiAgeiAvPSAxMDguODgzO1xuXG4gIHggPSB4ID4gMC4wMDg4NTYgPyBNYXRoLnBvdyh4LCAxLzMpIDogKDcuNzg3ICogeCkgKyAoMTYgLyAxMTYpO1xuICB5ID0geSA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeSwgMS8zKSA6ICg3Ljc4NyAqIHkpICsgKDE2IC8gMTE2KTtcbiAgeiA9IHogPiAwLjAwODg1NiA/IE1hdGgucG93KHosIDEvMykgOiAoNy43ODcgKiB6KSArICgxNiAvIDExNik7XG5cbiAgbCA9ICgxMTYgKiB5KSAtIDE2O1xuICBhID0gNTAwICogKHggLSB5KTtcbiAgYiA9IDIwMCAqICh5IC0geik7XG5cbiAgcmV0dXJuIFtsLCBhLCBiXTtcbn1cblxuZnVuY3Rpb24geHl6MmxjaChhcmdzKSB7XG4gIHJldHVybiBsYWIybGNoKHh5ejJsYWIoYXJncykpO1xufVxuXG5mdW5jdGlvbiBsYWIyeHl6KGxhYikge1xuICB2YXIgbCA9IGxhYlswXSxcbiAgICAgIGEgPSBsYWJbMV0sXG4gICAgICBiID0gbGFiWzJdLFxuICAgICAgeCwgeSwgeiwgeTI7XG5cbiAgaWYgKGwgPD0gOCkge1xuICAgIHkgPSAobCAqIDEwMCkgLyA5MDMuMztcbiAgICB5MiA9ICg3Ljc4NyAqICh5IC8gMTAwKSkgKyAoMTYgLyAxMTYpO1xuICB9IGVsc2Uge1xuICAgIHkgPSAxMDAgKiBNYXRoLnBvdygobCArIDE2KSAvIDExNiwgMyk7XG4gICAgeTIgPSBNYXRoLnBvdyh5IC8gMTAwLCAxLzMpO1xuICB9XG5cbiAgeCA9IHggLyA5NS4wNDcgPD0gMC4wMDg4NTYgPyB4ID0gKDk1LjA0NyAqICgoYSAvIDUwMCkgKyB5MiAtICgxNiAvIDExNikpKSAvIDcuNzg3IDogOTUuMDQ3ICogTWF0aC5wb3coKGEgLyA1MDApICsgeTIsIDMpO1xuXG4gIHogPSB6IC8gMTA4Ljg4MyA8PSAwLjAwODg1OSA/IHogPSAoMTA4Ljg4MyAqICh5MiAtIChiIC8gMjAwKSAtICgxNiAvIDExNikpKSAvIDcuNzg3IDogMTA4Ljg4MyAqIE1hdGgucG93KHkyIC0gKGIgLyAyMDApLCAzKTtcblxuICByZXR1cm4gW3gsIHksIHpdO1xufVxuXG5mdW5jdGlvbiBsYWIybGNoKGxhYikge1xuICB2YXIgbCA9IGxhYlswXSxcbiAgICAgIGEgPSBsYWJbMV0sXG4gICAgICBiID0gbGFiWzJdLFxuICAgICAgaHIsIGgsIGM7XG5cbiAgaHIgPSBNYXRoLmF0YW4yKGIsIGEpO1xuICBoID0gaHIgKiAzNjAgLyAyIC8gTWF0aC5QSTtcbiAgaWYgKGggPCAwKSB7XG4gICAgaCArPSAzNjA7XG4gIH1cbiAgYyA9IE1hdGguc3FydChhICogYSArIGIgKiBiKTtcbiAgcmV0dXJuIFtsLCBjLCBoXTtcbn1cblxuZnVuY3Rpb24gbGFiMnJnYihhcmdzKSB7XG4gIHJldHVybiB4eXoycmdiKGxhYjJ4eXooYXJncykpO1xufVxuXG5mdW5jdGlvbiBsY2gybGFiKGxjaCkge1xuICB2YXIgbCA9IGxjaFswXSxcbiAgICAgIGMgPSBsY2hbMV0sXG4gICAgICBoID0gbGNoWzJdLFxuICAgICAgYSwgYiwgaHI7XG5cbiAgaHIgPSBoIC8gMzYwICogMiAqIE1hdGguUEk7XG4gIGEgPSBjICogTWF0aC5jb3MoaHIpO1xuICBiID0gYyAqIE1hdGguc2luKGhyKTtcbiAgcmV0dXJuIFtsLCBhLCBiXTtcbn1cblxuZnVuY3Rpb24gbGNoMnh5eihhcmdzKSB7XG4gIHJldHVybiBsYWIyeHl6KGxjaDJsYWIoYXJncykpO1xufVxuXG5mdW5jdGlvbiBsY2gycmdiKGFyZ3MpIHtcbiAgcmV0dXJuIGxhYjJyZ2IobGNoMmxhYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGtleXdvcmQycmdiKGtleXdvcmQpIHtcbiAgcmV0dXJuIGNzc0tleXdvcmRzW2tleXdvcmRdO1xufVxuXG5mdW5jdGlvbiBrZXl3b3JkMmhzbChhcmdzKSB7XG4gIHJldHVybiByZ2IyaHNsKGtleXdvcmQycmdiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24ga2V5d29yZDJoc3YoYXJncykge1xuICByZXR1cm4gcmdiMmhzdihrZXl3b3JkMnJnYihhcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGtleXdvcmQyaHdiKGFyZ3MpIHtcbiAgcmV0dXJuIHJnYjJod2Ioa2V5d29yZDJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBrZXl3b3JkMmNteWsoYXJncykge1xuICByZXR1cm4gcmdiMmNteWsoa2V5d29yZDJyZ2IoYXJncykpO1xufVxuXG5mdW5jdGlvbiBrZXl3b3JkMmxhYihhcmdzKSB7XG4gIHJldHVybiByZ2IybGFiKGtleXdvcmQycmdiKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24ga2V5d29yZDJ4eXooYXJncykge1xuICByZXR1cm4gcmdiMnh5eihrZXl3b3JkMnJnYihhcmdzKSk7XG59XG5cbnZhciBjc3NLZXl3b3JkcyA9IHtcbiAgYWxpY2VibHVlOiAgWzI0MCwyNDgsMjU1XSxcbiAgYW50aXF1ZXdoaXRlOiBbMjUwLDIzNSwyMTVdLFxuICBhcXVhOiBbMCwyNTUsMjU1XSxcbiAgYXF1YW1hcmluZTogWzEyNywyNTUsMjEyXSxcbiAgYXp1cmU6ICBbMjQwLDI1NSwyNTVdLFxuICBiZWlnZTogIFsyNDUsMjQ1LDIyMF0sXG4gIGJpc3F1ZTogWzI1NSwyMjgsMTk2XSxcbiAgYmxhY2s6ICBbMCwwLDBdLFxuICBibGFuY2hlZGFsbW9uZDogWzI1NSwyMzUsMjA1XSxcbiAgYmx1ZTogWzAsMCwyNTVdLFxuICBibHVldmlvbGV0OiBbMTM4LDQzLDIyNl0sXG4gIGJyb3duOiAgWzE2NSw0Miw0Ml0sXG4gIGJ1cmx5d29vZDogIFsyMjIsMTg0LDEzNV0sXG4gIGNhZGV0Ymx1ZTogIFs5NSwxNTgsMTYwXSxcbiAgY2hhcnRyZXVzZTogWzEyNywyNTUsMF0sXG4gIGNob2NvbGF0ZTogIFsyMTAsMTA1LDMwXSxcbiAgY29yYWw6ICBbMjU1LDEyNyw4MF0sXG4gIGNvcm5mbG93ZXJibHVlOiBbMTAwLDE0OSwyMzddLFxuICBjb3Juc2lsazogWzI1NSwyNDgsMjIwXSxcbiAgY3JpbXNvbjogIFsyMjAsMjAsNjBdLFxuICBjeWFuOiBbMCwyNTUsMjU1XSxcbiAgZGFya2JsdWU6IFswLDAsMTM5XSxcbiAgZGFya2N5YW46IFswLDEzOSwxMzldLFxuICBkYXJrZ29sZGVucm9kOiAgWzE4NCwxMzQsMTFdLFxuICBkYXJrZ3JheTogWzE2OSwxNjksMTY5XSxcbiAgZGFya2dyZWVuOiAgWzAsMTAwLDBdLFxuICBkYXJrZ3JleTogWzE2OSwxNjksMTY5XSxcbiAgZGFya2toYWtpOiAgWzE4OSwxODMsMTA3XSxcbiAgZGFya21hZ2VudGE6ICBbMTM5LDAsMTM5XSxcbiAgZGFya29saXZlZ3JlZW46IFs4NSwxMDcsNDddLFxuICBkYXJrb3JhbmdlOiBbMjU1LDE0MCwwXSxcbiAgZGFya29yY2hpZDogWzE1Myw1MCwyMDRdLFxuICBkYXJrcmVkOiAgWzEzOSwwLDBdLFxuICBkYXJrc2FsbW9uOiBbMjMzLDE1MCwxMjJdLFxuICBkYXJrc2VhZ3JlZW46IFsxNDMsMTg4LDE0M10sXG4gIGRhcmtzbGF0ZWJsdWU6ICBbNzIsNjEsMTM5XSxcbiAgZGFya3NsYXRlZ3JheTogIFs0Nyw3OSw3OV0sXG4gIGRhcmtzbGF0ZWdyZXk6ICBbNDcsNzksNzldLFxuICBkYXJrdHVycXVvaXNlOiAgWzAsMjA2LDIwOV0sXG4gIGRhcmt2aW9sZXQ6IFsxNDgsMCwyMTFdLFxuICBkZWVwcGluazogWzI1NSwyMCwxNDddLFxuICBkZWVwc2t5Ymx1ZTogIFswLDE5MSwyNTVdLFxuICBkaW1ncmF5OiAgWzEwNSwxMDUsMTA1XSxcbiAgZGltZ3JleTogIFsxMDUsMTA1LDEwNV0sXG4gIGRvZGdlcmJsdWU6IFszMCwxNDQsMjU1XSxcbiAgZmlyZWJyaWNrOiAgWzE3OCwzNCwzNF0sXG4gIGZsb3JhbHdoaXRlOiAgWzI1NSwyNTAsMjQwXSxcbiAgZm9yZXN0Z3JlZW46ICBbMzQsMTM5LDM0XSxcbiAgZnVjaHNpYTogIFsyNTUsMCwyNTVdLFxuICBnYWluc2Jvcm86ICBbMjIwLDIyMCwyMjBdLFxuICBnaG9zdHdoaXRlOiBbMjQ4LDI0OCwyNTVdLFxuICBnb2xkOiBbMjU1LDIxNSwwXSxcbiAgZ29sZGVucm9kOiAgWzIxOCwxNjUsMzJdLFxuICBncmF5OiBbMTI4LDEyOCwxMjhdLFxuICBncmVlbjogIFswLDEyOCwwXSxcbiAgZ3JlZW55ZWxsb3c6ICBbMTczLDI1NSw0N10sXG4gIGdyZXk6IFsxMjgsMTI4LDEyOF0sXG4gIGhvbmV5ZGV3OiBbMjQwLDI1NSwyNDBdLFxuICBob3RwaW5rOiAgWzI1NSwxMDUsMTgwXSxcbiAgaW5kaWFucmVkOiAgWzIwNSw5Miw5Ml0sXG4gIGluZGlnbzogWzc1LDAsMTMwXSxcbiAgaXZvcnk6ICBbMjU1LDI1NSwyNDBdLFxuICBraGFraTogIFsyNDAsMjMwLDE0MF0sXG4gIGxhdmVuZGVyOiBbMjMwLDIzMCwyNTBdLFxuICBsYXZlbmRlcmJsdXNoOiAgWzI1NSwyNDAsMjQ1XSxcbiAgbGF3bmdyZWVuOiAgWzEyNCwyNTIsMF0sXG4gIGxlbW9uY2hpZmZvbjogWzI1NSwyNTAsMjA1XSxcbiAgbGlnaHRibHVlOiAgWzE3MywyMTYsMjMwXSxcbiAgbGlnaHRjb3JhbDogWzI0MCwxMjgsMTI4XSxcbiAgbGlnaHRjeWFuOiAgWzIyNCwyNTUsMjU1XSxcbiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IFsyNTAsMjUwLDIxMF0sXG4gIGxpZ2h0Z3JheTogIFsyMTEsMjExLDIxMV0sXG4gIGxpZ2h0Z3JlZW46IFsxNDQsMjM4LDE0NF0sXG4gIGxpZ2h0Z3JleTogIFsyMTEsMjExLDIxMV0sXG4gIGxpZ2h0cGluazogIFsyNTUsMTgyLDE5M10sXG4gIGxpZ2h0c2FsbW9uOiAgWzI1NSwxNjAsMTIyXSxcbiAgbGlnaHRzZWFncmVlbjogIFszMiwxNzgsMTcwXSxcbiAgbGlnaHRza3libHVlOiBbMTM1LDIwNiwyNTBdLFxuICBsaWdodHNsYXRlZ3JheTogWzExOSwxMzYsMTUzXSxcbiAgbGlnaHRzbGF0ZWdyZXk6IFsxMTksMTM2LDE1M10sXG4gIGxpZ2h0c3RlZWxibHVlOiBbMTc2LDE5NiwyMjJdLFxuICBsaWdodHllbGxvdzogIFsyNTUsMjU1LDIyNF0sXG4gIGxpbWU6IFswLDI1NSwwXSxcbiAgbGltZWdyZWVuOiAgWzUwLDIwNSw1MF0sXG4gIGxpbmVuOiAgWzI1MCwyNDAsMjMwXSxcbiAgbWFnZW50YTogIFsyNTUsMCwyNTVdLFxuICBtYXJvb246IFsxMjgsMCwwXSxcbiAgbWVkaXVtYXF1YW1hcmluZTogWzEwMiwyMDUsMTcwXSxcbiAgbWVkaXVtYmx1ZTogWzAsMCwyMDVdLFxuICBtZWRpdW1vcmNoaWQ6IFsxODYsODUsMjExXSxcbiAgbWVkaXVtcHVycGxlOiBbMTQ3LDExMiwyMTldLFxuICBtZWRpdW1zZWFncmVlbjogWzYwLDE3OSwxMTNdLFxuICBtZWRpdW1zbGF0ZWJsdWU6ICBbMTIzLDEwNCwyMzhdLFxuICBtZWRpdW1zcHJpbmdncmVlbjogIFswLDI1MCwxNTRdLFxuICBtZWRpdW10dXJxdW9pc2U6ICBbNzIsMjA5LDIwNF0sXG4gIG1lZGl1bXZpb2xldHJlZDogIFsxOTksMjEsMTMzXSxcbiAgbWlkbmlnaHRibHVlOiBbMjUsMjUsMTEyXSxcbiAgbWludGNyZWFtOiAgWzI0NSwyNTUsMjUwXSxcbiAgbWlzdHlyb3NlOiAgWzI1NSwyMjgsMjI1XSxcbiAgbW9jY2FzaW46IFsyNTUsMjI4LDE4MV0sXG4gIG5hdmFqb3doaXRlOiAgWzI1NSwyMjIsMTczXSxcbiAgbmF2eTogWzAsMCwxMjhdLFxuICBvbGRsYWNlOiAgWzI1MywyNDUsMjMwXSxcbiAgb2xpdmU6ICBbMTI4LDEyOCwwXSxcbiAgb2xpdmVkcmFiOiAgWzEwNywxNDIsMzVdLFxuICBvcmFuZ2U6IFsyNTUsMTY1LDBdLFxuICBvcmFuZ2VyZWQ6ICBbMjU1LDY5LDBdLFxuICBvcmNoaWQ6IFsyMTgsMTEyLDIxNF0sXG4gIHBhbGVnb2xkZW5yb2Q6ICBbMjM4LDIzMiwxNzBdLFxuICBwYWxlZ3JlZW46ICBbMTUyLDI1MSwxNTJdLFxuICBwYWxldHVycXVvaXNlOiAgWzE3NSwyMzgsMjM4XSxcbiAgcGFsZXZpb2xldHJlZDogIFsyMTksMTEyLDE0N10sXG4gIHBhcGF5YXdoaXA6IFsyNTUsMjM5LDIxM10sXG4gIHBlYWNocHVmZjogIFsyNTUsMjE4LDE4NV0sXG4gIHBlcnU6IFsyMDUsMTMzLDYzXSxcbiAgcGluazogWzI1NSwxOTIsMjAzXSxcbiAgcGx1bTogWzIyMSwxNjAsMjIxXSxcbiAgcG93ZGVyYmx1ZTogWzE3NiwyMjQsMjMwXSxcbiAgcHVycGxlOiBbMTI4LDAsMTI4XSxcbiAgcmViZWNjYXB1cnBsZTogWzEwMiwgNTEsIDE1M10sXG4gIHJlZDogIFsyNTUsMCwwXSxcbiAgcm9zeWJyb3duOiAgWzE4OCwxNDMsMTQzXSxcbiAgcm95YWxibHVlOiAgWzY1LDEwNSwyMjVdLFxuICBzYWRkbGVicm93bjogIFsxMzksNjksMTldLFxuICBzYWxtb246IFsyNTAsMTI4LDExNF0sXG4gIHNhbmR5YnJvd246IFsyNDQsMTY0LDk2XSxcbiAgc2VhZ3JlZW46IFs0NiwxMzksODddLFxuICBzZWFzaGVsbDogWzI1NSwyNDUsMjM4XSxcbiAgc2llbm5hOiBbMTYwLDgyLDQ1XSxcbiAgc2lsdmVyOiBbMTkyLDE5MiwxOTJdLFxuICBza3libHVlOiAgWzEzNSwyMDYsMjM1XSxcbiAgc2xhdGVibHVlOiAgWzEwNiw5MCwyMDVdLFxuICBzbGF0ZWdyYXk6ICBbMTEyLDEyOCwxNDRdLFxuICBzbGF0ZWdyZXk6ICBbMTEyLDEyOCwxNDRdLFxuICBzbm93OiBbMjU1LDI1MCwyNTBdLFxuICBzcHJpbmdncmVlbjogIFswLDI1NSwxMjddLFxuICBzdGVlbGJsdWU6ICBbNzAsMTMwLDE4MF0sXG4gIHRhbjogIFsyMTAsMTgwLDE0MF0sXG4gIHRlYWw6IFswLDEyOCwxMjhdLFxuICB0aGlzdGxlOiAgWzIxNiwxOTEsMjE2XSxcbiAgdG9tYXRvOiBbMjU1LDk5LDcxXSxcbiAgdHVycXVvaXNlOiAgWzY0LDIyNCwyMDhdLFxuICB2aW9sZXQ6IFsyMzgsMTMwLDIzOF0sXG4gIHdoZWF0OiAgWzI0NSwyMjIsMTc5XSxcbiAgd2hpdGU6ICBbMjU1LDI1NSwyNTVdLFxuICB3aGl0ZXNtb2tlOiBbMjQ1LDI0NSwyNDVdLFxuICB5ZWxsb3c6IFsyNTUsMjU1LDBdLFxuICB5ZWxsb3dncmVlbjogIFsxNTQsMjA1LDUwXVxufTtcblxudmFyIHJldmVyc2VLZXl3b3JkcyA9IHt9O1xuZm9yICh2YXIga2V5IGluIGNzc0tleXdvcmRzKSB7XG4gIHJldmVyc2VLZXl3b3Jkc1tKU09OLnN0cmluZ2lmeShjc3NLZXl3b3Jkc1trZXldKV0gPSBrZXk7XG59XG5cbn0se31dLDU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xudmFyIGNvbnZlcnNpb25zID0gcmVxdWlyZSg0KTtcblxudmFyIGNvbnZlcnQgPSBmdW5jdGlvbigpIHtcbiAgIHJldHVybiBuZXcgQ29udmVydGVyKCk7XG59XG5cbmZvciAodmFyIGZ1bmMgaW4gY29udmVyc2lvbnMpIHtcbiAgLy8gZXhwb3J0IFJhdyB2ZXJzaW9uc1xuICBjb252ZXJ0W2Z1bmMgKyBcIlJhd1wiXSA9ICAoZnVuY3Rpb24oZnVuYykge1xuICAgIC8vIGFjY2VwdCBhcnJheSBvciBwbGFpbiBhcmdzXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgICAgaWYgKHR5cGVvZiBhcmcgPT0gXCJudW1iZXJcIilcbiAgICAgICAgYXJnID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgIHJldHVybiBjb252ZXJzaW9uc1tmdW5jXShhcmcpO1xuICAgIH1cbiAgfSkoZnVuYyk7XG5cbiAgdmFyIHBhaXIgPSAvKFxcdyspMihcXHcrKS8uZXhlYyhmdW5jKSxcbiAgICAgIGZyb20gPSBwYWlyWzFdLFxuICAgICAgdG8gPSBwYWlyWzJdO1xuXG4gIC8vIGV4cG9ydCByZ2IyaHNsIGFuZCBbXCJyZ2JcIl1bXCJoc2xcIl1cbiAgY29udmVydFtmcm9tXSA9IGNvbnZlcnRbZnJvbV0gfHwge307XG5cbiAgY29udmVydFtmcm9tXVt0b10gPSBjb252ZXJ0W2Z1bmNdID0gKGZ1bmN0aW9uKGZ1bmMpIHsgXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgICAgaWYgKHR5cGVvZiBhcmcgPT0gXCJudW1iZXJcIilcbiAgICAgICAgYXJnID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgIFxuICAgICAgdmFyIHZhbCA9IGNvbnZlcnNpb25zW2Z1bmNdKGFyZyk7XG4gICAgICBpZiAodHlwZW9mIHZhbCA9PSBcInN0cmluZ1wiIHx8IHZhbCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdmFsOyAvLyBrZXl3b3JkXG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKVxuICAgICAgICB2YWxbaV0gPSBNYXRoLnJvdW5kKHZhbFtpXSk7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgfSkoZnVuYyk7XG59XG5cblxuLyogQ29udmVydGVyIGRvZXMgbGF6eSBjb252ZXJzaW9uIGFuZCBjYWNoaW5nICovXG52YXIgQ29udmVydGVyID0gZnVuY3Rpb24oKSB7XG4gICB0aGlzLmNvbnZzID0ge307XG59O1xuXG4vKiBFaXRoZXIgZ2V0IHRoZSB2YWx1ZXMgZm9yIGEgc3BhY2Ugb3JcbiAgc2V0IHRoZSB2YWx1ZXMgZm9yIGEgc3BhY2UsIGRlcGVuZGluZyBvbiBhcmdzICovXG5Db252ZXJ0ZXIucHJvdG90eXBlLnJvdXRlU3BhY2UgPSBmdW5jdGlvbihzcGFjZSwgYXJncykge1xuICAgdmFyIHZhbHVlcyA9IGFyZ3NbMF07XG4gICBpZiAodmFsdWVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGNvbG9yLnJnYigpXG4gICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZXMoc3BhY2UpO1xuICAgfVxuICAgLy8gY29sb3IucmdiKDEwLCAxMCwgMTApXG4gICBpZiAodHlwZW9mIHZhbHVlcyA9PSBcIm51bWJlclwiKSB7XG4gICAgICB2YWx1ZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzKTsgICAgICAgIFxuICAgfVxuXG4gICByZXR1cm4gdGhpcy5zZXRWYWx1ZXMoc3BhY2UsIHZhbHVlcyk7XG59O1xuICBcbi8qIFNldCB0aGUgdmFsdWVzIGZvciBhIHNwYWNlLCBpbnZhbGlkYXRpbmcgY2FjaGUgKi9cbkNvbnZlcnRlci5wcm90b3R5cGUuc2V0VmFsdWVzID0gZnVuY3Rpb24oc3BhY2UsIHZhbHVlcykge1xuICAgdGhpcy5zcGFjZSA9IHNwYWNlO1xuICAgdGhpcy5jb252cyA9IHt9O1xuICAgdGhpcy5jb252c1tzcGFjZV0gPSB2YWx1ZXM7XG4gICByZXR1cm4gdGhpcztcbn07XG5cbi8qIEdldCB0aGUgdmFsdWVzIGZvciBhIHNwYWNlLiBJZiB0aGVyZSdzIGFscmVhZHlcbiAgYSBjb252ZXJzaW9uIGZvciB0aGUgc3BhY2UsIGZldGNoIGl0LCBvdGhlcndpc2VcbiAgY29tcHV0ZSBpdCAqL1xuQ29udmVydGVyLnByb3RvdHlwZS5nZXRWYWx1ZXMgPSBmdW5jdGlvbihzcGFjZSkge1xuICAgdmFyIHZhbHMgPSB0aGlzLmNvbnZzW3NwYWNlXTtcbiAgIGlmICghdmFscykge1xuICAgICAgdmFyIGZzcGFjZSA9IHRoaXMuc3BhY2UsXG4gICAgICAgICAgZnJvbSA9IHRoaXMuY29udnNbZnNwYWNlXTtcbiAgICAgIHZhbHMgPSBjb252ZXJ0W2ZzcGFjZV1bc3BhY2VdKGZyb20pO1xuXG4gICAgICB0aGlzLmNvbnZzW3NwYWNlXSA9IHZhbHM7XG4gICB9XG4gIHJldHVybiB2YWxzO1xufTtcblxuW1wicmdiXCIsIFwiaHNsXCIsIFwiaHN2XCIsIFwiY215a1wiLCBcImtleXdvcmRcIl0uZm9yRWFjaChmdW5jdGlvbihzcGFjZSkge1xuICAgQ29udmVydGVyLnByb3RvdHlwZVtzcGFjZV0gPSBmdW5jdGlvbih2YWxzKSB7XG4gICAgICByZXR1cm4gdGhpcy5yb3V0ZVNwYWNlKHNwYWNlLCBhcmd1bWVudHMpO1xuICAgfVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gY29udmVydDtcbn0se1wiNFwiOjR9XSw2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0J1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblx0XCJhbGljZWJsdWVcIjogWzI0MCwgMjQ4LCAyNTVdLFxyXG5cdFwiYW50aXF1ZXdoaXRlXCI6IFsyNTAsIDIzNSwgMjE1XSxcclxuXHRcImFxdWFcIjogWzAsIDI1NSwgMjU1XSxcclxuXHRcImFxdWFtYXJpbmVcIjogWzEyNywgMjU1LCAyMTJdLFxyXG5cdFwiYXp1cmVcIjogWzI0MCwgMjU1LCAyNTVdLFxyXG5cdFwiYmVpZ2VcIjogWzI0NSwgMjQ1LCAyMjBdLFxyXG5cdFwiYmlzcXVlXCI6IFsyNTUsIDIyOCwgMTk2XSxcclxuXHRcImJsYWNrXCI6IFswLCAwLCAwXSxcclxuXHRcImJsYW5jaGVkYWxtb25kXCI6IFsyNTUsIDIzNSwgMjA1XSxcclxuXHRcImJsdWVcIjogWzAsIDAsIDI1NV0sXHJcblx0XCJibHVldmlvbGV0XCI6IFsxMzgsIDQzLCAyMjZdLFxyXG5cdFwiYnJvd25cIjogWzE2NSwgNDIsIDQyXSxcclxuXHRcImJ1cmx5d29vZFwiOiBbMjIyLCAxODQsIDEzNV0sXHJcblx0XCJjYWRldGJsdWVcIjogWzk1LCAxNTgsIDE2MF0sXHJcblx0XCJjaGFydHJldXNlXCI6IFsxMjcsIDI1NSwgMF0sXHJcblx0XCJjaG9jb2xhdGVcIjogWzIxMCwgMTA1LCAzMF0sXHJcblx0XCJjb3JhbFwiOiBbMjU1LCAxMjcsIDgwXSxcclxuXHRcImNvcm5mbG93ZXJibHVlXCI6IFsxMDAsIDE0OSwgMjM3XSxcclxuXHRcImNvcm5zaWxrXCI6IFsyNTUsIDI0OCwgMjIwXSxcclxuXHRcImNyaW1zb25cIjogWzIyMCwgMjAsIDYwXSxcclxuXHRcImN5YW5cIjogWzAsIDI1NSwgMjU1XSxcclxuXHRcImRhcmtibHVlXCI6IFswLCAwLCAxMzldLFxyXG5cdFwiZGFya2N5YW5cIjogWzAsIDEzOSwgMTM5XSxcclxuXHRcImRhcmtnb2xkZW5yb2RcIjogWzE4NCwgMTM0LCAxMV0sXHJcblx0XCJkYXJrZ3JheVwiOiBbMTY5LCAxNjksIDE2OV0sXHJcblx0XCJkYXJrZ3JlZW5cIjogWzAsIDEwMCwgMF0sXHJcblx0XCJkYXJrZ3JleVwiOiBbMTY5LCAxNjksIDE2OV0sXHJcblx0XCJkYXJra2hha2lcIjogWzE4OSwgMTgzLCAxMDddLFxyXG5cdFwiZGFya21hZ2VudGFcIjogWzEzOSwgMCwgMTM5XSxcclxuXHRcImRhcmtvbGl2ZWdyZWVuXCI6IFs4NSwgMTA3LCA0N10sXHJcblx0XCJkYXJrb3JhbmdlXCI6IFsyNTUsIDE0MCwgMF0sXHJcblx0XCJkYXJrb3JjaGlkXCI6IFsxNTMsIDUwLCAyMDRdLFxyXG5cdFwiZGFya3JlZFwiOiBbMTM5LCAwLCAwXSxcclxuXHRcImRhcmtzYWxtb25cIjogWzIzMywgMTUwLCAxMjJdLFxyXG5cdFwiZGFya3NlYWdyZWVuXCI6IFsxNDMsIDE4OCwgMTQzXSxcclxuXHRcImRhcmtzbGF0ZWJsdWVcIjogWzcyLCA2MSwgMTM5XSxcclxuXHRcImRhcmtzbGF0ZWdyYXlcIjogWzQ3LCA3OSwgNzldLFxyXG5cdFwiZGFya3NsYXRlZ3JleVwiOiBbNDcsIDc5LCA3OV0sXHJcblx0XCJkYXJrdHVycXVvaXNlXCI6IFswLCAyMDYsIDIwOV0sXHJcblx0XCJkYXJrdmlvbGV0XCI6IFsxNDgsIDAsIDIxMV0sXHJcblx0XCJkZWVwcGlua1wiOiBbMjU1LCAyMCwgMTQ3XSxcclxuXHRcImRlZXBza3libHVlXCI6IFswLCAxOTEsIDI1NV0sXHJcblx0XCJkaW1ncmF5XCI6IFsxMDUsIDEwNSwgMTA1XSxcclxuXHRcImRpbWdyZXlcIjogWzEwNSwgMTA1LCAxMDVdLFxyXG5cdFwiZG9kZ2VyYmx1ZVwiOiBbMzAsIDE0NCwgMjU1XSxcclxuXHRcImZpcmVicmlja1wiOiBbMTc4LCAzNCwgMzRdLFxyXG5cdFwiZmxvcmFsd2hpdGVcIjogWzI1NSwgMjUwLCAyNDBdLFxyXG5cdFwiZm9yZXN0Z3JlZW5cIjogWzM0LCAxMzksIDM0XSxcclxuXHRcImZ1Y2hzaWFcIjogWzI1NSwgMCwgMjU1XSxcclxuXHRcImdhaW5zYm9yb1wiOiBbMjIwLCAyMjAsIDIyMF0sXHJcblx0XCJnaG9zdHdoaXRlXCI6IFsyNDgsIDI0OCwgMjU1XSxcclxuXHRcImdvbGRcIjogWzI1NSwgMjE1LCAwXSxcclxuXHRcImdvbGRlbnJvZFwiOiBbMjE4LCAxNjUsIDMyXSxcclxuXHRcImdyYXlcIjogWzEyOCwgMTI4LCAxMjhdLFxyXG5cdFwiZ3JlZW5cIjogWzAsIDEyOCwgMF0sXHJcblx0XCJncmVlbnllbGxvd1wiOiBbMTczLCAyNTUsIDQ3XSxcclxuXHRcImdyZXlcIjogWzEyOCwgMTI4LCAxMjhdLFxyXG5cdFwiaG9uZXlkZXdcIjogWzI0MCwgMjU1LCAyNDBdLFxyXG5cdFwiaG90cGlua1wiOiBbMjU1LCAxMDUsIDE4MF0sXHJcblx0XCJpbmRpYW5yZWRcIjogWzIwNSwgOTIsIDkyXSxcclxuXHRcImluZGlnb1wiOiBbNzUsIDAsIDEzMF0sXHJcblx0XCJpdm9yeVwiOiBbMjU1LCAyNTUsIDI0MF0sXHJcblx0XCJraGFraVwiOiBbMjQwLCAyMzAsIDE0MF0sXHJcblx0XCJsYXZlbmRlclwiOiBbMjMwLCAyMzAsIDI1MF0sXHJcblx0XCJsYXZlbmRlcmJsdXNoXCI6IFsyNTUsIDI0MCwgMjQ1XSxcclxuXHRcImxhd25ncmVlblwiOiBbMTI0LCAyNTIsIDBdLFxyXG5cdFwibGVtb25jaGlmZm9uXCI6IFsyNTUsIDI1MCwgMjA1XSxcclxuXHRcImxpZ2h0Ymx1ZVwiOiBbMTczLCAyMTYsIDIzMF0sXHJcblx0XCJsaWdodGNvcmFsXCI6IFsyNDAsIDEyOCwgMTI4XSxcclxuXHRcImxpZ2h0Y3lhblwiOiBbMjI0LCAyNTUsIDI1NV0sXHJcblx0XCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBbMjUwLCAyNTAsIDIxMF0sXHJcblx0XCJsaWdodGdyYXlcIjogWzIxMSwgMjExLCAyMTFdLFxyXG5cdFwibGlnaHRncmVlblwiOiBbMTQ0LCAyMzgsIDE0NF0sXHJcblx0XCJsaWdodGdyZXlcIjogWzIxMSwgMjExLCAyMTFdLFxyXG5cdFwibGlnaHRwaW5rXCI6IFsyNTUsIDE4MiwgMTkzXSxcclxuXHRcImxpZ2h0c2FsbW9uXCI6IFsyNTUsIDE2MCwgMTIyXSxcclxuXHRcImxpZ2h0c2VhZ3JlZW5cIjogWzMyLCAxNzgsIDE3MF0sXHJcblx0XCJsaWdodHNreWJsdWVcIjogWzEzNSwgMjA2LCAyNTBdLFxyXG5cdFwibGlnaHRzbGF0ZWdyYXlcIjogWzExOSwgMTM2LCAxNTNdLFxyXG5cdFwibGlnaHRzbGF0ZWdyZXlcIjogWzExOSwgMTM2LCAxNTNdLFxyXG5cdFwibGlnaHRzdGVlbGJsdWVcIjogWzE3NiwgMTk2LCAyMjJdLFxyXG5cdFwibGlnaHR5ZWxsb3dcIjogWzI1NSwgMjU1LCAyMjRdLFxyXG5cdFwibGltZVwiOiBbMCwgMjU1LCAwXSxcclxuXHRcImxpbWVncmVlblwiOiBbNTAsIDIwNSwgNTBdLFxyXG5cdFwibGluZW5cIjogWzI1MCwgMjQwLCAyMzBdLFxyXG5cdFwibWFnZW50YVwiOiBbMjU1LCAwLCAyNTVdLFxyXG5cdFwibWFyb29uXCI6IFsxMjgsIDAsIDBdLFxyXG5cdFwibWVkaXVtYXF1YW1hcmluZVwiOiBbMTAyLCAyMDUsIDE3MF0sXHJcblx0XCJtZWRpdW1ibHVlXCI6IFswLCAwLCAyMDVdLFxyXG5cdFwibWVkaXVtb3JjaGlkXCI6IFsxODYsIDg1LCAyMTFdLFxyXG5cdFwibWVkaXVtcHVycGxlXCI6IFsxNDcsIDExMiwgMjE5XSxcclxuXHRcIm1lZGl1bXNlYWdyZWVuXCI6IFs2MCwgMTc5LCAxMTNdLFxyXG5cdFwibWVkaXVtc2xhdGVibHVlXCI6IFsxMjMsIDEwNCwgMjM4XSxcclxuXHRcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFswLCAyNTAsIDE1NF0sXHJcblx0XCJtZWRpdW10dXJxdW9pc2VcIjogWzcyLCAyMDksIDIwNF0sXHJcblx0XCJtZWRpdW12aW9sZXRyZWRcIjogWzE5OSwgMjEsIDEzM10sXHJcblx0XCJtaWRuaWdodGJsdWVcIjogWzI1LCAyNSwgMTEyXSxcclxuXHRcIm1pbnRjcmVhbVwiOiBbMjQ1LCAyNTUsIDI1MF0sXHJcblx0XCJtaXN0eXJvc2VcIjogWzI1NSwgMjI4LCAyMjVdLFxyXG5cdFwibW9jY2FzaW5cIjogWzI1NSwgMjI4LCAxODFdLFxyXG5cdFwibmF2YWpvd2hpdGVcIjogWzI1NSwgMjIyLCAxNzNdLFxyXG5cdFwibmF2eVwiOiBbMCwgMCwgMTI4XSxcclxuXHRcIm9sZGxhY2VcIjogWzI1MywgMjQ1LCAyMzBdLFxyXG5cdFwib2xpdmVcIjogWzEyOCwgMTI4LCAwXSxcclxuXHRcIm9saXZlZHJhYlwiOiBbMTA3LCAxNDIsIDM1XSxcclxuXHRcIm9yYW5nZVwiOiBbMjU1LCAxNjUsIDBdLFxyXG5cdFwib3JhbmdlcmVkXCI6IFsyNTUsIDY5LCAwXSxcclxuXHRcIm9yY2hpZFwiOiBbMjE4LCAxMTIsIDIxNF0sXHJcblx0XCJwYWxlZ29sZGVucm9kXCI6IFsyMzgsIDIzMiwgMTcwXSxcclxuXHRcInBhbGVncmVlblwiOiBbMTUyLCAyNTEsIDE1Ml0sXHJcblx0XCJwYWxldHVycXVvaXNlXCI6IFsxNzUsIDIzOCwgMjM4XSxcclxuXHRcInBhbGV2aW9sZXRyZWRcIjogWzIxOSwgMTEyLCAxNDddLFxyXG5cdFwicGFwYXlhd2hpcFwiOiBbMjU1LCAyMzksIDIxM10sXHJcblx0XCJwZWFjaHB1ZmZcIjogWzI1NSwgMjE4LCAxODVdLFxyXG5cdFwicGVydVwiOiBbMjA1LCAxMzMsIDYzXSxcclxuXHRcInBpbmtcIjogWzI1NSwgMTkyLCAyMDNdLFxyXG5cdFwicGx1bVwiOiBbMjIxLCAxNjAsIDIyMV0sXHJcblx0XCJwb3dkZXJibHVlXCI6IFsxNzYsIDIyNCwgMjMwXSxcclxuXHRcInB1cnBsZVwiOiBbMTI4LCAwLCAxMjhdLFxyXG5cdFwicmViZWNjYXB1cnBsZVwiOiBbMTAyLCA1MSwgMTUzXSxcclxuXHRcInJlZFwiOiBbMjU1LCAwLCAwXSxcclxuXHRcInJvc3licm93blwiOiBbMTg4LCAxNDMsIDE0M10sXHJcblx0XCJyb3lhbGJsdWVcIjogWzY1LCAxMDUsIDIyNV0sXHJcblx0XCJzYWRkbGVicm93blwiOiBbMTM5LCA2OSwgMTldLFxyXG5cdFwic2FsbW9uXCI6IFsyNTAsIDEyOCwgMTE0XSxcclxuXHRcInNhbmR5YnJvd25cIjogWzI0NCwgMTY0LCA5Nl0sXHJcblx0XCJzZWFncmVlblwiOiBbNDYsIDEzOSwgODddLFxyXG5cdFwic2Vhc2hlbGxcIjogWzI1NSwgMjQ1LCAyMzhdLFxyXG5cdFwic2llbm5hXCI6IFsxNjAsIDgyLCA0NV0sXHJcblx0XCJzaWx2ZXJcIjogWzE5MiwgMTkyLCAxOTJdLFxyXG5cdFwic2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDIzNV0sXHJcblx0XCJzbGF0ZWJsdWVcIjogWzEwNiwgOTAsIDIwNV0sXHJcblx0XCJzbGF0ZWdyYXlcIjogWzExMiwgMTI4LCAxNDRdLFxyXG5cdFwic2xhdGVncmV5XCI6IFsxMTIsIDEyOCwgMTQ0XSxcclxuXHRcInNub3dcIjogWzI1NSwgMjUwLCAyNTBdLFxyXG5cdFwic3ByaW5nZ3JlZW5cIjogWzAsIDI1NSwgMTI3XSxcclxuXHRcInN0ZWVsYmx1ZVwiOiBbNzAsIDEzMCwgMTgwXSxcclxuXHRcInRhblwiOiBbMjEwLCAxODAsIDE0MF0sXHJcblx0XCJ0ZWFsXCI6IFswLCAxMjgsIDEyOF0sXHJcblx0XCJ0aGlzdGxlXCI6IFsyMTYsIDE5MSwgMjE2XSxcclxuXHRcInRvbWF0b1wiOiBbMjU1LCA5OSwgNzFdLFxyXG5cdFwidHVycXVvaXNlXCI6IFs2NCwgMjI0LCAyMDhdLFxyXG5cdFwidmlvbGV0XCI6IFsyMzgsIDEzMCwgMjM4XSxcclxuXHRcIndoZWF0XCI6IFsyNDUsIDIyMiwgMTc5XSxcclxuXHRcIndoaXRlXCI6IFsyNTUsIDI1NSwgMjU1XSxcclxuXHRcIndoaXRlc21va2VcIjogWzI0NSwgMjQ1LCAyNDVdLFxyXG5cdFwieWVsbG93XCI6IFsyNTUsIDI1NSwgMF0sXHJcblx0XCJ5ZWxsb3dncmVlblwiOiBbMTU0LCAyMDUsIDUwXVxyXG59O1xyXG5cbn0se31dLDc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuLyoqXG4gKiBAbmFtZXNwYWNlIENoYXJ0XG4gKi9cbnZhciBDaGFydCA9IHJlcXVpcmUoMzApKCk7XG5cbkNoYXJ0LmhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcblxuLy8gQHRvZG8gZGlzcGF0Y2ggdGhlc2UgaGVscGVycyBpbnRvIGFwcHJvcHJpYXRlZCBoZWxwZXJzL2hlbHBlcnMuKiBmaWxlIGFuZCB3cml0ZSB1bml0IHRlc3RzIVxucmVxdWlyZSgyOCkoQ2hhcnQpO1xuXG5DaGFydC5BbmltYXRpb24gPSByZXF1aXJlKDIyKTtcbkNoYXJ0LmFuaW1hdGlvblNlcnZpY2UgPSByZXF1aXJlKDIzKTtcbkNoYXJ0LmRlZmF1bHRzID0gcmVxdWlyZSgyNik7XG5DaGFydC5FbGVtZW50ID0gcmVxdWlyZSgyNyk7XG5DaGFydC5lbGVtZW50cyA9IHJlcXVpcmUoNDEpO1xuQ2hhcnQuSW50ZXJhY3Rpb24gPSByZXF1aXJlKDI5KTtcbkNoYXJ0LmxheW91dHMgPSByZXF1aXJlKDMxKTtcbkNoYXJ0LnBsYXRmb3JtID0gcmVxdWlyZSg0OSk7XG5DaGFydC5wbHVnaW5zID0gcmVxdWlyZSgzMik7XG5DaGFydC5TY2FsZSA9IHJlcXVpcmUoMzMpO1xuQ2hhcnQuc2NhbGVTZXJ2aWNlID0gcmVxdWlyZSgzNCk7XG5DaGFydC5UaWNrcyA9IHJlcXVpcmUoMzUpO1xuQ2hhcnQuVG9vbHRpcCA9IHJlcXVpcmUoMzYpO1xuXG5yZXF1aXJlKDI0KShDaGFydCk7XG5yZXF1aXJlKDI1KShDaGFydCk7XG5cbnJlcXVpcmUoNTYpKENoYXJ0KTtcbnJlcXVpcmUoNTQpKENoYXJ0KTtcbnJlcXVpcmUoNTUpKENoYXJ0KTtcbnJlcXVpcmUoNTcpKENoYXJ0KTtcbnJlcXVpcmUoNTgpKENoYXJ0KTtcbnJlcXVpcmUoNTkpKENoYXJ0KTtcblxuLy8gQ29udHJvbGxlcnMgbXVzdCBiZSBsb2FkZWQgYWZ0ZXIgZWxlbWVudHNcbi8vIFNlZSBDaGFydC5jb3JlLmRhdGFzZXRDb250cm9sbGVyLmRhdGFFbGVtZW50VHlwZVxucmVxdWlyZSgxNSkoQ2hhcnQpO1xucmVxdWlyZSgxNikoQ2hhcnQpO1xucmVxdWlyZSgxNykoQ2hhcnQpO1xucmVxdWlyZSgxOCkoQ2hhcnQpO1xucmVxdWlyZSgxOSkoQ2hhcnQpO1xucmVxdWlyZSgyMCkoQ2hhcnQpO1xucmVxdWlyZSgyMSkoQ2hhcnQpO1xuXG5yZXF1aXJlKDgpKENoYXJ0KTtcbnJlcXVpcmUoOSkoQ2hhcnQpO1xucmVxdWlyZSgxMCkoQ2hhcnQpO1xucmVxdWlyZSgxMSkoQ2hhcnQpO1xucmVxdWlyZSgxMikoQ2hhcnQpO1xucmVxdWlyZSgxMykoQ2hhcnQpO1xucmVxdWlyZSgxNCkoQ2hhcnQpO1xuXG4vLyBMb2FkaW5nIGJ1aWx0LWluIHBsdWdpbnNcbnZhciBwbHVnaW5zID0gcmVxdWlyZSg1MCk7XG5mb3IgKHZhciBrIGluIHBsdWdpbnMpIHtcblx0aWYgKHBsdWdpbnMuaGFzT3duUHJvcGVydHkoaykpIHtcblx0XHRDaGFydC5wbHVnaW5zLnJlZ2lzdGVyKHBsdWdpbnNba10pO1xuXHR9XG59XG5cbkNoYXJ0LnBsYXRmb3JtLmluaXRpYWxpemUoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBDaGFydDtcbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuXHR3aW5kb3cuQ2hhcnQgPSBDaGFydDtcbn1cblxuLy8gREVQUkVDQVRJT05TXG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIG5vdCBhdmFpbGFibGUgYW55bW9yZVxuICogQG5hbWVzcGFjZSBDaGFydC5MZWdlbmRcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi4xLjVcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcbiAqIEBwcml2YXRlXG4gKi9cbkNoYXJ0LkxlZ2VuZCA9IHBsdWdpbnMubGVnZW5kLl9lbGVtZW50O1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBub3QgYXZhaWxhYmxlIGFueW1vcmVcbiAqIEBuYW1lc3BhY2UgQ2hhcnQuVGl0bGVcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi4xLjVcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcbiAqIEBwcml2YXRlXG4gKi9cbkNoYXJ0LlRpdGxlID0gcGx1Z2lucy50aXRsZS5fZWxlbWVudDtcblxuLyoqXG4gKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdXNlIENoYXJ0LnBsdWdpbnMgaW5zdGVhZFxuICogQG5hbWVzcGFjZSBDaGFydC5wbHVnaW5TZXJ2aWNlXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuMS41XG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG4gKiBAcHJpdmF0ZVxuICovXG5DaGFydC5wbHVnaW5TZXJ2aWNlID0gQ2hhcnQucGx1Z2lucztcblxuLyoqXG4gKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgaW5oZXJpdGluZyBmcm9tIENoYXJ0LlBsdWdpbmdCYXNlIGhhcyBub1xuICogZWZmZWN0LCBpbnN0ZWFkIHNpbXBseSBjcmVhdGUvcmVnaXN0ZXIgcGx1Z2lucyB2aWEgcGxhaW4gSmF2YVNjcmlwdCBvYmplY3RzLlxuICogQGludGVyZmFjZSBDaGFydC5QbHVnaW5CYXNlXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNS4wXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG4gKiBAcHJpdmF0ZVxuICovXG5DaGFydC5QbHVnaW5CYXNlID0gQ2hhcnQuRWxlbWVudC5leHRlbmQoe30pO1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB1c2UgQ2hhcnQuaGVscGVycy5jYW52YXMgaW5zdGVhZC5cbiAqIEBuYW1lc3BhY2UgQ2hhcnQuY2FudmFzSGVscGVyc1xuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjYuMFxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuICogQHByaXZhdGVcbiAqL1xuQ2hhcnQuY2FudmFzSGVscGVycyA9IENoYXJ0LmhlbHBlcnMuY2FudmFzO1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB1c2UgQ2hhcnQubGF5b3V0cyBpbnN0ZWFkLlxuICogQG5hbWVzcGFjZSBDaGFydC5sYXlvdXRTZXJ2aWNlXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuOC4wXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG4gKiBAcHJpdmF0ZVxuICovXG5DaGFydC5sYXlvdXRTZXJ2aWNlID0gQ2hhcnQubGF5b3V0cztcblxufSx7XCIxMFwiOjEwLFwiMTFcIjoxMSxcIjEyXCI6MTIsXCIxM1wiOjEzLFwiMTRcIjoxNCxcIjE1XCI6MTUsXCIxNlwiOjE2LFwiMTdcIjoxNyxcIjE4XCI6MTgsXCIxOVwiOjE5LFwiMjBcIjoyMCxcIjIxXCI6MjEsXCIyMlwiOjIyLFwiMjNcIjoyMyxcIjI0XCI6MjQsXCIyNVwiOjI1LFwiMjZcIjoyNixcIjI3XCI6MjcsXCIyOFwiOjI4LFwiMjlcIjoyOSxcIjMwXCI6MzAsXCIzMVwiOjMxLFwiMzJcIjozMixcIjMzXCI6MzMsXCIzNFwiOjM0LFwiMzVcIjozNSxcIjM2XCI6MzYsXCI0MVwiOjQxLFwiNDZcIjo0NixcIjQ5XCI6NDksXCI1MFwiOjUwLFwiNTRcIjo1NCxcIjU1XCI6NTUsXCI1NlwiOjU2LFwiNTdcIjo1NyxcIjU4XCI6NTgsXCI1OVwiOjU5LFwiOFwiOjgsXCI5XCI6OX1dLDg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENoYXJ0KSB7XG5cblx0Q2hhcnQuQmFyID0gZnVuY3Rpb24oY29udGV4dCwgY29uZmlnKSB7XG5cdFx0Y29uZmlnLnR5cGUgPSAnYmFyJztcblxuXHRcdHJldHVybiBuZXcgQ2hhcnQoY29udGV4dCwgY29uZmlnKTtcblx0fTtcblxufTtcblxufSx7fV0sOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcblxuXHRDaGFydC5CdWJibGUgPSBmdW5jdGlvbihjb250ZXh0LCBjb25maWcpIHtcblx0XHRjb25maWcudHlwZSA9ICdidWJibGUnO1xuXHRcdHJldHVybiBuZXcgQ2hhcnQoY29udGV4dCwgY29uZmlnKTtcblx0fTtcblxufTtcblxufSx7fV0sMTA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENoYXJ0KSB7XG5cblx0Q2hhcnQuRG91Z2hudXQgPSBmdW5jdGlvbihjb250ZXh0LCBjb25maWcpIHtcblx0XHRjb25maWcudHlwZSA9ICdkb3VnaG51dCc7XG5cblx0XHRyZXR1cm4gbmV3IENoYXJ0KGNvbnRleHQsIGNvbmZpZyk7XG5cdH07XG5cbn07XG5cbn0se31dLDExOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDaGFydCkge1xuXG5cdENoYXJ0LkxpbmUgPSBmdW5jdGlvbihjb250ZXh0LCBjb25maWcpIHtcblx0XHRjb25maWcudHlwZSA9ICdsaW5lJztcblxuXHRcdHJldHVybiBuZXcgQ2hhcnQoY29udGV4dCwgY29uZmlnKTtcblx0fTtcblxufTtcblxufSx7fV0sMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENoYXJ0KSB7XG5cblx0Q2hhcnQuUG9sYXJBcmVhID0gZnVuY3Rpb24oY29udGV4dCwgY29uZmlnKSB7XG5cdFx0Y29uZmlnLnR5cGUgPSAncG9sYXJBcmVhJztcblxuXHRcdHJldHVybiBuZXcgQ2hhcnQoY29udGV4dCwgY29uZmlnKTtcblx0fTtcblxufTtcblxufSx7fV0sMTM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENoYXJ0KSB7XG5cblx0Q2hhcnQuUmFkYXIgPSBmdW5jdGlvbihjb250ZXh0LCBjb25maWcpIHtcblx0XHRjb25maWcudHlwZSA9ICdyYWRhcic7XG5cblx0XHRyZXR1cm4gbmV3IENoYXJ0KGNvbnRleHQsIGNvbmZpZyk7XG5cdH07XG5cbn07XG5cbn0se31dLDE0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDaGFydCkge1xuXHRDaGFydC5TY2F0dGVyID0gZnVuY3Rpb24oY29udGV4dCwgY29uZmlnKSB7XG5cdFx0Y29uZmlnLnR5cGUgPSAnc2NhdHRlcic7XG5cdFx0cmV0dXJuIG5ldyBDaGFydChjb250ZXh0LCBjb25maWcpO1xuXHR9O1xufTtcblxufSx7fV0sMTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcbnZhciBlbGVtZW50cyA9IHJlcXVpcmUoNDEpO1xudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcblxuZGVmYXVsdHMuX3NldCgnYmFyJywge1xuXHRob3Zlcjoge1xuXHRcdG1vZGU6ICdsYWJlbCdcblx0fSxcblxuXHRzY2FsZXM6IHtcblx0XHR4QXhlczogW3tcblx0XHRcdHR5cGU6ICdjYXRlZ29yeScsXG5cblx0XHRcdC8vIFNwZWNpZmljIHRvIEJhciBDb250cm9sbGVyXG5cdFx0XHRjYXRlZ29yeVBlcmNlbnRhZ2U6IDAuOCxcblx0XHRcdGJhclBlcmNlbnRhZ2U6IDAuOSxcblxuXHRcdFx0Ly8gb2Zmc2V0IHNldHRpbmdzXG5cdFx0XHRvZmZzZXQ6IHRydWUsXG5cblx0XHRcdC8vIGdyaWQgbGluZSBzZXR0aW5nc1xuXHRcdFx0Z3JpZExpbmVzOiB7XG5cdFx0XHRcdG9mZnNldEdyaWRMaW5lczogdHJ1ZVxuXHRcdFx0fVxuXHRcdH1dLFxuXG5cdFx0eUF4ZXM6IFt7XG5cdFx0XHR0eXBlOiAnbGluZWFyJ1xuXHRcdH1dXG5cdH1cbn0pO1xuXG5kZWZhdWx0cy5fc2V0KCdob3Jpem9udGFsQmFyJywge1xuXHRob3Zlcjoge1xuXHRcdG1vZGU6ICdpbmRleCcsXG5cdFx0YXhpczogJ3knXG5cdH0sXG5cblx0c2NhbGVzOiB7XG5cdFx0eEF4ZXM6IFt7XG5cdFx0XHR0eXBlOiAnbGluZWFyJyxcblx0XHRcdHBvc2l0aW9uOiAnYm90dG9tJ1xuXHRcdH1dLFxuXG5cdFx0eUF4ZXM6IFt7XG5cdFx0XHRwb3NpdGlvbjogJ2xlZnQnLFxuXHRcdFx0dHlwZTogJ2NhdGVnb3J5JyxcblxuXHRcdFx0Ly8gU3BlY2lmaWMgdG8gSG9yaXpvbnRhbCBCYXIgQ29udHJvbGxlclxuXHRcdFx0Y2F0ZWdvcnlQZXJjZW50YWdlOiAwLjgsXG5cdFx0XHRiYXJQZXJjZW50YWdlOiAwLjksXG5cblx0XHRcdC8vIG9mZnNldCBzZXR0aW5nc1xuXHRcdFx0b2Zmc2V0OiB0cnVlLFxuXG5cdFx0XHQvLyBncmlkIGxpbmUgc2V0dGluZ3Ncblx0XHRcdGdyaWRMaW5lczoge1xuXHRcdFx0XHRvZmZzZXRHcmlkTGluZXM6IHRydWVcblx0XHRcdH1cblx0XHR9XVxuXHR9LFxuXG5cdGVsZW1lbnRzOiB7XG5cdFx0cmVjdGFuZ2xlOiB7XG5cdFx0XHRib3JkZXJTa2lwcGVkOiAnbGVmdCdcblx0XHR9XG5cdH0sXG5cblx0dG9vbHRpcHM6IHtcblx0XHRjYWxsYmFja3M6IHtcblx0XHRcdHRpdGxlOiBmdW5jdGlvbihpdGVtLCBkYXRhKSB7XG5cdFx0XHRcdC8vIFBpY2sgZmlyc3QgeExhYmVsIGZvciBub3dcblx0XHRcdFx0dmFyIHRpdGxlID0gJyc7XG5cblx0XHRcdFx0aWYgKGl0ZW0ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdGlmIChpdGVtWzBdLnlMYWJlbCkge1xuXHRcdFx0XHRcdFx0dGl0bGUgPSBpdGVtWzBdLnlMYWJlbDtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGRhdGEubGFiZWxzLmxlbmd0aCA+IDAgJiYgaXRlbVswXS5pbmRleCA8IGRhdGEubGFiZWxzLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0dGl0bGUgPSBkYXRhLmxhYmVsc1tpdGVtWzBdLmluZGV4XTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdGl0bGU7XG5cdFx0XHR9LFxuXG5cdFx0XHRsYWJlbDogZnVuY3Rpb24oaXRlbSwgZGF0YSkge1xuXHRcdFx0XHR2YXIgZGF0YXNldExhYmVsID0gZGF0YS5kYXRhc2V0c1tpdGVtLmRhdGFzZXRJbmRleF0ubGFiZWwgfHwgJyc7XG5cdFx0XHRcdHJldHVybiBkYXRhc2V0TGFiZWwgKyAnOiAnICsgaXRlbS54TGFiZWw7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRtb2RlOiAnaW5kZXgnLFxuXHRcdGF4aXM6ICd5J1xuXHR9XG59KTtcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgXCJvcHRpbWFsXCIgc2FtcGxlIHNpemUgdG8gbWFpbnRhaW4gYmFycyBlcXVhbGx5IHNpemVkIHdoaWxlIHByZXZlbnRpbmcgb3ZlcmxhcC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVNaW5TYW1wbGVTaXplKHNjYWxlLCBwaXhlbHMpIHtcblx0dmFyIG1pbiA9IHNjYWxlLmlzSG9yaXpvbnRhbCgpID8gc2NhbGUud2lkdGggOiBzY2FsZS5oZWlnaHQ7XG5cdHZhciB0aWNrcyA9IHNjYWxlLmdldFRpY2tzKCk7XG5cdHZhciBwcmV2LCBjdXJyLCBpLCBpbGVuO1xuXG5cdGZvciAoaSA9IDEsIGlsZW4gPSBwaXhlbHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0bWluID0gTWF0aC5taW4obWluLCBwaXhlbHNbaV0gLSBwaXhlbHNbaSAtIDFdKTtcblx0fVxuXG5cdGZvciAoaSA9IDAsIGlsZW4gPSB0aWNrcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRjdXJyID0gc2NhbGUuZ2V0UGl4ZWxGb3JUaWNrKGkpO1xuXHRcdG1pbiA9IGkgPiAwID8gTWF0aC5taW4obWluLCBjdXJyIC0gcHJldikgOiBtaW47XG5cdFx0cHJldiA9IGN1cnI7XG5cdH1cblxuXHRyZXR1cm4gbWluO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIGFuIFwiaWRlYWxcIiBjYXRlZ29yeSBiYXNlZCBvbiB0aGUgYWJzb2x1dGUgYmFyIHRoaWNrbmVzcyBvciwgaWYgdW5kZWZpbmVkIG9yIG51bGwsXG4gKiB1c2VzIHRoZSBzbWFsbGVzdCBpbnRlcnZhbCAoc2VlIGNvbXB1dGVNaW5TYW1wbGVTaXplKSB0aGF0IHByZXZlbnRzIGJhciBvdmVybGFwcGluZy4gVGhpc1xuICogbW9kZSBjdXJyZW50bHkgYWx3YXlzIGdlbmVyYXRlcyBiYXJzIGVxdWFsbHkgc2l6ZWQgKHVudGlsIHdlIGludHJvZHVjZSBzY3JpcHRhYmxlIG9wdGlvbnM/KS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVGaXRDYXRlZ29yeVRyYWl0cyhpbmRleCwgcnVsZXIsIG9wdGlvbnMpIHtcblx0dmFyIHRoaWNrbmVzcyA9IG9wdGlvbnMuYmFyVGhpY2tuZXNzO1xuXHR2YXIgY291bnQgPSBydWxlci5zdGFja0NvdW50O1xuXHR2YXIgY3VyciA9IHJ1bGVyLnBpeGVsc1tpbmRleF07XG5cdHZhciBzaXplLCByYXRpbztcblxuXHRpZiAoaGVscGVycy5pc051bGxPclVuZGVmKHRoaWNrbmVzcykpIHtcblx0XHRzaXplID0gcnVsZXIubWluICogb3B0aW9ucy5jYXRlZ29yeVBlcmNlbnRhZ2U7XG5cdFx0cmF0aW8gPSBvcHRpb25zLmJhclBlcmNlbnRhZ2U7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gV2hlbiBiYXIgdGhpY2tuZXNzIGlzIGVuZm9yY2VkLCBjYXRlZ29yeSBhbmQgYmFyIHBlcmNlbnRhZ2VzIGFyZSBpZ25vcmVkLlxuXHRcdC8vIE5vdGUoU0IpOiB3ZSBjb3VsZCBhZGQgc3VwcG9ydCBmb3IgcmVsYXRpdmUgYmFyIHRoaWNrbmVzcyAoZS5nLiBiYXJUaGlja25lc3M6ICc1MCUnKVxuXHRcdC8vIGFuZCBkZXByZWNhdGUgYmFyUGVyY2VudGFnZSBzaW5jZSB0aGlzIHZhbHVlIGlzIGlnbm9yZWQgd2hlbiB0aGlja25lc3MgaXMgYWJzb2x1dGUuXG5cdFx0c2l6ZSA9IHRoaWNrbmVzcyAqIGNvdW50O1xuXHRcdHJhdGlvID0gMTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Y2h1bms6IHNpemUgLyBjb3VudCxcblx0XHRyYXRpbzogcmF0aW8sXG5cdFx0c3RhcnQ6IGN1cnIgLSAoc2l6ZSAvIDIpXG5cdH07XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgYW4gXCJvcHRpbWFsXCIgY2F0ZWdvcnkgdGhhdCBnbG9iYWxseSBhcnJhbmdlcyBiYXJzIHNpZGUgYnkgc2lkZSAobm8gZ2FwIHdoZW5cbiAqIHBlcmNlbnRhZ2Ugb3B0aW9ucyBhcmUgMSksIGJhc2VkIG9uIHRoZSBwcmV2aW91cyBhbmQgZm9sbG93aW5nIGNhdGVnb3JpZXMuIFRoaXMgbW9kZVxuICogZ2VuZXJhdGVzIGJhcnMgd2l0aCBkaWZmZXJlbnQgd2lkdGhzIHdoZW4gZGF0YSBhcmUgbm90IGV2ZW5seSBzcGFjZWQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjb21wdXRlRmxleENhdGVnb3J5VHJhaXRzKGluZGV4LCBydWxlciwgb3B0aW9ucykge1xuXHR2YXIgcGl4ZWxzID0gcnVsZXIucGl4ZWxzO1xuXHR2YXIgY3VyciA9IHBpeGVsc1tpbmRleF07XG5cdHZhciBwcmV2ID0gaW5kZXggPiAwID8gcGl4ZWxzW2luZGV4IC0gMV0gOiBudWxsO1xuXHR2YXIgbmV4dCA9IGluZGV4IDwgcGl4ZWxzLmxlbmd0aCAtIDEgPyBwaXhlbHNbaW5kZXggKyAxXSA6IG51bGw7XG5cdHZhciBwZXJjZW50ID0gb3B0aW9ucy5jYXRlZ29yeVBlcmNlbnRhZ2U7XG5cdHZhciBzdGFydCwgc2l6ZTtcblxuXHRpZiAocHJldiA9PT0gbnVsbCkge1xuXHRcdC8vIGZpcnN0IGRhdGE6IGl0cyBzaXplIGlzIGRvdWJsZSBiYXNlZCBvbiB0aGUgbmV4dCBwb2ludCBvcixcblx0XHQvLyBpZiBpdCdzIGFsc28gdGhlIGxhc3QgZGF0YSwgd2UgdXNlIHRoZSBzY2FsZSBlbmQgZXh0cmVtaXR5LlxuXHRcdHByZXYgPSBjdXJyIC0gKG5leHQgPT09IG51bGwgPyBydWxlci5lbmQgLSBjdXJyIDogbmV4dCAtIGN1cnIpO1xuXHR9XG5cblx0aWYgKG5leHQgPT09IG51bGwpIHtcblx0XHQvLyBsYXN0IGRhdGE6IGl0cyBzaXplIGlzIGFsc28gZG91YmxlIGJhc2VkIG9uIHRoZSBwcmV2aW91cyBwb2ludC5cblx0XHRuZXh0ID0gY3VyciArIGN1cnIgLSBwcmV2O1xuXHR9XG5cblx0c3RhcnQgPSBjdXJyIC0gKChjdXJyIC0gcHJldikgLyAyKSAqIHBlcmNlbnQ7XG5cdHNpemUgPSAoKG5leHQgLSBwcmV2KSAvIDIpICogcGVyY2VudDtcblxuXHRyZXR1cm4ge1xuXHRcdGNodW5rOiBzaXplIC8gcnVsZXIuc3RhY2tDb3VudCxcblx0XHRyYXRpbzogb3B0aW9ucy5iYXJQZXJjZW50YWdlLFxuXHRcdHN0YXJ0OiBzdGFydFxuXHR9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENoYXJ0KSB7XG5cblx0Q2hhcnQuY29udHJvbGxlcnMuYmFyID0gQ2hhcnQuRGF0YXNldENvbnRyb2xsZXIuZXh0ZW5kKHtcblxuXHRcdGRhdGFFbGVtZW50VHlwZTogZWxlbWVudHMuUmVjdGFuZ2xlLFxuXG5cdFx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG1ldGE7XG5cblx0XHRcdENoYXJ0LkRhdGFzZXRDb250cm9sbGVyLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KG1lLCBhcmd1bWVudHMpO1xuXG5cdFx0XHRtZXRhID0gbWUuZ2V0TWV0YSgpO1xuXHRcdFx0bWV0YS5zdGFjayA9IG1lLmdldERhdGFzZXQoKS5zdGFjaztcblx0XHRcdG1ldGEuYmFyID0gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0dXBkYXRlOiBmdW5jdGlvbihyZXNldCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciByZWN0cyA9IG1lLmdldE1ldGEoKS5kYXRhO1xuXHRcdFx0dmFyIGksIGlsZW47XG5cblx0XHRcdG1lLl9ydWxlciA9IG1lLmdldFJ1bGVyKCk7XG5cblx0XHRcdGZvciAoaSA9IDAsIGlsZW4gPSByZWN0cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdFx0bWUudXBkYXRlRWxlbWVudChyZWN0c1tpXSwgaSwgcmVzZXQpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHR1cGRhdGVFbGVtZW50OiBmdW5jdGlvbihyZWN0YW5nbGUsIGluZGV4LCByZXNldCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdFx0dmFyIG1ldGEgPSBtZS5nZXRNZXRhKCk7XG5cdFx0XHR2YXIgZGF0YXNldCA9IG1lLmdldERhdGFzZXQoKTtcblx0XHRcdHZhciBjdXN0b20gPSByZWN0YW5nbGUuY3VzdG9tIHx8IHt9O1xuXHRcdFx0dmFyIHJlY3RhbmdsZU9wdGlvbnMgPSBjaGFydC5vcHRpb25zLmVsZW1lbnRzLnJlY3RhbmdsZTtcblxuXHRcdFx0cmVjdGFuZ2xlLl94U2NhbGUgPSBtZS5nZXRTY2FsZUZvcklkKG1ldGEueEF4aXNJRCk7XG5cdFx0XHRyZWN0YW5nbGUuX3lTY2FsZSA9IG1lLmdldFNjYWxlRm9ySWQobWV0YS55QXhpc0lEKTtcblx0XHRcdHJlY3RhbmdsZS5fZGF0YXNldEluZGV4ID0gbWUuaW5kZXg7XG5cdFx0XHRyZWN0YW5nbGUuX2luZGV4ID0gaW5kZXg7XG5cblx0XHRcdHJlY3RhbmdsZS5fbW9kZWwgPSB7XG5cdFx0XHRcdGRhdGFzZXRMYWJlbDogZGF0YXNldC5sYWJlbCxcblx0XHRcdFx0bGFiZWw6IGNoYXJ0LmRhdGEubGFiZWxzW2luZGV4XSxcblx0XHRcdFx0Ym9yZGVyU2tpcHBlZDogY3VzdG9tLmJvcmRlclNraXBwZWQgPyBjdXN0b20uYm9yZGVyU2tpcHBlZCA6IHJlY3RhbmdsZU9wdGlvbnMuYm9yZGVyU2tpcHBlZCxcblx0XHRcdFx0YmFja2dyb3VuZENvbG9yOiBjdXN0b20uYmFja2dyb3VuZENvbG9yID8gY3VzdG9tLmJhY2tncm91bmRDb2xvciA6IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQuYmFja2dyb3VuZENvbG9yLCBpbmRleCwgcmVjdGFuZ2xlT3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IpLFxuXHRcdFx0XHRib3JkZXJDb2xvcjogY3VzdG9tLmJvcmRlckNvbG9yID8gY3VzdG9tLmJvcmRlckNvbG9yIDogaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5ib3JkZXJDb2xvciwgaW5kZXgsIHJlY3RhbmdsZU9wdGlvbnMuYm9yZGVyQ29sb3IpLFxuXHRcdFx0XHRib3JkZXJXaWR0aDogY3VzdG9tLmJvcmRlcldpZHRoID8gY3VzdG9tLmJvcmRlcldpZHRoIDogaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5ib3JkZXJXaWR0aCwgaW5kZXgsIHJlY3RhbmdsZU9wdGlvbnMuYm9yZGVyV2lkdGgpXG5cdFx0XHR9O1xuXG5cdFx0XHRtZS51cGRhdGVFbGVtZW50R2VvbWV0cnkocmVjdGFuZ2xlLCBpbmRleCwgcmVzZXQpO1xuXG5cdFx0XHRyZWN0YW5nbGUucGl2b3QoKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHR1cGRhdGVFbGVtZW50R2VvbWV0cnk6IGZ1bmN0aW9uKHJlY3RhbmdsZSwgaW5kZXgsIHJlc2V0KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG1vZGVsID0gcmVjdGFuZ2xlLl9tb2RlbDtcblx0XHRcdHZhciB2c2NhbGUgPSBtZS5nZXRWYWx1ZVNjYWxlKCk7XG5cdFx0XHR2YXIgYmFzZSA9IHZzY2FsZS5nZXRCYXNlUGl4ZWwoKTtcblx0XHRcdHZhciBob3Jpem9udGFsID0gdnNjYWxlLmlzSG9yaXpvbnRhbCgpO1xuXHRcdFx0dmFyIHJ1bGVyID0gbWUuX3J1bGVyIHx8IG1lLmdldFJ1bGVyKCk7XG5cdFx0XHR2YXIgdnBpeGVscyA9IG1lLmNhbGN1bGF0ZUJhclZhbHVlUGl4ZWxzKG1lLmluZGV4LCBpbmRleCk7XG5cdFx0XHR2YXIgaXBpeGVscyA9IG1lLmNhbGN1bGF0ZUJhckluZGV4UGl4ZWxzKG1lLmluZGV4LCBpbmRleCwgcnVsZXIpO1xuXG5cdFx0XHRtb2RlbC5ob3Jpem9udGFsID0gaG9yaXpvbnRhbDtcblx0XHRcdG1vZGVsLmJhc2UgPSByZXNldCA/IGJhc2UgOiB2cGl4ZWxzLmJhc2U7XG5cdFx0XHRtb2RlbC54ID0gaG9yaXpvbnRhbCA/IHJlc2V0ID8gYmFzZSA6IHZwaXhlbHMuaGVhZCA6IGlwaXhlbHMuY2VudGVyO1xuXHRcdFx0bW9kZWwueSA9IGhvcml6b250YWwgPyBpcGl4ZWxzLmNlbnRlciA6IHJlc2V0ID8gYmFzZSA6IHZwaXhlbHMuaGVhZDtcblx0XHRcdG1vZGVsLmhlaWdodCA9IGhvcml6b250YWwgPyBpcGl4ZWxzLnNpemUgOiB1bmRlZmluZWQ7XG5cdFx0XHRtb2RlbC53aWR0aCA9IGhvcml6b250YWwgPyB1bmRlZmluZWQgOiBpcGl4ZWxzLnNpemU7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0Z2V0VmFsdWVTY2FsZUlkOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldE1ldGEoKS55QXhpc0lEO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGdldEluZGV4U2NhbGVJZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRNZXRhKCkueEF4aXNJRDtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRnZXRWYWx1ZVNjYWxlOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldFNjYWxlRm9ySWQodGhpcy5nZXRWYWx1ZVNjYWxlSWQoKSk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0Z2V0SW5kZXhTY2FsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRTY2FsZUZvcklkKHRoaXMuZ2V0SW5kZXhTY2FsZUlkKCkpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBSZXR1cm5zIHRoZSBzdGFja3MgYmFzZWQgb24gZ3JvdXBzIGFuZCBiYXIgdmlzaWJpbGl0eS5cblx0XHQgKiBAcGFyYW0ge051bWJlcn0gW2xhc3RdIC0gVGhlIGRhdGFzZXQgaW5kZXhcblx0XHQgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBzdGFjayBsaXN0XG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRfZ2V0U3RhY2tzOiBmdW5jdGlvbihsYXN0KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XG5cdFx0XHR2YXIgc2NhbGUgPSBtZS5nZXRJbmRleFNjYWxlKCk7XG5cdFx0XHR2YXIgc3RhY2tlZCA9IHNjYWxlLm9wdGlvbnMuc3RhY2tlZDtcblx0XHRcdHZhciBpbGVuID0gbGFzdCA9PT0gdW5kZWZpbmVkID8gY2hhcnQuZGF0YS5kYXRhc2V0cy5sZW5ndGggOiBsYXN0ICsgMTtcblx0XHRcdHZhciBzdGFja3MgPSBbXTtcblx0XHRcdHZhciBpLCBtZXRhO1xuXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRcdG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShpKTtcblx0XHRcdFx0aWYgKG1ldGEuYmFyICYmIGNoYXJ0LmlzRGF0YXNldFZpc2libGUoaSkgJiZcblx0XHRcdFx0XHQoc3RhY2tlZCA9PT0gZmFsc2UgfHxcblx0XHRcdFx0XHQoc3RhY2tlZCA9PT0gdHJ1ZSAmJiBzdGFja3MuaW5kZXhPZihtZXRhLnN0YWNrKSA9PT0gLTEpIHx8XG5cdFx0XHRcdFx0KHN0YWNrZWQgPT09IHVuZGVmaW5lZCAmJiAobWV0YS5zdGFjayA9PT0gdW5kZWZpbmVkIHx8IHN0YWNrcy5pbmRleE9mKG1ldGEuc3RhY2spID09PSAtMSkpKSkge1xuXHRcdFx0XHRcdHN0YWNrcy5wdXNoKG1ldGEuc3RhY2spO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzdGFja3M7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFJldHVybnMgdGhlIGVmZmVjdGl2ZSBudW1iZXIgb2Ygc3RhY2tzIGJhc2VkIG9uIGdyb3VwcyBhbmQgYmFyIHZpc2liaWxpdHkuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRnZXRTdGFja0NvdW50OiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLl9nZXRTdGFja3MoKS5sZW5ndGg7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFJldHVybnMgdGhlIHN0YWNrIGluZGV4IGZvciB0aGUgZ2l2ZW4gZGF0YXNldCBiYXNlZCBvbiBncm91cHMgYW5kIGJhciB2aXNpYmlsaXR5LlxuXHRcdCAqIEBwYXJhbSB7TnVtYmVyfSBbZGF0YXNldEluZGV4XSAtIFRoZSBkYXRhc2V0IGluZGV4XG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IFtuYW1lXSAtIFRoZSBzdGFjayBuYW1lIHRvIGZpbmRcblx0XHQgKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgc3RhY2sgaW5kZXhcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGdldFN0YWNrSW5kZXg6IGZ1bmN0aW9uKGRhdGFzZXRJbmRleCwgbmFtZSkge1xuXHRcdFx0dmFyIHN0YWNrcyA9IHRoaXMuX2dldFN0YWNrcyhkYXRhc2V0SW5kZXgpO1xuXHRcdFx0dmFyIGluZGV4ID0gKG5hbWUgIT09IHVuZGVmaW5lZClcblx0XHRcdFx0PyBzdGFja3MuaW5kZXhPZihuYW1lKVxuXHRcdFx0XHQ6IC0xOyAvLyBpbmRleE9mIHJldHVybnMgLTEgaWYgZWxlbWVudCBpcyBub3QgcHJlc2VudFxuXG5cdFx0XHRyZXR1cm4gKGluZGV4ID09PSAtMSlcblx0XHRcdFx0PyBzdGFja3MubGVuZ3RoIC0gMVxuXHRcdFx0XHQ6IGluZGV4O1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGdldFJ1bGVyOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgc2NhbGUgPSBtZS5nZXRJbmRleFNjYWxlKCk7XG5cdFx0XHR2YXIgc3RhY2tDb3VudCA9IG1lLmdldFN0YWNrQ291bnQoKTtcblx0XHRcdHZhciBkYXRhc2V0SW5kZXggPSBtZS5pbmRleDtcblx0XHRcdHZhciBpc0hvcml6b250YWwgPSBzY2FsZS5pc0hvcml6b250YWwoKTtcblx0XHRcdHZhciBzdGFydCA9IGlzSG9yaXpvbnRhbCA/IHNjYWxlLmxlZnQgOiBzY2FsZS50b3A7XG5cdFx0XHR2YXIgZW5kID0gc3RhcnQgKyAoaXNIb3Jpem9udGFsID8gc2NhbGUud2lkdGggOiBzY2FsZS5oZWlnaHQpO1xuXHRcdFx0dmFyIHBpeGVscyA9IFtdO1xuXHRcdFx0dmFyIGksIGlsZW4sIG1pbjtcblxuXHRcdFx0Zm9yIChpID0gMCwgaWxlbiA9IG1lLmdldE1ldGEoKS5kYXRhLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0XHRwaXhlbHMucHVzaChzY2FsZS5nZXRQaXhlbEZvclZhbHVlKG51bGwsIGksIGRhdGFzZXRJbmRleCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRtaW4gPSBoZWxwZXJzLmlzTnVsbE9yVW5kZWYoc2NhbGUub3B0aW9ucy5iYXJUaGlja25lc3MpXG5cdFx0XHRcdD8gY29tcHV0ZU1pblNhbXBsZVNpemUoc2NhbGUsIHBpeGVscylcblx0XHRcdFx0OiAtMTtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bWluOiBtaW4sXG5cdFx0XHRcdHBpeGVsczogcGl4ZWxzLFxuXHRcdFx0XHRzdGFydDogc3RhcnQsXG5cdFx0XHRcdGVuZDogZW5kLFxuXHRcdFx0XHRzdGFja0NvdW50OiBzdGFja0NvdW50LFxuXHRcdFx0XHRzY2FsZTogc2NhbGVcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIE5vdGU6IHBpeGVsIHZhbHVlcyBhcmUgbm90IGNsYW1wZWQgdG8gdGhlIHNjYWxlIGFyZWEuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRjYWxjdWxhdGVCYXJWYWx1ZVBpeGVsczogZnVuY3Rpb24oZGF0YXNldEluZGV4LCBpbmRleCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdFx0dmFyIG1ldGEgPSBtZS5nZXRNZXRhKCk7XG5cdFx0XHR2YXIgc2NhbGUgPSBtZS5nZXRWYWx1ZVNjYWxlKCk7XG5cdFx0XHR2YXIgZGF0YXNldHMgPSBjaGFydC5kYXRhLmRhdGFzZXRzO1xuXHRcdFx0dmFyIHZhbHVlID0gc2NhbGUuZ2V0UmlnaHRWYWx1ZShkYXRhc2V0c1tkYXRhc2V0SW5kZXhdLmRhdGFbaW5kZXhdKTtcblx0XHRcdHZhciBzdGFja2VkID0gc2NhbGUub3B0aW9ucy5zdGFja2VkO1xuXHRcdFx0dmFyIHN0YWNrID0gbWV0YS5zdGFjaztcblx0XHRcdHZhciBzdGFydCA9IDA7XG5cdFx0XHR2YXIgaSwgaW1ldGEsIGl2YWx1ZSwgYmFzZSwgaGVhZCwgc2l6ZTtcblxuXHRcdFx0aWYgKHN0YWNrZWQgfHwgKHN0YWNrZWQgPT09IHVuZGVmaW5lZCAmJiBzdGFjayAhPT0gdW5kZWZpbmVkKSkge1xuXHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgZGF0YXNldEluZGV4OyArK2kpIHtcblx0XHRcdFx0XHRpbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGkpO1xuXG5cdFx0XHRcdFx0aWYgKGltZXRhLmJhciAmJlxuXHRcdFx0XHRcdFx0aW1ldGEuc3RhY2sgPT09IHN0YWNrICYmXG5cdFx0XHRcdFx0XHRpbWV0YS5jb250cm9sbGVyLmdldFZhbHVlU2NhbGVJZCgpID09PSBzY2FsZS5pZCAmJlxuXHRcdFx0XHRcdFx0Y2hhcnQuaXNEYXRhc2V0VmlzaWJsZShpKSkge1xuXG5cdFx0XHRcdFx0XHRpdmFsdWUgPSBzY2FsZS5nZXRSaWdodFZhbHVlKGRhdGFzZXRzW2ldLmRhdGFbaW5kZXhdKTtcblx0XHRcdFx0XHRcdGlmICgodmFsdWUgPCAwICYmIGl2YWx1ZSA8IDApIHx8ICh2YWx1ZSA+PSAwICYmIGl2YWx1ZSA+IDApKSB7XG5cdFx0XHRcdFx0XHRcdHN0YXJ0ICs9IGl2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0YmFzZSA9IHNjYWxlLmdldFBpeGVsRm9yVmFsdWUoc3RhcnQpO1xuXHRcdFx0aGVhZCA9IHNjYWxlLmdldFBpeGVsRm9yVmFsdWUoc3RhcnQgKyB2YWx1ZSk7XG5cdFx0XHRzaXplID0gKGhlYWQgLSBiYXNlKSAvIDI7XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHNpemU6IHNpemUsXG5cdFx0XHRcdGJhc2U6IGJhc2UsXG5cdFx0XHRcdGhlYWQ6IGhlYWQsXG5cdFx0XHRcdGNlbnRlcjogaGVhZCArIHNpemUgLyAyXG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGNhbGN1bGF0ZUJhckluZGV4UGl4ZWxzOiBmdW5jdGlvbihkYXRhc2V0SW5kZXgsIGluZGV4LCBydWxlcikge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBvcHRpb25zID0gcnVsZXIuc2NhbGUub3B0aW9ucztcblx0XHRcdHZhciByYW5nZSA9IG9wdGlvbnMuYmFyVGhpY2tuZXNzID09PSAnZmxleCdcblx0XHRcdFx0PyBjb21wdXRlRmxleENhdGVnb3J5VHJhaXRzKGluZGV4LCBydWxlciwgb3B0aW9ucylcblx0XHRcdFx0OiBjb21wdXRlRml0Q2F0ZWdvcnlUcmFpdHMoaW5kZXgsIHJ1bGVyLCBvcHRpb25zKTtcblxuXHRcdFx0dmFyIHN0YWNrSW5kZXggPSBtZS5nZXRTdGFja0luZGV4KGRhdGFzZXRJbmRleCwgbWUuZ2V0TWV0YSgpLnN0YWNrKTtcblx0XHRcdHZhciBjZW50ZXIgPSByYW5nZS5zdGFydCArIChyYW5nZS5jaHVuayAqIHN0YWNrSW5kZXgpICsgKHJhbmdlLmNodW5rIC8gMik7XG5cdFx0XHR2YXIgc2l6ZSA9IE1hdGgubWluKFxuXHRcdFx0XHRoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KG9wdGlvbnMubWF4QmFyVGhpY2tuZXNzLCBJbmZpbml0eSksXG5cdFx0XHRcdHJhbmdlLmNodW5rICogcmFuZ2UucmF0aW8pO1xuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRiYXNlOiBjZW50ZXIgLSBzaXplIC8gMixcblx0XHRcdFx0aGVhZDogY2VudGVyICsgc2l6ZSAvIDIsXG5cdFx0XHRcdGNlbnRlcjogY2VudGVyLFxuXHRcdFx0XHRzaXplOiBzaXplXG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRkcmF3OiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgY2hhcnQgPSBtZS5jaGFydDtcblx0XHRcdHZhciBzY2FsZSA9IG1lLmdldFZhbHVlU2NhbGUoKTtcblx0XHRcdHZhciByZWN0cyA9IG1lLmdldE1ldGEoKS5kYXRhO1xuXHRcdFx0dmFyIGRhdGFzZXQgPSBtZS5nZXREYXRhc2V0KCk7XG5cdFx0XHR2YXIgaWxlbiA9IHJlY3RzLmxlbmd0aDtcblx0XHRcdHZhciBpID0gMDtcblxuXHRcdFx0aGVscGVycy5jYW52YXMuY2xpcEFyZWEoY2hhcnQuY3R4LCBjaGFydC5jaGFydEFyZWEpO1xuXG5cdFx0XHRmb3IgKDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0XHRpZiAoIWlzTmFOKHNjYWxlLmdldFJpZ2h0VmFsdWUoZGF0YXNldC5kYXRhW2ldKSkpIHtcblx0XHRcdFx0XHRyZWN0c1tpXS5kcmF3KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aGVscGVycy5jYW52YXMudW5jbGlwQXJlYShjaGFydC5jdHgpO1xuXHRcdH0sXG5cdH0pO1xuXG5cdENoYXJ0LmNvbnRyb2xsZXJzLmhvcml6b250YWxCYXIgPSBDaGFydC5jb250cm9sbGVycy5iYXIuZXh0ZW5kKHtcblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGdldFZhbHVlU2NhbGVJZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRNZXRhKCkueEF4aXNJRDtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRnZXRJbmRleFNjYWxlSWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0TWV0YSgpLnlBeGlzSUQ7XG5cdFx0fVxuXHR9KTtcbn07XG5cbn0se1wiMjZcIjoyNixcIjQxXCI6NDEsXCI0NlwiOjQ2fV0sMTY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcbnZhciBlbGVtZW50cyA9IHJlcXVpcmUoNDEpO1xudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcblxuZGVmYXVsdHMuX3NldCgnYnViYmxlJywge1xuXHRob3Zlcjoge1xuXHRcdG1vZGU6ICdzaW5nbGUnXG5cdH0sXG5cblx0c2NhbGVzOiB7XG5cdFx0eEF4ZXM6IFt7XG5cdFx0XHR0eXBlOiAnbGluZWFyJywgLy8gYnViYmxlIHNob3VsZCBwcm9iYWJseSB1c2UgYSBsaW5lYXIgc2NhbGUgYnkgZGVmYXVsdFxuXHRcdFx0cG9zaXRpb246ICdib3R0b20nLFxuXHRcdFx0aWQ6ICd4LWF4aXMtMCcgLy8gbmVlZCBhbiBJRCBzbyBkYXRhc2V0cyBjYW4gcmVmZXJlbmNlIHRoZSBzY2FsZVxuXHRcdH1dLFxuXHRcdHlBeGVzOiBbe1xuXHRcdFx0dHlwZTogJ2xpbmVhcicsXG5cdFx0XHRwb3NpdGlvbjogJ2xlZnQnLFxuXHRcdFx0aWQ6ICd5LWF4aXMtMCdcblx0XHR9XVxuXHR9LFxuXG5cdHRvb2x0aXBzOiB7XG5cdFx0Y2FsbGJhY2tzOiB7XG5cdFx0XHR0aXRsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdC8vIFRpdGxlIGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3Igc2NhdHRlciBzaW5jZSB3ZSBmb3JtYXQgdGhlIGRhdGEgYXMgYSBwb2ludFxuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9LFxuXHRcdFx0bGFiZWw6IGZ1bmN0aW9uKGl0ZW0sIGRhdGEpIHtcblx0XHRcdFx0dmFyIGRhdGFzZXRMYWJlbCA9IGRhdGEuZGF0YXNldHNbaXRlbS5kYXRhc2V0SW5kZXhdLmxhYmVsIHx8ICcnO1xuXHRcdFx0XHR2YXIgZGF0YVBvaW50ID0gZGF0YS5kYXRhc2V0c1tpdGVtLmRhdGFzZXRJbmRleF0uZGF0YVtpdGVtLmluZGV4XTtcblx0XHRcdFx0cmV0dXJuIGRhdGFzZXRMYWJlbCArICc6ICgnICsgaXRlbS54TGFiZWwgKyAnLCAnICsgaXRlbS55TGFiZWwgKyAnLCAnICsgZGF0YVBvaW50LnIgKyAnKSc7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59KTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENoYXJ0KSB7XG5cblx0Q2hhcnQuY29udHJvbGxlcnMuYnViYmxlID0gQ2hhcnQuRGF0YXNldENvbnRyb2xsZXIuZXh0ZW5kKHtcblx0XHQvKipcblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICovXG5cdFx0ZGF0YUVsZW1lbnRUeXBlOiBlbGVtZW50cy5Qb2ludCxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKi9cblx0XHR1cGRhdGU6IGZ1bmN0aW9uKHJlc2V0KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG1ldGEgPSBtZS5nZXRNZXRhKCk7XG5cdFx0XHR2YXIgcG9pbnRzID0gbWV0YS5kYXRhO1xuXG5cdFx0XHQvLyBVcGRhdGUgUG9pbnRzXG5cdFx0XHRoZWxwZXJzLmVhY2gocG9pbnRzLCBmdW5jdGlvbihwb2ludCwgaW5kZXgpIHtcblx0XHRcdFx0bWUudXBkYXRlRWxlbWVudChwb2ludCwgaW5kZXgsIHJlc2V0KTtcblx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICovXG5cdFx0dXBkYXRlRWxlbWVudDogZnVuY3Rpb24ocG9pbnQsIGluZGV4LCByZXNldCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xuXHRcdFx0dmFyIGN1c3RvbSA9IHBvaW50LmN1c3RvbSB8fCB7fTtcblx0XHRcdHZhciB4U2NhbGUgPSBtZS5nZXRTY2FsZUZvcklkKG1ldGEueEF4aXNJRCk7XG5cdFx0XHR2YXIgeVNjYWxlID0gbWUuZ2V0U2NhbGVGb3JJZChtZXRhLnlBeGlzSUQpO1xuXHRcdFx0dmFyIG9wdGlvbnMgPSBtZS5fcmVzb2x2ZUVsZW1lbnRPcHRpb25zKHBvaW50LCBpbmRleCk7XG5cdFx0XHR2YXIgZGF0YSA9IG1lLmdldERhdGFzZXQoKS5kYXRhW2luZGV4XTtcblx0XHRcdHZhciBkc0luZGV4ID0gbWUuaW5kZXg7XG5cblx0XHRcdHZhciB4ID0gcmVzZXQgPyB4U2NhbGUuZ2V0UGl4ZWxGb3JEZWNpbWFsKDAuNSkgOiB4U2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZSh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDogTmFOLCBpbmRleCwgZHNJbmRleCk7XG5cdFx0XHR2YXIgeSA9IHJlc2V0ID8geVNjYWxlLmdldEJhc2VQaXhlbCgpIDogeVNjYWxlLmdldFBpeGVsRm9yVmFsdWUoZGF0YSwgaW5kZXgsIGRzSW5kZXgpO1xuXG5cdFx0XHRwb2ludC5feFNjYWxlID0geFNjYWxlO1xuXHRcdFx0cG9pbnQuX3lTY2FsZSA9IHlTY2FsZTtcblx0XHRcdHBvaW50Ll9vcHRpb25zID0gb3B0aW9ucztcblx0XHRcdHBvaW50Ll9kYXRhc2V0SW5kZXggPSBkc0luZGV4O1xuXHRcdFx0cG9pbnQuX2luZGV4ID0gaW5kZXg7XG5cdFx0XHRwb2ludC5fbW9kZWwgPSB7XG5cdFx0XHRcdGJhY2tncm91bmRDb2xvcjogb3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IsXG5cdFx0XHRcdGJvcmRlckNvbG9yOiBvcHRpb25zLmJvcmRlckNvbG9yLFxuXHRcdFx0XHRib3JkZXJXaWR0aDogb3B0aW9ucy5ib3JkZXJXaWR0aCxcblx0XHRcdFx0aGl0UmFkaXVzOiBvcHRpb25zLmhpdFJhZGl1cyxcblx0XHRcdFx0cG9pbnRTdHlsZTogb3B0aW9ucy5wb2ludFN0eWxlLFxuXHRcdFx0XHRyb3RhdGlvbjogb3B0aW9ucy5yb3RhdGlvbixcblx0XHRcdFx0cmFkaXVzOiByZXNldCA/IDAgOiBvcHRpb25zLnJhZGl1cyxcblx0XHRcdFx0c2tpcDogY3VzdG9tLnNraXAgfHwgaXNOYU4oeCkgfHwgaXNOYU4oeSksXG5cdFx0XHRcdHg6IHgsXG5cdFx0XHRcdHk6IHksXG5cdFx0XHR9O1xuXG5cdFx0XHRwb2ludC5waXZvdCgpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICovXG5cdFx0c2V0SG92ZXJTdHlsZTogZnVuY3Rpb24ocG9pbnQpIHtcblx0XHRcdHZhciBtb2RlbCA9IHBvaW50Ll9tb2RlbDtcblx0XHRcdHZhciBvcHRpb25zID0gcG9pbnQuX29wdGlvbnM7XG5cdFx0XHRwb2ludC4kcHJldmlvdXNTdHlsZSA9IHtcblx0XHRcdFx0YmFja2dyb3VuZENvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG5cdFx0XHRcdGJvcmRlckNvbG9yOiBtb2RlbC5ib3JkZXJDb2xvcixcblx0XHRcdFx0Ym9yZGVyV2lkdGg6IG1vZGVsLmJvcmRlcldpZHRoLFxuXHRcdFx0XHRyYWRpdXM6IG1vZGVsLnJhZGl1c1xuXHRcdFx0fTtcblx0XHRcdG1vZGVsLmJhY2tncm91bmRDb2xvciA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQob3B0aW9ucy5ob3ZlckJhY2tncm91bmRDb2xvciwgaGVscGVycy5nZXRIb3ZlckNvbG9yKG9wdGlvbnMuYmFja2dyb3VuZENvbG9yKSk7XG5cdFx0XHRtb2RlbC5ib3JkZXJDb2xvciA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQob3B0aW9ucy5ob3ZlckJvcmRlckNvbG9yLCBoZWxwZXJzLmdldEhvdmVyQ29sb3Iob3B0aW9ucy5ib3JkZXJDb2xvcikpO1xuXHRcdFx0bW9kZWwuYm9yZGVyV2lkdGggPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KG9wdGlvbnMuaG92ZXJCb3JkZXJXaWR0aCwgb3B0aW9ucy5ib3JkZXJXaWR0aCk7XG5cdFx0XHRtb2RlbC5yYWRpdXMgPSBvcHRpb25zLnJhZGl1cyArIG9wdGlvbnMuaG92ZXJSYWRpdXM7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0X3Jlc29sdmVFbGVtZW50T3B0aW9uczogZnVuY3Rpb24ocG9pbnQsIGluZGV4KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XG5cdFx0XHR2YXIgZGF0YXNldHMgPSBjaGFydC5kYXRhLmRhdGFzZXRzO1xuXHRcdFx0dmFyIGRhdGFzZXQgPSBkYXRhc2V0c1ttZS5pbmRleF07XG5cdFx0XHR2YXIgY3VzdG9tID0gcG9pbnQuY3VzdG9tIHx8IHt9O1xuXHRcdFx0dmFyIG9wdGlvbnMgPSBjaGFydC5vcHRpb25zLmVsZW1lbnRzLnBvaW50O1xuXHRcdFx0dmFyIHJlc29sdmUgPSBoZWxwZXJzLm9wdGlvbnMucmVzb2x2ZTtcblx0XHRcdHZhciBkYXRhID0gZGF0YXNldC5kYXRhW2luZGV4XTtcblx0XHRcdHZhciB2YWx1ZXMgPSB7fTtcblx0XHRcdHZhciBpLCBpbGVuLCBrZXk7XG5cblx0XHRcdC8vIFNjcmlwdGFibGUgb3B0aW9uc1xuXHRcdFx0dmFyIGNvbnRleHQgPSB7XG5cdFx0XHRcdGNoYXJ0OiBjaGFydCxcblx0XHRcdFx0ZGF0YUluZGV4OiBpbmRleCxcblx0XHRcdFx0ZGF0YXNldDogZGF0YXNldCxcblx0XHRcdFx0ZGF0YXNldEluZGV4OiBtZS5pbmRleFxuXHRcdFx0fTtcblxuXHRcdFx0dmFyIGtleXMgPSBbXG5cdFx0XHRcdCdiYWNrZ3JvdW5kQ29sb3InLFxuXHRcdFx0XHQnYm9yZGVyQ29sb3InLFxuXHRcdFx0XHQnYm9yZGVyV2lkdGgnLFxuXHRcdFx0XHQnaG92ZXJCYWNrZ3JvdW5kQ29sb3InLFxuXHRcdFx0XHQnaG92ZXJCb3JkZXJDb2xvcicsXG5cdFx0XHRcdCdob3ZlckJvcmRlcldpZHRoJyxcblx0XHRcdFx0J2hvdmVyUmFkaXVzJyxcblx0XHRcdFx0J2hpdFJhZGl1cycsXG5cdFx0XHRcdCdwb2ludFN0eWxlJyxcblx0XHRcdFx0J3JvdGF0aW9uJ1xuXHRcdFx0XTtcblxuXHRcdFx0Zm9yIChpID0gMCwgaWxlbiA9IGtleXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRcdGtleSA9IGtleXNbaV07XG5cdFx0XHRcdHZhbHVlc1trZXldID0gcmVzb2x2ZShbXG5cdFx0XHRcdFx0Y3VzdG9tW2tleV0sXG5cdFx0XHRcdFx0ZGF0YXNldFtrZXldLFxuXHRcdFx0XHRcdG9wdGlvbnNba2V5XVxuXHRcdFx0XHRdLCBjb250ZXh0LCBpbmRleCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEN1c3RvbSByYWRpdXMgcmVzb2x1dGlvblxuXHRcdFx0dmFsdWVzLnJhZGl1cyA9IHJlc29sdmUoW1xuXHRcdFx0XHRjdXN0b20ucmFkaXVzLFxuXHRcdFx0XHRkYXRhID8gZGF0YS5yIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRkYXRhc2V0LnJhZGl1cyxcblx0XHRcdFx0b3B0aW9ucy5yYWRpdXNcblx0XHRcdF0sIGNvbnRleHQsIGluZGV4KTtcblx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0fVxuXHR9KTtcbn07XG5cbn0se1wiMjZcIjoyNixcIjQxXCI6NDEsXCI0NlwiOjQ2fV0sMTc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcbnZhciBlbGVtZW50cyA9IHJlcXVpcmUoNDEpO1xudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcblxuZGVmYXVsdHMuX3NldCgnZG91Z2hudXQnLCB7XG5cdGFuaW1hdGlvbjoge1xuXHRcdC8vIEJvb2xlYW4gLSBXaGV0aGVyIHdlIGFuaW1hdGUgdGhlIHJvdGF0aW9uIG9mIHRoZSBEb3VnaG51dFxuXHRcdGFuaW1hdGVSb3RhdGU6IHRydWUsXG5cdFx0Ly8gQm9vbGVhbiAtIFdoZXRoZXIgd2UgYW5pbWF0ZSBzY2FsaW5nIHRoZSBEb3VnaG51dCBmcm9tIHRoZSBjZW50cmVcblx0XHRhbmltYXRlU2NhbGU6IGZhbHNlXG5cdH0sXG5cdGhvdmVyOiB7XG5cdFx0bW9kZTogJ3NpbmdsZSdcblx0fSxcblx0bGVnZW5kQ2FsbGJhY2s6IGZ1bmN0aW9uKGNoYXJ0KSB7XG5cdFx0dmFyIHRleHQgPSBbXTtcblx0XHR0ZXh0LnB1c2goJzx1bCBjbGFzcz1cIicgKyBjaGFydC5pZCArICctbGVnZW5kXCI+Jyk7XG5cblx0XHR2YXIgZGF0YSA9IGNoYXJ0LmRhdGE7XG5cdFx0dmFyIGRhdGFzZXRzID0gZGF0YS5kYXRhc2V0cztcblx0XHR2YXIgbGFiZWxzID0gZGF0YS5sYWJlbHM7XG5cblx0XHRpZiAoZGF0YXNldHMubGVuZ3RoKSB7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFzZXRzWzBdLmRhdGEubGVuZ3RoOyArK2kpIHtcblx0XHRcdFx0dGV4dC5wdXNoKCc8bGk+PHNwYW4gc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOicgKyBkYXRhc2V0c1swXS5iYWNrZ3JvdW5kQ29sb3JbaV0gKyAnXCI+PC9zcGFuPicpO1xuXHRcdFx0XHRpZiAobGFiZWxzW2ldKSB7XG5cdFx0XHRcdFx0dGV4dC5wdXNoKGxhYmVsc1tpXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGV4dC5wdXNoKCc8L2xpPicpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRleHQucHVzaCgnPC91bD4nKTtcblx0XHRyZXR1cm4gdGV4dC5qb2luKCcnKTtcblx0fSxcblx0bGVnZW5kOiB7XG5cdFx0bGFiZWxzOiB7XG5cdFx0XHRnZW5lcmF0ZUxhYmVsczogZnVuY3Rpb24oY2hhcnQpIHtcblx0XHRcdFx0dmFyIGRhdGEgPSBjaGFydC5kYXRhO1xuXHRcdFx0XHRpZiAoZGF0YS5sYWJlbHMubGVuZ3RoICYmIGRhdGEuZGF0YXNldHMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGEubGFiZWxzLm1hcChmdW5jdGlvbihsYWJlbCwgaSkge1xuXHRcdFx0XHRcdFx0dmFyIG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YSgwKTtcblx0XHRcdFx0XHRcdHZhciBkcyA9IGRhdGEuZGF0YXNldHNbMF07XG5cdFx0XHRcdFx0XHR2YXIgYXJjID0gbWV0YS5kYXRhW2ldO1xuXHRcdFx0XHRcdFx0dmFyIGN1c3RvbSA9IGFyYyAmJiBhcmMuY3VzdG9tIHx8IHt9O1xuXHRcdFx0XHRcdFx0dmFyIHZhbHVlQXRJbmRleE9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0O1xuXHRcdFx0XHRcdFx0dmFyIGFyY09wdHMgPSBjaGFydC5vcHRpb25zLmVsZW1lbnRzLmFyYztcblx0XHRcdFx0XHRcdHZhciBmaWxsID0gY3VzdG9tLmJhY2tncm91bmRDb2xvciA/IGN1c3RvbS5iYWNrZ3JvdW5kQ29sb3IgOiB2YWx1ZUF0SW5kZXhPckRlZmF1bHQoZHMuYmFja2dyb3VuZENvbG9yLCBpLCBhcmNPcHRzLmJhY2tncm91bmRDb2xvcik7XG5cdFx0XHRcdFx0XHR2YXIgc3Ryb2tlID0gY3VzdG9tLmJvcmRlckNvbG9yID8gY3VzdG9tLmJvcmRlckNvbG9yIDogdmFsdWVBdEluZGV4T3JEZWZhdWx0KGRzLmJvcmRlckNvbG9yLCBpLCBhcmNPcHRzLmJvcmRlckNvbG9yKTtcblx0XHRcdFx0XHRcdHZhciBidyA9IGN1c3RvbS5ib3JkZXJXaWR0aCA/IGN1c3RvbS5ib3JkZXJXaWR0aCA6IHZhbHVlQXRJbmRleE9yRGVmYXVsdChkcy5ib3JkZXJXaWR0aCwgaSwgYXJjT3B0cy5ib3JkZXJXaWR0aCk7XG5cblx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdHRleHQ6IGxhYmVsLFxuXHRcdFx0XHRcdFx0XHRmaWxsU3R5bGU6IGZpbGwsXG5cdFx0XHRcdFx0XHRcdHN0cm9rZVN0eWxlOiBzdHJva2UsXG5cdFx0XHRcdFx0XHRcdGxpbmVXaWR0aDogYncsXG5cdFx0XHRcdFx0XHRcdGhpZGRlbjogaXNOYU4oZHMuZGF0YVtpXSkgfHwgbWV0YS5kYXRhW2ldLmhpZGRlbixcblxuXHRcdFx0XHRcdFx0XHQvLyBFeHRyYSBkYXRhIHVzZWQgZm9yIHRvZ2dsaW5nIHRoZSBjb3JyZWN0IGl0ZW1cblx0XHRcdFx0XHRcdFx0aW5kZXg6IGlcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIFtdO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRvbkNsaWNrOiBmdW5jdGlvbihlLCBsZWdlbmRJdGVtKSB7XG5cdFx0XHR2YXIgaW5kZXggPSBsZWdlbmRJdGVtLmluZGV4O1xuXHRcdFx0dmFyIGNoYXJ0ID0gdGhpcy5jaGFydDtcblx0XHRcdHZhciBpLCBpbGVuLCBtZXRhO1xuXG5cdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0gKGNoYXJ0LmRhdGEuZGF0YXNldHMgfHwgW10pLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0XHRtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoaSk7XG5cdFx0XHRcdC8vIHRvZ2dsZSB2aXNpYmlsaXR5IG9mIGluZGV4IGlmIGV4aXN0c1xuXHRcdFx0XHRpZiAobWV0YS5kYXRhW2luZGV4XSkge1xuXHRcdFx0XHRcdG1ldGEuZGF0YVtpbmRleF0uaGlkZGVuID0gIW1ldGEuZGF0YVtpbmRleF0uaGlkZGVuO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNoYXJ0LnVwZGF0ZSgpO1xuXHRcdH1cblx0fSxcblxuXHQvLyBUaGUgcGVyY2VudGFnZSBvZiB0aGUgY2hhcnQgdGhhdCB3ZSBjdXQgb3V0IG9mIHRoZSBtaWRkbGUuXG5cdGN1dG91dFBlcmNlbnRhZ2U6IDUwLFxuXG5cdC8vIFRoZSByb3RhdGlvbiBvZiB0aGUgY2hhcnQsIHdoZXJlIHRoZSBmaXJzdCBkYXRhIGFyYyBiZWdpbnMuXG5cdHJvdGF0aW9uOiBNYXRoLlBJICogLTAuNSxcblxuXHQvLyBUaGUgdG90YWwgY2lyY3VtZmVyZW5jZSBvZiB0aGUgY2hhcnQuXG5cdGNpcmN1bWZlcmVuY2U6IE1hdGguUEkgKiAyLjAsXG5cblx0Ly8gTmVlZCB0byBvdmVycmlkZSB0aGVzZSB0byBnaXZlIGEgbmljZSBkZWZhdWx0XG5cdHRvb2x0aXBzOiB7XG5cdFx0Y2FsbGJhY2tzOiB7XG5cdFx0XHR0aXRsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAnJztcblx0XHRcdH0sXG5cdFx0XHRsYWJlbDogZnVuY3Rpb24odG9vbHRpcEl0ZW0sIGRhdGEpIHtcblx0XHRcdFx0dmFyIGRhdGFMYWJlbCA9IGRhdGEubGFiZWxzW3Rvb2x0aXBJdGVtLmluZGV4XTtcblx0XHRcdFx0dmFyIHZhbHVlID0gJzogJyArIGRhdGEuZGF0YXNldHNbdG9vbHRpcEl0ZW0uZGF0YXNldEluZGV4XS5kYXRhW3Rvb2x0aXBJdGVtLmluZGV4XTtcblxuXHRcdFx0XHRpZiAoaGVscGVycy5pc0FycmF5KGRhdGFMYWJlbCkpIHtcblx0XHRcdFx0XHQvLyBzaG93IHZhbHVlIG9uIGZpcnN0IGxpbmUgb2YgbXVsdGlsaW5lIGxhYmVsXG5cdFx0XHRcdFx0Ly8gbmVlZCB0byBjbG9uZSBiZWNhdXNlIHdlIGFyZSBjaGFuZ2luZyB0aGUgdmFsdWVcblx0XHRcdFx0XHRkYXRhTGFiZWwgPSBkYXRhTGFiZWwuc2xpY2UoKTtcblx0XHRcdFx0XHRkYXRhTGFiZWxbMF0gKz0gdmFsdWU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGF0YUxhYmVsICs9IHZhbHVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGRhdGFMYWJlbDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0pO1xuXG5kZWZhdWx0cy5fc2V0KCdwaWUnLCBoZWxwZXJzLmNsb25lKGRlZmF1bHRzLmRvdWdobnV0KSk7XG5kZWZhdWx0cy5fc2V0KCdwaWUnLCB7XG5cdGN1dG91dFBlcmNlbnRhZ2U6IDBcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENoYXJ0KSB7XG5cblx0Q2hhcnQuY29udHJvbGxlcnMuZG91Z2hudXQgPSBDaGFydC5jb250cm9sbGVycy5waWUgPSBDaGFydC5EYXRhc2V0Q29udHJvbGxlci5leHRlbmQoe1xuXG5cdFx0ZGF0YUVsZW1lbnRUeXBlOiBlbGVtZW50cy5BcmMsXG5cblx0XHRsaW5rU2NhbGVzOiBoZWxwZXJzLm5vb3AsXG5cblx0XHQvLyBHZXQgaW5kZXggb2YgdGhlIGRhdGFzZXQgaW4gcmVsYXRpb24gdG8gdGhlIHZpc2libGUgZGF0YXNldHMuIFRoaXMgYWxsb3dzIGRldGVybWluaW5nIHRoZSBpbm5lciBhbmQgb3V0ZXIgcmFkaXVzIGNvcnJlY3RseVxuXHRcdGdldFJpbmdJbmRleDogZnVuY3Rpb24oZGF0YXNldEluZGV4KSB7XG5cdFx0XHR2YXIgcmluZ0luZGV4ID0gMDtcblxuXHRcdFx0Zm9yICh2YXIgaiA9IDA7IGogPCBkYXRhc2V0SW5kZXg7ICsraikge1xuXHRcdFx0XHRpZiAodGhpcy5jaGFydC5pc0RhdGFzZXRWaXNpYmxlKGopKSB7XG5cdFx0XHRcdFx0KytyaW5nSW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJpbmdJbmRleDtcblx0XHR9LFxuXG5cdFx0dXBkYXRlOiBmdW5jdGlvbihyZXNldCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdFx0dmFyIGNoYXJ0QXJlYSA9IGNoYXJ0LmNoYXJ0QXJlYTtcblx0XHRcdHZhciBvcHRzID0gY2hhcnQub3B0aW9ucztcblx0XHRcdHZhciBhcmNPcHRzID0gb3B0cy5lbGVtZW50cy5hcmM7XG5cdFx0XHR2YXIgYXZhaWxhYmxlV2lkdGggPSBjaGFydEFyZWEucmlnaHQgLSBjaGFydEFyZWEubGVmdCAtIGFyY09wdHMuYm9yZGVyV2lkdGg7XG5cdFx0XHR2YXIgYXZhaWxhYmxlSGVpZ2h0ID0gY2hhcnRBcmVhLmJvdHRvbSAtIGNoYXJ0QXJlYS50b3AgLSBhcmNPcHRzLmJvcmRlcldpZHRoO1xuXHRcdFx0dmFyIG1pblNpemUgPSBNYXRoLm1pbihhdmFpbGFibGVXaWR0aCwgYXZhaWxhYmxlSGVpZ2h0KTtcblx0XHRcdHZhciBvZmZzZXQgPSB7eDogMCwgeTogMH07XG5cdFx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcblx0XHRcdHZhciBjdXRvdXRQZXJjZW50YWdlID0gb3B0cy5jdXRvdXRQZXJjZW50YWdlO1xuXHRcdFx0dmFyIGNpcmN1bWZlcmVuY2UgPSBvcHRzLmNpcmN1bWZlcmVuY2U7XG5cblx0XHRcdC8vIElmIHRoZSBjaGFydCdzIGNpcmN1bWZlcmVuY2UgaXNuJ3QgYSBmdWxsIGNpcmNsZSwgY2FsY3VsYXRlIG1pblNpemUgYXMgYSByYXRpbyBvZiB0aGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBhcmNcblx0XHRcdGlmIChjaXJjdW1mZXJlbmNlIDwgTWF0aC5QSSAqIDIuMCkge1xuXHRcdFx0XHR2YXIgc3RhcnRBbmdsZSA9IG9wdHMucm90YXRpb24gJSAoTWF0aC5QSSAqIDIuMCk7XG5cdFx0XHRcdHN0YXJ0QW5nbGUgKz0gTWF0aC5QSSAqIDIuMCAqIChzdGFydEFuZ2xlID49IE1hdGguUEkgPyAtMSA6IHN0YXJ0QW5nbGUgPCAtTWF0aC5QSSA/IDEgOiAwKTtcblx0XHRcdFx0dmFyIGVuZEFuZ2xlID0gc3RhcnRBbmdsZSArIGNpcmN1bWZlcmVuY2U7XG5cdFx0XHRcdHZhciBzdGFydCA9IHt4OiBNYXRoLmNvcyhzdGFydEFuZ2xlKSwgeTogTWF0aC5zaW4oc3RhcnRBbmdsZSl9O1xuXHRcdFx0XHR2YXIgZW5kID0ge3g6IE1hdGguY29zKGVuZEFuZ2xlKSwgeTogTWF0aC5zaW4oZW5kQW5nbGUpfTtcblx0XHRcdFx0dmFyIGNvbnRhaW5zMCA9IChzdGFydEFuZ2xlIDw9IDAgJiYgZW5kQW5nbGUgPj0gMCkgfHwgKHN0YXJ0QW5nbGUgPD0gTWF0aC5QSSAqIDIuMCAmJiBNYXRoLlBJICogMi4wIDw9IGVuZEFuZ2xlKTtcblx0XHRcdFx0dmFyIGNvbnRhaW5zOTAgPSAoc3RhcnRBbmdsZSA8PSBNYXRoLlBJICogMC41ICYmIE1hdGguUEkgKiAwLjUgPD0gZW5kQW5nbGUpIHx8IChzdGFydEFuZ2xlIDw9IE1hdGguUEkgKiAyLjUgJiYgTWF0aC5QSSAqIDIuNSA8PSBlbmRBbmdsZSk7XG5cdFx0XHRcdHZhciBjb250YWluczE4MCA9IChzdGFydEFuZ2xlIDw9IC1NYXRoLlBJICYmIC1NYXRoLlBJIDw9IGVuZEFuZ2xlKSB8fCAoc3RhcnRBbmdsZSA8PSBNYXRoLlBJICYmIE1hdGguUEkgPD0gZW5kQW5nbGUpO1xuXHRcdFx0XHR2YXIgY29udGFpbnMyNzAgPSAoc3RhcnRBbmdsZSA8PSAtTWF0aC5QSSAqIDAuNSAmJiAtTWF0aC5QSSAqIDAuNSA8PSBlbmRBbmdsZSkgfHwgKHN0YXJ0QW5nbGUgPD0gTWF0aC5QSSAqIDEuNSAmJiBNYXRoLlBJICogMS41IDw9IGVuZEFuZ2xlKTtcblx0XHRcdFx0dmFyIGN1dG91dCA9IGN1dG91dFBlcmNlbnRhZ2UgLyAxMDAuMDtcblx0XHRcdFx0dmFyIG1pbiA9IHt4OiBjb250YWluczE4MCA/IC0xIDogTWF0aC5taW4oc3RhcnQueCAqIChzdGFydC54IDwgMCA/IDEgOiBjdXRvdXQpLCBlbmQueCAqIChlbmQueCA8IDAgPyAxIDogY3V0b3V0KSksIHk6IGNvbnRhaW5zMjcwID8gLTEgOiBNYXRoLm1pbihzdGFydC55ICogKHN0YXJ0LnkgPCAwID8gMSA6IGN1dG91dCksIGVuZC55ICogKGVuZC55IDwgMCA/IDEgOiBjdXRvdXQpKX07XG5cdFx0XHRcdHZhciBtYXggPSB7eDogY29udGFpbnMwID8gMSA6IE1hdGgubWF4KHN0YXJ0LnggKiAoc3RhcnQueCA+IDAgPyAxIDogY3V0b3V0KSwgZW5kLnggKiAoZW5kLnggPiAwID8gMSA6IGN1dG91dCkpLCB5OiBjb250YWluczkwID8gMSA6IE1hdGgubWF4KHN0YXJ0LnkgKiAoc3RhcnQueSA+IDAgPyAxIDogY3V0b3V0KSwgZW5kLnkgKiAoZW5kLnkgPiAwID8gMSA6IGN1dG91dCkpfTtcblx0XHRcdFx0dmFyIHNpemUgPSB7d2lkdGg6IChtYXgueCAtIG1pbi54KSAqIDAuNSwgaGVpZ2h0OiAobWF4LnkgLSBtaW4ueSkgKiAwLjV9O1xuXHRcdFx0XHRtaW5TaXplID0gTWF0aC5taW4oYXZhaWxhYmxlV2lkdGggLyBzaXplLndpZHRoLCBhdmFpbGFibGVIZWlnaHQgLyBzaXplLmhlaWdodCk7XG5cdFx0XHRcdG9mZnNldCA9IHt4OiAobWF4LnggKyBtaW4ueCkgKiAtMC41LCB5OiAobWF4LnkgKyBtaW4ueSkgKiAtMC41fTtcblx0XHRcdH1cblxuXHRcdFx0Y2hhcnQuYm9yZGVyV2lkdGggPSBtZS5nZXRNYXhCb3JkZXJXaWR0aChtZXRhLmRhdGEpO1xuXHRcdFx0Y2hhcnQub3V0ZXJSYWRpdXMgPSBNYXRoLm1heCgobWluU2l6ZSAtIGNoYXJ0LmJvcmRlcldpZHRoKSAvIDIsIDApO1xuXHRcdFx0Y2hhcnQuaW5uZXJSYWRpdXMgPSBNYXRoLm1heChjdXRvdXRQZXJjZW50YWdlID8gKGNoYXJ0Lm91dGVyUmFkaXVzIC8gMTAwKSAqIChjdXRvdXRQZXJjZW50YWdlKSA6IDAsIDApO1xuXHRcdFx0Y2hhcnQucmFkaXVzTGVuZ3RoID0gKGNoYXJ0Lm91dGVyUmFkaXVzIC0gY2hhcnQuaW5uZXJSYWRpdXMpIC8gY2hhcnQuZ2V0VmlzaWJsZURhdGFzZXRDb3VudCgpO1xuXHRcdFx0Y2hhcnQub2Zmc2V0WCA9IG9mZnNldC54ICogY2hhcnQub3V0ZXJSYWRpdXM7XG5cdFx0XHRjaGFydC5vZmZzZXRZID0gb2Zmc2V0LnkgKiBjaGFydC5vdXRlclJhZGl1cztcblxuXHRcdFx0bWV0YS50b3RhbCA9IG1lLmNhbGN1bGF0ZVRvdGFsKCk7XG5cblx0XHRcdG1lLm91dGVyUmFkaXVzID0gY2hhcnQub3V0ZXJSYWRpdXMgLSAoY2hhcnQucmFkaXVzTGVuZ3RoICogbWUuZ2V0UmluZ0luZGV4KG1lLmluZGV4KSk7XG5cdFx0XHRtZS5pbm5lclJhZGl1cyA9IE1hdGgubWF4KG1lLm91dGVyUmFkaXVzIC0gY2hhcnQucmFkaXVzTGVuZ3RoLCAwKTtcblxuXHRcdFx0aGVscGVycy5lYWNoKG1ldGEuZGF0YSwgZnVuY3Rpb24oYXJjLCBpbmRleCkge1xuXHRcdFx0XHRtZS51cGRhdGVFbGVtZW50KGFyYywgaW5kZXgsIHJlc2V0KTtcblx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHR1cGRhdGVFbGVtZW50OiBmdW5jdGlvbihhcmMsIGluZGV4LCByZXNldCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdFx0dmFyIGNoYXJ0QXJlYSA9IGNoYXJ0LmNoYXJ0QXJlYTtcblx0XHRcdHZhciBvcHRzID0gY2hhcnQub3B0aW9ucztcblx0XHRcdHZhciBhbmltYXRpb25PcHRzID0gb3B0cy5hbmltYXRpb247XG5cdFx0XHR2YXIgY2VudGVyWCA9IChjaGFydEFyZWEubGVmdCArIGNoYXJ0QXJlYS5yaWdodCkgLyAyO1xuXHRcdFx0dmFyIGNlbnRlclkgPSAoY2hhcnRBcmVhLnRvcCArIGNoYXJ0QXJlYS5ib3R0b20pIC8gMjtcblx0XHRcdHZhciBzdGFydEFuZ2xlID0gb3B0cy5yb3RhdGlvbjsgLy8gbm9uIHJlc2V0IGNhc2UgaGFuZGxlZCBsYXRlclxuXHRcdFx0dmFyIGVuZEFuZ2xlID0gb3B0cy5yb3RhdGlvbjsgLy8gbm9uIHJlc2V0IGNhc2UgaGFuZGxlZCBsYXRlclxuXHRcdFx0dmFyIGRhdGFzZXQgPSBtZS5nZXREYXRhc2V0KCk7XG5cdFx0XHR2YXIgY2lyY3VtZmVyZW5jZSA9IHJlc2V0ICYmIGFuaW1hdGlvbk9wdHMuYW5pbWF0ZVJvdGF0ZSA/IDAgOiBhcmMuaGlkZGVuID8gMCA6IG1lLmNhbGN1bGF0ZUNpcmN1bWZlcmVuY2UoZGF0YXNldC5kYXRhW2luZGV4XSkgKiAob3B0cy5jaXJjdW1mZXJlbmNlIC8gKDIuMCAqIE1hdGguUEkpKTtcblx0XHRcdHZhciBpbm5lclJhZGl1cyA9IHJlc2V0ICYmIGFuaW1hdGlvbk9wdHMuYW5pbWF0ZVNjYWxlID8gMCA6IG1lLmlubmVyUmFkaXVzO1xuXHRcdFx0dmFyIG91dGVyUmFkaXVzID0gcmVzZXQgJiYgYW5pbWF0aW9uT3B0cy5hbmltYXRlU2NhbGUgPyAwIDogbWUub3V0ZXJSYWRpdXM7XG5cdFx0XHR2YXIgdmFsdWVBdEluZGV4T3JEZWZhdWx0ID0gaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQ7XG5cblx0XHRcdGhlbHBlcnMuZXh0ZW5kKGFyYywge1xuXHRcdFx0XHQvLyBVdGlsaXR5XG5cdFx0XHRcdF9kYXRhc2V0SW5kZXg6IG1lLmluZGV4LFxuXHRcdFx0XHRfaW5kZXg6IGluZGV4LFxuXG5cdFx0XHRcdC8vIERlc2lyZWQgdmlldyBwcm9wZXJ0aWVzXG5cdFx0XHRcdF9tb2RlbDoge1xuXHRcdFx0XHRcdHg6IGNlbnRlclggKyBjaGFydC5vZmZzZXRYLFxuXHRcdFx0XHRcdHk6IGNlbnRlclkgKyBjaGFydC5vZmZzZXRZLFxuXHRcdFx0XHRcdHN0YXJ0QW5nbGU6IHN0YXJ0QW5nbGUsXG5cdFx0XHRcdFx0ZW5kQW5nbGU6IGVuZEFuZ2xlLFxuXHRcdFx0XHRcdGNpcmN1bWZlcmVuY2U6IGNpcmN1bWZlcmVuY2UsXG5cdFx0XHRcdFx0b3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzLFxuXHRcdFx0XHRcdGlubmVyUmFkaXVzOiBpbm5lclJhZGl1cyxcblx0XHRcdFx0XHRsYWJlbDogdmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQubGFiZWwsIGluZGV4LCBjaGFydC5kYXRhLmxhYmVsc1tpbmRleF0pXG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHR2YXIgbW9kZWwgPSBhcmMuX21vZGVsO1xuXG5cdFx0XHQvLyBSZXNldHMgdGhlIHZpc3VhbCBzdHlsZXNcblx0XHRcdHZhciBjdXN0b20gPSBhcmMuY3VzdG9tIHx8IHt9O1xuXHRcdFx0dmFyIHZhbHVlT3JEZWZhdWx0ID0gaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQ7XG5cdFx0XHR2YXIgZWxlbWVudE9wdHMgPSB0aGlzLmNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMuYXJjO1xuXHRcdFx0bW9kZWwuYmFja2dyb3VuZENvbG9yID0gY3VzdG9tLmJhY2tncm91bmRDb2xvciA/IGN1c3RvbS5iYWNrZ3JvdW5kQ29sb3IgOiB2YWx1ZU9yRGVmYXVsdChkYXRhc2V0LmJhY2tncm91bmRDb2xvciwgaW5kZXgsIGVsZW1lbnRPcHRzLmJhY2tncm91bmRDb2xvcik7XG5cdFx0XHRtb2RlbC5ib3JkZXJDb2xvciA9IGN1c3RvbS5ib3JkZXJDb2xvciA/IGN1c3RvbS5ib3JkZXJDb2xvciA6IHZhbHVlT3JEZWZhdWx0KGRhdGFzZXQuYm9yZGVyQ29sb3IsIGluZGV4LCBlbGVtZW50T3B0cy5ib3JkZXJDb2xvcik7XG5cdFx0XHRtb2RlbC5ib3JkZXJXaWR0aCA9IGN1c3RvbS5ib3JkZXJXaWR0aCA/IGN1c3RvbS5ib3JkZXJXaWR0aCA6IHZhbHVlT3JEZWZhdWx0KGRhdGFzZXQuYm9yZGVyV2lkdGgsIGluZGV4LCBlbGVtZW50T3B0cy5ib3JkZXJXaWR0aCk7XG5cblx0XHRcdC8vIFNldCBjb3JyZWN0IGFuZ2xlcyBpZiBub3QgcmVzZXR0aW5nXG5cdFx0XHRpZiAoIXJlc2V0IHx8ICFhbmltYXRpb25PcHRzLmFuaW1hdGVSb3RhdGUpIHtcblx0XHRcdFx0aWYgKGluZGV4ID09PSAwKSB7XG5cdFx0XHRcdFx0bW9kZWwuc3RhcnRBbmdsZSA9IG9wdHMucm90YXRpb247XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bW9kZWwuc3RhcnRBbmdsZSA9IG1lLmdldE1ldGEoKS5kYXRhW2luZGV4IC0gMV0uX21vZGVsLmVuZEFuZ2xlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bW9kZWwuZW5kQW5nbGUgPSBtb2RlbC5zdGFydEFuZ2xlICsgbW9kZWwuY2lyY3VtZmVyZW5jZTtcblx0XHRcdH1cblxuXHRcdFx0YXJjLnBpdm90KCk7XG5cdFx0fSxcblxuXHRcdGNhbGN1bGF0ZVRvdGFsOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBkYXRhc2V0ID0gdGhpcy5nZXREYXRhc2V0KCk7XG5cdFx0XHR2YXIgbWV0YSA9IHRoaXMuZ2V0TWV0YSgpO1xuXHRcdFx0dmFyIHRvdGFsID0gMDtcblx0XHRcdHZhciB2YWx1ZTtcblxuXHRcdFx0aGVscGVycy5lYWNoKG1ldGEuZGF0YSwgZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgpIHtcblx0XHRcdFx0dmFsdWUgPSBkYXRhc2V0LmRhdGFbaW5kZXhdO1xuXHRcdFx0XHRpZiAoIWlzTmFOKHZhbHVlKSAmJiAhZWxlbWVudC5oaWRkZW4pIHtcblx0XHRcdFx0XHR0b3RhbCArPSBNYXRoLmFicyh2YWx1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHQvKiBpZiAodG90YWwgPT09IDApIHtcblx0XHRcdFx0dG90YWwgPSBOYU47XG5cdFx0XHR9Ki9cblxuXHRcdFx0cmV0dXJuIHRvdGFsO1xuXHRcdH0sXG5cblx0XHRjYWxjdWxhdGVDaXJjdW1mZXJlbmNlOiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0dmFyIHRvdGFsID0gdGhpcy5nZXRNZXRhKCkudG90YWw7XG5cdFx0XHRpZiAodG90YWwgPiAwICYmICFpc05hTih2YWx1ZSkpIHtcblx0XHRcdFx0cmV0dXJuIChNYXRoLlBJICogMi4wKSAqIChNYXRoLmFicyh2YWx1ZSkgLyB0b3RhbCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9LFxuXG5cdFx0Ly8gZ2V0cyB0aGUgbWF4IGJvcmRlciBvciBob3ZlciB3aWR0aCB0byBwcm9wZXJseSBzY2FsZSBwaWUgY2hhcnRzXG5cdFx0Z2V0TWF4Qm9yZGVyV2lkdGg6IGZ1bmN0aW9uKGFyY3MpIHtcblx0XHRcdHZhciBtYXggPSAwO1xuXHRcdFx0dmFyIGluZGV4ID0gdGhpcy5pbmRleDtcblx0XHRcdHZhciBsZW5ndGggPSBhcmNzLmxlbmd0aDtcblx0XHRcdHZhciBib3JkZXJXaWR0aDtcblx0XHRcdHZhciBob3ZlcldpZHRoO1xuXG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGJvcmRlcldpZHRoID0gYXJjc1tpXS5fbW9kZWwgPyBhcmNzW2ldLl9tb2RlbC5ib3JkZXJXaWR0aCA6IDA7XG5cdFx0XHRcdGhvdmVyV2lkdGggPSBhcmNzW2ldLl9jaGFydCA/IGFyY3NbaV0uX2NoYXJ0LmNvbmZpZy5kYXRhLmRhdGFzZXRzW2luZGV4XS5ob3ZlckJvcmRlcldpZHRoIDogMDtcblxuXHRcdFx0XHRtYXggPSBib3JkZXJXaWR0aCA+IG1heCA/IGJvcmRlcldpZHRoIDogbWF4O1xuXHRcdFx0XHRtYXggPSBob3ZlcldpZHRoID4gbWF4ID8gaG92ZXJXaWR0aCA6IG1heDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXg7XG5cdFx0fVxuXHR9KTtcbn07XG5cbn0se1wiMjZcIjoyNixcIjQxXCI6NDEsXCI0NlwiOjQ2fV0sMTg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcbnZhciBlbGVtZW50cyA9IHJlcXVpcmUoNDEpO1xudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcblxuZGVmYXVsdHMuX3NldCgnbGluZScsIHtcblx0c2hvd0xpbmVzOiB0cnVlLFxuXHRzcGFuR2FwczogZmFsc2UsXG5cblx0aG92ZXI6IHtcblx0XHRtb2RlOiAnbGFiZWwnXG5cdH0sXG5cblx0c2NhbGVzOiB7XG5cdFx0eEF4ZXM6IFt7XG5cdFx0XHR0eXBlOiAnY2F0ZWdvcnknLFxuXHRcdFx0aWQ6ICd4LWF4aXMtMCdcblx0XHR9XSxcblx0XHR5QXhlczogW3tcblx0XHRcdHR5cGU6ICdsaW5lYXInLFxuXHRcdFx0aWQ6ICd5LWF4aXMtMCdcblx0XHR9XVxuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDaGFydCkge1xuXG5cdGZ1bmN0aW9uIGxpbmVFbmFibGVkKGRhdGFzZXQsIG9wdGlvbnMpIHtcblx0XHRyZXR1cm4gaGVscGVycy52YWx1ZU9yRGVmYXVsdChkYXRhc2V0LnNob3dMaW5lLCBvcHRpb25zLnNob3dMaW5lcyk7XG5cdH1cblxuXHRDaGFydC5jb250cm9sbGVycy5saW5lID0gQ2hhcnQuRGF0YXNldENvbnRyb2xsZXIuZXh0ZW5kKHtcblxuXHRcdGRhdGFzZXRFbGVtZW50VHlwZTogZWxlbWVudHMuTGluZSxcblxuXHRcdGRhdGFFbGVtZW50VHlwZTogZWxlbWVudHMuUG9pbnQsXG5cblx0XHR1cGRhdGU6IGZ1bmN0aW9uKHJlc2V0KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG1ldGEgPSBtZS5nZXRNZXRhKCk7XG5cdFx0XHR2YXIgbGluZSA9IG1ldGEuZGF0YXNldDtcblx0XHRcdHZhciBwb2ludHMgPSBtZXRhLmRhdGEgfHwgW107XG5cdFx0XHR2YXIgb3B0aW9ucyA9IG1lLmNoYXJ0Lm9wdGlvbnM7XG5cdFx0XHR2YXIgbGluZUVsZW1lbnRPcHRpb25zID0gb3B0aW9ucy5lbGVtZW50cy5saW5lO1xuXHRcdFx0dmFyIHNjYWxlID0gbWUuZ2V0U2NhbGVGb3JJZChtZXRhLnlBeGlzSUQpO1xuXHRcdFx0dmFyIGksIGlsZW4sIGN1c3RvbTtcblx0XHRcdHZhciBkYXRhc2V0ID0gbWUuZ2V0RGF0YXNldCgpO1xuXHRcdFx0dmFyIHNob3dMaW5lID0gbGluZUVuYWJsZWQoZGF0YXNldCwgb3B0aW9ucyk7XG5cblx0XHRcdC8vIFVwZGF0ZSBMaW5lXG5cdFx0XHRpZiAoc2hvd0xpbmUpIHtcblx0XHRcdFx0Y3VzdG9tID0gbGluZS5jdXN0b20gfHwge307XG5cblx0XHRcdFx0Ly8gQ29tcGF0aWJpbGl0eTogSWYgdGhlIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgd2l0aCBvbmx5IHRoZSBvbGQgbmFtZSwgdXNlIHRob3NlIHZhbHVlc1xuXHRcdFx0XHRpZiAoKGRhdGFzZXQudGVuc2lvbiAhPT0gdW5kZWZpbmVkKSAmJiAoZGF0YXNldC5saW5lVGVuc2lvbiA9PT0gdW5kZWZpbmVkKSkge1xuXHRcdFx0XHRcdGRhdGFzZXQubGluZVRlbnNpb24gPSBkYXRhc2V0LnRlbnNpb247XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBVdGlsaXR5XG5cdFx0XHRcdGxpbmUuX3NjYWxlID0gc2NhbGU7XG5cdFx0XHRcdGxpbmUuX2RhdGFzZXRJbmRleCA9IG1lLmluZGV4O1xuXHRcdFx0XHQvLyBEYXRhXG5cdFx0XHRcdGxpbmUuX2NoaWxkcmVuID0gcG9pbnRzO1xuXHRcdFx0XHQvLyBNb2RlbFxuXHRcdFx0XHRsaW5lLl9tb2RlbCA9IHtcblx0XHRcdFx0XHQvLyBBcHBlYXJhbmNlXG5cdFx0XHRcdFx0Ly8gVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgbGluZXMgaXMgdG8gYnJlYWsgYXQgbnVsbCB2YWx1ZXMsIGFjY29yZGluZ1xuXHRcdFx0XHRcdC8vIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy8yNDM1I2lzc3VlY29tbWVudC0yMTY3MTgxNThcblx0XHRcdFx0XHQvLyBUaGlzIG9wdGlvbiBnaXZlcyBsaW5lcyB0aGUgYWJpbGl0eSB0byBzcGFuIGdhcHNcblx0XHRcdFx0XHRzcGFuR2FwczogZGF0YXNldC5zcGFuR2FwcyA/IGRhdGFzZXQuc3BhbkdhcHMgOiBvcHRpb25zLnNwYW5HYXBzLFxuXHRcdFx0XHRcdHRlbnNpb246IGN1c3RvbS50ZW5zaW9uID8gY3VzdG9tLnRlbnNpb24gOiBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KGRhdGFzZXQubGluZVRlbnNpb24sIGxpbmVFbGVtZW50T3B0aW9ucy50ZW5zaW9uKSxcblx0XHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IGN1c3RvbS5iYWNrZ3JvdW5kQ29sb3IgPyBjdXN0b20uYmFja2dyb3VuZENvbG9yIDogKGRhdGFzZXQuYmFja2dyb3VuZENvbG9yIHx8IGxpbmVFbGVtZW50T3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IpLFxuXHRcdFx0XHRcdGJvcmRlcldpZHRoOiBjdXN0b20uYm9yZGVyV2lkdGggPyBjdXN0b20uYm9yZGVyV2lkdGggOiAoZGF0YXNldC5ib3JkZXJXaWR0aCB8fCBsaW5lRWxlbWVudE9wdGlvbnMuYm9yZGVyV2lkdGgpLFxuXHRcdFx0XHRcdGJvcmRlckNvbG9yOiBjdXN0b20uYm9yZGVyQ29sb3IgPyBjdXN0b20uYm9yZGVyQ29sb3IgOiAoZGF0YXNldC5ib3JkZXJDb2xvciB8fCBsaW5lRWxlbWVudE9wdGlvbnMuYm9yZGVyQ29sb3IpLFxuXHRcdFx0XHRcdGJvcmRlckNhcFN0eWxlOiBjdXN0b20uYm9yZGVyQ2FwU3R5bGUgPyBjdXN0b20uYm9yZGVyQ2FwU3R5bGUgOiAoZGF0YXNldC5ib3JkZXJDYXBTdHlsZSB8fCBsaW5lRWxlbWVudE9wdGlvbnMuYm9yZGVyQ2FwU3R5bGUpLFxuXHRcdFx0XHRcdGJvcmRlckRhc2g6IGN1c3RvbS5ib3JkZXJEYXNoID8gY3VzdG9tLmJvcmRlckRhc2ggOiAoZGF0YXNldC5ib3JkZXJEYXNoIHx8IGxpbmVFbGVtZW50T3B0aW9ucy5ib3JkZXJEYXNoKSxcblx0XHRcdFx0XHRib3JkZXJEYXNoT2Zmc2V0OiBjdXN0b20uYm9yZGVyRGFzaE9mZnNldCA/IGN1c3RvbS5ib3JkZXJEYXNoT2Zmc2V0IDogKGRhdGFzZXQuYm9yZGVyRGFzaE9mZnNldCB8fCBsaW5lRWxlbWVudE9wdGlvbnMuYm9yZGVyRGFzaE9mZnNldCksXG5cdFx0XHRcdFx0Ym9yZGVySm9pblN0eWxlOiBjdXN0b20uYm9yZGVySm9pblN0eWxlID8gY3VzdG9tLmJvcmRlckpvaW5TdHlsZSA6IChkYXRhc2V0LmJvcmRlckpvaW5TdHlsZSB8fCBsaW5lRWxlbWVudE9wdGlvbnMuYm9yZGVySm9pblN0eWxlKSxcblx0XHRcdFx0XHRmaWxsOiBjdXN0b20uZmlsbCA/IGN1c3RvbS5maWxsIDogKGRhdGFzZXQuZmlsbCAhPT0gdW5kZWZpbmVkID8gZGF0YXNldC5maWxsIDogbGluZUVsZW1lbnRPcHRpb25zLmZpbGwpLFxuXHRcdFx0XHRcdHN0ZXBwZWRMaW5lOiBjdXN0b20uc3RlcHBlZExpbmUgPyBjdXN0b20uc3RlcHBlZExpbmUgOiBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KGRhdGFzZXQuc3RlcHBlZExpbmUsIGxpbmVFbGVtZW50T3B0aW9ucy5zdGVwcGVkKSxcblx0XHRcdFx0XHRjdWJpY0ludGVycG9sYXRpb25Nb2RlOiBjdXN0b20uY3ViaWNJbnRlcnBvbGF0aW9uTW9kZSA/IGN1c3RvbS5jdWJpY0ludGVycG9sYXRpb25Nb2RlIDogaGVscGVycy52YWx1ZU9yRGVmYXVsdChkYXRhc2V0LmN1YmljSW50ZXJwb2xhdGlvbk1vZGUsIGxpbmVFbGVtZW50T3B0aW9ucy5jdWJpY0ludGVycG9sYXRpb25Nb2RlKSxcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRsaW5lLnBpdm90KCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFVwZGF0ZSBQb2ludHNcblx0XHRcdGZvciAoaSA9IDAsIGlsZW4gPSBwb2ludHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRcdG1lLnVwZGF0ZUVsZW1lbnQocG9pbnRzW2ldLCBpLCByZXNldCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzaG93TGluZSAmJiBsaW5lLl9tb2RlbC50ZW5zaW9uICE9PSAwKSB7XG5cdFx0XHRcdG1lLnVwZGF0ZUJlemllckNvbnRyb2xQb2ludHMoKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTm93IHBpdm90IHRoZSBwb2ludCBmb3IgYW5pbWF0aW9uXG5cdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0XHRwb2ludHNbaV0ucGl2b3QoKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Z2V0UG9pbnRCYWNrZ3JvdW5kQ29sb3I6IGZ1bmN0aW9uKHBvaW50LCBpbmRleCkge1xuXHRcdFx0dmFyIGJhY2tncm91bmRDb2xvciA9IHRoaXMuY2hhcnQub3B0aW9ucy5lbGVtZW50cy5wb2ludC5iYWNrZ3JvdW5kQ29sb3I7XG5cdFx0XHR2YXIgZGF0YXNldCA9IHRoaXMuZ2V0RGF0YXNldCgpO1xuXHRcdFx0dmFyIGN1c3RvbSA9IHBvaW50LmN1c3RvbSB8fCB7fTtcblxuXHRcdFx0aWYgKGN1c3RvbS5iYWNrZ3JvdW5kQ29sb3IpIHtcblx0XHRcdFx0YmFja2dyb3VuZENvbG9yID0gY3VzdG9tLmJhY2tncm91bmRDb2xvcjtcblx0XHRcdH0gZWxzZSBpZiAoZGF0YXNldC5wb2ludEJhY2tncm91bmRDb2xvcikge1xuXHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3IgPSBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LnBvaW50QmFja2dyb3VuZENvbG9yLCBpbmRleCwgYmFja2dyb3VuZENvbG9yKTtcblx0XHRcdH0gZWxzZSBpZiAoZGF0YXNldC5iYWNrZ3JvdW5kQ29sb3IpIHtcblx0XHRcdFx0YmFja2dyb3VuZENvbG9yID0gZGF0YXNldC5iYWNrZ3JvdW5kQ29sb3I7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBiYWNrZ3JvdW5kQ29sb3I7XG5cdFx0fSxcblxuXHRcdGdldFBvaW50Qm9yZGVyQ29sb3I6IGZ1bmN0aW9uKHBvaW50LCBpbmRleCkge1xuXHRcdFx0dmFyIGJvcmRlckNvbG9yID0gdGhpcy5jaGFydC5vcHRpb25zLmVsZW1lbnRzLnBvaW50LmJvcmRlckNvbG9yO1xuXHRcdFx0dmFyIGRhdGFzZXQgPSB0aGlzLmdldERhdGFzZXQoKTtcblx0XHRcdHZhciBjdXN0b20gPSBwb2ludC5jdXN0b20gfHwge307XG5cblx0XHRcdGlmIChjdXN0b20uYm9yZGVyQ29sb3IpIHtcblx0XHRcdFx0Ym9yZGVyQ29sb3IgPSBjdXN0b20uYm9yZGVyQ29sb3I7XG5cdFx0XHR9IGVsc2UgaWYgKGRhdGFzZXQucG9pbnRCb3JkZXJDb2xvcikge1xuXHRcdFx0XHRib3JkZXJDb2xvciA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRCb3JkZXJDb2xvciwgaW5kZXgsIGJvcmRlckNvbG9yKTtcblx0XHRcdH0gZWxzZSBpZiAoZGF0YXNldC5ib3JkZXJDb2xvcikge1xuXHRcdFx0XHRib3JkZXJDb2xvciA9IGRhdGFzZXQuYm9yZGVyQ29sb3I7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBib3JkZXJDb2xvcjtcblx0XHR9LFxuXG5cdFx0Z2V0UG9pbnRCb3JkZXJXaWR0aDogZnVuY3Rpb24ocG9pbnQsIGluZGV4KSB7XG5cdFx0XHR2YXIgYm9yZGVyV2lkdGggPSB0aGlzLmNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMucG9pbnQuYm9yZGVyV2lkdGg7XG5cdFx0XHR2YXIgZGF0YXNldCA9IHRoaXMuZ2V0RGF0YXNldCgpO1xuXHRcdFx0dmFyIGN1c3RvbSA9IHBvaW50LmN1c3RvbSB8fCB7fTtcblxuXHRcdFx0aWYgKCFpc05hTihjdXN0b20uYm9yZGVyV2lkdGgpKSB7XG5cdFx0XHRcdGJvcmRlcldpZHRoID0gY3VzdG9tLmJvcmRlcldpZHRoO1xuXHRcdFx0fSBlbHNlIGlmICghaXNOYU4oZGF0YXNldC5wb2ludEJvcmRlcldpZHRoKSB8fCBoZWxwZXJzLmlzQXJyYXkoZGF0YXNldC5wb2ludEJvcmRlcldpZHRoKSkge1xuXHRcdFx0XHRib3JkZXJXaWR0aCA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRCb3JkZXJXaWR0aCwgaW5kZXgsIGJvcmRlcldpZHRoKTtcblx0XHRcdH0gZWxzZSBpZiAoIWlzTmFOKGRhdGFzZXQuYm9yZGVyV2lkdGgpKSB7XG5cdFx0XHRcdGJvcmRlcldpZHRoID0gZGF0YXNldC5ib3JkZXJXaWR0aDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGJvcmRlcldpZHRoO1xuXHRcdH0sXG5cblx0XHRnZXRQb2ludFJvdGF0aW9uOiBmdW5jdGlvbihwb2ludCwgaW5kZXgpIHtcblx0XHRcdHZhciBwb2ludFJvdGF0aW9uID0gdGhpcy5jaGFydC5vcHRpb25zLmVsZW1lbnRzLnBvaW50LnJvdGF0aW9uO1xuXHRcdFx0dmFyIGRhdGFzZXQgPSB0aGlzLmdldERhdGFzZXQoKTtcblx0XHRcdHZhciBjdXN0b20gPSBwb2ludC5jdXN0b20gfHwge307XG5cblx0XHRcdGlmICghaXNOYU4oY3VzdG9tLnJvdGF0aW9uKSkge1xuXHRcdFx0XHRwb2ludFJvdGF0aW9uID0gY3VzdG9tLnJvdGF0aW9uO1xuXHRcdFx0fSBlbHNlIGlmICghaXNOYU4oZGF0YXNldC5wb2ludFJvdGF0aW9uKSB8fCBoZWxwZXJzLmlzQXJyYXkoZGF0YXNldC5wb2ludFJvdGF0aW9uKSkge1xuXHRcdFx0XHRwb2ludFJvdGF0aW9uID0gaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludFJvdGF0aW9uLCBpbmRleCwgcG9pbnRSb3RhdGlvbik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcG9pbnRSb3RhdGlvbjtcblx0XHR9LFxuXG5cdFx0dXBkYXRlRWxlbWVudDogZnVuY3Rpb24ocG9pbnQsIGluZGV4LCByZXNldCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xuXHRcdFx0dmFyIGN1c3RvbSA9IHBvaW50LmN1c3RvbSB8fCB7fTtcblx0XHRcdHZhciBkYXRhc2V0ID0gbWUuZ2V0RGF0YXNldCgpO1xuXHRcdFx0dmFyIGRhdGFzZXRJbmRleCA9IG1lLmluZGV4O1xuXHRcdFx0dmFyIHZhbHVlID0gZGF0YXNldC5kYXRhW2luZGV4XTtcblx0XHRcdHZhciB5U2NhbGUgPSBtZS5nZXRTY2FsZUZvcklkKG1ldGEueUF4aXNJRCk7XG5cdFx0XHR2YXIgeFNjYWxlID0gbWUuZ2V0U2NhbGVGb3JJZChtZXRhLnhBeGlzSUQpO1xuXHRcdFx0dmFyIHBvaW50T3B0aW9ucyA9IG1lLmNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMucG9pbnQ7XG5cdFx0XHR2YXIgeCwgeTtcblxuXHRcdFx0Ly8gQ29tcGF0aWJpbGl0eTogSWYgdGhlIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgd2l0aCBvbmx5IHRoZSBvbGQgbmFtZSwgdXNlIHRob3NlIHZhbHVlc1xuXHRcdFx0aWYgKChkYXRhc2V0LnJhZGl1cyAhPT0gdW5kZWZpbmVkKSAmJiAoZGF0YXNldC5wb2ludFJhZGl1cyA9PT0gdW5kZWZpbmVkKSkge1xuXHRcdFx0XHRkYXRhc2V0LnBvaW50UmFkaXVzID0gZGF0YXNldC5yYWRpdXM7XG5cdFx0XHR9XG5cdFx0XHRpZiAoKGRhdGFzZXQuaGl0UmFkaXVzICE9PSB1bmRlZmluZWQpICYmIChkYXRhc2V0LnBvaW50SGl0UmFkaXVzID09PSB1bmRlZmluZWQpKSB7XG5cdFx0XHRcdGRhdGFzZXQucG9pbnRIaXRSYWRpdXMgPSBkYXRhc2V0LmhpdFJhZGl1cztcblx0XHRcdH1cblxuXHRcdFx0eCA9IHhTY2FsZS5nZXRQaXhlbEZvclZhbHVlKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyB2YWx1ZSA6IE5hTiwgaW5kZXgsIGRhdGFzZXRJbmRleCk7XG5cdFx0XHR5ID0gcmVzZXQgPyB5U2NhbGUuZ2V0QmFzZVBpeGVsKCkgOiBtZS5jYWxjdWxhdGVQb2ludFkodmFsdWUsIGluZGV4LCBkYXRhc2V0SW5kZXgpO1xuXG5cdFx0XHQvLyBVdGlsaXR5XG5cdFx0XHRwb2ludC5feFNjYWxlID0geFNjYWxlO1xuXHRcdFx0cG9pbnQuX3lTY2FsZSA9IHlTY2FsZTtcblx0XHRcdHBvaW50Ll9kYXRhc2V0SW5kZXggPSBkYXRhc2V0SW5kZXg7XG5cdFx0XHRwb2ludC5faW5kZXggPSBpbmRleDtcblxuXHRcdFx0Ly8gRGVzaXJlZCB2aWV3IHByb3BlcnRpZXNcblx0XHRcdHBvaW50Ll9tb2RlbCA9IHtcblx0XHRcdFx0eDogeCxcblx0XHRcdFx0eTogeSxcblx0XHRcdFx0c2tpcDogY3VzdG9tLnNraXAgfHwgaXNOYU4oeCkgfHwgaXNOYU4oeSksXG5cdFx0XHRcdC8vIEFwcGVhcmFuY2Vcblx0XHRcdFx0cmFkaXVzOiBjdXN0b20ucmFkaXVzIHx8IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRSYWRpdXMsIGluZGV4LCBwb2ludE9wdGlvbnMucmFkaXVzKSxcblx0XHRcdFx0cG9pbnRTdHlsZTogY3VzdG9tLnBvaW50U3R5bGUgfHwgaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludFN0eWxlLCBpbmRleCwgcG9pbnRPcHRpb25zLnBvaW50U3R5bGUpLFxuXHRcdFx0XHRyb3RhdGlvbjogbWUuZ2V0UG9pbnRSb3RhdGlvbihwb2ludCwgaW5kZXgpLFxuXHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IG1lLmdldFBvaW50QmFja2dyb3VuZENvbG9yKHBvaW50LCBpbmRleCksXG5cdFx0XHRcdGJvcmRlckNvbG9yOiBtZS5nZXRQb2ludEJvcmRlckNvbG9yKHBvaW50LCBpbmRleCksXG5cdFx0XHRcdGJvcmRlcldpZHRoOiBtZS5nZXRQb2ludEJvcmRlcldpZHRoKHBvaW50LCBpbmRleCksXG5cdFx0XHRcdHRlbnNpb246IG1ldGEuZGF0YXNldC5fbW9kZWwgPyBtZXRhLmRhdGFzZXQuX21vZGVsLnRlbnNpb24gOiAwLFxuXHRcdFx0XHRzdGVwcGVkTGluZTogbWV0YS5kYXRhc2V0Ll9tb2RlbCA/IG1ldGEuZGF0YXNldC5fbW9kZWwuc3RlcHBlZExpbmUgOiBmYWxzZSxcblx0XHRcdFx0Ly8gVG9vbHRpcFxuXHRcdFx0XHRoaXRSYWRpdXM6IGN1c3RvbS5oaXRSYWRpdXMgfHwgaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludEhpdFJhZGl1cywgaW5kZXgsIHBvaW50T3B0aW9ucy5oaXRSYWRpdXMpXG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRjYWxjdWxhdGVQb2ludFk6IGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgZGF0YXNldEluZGV4KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XG5cdFx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcblx0XHRcdHZhciB5U2NhbGUgPSBtZS5nZXRTY2FsZUZvcklkKG1ldGEueUF4aXNJRCk7XG5cdFx0XHR2YXIgc3VtUG9zID0gMDtcblx0XHRcdHZhciBzdW1OZWcgPSAwO1xuXHRcdFx0dmFyIGksIGRzLCBkc01ldGE7XG5cblx0XHRcdGlmICh5U2NhbGUub3B0aW9ucy5zdGFja2VkKSB7XG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhc2V0SW5kZXg7IGkrKykge1xuXHRcdFx0XHRcdGRzID0gY2hhcnQuZGF0YS5kYXRhc2V0c1tpXTtcblx0XHRcdFx0XHRkc01ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShpKTtcblx0XHRcdFx0XHRpZiAoZHNNZXRhLnR5cGUgPT09ICdsaW5lJyAmJiBkc01ldGEueUF4aXNJRCA9PT0geVNjYWxlLmlkICYmIGNoYXJ0LmlzRGF0YXNldFZpc2libGUoaSkpIHtcblx0XHRcdFx0XHRcdHZhciBzdGFja2VkUmlnaHRWYWx1ZSA9IE51bWJlcih5U2NhbGUuZ2V0UmlnaHRWYWx1ZShkcy5kYXRhW2luZGV4XSkpO1xuXHRcdFx0XHRcdFx0aWYgKHN0YWNrZWRSaWdodFZhbHVlIDwgMCkge1xuXHRcdFx0XHRcdFx0XHRzdW1OZWcgKz0gc3RhY2tlZFJpZ2h0VmFsdWUgfHwgMDtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHN1bVBvcyArPSBzdGFja2VkUmlnaHRWYWx1ZSB8fCAwO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciByaWdodFZhbHVlID0gTnVtYmVyKHlTY2FsZS5nZXRSaWdodFZhbHVlKHZhbHVlKSk7XG5cdFx0XHRcdGlmIChyaWdodFZhbHVlIDwgMCkge1xuXHRcdFx0XHRcdHJldHVybiB5U2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShzdW1OZWcgKyByaWdodFZhbHVlKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4geVNjYWxlLmdldFBpeGVsRm9yVmFsdWUoc3VtUG9zICsgcmlnaHRWYWx1ZSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB5U2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZSh2YWx1ZSk7XG5cdFx0fSxcblxuXHRcdHVwZGF0ZUJlemllckNvbnRyb2xQb2ludHM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xuXHRcdFx0dmFyIGFyZWEgPSBtZS5jaGFydC5jaGFydEFyZWE7XG5cdFx0XHR2YXIgcG9pbnRzID0gKG1ldGEuZGF0YSB8fCBbXSk7XG5cdFx0XHR2YXIgaSwgaWxlbiwgcG9pbnQsIG1vZGVsLCBjb250cm9sUG9pbnRzO1xuXG5cdFx0XHQvLyBPbmx5IGNvbnNpZGVyIHBvaW50cyB0aGF0IGFyZSBkcmF3biBpbiBjYXNlIHRoZSBzcGFuR2FwcyBvcHRpb24gaXMgdXNlZFxuXHRcdFx0aWYgKG1ldGEuZGF0YXNldC5fbW9kZWwuc3BhbkdhcHMpIHtcblx0XHRcdFx0cG9pbnRzID0gcG9pbnRzLmZpbHRlcihmdW5jdGlvbihwdCkge1xuXHRcdFx0XHRcdHJldHVybiAhcHQuX21vZGVsLnNraXA7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBjYXBDb250cm9sUG9pbnQocHQsIG1pbiwgbWF4KSB7XG5cdFx0XHRcdHJldHVybiBNYXRoLm1heChNYXRoLm1pbihwdCwgbWF4KSwgbWluKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG1ldGEuZGF0YXNldC5fbW9kZWwuY3ViaWNJbnRlcnBvbGF0aW9uTW9kZSA9PT0gJ21vbm90b25lJykge1xuXHRcdFx0XHRoZWxwZXJzLnNwbGluZUN1cnZlTW9ub3RvbmUocG9pbnRzKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoaSA9IDAsIGlsZW4gPSBwb2ludHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRcdFx0cG9pbnQgPSBwb2ludHNbaV07XG5cdFx0XHRcdFx0bW9kZWwgPSBwb2ludC5fbW9kZWw7XG5cdFx0XHRcdFx0Y29udHJvbFBvaW50cyA9IGhlbHBlcnMuc3BsaW5lQ3VydmUoXG5cdFx0XHRcdFx0XHRoZWxwZXJzLnByZXZpb3VzSXRlbShwb2ludHMsIGkpLl9tb2RlbCxcblx0XHRcdFx0XHRcdG1vZGVsLFxuXHRcdFx0XHRcdFx0aGVscGVycy5uZXh0SXRlbShwb2ludHMsIGkpLl9tb2RlbCxcblx0XHRcdFx0XHRcdG1ldGEuZGF0YXNldC5fbW9kZWwudGVuc2lvblxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0bW9kZWwuY29udHJvbFBvaW50UHJldmlvdXNYID0gY29udHJvbFBvaW50cy5wcmV2aW91cy54O1xuXHRcdFx0XHRcdG1vZGVsLmNvbnRyb2xQb2ludFByZXZpb3VzWSA9IGNvbnRyb2xQb2ludHMucHJldmlvdXMueTtcblx0XHRcdFx0XHRtb2RlbC5jb250cm9sUG9pbnROZXh0WCA9IGNvbnRyb2xQb2ludHMubmV4dC54O1xuXHRcdFx0XHRcdG1vZGVsLmNvbnRyb2xQb2ludE5leHRZID0gY29udHJvbFBvaW50cy5uZXh0Lnk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKG1lLmNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMubGluZS5jYXBCZXppZXJQb2ludHMpIHtcblx0XHRcdFx0Zm9yIChpID0gMCwgaWxlbiA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdFx0XHRtb2RlbCA9IHBvaW50c1tpXS5fbW9kZWw7XG5cdFx0XHRcdFx0bW9kZWwuY29udHJvbFBvaW50UHJldmlvdXNYID0gY2FwQ29udHJvbFBvaW50KG1vZGVsLmNvbnRyb2xQb2ludFByZXZpb3VzWCwgYXJlYS5sZWZ0LCBhcmVhLnJpZ2h0KTtcblx0XHRcdFx0XHRtb2RlbC5jb250cm9sUG9pbnRQcmV2aW91c1kgPSBjYXBDb250cm9sUG9pbnQobW9kZWwuY29udHJvbFBvaW50UHJldmlvdXNZLCBhcmVhLnRvcCwgYXJlYS5ib3R0b20pO1xuXHRcdFx0XHRcdG1vZGVsLmNvbnRyb2xQb2ludE5leHRYID0gY2FwQ29udHJvbFBvaW50KG1vZGVsLmNvbnRyb2xQb2ludE5leHRYLCBhcmVhLmxlZnQsIGFyZWEucmlnaHQpO1xuXHRcdFx0XHRcdG1vZGVsLmNvbnRyb2xQb2ludE5leHRZID0gY2FwQ29udHJvbFBvaW50KG1vZGVsLmNvbnRyb2xQb2ludE5leHRZLCBhcmVhLnRvcCwgYXJlYS5ib3R0b20pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGRyYXc6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdFx0dmFyIG1ldGEgPSBtZS5nZXRNZXRhKCk7XG5cdFx0XHR2YXIgcG9pbnRzID0gbWV0YS5kYXRhIHx8IFtdO1xuXHRcdFx0dmFyIGFyZWEgPSBjaGFydC5jaGFydEFyZWE7XG5cdFx0XHR2YXIgaWxlbiA9IHBvaW50cy5sZW5ndGg7XG5cdFx0XHR2YXIgaGFsZkJvcmRlcldpZHRoO1xuXHRcdFx0dmFyIGkgPSAwO1xuXG5cdFx0XHRpZiAobGluZUVuYWJsZWQobWUuZ2V0RGF0YXNldCgpLCBjaGFydC5vcHRpb25zKSkge1xuXHRcdFx0XHRoYWxmQm9yZGVyV2lkdGggPSAobWV0YS5kYXRhc2V0Ll9tb2RlbC5ib3JkZXJXaWR0aCB8fCAwKSAvIDI7XG5cblx0XHRcdFx0aGVscGVycy5jYW52YXMuY2xpcEFyZWEoY2hhcnQuY3R4LCB7XG5cdFx0XHRcdFx0bGVmdDogYXJlYS5sZWZ0LFxuXHRcdFx0XHRcdHJpZ2h0OiBhcmVhLnJpZ2h0LFxuXHRcdFx0XHRcdHRvcDogYXJlYS50b3AgLSBoYWxmQm9yZGVyV2lkdGgsXG5cdFx0XHRcdFx0Ym90dG9tOiBhcmVhLmJvdHRvbSArIGhhbGZCb3JkZXJXaWR0aFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRtZXRhLmRhdGFzZXQuZHJhdygpO1xuXG5cdFx0XHRcdGhlbHBlcnMuY2FudmFzLnVuY2xpcEFyZWEoY2hhcnQuY3R4KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRHJhdyB0aGUgcG9pbnRzXG5cdFx0XHRmb3IgKDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0XHRwb2ludHNbaV0uZHJhdyhhcmVhKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0c2V0SG92ZXJTdHlsZTogZnVuY3Rpb24oZWxlbWVudCkge1xuXHRcdFx0Ly8gUG9pbnRcblx0XHRcdHZhciBkYXRhc2V0ID0gdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzW2VsZW1lbnQuX2RhdGFzZXRJbmRleF07XG5cdFx0XHR2YXIgaW5kZXggPSBlbGVtZW50Ll9pbmRleDtcblx0XHRcdHZhciBjdXN0b20gPSBlbGVtZW50LmN1c3RvbSB8fCB7fTtcblx0XHRcdHZhciBtb2RlbCA9IGVsZW1lbnQuX21vZGVsO1xuXG5cdFx0XHRlbGVtZW50LiRwcmV2aW91c1N0eWxlID0ge1xuXHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcblx0XHRcdFx0Ym9yZGVyQ29sb3I6IG1vZGVsLmJvcmRlckNvbG9yLFxuXHRcdFx0XHRib3JkZXJXaWR0aDogbW9kZWwuYm9yZGVyV2lkdGgsXG5cdFx0XHRcdHJhZGl1czogbW9kZWwucmFkaXVzXG5cdFx0XHR9O1xuXG5cdFx0XHRtb2RlbC5iYWNrZ3JvdW5kQ29sb3IgPSBjdXN0b20uaG92ZXJCYWNrZ3JvdW5kQ29sb3IgfHwgaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludEhvdmVyQmFja2dyb3VuZENvbG9yLCBpbmRleCwgaGVscGVycy5nZXRIb3ZlckNvbG9yKG1vZGVsLmJhY2tncm91bmRDb2xvcikpO1xuXHRcdFx0bW9kZWwuYm9yZGVyQ29sb3IgPSBjdXN0b20uaG92ZXJCb3JkZXJDb2xvciB8fCBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LnBvaW50SG92ZXJCb3JkZXJDb2xvciwgaW5kZXgsIGhlbHBlcnMuZ2V0SG92ZXJDb2xvcihtb2RlbC5ib3JkZXJDb2xvcikpO1xuXHRcdFx0bW9kZWwuYm9yZGVyV2lkdGggPSBjdXN0b20uaG92ZXJCb3JkZXJXaWR0aCB8fCBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LnBvaW50SG92ZXJCb3JkZXJXaWR0aCwgaW5kZXgsIG1vZGVsLmJvcmRlcldpZHRoKTtcblx0XHRcdG1vZGVsLnJhZGl1cyA9IGN1c3RvbS5ob3ZlclJhZGl1cyB8fCBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LnBvaW50SG92ZXJSYWRpdXMsIGluZGV4LCB0aGlzLmNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMucG9pbnQuaG92ZXJSYWRpdXMpO1xuXHRcdH0sXG5cdH0pO1xufTtcblxufSx7XCIyNlwiOjI2LFwiNDFcIjo0MSxcIjQ2XCI6NDZ9XSwxOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xudmFyIGVsZW1lbnRzID0gcmVxdWlyZSg0MSk7XG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xuXG5kZWZhdWx0cy5fc2V0KCdwb2xhckFyZWEnLCB7XG5cdHNjYWxlOiB7XG5cdFx0dHlwZTogJ3JhZGlhbExpbmVhcicsXG5cdFx0YW5nbGVMaW5lczoge1xuXHRcdFx0ZGlzcGxheTogZmFsc2Vcblx0XHR9LFxuXHRcdGdyaWRMaW5lczoge1xuXHRcdFx0Y2lyY3VsYXI6IHRydWVcblx0XHR9LFxuXHRcdHBvaW50TGFiZWxzOiB7XG5cdFx0XHRkaXNwbGF5OiBmYWxzZVxuXHRcdH0sXG5cdFx0dGlja3M6IHtcblx0XHRcdGJlZ2luQXRaZXJvOiB0cnVlXG5cdFx0fVxuXHR9LFxuXG5cdC8vIEJvb2xlYW4gLSBXaGV0aGVyIHRvIGFuaW1hdGUgdGhlIHJvdGF0aW9uIG9mIHRoZSBjaGFydFxuXHRhbmltYXRpb246IHtcblx0XHRhbmltYXRlUm90YXRlOiB0cnVlLFxuXHRcdGFuaW1hdGVTY2FsZTogdHJ1ZVxuXHR9LFxuXG5cdHN0YXJ0QW5nbGU6IC0wLjUgKiBNYXRoLlBJLFxuXHRsZWdlbmRDYWxsYmFjazogZnVuY3Rpb24oY2hhcnQpIHtcblx0XHR2YXIgdGV4dCA9IFtdO1xuXHRcdHRleHQucHVzaCgnPHVsIGNsYXNzPVwiJyArIGNoYXJ0LmlkICsgJy1sZWdlbmRcIj4nKTtcblxuXHRcdHZhciBkYXRhID0gY2hhcnQuZGF0YTtcblx0XHR2YXIgZGF0YXNldHMgPSBkYXRhLmRhdGFzZXRzO1xuXHRcdHZhciBsYWJlbHMgPSBkYXRhLmxhYmVscztcblxuXHRcdGlmIChkYXRhc2V0cy5sZW5ndGgpIHtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YXNldHNbMF0uZGF0YS5sZW5ndGg7ICsraSkge1xuXHRcdFx0XHR0ZXh0LnB1c2goJzxsaT48c3BhbiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6JyArIGRhdGFzZXRzWzBdLmJhY2tncm91bmRDb2xvcltpXSArICdcIj48L3NwYW4+Jyk7XG5cdFx0XHRcdGlmIChsYWJlbHNbaV0pIHtcblx0XHRcdFx0XHR0ZXh0LnB1c2gobGFiZWxzW2ldKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0ZXh0LnB1c2goJzwvbGk+Jyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGV4dC5wdXNoKCc8L3VsPicpO1xuXHRcdHJldHVybiB0ZXh0LmpvaW4oJycpO1xuXHR9LFxuXHRsZWdlbmQ6IHtcblx0XHRsYWJlbHM6IHtcblx0XHRcdGdlbmVyYXRlTGFiZWxzOiBmdW5jdGlvbihjaGFydCkge1xuXHRcdFx0XHR2YXIgZGF0YSA9IGNoYXJ0LmRhdGE7XG5cdFx0XHRcdGlmIChkYXRhLmxhYmVscy5sZW5ndGggJiYgZGF0YS5kYXRhc2V0cy5sZW5ndGgpIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YS5sYWJlbHMubWFwKGZ1bmN0aW9uKGxhYmVsLCBpKSB7XG5cdFx0XHRcdFx0XHR2YXIgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKDApO1xuXHRcdFx0XHRcdFx0dmFyIGRzID0gZGF0YS5kYXRhc2V0c1swXTtcblx0XHRcdFx0XHRcdHZhciBhcmMgPSBtZXRhLmRhdGFbaV07XG5cdFx0XHRcdFx0XHR2YXIgY3VzdG9tID0gYXJjLmN1c3RvbSB8fCB7fTtcblx0XHRcdFx0XHRcdHZhciB2YWx1ZUF0SW5kZXhPckRlZmF1bHQgPSBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdDtcblx0XHRcdFx0XHRcdHZhciBhcmNPcHRzID0gY2hhcnQub3B0aW9ucy5lbGVtZW50cy5hcmM7XG5cdFx0XHRcdFx0XHR2YXIgZmlsbCA9IGN1c3RvbS5iYWNrZ3JvdW5kQ29sb3IgPyBjdXN0b20uYmFja2dyb3VuZENvbG9yIDogdmFsdWVBdEluZGV4T3JEZWZhdWx0KGRzLmJhY2tncm91bmRDb2xvciwgaSwgYXJjT3B0cy5iYWNrZ3JvdW5kQ29sb3IpO1xuXHRcdFx0XHRcdFx0dmFyIHN0cm9rZSA9IGN1c3RvbS5ib3JkZXJDb2xvciA/IGN1c3RvbS5ib3JkZXJDb2xvciA6IHZhbHVlQXRJbmRleE9yRGVmYXVsdChkcy5ib3JkZXJDb2xvciwgaSwgYXJjT3B0cy5ib3JkZXJDb2xvcik7XG5cdFx0XHRcdFx0XHR2YXIgYncgPSBjdXN0b20uYm9yZGVyV2lkdGggPyBjdXN0b20uYm9yZGVyV2lkdGggOiB2YWx1ZUF0SW5kZXhPckRlZmF1bHQoZHMuYm9yZGVyV2lkdGgsIGksIGFyY09wdHMuYm9yZGVyV2lkdGgpO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHR0ZXh0OiBsYWJlbCxcblx0XHRcdFx0XHRcdFx0ZmlsbFN0eWxlOiBmaWxsLFxuXHRcdFx0XHRcdFx0XHRzdHJva2VTdHlsZTogc3Ryb2tlLFxuXHRcdFx0XHRcdFx0XHRsaW5lV2lkdGg6IGJ3LFxuXHRcdFx0XHRcdFx0XHRoaWRkZW46IGlzTmFOKGRzLmRhdGFbaV0pIHx8IG1ldGEuZGF0YVtpXS5oaWRkZW4sXG5cblx0XHRcdFx0XHRcdFx0Ly8gRXh0cmEgZGF0YSB1c2VkIGZvciB0b2dnbGluZyB0aGUgY29ycmVjdCBpdGVtXG5cdFx0XHRcdFx0XHRcdGluZGV4OiBpXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBbXTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0b25DbGljazogZnVuY3Rpb24oZSwgbGVnZW5kSXRlbSkge1xuXHRcdFx0dmFyIGluZGV4ID0gbGVnZW5kSXRlbS5pbmRleDtcblx0XHRcdHZhciBjaGFydCA9IHRoaXMuY2hhcnQ7XG5cdFx0XHR2YXIgaSwgaWxlbiwgbWV0YTtcblxuXHRcdFx0Zm9yIChpID0gMCwgaWxlbiA9IChjaGFydC5kYXRhLmRhdGFzZXRzIHx8IFtdKS5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdFx0bWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGkpO1xuXHRcdFx0XHRtZXRhLmRhdGFbaW5kZXhdLmhpZGRlbiA9ICFtZXRhLmRhdGFbaW5kZXhdLmhpZGRlbjtcblx0XHRcdH1cblxuXHRcdFx0Y2hhcnQudXBkYXRlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIE5lZWQgdG8gb3ZlcnJpZGUgdGhlc2UgdG8gZ2l2ZSBhIG5pY2UgZGVmYXVsdFxuXHR0b29sdGlwczoge1xuXHRcdGNhbGxiYWNrczoge1xuXHRcdFx0dGl0bGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9LFxuXHRcdFx0bGFiZWw6IGZ1bmN0aW9uKGl0ZW0sIGRhdGEpIHtcblx0XHRcdFx0cmV0dXJuIGRhdGEubGFiZWxzW2l0ZW0uaW5kZXhdICsgJzogJyArIGl0ZW0ueUxhYmVsO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcblxuXHRDaGFydC5jb250cm9sbGVycy5wb2xhckFyZWEgPSBDaGFydC5EYXRhc2V0Q29udHJvbGxlci5leHRlbmQoe1xuXG5cdFx0ZGF0YUVsZW1lbnRUeXBlOiBlbGVtZW50cy5BcmMsXG5cblx0XHRsaW5rU2NhbGVzOiBoZWxwZXJzLm5vb3AsXG5cblx0XHR1cGRhdGU6IGZ1bmN0aW9uKHJlc2V0KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIGRhdGFzZXQgPSBtZS5nZXREYXRhc2V0KCk7XG5cdFx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcblx0XHRcdHZhciBzdGFydCA9IG1lLmNoYXJ0Lm9wdGlvbnMuc3RhcnRBbmdsZSB8fCAwO1xuXHRcdFx0dmFyIHN0YXJ0cyA9IG1lLl9zdGFydHMgPSBbXTtcblx0XHRcdHZhciBhbmdsZXMgPSBtZS5fYW5nbGVzID0gW107XG5cdFx0XHR2YXIgaSwgaWxlbiwgYW5nbGU7XG5cblx0XHRcdG1lLl91cGRhdGVSYWRpdXMoKTtcblxuXHRcdFx0bWV0YS5jb3VudCA9IG1lLmNvdW50VmlzaWJsZUVsZW1lbnRzKCk7XG5cblx0XHRcdGZvciAoaSA9IDAsIGlsZW4gPSBkYXRhc2V0LmRhdGEubGVuZ3RoOyBpIDwgaWxlbjsgaSsrKSB7XG5cdFx0XHRcdHN0YXJ0c1tpXSA9IHN0YXJ0O1xuXHRcdFx0XHRhbmdsZSA9IG1lLl9jb21wdXRlQW5nbGUoaSk7XG5cdFx0XHRcdGFuZ2xlc1tpXSA9IGFuZ2xlO1xuXHRcdFx0XHRzdGFydCArPSBhbmdsZTtcblx0XHRcdH1cblxuXHRcdFx0aGVscGVycy5lYWNoKG1ldGEuZGF0YSwgZnVuY3Rpb24oYXJjLCBpbmRleCkge1xuXHRcdFx0XHRtZS51cGRhdGVFbGVtZW50KGFyYywgaW5kZXgsIHJlc2V0KTtcblx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdF91cGRhdGVSYWRpdXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdFx0dmFyIGNoYXJ0QXJlYSA9IGNoYXJ0LmNoYXJ0QXJlYTtcblx0XHRcdHZhciBvcHRzID0gY2hhcnQub3B0aW9ucztcblx0XHRcdHZhciBhcmNPcHRzID0gb3B0cy5lbGVtZW50cy5hcmM7XG5cdFx0XHR2YXIgbWluU2l6ZSA9IE1hdGgubWluKGNoYXJ0QXJlYS5yaWdodCAtIGNoYXJ0QXJlYS5sZWZ0LCBjaGFydEFyZWEuYm90dG9tIC0gY2hhcnRBcmVhLnRvcCk7XG5cblx0XHRcdGNoYXJ0Lm91dGVyUmFkaXVzID0gTWF0aC5tYXgoKG1pblNpemUgLSBhcmNPcHRzLmJvcmRlcldpZHRoIC8gMikgLyAyLCAwKTtcblx0XHRcdGNoYXJ0LmlubmVyUmFkaXVzID0gTWF0aC5tYXgob3B0cy5jdXRvdXRQZXJjZW50YWdlID8gKGNoYXJ0Lm91dGVyUmFkaXVzIC8gMTAwKSAqIChvcHRzLmN1dG91dFBlcmNlbnRhZ2UpIDogMSwgMCk7XG5cdFx0XHRjaGFydC5yYWRpdXNMZW5ndGggPSAoY2hhcnQub3V0ZXJSYWRpdXMgLSBjaGFydC5pbm5lclJhZGl1cykgLyBjaGFydC5nZXRWaXNpYmxlRGF0YXNldENvdW50KCk7XG5cblx0XHRcdG1lLm91dGVyUmFkaXVzID0gY2hhcnQub3V0ZXJSYWRpdXMgLSAoY2hhcnQucmFkaXVzTGVuZ3RoICogbWUuaW5kZXgpO1xuXHRcdFx0bWUuaW5uZXJSYWRpdXMgPSBtZS5vdXRlclJhZGl1cyAtIGNoYXJ0LnJhZGl1c0xlbmd0aDtcblx0XHR9LFxuXG5cdFx0dXBkYXRlRWxlbWVudDogZnVuY3Rpb24oYXJjLCBpbmRleCwgcmVzZXQpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgY2hhcnQgPSBtZS5jaGFydDtcblx0XHRcdHZhciBkYXRhc2V0ID0gbWUuZ2V0RGF0YXNldCgpO1xuXHRcdFx0dmFyIG9wdHMgPSBjaGFydC5vcHRpb25zO1xuXHRcdFx0dmFyIGFuaW1hdGlvbk9wdHMgPSBvcHRzLmFuaW1hdGlvbjtcblx0XHRcdHZhciBzY2FsZSA9IGNoYXJ0LnNjYWxlO1xuXHRcdFx0dmFyIGxhYmVscyA9IGNoYXJ0LmRhdGEubGFiZWxzO1xuXG5cdFx0XHR2YXIgY2VudGVyWCA9IHNjYWxlLnhDZW50ZXI7XG5cdFx0XHR2YXIgY2VudGVyWSA9IHNjYWxlLnlDZW50ZXI7XG5cblx0XHRcdC8vIHZhciBuZWdIYWxmUEkgPSAtMC41ICogTWF0aC5QSTtcblx0XHRcdHZhciBkYXRhc2V0U3RhcnRBbmdsZSA9IG9wdHMuc3RhcnRBbmdsZTtcblx0XHRcdHZhciBkaXN0YW5jZSA9IGFyYy5oaWRkZW4gPyAwIDogc2NhbGUuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUoZGF0YXNldC5kYXRhW2luZGV4XSk7XG5cdFx0XHR2YXIgc3RhcnRBbmdsZSA9IG1lLl9zdGFydHNbaW5kZXhdO1xuXHRcdFx0dmFyIGVuZEFuZ2xlID0gc3RhcnRBbmdsZSArIChhcmMuaGlkZGVuID8gMCA6IG1lLl9hbmdsZXNbaW5kZXhdKTtcblxuXHRcdFx0dmFyIHJlc2V0UmFkaXVzID0gYW5pbWF0aW9uT3B0cy5hbmltYXRlU2NhbGUgPyAwIDogc2NhbGUuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUoZGF0YXNldC5kYXRhW2luZGV4XSk7XG5cblx0XHRcdGhlbHBlcnMuZXh0ZW5kKGFyYywge1xuXHRcdFx0XHQvLyBVdGlsaXR5XG5cdFx0XHRcdF9kYXRhc2V0SW5kZXg6IG1lLmluZGV4LFxuXHRcdFx0XHRfaW5kZXg6IGluZGV4LFxuXHRcdFx0XHRfc2NhbGU6IHNjYWxlLFxuXG5cdFx0XHRcdC8vIERlc2lyZWQgdmlldyBwcm9wZXJ0aWVzXG5cdFx0XHRcdF9tb2RlbDoge1xuXHRcdFx0XHRcdHg6IGNlbnRlclgsXG5cdFx0XHRcdFx0eTogY2VudGVyWSxcblx0XHRcdFx0XHRpbm5lclJhZGl1czogMCxcblx0XHRcdFx0XHRvdXRlclJhZGl1czogcmVzZXQgPyByZXNldFJhZGl1cyA6IGRpc3RhbmNlLFxuXHRcdFx0XHRcdHN0YXJ0QW5nbGU6IHJlc2V0ICYmIGFuaW1hdGlvbk9wdHMuYW5pbWF0ZVJvdGF0ZSA/IGRhdGFzZXRTdGFydEFuZ2xlIDogc3RhcnRBbmdsZSxcblx0XHRcdFx0XHRlbmRBbmdsZTogcmVzZXQgJiYgYW5pbWF0aW9uT3B0cy5hbmltYXRlUm90YXRlID8gZGF0YXNldFN0YXJ0QW5nbGUgOiBlbmRBbmdsZSxcblx0XHRcdFx0XHRsYWJlbDogaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQobGFiZWxzLCBpbmRleCwgbGFiZWxzW2luZGV4XSlcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIEFwcGx5IGJvcmRlciBhbmQgZmlsbCBzdHlsZVxuXHRcdFx0dmFyIGVsZW1lbnRPcHRzID0gdGhpcy5jaGFydC5vcHRpb25zLmVsZW1lbnRzLmFyYztcblx0XHRcdHZhciBjdXN0b20gPSBhcmMuY3VzdG9tIHx8IHt9O1xuXHRcdFx0dmFyIHZhbHVlT3JEZWZhdWx0ID0gaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQ7XG5cdFx0XHR2YXIgbW9kZWwgPSBhcmMuX21vZGVsO1xuXG5cdFx0XHRtb2RlbC5iYWNrZ3JvdW5kQ29sb3IgPSBjdXN0b20uYmFja2dyb3VuZENvbG9yID8gY3VzdG9tLmJhY2tncm91bmRDb2xvciA6IHZhbHVlT3JEZWZhdWx0KGRhdGFzZXQuYmFja2dyb3VuZENvbG9yLCBpbmRleCwgZWxlbWVudE9wdHMuYmFja2dyb3VuZENvbG9yKTtcblx0XHRcdG1vZGVsLmJvcmRlckNvbG9yID0gY3VzdG9tLmJvcmRlckNvbG9yID8gY3VzdG9tLmJvcmRlckNvbG9yIDogdmFsdWVPckRlZmF1bHQoZGF0YXNldC5ib3JkZXJDb2xvciwgaW5kZXgsIGVsZW1lbnRPcHRzLmJvcmRlckNvbG9yKTtcblx0XHRcdG1vZGVsLmJvcmRlcldpZHRoID0gY3VzdG9tLmJvcmRlcldpZHRoID8gY3VzdG9tLmJvcmRlcldpZHRoIDogdmFsdWVPckRlZmF1bHQoZGF0YXNldC5ib3JkZXJXaWR0aCwgaW5kZXgsIGVsZW1lbnRPcHRzLmJvcmRlcldpZHRoKTtcblxuXHRcdFx0YXJjLnBpdm90KCk7XG5cdFx0fSxcblxuXHRcdGNvdW50VmlzaWJsZUVsZW1lbnRzOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBkYXRhc2V0ID0gdGhpcy5nZXREYXRhc2V0KCk7XG5cdFx0XHR2YXIgbWV0YSA9IHRoaXMuZ2V0TWV0YSgpO1xuXHRcdFx0dmFyIGNvdW50ID0gMDtcblxuXHRcdFx0aGVscGVycy5lYWNoKG1ldGEuZGF0YSwgZnVuY3Rpb24oZWxlbWVudCwgaW5kZXgpIHtcblx0XHRcdFx0aWYgKCFpc05hTihkYXRhc2V0LmRhdGFbaW5kZXhdKSAmJiAhZWxlbWVudC5oaWRkZW4pIHtcblx0XHRcdFx0XHRjb3VudCsrO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIGNvdW50O1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdF9jb21wdXRlQW5nbGU6IGZ1bmN0aW9uKGluZGV4KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIGNvdW50ID0gdGhpcy5nZXRNZXRhKCkuY291bnQ7XG5cdFx0XHR2YXIgZGF0YXNldCA9IG1lLmdldERhdGFzZXQoKTtcblx0XHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xuXG5cdFx0XHRpZiAoaXNOYU4oZGF0YXNldC5kYXRhW2luZGV4XSkgfHwgbWV0YS5kYXRhW2luZGV4XS5oaWRkZW4pIHtcblx0XHRcdFx0cmV0dXJuIDA7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNjcmlwdGFibGUgb3B0aW9uc1xuXHRcdFx0dmFyIGNvbnRleHQgPSB7XG5cdFx0XHRcdGNoYXJ0OiBtZS5jaGFydCxcblx0XHRcdFx0ZGF0YUluZGV4OiBpbmRleCxcblx0XHRcdFx0ZGF0YXNldDogZGF0YXNldCxcblx0XHRcdFx0ZGF0YXNldEluZGV4OiBtZS5pbmRleFxuXHRcdFx0fTtcblxuXHRcdFx0cmV0dXJuIGhlbHBlcnMub3B0aW9ucy5yZXNvbHZlKFtcblx0XHRcdFx0bWUuY2hhcnQub3B0aW9ucy5lbGVtZW50cy5hcmMuYW5nbGUsXG5cdFx0XHRcdCgyICogTWF0aC5QSSkgLyBjb3VudFxuXHRcdFx0XSwgY29udGV4dCwgaW5kZXgpO1xuXHRcdH1cblx0fSk7XG59O1xuXG59LHtcIjI2XCI6MjYsXCI0MVwiOjQxLFwiNDZcIjo0Nn1dLDIwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgyNik7XG52YXIgZWxlbWVudHMgPSByZXF1aXJlKDQxKTtcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XG5cbmRlZmF1bHRzLl9zZXQoJ3JhZGFyJywge1xuXHRzY2FsZToge1xuXHRcdHR5cGU6ICdyYWRpYWxMaW5lYXInXG5cdH0sXG5cdGVsZW1lbnRzOiB7XG5cdFx0bGluZToge1xuXHRcdFx0dGVuc2lvbjogMCAvLyBubyBiZXppZXIgaW4gcmFkYXJcblx0XHR9XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENoYXJ0KSB7XG5cblx0Q2hhcnQuY29udHJvbGxlcnMucmFkYXIgPSBDaGFydC5EYXRhc2V0Q29udHJvbGxlci5leHRlbmQoe1xuXG5cdFx0ZGF0YXNldEVsZW1lbnRUeXBlOiBlbGVtZW50cy5MaW5lLFxuXG5cdFx0ZGF0YUVsZW1lbnRUeXBlOiBlbGVtZW50cy5Qb2ludCxcblxuXHRcdGxpbmtTY2FsZXM6IGhlbHBlcnMubm9vcCxcblxuXHRcdHVwZGF0ZTogZnVuY3Rpb24ocmVzZXQpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcblx0XHRcdHZhciBsaW5lID0gbWV0YS5kYXRhc2V0O1xuXHRcdFx0dmFyIHBvaW50cyA9IG1ldGEuZGF0YTtcblx0XHRcdHZhciBjdXN0b20gPSBsaW5lLmN1c3RvbSB8fCB7fTtcblx0XHRcdHZhciBkYXRhc2V0ID0gbWUuZ2V0RGF0YXNldCgpO1xuXHRcdFx0dmFyIGxpbmVFbGVtZW50T3B0aW9ucyA9IG1lLmNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMubGluZTtcblx0XHRcdHZhciBzY2FsZSA9IG1lLmNoYXJ0LnNjYWxlO1xuXG5cdFx0XHQvLyBDb21wYXRpYmlsaXR5OiBJZiB0aGUgcHJvcGVydGllcyBhcmUgZGVmaW5lZCB3aXRoIG9ubHkgdGhlIG9sZCBuYW1lLCB1c2UgdGhvc2UgdmFsdWVzXG5cdFx0XHRpZiAoKGRhdGFzZXQudGVuc2lvbiAhPT0gdW5kZWZpbmVkKSAmJiAoZGF0YXNldC5saW5lVGVuc2lvbiA9PT0gdW5kZWZpbmVkKSkge1xuXHRcdFx0XHRkYXRhc2V0LmxpbmVUZW5zaW9uID0gZGF0YXNldC50ZW5zaW9uO1xuXHRcdFx0fVxuXG5cdFx0XHRoZWxwZXJzLmV4dGVuZChtZXRhLmRhdGFzZXQsIHtcblx0XHRcdFx0Ly8gVXRpbGl0eVxuXHRcdFx0XHRfZGF0YXNldEluZGV4OiBtZS5pbmRleCxcblx0XHRcdFx0X3NjYWxlOiBzY2FsZSxcblx0XHRcdFx0Ly8gRGF0YVxuXHRcdFx0XHRfY2hpbGRyZW46IHBvaW50cyxcblx0XHRcdFx0X2xvb3A6IHRydWUsXG5cdFx0XHRcdC8vIE1vZGVsXG5cdFx0XHRcdF9tb2RlbDoge1xuXHRcdFx0XHRcdC8vIEFwcGVhcmFuY2Vcblx0XHRcdFx0XHR0ZW5zaW9uOiBjdXN0b20udGVuc2lvbiA/IGN1c3RvbS50ZW5zaW9uIDogaGVscGVycy52YWx1ZU9yRGVmYXVsdChkYXRhc2V0LmxpbmVUZW5zaW9uLCBsaW5lRWxlbWVudE9wdGlvbnMudGVuc2lvbiksXG5cdFx0XHRcdFx0YmFja2dyb3VuZENvbG9yOiBjdXN0b20uYmFja2dyb3VuZENvbG9yID8gY3VzdG9tLmJhY2tncm91bmRDb2xvciA6IChkYXRhc2V0LmJhY2tncm91bmRDb2xvciB8fCBsaW5lRWxlbWVudE9wdGlvbnMuYmFja2dyb3VuZENvbG9yKSxcblx0XHRcdFx0XHRib3JkZXJXaWR0aDogY3VzdG9tLmJvcmRlcldpZHRoID8gY3VzdG9tLmJvcmRlcldpZHRoIDogKGRhdGFzZXQuYm9yZGVyV2lkdGggfHwgbGluZUVsZW1lbnRPcHRpb25zLmJvcmRlcldpZHRoKSxcblx0XHRcdFx0XHRib3JkZXJDb2xvcjogY3VzdG9tLmJvcmRlckNvbG9yID8gY3VzdG9tLmJvcmRlckNvbG9yIDogKGRhdGFzZXQuYm9yZGVyQ29sb3IgfHwgbGluZUVsZW1lbnRPcHRpb25zLmJvcmRlckNvbG9yKSxcblx0XHRcdFx0XHRmaWxsOiBjdXN0b20uZmlsbCA/IGN1c3RvbS5maWxsIDogKGRhdGFzZXQuZmlsbCAhPT0gdW5kZWZpbmVkID8gZGF0YXNldC5maWxsIDogbGluZUVsZW1lbnRPcHRpb25zLmZpbGwpLFxuXHRcdFx0XHRcdGJvcmRlckNhcFN0eWxlOiBjdXN0b20uYm9yZGVyQ2FwU3R5bGUgPyBjdXN0b20uYm9yZGVyQ2FwU3R5bGUgOiAoZGF0YXNldC5ib3JkZXJDYXBTdHlsZSB8fCBsaW5lRWxlbWVudE9wdGlvbnMuYm9yZGVyQ2FwU3R5bGUpLFxuXHRcdFx0XHRcdGJvcmRlckRhc2g6IGN1c3RvbS5ib3JkZXJEYXNoID8gY3VzdG9tLmJvcmRlckRhc2ggOiAoZGF0YXNldC5ib3JkZXJEYXNoIHx8IGxpbmVFbGVtZW50T3B0aW9ucy5ib3JkZXJEYXNoKSxcblx0XHRcdFx0XHRib3JkZXJEYXNoT2Zmc2V0OiBjdXN0b20uYm9yZGVyRGFzaE9mZnNldCA/IGN1c3RvbS5ib3JkZXJEYXNoT2Zmc2V0IDogKGRhdGFzZXQuYm9yZGVyRGFzaE9mZnNldCB8fCBsaW5lRWxlbWVudE9wdGlvbnMuYm9yZGVyRGFzaE9mZnNldCksXG5cdFx0XHRcdFx0Ym9yZGVySm9pblN0eWxlOiBjdXN0b20uYm9yZGVySm9pblN0eWxlID8gY3VzdG9tLmJvcmRlckpvaW5TdHlsZSA6IChkYXRhc2V0LmJvcmRlckpvaW5TdHlsZSB8fCBsaW5lRWxlbWVudE9wdGlvbnMuYm9yZGVySm9pblN0eWxlKSxcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdG1ldGEuZGF0YXNldC5waXZvdCgpO1xuXG5cdFx0XHQvLyBVcGRhdGUgUG9pbnRzXG5cdFx0XHRoZWxwZXJzLmVhY2gocG9pbnRzLCBmdW5jdGlvbihwb2ludCwgaW5kZXgpIHtcblx0XHRcdFx0bWUudXBkYXRlRWxlbWVudChwb2ludCwgaW5kZXgsIHJlc2V0KTtcblx0XHRcdH0sIG1lKTtcblxuXHRcdFx0Ly8gVXBkYXRlIGJlemllciBjb250cm9sIHBvaW50c1xuXHRcdFx0bWUudXBkYXRlQmV6aWVyQ29udHJvbFBvaW50cygpO1xuXHRcdH0sXG5cdFx0dXBkYXRlRWxlbWVudDogZnVuY3Rpb24ocG9pbnQsIGluZGV4LCByZXNldCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBjdXN0b20gPSBwb2ludC5jdXN0b20gfHwge307XG5cdFx0XHR2YXIgZGF0YXNldCA9IG1lLmdldERhdGFzZXQoKTtcblx0XHRcdHZhciBzY2FsZSA9IG1lLmNoYXJ0LnNjYWxlO1xuXHRcdFx0dmFyIHBvaW50RWxlbWVudE9wdGlvbnMgPSBtZS5jaGFydC5vcHRpb25zLmVsZW1lbnRzLnBvaW50O1xuXHRcdFx0dmFyIHBvaW50UG9zaXRpb24gPSBzY2FsZS5nZXRQb2ludFBvc2l0aW9uRm9yVmFsdWUoaW5kZXgsIGRhdGFzZXQuZGF0YVtpbmRleF0pO1xuXG5cdFx0XHQvLyBDb21wYXRpYmlsaXR5OiBJZiB0aGUgcHJvcGVydGllcyBhcmUgZGVmaW5lZCB3aXRoIG9ubHkgdGhlIG9sZCBuYW1lLCB1c2UgdGhvc2UgdmFsdWVzXG5cdFx0XHRpZiAoKGRhdGFzZXQucmFkaXVzICE9PSB1bmRlZmluZWQpICYmIChkYXRhc2V0LnBvaW50UmFkaXVzID09PSB1bmRlZmluZWQpKSB7XG5cdFx0XHRcdGRhdGFzZXQucG9pbnRSYWRpdXMgPSBkYXRhc2V0LnJhZGl1cztcblx0XHRcdH1cblx0XHRcdGlmICgoZGF0YXNldC5oaXRSYWRpdXMgIT09IHVuZGVmaW5lZCkgJiYgKGRhdGFzZXQucG9pbnRIaXRSYWRpdXMgPT09IHVuZGVmaW5lZCkpIHtcblx0XHRcdFx0ZGF0YXNldC5wb2ludEhpdFJhZGl1cyA9IGRhdGFzZXQuaGl0UmFkaXVzO1xuXHRcdFx0fVxuXG5cdFx0XHRoZWxwZXJzLmV4dGVuZChwb2ludCwge1xuXHRcdFx0XHQvLyBVdGlsaXR5XG5cdFx0XHRcdF9kYXRhc2V0SW5kZXg6IG1lLmluZGV4LFxuXHRcdFx0XHRfaW5kZXg6IGluZGV4LFxuXHRcdFx0XHRfc2NhbGU6IHNjYWxlLFxuXG5cdFx0XHRcdC8vIERlc2lyZWQgdmlldyBwcm9wZXJ0aWVzXG5cdFx0XHRcdF9tb2RlbDoge1xuXHRcdFx0XHRcdHg6IHJlc2V0ID8gc2NhbGUueENlbnRlciA6IHBvaW50UG9zaXRpb24ueCwgLy8gdmFsdWUgbm90IHVzZWQgaW4gZGF0YXNldCBzY2FsZSwgYnV0IHdlIHdhbnQgYSBjb25zaXN0ZW50IEFQSSBiZXR3ZWVuIHNjYWxlc1xuXHRcdFx0XHRcdHk6IHJlc2V0ID8gc2NhbGUueUNlbnRlciA6IHBvaW50UG9zaXRpb24ueSxcblxuXHRcdFx0XHRcdC8vIEFwcGVhcmFuY2Vcblx0XHRcdFx0XHR0ZW5zaW9uOiBjdXN0b20udGVuc2lvbiA/IGN1c3RvbS50ZW5zaW9uIDogaGVscGVycy52YWx1ZU9yRGVmYXVsdChkYXRhc2V0LmxpbmVUZW5zaW9uLCBtZS5jaGFydC5vcHRpb25zLmVsZW1lbnRzLmxpbmUudGVuc2lvbiksXG5cdFx0XHRcdFx0cmFkaXVzOiBjdXN0b20ucmFkaXVzID8gY3VzdG9tLnJhZGl1cyA6IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRSYWRpdXMsIGluZGV4LCBwb2ludEVsZW1lbnRPcHRpb25zLnJhZGl1cyksXG5cdFx0XHRcdFx0YmFja2dyb3VuZENvbG9yOiBjdXN0b20uYmFja2dyb3VuZENvbG9yID8gY3VzdG9tLmJhY2tncm91bmRDb2xvciA6IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRCYWNrZ3JvdW5kQ29sb3IsIGluZGV4LCBwb2ludEVsZW1lbnRPcHRpb25zLmJhY2tncm91bmRDb2xvciksXG5cdFx0XHRcdFx0Ym9yZGVyQ29sb3I6IGN1c3RvbS5ib3JkZXJDb2xvciA/IGN1c3RvbS5ib3JkZXJDb2xvciA6IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRCb3JkZXJDb2xvciwgaW5kZXgsIHBvaW50RWxlbWVudE9wdGlvbnMuYm9yZGVyQ29sb3IpLFxuXHRcdFx0XHRcdGJvcmRlcldpZHRoOiBjdXN0b20uYm9yZGVyV2lkdGggPyBjdXN0b20uYm9yZGVyV2lkdGggOiBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LnBvaW50Qm9yZGVyV2lkdGgsIGluZGV4LCBwb2ludEVsZW1lbnRPcHRpb25zLmJvcmRlcldpZHRoKSxcblx0XHRcdFx0XHRwb2ludFN0eWxlOiBjdXN0b20ucG9pbnRTdHlsZSA/IGN1c3RvbS5wb2ludFN0eWxlIDogaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludFN0eWxlLCBpbmRleCwgcG9pbnRFbGVtZW50T3B0aW9ucy5wb2ludFN0eWxlKSxcblx0XHRcdFx0XHRyb3RhdGlvbjogY3VzdG9tLnJvdGF0aW9uID8gY3VzdG9tLnJvdGF0aW9uIDogaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludFJvdGF0aW9uLCBpbmRleCwgcG9pbnRFbGVtZW50T3B0aW9ucy5yb3RhdGlvbiksXG5cblx0XHRcdFx0XHQvLyBUb29sdGlwXG5cdFx0XHRcdFx0aGl0UmFkaXVzOiBjdXN0b20uaGl0UmFkaXVzID8gY3VzdG9tLmhpdFJhZGl1cyA6IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRIaXRSYWRpdXMsIGluZGV4LCBwb2ludEVsZW1lbnRPcHRpb25zLmhpdFJhZGl1cylcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdHBvaW50Ll9tb2RlbC5za2lwID0gY3VzdG9tLnNraXAgPyBjdXN0b20uc2tpcCA6IChpc05hTihwb2ludC5fbW9kZWwueCkgfHwgaXNOYU4ocG9pbnQuX21vZGVsLnkpKTtcblx0XHR9LFxuXHRcdHVwZGF0ZUJlemllckNvbnRyb2xQb2ludHM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGNoYXJ0QXJlYSA9IHRoaXMuY2hhcnQuY2hhcnRBcmVhO1xuXHRcdFx0dmFyIG1ldGEgPSB0aGlzLmdldE1ldGEoKTtcblxuXHRcdFx0aGVscGVycy5lYWNoKG1ldGEuZGF0YSwgZnVuY3Rpb24ocG9pbnQsIGluZGV4KSB7XG5cdFx0XHRcdHZhciBtb2RlbCA9IHBvaW50Ll9tb2RlbDtcblx0XHRcdFx0dmFyIGNvbnRyb2xQb2ludHMgPSBoZWxwZXJzLnNwbGluZUN1cnZlKFxuXHRcdFx0XHRcdGhlbHBlcnMucHJldmlvdXNJdGVtKG1ldGEuZGF0YSwgaW5kZXgsIHRydWUpLl9tb2RlbCxcblx0XHRcdFx0XHRtb2RlbCxcblx0XHRcdFx0XHRoZWxwZXJzLm5leHRJdGVtKG1ldGEuZGF0YSwgaW5kZXgsIHRydWUpLl9tb2RlbCxcblx0XHRcdFx0XHRtb2RlbC50ZW5zaW9uXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gUHJldmVudCB0aGUgYmV6aWVyIGdvaW5nIG91dHNpZGUgb2YgdGhlIGJvdW5kcyBvZiB0aGUgZ3JhcGhcblx0XHRcdFx0bW9kZWwuY29udHJvbFBvaW50UHJldmlvdXNYID0gTWF0aC5tYXgoTWF0aC5taW4oY29udHJvbFBvaW50cy5wcmV2aW91cy54LCBjaGFydEFyZWEucmlnaHQpLCBjaGFydEFyZWEubGVmdCk7XG5cdFx0XHRcdG1vZGVsLmNvbnRyb2xQb2ludFByZXZpb3VzWSA9IE1hdGgubWF4KE1hdGgubWluKGNvbnRyb2xQb2ludHMucHJldmlvdXMueSwgY2hhcnRBcmVhLmJvdHRvbSksIGNoYXJ0QXJlYS50b3ApO1xuXG5cdFx0XHRcdG1vZGVsLmNvbnRyb2xQb2ludE5leHRYID0gTWF0aC5tYXgoTWF0aC5taW4oY29udHJvbFBvaW50cy5uZXh0LngsIGNoYXJ0QXJlYS5yaWdodCksIGNoYXJ0QXJlYS5sZWZ0KTtcblx0XHRcdFx0bW9kZWwuY29udHJvbFBvaW50TmV4dFkgPSBNYXRoLm1heChNYXRoLm1pbihjb250cm9sUG9pbnRzLm5leHQueSwgY2hhcnRBcmVhLmJvdHRvbSksIGNoYXJ0QXJlYS50b3ApO1xuXG5cdFx0XHRcdC8vIE5vdyBwaXZvdCB0aGUgcG9pbnQgZm9yIGFuaW1hdGlvblxuXHRcdFx0XHRwb2ludC5waXZvdCgpO1xuXHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdHNldEhvdmVyU3R5bGU6IGZ1bmN0aW9uKHBvaW50KSB7XG5cdFx0XHQvLyBQb2ludFxuXHRcdFx0dmFyIGRhdGFzZXQgPSB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHNbcG9pbnQuX2RhdGFzZXRJbmRleF07XG5cdFx0XHR2YXIgY3VzdG9tID0gcG9pbnQuY3VzdG9tIHx8IHt9O1xuXHRcdFx0dmFyIGluZGV4ID0gcG9pbnQuX2luZGV4O1xuXHRcdFx0dmFyIG1vZGVsID0gcG9pbnQuX21vZGVsO1xuXG5cdFx0XHRwb2ludC4kcHJldmlvdXNTdHlsZSA9IHtcblx0XHRcdFx0YmFja2dyb3VuZENvbG9yOiBtb2RlbC5iYWNrZ3JvdW5kQ29sb3IsXG5cdFx0XHRcdGJvcmRlckNvbG9yOiBtb2RlbC5ib3JkZXJDb2xvcixcblx0XHRcdFx0Ym9yZGVyV2lkdGg6IG1vZGVsLmJvcmRlcldpZHRoLFxuXHRcdFx0XHRyYWRpdXM6IG1vZGVsLnJhZGl1c1xuXHRcdFx0fTtcblxuXHRcdFx0bW9kZWwucmFkaXVzID0gY3VzdG9tLmhvdmVyUmFkaXVzID8gY3VzdG9tLmhvdmVyUmFkaXVzIDogaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludEhvdmVyUmFkaXVzLCBpbmRleCwgdGhpcy5jaGFydC5vcHRpb25zLmVsZW1lbnRzLnBvaW50LmhvdmVyUmFkaXVzKTtcblx0XHRcdG1vZGVsLmJhY2tncm91bmRDb2xvciA9IGN1c3RvbS5ob3ZlckJhY2tncm91bmRDb2xvciA/IGN1c3RvbS5ob3ZlckJhY2tncm91bmRDb2xvciA6IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRIb3ZlckJhY2tncm91bmRDb2xvciwgaW5kZXgsIGhlbHBlcnMuZ2V0SG92ZXJDb2xvcihtb2RlbC5iYWNrZ3JvdW5kQ29sb3IpKTtcblx0XHRcdG1vZGVsLmJvcmRlckNvbG9yID0gY3VzdG9tLmhvdmVyQm9yZGVyQ29sb3IgPyBjdXN0b20uaG92ZXJCb3JkZXJDb2xvciA6IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRIb3ZlckJvcmRlckNvbG9yLCBpbmRleCwgaGVscGVycy5nZXRIb3ZlckNvbG9yKG1vZGVsLmJvcmRlckNvbG9yKSk7XG5cdFx0XHRtb2RlbC5ib3JkZXJXaWR0aCA9IGN1c3RvbS5ob3ZlckJvcmRlcldpZHRoID8gY3VzdG9tLmhvdmVyQm9yZGVyV2lkdGggOiBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LnBvaW50SG92ZXJCb3JkZXJXaWR0aCwgaW5kZXgsIG1vZGVsLmJvcmRlcldpZHRoKTtcblx0XHR9LFxuXHR9KTtcbn07XG5cbn0se1wiMjZcIjoyNixcIjQxXCI6NDEsXCI0NlwiOjQ2fV0sMjE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcblxuZGVmYXVsdHMuX3NldCgnc2NhdHRlcicsIHtcblx0aG92ZXI6IHtcblx0XHRtb2RlOiAnc2luZ2xlJ1xuXHR9LFxuXG5cdHNjYWxlczoge1xuXHRcdHhBeGVzOiBbe1xuXHRcdFx0aWQ6ICd4LWF4aXMtMScsICAgIC8vIG5lZWQgYW4gSUQgc28gZGF0YXNldHMgY2FuIHJlZmVyZW5jZSB0aGUgc2NhbGVcblx0XHRcdHR5cGU6ICdsaW5lYXInLCAgICAvLyBzY2F0dGVyIHNob3VsZCBub3QgdXNlIGEgY2F0ZWdvcnkgYXhpc1xuXHRcdFx0cG9zaXRpb246ICdib3R0b20nXG5cdFx0fV0sXG5cdFx0eUF4ZXM6IFt7XG5cdFx0XHRpZDogJ3ktYXhpcy0xJyxcblx0XHRcdHR5cGU6ICdsaW5lYXInLFxuXHRcdFx0cG9zaXRpb246ICdsZWZ0J1xuXHRcdH1dXG5cdH0sXG5cblx0c2hvd0xpbmVzOiBmYWxzZSxcblxuXHR0b29sdGlwczoge1xuXHRcdGNhbGxiYWNrczoge1xuXHRcdFx0dGl0bGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gJyc7ICAgICAvLyBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIHNjYXR0ZXIgc2luY2UgZGF0YSBhcmUgZm9ybWF0dGVkIGFzIGEgcG9pbnRcblx0XHRcdH0sXG5cdFx0XHRsYWJlbDogZnVuY3Rpb24oaXRlbSkge1xuXHRcdFx0XHRyZXR1cm4gJygnICsgaXRlbS54TGFiZWwgKyAnLCAnICsgaXRlbS55TGFiZWwgKyAnKSc7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDaGFydCkge1xuXG5cdC8vIFNjYXR0ZXIgY2hhcnRzIHVzZSBsaW5lIGNvbnRyb2xsZXJzXG5cdENoYXJ0LmNvbnRyb2xsZXJzLnNjYXR0ZXIgPSBDaGFydC5jb250cm9sbGVycy5saW5lO1xuXG59O1xuXG59LHtcIjI2XCI6MjZ9XSwyMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBFbGVtZW50ID0gcmVxdWlyZSgyNyk7XG5cbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBFbGVtZW50LmV4dGVuZCh7XG5cdGNoYXJ0OiBudWxsLCAvLyB0aGUgYW5pbWF0aW9uIGFzc29jaWF0ZWQgY2hhcnQgaW5zdGFuY2Vcblx0Y3VycmVudFN0ZXA6IDAsIC8vIHRoZSBjdXJyZW50IGFuaW1hdGlvbiBzdGVwXG5cdG51bVN0ZXBzOiA2MCwgLy8gZGVmYXVsdCBudW1iZXIgb2Ygc3RlcHNcblx0ZWFzaW5nOiAnJywgLy8gdGhlIGVhc2luZyB0byB1c2UgZm9yIHRoaXMgYW5pbWF0aW9uXG5cdHJlbmRlcjogbnVsbCwgLy8gcmVuZGVyIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGFuaW1hdGlvbiBzZXJ2aWNlXG5cblx0b25BbmltYXRpb25Qcm9ncmVzczogbnVsbCwgLy8gdXNlciBzcGVjaWZpZWQgY2FsbGJhY2sgdG8gZmlyZSBvbiBlYWNoIHN0ZXAgb2YgdGhlIGFuaW1hdGlvblxuXHRvbkFuaW1hdGlvbkNvbXBsZXRlOiBudWxsLCAvLyB1c2VyIHNwZWNpZmllZCBjYWxsYmFjayB0byBmaXJlIHdoZW4gdGhlIGFuaW1hdGlvbiBmaW5pc2hlc1xufSk7XG5cbi8vIERFUFJFQ0FUSU9OU1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB1c2UgQ2hhcnQuQW5pbWF0aW9uIGluc3RlYWRcbiAqIEBwcm9wIENoYXJ0LkFuaW1hdGlvbiNhbmltYXRpb25PYmplY3RcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi42LjBcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcbiAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMucHJvdG90eXBlLCAnYW5pbWF0aW9uT2JqZWN0Jywge1xuXHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59KTtcblxuLyoqXG4gKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdXNlIENoYXJ0LkFuaW1hdGlvbiNjaGFydCBpbnN0ZWFkXG4gKiBAcHJvcCBDaGFydC5BbmltYXRpb24jY2hhcnRJbnN0YW5jZVxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjYuMFxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cy5wcm90b3R5cGUsICdjaGFydEluc3RhbmNlJywge1xuXHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmNoYXJ0O1xuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0dGhpcy5jaGFydCA9IHZhbHVlO1xuXHR9XG59KTtcblxufSx7XCIyN1wiOjI3fV0sMjM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuLyogZ2xvYmFsIHdpbmRvdzogZmFsc2UgKi9cbid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgyNik7XG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xuXG5kZWZhdWx0cy5fc2V0KCdnbG9iYWwnLCB7XG5cdGFuaW1hdGlvbjoge1xuXHRcdGR1cmF0aW9uOiAxMDAwLFxuXHRcdGVhc2luZzogJ2Vhc2VPdXRRdWFydCcsXG5cdFx0b25Qcm9ncmVzczogaGVscGVycy5ub29wLFxuXHRcdG9uQ29tcGxldGU6IGhlbHBlcnMubm9vcFxuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdGZyYW1lRHVyYXRpb246IDE3LFxuXHRhbmltYXRpb25zOiBbXSxcblx0ZHJvcEZyYW1lczogMCxcblx0cmVxdWVzdDogbnVsbCxcblxuXHQvKipcblx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSBUaGUgY2hhcnQgdG8gYW5pbWF0ZS5cblx0ICogQHBhcmFtIHtDaGFydC5BbmltYXRpb259IGFuaW1hdGlvbiAtIFRoZSBhbmltYXRpb24gdGhhdCB3ZSB3aWxsIGFuaW1hdGUuXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBkdXJhdGlvbiAtIFRoZSBhbmltYXRpb24gZHVyYXRpb24gaW4gbXMuXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gbGF6eSAtIGlmIHRydWUsIHRoZSBjaGFydCBpcyBub3QgbWFya2VkIGFzIGFuaW1hdGluZyB0byBlbmFibGUgbW9yZSByZXNwb25zaXZlIGludGVyYWN0aW9uc1xuXHQgKi9cblx0YWRkQW5pbWF0aW9uOiBmdW5jdGlvbihjaGFydCwgYW5pbWF0aW9uLCBkdXJhdGlvbiwgbGF6eSkge1xuXHRcdHZhciBhbmltYXRpb25zID0gdGhpcy5hbmltYXRpb25zO1xuXHRcdHZhciBpLCBpbGVuO1xuXG5cdFx0YW5pbWF0aW9uLmNoYXJ0ID0gY2hhcnQ7XG5cblx0XHRpZiAoIWxhenkpIHtcblx0XHRcdGNoYXJ0LmFuaW1hdGluZyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Zm9yIChpID0gMCwgaWxlbiA9IGFuaW1hdGlvbnMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRpZiAoYW5pbWF0aW9uc1tpXS5jaGFydCA9PT0gY2hhcnQpIHtcblx0XHRcdFx0YW5pbWF0aW9uc1tpXSA9IGFuaW1hdGlvbjtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGFuaW1hdGlvbnMucHVzaChhbmltYXRpb24pO1xuXG5cdFx0Ly8gSWYgdGhlcmUgYXJlIG5vIGFuaW1hdGlvbnMgcXVldWVkLCBtYW51YWxseSBraWNrc3RhcnQgYSBkaWdlc3QsIGZvciBsYWNrIG9mIGEgYmV0dGVyIHdvcmRcblx0XHRpZiAoYW5pbWF0aW9ucy5sZW5ndGggPT09IDEpIHtcblx0XHRcdHRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCk7XG5cdFx0fVxuXHR9LFxuXG5cdGNhbmNlbEFuaW1hdGlvbjogZnVuY3Rpb24oY2hhcnQpIHtcblx0XHR2YXIgaW5kZXggPSBoZWxwZXJzLmZpbmRJbmRleCh0aGlzLmFuaW1hdGlvbnMsIGZ1bmN0aW9uKGFuaW1hdGlvbikge1xuXHRcdFx0cmV0dXJuIGFuaW1hdGlvbi5jaGFydCA9PT0gY2hhcnQ7XG5cdFx0fSk7XG5cblx0XHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0XHR0aGlzLmFuaW1hdGlvbnMuc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdGNoYXJ0LmFuaW1hdGluZyA9IGZhbHNlO1xuXHRcdH1cblx0fSxcblxuXHRyZXF1ZXN0QW5pbWF0aW9uRnJhbWU6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0aWYgKG1lLnJlcXVlc3QgPT09IG51bGwpIHtcblx0XHRcdC8vIFNraXAgYW5pbWF0aW9uIGZyYW1lIHJlcXVlc3RzIHVudGlsIHRoZSBhY3RpdmUgb25lIGlzIGV4ZWN1dGVkLlxuXHRcdFx0Ly8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gcHJvY2Vzc2luZyBtb3VzZSBldmVudHMsIGUuZy4gJ21vdXNlbW92ZSdcblx0XHRcdC8vIGFuZCAnbW91c2VvdXQnIGV2ZW50cyB3aWxsIHRyaWdnZXIgbXVsdGlwbGUgcmVuZGVycy5cblx0XHRcdG1lLnJlcXVlc3QgPSBoZWxwZXJzLnJlcXVlc3RBbmltRnJhbWUuY2FsbCh3aW5kb3csIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRtZS5yZXF1ZXN0ID0gbnVsbDtcblx0XHRcdFx0bWUuc3RhcnREaWdlc3QoKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHN0YXJ0RGlnZXN0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXHRcdHZhciBmcmFtZXNUb0Ryb3AgPSAwO1xuXG5cdFx0aWYgKG1lLmRyb3BGcmFtZXMgPiAxKSB7XG5cdFx0XHRmcmFtZXNUb0Ryb3AgPSBNYXRoLmZsb29yKG1lLmRyb3BGcmFtZXMpO1xuXHRcdFx0bWUuZHJvcEZyYW1lcyA9IG1lLmRyb3BGcmFtZXMgJSAxO1xuXHRcdH1cblxuXHRcdG1lLmFkdmFuY2UoMSArIGZyYW1lc1RvRHJvcCk7XG5cblx0XHR2YXIgZW5kVGltZSA9IERhdGUubm93KCk7XG5cblx0XHRtZS5kcm9wRnJhbWVzICs9IChlbmRUaW1lIC0gc3RhcnRUaW1lKSAvIG1lLmZyYW1lRHVyYXRpb247XG5cblx0XHQvLyBEbyB3ZSBoYXZlIG1vcmUgc3R1ZmYgdG8gYW5pbWF0ZT9cblx0XHRpZiAobWUuYW5pbWF0aW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0XHRtZS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRhZHZhbmNlOiBmdW5jdGlvbihjb3VudCkge1xuXHRcdHZhciBhbmltYXRpb25zID0gdGhpcy5hbmltYXRpb25zO1xuXHRcdHZhciBhbmltYXRpb24sIGNoYXJ0O1xuXHRcdHZhciBpID0gMDtcblxuXHRcdHdoaWxlIChpIDwgYW5pbWF0aW9ucy5sZW5ndGgpIHtcblx0XHRcdGFuaW1hdGlvbiA9IGFuaW1hdGlvbnNbaV07XG5cdFx0XHRjaGFydCA9IGFuaW1hdGlvbi5jaGFydDtcblxuXHRcdFx0YW5pbWF0aW9uLmN1cnJlbnRTdGVwID0gKGFuaW1hdGlvbi5jdXJyZW50U3RlcCB8fCAwKSArIGNvdW50O1xuXHRcdFx0YW5pbWF0aW9uLmN1cnJlbnRTdGVwID0gTWF0aC5taW4oYW5pbWF0aW9uLmN1cnJlbnRTdGVwLCBhbmltYXRpb24ubnVtU3RlcHMpO1xuXG5cdFx0XHRoZWxwZXJzLmNhbGxiYWNrKGFuaW1hdGlvbi5yZW5kZXIsIFtjaGFydCwgYW5pbWF0aW9uXSwgY2hhcnQpO1xuXHRcdFx0aGVscGVycy5jYWxsYmFjayhhbmltYXRpb24ub25BbmltYXRpb25Qcm9ncmVzcywgW2FuaW1hdGlvbl0sIGNoYXJ0KTtcblxuXHRcdFx0aWYgKGFuaW1hdGlvbi5jdXJyZW50U3RlcCA+PSBhbmltYXRpb24ubnVtU3RlcHMpIHtcblx0XHRcdFx0aGVscGVycy5jYWxsYmFjayhhbmltYXRpb24ub25BbmltYXRpb25Db21wbGV0ZSwgW2FuaW1hdGlvbl0sIGNoYXJ0KTtcblx0XHRcdFx0Y2hhcnQuYW5pbWF0aW5nID0gZmFsc2U7XG5cdFx0XHRcdGFuaW1hdGlvbnMuc3BsaWNlKGksIDEpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0KytpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxufSx7XCIyNlwiOjI2LFwiNDZcIjo0Nn1dLDI0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIEFuaW1hdGlvbiA9IHJlcXVpcmUoMjIpO1xudmFyIGFuaW1hdGlvbnMgPSByZXF1aXJlKDIzKTtcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcbnZhciBJbnRlcmFjdGlvbiA9IHJlcXVpcmUoMjkpO1xudmFyIGxheW91dHMgPSByZXF1aXJlKDMxKTtcbnZhciBwbGF0Zm9ybSA9IHJlcXVpcmUoNDkpO1xudmFyIHBsdWdpbnMgPSByZXF1aXJlKDMyKTtcbnZhciBzY2FsZVNlcnZpY2UgPSByZXF1aXJlKDM0KTtcbnZhciBUb29sdGlwID0gcmVxdWlyZSgzNik7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcblxuXHQvLyBDcmVhdGUgYSBkaWN0aW9uYXJ5IG9mIGNoYXJ0IHR5cGVzLCB0byBhbGxvdyBmb3IgZXh0ZW5zaW9uIG9mIGV4aXN0aW5nIHR5cGVzXG5cdENoYXJ0LnR5cGVzID0ge307XG5cblx0Ly8gU3RvcmUgYSByZWZlcmVuY2UgdG8gZWFjaCBpbnN0YW5jZSAtIGFsbG93aW5nIHVzIHRvIGdsb2JhbGx5IHJlc2l6ZSBjaGFydCBpbnN0YW5jZXMgb24gd2luZG93IHJlc2l6ZS5cblx0Ly8gRGVzdHJveSBtZXRob2Qgb24gdGhlIGNoYXJ0IHdpbGwgcmVtb3ZlIHRoZSBpbnN0YW5jZSBvZiB0aGUgY2hhcnQgZnJvbSB0aGlzIHJlZmVyZW5jZS5cblx0Q2hhcnQuaW5zdGFuY2VzID0ge307XG5cblx0Ly8gQ29udHJvbGxlcnMgYXZhaWxhYmxlIGZvciBkYXRhc2V0IHZpc3VhbGl6YXRpb24gZWcuIGJhciwgbGluZSwgc2xpY2UsIGV0Yy5cblx0Q2hhcnQuY29udHJvbGxlcnMgPSB7fTtcblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZXMgdGhlIGdpdmVuIGNvbmZpZyB3aXRoIGdsb2JhbCBhbmQgY2hhcnQgZGVmYXVsdCB2YWx1ZXMuXG5cdCAqL1xuXHRmdW5jdGlvbiBpbml0Q29uZmlnKGNvbmZpZykge1xuXHRcdGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcblxuXHRcdC8vIERvIE5PVCB1c2UgY29uZmlnTWVyZ2UoKSBmb3IgdGhlIGRhdGEgb2JqZWN0IGJlY2F1c2UgdGhpcyBtZXRob2QgbWVyZ2VzIGFycmF5c1xuXHRcdC8vIGFuZCBzbyB3b3VsZCBjaGFuZ2UgcmVmZXJlbmNlcyB0byBsYWJlbHMgYW5kIGRhdGFzZXRzLCBwcmV2ZW50aW5nIGRhdGEgdXBkYXRlcy5cblx0XHR2YXIgZGF0YSA9IGNvbmZpZy5kYXRhID0gY29uZmlnLmRhdGEgfHwge307XG5cdFx0ZGF0YS5kYXRhc2V0cyA9IGRhdGEuZGF0YXNldHMgfHwgW107XG5cdFx0ZGF0YS5sYWJlbHMgPSBkYXRhLmxhYmVscyB8fCBbXTtcblxuXHRcdGNvbmZpZy5vcHRpb25zID0gaGVscGVycy5jb25maWdNZXJnZShcblx0XHRcdGRlZmF1bHRzLmdsb2JhbCxcblx0XHRcdGRlZmF1bHRzW2NvbmZpZy50eXBlXSxcblx0XHRcdGNvbmZpZy5vcHRpb25zIHx8IHt9KTtcblxuXHRcdHJldHVybiBjb25maWc7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgY29uZmlnIG9mIHRoZSBjaGFydFxuXHQgKiBAcGFyYW0gY2hhcnQge0NoYXJ0fSBjaGFydCB0byB1cGRhdGUgdGhlIG9wdGlvbnMgZm9yXG5cdCAqL1xuXHRmdW5jdGlvbiB1cGRhdGVDb25maWcoY2hhcnQpIHtcblx0XHR2YXIgbmV3T3B0aW9ucyA9IGNoYXJ0Lm9wdGlvbnM7XG5cblx0XHRoZWxwZXJzLmVhY2goY2hhcnQuc2NhbGVzLCBmdW5jdGlvbihzY2FsZSkge1xuXHRcdFx0bGF5b3V0cy5yZW1vdmVCb3goY2hhcnQsIHNjYWxlKTtcblx0XHR9KTtcblxuXHRcdG5ld09wdGlvbnMgPSBoZWxwZXJzLmNvbmZpZ01lcmdlKFxuXHRcdFx0Q2hhcnQuZGVmYXVsdHMuZ2xvYmFsLFxuXHRcdFx0Q2hhcnQuZGVmYXVsdHNbY2hhcnQuY29uZmlnLnR5cGVdLFxuXHRcdFx0bmV3T3B0aW9ucyk7XG5cblx0XHRjaGFydC5vcHRpb25zID0gY2hhcnQuY29uZmlnLm9wdGlvbnMgPSBuZXdPcHRpb25zO1xuXHRcdGNoYXJ0LmVuc3VyZVNjYWxlc0hhdmVJRHMoKTtcblx0XHRjaGFydC5idWlsZE9yVXBkYXRlU2NhbGVzKCk7XG5cdFx0Ly8gVG9vbHRpcFxuXHRcdGNoYXJ0LnRvb2x0aXAuX29wdGlvbnMgPSBuZXdPcHRpb25zLnRvb2x0aXBzO1xuXHRcdGNoYXJ0LnRvb2x0aXAuaW5pdGlhbGl6ZSgpO1xuXHR9XG5cblx0ZnVuY3Rpb24gcG9zaXRpb25Jc0hvcml6b250YWwocG9zaXRpb24pIHtcblx0XHRyZXR1cm4gcG9zaXRpb24gPT09ICd0b3AnIHx8IHBvc2l0aW9uID09PSAnYm90dG9tJztcblx0fVxuXG5cdGhlbHBlcnMuZXh0ZW5kKENoYXJ0LnByb3RvdHlwZSwgLyoqIEBsZW5kcyBDaGFydCAqLyB7XG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRjb25zdHJ1Y3Q6IGZ1bmN0aW9uKGl0ZW0sIGNvbmZpZykge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblxuXHRcdFx0Y29uZmlnID0gaW5pdENvbmZpZyhjb25maWcpO1xuXG5cdFx0XHR2YXIgY29udGV4dCA9IHBsYXRmb3JtLmFjcXVpcmVDb250ZXh0KGl0ZW0sIGNvbmZpZyk7XG5cdFx0XHR2YXIgY2FudmFzID0gY29udGV4dCAmJiBjb250ZXh0LmNhbnZhcztcblx0XHRcdHZhciBoZWlnaHQgPSBjYW52YXMgJiYgY2FudmFzLmhlaWdodDtcblx0XHRcdHZhciB3aWR0aCA9IGNhbnZhcyAmJiBjYW52YXMud2lkdGg7XG5cblx0XHRcdG1lLmlkID0gaGVscGVycy51aWQoKTtcblx0XHRcdG1lLmN0eCA9IGNvbnRleHQ7XG5cdFx0XHRtZS5jYW52YXMgPSBjYW52YXM7XG5cdFx0XHRtZS5jb25maWcgPSBjb25maWc7XG5cdFx0XHRtZS53aWR0aCA9IHdpZHRoO1xuXHRcdFx0bWUuaGVpZ2h0ID0gaGVpZ2h0O1xuXHRcdFx0bWUuYXNwZWN0UmF0aW8gPSBoZWlnaHQgPyB3aWR0aCAvIGhlaWdodCA6IG51bGw7XG5cdFx0XHRtZS5vcHRpb25zID0gY29uZmlnLm9wdGlvbnM7XG5cdFx0XHRtZS5fYnVmZmVyZWRSZW5kZXIgPSBmYWxzZTtcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgQ2hhcnQgYW5kIENoYXJ0LkNvbnRyb2xsZXIgaGF2ZSBiZWVuIG1lcmdlZCxcblx0XHRcdCAqIHRoZSBcImluc3RhbmNlXCIgc3RpbGwgbmVlZCB0byBiZSBkZWZpbmVkIHNpbmNlIGl0IG1pZ2h0IGJlIGNhbGxlZCBmcm9tIHBsdWdpbnMuXG5cdFx0XHQgKiBAcHJvcCBDaGFydCNjaGFydFxuXHRcdFx0ICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjYuMFxuXHRcdFx0ICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqL1xuXHRcdFx0bWUuY2hhcnQgPSBtZTtcblx0XHRcdG1lLmNvbnRyb2xsZXIgPSBtZTsgLy8gY2hhcnQuY2hhcnQuY29udHJvbGxlciAjaW5jZXB0aW9uXG5cblx0XHRcdC8vIEFkZCB0aGUgY2hhcnQgaW5zdGFuY2UgdG8gdGhlIGdsb2JhbCBuYW1lc3BhY2Vcblx0XHRcdENoYXJ0Lmluc3RhbmNlc1ttZS5pZF0gPSBtZTtcblxuXHRcdFx0Ly8gRGVmaW5lIGFsaWFzIHRvIHRoZSBjb25maWcgZGF0YTogYGNoYXJ0LmRhdGEgPT09IGNoYXJ0LmNvbmZpZy5kYXRhYFxuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1lLCAnZGF0YScsIHtcblx0XHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gbWUuY29uZmlnLmRhdGE7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNldDogZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdFx0XHRtZS5jb25maWcuZGF0YSA9IHZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKCFjb250ZXh0IHx8ICFjYW52YXMpIHtcblx0XHRcdFx0Ly8gVGhlIGdpdmVuIGl0ZW0gaXMgbm90IGEgY29tcGF0aWJsZSBjb250ZXh0MmQgZWxlbWVudCwgbGV0J3MgcmV0dXJuIGJlZm9yZSBmaW5hbGl6aW5nXG5cdFx0XHRcdC8vIHRoZSBjaGFydCBpbml0aWFsaXphdGlvbiBidXQgYWZ0ZXIgc2V0dGluZyBiYXNpYyBjaGFydCAvIGNvbnRyb2xsZXIgcHJvcGVydGllcyB0aGF0XG5cdFx0XHRcdC8vIGNhbiBoZWxwIHRvIGZpZ3VyZSBvdXQgdGhhdCB0aGUgY2hhcnQgaXMgbm90IHZhbGlkIChlLmcgY2hhcnQuY2FudmFzICE9PSBudWxsKTtcblx0XHRcdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzI4MDdcblx0XHRcdFx0Y29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBjcmVhdGUgY2hhcnQ6IGNhbid0IGFjcXVpcmUgY29udGV4dCBmcm9tIHRoZSBnaXZlbiBpdGVtXCIpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdG1lLmluaXRpYWxpemUoKTtcblx0XHRcdG1lLnVwZGF0ZSgpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblxuXHRcdFx0Ly8gQmVmb3JlIGluaXQgcGx1Z2luIG5vdGlmaWNhdGlvblxuXHRcdFx0cGx1Z2lucy5ub3RpZnkobWUsICdiZWZvcmVJbml0Jyk7XG5cblx0XHRcdGhlbHBlcnMucmV0aW5hU2NhbGUobWUsIG1lLm9wdGlvbnMuZGV2aWNlUGl4ZWxSYXRpbyk7XG5cblx0XHRcdG1lLmJpbmRFdmVudHMoKTtcblxuXHRcdFx0aWYgKG1lLm9wdGlvbnMucmVzcG9uc2l2ZSkge1xuXHRcdFx0XHQvLyBJbml0aWFsIHJlc2l6ZSBiZWZvcmUgY2hhcnQgZHJhd3MgKG11c3QgYmUgc2lsZW50IHRvIHByZXNlcnZlIGluaXRpYWwgYW5pbWF0aW9ucykuXG5cdFx0XHRcdG1lLnJlc2l6ZSh0cnVlKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHNjYWxlcyBoYXZlIElEcyBhbmQgYXJlIGJ1aWx0IGJlZm9yZSB3ZSBidWlsZCBhbnkgY29udHJvbGxlcnMuXG5cdFx0XHRtZS5lbnN1cmVTY2FsZXNIYXZlSURzKCk7XG5cdFx0XHRtZS5idWlsZE9yVXBkYXRlU2NhbGVzKCk7XG5cdFx0XHRtZS5pbml0VG9vbFRpcCgpO1xuXG5cdFx0XHQvLyBBZnRlciBpbml0IHBsdWdpbiBub3RpZmljYXRpb25cblx0XHRcdHBsdWdpbnMubm90aWZ5KG1lLCAnYWZ0ZXJJbml0Jyk7XG5cblx0XHRcdHJldHVybiBtZTtcblx0XHR9LFxuXG5cdFx0Y2xlYXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aGVscGVycy5jYW52YXMuY2xlYXIodGhpcyk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9LFxuXG5cdFx0c3RvcDogZnVuY3Rpb24oKSB7XG5cdFx0XHQvLyBTdG9wcyBhbnkgY3VycmVudCBhbmltYXRpb24gbG9vcCBvY2N1cnJpbmdcblx0XHRcdGFuaW1hdGlvbnMuY2FuY2VsQW5pbWF0aW9uKHRoaXMpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fSxcblxuXHRcdHJlc2l6ZTogZnVuY3Rpb24oc2lsZW50KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG9wdGlvbnMgPSBtZS5vcHRpb25zO1xuXHRcdFx0dmFyIGNhbnZhcyA9IG1lLmNhbnZhcztcblx0XHRcdHZhciBhc3BlY3RSYXRpbyA9IChvcHRpb25zLm1haW50YWluQXNwZWN0UmF0aW8gJiYgbWUuYXNwZWN0UmF0aW8pIHx8IG51bGw7XG5cblx0XHRcdC8vIHRoZSBjYW52YXMgcmVuZGVyIHdpZHRoIGFuZCBoZWlnaHQgd2lsbCBiZSBjYXN0ZWQgdG8gaW50ZWdlcnMgc28gbWFrZSBzdXJlIHRoYXRcblx0XHRcdC8vIHRoZSBjYW52YXMgZGlzcGxheSBzdHlsZSB1c2VzIHRoZSBzYW1lIGludGVnZXIgdmFsdWVzIHRvIGF2b2lkIGJsdXJyaW5nIGVmZmVjdC5cblxuXHRcdFx0Ly8gU2V0IHRvIDAgaW5zdGVhZCBvZiBjYW52YXMuc2l6ZSBiZWNhdXNlIHRoZSBzaXplIGRlZmF1bHRzIHRvIDMwMHgxNTAgaWYgdGhlIGVsZW1lbnQgaXMgY29sbGFwc2VkXG5cdFx0XHR2YXIgbmV3V2lkdGggPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKGhlbHBlcnMuZ2V0TWF4aW11bVdpZHRoKGNhbnZhcykpKTtcblx0XHRcdHZhciBuZXdIZWlnaHQgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKGFzcGVjdFJhdGlvID8gbmV3V2lkdGggLyBhc3BlY3RSYXRpbyA6IGhlbHBlcnMuZ2V0TWF4aW11bUhlaWdodChjYW52YXMpKSk7XG5cblx0XHRcdGlmIChtZS53aWR0aCA9PT0gbmV3V2lkdGggJiYgbWUuaGVpZ2h0ID09PSBuZXdIZWlnaHQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjYW52YXMud2lkdGggPSBtZS53aWR0aCA9IG5ld1dpZHRoO1xuXHRcdFx0Y2FudmFzLmhlaWdodCA9IG1lLmhlaWdodCA9IG5ld0hlaWdodDtcblx0XHRcdGNhbnZhcy5zdHlsZS53aWR0aCA9IG5ld1dpZHRoICsgJ3B4Jztcblx0XHRcdGNhbnZhcy5zdHlsZS5oZWlnaHQgPSBuZXdIZWlnaHQgKyAncHgnO1xuXG5cdFx0XHRoZWxwZXJzLnJldGluYVNjYWxlKG1lLCBvcHRpb25zLmRldmljZVBpeGVsUmF0aW8pO1xuXG5cdFx0XHRpZiAoIXNpbGVudCkge1xuXHRcdFx0XHQvLyBOb3RpZnkgYW55IHBsdWdpbnMgYWJvdXQgdGhlIHJlc2l6ZVxuXHRcdFx0XHR2YXIgbmV3U2l6ZSA9IHt3aWR0aDogbmV3V2lkdGgsIGhlaWdodDogbmV3SGVpZ2h0fTtcblx0XHRcdFx0cGx1Z2lucy5ub3RpZnkobWUsICdyZXNpemUnLCBbbmV3U2l6ZV0pO1xuXG5cdFx0XHRcdC8vIE5vdGlmeSBvZiByZXNpemVcblx0XHRcdFx0aWYgKG1lLm9wdGlvbnMub25SZXNpemUpIHtcblx0XHRcdFx0XHRtZS5vcHRpb25zLm9uUmVzaXplKG1lLCBuZXdTaXplKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdG1lLnN0b3AoKTtcblx0XHRcdFx0bWUudXBkYXRlKHtcblx0XHRcdFx0XHRkdXJhdGlvbjogbWUub3B0aW9ucy5yZXNwb25zaXZlQW5pbWF0aW9uRHVyYXRpb25cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGVuc3VyZVNjYWxlc0hhdmVJRHM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cdFx0XHR2YXIgc2NhbGVzT3B0aW9ucyA9IG9wdGlvbnMuc2NhbGVzIHx8IHt9O1xuXHRcdFx0dmFyIHNjYWxlT3B0aW9ucyA9IG9wdGlvbnMuc2NhbGU7XG5cblx0XHRcdGhlbHBlcnMuZWFjaChzY2FsZXNPcHRpb25zLnhBeGVzLCBmdW5jdGlvbih4QXhpc09wdGlvbnMsIGluZGV4KSB7XG5cdFx0XHRcdHhBeGlzT3B0aW9ucy5pZCA9IHhBeGlzT3B0aW9ucy5pZCB8fCAoJ3gtYXhpcy0nICsgaW5kZXgpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGhlbHBlcnMuZWFjaChzY2FsZXNPcHRpb25zLnlBeGVzLCBmdW5jdGlvbih5QXhpc09wdGlvbnMsIGluZGV4KSB7XG5cdFx0XHRcdHlBeGlzT3B0aW9ucy5pZCA9IHlBeGlzT3B0aW9ucy5pZCB8fCAoJ3ktYXhpcy0nICsgaW5kZXgpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGlmIChzY2FsZU9wdGlvbnMpIHtcblx0XHRcdFx0c2NhbGVPcHRpb25zLmlkID0gc2NhbGVPcHRpb25zLmlkIHx8ICdzY2FsZSc7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEJ1aWxkcyBhIG1hcCBvZiBzY2FsZSBJRCB0byBzY2FsZSBvYmplY3QgZm9yIGZ1dHVyZSBsb29rdXAuXG5cdFx0ICovXG5cdFx0YnVpbGRPclVwZGF0ZVNjYWxlczogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG9wdGlvbnMgPSBtZS5vcHRpb25zO1xuXHRcdFx0dmFyIHNjYWxlcyA9IG1lLnNjYWxlcyB8fCB7fTtcblx0XHRcdHZhciBpdGVtcyA9IFtdO1xuXHRcdFx0dmFyIHVwZGF0ZWQgPSBPYmplY3Qua2V5cyhzY2FsZXMpLnJlZHVjZShmdW5jdGlvbihvYmosIGlkKSB7XG5cdFx0XHRcdG9ialtpZF0gPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuIG9iajtcblx0XHRcdH0sIHt9KTtcblxuXHRcdFx0aWYgKG9wdGlvbnMuc2NhbGVzKSB7XG5cdFx0XHRcdGl0ZW1zID0gaXRlbXMuY29uY2F0KFxuXHRcdFx0XHRcdChvcHRpb25zLnNjYWxlcy54QXhlcyB8fCBbXSkubWFwKGZ1bmN0aW9uKHhBeGlzT3B0aW9ucykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHtvcHRpb25zOiB4QXhpc09wdGlvbnMsIGR0eXBlOiAnY2F0ZWdvcnknLCBkcG9zaXRpb246ICdib3R0b20nfTtcblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0XHQob3B0aW9ucy5zY2FsZXMueUF4ZXMgfHwgW10pLm1hcChmdW5jdGlvbih5QXhpc09wdGlvbnMpIHtcblx0XHRcdFx0XHRcdHJldHVybiB7b3B0aW9uczogeUF4aXNPcHRpb25zLCBkdHlwZTogJ2xpbmVhcicsIGRwb3NpdGlvbjogJ2xlZnQnfTtcblx0XHRcdFx0XHR9KVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob3B0aW9ucy5zY2FsZSkge1xuXHRcdFx0XHRpdGVtcy5wdXNoKHtcblx0XHRcdFx0XHRvcHRpb25zOiBvcHRpb25zLnNjYWxlLFxuXHRcdFx0XHRcdGR0eXBlOiAncmFkaWFsTGluZWFyJyxcblx0XHRcdFx0XHRpc0RlZmF1bHQ6IHRydWUsXG5cdFx0XHRcdFx0ZHBvc2l0aW9uOiAnY2hhcnRBcmVhJ1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aGVscGVycy5lYWNoKGl0ZW1zLCBmdW5jdGlvbihpdGVtKSB7XG5cdFx0XHRcdHZhciBzY2FsZU9wdGlvbnMgPSBpdGVtLm9wdGlvbnM7XG5cdFx0XHRcdHZhciBpZCA9IHNjYWxlT3B0aW9ucy5pZDtcblx0XHRcdFx0dmFyIHNjYWxlVHlwZSA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQoc2NhbGVPcHRpb25zLnR5cGUsIGl0ZW0uZHR5cGUpO1xuXG5cdFx0XHRcdGlmIChwb3NpdGlvbklzSG9yaXpvbnRhbChzY2FsZU9wdGlvbnMucG9zaXRpb24pICE9PSBwb3NpdGlvbklzSG9yaXpvbnRhbChpdGVtLmRwb3NpdGlvbikpIHtcblx0XHRcdFx0XHRzY2FsZU9wdGlvbnMucG9zaXRpb24gPSBpdGVtLmRwb3NpdGlvbjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHVwZGF0ZWRbaWRdID0gdHJ1ZTtcblx0XHRcdFx0dmFyIHNjYWxlID0gbnVsbDtcblx0XHRcdFx0aWYgKGlkIGluIHNjYWxlcyAmJiBzY2FsZXNbaWRdLnR5cGUgPT09IHNjYWxlVHlwZSkge1xuXHRcdFx0XHRcdHNjYWxlID0gc2NhbGVzW2lkXTtcblx0XHRcdFx0XHRzY2FsZS5vcHRpb25zID0gc2NhbGVPcHRpb25zO1xuXHRcdFx0XHRcdHNjYWxlLmN0eCA9IG1lLmN0eDtcblx0XHRcdFx0XHRzY2FsZS5jaGFydCA9IG1lO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHZhciBzY2FsZUNsYXNzID0gc2NhbGVTZXJ2aWNlLmdldFNjYWxlQ29uc3RydWN0b3Ioc2NhbGVUeXBlKTtcblx0XHRcdFx0XHRpZiAoIXNjYWxlQ2xhc3MpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0c2NhbGUgPSBuZXcgc2NhbGVDbGFzcyh7XG5cdFx0XHRcdFx0XHRpZDogaWQsXG5cdFx0XHRcdFx0XHR0eXBlOiBzY2FsZVR5cGUsXG5cdFx0XHRcdFx0XHRvcHRpb25zOiBzY2FsZU9wdGlvbnMsXG5cdFx0XHRcdFx0XHRjdHg6IG1lLmN0eCxcblx0XHRcdFx0XHRcdGNoYXJ0OiBtZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHNjYWxlc1tzY2FsZS5pZF0gPSBzY2FsZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHNjYWxlLm1lcmdlVGlja3NPcHRpb25zKCk7XG5cblx0XHRcdFx0Ly8gVE9ETyhTQik6IEkgdGhpbmsgd2Ugc2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlIHRoaXMgY3VzdG9tIGNhc2UgKG9wdGlvbnMuc2NhbGUpXG5cdFx0XHRcdC8vIGFuZCBjb25zaWRlciBpdCBhcyBhIHJlZ3VsYXIgc2NhbGUgcGFydCBvZiB0aGUgXCJzY2FsZXNcIlwiIG1hcCBvbmx5ISBUaGlzIHdvdWxkXG5cdFx0XHRcdC8vIG1ha2UgdGhlIGxvZ2ljIGVhc2llciBhbmQgcmVtb3ZlIHNvbWUgdXNlbGVzcz8gY3VzdG9tIGNvZGUuXG5cdFx0XHRcdGlmIChpdGVtLmlzRGVmYXVsdCkge1xuXHRcdFx0XHRcdG1lLnNjYWxlID0gc2NhbGU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Ly8gY2xlYXIgdXAgZGlzY2FyZGVkIHNjYWxlc1xuXHRcdFx0aGVscGVycy5lYWNoKHVwZGF0ZWQsIGZ1bmN0aW9uKGhhc1VwZGF0ZWQsIGlkKSB7XG5cdFx0XHRcdGlmICghaGFzVXBkYXRlZCkge1xuXHRcdFx0XHRcdGRlbGV0ZSBzY2FsZXNbaWRdO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0bWUuc2NhbGVzID0gc2NhbGVzO1xuXG5cdFx0XHRzY2FsZVNlcnZpY2UuYWRkU2NhbGVzVG9MYXlvdXQodGhpcyk7XG5cdFx0fSxcblxuXHRcdGJ1aWxkT3JVcGRhdGVDb250cm9sbGVyczogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIHR5cGVzID0gW107XG5cdFx0XHR2YXIgbmV3Q29udHJvbGxlcnMgPSBbXTtcblxuXHRcdFx0aGVscGVycy5lYWNoKG1lLmRhdGEuZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0XHR2YXIgbWV0YSA9IG1lLmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG5cdFx0XHRcdHZhciB0eXBlID0gZGF0YXNldC50eXBlIHx8IG1lLmNvbmZpZy50eXBlO1xuXG5cdFx0XHRcdGlmIChtZXRhLnR5cGUgJiYgbWV0YS50eXBlICE9PSB0eXBlKSB7XG5cdFx0XHRcdFx0bWUuZGVzdHJveURhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG5cdFx0XHRcdFx0bWV0YSA9IG1lLmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0bWV0YS50eXBlID0gdHlwZTtcblxuXHRcdFx0XHR0eXBlcy5wdXNoKG1ldGEudHlwZSk7XG5cblx0XHRcdFx0aWYgKG1ldGEuY29udHJvbGxlcikge1xuXHRcdFx0XHRcdG1ldGEuY29udHJvbGxlci51cGRhdGVJbmRleChkYXRhc2V0SW5kZXgpO1xuXHRcdFx0XHRcdG1ldGEuY29udHJvbGxlci5saW5rU2NhbGVzKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFyIENvbnRyb2xsZXJDbGFzcyA9IENoYXJ0LmNvbnRyb2xsZXJzW21ldGEudHlwZV07XG5cdFx0XHRcdFx0aWYgKENvbnRyb2xsZXJDbGFzcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIG1ldGEudHlwZSArICdcIiBpcyBub3QgYSBjaGFydCB0eXBlLicpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG1ldGEuY29udHJvbGxlciA9IG5ldyBDb250cm9sbGVyQ2xhc3MobWUsIGRhdGFzZXRJbmRleCk7XG5cdFx0XHRcdFx0bmV3Q29udHJvbGxlcnMucHVzaChtZXRhLmNvbnRyb2xsZXIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCBtZSk7XG5cblx0XHRcdHJldHVybiBuZXdDb250cm9sbGVycztcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogUmVzZXQgdGhlIGVsZW1lbnRzIG9mIGFsbCBkYXRhc2V0c1xuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0cmVzZXRFbGVtZW50czogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0aGVscGVycy5lYWNoKG1lLmRhdGEuZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0XHRtZS5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpLmNvbnRyb2xsZXIucmVzZXQoKTtcblx0XHRcdH0sIG1lKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0KiBSZXNldHMgdGhlIGNoYXJ0IGJhY2sgdG8gaXQncyBzdGF0ZSBiZWZvcmUgdGhlIGluaXRpYWwgYW5pbWF0aW9uXG5cdFx0Ki9cblx0XHRyZXNldDogZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLnJlc2V0RWxlbWVudHMoKTtcblx0XHRcdHRoaXMudG9vbHRpcC5pbml0aWFsaXplKCk7XG5cdFx0fSxcblxuXHRcdHVwZGF0ZTogZnVuY3Rpb24oY29uZmlnKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXG5cdFx0XHRpZiAoIWNvbmZpZyB8fCB0eXBlb2YgY29uZmlnICE9PSAnb2JqZWN0Jykge1xuXHRcdFx0XHQvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXHRcdFx0XHRjb25maWcgPSB7XG5cdFx0XHRcdFx0ZHVyYXRpb246IGNvbmZpZyxcblx0XHRcdFx0XHRsYXp5OiBhcmd1bWVudHNbMV1cblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0dXBkYXRlQ29uZmlnKG1lKTtcblxuXHRcdFx0Ly8gcGx1Z2lucyBvcHRpb25zIHJlZmVyZW5jZXMgbWlnaHQgaGF2ZSBjaGFuZ2UsIGxldCdzIGludmFsaWRhdGUgdGhlIGNhY2hlXG5cdFx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvNTExMSNpc3N1ZWNvbW1lbnQtMzU1OTM0MTY3XG5cdFx0XHRwbHVnaW5zLl9pbnZhbGlkYXRlKG1lKTtcblxuXHRcdFx0aWYgKHBsdWdpbnMubm90aWZ5KG1lLCAnYmVmb3JlVXBkYXRlJykgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSW4gY2FzZSB0aGUgZW50aXJlIGRhdGEgb2JqZWN0IGNoYW5nZWRcblx0XHRcdG1lLnRvb2x0aXAuX2RhdGEgPSBtZS5kYXRhO1xuXG5cdFx0XHQvLyBNYWtlIHN1cmUgZGF0YXNldCBjb250cm9sbGVycyBhcmUgdXBkYXRlZCBhbmQgbmV3IGNvbnRyb2xsZXJzIGFyZSByZXNldFxuXHRcdFx0dmFyIG5ld0NvbnRyb2xsZXJzID0gbWUuYnVpbGRPclVwZGF0ZUNvbnRyb2xsZXJzKCk7XG5cblx0XHRcdC8vIE1ha2Ugc3VyZSBhbGwgZGF0YXNldCBjb250cm9sbGVycyBoYXZlIGNvcnJlY3QgbWV0YSBkYXRhIGNvdW50c1xuXHRcdFx0aGVscGVycy5lYWNoKG1lLmRhdGEuZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0XHRtZS5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpLmNvbnRyb2xsZXIuYnVpbGRPclVwZGF0ZUVsZW1lbnRzKCk7XG5cdFx0XHR9LCBtZSk7XG5cblx0XHRcdG1lLnVwZGF0ZUxheW91dCgpO1xuXG5cdFx0XHQvLyBDYW4gb25seSByZXNldCB0aGUgbmV3IGNvbnRyb2xsZXJzIGFmdGVyIHRoZSBzY2FsZXMgaGF2ZSBiZWVuIHVwZGF0ZWRcblx0XHRcdGlmIChtZS5vcHRpb25zLmFuaW1hdGlvbiAmJiBtZS5vcHRpb25zLmFuaW1hdGlvbi5kdXJhdGlvbikge1xuXHRcdFx0XHRoZWxwZXJzLmVhY2gobmV3Q29udHJvbGxlcnMsIGZ1bmN0aW9uKGNvbnRyb2xsZXIpIHtcblx0XHRcdFx0XHRjb250cm9sbGVyLnJlc2V0KCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRtZS51cGRhdGVEYXRhc2V0cygpO1xuXG5cdFx0XHQvLyBOZWVkIHRvIHJlc2V0IHRvb2x0aXAgaW4gY2FzZSBpdCBpcyBkaXNwbGF5ZWQgd2l0aCBlbGVtZW50cyB0aGF0IGFyZSByZW1vdmVkXG5cdFx0XHQvLyBhZnRlciB1cGRhdGUuXG5cdFx0XHRtZS50b29sdGlwLmluaXRpYWxpemUoKTtcblxuXHRcdFx0Ly8gTGFzdCBhY3RpdmUgY29udGFpbnMgaXRlbXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgaW4gdGhlIHRvb2x0aXAuXG5cdFx0XHQvLyBXaGVuIHdlIHJlc2V0IHRoZSB0b29sdGlwLCB3ZSBuZWVkIHRvIGNsZWFyIGl0XG5cdFx0XHRtZS5sYXN0QWN0aXZlID0gW107XG5cblx0XHRcdC8vIERvIHRoaXMgYmVmb3JlIHJlbmRlciBzbyB0aGF0IGFueSBwbHVnaW5zIHRoYXQgbmVlZCBmaW5hbCBzY2FsZSB1cGRhdGVzIGNhbiB1c2UgaXRcblx0XHRcdHBsdWdpbnMubm90aWZ5KG1lLCAnYWZ0ZXJVcGRhdGUnKTtcblxuXHRcdFx0aWYgKG1lLl9idWZmZXJlZFJlbmRlcikge1xuXHRcdFx0XHRtZS5fYnVmZmVyZWRSZXF1ZXN0ID0ge1xuXHRcdFx0XHRcdGR1cmF0aW9uOiBjb25maWcuZHVyYXRpb24sXG5cdFx0XHRcdFx0ZWFzaW5nOiBjb25maWcuZWFzaW5nLFxuXHRcdFx0XHRcdGxhenk6IGNvbmZpZy5sYXp5XG5cdFx0XHRcdH07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtZS5yZW5kZXIoY29uZmlnKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogVXBkYXRlcyB0aGUgY2hhcnQgbGF5b3V0IHVubGVzcyBhIHBsdWdpbiByZXR1cm5zIGBmYWxzZWAgdG8gdGhlIGBiZWZvcmVMYXlvdXRgXG5cdFx0ICogaG9vaywgaW4gd2hpY2ggY2FzZSwgcGx1Z2lucyB3aWxsIG5vdCBiZSBjYWxsZWQgb24gYGFmdGVyTGF5b3V0YC5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHVwZGF0ZUxheW91dDogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXG5cdFx0XHRpZiAocGx1Z2lucy5ub3RpZnkobWUsICdiZWZvcmVMYXlvdXQnKSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRsYXlvdXRzLnVwZGF0ZSh0aGlzLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG5cblx0XHRcdC8qKlxuXHRcdFx0ICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBgYWZ0ZXJMYXlvdXRgIGluc3RlYWQuXG5cdFx0XHQgKiBAbWV0aG9kIElQbHVnaW4jYWZ0ZXJTY2FsZVVwZGF0ZVxuXHRcdFx0ICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjUuMFxuXHRcdFx0ICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuXHRcdFx0ICogQHByaXZhdGVcblx0XHRcdCAqL1xuXHRcdFx0cGx1Z2lucy5ub3RpZnkobWUsICdhZnRlclNjYWxlVXBkYXRlJyk7XG5cdFx0XHRwbHVnaW5zLm5vdGlmeShtZSwgJ2FmdGVyTGF5b3V0Jyk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFVwZGF0ZXMgYWxsIGRhdGFzZXRzIHVubGVzcyBhIHBsdWdpbiByZXR1cm5zIGBmYWxzZWAgdG8gdGhlIGBiZWZvcmVEYXRhc2V0c1VwZGF0ZWBcblx0XHQgKiBob29rLCBpbiB3aGljaCBjYXNlLCBwbHVnaW5zIHdpbGwgbm90IGJlIGNhbGxlZCBvbiBgYWZ0ZXJEYXRhc2V0c1VwZGF0ZWAuXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHR1cGRhdGVEYXRhc2V0czogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXG5cdFx0XHRpZiAocGx1Z2lucy5ub3RpZnkobWUsICdiZWZvcmVEYXRhc2V0c1VwZGF0ZScpID09PSBmYWxzZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGZvciAodmFyIGkgPSAwLCBpbGVuID0gbWUuZGF0YS5kYXRhc2V0cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdFx0bWUudXBkYXRlRGF0YXNldChpKTtcblx0XHRcdH1cblxuXHRcdFx0cGx1Z2lucy5ub3RpZnkobWUsICdhZnRlckRhdGFzZXRzVXBkYXRlJyk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFVwZGF0ZXMgZGF0YXNldCBhdCBpbmRleCB1bmxlc3MgYSBwbHVnaW4gcmV0dXJucyBgZmFsc2VgIHRvIHRoZSBgYmVmb3JlRGF0YXNldFVwZGF0ZWBcblx0XHQgKiBob29rLCBpbiB3aGljaCBjYXNlLCBwbHVnaW5zIHdpbGwgbm90IGJlIGNhbGxlZCBvbiBgYWZ0ZXJEYXRhc2V0VXBkYXRlYC5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHVwZGF0ZURhdGFzZXQ6IGZ1bmN0aW9uKGluZGV4KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG1ldGEgPSBtZS5nZXREYXRhc2V0TWV0YShpbmRleCk7XG5cdFx0XHR2YXIgYXJncyA9IHtcblx0XHRcdFx0bWV0YTogbWV0YSxcblx0XHRcdFx0aW5kZXg6IGluZGV4XG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAocGx1Z2lucy5ub3RpZnkobWUsICdiZWZvcmVEYXRhc2V0VXBkYXRlJywgW2FyZ3NdKSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRtZXRhLmNvbnRyb2xsZXIudXBkYXRlKCk7XG5cblx0XHRcdHBsdWdpbnMubm90aWZ5KG1lLCAnYWZ0ZXJEYXRhc2V0VXBkYXRlJywgW2FyZ3NdKTtcblx0XHR9LFxuXG5cdFx0cmVuZGVyOiBmdW5jdGlvbihjb25maWcpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cblx0XHRcdGlmICghY29uZmlnIHx8IHR5cGVvZiBjb25maWcgIT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cdFx0XHRcdGNvbmZpZyA9IHtcblx0XHRcdFx0XHRkdXJhdGlvbjogY29uZmlnLFxuXHRcdFx0XHRcdGxhenk6IGFyZ3VtZW50c1sxXVxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZHVyYXRpb24gPSBjb25maWcuZHVyYXRpb247XG5cdFx0XHR2YXIgbGF6eSA9IGNvbmZpZy5sYXp5O1xuXG5cdFx0XHRpZiAocGx1Z2lucy5ub3RpZnkobWUsICdiZWZvcmVSZW5kZXInKSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgYW5pbWF0aW9uT3B0aW9ucyA9IG1lLm9wdGlvbnMuYW5pbWF0aW9uO1xuXHRcdFx0dmFyIG9uQ29tcGxldGUgPSBmdW5jdGlvbihhbmltYXRpb24pIHtcblx0XHRcdFx0cGx1Z2lucy5ub3RpZnkobWUsICdhZnRlclJlbmRlcicpO1xuXHRcdFx0XHRoZWxwZXJzLmNhbGxiYWNrKGFuaW1hdGlvbk9wdGlvbnMgJiYgYW5pbWF0aW9uT3B0aW9ucy5vbkNvbXBsZXRlLCBbYW5pbWF0aW9uXSwgbWUpO1xuXHRcdFx0fTtcblxuXHRcdFx0aWYgKGFuaW1hdGlvbk9wdGlvbnMgJiYgKCh0eXBlb2YgZHVyYXRpb24gIT09ICd1bmRlZmluZWQnICYmIGR1cmF0aW9uICE9PSAwKSB8fCAodHlwZW9mIGR1cmF0aW9uID09PSAndW5kZWZpbmVkJyAmJiBhbmltYXRpb25PcHRpb25zLmR1cmF0aW9uICE9PSAwKSkpIHtcblx0XHRcdFx0dmFyIGFuaW1hdGlvbiA9IG5ldyBBbmltYXRpb24oe1xuXHRcdFx0XHRcdG51bVN0ZXBzOiAoZHVyYXRpb24gfHwgYW5pbWF0aW9uT3B0aW9ucy5kdXJhdGlvbikgLyAxNi42NiwgLy8gNjAgZnBzXG5cdFx0XHRcdFx0ZWFzaW5nOiBjb25maWcuZWFzaW5nIHx8IGFuaW1hdGlvbk9wdGlvbnMuZWFzaW5nLFxuXG5cdFx0XHRcdFx0cmVuZGVyOiBmdW5jdGlvbihjaGFydCwgYW5pbWF0aW9uT2JqZWN0KSB7XG5cdFx0XHRcdFx0XHR2YXIgZWFzaW5nRnVuY3Rpb24gPSBoZWxwZXJzLmVhc2luZy5lZmZlY3RzW2FuaW1hdGlvbk9iamVjdC5lYXNpbmddO1xuXHRcdFx0XHRcdFx0dmFyIGN1cnJlbnRTdGVwID0gYW5pbWF0aW9uT2JqZWN0LmN1cnJlbnRTdGVwO1xuXHRcdFx0XHRcdFx0dmFyIHN0ZXBEZWNpbWFsID0gY3VycmVudFN0ZXAgLyBhbmltYXRpb25PYmplY3QubnVtU3RlcHM7XG5cblx0XHRcdFx0XHRcdGNoYXJ0LmRyYXcoZWFzaW5nRnVuY3Rpb24oc3RlcERlY2ltYWwpLCBzdGVwRGVjaW1hbCwgY3VycmVudFN0ZXApO1xuXHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHRvbkFuaW1hdGlvblByb2dyZXNzOiBhbmltYXRpb25PcHRpb25zLm9uUHJvZ3Jlc3MsXG5cdFx0XHRcdFx0b25BbmltYXRpb25Db21wbGV0ZTogb25Db21wbGV0ZVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRhbmltYXRpb25zLmFkZEFuaW1hdGlvbihtZSwgYW5pbWF0aW9uLCBkdXJhdGlvbiwgbGF6eSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtZS5kcmF3KCk7XG5cblx0XHRcdFx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy8zNzgxXG5cdFx0XHRcdG9uQ29tcGxldGUobmV3IEFuaW1hdGlvbih7bnVtU3RlcHM6IDAsIGNoYXJ0OiBtZX0pKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1lO1xuXHRcdH0sXG5cblx0XHRkcmF3OiBmdW5jdGlvbihlYXNpbmdWYWx1ZSkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblxuXHRcdFx0bWUuY2xlYXIoKTtcblxuXHRcdFx0aWYgKGhlbHBlcnMuaXNOdWxsT3JVbmRlZihlYXNpbmdWYWx1ZSkpIHtcblx0XHRcdFx0ZWFzaW5nVmFsdWUgPSAxO1xuXHRcdFx0fVxuXG5cdFx0XHRtZS50cmFuc2l0aW9uKGVhc2luZ1ZhbHVlKTtcblxuXHRcdFx0aWYgKG1lLndpZHRoIDw9IDAgfHwgbWUuaGVpZ2h0IDw9IDApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocGx1Z2lucy5ub3RpZnkobWUsICdiZWZvcmVEcmF3JywgW2Vhc2luZ1ZhbHVlXSkgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRHJhdyBhbGwgdGhlIHNjYWxlc1xuXHRcdFx0aGVscGVycy5lYWNoKG1lLmJveGVzLCBmdW5jdGlvbihib3gpIHtcblx0XHRcdFx0Ym94LmRyYXcobWUuY2hhcnRBcmVhKTtcblx0XHRcdH0sIG1lKTtcblxuXHRcdFx0aWYgKG1lLnNjYWxlKSB7XG5cdFx0XHRcdG1lLnNjYWxlLmRyYXcoKTtcblx0XHRcdH1cblxuXHRcdFx0bWUuZHJhd0RhdGFzZXRzKGVhc2luZ1ZhbHVlKTtcblx0XHRcdG1lLl9kcmF3VG9vbHRpcChlYXNpbmdWYWx1ZSk7XG5cblx0XHRcdHBsdWdpbnMubm90aWZ5KG1lLCAnYWZ0ZXJEcmF3JywgW2Vhc2luZ1ZhbHVlXSk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0dHJhbnNpdGlvbjogZnVuY3Rpb24oZWFzaW5nVmFsdWUpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cblx0XHRcdGZvciAodmFyIGkgPSAwLCBpbGVuID0gKG1lLmRhdGEuZGF0YXNldHMgfHwgW10pLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0XHRpZiAobWUuaXNEYXRhc2V0VmlzaWJsZShpKSkge1xuXHRcdFx0XHRcdG1lLmdldERhdGFzZXRNZXRhKGkpLmNvbnRyb2xsZXIudHJhbnNpdGlvbihlYXNpbmdWYWx1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0bWUudG9vbHRpcC50cmFuc2l0aW9uKGVhc2luZ1ZhbHVlKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogRHJhd3MgYWxsIGRhdGFzZXRzIHVubGVzcyBhIHBsdWdpbiByZXR1cm5zIGBmYWxzZWAgdG8gdGhlIGBiZWZvcmVEYXRhc2V0c0RyYXdgXG5cdFx0ICogaG9vaywgaW4gd2hpY2ggY2FzZSwgcGx1Z2lucyB3aWxsIG5vdCBiZSBjYWxsZWQgb24gYGFmdGVyRGF0YXNldHNEcmF3YC5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGRyYXdEYXRhc2V0czogZnVuY3Rpb24oZWFzaW5nVmFsdWUpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cblx0XHRcdGlmIChwbHVnaW5zLm5vdGlmeShtZSwgJ2JlZm9yZURhdGFzZXRzRHJhdycsIFtlYXNpbmdWYWx1ZV0pID09PSBmYWxzZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIERyYXcgZGF0YXNldHMgcmV2ZXJzZWQgdG8gc3VwcG9ydCBwcm9wZXIgbGluZSBzdGFja2luZ1xuXHRcdFx0Zm9yICh2YXIgaSA9IChtZS5kYXRhLmRhdGFzZXRzIHx8IFtdKS5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuXHRcdFx0XHRpZiAobWUuaXNEYXRhc2V0VmlzaWJsZShpKSkge1xuXHRcdFx0XHRcdG1lLmRyYXdEYXRhc2V0KGksIGVhc2luZ1ZhbHVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRwbHVnaW5zLm5vdGlmeShtZSwgJ2FmdGVyRGF0YXNldHNEcmF3JywgW2Vhc2luZ1ZhbHVlXSk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIERyYXdzIGRhdGFzZXQgYXQgaW5kZXggdW5sZXNzIGEgcGx1Z2luIHJldHVybnMgYGZhbHNlYCB0byB0aGUgYGJlZm9yZURhdGFzZXREcmF3YFxuXHRcdCAqIGhvb2ssIGluIHdoaWNoIGNhc2UsIHBsdWdpbnMgd2lsbCBub3QgYmUgY2FsbGVkIG9uIGBhZnRlckRhdGFzZXREcmF3YC5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGRyYXdEYXRhc2V0OiBmdW5jdGlvbihpbmRleCwgZWFzaW5nVmFsdWUpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgbWV0YSA9IG1lLmdldERhdGFzZXRNZXRhKGluZGV4KTtcblx0XHRcdHZhciBhcmdzID0ge1xuXHRcdFx0XHRtZXRhOiBtZXRhLFxuXHRcdFx0XHRpbmRleDogaW5kZXgsXG5cdFx0XHRcdGVhc2luZ1ZhbHVlOiBlYXNpbmdWYWx1ZVxuXHRcdFx0fTtcblxuXHRcdFx0aWYgKHBsdWdpbnMubm90aWZ5KG1lLCAnYmVmb3JlRGF0YXNldERyYXcnLCBbYXJnc10pID09PSBmYWxzZSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdG1ldGEuY29udHJvbGxlci5kcmF3KGVhc2luZ1ZhbHVlKTtcblxuXHRcdFx0cGx1Z2lucy5ub3RpZnkobWUsICdhZnRlckRhdGFzZXREcmF3JywgW2FyZ3NdKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogRHJhd3MgdG9vbHRpcCB1bmxlc3MgYSBwbHVnaW4gcmV0dXJucyBgZmFsc2VgIHRvIHRoZSBgYmVmb3JlVG9vbHRpcERyYXdgXG5cdFx0ICogaG9vaywgaW4gd2hpY2ggY2FzZSwgcGx1Z2lucyB3aWxsIG5vdCBiZSBjYWxsZWQgb24gYGFmdGVyVG9vbHRpcERyYXdgLlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0X2RyYXdUb29sdGlwOiBmdW5jdGlvbihlYXNpbmdWYWx1ZSkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciB0b29sdGlwID0gbWUudG9vbHRpcDtcblx0XHRcdHZhciBhcmdzID0ge1xuXHRcdFx0XHR0b29sdGlwOiB0b29sdGlwLFxuXHRcdFx0XHRlYXNpbmdWYWx1ZTogZWFzaW5nVmFsdWVcblx0XHRcdH07XG5cblx0XHRcdGlmIChwbHVnaW5zLm5vdGlmeShtZSwgJ2JlZm9yZVRvb2x0aXBEcmF3JywgW2FyZ3NdKSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR0b29sdGlwLmRyYXcoKTtcblxuXHRcdFx0cGx1Z2lucy5ub3RpZnkobWUsICdhZnRlclRvb2x0aXBEcmF3JywgW2FyZ3NdKTtcblx0XHR9LFxuXG5cdFx0Ly8gR2V0IHRoZSBzaW5nbGUgZWxlbWVudCB0aGF0IHdhcyBjbGlja2VkIG9uXG5cdFx0Ly8gQHJldHVybiA6IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBkYXRhc2V0IGluZGV4IGFuZCBlbGVtZW50IGluZGV4IG9mIHRoZSBtYXRjaGluZyBlbGVtZW50LiBBbHNvIGNvbnRhaW5zIHRoZSByZWN0YW5nbGUgdGhhdCB3YXMgZHJhd1xuXHRcdGdldEVsZW1lbnRBdEV2ZW50OiBmdW5jdGlvbihlKSB7XG5cdFx0XHRyZXR1cm4gSW50ZXJhY3Rpb24ubW9kZXMuc2luZ2xlKHRoaXMsIGUpO1xuXHRcdH0sXG5cblx0XHRnZXRFbGVtZW50c0F0RXZlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdHJldHVybiBJbnRlcmFjdGlvbi5tb2Rlcy5sYWJlbCh0aGlzLCBlLCB7aW50ZXJzZWN0OiB0cnVlfSk7XG5cdFx0fSxcblxuXHRcdGdldEVsZW1lbnRzQXRYQXhpczogZnVuY3Rpb24oZSkge1xuXHRcdFx0cmV0dXJuIEludGVyYWN0aW9uLm1vZGVzWyd4LWF4aXMnXSh0aGlzLCBlLCB7aW50ZXJzZWN0OiB0cnVlfSk7XG5cdFx0fSxcblxuXHRcdGdldEVsZW1lbnRzQXRFdmVudEZvck1vZGU6IGZ1bmN0aW9uKGUsIG1vZGUsIG9wdGlvbnMpIHtcblx0XHRcdHZhciBtZXRob2QgPSBJbnRlcmFjdGlvbi5tb2Rlc1ttb2RlXTtcblx0XHRcdGlmICh0eXBlb2YgbWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdHJldHVybiBtZXRob2QodGhpcywgZSwgb3B0aW9ucyk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBbXTtcblx0XHR9LFxuXG5cdFx0Z2V0RGF0YXNldEF0RXZlbnQ6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdHJldHVybiBJbnRlcmFjdGlvbi5tb2Rlcy5kYXRhc2V0KHRoaXMsIGUsIHtpbnRlcnNlY3Q6IHRydWV9KTtcblx0XHR9LFxuXG5cdFx0Z2V0RGF0YXNldE1ldGE6IGZ1bmN0aW9uKGRhdGFzZXRJbmRleCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBkYXRhc2V0ID0gbWUuZGF0YS5kYXRhc2V0c1tkYXRhc2V0SW5kZXhdO1xuXHRcdFx0aWYgKCFkYXRhc2V0Ll9tZXRhKSB7XG5cdFx0XHRcdGRhdGFzZXQuX21ldGEgPSB7fTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIG1ldGEgPSBkYXRhc2V0Ll9tZXRhW21lLmlkXTtcblx0XHRcdGlmICghbWV0YSkge1xuXHRcdFx0XHRtZXRhID0gZGF0YXNldC5fbWV0YVttZS5pZF0gPSB7XG5cdFx0XHRcdFx0dHlwZTogbnVsbCxcblx0XHRcdFx0XHRkYXRhOiBbXSxcblx0XHRcdFx0XHRkYXRhc2V0OiBudWxsLFxuXHRcdFx0XHRcdGNvbnRyb2xsZXI6IG51bGwsXG5cdFx0XHRcdFx0aGlkZGVuOiBudWxsLFx0XHRcdC8vIFNlZSBpc0RhdGFzZXRWaXNpYmxlKCkgY29tbWVudFxuXHRcdFx0XHRcdHhBeGlzSUQ6IG51bGwsXG5cdFx0XHRcdFx0eUF4aXNJRDogbnVsbFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWV0YTtcblx0XHR9LFxuXG5cdFx0Z2V0VmlzaWJsZURhdGFzZXRDb3VudDogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgY291bnQgPSAwO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDAsIGlsZW4gPSB0aGlzLmRhdGEuZGF0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRcdGlmICh0aGlzLmlzRGF0YXNldFZpc2libGUoaSkpIHtcblx0XHRcdFx0XHRjb3VudCsrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gY291bnQ7XG5cdFx0fSxcblxuXHRcdGlzRGF0YXNldFZpc2libGU6IGZ1bmN0aW9uKGRhdGFzZXRJbmRleCkge1xuXHRcdFx0dmFyIG1ldGEgPSB0aGlzLmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG5cblx0XHRcdC8vIG1ldGEuaGlkZGVuIGlzIGEgcGVyIGNoYXJ0IGRhdGFzZXQgaGlkZGVuIGZsYWcgb3ZlcnJpZGUgd2l0aCAzIHN0YXRlczogaWYgdHJ1ZSBvciBmYWxzZSxcblx0XHRcdC8vIHRoZSBkYXRhc2V0LmhpZGRlbiB2YWx1ZSBpcyBpZ25vcmVkLCBlbHNlIGlmIG51bGwsIHRoZSBkYXRhc2V0IGhpZGRlbiBzdGF0ZSBpcyByZXR1cm5lZC5cblx0XHRcdHJldHVybiB0eXBlb2YgbWV0YS5oaWRkZW4gPT09ICdib29sZWFuJyA/ICFtZXRhLmhpZGRlbiA6ICF0aGlzLmRhdGEuZGF0YXNldHNbZGF0YXNldEluZGV4XS5oaWRkZW47XG5cdFx0fSxcblxuXHRcdGdlbmVyYXRlTGVnZW5kOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLm9wdGlvbnMubGVnZW5kQ2FsbGJhY2sodGhpcyk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0ZGVzdHJveURhdGFzZXRNZXRhOiBmdW5jdGlvbihkYXRhc2V0SW5kZXgpIHtcblx0XHRcdHZhciBpZCA9IHRoaXMuaWQ7XG5cdFx0XHR2YXIgZGF0YXNldCA9IHRoaXMuZGF0YS5kYXRhc2V0c1tkYXRhc2V0SW5kZXhdO1xuXHRcdFx0dmFyIG1ldGEgPSBkYXRhc2V0Ll9tZXRhICYmIGRhdGFzZXQuX21ldGFbaWRdO1xuXG5cdFx0XHRpZiAobWV0YSkge1xuXHRcdFx0XHRtZXRhLmNvbnRyb2xsZXIuZGVzdHJveSgpO1xuXHRcdFx0XHRkZWxldGUgZGF0YXNldC5fbWV0YVtpZF07XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBjYW52YXMgPSBtZS5jYW52YXM7XG5cdFx0XHR2YXIgaSwgaWxlbjtcblxuXHRcdFx0bWUuc3RvcCgpO1xuXG5cdFx0XHQvLyBkYXRhc2V0IGNvbnRyb2xsZXJzIG5lZWQgdG8gY2xlYW51cCBhc3NvY2lhdGVkIGRhdGFcblx0XHRcdGZvciAoaSA9IDAsIGlsZW4gPSBtZS5kYXRhLmRhdGFzZXRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0XHRtZS5kZXN0cm95RGF0YXNldE1ldGEoaSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjYW52YXMpIHtcblx0XHRcdFx0bWUudW5iaW5kRXZlbnRzKCk7XG5cdFx0XHRcdGhlbHBlcnMuY2FudmFzLmNsZWFyKG1lKTtcblx0XHRcdFx0cGxhdGZvcm0ucmVsZWFzZUNvbnRleHQobWUuY3R4KTtcblx0XHRcdFx0bWUuY2FudmFzID0gbnVsbDtcblx0XHRcdFx0bWUuY3R4ID0gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0cGx1Z2lucy5ub3RpZnkobWUsICdkZXN0cm95Jyk7XG5cblx0XHRcdGRlbGV0ZSBDaGFydC5pbnN0YW5jZXNbbWUuaWRdO1xuXHRcdH0sXG5cblx0XHR0b0Jhc2U2NEltYWdlOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmNhbnZhcy50b0RhdGFVUkwuYXBwbHkodGhpcy5jYW52YXMsIGFyZ3VtZW50cyk7XG5cdFx0fSxcblxuXHRcdGluaXRUb29sVGlwOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHRtZS50b29sdGlwID0gbmV3IFRvb2x0aXAoe1xuXHRcdFx0XHRfY2hhcnQ6IG1lLFxuXHRcdFx0XHRfY2hhcnRJbnN0YW5jZTogbWUsIC8vIGRlcHJlY2F0ZWQsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcblx0XHRcdFx0X2RhdGE6IG1lLmRhdGEsXG5cdFx0XHRcdF9vcHRpb25zOiBtZS5vcHRpb25zLnRvb2x0aXBzXG5cdFx0XHR9LCBtZSk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0YmluZEV2ZW50czogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIGxpc3RlbmVycyA9IG1lLl9saXN0ZW5lcnMgPSB7fTtcblx0XHRcdHZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRtZS5ldmVudEhhbmRsZXIuYXBwbHkobWUsIGFyZ3VtZW50cyk7XG5cdFx0XHR9O1xuXG5cdFx0XHRoZWxwZXJzLmVhY2gobWUub3B0aW9ucy5ldmVudHMsIGZ1bmN0aW9uKHR5cGUpIHtcblx0XHRcdFx0cGxhdGZvcm0uYWRkRXZlbnRMaXN0ZW5lcihtZSwgdHlwZSwgbGlzdGVuZXIpO1xuXHRcdFx0XHRsaXN0ZW5lcnNbdHlwZV0gPSBsaXN0ZW5lcjtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBFbGVtZW50cyB1c2VkIHRvIGRldGVjdCBzaXplIGNoYW5nZSBzaG91bGQgbm90IGJlIGluamVjdGVkIGZvciBub24gcmVzcG9uc2l2ZSBjaGFydHMuXG5cdFx0XHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzIyMTBcblx0XHRcdGlmIChtZS5vcHRpb25zLnJlc3BvbnNpdmUpIHtcblx0XHRcdFx0bGlzdGVuZXIgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRtZS5yZXNpemUoKTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRwbGF0Zm9ybS5hZGRFdmVudExpc3RlbmVyKG1lLCAncmVzaXplJywgbGlzdGVuZXIpO1xuXHRcdFx0XHRsaXN0ZW5lcnMucmVzaXplID0gbGlzdGVuZXI7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0dW5iaW5kRXZlbnRzOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgbGlzdGVuZXJzID0gbWUuX2xpc3RlbmVycztcblx0XHRcdGlmICghbGlzdGVuZXJzKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0ZGVsZXRlIG1lLl9saXN0ZW5lcnM7XG5cdFx0XHRoZWxwZXJzLmVhY2gobGlzdGVuZXJzLCBmdW5jdGlvbihsaXN0ZW5lciwgdHlwZSkge1xuXHRcdFx0XHRwbGF0Zm9ybS5yZW1vdmVFdmVudExpc3RlbmVyKG1lLCB0eXBlLCBsaXN0ZW5lcik7XG5cdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0dXBkYXRlSG92ZXJTdHlsZTogZnVuY3Rpb24oZWxlbWVudHMsIG1vZGUsIGVuYWJsZWQpIHtcblx0XHRcdHZhciBtZXRob2QgPSBlbmFibGVkID8gJ3NldEhvdmVyU3R5bGUnIDogJ3JlbW92ZUhvdmVyU3R5bGUnO1xuXHRcdFx0dmFyIGVsZW1lbnQsIGksIGlsZW47XG5cblx0XHRcdGZvciAoaSA9IDAsIGlsZW4gPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdFx0ZWxlbWVudCA9IGVsZW1lbnRzW2ldO1xuXHRcdFx0XHRpZiAoZWxlbWVudCkge1xuXHRcdFx0XHRcdHRoaXMuZ2V0RGF0YXNldE1ldGEoZWxlbWVudC5fZGF0YXNldEluZGV4KS5jb250cm9sbGVyW21ldGhvZF0oZWxlbWVudCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRldmVudEhhbmRsZXI6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgdG9vbHRpcCA9IG1lLnRvb2x0aXA7XG5cblx0XHRcdGlmIChwbHVnaW5zLm5vdGlmeShtZSwgJ2JlZm9yZUV2ZW50JywgW2VdKSA9PT0gZmFsc2UpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBCdWZmZXIgYW55IHVwZGF0ZSBjYWxscyBzbyB0aGF0IHJlbmRlcnMgZG8gbm90IG9jY3VyXG5cdFx0XHRtZS5fYnVmZmVyZWRSZW5kZXIgPSB0cnVlO1xuXHRcdFx0bWUuX2J1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cblx0XHRcdHZhciBjaGFuZ2VkID0gbWUuaGFuZGxlRXZlbnQoZSk7XG5cdFx0XHQvLyBmb3Igc21vb3RoIHRvb2x0aXAgYW5pbWF0aW9ucyBpc3N1ZSAjNDk4OVxuXHRcdFx0Ly8gdGhlIHRvb2x0aXAgc2hvdWxkIGJlIHRoZSBzb3VyY2Ugb2YgY2hhbmdlXG5cdFx0XHQvLyBBbmltYXRpb24gY2hlY2sgd29ya2Fyb3VuZDpcblx0XHRcdC8vIHRvb2x0aXAuX3N0YXJ0IHdpbGwgYmUgbnVsbCB3aGVuIHRvb2x0aXAgaXNuJ3QgYW5pbWF0aW5nXG5cdFx0XHRpZiAodG9vbHRpcCkge1xuXHRcdFx0XHRjaGFuZ2VkID0gdG9vbHRpcC5fc3RhcnRcblx0XHRcdFx0XHQ/IHRvb2x0aXAuaGFuZGxlRXZlbnQoZSlcblx0XHRcdFx0XHQ6IGNoYW5nZWQgfCB0b29sdGlwLmhhbmRsZUV2ZW50KGUpO1xuXHRcdFx0fVxuXG5cdFx0XHRwbHVnaW5zLm5vdGlmeShtZSwgJ2FmdGVyRXZlbnQnLCBbZV0pO1xuXG5cdFx0XHR2YXIgYnVmZmVyZWRSZXF1ZXN0ID0gbWUuX2J1ZmZlcmVkUmVxdWVzdDtcblx0XHRcdGlmIChidWZmZXJlZFJlcXVlc3QpIHtcblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBhbiB1cGRhdGUgdGhhdCB3YXMgdHJpZ2dlcmVkLCB3ZSBuZWVkIHRvIGRvIGEgbm9ybWFsIHJlbmRlclxuXHRcdFx0XHRtZS5yZW5kZXIoYnVmZmVyZWRSZXF1ZXN0KTtcblx0XHRcdH0gZWxzZSBpZiAoY2hhbmdlZCAmJiAhbWUuYW5pbWF0aW5nKSB7XG5cdFx0XHRcdC8vIElmIGVudGVyaW5nLCBsZWF2aW5nLCBvciBjaGFuZ2luZyBlbGVtZW50cywgYW5pbWF0ZSB0aGUgY2hhbmdlIHZpYSBwaXZvdFxuXHRcdFx0XHRtZS5zdG9wKCk7XG5cblx0XHRcdFx0Ly8gV2Ugb25seSBuZWVkIHRvIHJlbmRlciBhdCB0aGlzIHBvaW50LiBVcGRhdGluZyB3aWxsIGNhdXNlIHNjYWxlcyB0byBiZVxuXHRcdFx0XHQvLyByZWNvbXB1dGVkIGdlbmVyYXRpbmcgZmxpY2tlciAmIHVzaW5nIG1vcmUgbWVtb3J5IHRoYW4gbmVjZXNzYXJ5LlxuXHRcdFx0XHRtZS5yZW5kZXIoe1xuXHRcdFx0XHRcdGR1cmF0aW9uOiBtZS5vcHRpb25zLmhvdmVyLmFuaW1hdGlvbkR1cmF0aW9uLFxuXHRcdFx0XHRcdGxhenk6IHRydWVcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdG1lLl9idWZmZXJlZFJlbmRlciA9IGZhbHNlO1xuXHRcdFx0bWUuX2J1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG5cblx0XHRcdHJldHVybiBtZTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogSGFuZGxlIGFuIGV2ZW50XG5cdFx0ICogQHByaXZhdGVcblx0XHQgKiBAcGFyYW0ge0lFdmVudH0gZXZlbnQgdGhlIGV2ZW50IHRvIGhhbmRsZVxuXHRcdCAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhlIGNoYXJ0IG5lZWRzIHRvIHJlLXJlbmRlclxuXHRcdCAqL1xuXHRcdGhhbmRsZUV2ZW50OiBmdW5jdGlvbihlKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG9wdGlvbnMgPSBtZS5vcHRpb25zIHx8IHt9O1xuXHRcdFx0dmFyIGhvdmVyT3B0aW9ucyA9IG9wdGlvbnMuaG92ZXI7XG5cdFx0XHR2YXIgY2hhbmdlZCA9IGZhbHNlO1xuXG5cdFx0XHRtZS5sYXN0QWN0aXZlID0gbWUubGFzdEFjdGl2ZSB8fCBbXTtcblxuXHRcdFx0Ly8gRmluZCBBY3RpdmUgRWxlbWVudHMgZm9yIGhvdmVyIGFuZCB0b29sdGlwc1xuXHRcdFx0aWYgKGUudHlwZSA9PT0gJ21vdXNlb3V0Jykge1xuXHRcdFx0XHRtZS5hY3RpdmUgPSBbXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1lLmFjdGl2ZSA9IG1lLmdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUoZSwgaG92ZXJPcHRpb25zLm1vZGUsIGhvdmVyT3B0aW9ucyk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEludm9rZSBvbkhvdmVyIGhvb2tcblx0XHRcdC8vIE5lZWQgdG8gY2FsbCB3aXRoIG5hdGl2ZSBldmVudCBoZXJlIHRvIG5vdCBicmVhayBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXHRcdFx0aGVscGVycy5jYWxsYmFjayhvcHRpb25zLm9uSG92ZXIgfHwgb3B0aW9ucy5ob3Zlci5vbkhvdmVyLCBbZS5uYXRpdmUsIG1lLmFjdGl2ZV0sIG1lKTtcblxuXHRcdFx0aWYgKGUudHlwZSA9PT0gJ21vdXNldXAnIHx8IGUudHlwZSA9PT0gJ2NsaWNrJykge1xuXHRcdFx0XHRpZiAob3B0aW9ucy5vbkNsaWNrKSB7XG5cdFx0XHRcdFx0Ly8gVXNlIGUubmF0aXZlIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cdFx0XHRcdFx0b3B0aW9ucy5vbkNsaWNrLmNhbGwobWUsIGUubmF0aXZlLCBtZS5hY3RpdmUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBzdHlsaW5nIGZvciBsYXN0IGFjdGl2ZSAoZXZlbiBpZiBpdCBtYXkgc3RpbGwgYmUgYWN0aXZlKVxuXHRcdFx0aWYgKG1lLmxhc3RBY3RpdmUubGVuZ3RoKSB7XG5cdFx0XHRcdG1lLnVwZGF0ZUhvdmVyU3R5bGUobWUubGFzdEFjdGl2ZSwgaG92ZXJPcHRpb25zLm1vZGUsIGZhbHNlKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQnVpbHQgaW4gaG92ZXIgc3R5bGluZ1xuXHRcdFx0aWYgKG1lLmFjdGl2ZS5sZW5ndGggJiYgaG92ZXJPcHRpb25zLm1vZGUpIHtcblx0XHRcdFx0bWUudXBkYXRlSG92ZXJTdHlsZShtZS5hY3RpdmUsIGhvdmVyT3B0aW9ucy5tb2RlLCB0cnVlKTtcblx0XHRcdH1cblxuXHRcdFx0Y2hhbmdlZCA9ICFoZWxwZXJzLmFycmF5RXF1YWxzKG1lLmFjdGl2ZSwgbWUubGFzdEFjdGl2ZSk7XG5cblx0XHRcdC8vIFJlbWVtYmVyIExhc3QgQWN0aXZlc1xuXHRcdFx0bWUubGFzdEFjdGl2ZSA9IG1lLmFjdGl2ZTtcblxuXHRcdFx0cmV0dXJuIGNoYW5nZWQ7XG5cdFx0fVxuXHR9KTtcblxuXHQvKipcblx0ICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBDaGFydCBpbnN0ZWFkLlxuXHQgKiBAY2xhc3MgQ2hhcnQuQ29udHJvbGxlclxuXHQgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNi4wXG5cdCAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcblx0ICogQHByaXZhdGVcblx0ICovXG5cdENoYXJ0LkNvbnRyb2xsZXIgPSBDaGFydDtcbn07XG5cbn0se1wiMjJcIjoyMixcIjIzXCI6MjMsXCIyNlwiOjI2LFwiMjlcIjoyOSxcIjMxXCI6MzEsXCIzMlwiOjMyLFwiMzRcIjozNCxcIjM2XCI6MzYsXCI0NlwiOjQ2LFwiNDlcIjo0OX1dLDI1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDaGFydCkge1xuXG5cdHZhciBhcnJheUV2ZW50cyA9IFsncHVzaCcsICdwb3AnLCAnc2hpZnQnLCAnc3BsaWNlJywgJ3Vuc2hpZnQnXTtcblxuXHQvKipcblx0ICogSG9va3MgdGhlIGFycmF5IG1ldGhvZHMgdGhhdCBhZGQgb3IgcmVtb3ZlIHZhbHVlcyAoJ3B1c2gnLCBwb3AnLCAnc2hpZnQnLCAnc3BsaWNlJyxcblx0ICogJ3Vuc2hpZnQnKSBhbmQgbm90aWZ5IHRoZSBsaXN0ZW5lciBBRlRFUiB0aGUgYXJyYXkgaGFzIGJlZW4gYWx0ZXJlZC4gTGlzdGVuZXJzIGFyZVxuXHQgKiBjYWxsZWQgb24gdGhlICdvbkRhdGEqJyBjYWxsYmFja3MgKGUuZy4gb25EYXRhUHVzaCwgZXRjLikgd2l0aCBzYW1lIGFyZ3VtZW50cy5cblx0ICovXG5cdGZ1bmN0aW9uIGxpc3RlbkFycmF5RXZlbnRzKGFycmF5LCBsaXN0ZW5lcikge1xuXHRcdGlmIChhcnJheS5fY2hhcnRqcykge1xuXHRcdFx0YXJyYXkuX2NoYXJ0anMubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcnJheSwgJ19jaGFydGpzJywge1xuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0XHR2YWx1ZToge1xuXHRcdFx0XHRsaXN0ZW5lcnM6IFtsaXN0ZW5lcl1cblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGFycmF5RXZlbnRzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG5cdFx0XHR2YXIgbWV0aG9kID0gJ29uRGF0YScgKyBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSk7XG5cdFx0XHR2YXIgYmFzZSA9IGFycmF5W2tleV07XG5cblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcnJheSwga2V5LCB7XG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0ZW51bWVyYWJsZTogZmFsc2UsXG5cdFx0XHRcdHZhbHVlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHR2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cdFx0XHRcdFx0dmFyIHJlcyA9IGJhc2UuYXBwbHkodGhpcywgYXJncyk7XG5cblx0XHRcdFx0XHRoZWxwZXJzLmVhY2goYXJyYXkuX2NoYXJ0anMubGlzdGVuZXJzLCBmdW5jdGlvbihvYmplY3QpIHtcblx0XHRcdFx0XHRcdGlmICh0eXBlb2Ygb2JqZWN0W21ldGhvZF0gPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRcdFx0b2JqZWN0W21ldGhvZF0uYXBwbHkob2JqZWN0LCBhcmdzKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdHJldHVybiByZXM7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgdGhlIGdpdmVuIGFycmF5IGV2ZW50IGxpc3RlbmVyIGFuZCBjbGVhbnVwIGV4dHJhIGF0dGFjaGVkIHByb3BlcnRpZXMgKHN1Y2ggYXNcblx0ICogdGhlIF9jaGFydGpzIHN0dWIgYW5kIG92ZXJyaWRkZW4gbWV0aG9kcykgaWYgYXJyYXkgZG9lc24ndCBoYXZlIGFueSBtb3JlIGxpc3RlbmVycy5cblx0ICovXG5cdGZ1bmN0aW9uIHVubGlzdGVuQXJyYXlFdmVudHMoYXJyYXksIGxpc3RlbmVyKSB7XG5cdFx0dmFyIHN0dWIgPSBhcnJheS5fY2hhcnRqcztcblx0XHRpZiAoIXN0dWIpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgbGlzdGVuZXJzID0gc3R1Yi5saXN0ZW5lcnM7XG5cdFx0dmFyIGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuXHRcdGlmIChpbmRleCAhPT0gLTEpIHtcblx0XHRcdGxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdH1cblxuXHRcdGlmIChsaXN0ZW5lcnMubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGFycmF5RXZlbnRzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG5cdFx0XHRkZWxldGUgYXJyYXlba2V5XTtcblx0XHR9KTtcblxuXHRcdGRlbGV0ZSBhcnJheS5fY2hhcnRqcztcblx0fVxuXG5cdC8vIEJhc2UgY2xhc3MgZm9yIGFsbCBkYXRhc2V0IGNvbnRyb2xsZXJzIChsaW5lLCBiYXIsIGV0Yylcblx0Q2hhcnQuRGF0YXNldENvbnRyb2xsZXIgPSBmdW5jdGlvbihjaGFydCwgZGF0YXNldEluZGV4KSB7XG5cdFx0dGhpcy5pbml0aWFsaXplKGNoYXJ0LCBkYXRhc2V0SW5kZXgpO1xuXHR9O1xuXG5cdGhlbHBlcnMuZXh0ZW5kKENoYXJ0LkRhdGFzZXRDb250cm9sbGVyLnByb3RvdHlwZSwge1xuXG5cdFx0LyoqXG5cdFx0ICogRWxlbWVudCB0eXBlIHVzZWQgdG8gZ2VuZXJhdGUgYSBtZXRhIGRhdGFzZXQgKGUuZy4gQ2hhcnQuZWxlbWVudC5MaW5lKS5cblx0XHQgKiBAdHlwZSB7Q2hhcnQuY29yZS5lbGVtZW50fVxuXHRcdCAqL1xuXHRcdGRhdGFzZXRFbGVtZW50VHlwZTogbnVsbCxcblxuXHRcdC8qKlxuXHRcdCAqIEVsZW1lbnQgdHlwZSB1c2VkIHRvIGdlbmVyYXRlIGEgbWV0YSBkYXRhIChlLmcuIENoYXJ0LmVsZW1lbnQuUG9pbnQpLlxuXHRcdCAqIEB0eXBlIHtDaGFydC5jb3JlLmVsZW1lbnR9XG5cdFx0ICovXG5cdFx0ZGF0YUVsZW1lbnRUeXBlOiBudWxsLFxuXG5cdFx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oY2hhcnQsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdG1lLmNoYXJ0ID0gY2hhcnQ7XG5cdFx0XHRtZS5pbmRleCA9IGRhdGFzZXRJbmRleDtcblx0XHRcdG1lLmxpbmtTY2FsZXMoKTtcblx0XHRcdG1lLmFkZEVsZW1lbnRzKCk7XG5cdFx0fSxcblxuXHRcdHVwZGF0ZUluZGV4OiBmdW5jdGlvbihkYXRhc2V0SW5kZXgpIHtcblx0XHRcdHRoaXMuaW5kZXggPSBkYXRhc2V0SW5kZXg7XG5cdFx0fSxcblxuXHRcdGxpbmtTY2FsZXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xuXHRcdFx0dmFyIGRhdGFzZXQgPSBtZS5nZXREYXRhc2V0KCk7XG5cblx0XHRcdGlmIChtZXRhLnhBeGlzSUQgPT09IG51bGwgfHwgIShtZXRhLnhBeGlzSUQgaW4gbWUuY2hhcnQuc2NhbGVzKSkge1xuXHRcdFx0XHRtZXRhLnhBeGlzSUQgPSBkYXRhc2V0LnhBeGlzSUQgfHwgbWUuY2hhcnQub3B0aW9ucy5zY2FsZXMueEF4ZXNbMF0uaWQ7XG5cdFx0XHR9XG5cdFx0XHRpZiAobWV0YS55QXhpc0lEID09PSBudWxsIHx8ICEobWV0YS55QXhpc0lEIGluIG1lLmNoYXJ0LnNjYWxlcykpIHtcblx0XHRcdFx0bWV0YS55QXhpc0lEID0gZGF0YXNldC55QXhpc0lEIHx8IG1lLmNoYXJ0Lm9wdGlvbnMuc2NhbGVzLnlBeGVzWzBdLmlkO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRnZXREYXRhc2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHNbdGhpcy5pbmRleF07XG5cdFx0fSxcblxuXHRcdGdldE1ldGE6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuY2hhcnQuZ2V0RGF0YXNldE1ldGEodGhpcy5pbmRleCk7XG5cdFx0fSxcblxuXHRcdGdldFNjYWxlRm9ySWQ6IGZ1bmN0aW9uKHNjYWxlSUQpIHtcblx0XHRcdHJldHVybiB0aGlzLmNoYXJ0LnNjYWxlc1tzY2FsZUlEXTtcblx0XHR9LFxuXG5cdFx0cmVzZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dGhpcy51cGRhdGUodHJ1ZSk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0ZGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAodGhpcy5fZGF0YSkge1xuXHRcdFx0XHR1bmxpc3RlbkFycmF5RXZlbnRzKHRoaXMuX2RhdGEsIHRoaXMpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRjcmVhdGVNZXRhRGF0YXNldDogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIHR5cGUgPSBtZS5kYXRhc2V0RWxlbWVudFR5cGU7XG5cdFx0XHRyZXR1cm4gdHlwZSAmJiBuZXcgdHlwZSh7XG5cdFx0XHRcdF9jaGFydDogbWUuY2hhcnQsXG5cdFx0XHRcdF9kYXRhc2V0SW5kZXg6IG1lLmluZGV4XG5cdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0Y3JlYXRlTWV0YURhdGE6IGZ1bmN0aW9uKGluZGV4KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIHR5cGUgPSBtZS5kYXRhRWxlbWVudFR5cGU7XG5cdFx0XHRyZXR1cm4gdHlwZSAmJiBuZXcgdHlwZSh7XG5cdFx0XHRcdF9jaGFydDogbWUuY2hhcnQsXG5cdFx0XHRcdF9kYXRhc2V0SW5kZXg6IG1lLmluZGV4LFxuXHRcdFx0XHRfaW5kZXg6IGluZGV4XG5cdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0YWRkRWxlbWVudHM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xuXHRcdFx0dmFyIGRhdGEgPSBtZS5nZXREYXRhc2V0KCkuZGF0YSB8fCBbXTtcblx0XHRcdHZhciBtZXRhRGF0YSA9IG1ldGEuZGF0YTtcblx0XHRcdHZhciBpLCBpbGVuO1xuXG5cdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0gZGF0YS5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdFx0bWV0YURhdGFbaV0gPSBtZXRhRGF0YVtpXSB8fCBtZS5jcmVhdGVNZXRhRGF0YShpKTtcblx0XHRcdH1cblxuXHRcdFx0bWV0YS5kYXRhc2V0ID0gbWV0YS5kYXRhc2V0IHx8IG1lLmNyZWF0ZU1ldGFEYXRhc2V0KCk7XG5cdFx0fSxcblxuXHRcdGFkZEVsZW1lbnRBbmRSZXNldDogZnVuY3Rpb24oaW5kZXgpIHtcblx0XHRcdHZhciBlbGVtZW50ID0gdGhpcy5jcmVhdGVNZXRhRGF0YShpbmRleCk7XG5cdFx0XHR0aGlzLmdldE1ldGEoKS5kYXRhLnNwbGljZShpbmRleCwgMCwgZWxlbWVudCk7XG5cdFx0XHR0aGlzLnVwZGF0ZUVsZW1lbnQoZWxlbWVudCwgaW5kZXgsIHRydWUpO1xuXHRcdH0sXG5cblx0XHRidWlsZE9yVXBkYXRlRWxlbWVudHM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBkYXRhc2V0ID0gbWUuZ2V0RGF0YXNldCgpO1xuXHRcdFx0dmFyIGRhdGEgPSBkYXRhc2V0LmRhdGEgfHwgKGRhdGFzZXQuZGF0YSA9IFtdKTtcblxuXHRcdFx0Ly8gSW4gb3JkZXIgdG8gY29ycmVjdGx5IGhhbmRsZSBkYXRhIGFkZGl0aW9uL2RlbGV0aW9uIGFuaW1hdGlvbiAoYW4gdGh1cyBzaW11bGF0ZVxuXHRcdFx0Ly8gcmVhbC10aW1lIGNoYXJ0cyksIHdlIG5lZWQgdG8gbW9uaXRvciB0aGVzZSBkYXRhIG1vZGlmaWNhdGlvbnMgYW5kIHN5bmNocm9uaXplXG5cdFx0XHQvLyB0aGUgaW50ZXJuYWwgbWV0YSBkYXRhIGFjY29yZGluZ2x5LlxuXHRcdFx0aWYgKG1lLl9kYXRhICE9PSBkYXRhKSB7XG5cdFx0XHRcdGlmIChtZS5fZGF0YSkge1xuXHRcdFx0XHRcdC8vIFRoaXMgY2FzZSBoYXBwZW5zIHdoZW4gdGhlIHVzZXIgcmVwbGFjZWQgdGhlIGRhdGEgYXJyYXkgaW5zdGFuY2UuXG5cdFx0XHRcdFx0dW5saXN0ZW5BcnJheUV2ZW50cyhtZS5fZGF0YSwgbWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGlzdGVuQXJyYXlFdmVudHMoZGF0YSwgbWUpO1xuXHRcdFx0XHRtZS5fZGF0YSA9IGRhdGE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlLXN5bmMgbWV0YSBkYXRhIGluIGNhc2UgdGhlIHVzZXIgcmVwbGFjZWQgdGhlIGRhdGEgYXJyYXkgb3IgaWYgd2UgbWlzc2VkXG5cdFx0XHQvLyBhbnkgdXBkYXRlcyBhbmQgc28gbWFrZSBzdXJlIHRoYXQgd2UgaGFuZGxlIG51bWJlciBvZiBkYXRhcG9pbnRzIGNoYW5naW5nLlxuXHRcdFx0bWUucmVzeW5jRWxlbWVudHMoKTtcblx0XHR9LFxuXG5cdFx0dXBkYXRlOiBoZWxwZXJzLm5vb3AsXG5cblx0XHR0cmFuc2l0aW9uOiBmdW5jdGlvbihlYXNpbmdWYWx1ZSkge1xuXHRcdFx0dmFyIG1ldGEgPSB0aGlzLmdldE1ldGEoKTtcblx0XHRcdHZhciBlbGVtZW50cyA9IG1ldGEuZGF0YSB8fCBbXTtcblx0XHRcdHZhciBpbGVuID0gZWxlbWVudHMubGVuZ3RoO1xuXHRcdFx0dmFyIGkgPSAwO1xuXG5cdFx0XHRmb3IgKDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0XHRlbGVtZW50c1tpXS50cmFuc2l0aW9uKGVhc2luZ1ZhbHVlKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG1ldGEuZGF0YXNldCkge1xuXHRcdFx0XHRtZXRhLmRhdGFzZXQudHJhbnNpdGlvbihlYXNpbmdWYWx1ZSk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGRyYXc6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1ldGEgPSB0aGlzLmdldE1ldGEoKTtcblx0XHRcdHZhciBlbGVtZW50cyA9IG1ldGEuZGF0YSB8fCBbXTtcblx0XHRcdHZhciBpbGVuID0gZWxlbWVudHMubGVuZ3RoO1xuXHRcdFx0dmFyIGkgPSAwO1xuXG5cdFx0XHRpZiAobWV0YS5kYXRhc2V0KSB7XG5cdFx0XHRcdG1ldGEuZGF0YXNldC5kcmF3KCk7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRcdGVsZW1lbnRzW2ldLmRyYXcoKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0cmVtb3ZlSG92ZXJTdHlsZTogZnVuY3Rpb24oZWxlbWVudCkge1xuXHRcdFx0aGVscGVycy5tZXJnZShlbGVtZW50Ll9tb2RlbCwgZWxlbWVudC4kcHJldmlvdXNTdHlsZSB8fCB7fSk7XG5cdFx0XHRkZWxldGUgZWxlbWVudC4kcHJldmlvdXNTdHlsZTtcblx0XHR9LFxuXG5cdFx0c2V0SG92ZXJTdHlsZTogZnVuY3Rpb24oZWxlbWVudCkge1xuXHRcdFx0dmFyIGRhdGFzZXQgPSB0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHNbZWxlbWVudC5fZGF0YXNldEluZGV4XTtcblx0XHRcdHZhciBpbmRleCA9IGVsZW1lbnQuX2luZGV4O1xuXHRcdFx0dmFyIGN1c3RvbSA9IGVsZW1lbnQuY3VzdG9tIHx8IHt9O1xuXHRcdFx0dmFyIHZhbHVlT3JEZWZhdWx0ID0gaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQ7XG5cdFx0XHR2YXIgZ2V0SG92ZXJDb2xvciA9IGhlbHBlcnMuZ2V0SG92ZXJDb2xvcjtcblx0XHRcdHZhciBtb2RlbCA9IGVsZW1lbnQuX21vZGVsO1xuXG5cdFx0XHRlbGVtZW50LiRwcmV2aW91c1N0eWxlID0ge1xuXHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcblx0XHRcdFx0Ym9yZGVyQ29sb3I6IG1vZGVsLmJvcmRlckNvbG9yLFxuXHRcdFx0XHRib3JkZXJXaWR0aDogbW9kZWwuYm9yZGVyV2lkdGhcblx0XHRcdH07XG5cblx0XHRcdG1vZGVsLmJhY2tncm91bmRDb2xvciA9IGN1c3RvbS5ob3ZlckJhY2tncm91bmRDb2xvciA/IGN1c3RvbS5ob3ZlckJhY2tncm91bmRDb2xvciA6IHZhbHVlT3JEZWZhdWx0KGRhdGFzZXQuaG92ZXJCYWNrZ3JvdW5kQ29sb3IsIGluZGV4LCBnZXRIb3ZlckNvbG9yKG1vZGVsLmJhY2tncm91bmRDb2xvcikpO1xuXHRcdFx0bW9kZWwuYm9yZGVyQ29sb3IgPSBjdXN0b20uaG92ZXJCb3JkZXJDb2xvciA/IGN1c3RvbS5ob3ZlckJvcmRlckNvbG9yIDogdmFsdWVPckRlZmF1bHQoZGF0YXNldC5ob3ZlckJvcmRlckNvbG9yLCBpbmRleCwgZ2V0SG92ZXJDb2xvcihtb2RlbC5ib3JkZXJDb2xvcikpO1xuXHRcdFx0bW9kZWwuYm9yZGVyV2lkdGggPSBjdXN0b20uaG92ZXJCb3JkZXJXaWR0aCA/IGN1c3RvbS5ob3ZlckJvcmRlcldpZHRoIDogdmFsdWVPckRlZmF1bHQoZGF0YXNldC5ob3ZlckJvcmRlcldpZHRoLCBpbmRleCwgbW9kZWwuYm9yZGVyV2lkdGgpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdHJlc3luY0VsZW1lbnRzOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcblx0XHRcdHZhciBkYXRhID0gbWUuZ2V0RGF0YXNldCgpLmRhdGE7XG5cdFx0XHR2YXIgbnVtTWV0YSA9IG1ldGEuZGF0YS5sZW5ndGg7XG5cdFx0XHR2YXIgbnVtRGF0YSA9IGRhdGEubGVuZ3RoO1xuXG5cdFx0XHRpZiAobnVtRGF0YSA8IG51bU1ldGEpIHtcblx0XHRcdFx0bWV0YS5kYXRhLnNwbGljZShudW1EYXRhLCBudW1NZXRhIC0gbnVtRGF0YSk7XG5cdFx0XHR9IGVsc2UgaWYgKG51bURhdGEgPiBudW1NZXRhKSB7XG5cdFx0XHRcdG1lLmluc2VydEVsZW1lbnRzKG51bU1ldGEsIG51bURhdGEgLSBudW1NZXRhKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRpbnNlcnRFbGVtZW50czogZnVuY3Rpb24oc3RhcnQsIGNvdW50KSB7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcblx0XHRcdFx0dGhpcy5hZGRFbGVtZW50QW5kUmVzZXQoc3RhcnQgKyBpKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRvbkRhdGFQdXNoOiBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMuaW5zZXJ0RWxlbWVudHModGhpcy5nZXREYXRhc2V0KCkuZGF0YS5sZW5ndGggLSAxLCBhcmd1bWVudHMubGVuZ3RoKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRvbkRhdGFQb3A6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dGhpcy5nZXRNZXRhKCkuZGF0YS5wb3AoKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRvbkRhdGFTaGlmdDogZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLmdldE1ldGEoKS5kYXRhLnNoaWZ0KCk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0b25EYXRhU3BsaWNlOiBmdW5jdGlvbihzdGFydCwgY291bnQpIHtcblx0XHRcdHRoaXMuZ2V0TWV0YSgpLmRhdGEuc3BsaWNlKHN0YXJ0LCBjb3VudCk7XG5cdFx0XHR0aGlzLmluc2VydEVsZW1lbnRzKHN0YXJ0LCBhcmd1bWVudHMubGVuZ3RoIC0gMik7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0b25EYXRhVW5zaGlmdDogZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLmluc2VydEVsZW1lbnRzKDAsIGFyZ3VtZW50cy5sZW5ndGgpO1xuXHRcdH1cblx0fSk7XG5cblx0Q2hhcnQuRGF0YXNldENvbnRyb2xsZXIuZXh0ZW5kID0gaGVscGVycy5pbmhlcml0cztcbn07XG5cbn0se1wiNDZcIjo0Nn1dLDI2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3NldDogZnVuY3Rpb24oc2NvcGUsIHZhbHVlcykge1xuXHRcdHJldHVybiBoZWxwZXJzLm1lcmdlKHRoaXNbc2NvcGVdIHx8ICh0aGlzW3Njb3BlXSA9IHt9KSwgdmFsdWVzKTtcblx0fVxufTtcblxufSx7XCI0NlwiOjQ2fV0sMjc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgY29sb3IgPSByZXF1aXJlKDMpO1xudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcblxuZnVuY3Rpb24gaW50ZXJwb2xhdGUoc3RhcnQsIHZpZXcsIG1vZGVsLCBlYXNlKSB7XG5cdHZhciBrZXlzID0gT2JqZWN0LmtleXMobW9kZWwpO1xuXHR2YXIgaSwgaWxlbiwga2V5LCBhY3R1YWwsIG9yaWdpbiwgdGFyZ2V0LCB0eXBlLCBjMCwgYzE7XG5cblx0Zm9yIChpID0gMCwgaWxlbiA9IGtleXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0a2V5ID0ga2V5c1tpXTtcblxuXHRcdHRhcmdldCA9IG1vZGVsW2tleV07XG5cblx0XHQvLyBpZiBhIHZhbHVlIGlzIGFkZGVkIHRvIHRoZSBtb2RlbCBhZnRlciBwaXZvdCgpIGhhcyBiZWVuIGNhbGxlZCwgdGhlIHZpZXdcblx0XHQvLyBkb2Vzbid0IGNvbnRhaW4gaXQsIHNvIGxldCdzIGluaXRpYWxpemUgdGhlIHZpZXcgdG8gdGhlIHRhcmdldCB2YWx1ZS5cblx0XHRpZiAoIXZpZXcuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0dmlld1trZXldID0gdGFyZ2V0O1xuXHRcdH1cblxuXHRcdGFjdHVhbCA9IHZpZXdba2V5XTtcblxuXHRcdGlmIChhY3R1YWwgPT09IHRhcmdldCB8fCBrZXlbMF0gPT09ICdfJykge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0aWYgKCFzdGFydC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0XHRzdGFydFtrZXldID0gYWN0dWFsO1xuXHRcdH1cblxuXHRcdG9yaWdpbiA9IHN0YXJ0W2tleV07XG5cblx0XHR0eXBlID0gdHlwZW9mIHRhcmdldDtcblxuXHRcdGlmICh0eXBlID09PSB0eXBlb2Ygb3JpZ2luKSB7XG5cdFx0XHRpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0YzAgPSBjb2xvcihvcmlnaW4pO1xuXHRcdFx0XHRpZiAoYzAudmFsaWQpIHtcblx0XHRcdFx0XHRjMSA9IGNvbG9yKHRhcmdldCk7XG5cdFx0XHRcdFx0aWYgKGMxLnZhbGlkKSB7XG5cdFx0XHRcdFx0XHR2aWV3W2tleV0gPSBjMS5taXgoYzAsIGVhc2UpLnJnYlN0cmluZygpO1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKG9yaWdpbikgJiYgaXNGaW5pdGUodGFyZ2V0KSkge1xuXHRcdFx0XHR2aWV3W2tleV0gPSBvcmlnaW4gKyAodGFyZ2V0IC0gb3JpZ2luKSAqIGVhc2U7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHZpZXdba2V5XSA9IHRhcmdldDtcblx0fVxufVxuXG52YXIgRWxlbWVudCA9IGZ1bmN0aW9uKGNvbmZpZ3VyYXRpb24pIHtcblx0aGVscGVycy5leHRlbmQodGhpcywgY29uZmlndXJhdGlvbik7XG5cdHRoaXMuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufTtcblxuaGVscGVycy5leHRlbmQoRWxlbWVudC5wcm90b3R5cGUsIHtcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmhpZGRlbiA9IGZhbHNlO1xuXHR9LFxuXG5cdHBpdm90OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdGlmICghbWUuX3ZpZXcpIHtcblx0XHRcdG1lLl92aWV3ID0gaGVscGVycy5jbG9uZShtZS5fbW9kZWwpO1xuXHRcdH1cblx0XHRtZS5fc3RhcnQgPSB7fTtcblx0XHRyZXR1cm4gbWU7XG5cdH0sXG5cblx0dHJhbnNpdGlvbjogZnVuY3Rpb24oZWFzZSkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIG1vZGVsID0gbWUuX21vZGVsO1xuXHRcdHZhciBzdGFydCA9IG1lLl9zdGFydDtcblx0XHR2YXIgdmlldyA9IG1lLl92aWV3O1xuXG5cdFx0Ly8gTm8gYW5pbWF0aW9uIC0+IE5vIFRyYW5zaXRpb25cblx0XHRpZiAoIW1vZGVsIHx8IGVhc2UgPT09IDEpIHtcblx0XHRcdG1lLl92aWV3ID0gbW9kZWw7XG5cdFx0XHRtZS5fc3RhcnQgPSBudWxsO1xuXHRcdFx0cmV0dXJuIG1lO1xuXHRcdH1cblxuXHRcdGlmICghdmlldykge1xuXHRcdFx0dmlldyA9IG1lLl92aWV3ID0ge307XG5cdFx0fVxuXG5cdFx0aWYgKCFzdGFydCkge1xuXHRcdFx0c3RhcnQgPSBtZS5fc3RhcnQgPSB7fTtcblx0XHR9XG5cblx0XHRpbnRlcnBvbGF0ZShzdGFydCwgdmlldywgbW9kZWwsIGVhc2UpO1xuXG5cdFx0cmV0dXJuIG1lO1xuXHR9LFxuXG5cdHRvb2x0aXBQb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHg6IHRoaXMuX21vZGVsLngsXG5cdFx0XHR5OiB0aGlzLl9tb2RlbC55XG5cdFx0fTtcblx0fSxcblxuXHRoYXNWYWx1ZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGhlbHBlcnMuaXNOdW1iZXIodGhpcy5fbW9kZWwueCkgJiYgaGVscGVycy5pc051bWJlcih0aGlzLl9tb2RlbC55KTtcblx0fVxufSk7XG5cbkVsZW1lbnQuZXh0ZW5kID0gaGVscGVycy5pbmhlcml0cztcblxubW9kdWxlLmV4cG9ydHMgPSBFbGVtZW50O1xuXG59LHtcIjNcIjozLFwiNDZcIjo0Nn1dLDI4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbi8qIGdsb2JhbCB3aW5kb3c6IGZhbHNlICovXG4vKiBnbG9iYWwgZG9jdW1lbnQ6IGZhbHNlICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBjb2xvciA9IHJlcXVpcmUoMyk7XG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XG52YXIgc2NhbGVTZXJ2aWNlID0gcmVxdWlyZSgzNCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG5cblx0Ly8gLS0gQmFzaWMganMgdXRpbGl0eSBtZXRob2RzXG5cblx0aGVscGVycy5jb25maWdNZXJnZSA9IGZ1bmN0aW9uKC8qIG9iamVjdHMgLi4uICovKSB7XG5cdFx0cmV0dXJuIGhlbHBlcnMubWVyZ2UoaGVscGVycy5jbG9uZShhcmd1bWVudHNbMF0pLCBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSksIHtcblx0XHRcdG1lcmdlcjogZnVuY3Rpb24oa2V5LCB0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuXHRcdFx0XHR2YXIgdHZhbCA9IHRhcmdldFtrZXldIHx8IHt9O1xuXHRcdFx0XHR2YXIgc3ZhbCA9IHNvdXJjZVtrZXldO1xuXG5cdFx0XHRcdGlmIChrZXkgPT09ICdzY2FsZXMnKSB7XG5cdFx0XHRcdFx0Ly8gc2NhbGUgY29uZmlnIG1lcmdpbmcgaXMgY29tcGxleC4gQWRkIG91ciBvd24gZnVuY3Rpb24gaGVyZSBmb3IgdGhhdFxuXHRcdFx0XHRcdHRhcmdldFtrZXldID0gaGVscGVycy5zY2FsZU1lcmdlKHR2YWwsIHN2YWwpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGtleSA9PT0gJ3NjYWxlJykge1xuXHRcdFx0XHRcdC8vIHVzZWQgaW4gcG9sYXIgYXJlYSAmIHJhZGFyIGNoYXJ0cyBzaW5jZSB0aGVyZSBpcyBvbmx5IG9uZSBzY2FsZVxuXHRcdFx0XHRcdHRhcmdldFtrZXldID0gaGVscGVycy5tZXJnZSh0dmFsLCBbc2NhbGVTZXJ2aWNlLmdldFNjYWxlRGVmYXVsdHMoc3ZhbC50eXBlKSwgc3ZhbF0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGhlbHBlcnMuX21lcmdlcihrZXksIHRhcmdldCwgc291cmNlLCBvcHRpb25zKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9O1xuXG5cdGhlbHBlcnMuc2NhbGVNZXJnZSA9IGZ1bmN0aW9uKC8qIG9iamVjdHMgLi4uICovKSB7XG5cdFx0cmV0dXJuIGhlbHBlcnMubWVyZ2UoaGVscGVycy5jbG9uZShhcmd1bWVudHNbMF0pLCBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSksIHtcblx0XHRcdG1lcmdlcjogZnVuY3Rpb24oa2V5LCB0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xuXHRcdFx0XHRpZiAoa2V5ID09PSAneEF4ZXMnIHx8IGtleSA9PT0gJ3lBeGVzJykge1xuXHRcdFx0XHRcdHZhciBzbGVuID0gc291cmNlW2tleV0ubGVuZ3RoO1xuXHRcdFx0XHRcdHZhciBpLCB0eXBlLCBzY2FsZTtcblxuXHRcdFx0XHRcdGlmICghdGFyZ2V0W2tleV0pIHtcblx0XHRcdFx0XHRcdHRhcmdldFtrZXldID0gW107XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IHNsZW47ICsraSkge1xuXHRcdFx0XHRcdFx0c2NhbGUgPSBzb3VyY2Vba2V5XVtpXTtcblx0XHRcdFx0XHRcdHR5cGUgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KHNjYWxlLnR5cGUsIGtleSA9PT0gJ3hBeGVzJyA/ICdjYXRlZ29yeScgOiAnbGluZWFyJyk7XG5cblx0XHRcdFx0XHRcdGlmIChpID49IHRhcmdldFtrZXldLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0XHR0YXJnZXRba2V5XS5wdXNoKHt9KTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKCF0YXJnZXRba2V5XVtpXS50eXBlIHx8IChzY2FsZS50eXBlICYmIHNjYWxlLnR5cGUgIT09IHRhcmdldFtrZXldW2ldLnR5cGUpKSB7XG5cdFx0XHRcdFx0XHRcdC8vIG5ldy91bnR5cGVkIHNjYWxlIG9yIHR5cGUgY2hhbmdlZDogbGV0J3MgYXBwbHkgdGhlIG5ldyBkZWZhdWx0c1xuXHRcdFx0XHRcdFx0XHQvLyB0aGVuIG1lcmdlIHNvdXJjZSBzY2FsZSB0byBjb3JyZWN0bHkgb3ZlcndyaXRlIHRoZSBkZWZhdWx0cy5cblx0XHRcdFx0XHRcdFx0aGVscGVycy5tZXJnZSh0YXJnZXRba2V5XVtpXSwgW3NjYWxlU2VydmljZS5nZXRTY2FsZURlZmF1bHRzKHR5cGUpLCBzY2FsZV0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gc2NhbGVzIHR5cGUgYXJlIHRoZSBzYW1lXG5cdFx0XHRcdFx0XHRcdGhlbHBlcnMubWVyZ2UodGFyZ2V0W2tleV1baV0sIHNjYWxlKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aGVscGVycy5fbWVyZ2VyKGtleSwgdGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH07XG5cblx0aGVscGVycy53aGVyZSA9IGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGZpbHRlckNhbGxiYWNrKSB7XG5cdFx0aWYgKGhlbHBlcnMuaXNBcnJheShjb2xsZWN0aW9uKSAmJiBBcnJheS5wcm90b3R5cGUuZmlsdGVyKSB7XG5cdFx0XHRyZXR1cm4gY29sbGVjdGlvbi5maWx0ZXIoZmlsdGVyQ2FsbGJhY2spO1xuXHRcdH1cblx0XHR2YXIgZmlsdGVyZWQgPSBbXTtcblxuXHRcdGhlbHBlcnMuZWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbihpdGVtKSB7XG5cdFx0XHRpZiAoZmlsdGVyQ2FsbGJhY2soaXRlbSkpIHtcblx0XHRcdFx0ZmlsdGVyZWQucHVzaChpdGVtKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBmaWx0ZXJlZDtcblx0fTtcblx0aGVscGVycy5maW5kSW5kZXggPSBBcnJheS5wcm90b3R5cGUuZmluZEluZGV4ID9cblx0XHRmdW5jdGlvbihhcnJheSwgY2FsbGJhY2ssIHNjb3BlKSB7XG5cdFx0XHRyZXR1cm4gYXJyYXkuZmluZEluZGV4KGNhbGxiYWNrLCBzY29wZSk7XG5cdFx0fSA6XG5cdFx0ZnVuY3Rpb24oYXJyYXksIGNhbGxiYWNrLCBzY29wZSkge1xuXHRcdFx0c2NvcGUgPSBzY29wZSA9PT0gdW5kZWZpbmVkID8gYXJyYXkgOiBzY29wZTtcblx0XHRcdGZvciAodmFyIGkgPSAwLCBpbGVuID0gYXJyYXkubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRcdGlmIChjYWxsYmFjay5jYWxsKHNjb3BlLCBhcnJheVtpXSwgaSwgYXJyYXkpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiAtMTtcblx0XHR9O1xuXHRoZWxwZXJzLmZpbmROZXh0V2hlcmUgPSBmdW5jdGlvbihhcnJheVRvU2VhcmNoLCBmaWx0ZXJDYWxsYmFjaywgc3RhcnRJbmRleCkge1xuXHRcdC8vIERlZmF1bHQgdG8gc3RhcnQgb2YgdGhlIGFycmF5XG5cdFx0aWYgKGhlbHBlcnMuaXNOdWxsT3JVbmRlZihzdGFydEluZGV4KSkge1xuXHRcdFx0c3RhcnRJbmRleCA9IC0xO1xuXHRcdH1cblx0XHRmb3IgKHZhciBpID0gc3RhcnRJbmRleCArIDE7IGkgPCBhcnJheVRvU2VhcmNoLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgY3VycmVudEl0ZW0gPSBhcnJheVRvU2VhcmNoW2ldO1xuXHRcdFx0aWYgKGZpbHRlckNhbGxiYWNrKGN1cnJlbnRJdGVtKSkge1xuXHRcdFx0XHRyZXR1cm4gY3VycmVudEl0ZW07XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRoZWxwZXJzLmZpbmRQcmV2aW91c1doZXJlID0gZnVuY3Rpb24oYXJyYXlUb1NlYXJjaCwgZmlsdGVyQ2FsbGJhY2ssIHN0YXJ0SW5kZXgpIHtcblx0XHQvLyBEZWZhdWx0IHRvIGVuZCBvZiB0aGUgYXJyYXlcblx0XHRpZiAoaGVscGVycy5pc051bGxPclVuZGVmKHN0YXJ0SW5kZXgpKSB7XG5cdFx0XHRzdGFydEluZGV4ID0gYXJyYXlUb1NlYXJjaC5sZW5ndGg7XG5cdFx0fVxuXHRcdGZvciAodmFyIGkgPSBzdGFydEluZGV4IC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0XHRcdHZhciBjdXJyZW50SXRlbSA9IGFycmF5VG9TZWFyY2hbaV07XG5cdFx0XHRpZiAoZmlsdGVyQ2FsbGJhY2soY3VycmVudEl0ZW0pKSB7XG5cdFx0XHRcdHJldHVybiBjdXJyZW50SXRlbTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0Ly8gLS0gTWF0aCBtZXRob2RzXG5cdGhlbHBlcnMuaXNOdW1iZXIgPSBmdW5jdGlvbihuKSB7XG5cdFx0cmV0dXJuICFpc05hTihwYXJzZUZsb2F0KG4pKSAmJiBpc0Zpbml0ZShuKTtcblx0fTtcblx0aGVscGVycy5hbG1vc3RFcXVhbHMgPSBmdW5jdGlvbih4LCB5LCBlcHNpbG9uKSB7XG5cdFx0cmV0dXJuIE1hdGguYWJzKHggLSB5KSA8IGVwc2lsb247XG5cdH07XG5cdGhlbHBlcnMuYWxtb3N0V2hvbGUgPSBmdW5jdGlvbih4LCBlcHNpbG9uKSB7XG5cdFx0dmFyIHJvdW5kZWQgPSBNYXRoLnJvdW5kKHgpO1xuXHRcdHJldHVybiAoKChyb3VuZGVkIC0gZXBzaWxvbikgPCB4KSAmJiAoKHJvdW5kZWQgKyBlcHNpbG9uKSA+IHgpKTtcblx0fTtcblx0aGVscGVycy5tYXggPSBmdW5jdGlvbihhcnJheSkge1xuXHRcdHJldHVybiBhcnJheS5yZWR1Y2UoZnVuY3Rpb24obWF4LCB2YWx1ZSkge1xuXHRcdFx0aWYgKCFpc05hTih2YWx1ZSkpIHtcblx0XHRcdFx0cmV0dXJuIE1hdGgubWF4KG1heCwgdmFsdWUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1heDtcblx0XHR9LCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpO1xuXHR9O1xuXHRoZWxwZXJzLm1pbiA9IGZ1bmN0aW9uKGFycmF5KSB7XG5cdFx0cmV0dXJuIGFycmF5LnJlZHVjZShmdW5jdGlvbihtaW4sIHZhbHVlKSB7XG5cdFx0XHRpZiAoIWlzTmFOKHZhbHVlKSkge1xuXHRcdFx0XHRyZXR1cm4gTWF0aC5taW4obWluLCB2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWluO1xuXHRcdH0sIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG5cdH07XG5cdGhlbHBlcnMuc2lnbiA9IE1hdGguc2lnbiA/XG5cdFx0ZnVuY3Rpb24oeCkge1xuXHRcdFx0cmV0dXJuIE1hdGguc2lnbih4KTtcblx0XHR9IDpcblx0XHRmdW5jdGlvbih4KSB7XG5cdFx0XHR4ID0gK3g7IC8vIGNvbnZlcnQgdG8gYSBudW1iZXJcblx0XHRcdGlmICh4ID09PSAwIHx8IGlzTmFOKHgpKSB7XG5cdFx0XHRcdHJldHVybiB4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHggPiAwID8gMSA6IC0xO1xuXHRcdH07XG5cdGhlbHBlcnMubG9nMTAgPSBNYXRoLmxvZzEwID9cblx0XHRmdW5jdGlvbih4KSB7XG5cdFx0XHRyZXR1cm4gTWF0aC5sb2cxMCh4KTtcblx0XHR9IDpcblx0XHRmdW5jdGlvbih4KSB7XG5cdFx0XHR2YXIgZXhwb25lbnQgPSBNYXRoLmxvZyh4KSAqIE1hdGguTE9HMTBFOyAvLyBNYXRoLkxPRzEwRSA9IDEgLyBNYXRoLkxOMTAuXG5cdFx0XHQvLyBDaGVjayBmb3Igd2hvbGUgcG93ZXJzIG9mIDEwLFxuXHRcdFx0Ly8gd2hpY2ggZHVlIHRvIGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIGVycm9yIHNob3VsZCBiZSBjb3JyZWN0ZWQuXG5cdFx0XHR2YXIgcG93ZXJPZjEwID0gTWF0aC5yb3VuZChleHBvbmVudCk7XG5cdFx0XHR2YXIgaXNQb3dlck9mMTAgPSB4ID09PSBNYXRoLnBvdygxMCwgcG93ZXJPZjEwKTtcblxuXHRcdFx0cmV0dXJuIGlzUG93ZXJPZjEwID8gcG93ZXJPZjEwIDogZXhwb25lbnQ7XG5cdFx0fTtcblx0aGVscGVycy50b1JhZGlhbnMgPSBmdW5jdGlvbihkZWdyZWVzKSB7XG5cdFx0cmV0dXJuIGRlZ3JlZXMgKiAoTWF0aC5QSSAvIDE4MCk7XG5cdH07XG5cdGhlbHBlcnMudG9EZWdyZWVzID0gZnVuY3Rpb24ocmFkaWFucykge1xuXHRcdHJldHVybiByYWRpYW5zICogKDE4MCAvIE1hdGguUEkpO1xuXHR9O1xuXHQvLyBHZXRzIHRoZSBhbmdsZSBmcm9tIHZlcnRpY2FsIHVwcmlnaHQgdG8gdGhlIHBvaW50IGFib3V0IGEgY2VudHJlLlxuXHRoZWxwZXJzLmdldEFuZ2xlRnJvbVBvaW50ID0gZnVuY3Rpb24oY2VudHJlUG9pbnQsIGFuZ2xlUG9pbnQpIHtcblx0XHR2YXIgZGlzdGFuY2VGcm9tWENlbnRlciA9IGFuZ2xlUG9pbnQueCAtIGNlbnRyZVBvaW50Lng7XG5cdFx0dmFyIGRpc3RhbmNlRnJvbVlDZW50ZXIgPSBhbmdsZVBvaW50LnkgLSBjZW50cmVQb2ludC55O1xuXHRcdHZhciByYWRpYWxEaXN0YW5jZUZyb21DZW50ZXIgPSBNYXRoLnNxcnQoZGlzdGFuY2VGcm9tWENlbnRlciAqIGRpc3RhbmNlRnJvbVhDZW50ZXIgKyBkaXN0YW5jZUZyb21ZQ2VudGVyICogZGlzdGFuY2VGcm9tWUNlbnRlcik7XG5cblx0XHR2YXIgYW5nbGUgPSBNYXRoLmF0YW4yKGRpc3RhbmNlRnJvbVlDZW50ZXIsIGRpc3RhbmNlRnJvbVhDZW50ZXIpO1xuXG5cdFx0aWYgKGFuZ2xlIDwgKC0wLjUgKiBNYXRoLlBJKSkge1xuXHRcdFx0YW5nbGUgKz0gMi4wICogTWF0aC5QSTsgLy8gbWFrZSBzdXJlIHRoZSByZXR1cm5lZCBhbmdsZSBpcyBpbiB0aGUgcmFuZ2Ugb2YgKC1QSS8yLCAzUEkvMl1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0YW5nbGU6IGFuZ2xlLFxuXHRcdFx0ZGlzdGFuY2U6IHJhZGlhbERpc3RhbmNlRnJvbUNlbnRlclxuXHRcdH07XG5cdH07XG5cdGhlbHBlcnMuZGlzdGFuY2VCZXR3ZWVuUG9pbnRzID0gZnVuY3Rpb24ocHQxLCBwdDIpIHtcblx0XHRyZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHB0Mi54IC0gcHQxLngsIDIpICsgTWF0aC5wb3cocHQyLnkgLSBwdDEueSwgMikpO1xuXHR9O1xuXHRoZWxwZXJzLmFsaWFzUGl4ZWwgPSBmdW5jdGlvbihwaXhlbFdpZHRoKSB7XG5cdFx0cmV0dXJuIChwaXhlbFdpZHRoICUgMiA9PT0gMCkgPyAwIDogMC41O1xuXHR9O1xuXHRoZWxwZXJzLnNwbGluZUN1cnZlID0gZnVuY3Rpb24oZmlyc3RQb2ludCwgbWlkZGxlUG9pbnQsIGFmdGVyUG9pbnQsIHQpIHtcblx0XHQvLyBQcm9wcyB0byBSb2IgU3BlbmNlciBhdCBzY2FsZWQgaW5ub3ZhdGlvbiBmb3IgaGlzIHBvc3Qgb24gc3BsaW5pbmcgYmV0d2VlbiBwb2ludHNcblx0XHQvLyBodHRwOi8vc2NhbGVkaW5ub3ZhdGlvbi5jb20vYW5hbHl0aWNzL3NwbGluZXMvYWJvdXRTcGxpbmVzLmh0bWxcblxuXHRcdC8vIFRoaXMgZnVuY3Rpb24gbXVzdCBhbHNvIHJlc3BlY3QgXCJza2lwcGVkXCIgcG9pbnRzXG5cblx0XHR2YXIgcHJldmlvdXMgPSBmaXJzdFBvaW50LnNraXAgPyBtaWRkbGVQb2ludCA6IGZpcnN0UG9pbnQ7XG5cdFx0dmFyIGN1cnJlbnQgPSBtaWRkbGVQb2ludDtcblx0XHR2YXIgbmV4dCA9IGFmdGVyUG9pbnQuc2tpcCA/IG1pZGRsZVBvaW50IDogYWZ0ZXJQb2ludDtcblxuXHRcdHZhciBkMDEgPSBNYXRoLnNxcnQoTWF0aC5wb3coY3VycmVudC54IC0gcHJldmlvdXMueCwgMikgKyBNYXRoLnBvdyhjdXJyZW50LnkgLSBwcmV2aW91cy55LCAyKSk7XG5cdFx0dmFyIGQxMiA9IE1hdGguc3FydChNYXRoLnBvdyhuZXh0LnggLSBjdXJyZW50LngsIDIpICsgTWF0aC5wb3cobmV4dC55IC0gY3VycmVudC55LCAyKSk7XG5cblx0XHR2YXIgczAxID0gZDAxIC8gKGQwMSArIGQxMik7XG5cdFx0dmFyIHMxMiA9IGQxMiAvIChkMDEgKyBkMTIpO1xuXG5cdFx0Ly8gSWYgYWxsIHBvaW50cyBhcmUgdGhlIHNhbWUsIHMwMSAmIHMwMiB3aWxsIGJlIGluZlxuXHRcdHMwMSA9IGlzTmFOKHMwMSkgPyAwIDogczAxO1xuXHRcdHMxMiA9IGlzTmFOKHMxMikgPyAwIDogczEyO1xuXG5cdFx0dmFyIGZhID0gdCAqIHMwMTsgLy8gc2NhbGluZyBmYWN0b3IgZm9yIHRyaWFuZ2xlIFRhXG5cdFx0dmFyIGZiID0gdCAqIHMxMjtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRwcmV2aW91czoge1xuXHRcdFx0XHR4OiBjdXJyZW50LnggLSBmYSAqIChuZXh0LnggLSBwcmV2aW91cy54KSxcblx0XHRcdFx0eTogY3VycmVudC55IC0gZmEgKiAobmV4dC55IC0gcHJldmlvdXMueSlcblx0XHRcdH0sXG5cdFx0XHRuZXh0OiB7XG5cdFx0XHRcdHg6IGN1cnJlbnQueCArIGZiICogKG5leHQueCAtIHByZXZpb3VzLngpLFxuXHRcdFx0XHR5OiBjdXJyZW50LnkgKyBmYiAqIChuZXh0LnkgLSBwcmV2aW91cy55KVxuXHRcdFx0fVxuXHRcdH07XG5cdH07XG5cdGhlbHBlcnMuRVBTSUxPTiA9IE51bWJlci5FUFNJTE9OIHx8IDFlLTE0O1xuXHRoZWxwZXJzLnNwbGluZUN1cnZlTW9ub3RvbmUgPSBmdW5jdGlvbihwb2ludHMpIHtcblx0XHQvLyBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgQsOpemllciBjb250cm9sIHBvaW50cyBpbiBhIHNpbWlsYXIgd2F5IHRoYW4gfHNwbGluZUN1cnZlfCxcblx0XHQvLyBidXQgcHJlc2VydmVzIG1vbm90b25pY2l0eSBvZiB0aGUgcHJvdmlkZWQgZGF0YSBhbmQgZW5zdXJlcyBubyBsb2NhbCBleHRyZW11bXMgYXJlIGFkZGVkXG5cdFx0Ly8gYmV0d2VlbiB0aGUgZGF0YXNldCBkaXNjcmV0ZSBwb2ludHMgZHVlIHRvIHRoZSBpbnRlcnBvbGF0aW9uLlxuXHRcdC8vIFNlZSA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01vbm90b25lX2N1YmljX2ludGVycG9sYXRpb25cblxuXHRcdHZhciBwb2ludHNXaXRoVGFuZ2VudHMgPSAocG9pbnRzIHx8IFtdKS5tYXAoZnVuY3Rpb24ocG9pbnQpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG1vZGVsOiBwb2ludC5fbW9kZWwsXG5cdFx0XHRcdGRlbHRhSzogMCxcblx0XHRcdFx0bUs6IDBcblx0XHRcdH07XG5cdFx0fSk7XG5cblx0XHQvLyBDYWxjdWxhdGUgc2xvcGVzIChkZWx0YUspIGFuZCBpbml0aWFsaXplIHRhbmdlbnRzIChtSylcblx0XHR2YXIgcG9pbnRzTGVuID0gcG9pbnRzV2l0aFRhbmdlbnRzLmxlbmd0aDtcblx0XHR2YXIgaSwgcG9pbnRCZWZvcmUsIHBvaW50Q3VycmVudCwgcG9pbnRBZnRlcjtcblx0XHRmb3IgKGkgPSAwOyBpIDwgcG9pbnRzTGVuOyArK2kpIHtcblx0XHRcdHBvaW50Q3VycmVudCA9IHBvaW50c1dpdGhUYW5nZW50c1tpXTtcblx0XHRcdGlmIChwb2ludEN1cnJlbnQubW9kZWwuc2tpcCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0cG9pbnRCZWZvcmUgPSBpID4gMCA/IHBvaW50c1dpdGhUYW5nZW50c1tpIC0gMV0gOiBudWxsO1xuXHRcdFx0cG9pbnRBZnRlciA9IGkgPCBwb2ludHNMZW4gLSAxID8gcG9pbnRzV2l0aFRhbmdlbnRzW2kgKyAxXSA6IG51bGw7XG5cdFx0XHRpZiAocG9pbnRBZnRlciAmJiAhcG9pbnRBZnRlci5tb2RlbC5za2lwKSB7XG5cdFx0XHRcdHZhciBzbG9wZURlbHRhWCA9IChwb2ludEFmdGVyLm1vZGVsLnggLSBwb2ludEN1cnJlbnQubW9kZWwueCk7XG5cblx0XHRcdFx0Ly8gSW4gdGhlIGNhc2Ugb2YgdHdvIHBvaW50cyB0aGF0IGFwcGVhciBhdCB0aGUgc2FtZSB4IHBpeGVsLCBzbG9wZURlbHRhWCBpcyAwXG5cdFx0XHRcdHBvaW50Q3VycmVudC5kZWx0YUsgPSBzbG9wZURlbHRhWCAhPT0gMCA/IChwb2ludEFmdGVyLm1vZGVsLnkgLSBwb2ludEN1cnJlbnQubW9kZWwueSkgLyBzbG9wZURlbHRhWCA6IDA7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghcG9pbnRCZWZvcmUgfHwgcG9pbnRCZWZvcmUubW9kZWwuc2tpcCkge1xuXHRcdFx0XHRwb2ludEN1cnJlbnQubUsgPSBwb2ludEN1cnJlbnQuZGVsdGFLO1xuXHRcdFx0fSBlbHNlIGlmICghcG9pbnRBZnRlciB8fCBwb2ludEFmdGVyLm1vZGVsLnNraXApIHtcblx0XHRcdFx0cG9pbnRDdXJyZW50Lm1LID0gcG9pbnRCZWZvcmUuZGVsdGFLO1xuXHRcdFx0fSBlbHNlIGlmICh0aGlzLnNpZ24ocG9pbnRCZWZvcmUuZGVsdGFLKSAhPT0gdGhpcy5zaWduKHBvaW50Q3VycmVudC5kZWx0YUspKSB7XG5cdFx0XHRcdHBvaW50Q3VycmVudC5tSyA9IDA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwb2ludEN1cnJlbnQubUsgPSAocG9pbnRCZWZvcmUuZGVsdGFLICsgcG9pbnRDdXJyZW50LmRlbHRhSykgLyAyO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFkanVzdCB0YW5nZW50cyB0byBlbnN1cmUgbW9ub3RvbmljIHByb3BlcnRpZXNcblx0XHR2YXIgYWxwaGFLLCBiZXRhSywgdGF1Sywgc3F1YXJlZE1hZ25pdHVkZTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgcG9pbnRzTGVuIC0gMTsgKytpKSB7XG5cdFx0XHRwb2ludEN1cnJlbnQgPSBwb2ludHNXaXRoVGFuZ2VudHNbaV07XG5cdFx0XHRwb2ludEFmdGVyID0gcG9pbnRzV2l0aFRhbmdlbnRzW2kgKyAxXTtcblx0XHRcdGlmIChwb2ludEN1cnJlbnQubW9kZWwuc2tpcCB8fCBwb2ludEFmdGVyLm1vZGVsLnNraXApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChoZWxwZXJzLmFsbW9zdEVxdWFscyhwb2ludEN1cnJlbnQuZGVsdGFLLCAwLCB0aGlzLkVQU0lMT04pKSB7XG5cdFx0XHRcdHBvaW50Q3VycmVudC5tSyA9IHBvaW50QWZ0ZXIubUsgPSAwO1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0YWxwaGFLID0gcG9pbnRDdXJyZW50Lm1LIC8gcG9pbnRDdXJyZW50LmRlbHRhSztcblx0XHRcdGJldGFLID0gcG9pbnRBZnRlci5tSyAvIHBvaW50Q3VycmVudC5kZWx0YUs7XG5cdFx0XHRzcXVhcmVkTWFnbml0dWRlID0gTWF0aC5wb3coYWxwaGFLLCAyKSArIE1hdGgucG93KGJldGFLLCAyKTtcblx0XHRcdGlmIChzcXVhcmVkTWFnbml0dWRlIDw9IDkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHRhdUsgPSAzIC8gTWF0aC5zcXJ0KHNxdWFyZWRNYWduaXR1ZGUpO1xuXHRcdFx0cG9pbnRDdXJyZW50Lm1LID0gYWxwaGFLICogdGF1SyAqIHBvaW50Q3VycmVudC5kZWx0YUs7XG5cdFx0XHRwb2ludEFmdGVyLm1LID0gYmV0YUsgKiB0YXVLICogcG9pbnRDdXJyZW50LmRlbHRhSztcblx0XHR9XG5cblx0XHQvLyBDb21wdXRlIGNvbnRyb2wgcG9pbnRzXG5cdFx0dmFyIGRlbHRhWDtcblx0XHRmb3IgKGkgPSAwOyBpIDwgcG9pbnRzTGVuOyArK2kpIHtcblx0XHRcdHBvaW50Q3VycmVudCA9IHBvaW50c1dpdGhUYW5nZW50c1tpXTtcblx0XHRcdGlmIChwb2ludEN1cnJlbnQubW9kZWwuc2tpcCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0cG9pbnRCZWZvcmUgPSBpID4gMCA/IHBvaW50c1dpdGhUYW5nZW50c1tpIC0gMV0gOiBudWxsO1xuXHRcdFx0cG9pbnRBZnRlciA9IGkgPCBwb2ludHNMZW4gLSAxID8gcG9pbnRzV2l0aFRhbmdlbnRzW2kgKyAxXSA6IG51bGw7XG5cdFx0XHRpZiAocG9pbnRCZWZvcmUgJiYgIXBvaW50QmVmb3JlLm1vZGVsLnNraXApIHtcblx0XHRcdFx0ZGVsdGFYID0gKHBvaW50Q3VycmVudC5tb2RlbC54IC0gcG9pbnRCZWZvcmUubW9kZWwueCkgLyAzO1xuXHRcdFx0XHRwb2ludEN1cnJlbnQubW9kZWwuY29udHJvbFBvaW50UHJldmlvdXNYID0gcG9pbnRDdXJyZW50Lm1vZGVsLnggLSBkZWx0YVg7XG5cdFx0XHRcdHBvaW50Q3VycmVudC5tb2RlbC5jb250cm9sUG9pbnRQcmV2aW91c1kgPSBwb2ludEN1cnJlbnQubW9kZWwueSAtIGRlbHRhWCAqIHBvaW50Q3VycmVudC5tSztcblx0XHRcdH1cblx0XHRcdGlmIChwb2ludEFmdGVyICYmICFwb2ludEFmdGVyLm1vZGVsLnNraXApIHtcblx0XHRcdFx0ZGVsdGFYID0gKHBvaW50QWZ0ZXIubW9kZWwueCAtIHBvaW50Q3VycmVudC5tb2RlbC54KSAvIDM7XG5cdFx0XHRcdHBvaW50Q3VycmVudC5tb2RlbC5jb250cm9sUG9pbnROZXh0WCA9IHBvaW50Q3VycmVudC5tb2RlbC54ICsgZGVsdGFYO1xuXHRcdFx0XHRwb2ludEN1cnJlbnQubW9kZWwuY29udHJvbFBvaW50TmV4dFkgPSBwb2ludEN1cnJlbnQubW9kZWwueSArIGRlbHRhWCAqIHBvaW50Q3VycmVudC5tSztcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGhlbHBlcnMubmV4dEl0ZW0gPSBmdW5jdGlvbihjb2xsZWN0aW9uLCBpbmRleCwgbG9vcCkge1xuXHRcdGlmIChsb29wKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXggPj0gY29sbGVjdGlvbi5sZW5ndGggLSAxID8gY29sbGVjdGlvblswXSA6IGNvbGxlY3Rpb25baW5kZXggKyAxXTtcblx0XHR9XG5cdFx0cmV0dXJuIGluZGV4ID49IGNvbGxlY3Rpb24ubGVuZ3RoIC0gMSA/IGNvbGxlY3Rpb25bY29sbGVjdGlvbi5sZW5ndGggLSAxXSA6IGNvbGxlY3Rpb25baW5kZXggKyAxXTtcblx0fTtcblx0aGVscGVycy5wcmV2aW91c0l0ZW0gPSBmdW5jdGlvbihjb2xsZWN0aW9uLCBpbmRleCwgbG9vcCkge1xuXHRcdGlmIChsb29wKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXggPD0gMCA/IGNvbGxlY3Rpb25bY29sbGVjdGlvbi5sZW5ndGggLSAxXSA6IGNvbGxlY3Rpb25baW5kZXggLSAxXTtcblx0XHR9XG5cdFx0cmV0dXJuIGluZGV4IDw9IDAgPyBjb2xsZWN0aW9uWzBdIDogY29sbGVjdGlvbltpbmRleCAtIDFdO1xuXHR9O1xuXHQvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgbmljZSBudW1iZXIgYWxnb3JpdGhtIHVzZWQgaW4gZGV0ZXJtaW5pbmcgd2hlcmUgYXhpcyBsYWJlbHMgd2lsbCBnb1xuXHRoZWxwZXJzLm5pY2VOdW0gPSBmdW5jdGlvbihyYW5nZSwgcm91bmQpIHtcblx0XHR2YXIgZXhwb25lbnQgPSBNYXRoLmZsb29yKGhlbHBlcnMubG9nMTAocmFuZ2UpKTtcblx0XHR2YXIgZnJhY3Rpb24gPSByYW5nZSAvIE1hdGgucG93KDEwLCBleHBvbmVudCk7XG5cdFx0dmFyIG5pY2VGcmFjdGlvbjtcblxuXHRcdGlmIChyb3VuZCkge1xuXHRcdFx0aWYgKGZyYWN0aW9uIDwgMS41KSB7XG5cdFx0XHRcdG5pY2VGcmFjdGlvbiA9IDE7XG5cdFx0XHR9IGVsc2UgaWYgKGZyYWN0aW9uIDwgMykge1xuXHRcdFx0XHRuaWNlRnJhY3Rpb24gPSAyO1xuXHRcdFx0fSBlbHNlIGlmIChmcmFjdGlvbiA8IDcpIHtcblx0XHRcdFx0bmljZUZyYWN0aW9uID0gNTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5pY2VGcmFjdGlvbiA9IDEwO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoZnJhY3Rpb24gPD0gMS4wKSB7XG5cdFx0XHRuaWNlRnJhY3Rpb24gPSAxO1xuXHRcdH0gZWxzZSBpZiAoZnJhY3Rpb24gPD0gMikge1xuXHRcdFx0bmljZUZyYWN0aW9uID0gMjtcblx0XHR9IGVsc2UgaWYgKGZyYWN0aW9uIDw9IDUpIHtcblx0XHRcdG5pY2VGcmFjdGlvbiA9IDU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5pY2VGcmFjdGlvbiA9IDEwO1xuXHRcdH1cblxuXHRcdHJldHVybiBuaWNlRnJhY3Rpb24gKiBNYXRoLnBvdygxMCwgZXhwb25lbnQpO1xuXHR9O1xuXHQvLyBSZXF1ZXN0IGFuaW1hdGlvbiBwb2x5ZmlsbCAtIGh0dHA6Ly93d3cucGF1bGlyaXNoLmNvbS8yMDExL3JlcXVlc3RhbmltYXRpb25mcmFtZS1mb3Itc21hcnQtYW5pbWF0aW5nL1xuXHRoZWxwZXJzLnJlcXVlc3RBbmltRnJhbWUgPSAoZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oY2FsbGJhY2spIHtcblx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG5cdFx0XHR3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG5cdFx0XHR3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG5cdFx0XHR3aW5kb3cub1JlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0d2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG5cdFx0XHRmdW5jdGlvbihjYWxsYmFjaykge1xuXHRcdFx0XHRyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoY2FsbGJhY2ssIDEwMDAgLyA2MCk7XG5cdFx0XHR9O1xuXHR9KCkpO1xuXHQvLyAtLSBET00gbWV0aG9kc1xuXHRoZWxwZXJzLmdldFJlbGF0aXZlUG9zaXRpb24gPSBmdW5jdGlvbihldnQsIGNoYXJ0KSB7XG5cdFx0dmFyIG1vdXNlWCwgbW91c2VZO1xuXHRcdHZhciBlID0gZXZ0Lm9yaWdpbmFsRXZlbnQgfHwgZXZ0O1xuXHRcdHZhciBjYW52YXMgPSBldnQudGFyZ2V0IHx8IGV2dC5zcmNFbGVtZW50O1xuXHRcdHZhciBib3VuZGluZ1JlY3QgPSBjYW52YXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHR2YXIgdG91Y2hlcyA9IGUudG91Y2hlcztcblx0XHRpZiAodG91Y2hlcyAmJiB0b3VjaGVzLmxlbmd0aCA+IDApIHtcblx0XHRcdG1vdXNlWCA9IHRvdWNoZXNbMF0uY2xpZW50WDtcblx0XHRcdG1vdXNlWSA9IHRvdWNoZXNbMF0uY2xpZW50WTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtb3VzZVggPSBlLmNsaWVudFg7XG5cdFx0XHRtb3VzZVkgPSBlLmNsaWVudFk7XG5cdFx0fVxuXG5cdFx0Ly8gU2NhbGUgbW91c2UgY29vcmRpbmF0ZXMgaW50byBjYW52YXMgY29vcmRpbmF0ZXNcblx0XHQvLyBieSBmb2xsb3dpbmcgdGhlIHBhdHRlcm4gbGFpZCBvdXQgYnkgJ2plcnJ5aicgaW4gdGhlIGNvbW1lbnRzIG9mXG5cdFx0Ly8gaHR0cDovL3d3dy5odG1sNWNhbnZhc3R1dG9yaWFscy5jb20vYWR2YW5jZWQvaHRtbDUtY2FudmFzLW1vdXNlLWNvb3JkaW5hdGVzL1xuXHRcdHZhciBwYWRkaW5nTGVmdCA9IHBhcnNlRmxvYXQoaGVscGVycy5nZXRTdHlsZShjYW52YXMsICdwYWRkaW5nLWxlZnQnKSk7XG5cdFx0dmFyIHBhZGRpbmdUb3AgPSBwYXJzZUZsb2F0KGhlbHBlcnMuZ2V0U3R5bGUoY2FudmFzLCAncGFkZGluZy10b3AnKSk7XG5cdFx0dmFyIHBhZGRpbmdSaWdodCA9IHBhcnNlRmxvYXQoaGVscGVycy5nZXRTdHlsZShjYW52YXMsICdwYWRkaW5nLXJpZ2h0JykpO1xuXHRcdHZhciBwYWRkaW5nQm90dG9tID0gcGFyc2VGbG9hdChoZWxwZXJzLmdldFN0eWxlKGNhbnZhcywgJ3BhZGRpbmctYm90dG9tJykpO1xuXHRcdHZhciB3aWR0aCA9IGJvdW5kaW5nUmVjdC5yaWdodCAtIGJvdW5kaW5nUmVjdC5sZWZ0IC0gcGFkZGluZ0xlZnQgLSBwYWRkaW5nUmlnaHQ7XG5cdFx0dmFyIGhlaWdodCA9IGJvdW5kaW5nUmVjdC5ib3R0b20gLSBib3VuZGluZ1JlY3QudG9wIC0gcGFkZGluZ1RvcCAtIHBhZGRpbmdCb3R0b207XG5cblx0XHQvLyBXZSBkaXZpZGUgYnkgdGhlIGN1cnJlbnQgZGV2aWNlIHBpeGVsIHJhdGlvLCBiZWNhdXNlIHRoZSBjYW52YXMgaXMgc2NhbGVkIHVwIGJ5IHRoYXQgYW1vdW50IGluIGVhY2ggZGlyZWN0aW9uLiBIb3dldmVyXG5cdFx0Ly8gdGhlIGJhY2tlbmQgbW9kZWwgaXMgaW4gdW5zY2FsZWQgY29vcmRpbmF0ZXMuIFNpbmNlIHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGggb3VyIG1vZGVsIGNvb3JkaW5hdGVzLCB3ZSBnbyBiYWNrIGhlcmVcblx0XHRtb3VzZVggPSBNYXRoLnJvdW5kKChtb3VzZVggLSBib3VuZGluZ1JlY3QubGVmdCAtIHBhZGRpbmdMZWZ0KSAvICh3aWR0aCkgKiBjYW52YXMud2lkdGggLyBjaGFydC5jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyk7XG5cdFx0bW91c2VZID0gTWF0aC5yb3VuZCgobW91c2VZIC0gYm91bmRpbmdSZWN0LnRvcCAtIHBhZGRpbmdUb3ApIC8gKGhlaWdodCkgKiBjYW52YXMuaGVpZ2h0IC8gY2hhcnQuY3VycmVudERldmljZVBpeGVsUmF0aW8pO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHg6IG1vdXNlWCxcblx0XHRcdHk6IG1vdXNlWVxuXHRcdH07XG5cblx0fTtcblxuXHQvLyBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiB0byBjb252ZXJ0IG1heC13aWR0aC9tYXgtaGVpZ2h0IHZhbHVlcyB0aGF0IG1heSBiZSBwZXJjZW50YWdlcyBpbnRvIGEgbnVtYmVyXG5cdGZ1bmN0aW9uIHBhcnNlTWF4U3R5bGUoc3R5bGVWYWx1ZSwgbm9kZSwgcGFyZW50UHJvcGVydHkpIHtcblx0XHR2YXIgdmFsdWVJblBpeGVscztcblx0XHRpZiAodHlwZW9mIHN0eWxlVmFsdWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHR2YWx1ZUluUGl4ZWxzID0gcGFyc2VJbnQoc3R5bGVWYWx1ZSwgMTApO1xuXG5cdFx0XHRpZiAoc3R5bGVWYWx1ZS5pbmRleE9mKCclJykgIT09IC0xKSB7XG5cdFx0XHRcdC8vIHBlcmNlbnRhZ2UgKiBzaXplIGluIGRpbWVuc2lvblxuXHRcdFx0XHR2YWx1ZUluUGl4ZWxzID0gdmFsdWVJblBpeGVscyAvIDEwMCAqIG5vZGUucGFyZW50Tm9kZVtwYXJlbnRQcm9wZXJ0eV07XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhbHVlSW5QaXhlbHMgPSBzdHlsZVZhbHVlO1xuXHRcdH1cblxuXHRcdHJldHVybiB2YWx1ZUluUGl4ZWxzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgaWYgdGhlIGdpdmVuIHZhbHVlIGNvbnRhaW5zIGFuIGVmZmVjdGl2ZSBjb25zdHJhaW50LlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0ZnVuY3Rpb24gaXNDb25zdHJhaW5lZFZhbHVlKHZhbHVlKSB7XG5cdFx0cmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09ICdub25lJztcblx0fVxuXG5cdC8vIFByaXZhdGUgaGVscGVyIHRvIGdldCBhIGNvbnN0cmFpbnQgZGltZW5zaW9uXG5cdC8vIEBwYXJhbSBkb21Ob2RlIDogdGhlIG5vZGUgdG8gY2hlY2sgdGhlIGNvbnN0cmFpbnQgb25cblx0Ly8gQHBhcmFtIG1heFN0eWxlIDogdGhlIHN0eWxlIHRoYXQgZGVmaW5lcyB0aGUgbWF4aW11bSBmb3IgdGhlIGRpcmVjdGlvbiB3ZSBhcmUgdXNpbmcgKG1heFdpZHRoIC8gbWF4SGVpZ2h0KVxuXHQvLyBAcGFyYW0gcGVyY2VudGFnZVByb3BlcnR5IDogcHJvcGVydHkgb2YgcGFyZW50IHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHdpZHRoIGFzIGEgcGVyY2VudGFnZVxuXHQvLyBAc2VlIGh0dHA6Ly93d3cubmF0aGFuYWVsam9uZXMuY29tL2Jsb2cvMjAxMy9yZWFkaW5nLW1heC13aWR0aC1jcm9zcy1icm93c2VyXG5cdGZ1bmN0aW9uIGdldENvbnN0cmFpbnREaW1lbnNpb24oZG9tTm9kZSwgbWF4U3R5bGUsIHBlcmNlbnRhZ2VQcm9wZXJ0eSkge1xuXHRcdHZhciB2aWV3ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXc7XG5cdFx0dmFyIHBhcmVudE5vZGUgPSBoZWxwZXJzLl9nZXRQYXJlbnROb2RlKGRvbU5vZGUpO1xuXHRcdHZhciBjb25zdHJhaW5lZE5vZGUgPSB2aWV3LmdldENvbXB1dGVkU3R5bGUoZG9tTm9kZSlbbWF4U3R5bGVdO1xuXHRcdHZhciBjb25zdHJhaW5lZENvbnRhaW5lciA9IHZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnROb2RlKVttYXhTdHlsZV07XG5cdFx0dmFyIGhhc0NOb2RlID0gaXNDb25zdHJhaW5lZFZhbHVlKGNvbnN0cmFpbmVkTm9kZSk7XG5cdFx0dmFyIGhhc0NDb250YWluZXIgPSBpc0NvbnN0cmFpbmVkVmFsdWUoY29uc3RyYWluZWRDb250YWluZXIpO1xuXHRcdHZhciBpbmZpbml0eSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblxuXHRcdGlmIChoYXNDTm9kZSB8fCBoYXNDQ29udGFpbmVyKSB7XG5cdFx0XHRyZXR1cm4gTWF0aC5taW4oXG5cdFx0XHRcdGhhc0NOb2RlID8gcGFyc2VNYXhTdHlsZShjb25zdHJhaW5lZE5vZGUsIGRvbU5vZGUsIHBlcmNlbnRhZ2VQcm9wZXJ0eSkgOiBpbmZpbml0eSxcblx0XHRcdFx0aGFzQ0NvbnRhaW5lciA/IHBhcnNlTWF4U3R5bGUoY29uc3RyYWluZWRDb250YWluZXIsIHBhcmVudE5vZGUsIHBlcmNlbnRhZ2VQcm9wZXJ0eSkgOiBpbmZpbml0eSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICdub25lJztcblx0fVxuXHQvLyByZXR1cm5zIE51bWJlciBvciB1bmRlZmluZWQgaWYgbm8gY29uc3RyYWludFxuXHRoZWxwZXJzLmdldENvbnN0cmFpbnRXaWR0aCA9IGZ1bmN0aW9uKGRvbU5vZGUpIHtcblx0XHRyZXR1cm4gZ2V0Q29uc3RyYWludERpbWVuc2lvbihkb21Ob2RlLCAnbWF4LXdpZHRoJywgJ2NsaWVudFdpZHRoJyk7XG5cdH07XG5cdC8vIHJldHVybnMgTnVtYmVyIG9yIHVuZGVmaW5lZCBpZiBubyBjb25zdHJhaW50XG5cdGhlbHBlcnMuZ2V0Q29uc3RyYWludEhlaWdodCA9IGZ1bmN0aW9uKGRvbU5vZGUpIHtcblx0XHRyZXR1cm4gZ2V0Q29uc3RyYWludERpbWVuc2lvbihkb21Ob2RlLCAnbWF4LWhlaWdodCcsICdjbGllbnRIZWlnaHQnKTtcblx0fTtcblx0LyoqXG5cdCAqIEBwcml2YXRlXG4gXHQgKi9cblx0aGVscGVycy5fY2FsY3VsYXRlUGFkZGluZyA9IGZ1bmN0aW9uKGNvbnRhaW5lciwgcGFkZGluZywgcGFyZW50RGltZW5zaW9uKSB7XG5cdFx0cGFkZGluZyA9IGhlbHBlcnMuZ2V0U3R5bGUoY29udGFpbmVyLCBwYWRkaW5nKTtcblxuXHRcdHJldHVybiBwYWRkaW5nLmluZGV4T2YoJyUnKSA+IC0xID8gcGFyZW50RGltZW5zaW9uIC8gcGFyc2VJbnQocGFkZGluZywgMTApIDogcGFyc2VJbnQocGFkZGluZywgMTApO1xuXHR9O1xuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGhlbHBlcnMuX2dldFBhcmVudE5vZGUgPSBmdW5jdGlvbihkb21Ob2RlKSB7XG5cdFx0dmFyIHBhcmVudCA9IGRvbU5vZGUucGFyZW50Tm9kZTtcblx0XHRpZiAocGFyZW50ICYmIHBhcmVudC5ob3N0KSB7XG5cdFx0XHRwYXJlbnQgPSBwYXJlbnQuaG9zdDtcblx0XHR9XG5cdFx0cmV0dXJuIHBhcmVudDtcblx0fTtcblx0aGVscGVycy5nZXRNYXhpbXVtV2lkdGggPSBmdW5jdGlvbihkb21Ob2RlKSB7XG5cdFx0dmFyIGNvbnRhaW5lciA9IGhlbHBlcnMuX2dldFBhcmVudE5vZGUoZG9tTm9kZSk7XG5cdFx0aWYgKCFjb250YWluZXIpIHtcblx0XHRcdHJldHVybiBkb21Ob2RlLmNsaWVudFdpZHRoO1xuXHRcdH1cblxuXHRcdHZhciBjbGllbnRXaWR0aCA9IGNvbnRhaW5lci5jbGllbnRXaWR0aDtcblx0XHR2YXIgcGFkZGluZ0xlZnQgPSBoZWxwZXJzLl9jYWxjdWxhdGVQYWRkaW5nKGNvbnRhaW5lciwgJ3BhZGRpbmctbGVmdCcsIGNsaWVudFdpZHRoKTtcblx0XHR2YXIgcGFkZGluZ1JpZ2h0ID0gaGVscGVycy5fY2FsY3VsYXRlUGFkZGluZyhjb250YWluZXIsICdwYWRkaW5nLXJpZ2h0JywgY2xpZW50V2lkdGgpO1xuXG5cdFx0dmFyIHcgPSBjbGllbnRXaWR0aCAtIHBhZGRpbmdMZWZ0IC0gcGFkZGluZ1JpZ2h0O1xuXHRcdHZhciBjdyA9IGhlbHBlcnMuZ2V0Q29uc3RyYWludFdpZHRoKGRvbU5vZGUpO1xuXHRcdHJldHVybiBpc05hTihjdykgPyB3IDogTWF0aC5taW4odywgY3cpO1xuXHR9O1xuXHRoZWxwZXJzLmdldE1heGltdW1IZWlnaHQgPSBmdW5jdGlvbihkb21Ob2RlKSB7XG5cdFx0dmFyIGNvbnRhaW5lciA9IGhlbHBlcnMuX2dldFBhcmVudE5vZGUoZG9tTm9kZSk7XG5cdFx0aWYgKCFjb250YWluZXIpIHtcblx0XHRcdHJldHVybiBkb21Ob2RlLmNsaWVudEhlaWdodDtcblx0XHR9XG5cblx0XHR2YXIgY2xpZW50SGVpZ2h0ID0gY29udGFpbmVyLmNsaWVudEhlaWdodDtcblx0XHR2YXIgcGFkZGluZ1RvcCA9IGhlbHBlcnMuX2NhbGN1bGF0ZVBhZGRpbmcoY29udGFpbmVyLCAncGFkZGluZy10b3AnLCBjbGllbnRIZWlnaHQpO1xuXHRcdHZhciBwYWRkaW5nQm90dG9tID0gaGVscGVycy5fY2FsY3VsYXRlUGFkZGluZyhjb250YWluZXIsICdwYWRkaW5nLWJvdHRvbScsIGNsaWVudEhlaWdodCk7XG5cblx0XHR2YXIgaCA9IGNsaWVudEhlaWdodCAtIHBhZGRpbmdUb3AgLSBwYWRkaW5nQm90dG9tO1xuXHRcdHZhciBjaCA9IGhlbHBlcnMuZ2V0Q29uc3RyYWludEhlaWdodChkb21Ob2RlKTtcblx0XHRyZXR1cm4gaXNOYU4oY2gpID8gaCA6IE1hdGgubWluKGgsIGNoKTtcblx0fTtcblx0aGVscGVycy5nZXRTdHlsZSA9IGZ1bmN0aW9uKGVsLCBwcm9wZXJ0eSkge1xuXHRcdHJldHVybiBlbC5jdXJyZW50U3R5bGUgP1xuXHRcdFx0ZWwuY3VycmVudFN0eWxlW3Byb3BlcnR5XSA6XG5cdFx0XHRkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KTtcblx0fTtcblx0aGVscGVycy5yZXRpbmFTY2FsZSA9IGZ1bmN0aW9uKGNoYXJ0LCBmb3JjZVJhdGlvKSB7XG5cdFx0dmFyIHBpeGVsUmF0aW8gPSBjaGFydC5jdXJyZW50RGV2aWNlUGl4ZWxSYXRpbyA9IGZvcmNlUmF0aW8gfHwgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKSB8fCAxO1xuXHRcdGlmIChwaXhlbFJhdGlvID09PSAxKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGNhbnZhcyA9IGNoYXJ0LmNhbnZhcztcblx0XHR2YXIgaGVpZ2h0ID0gY2hhcnQuaGVpZ2h0O1xuXHRcdHZhciB3aWR0aCA9IGNoYXJ0LndpZHRoO1xuXG5cdFx0Y2FudmFzLmhlaWdodCA9IGhlaWdodCAqIHBpeGVsUmF0aW87XG5cdFx0Y2FudmFzLndpZHRoID0gd2lkdGggKiBwaXhlbFJhdGlvO1xuXHRcdGNoYXJ0LmN0eC5zY2FsZShwaXhlbFJhdGlvLCBwaXhlbFJhdGlvKTtcblxuXHRcdC8vIElmIG5vIHN0eWxlIGhhcyBiZWVuIHNldCBvbiB0aGUgY2FudmFzLCB0aGUgcmVuZGVyIHNpemUgaXMgdXNlZCBhcyBkaXNwbGF5IHNpemUsXG5cdFx0Ly8gbWFraW5nIHRoZSBjaGFydCB2aXN1YWxseSBiaWdnZXIsIHNvIGxldCdzIGVuZm9yY2UgaXQgdG8gdGhlIFwiY29ycmVjdFwiIHZhbHVlcy5cblx0XHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzM1NzVcblx0XHRpZiAoIWNhbnZhcy5zdHlsZS5oZWlnaHQgJiYgIWNhbnZhcy5zdHlsZS53aWR0aCkge1xuXHRcdFx0Y2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG5cdFx0XHRjYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG5cdFx0fVxuXHR9O1xuXHQvLyAtLSBDYW52YXMgbWV0aG9kc1xuXHRoZWxwZXJzLmZvbnRTdHJpbmcgPSBmdW5jdGlvbihwaXhlbFNpemUsIGZvbnRTdHlsZSwgZm9udEZhbWlseSkge1xuXHRcdHJldHVybiBmb250U3R5bGUgKyAnICcgKyBwaXhlbFNpemUgKyAncHggJyArIGZvbnRGYW1pbHk7XG5cdH07XG5cdGhlbHBlcnMubG9uZ2VzdFRleHQgPSBmdW5jdGlvbihjdHgsIGZvbnQsIGFycmF5T2ZUaGluZ3MsIGNhY2hlKSB7XG5cdFx0Y2FjaGUgPSBjYWNoZSB8fCB7fTtcblx0XHR2YXIgZGF0YSA9IGNhY2hlLmRhdGEgPSBjYWNoZS5kYXRhIHx8IHt9O1xuXHRcdHZhciBnYyA9IGNhY2hlLmdhcmJhZ2VDb2xsZWN0ID0gY2FjaGUuZ2FyYmFnZUNvbGxlY3QgfHwgW107XG5cblx0XHRpZiAoY2FjaGUuZm9udCAhPT0gZm9udCkge1xuXHRcdFx0ZGF0YSA9IGNhY2hlLmRhdGEgPSB7fTtcblx0XHRcdGdjID0gY2FjaGUuZ2FyYmFnZUNvbGxlY3QgPSBbXTtcblx0XHRcdGNhY2hlLmZvbnQgPSBmb250O1xuXHRcdH1cblxuXHRcdGN0eC5mb250ID0gZm9udDtcblx0XHR2YXIgbG9uZ2VzdCA9IDA7XG5cdFx0aGVscGVycy5lYWNoKGFycmF5T2ZUaGluZ3MsIGZ1bmN0aW9uKHRoaW5nKSB7XG5cdFx0XHQvLyBVbmRlZmluZWQgc3RyaW5ncyBhbmQgYXJyYXlzIHNob3VsZCBub3QgYmUgbWVhc3VyZWRcblx0XHRcdGlmICh0aGluZyAhPT0gdW5kZWZpbmVkICYmIHRoaW5nICE9PSBudWxsICYmIGhlbHBlcnMuaXNBcnJheSh0aGluZykgIT09IHRydWUpIHtcblx0XHRcdFx0bG9uZ2VzdCA9IGhlbHBlcnMubWVhc3VyZVRleHQoY3R4LCBkYXRhLCBnYywgbG9uZ2VzdCwgdGhpbmcpO1xuXHRcdFx0fSBlbHNlIGlmIChoZWxwZXJzLmlzQXJyYXkodGhpbmcpKSB7XG5cdFx0XHRcdC8vIGlmIGl0IGlzIGFuIGFycmF5IGxldHMgbWVhc3VyZSBlYWNoIGVsZW1lbnRcblx0XHRcdFx0Ly8gdG8gZG8gbWF5YmUgc2ltcGxpZnkgdGhpcyBmdW5jdGlvbiBhIGJpdCBzbyB3ZSBjYW4gZG8gdGhpcyBtb3JlIHJlY3Vyc2l2ZWx5P1xuXHRcdFx0XHRoZWxwZXJzLmVhY2godGhpbmcsIGZ1bmN0aW9uKG5lc3RlZFRoaW5nKSB7XG5cdFx0XHRcdFx0Ly8gVW5kZWZpbmVkIHN0cmluZ3MgYW5kIGFycmF5cyBzaG91bGQgbm90IGJlIG1lYXN1cmVkXG5cdFx0XHRcdFx0aWYgKG5lc3RlZFRoaW5nICE9PSB1bmRlZmluZWQgJiYgbmVzdGVkVGhpbmcgIT09IG51bGwgJiYgIWhlbHBlcnMuaXNBcnJheShuZXN0ZWRUaGluZykpIHtcblx0XHRcdFx0XHRcdGxvbmdlc3QgPSBoZWxwZXJzLm1lYXN1cmVUZXh0KGN0eCwgZGF0YSwgZ2MsIGxvbmdlc3QsIG5lc3RlZFRoaW5nKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0dmFyIGdjTGVuID0gZ2MubGVuZ3RoIC8gMjtcblx0XHRpZiAoZ2NMZW4gPiBhcnJheU9mVGhpbmdzLmxlbmd0aCkge1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBnY0xlbjsgaSsrKSB7XG5cdFx0XHRcdGRlbGV0ZSBkYXRhW2djW2ldXTtcblx0XHRcdH1cblx0XHRcdGdjLnNwbGljZSgwLCBnY0xlbik7XG5cdFx0fVxuXHRcdHJldHVybiBsb25nZXN0O1xuXHR9O1xuXHRoZWxwZXJzLm1lYXN1cmVUZXh0ID0gZnVuY3Rpb24oY3R4LCBkYXRhLCBnYywgbG9uZ2VzdCwgc3RyaW5nKSB7XG5cdFx0dmFyIHRleHRXaWR0aCA9IGRhdGFbc3RyaW5nXTtcblx0XHRpZiAoIXRleHRXaWR0aCkge1xuXHRcdFx0dGV4dFdpZHRoID0gZGF0YVtzdHJpbmddID0gY3R4Lm1lYXN1cmVUZXh0KHN0cmluZykud2lkdGg7XG5cdFx0XHRnYy5wdXNoKHN0cmluZyk7XG5cdFx0fVxuXHRcdGlmICh0ZXh0V2lkdGggPiBsb25nZXN0KSB7XG5cdFx0XHRsb25nZXN0ID0gdGV4dFdpZHRoO1xuXHRcdH1cblx0XHRyZXR1cm4gbG9uZ2VzdDtcblx0fTtcblx0aGVscGVycy5udW1iZXJPZkxhYmVsTGluZXMgPSBmdW5jdGlvbihhcnJheU9mVGhpbmdzKSB7XG5cdFx0dmFyIG51bWJlck9mTGluZXMgPSAxO1xuXHRcdGhlbHBlcnMuZWFjaChhcnJheU9mVGhpbmdzLCBmdW5jdGlvbih0aGluZykge1xuXHRcdFx0aWYgKGhlbHBlcnMuaXNBcnJheSh0aGluZykpIHtcblx0XHRcdFx0aWYgKHRoaW5nLmxlbmd0aCA+IG51bWJlck9mTGluZXMpIHtcblx0XHRcdFx0XHRudW1iZXJPZkxpbmVzID0gdGhpbmcubGVuZ3RoO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0cmV0dXJuIG51bWJlck9mTGluZXM7XG5cdH07XG5cblx0aGVscGVycy5jb2xvciA9ICFjb2xvciA/XG5cdFx0ZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoJ0NvbG9yLmpzIG5vdCBmb3VuZCEnKTtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9IDpcblx0XHRmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0LyogZ2xvYmFsIENhbnZhc0dyYWRpZW50ICovXG5cdFx0XHRpZiAodmFsdWUgaW5zdGFuY2VvZiBDYW52YXNHcmFkaWVudCkge1xuXHRcdFx0XHR2YWx1ZSA9IGRlZmF1bHRzLmdsb2JhbC5kZWZhdWx0Q29sb3I7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBjb2xvcih2YWx1ZSk7XG5cdFx0fTtcblxuXHRoZWxwZXJzLmdldEhvdmVyQ29sb3IgPSBmdW5jdGlvbihjb2xvclZhbHVlKSB7XG5cdFx0LyogZ2xvYmFsIENhbnZhc1BhdHRlcm4gKi9cblx0XHRyZXR1cm4gKGNvbG9yVmFsdWUgaW5zdGFuY2VvZiBDYW52YXNQYXR0ZXJuKSA/XG5cdFx0XHRjb2xvclZhbHVlIDpcblx0XHRcdGhlbHBlcnMuY29sb3IoY29sb3JWYWx1ZSkuc2F0dXJhdGUoMC41KS5kYXJrZW4oMC4xKS5yZ2JTdHJpbmcoKTtcblx0fTtcbn07XG5cbn0se1wiMjZcIjoyNixcIjNcIjozLFwiMzRcIjozNCxcIjQ2XCI6NDZ9XSwyOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCByZWxhdGl2ZSBwb3NpdGlvbiBmb3IgYW4gZXZlbnRcbiAqIEBwYXJhbSB7RXZlbnR8SUV2ZW50fSBldmVudCAtIFRoZSBldmVudCB0byBnZXQgdGhlIHBvc2l0aW9uIGZvclxuICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSBUaGUgY2hhcnRcbiAqIEByZXR1cm5zIHtQb2ludH0gdGhlIGV2ZW50IHBvc2l0aW9uXG4gKi9cbmZ1bmN0aW9uIGdldFJlbGF0aXZlUG9zaXRpb24oZSwgY2hhcnQpIHtcblx0aWYgKGUubmF0aXZlKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHg6IGUueCxcblx0XHRcdHk6IGUueVxuXHRcdH07XG5cdH1cblxuXHRyZXR1cm4gaGVscGVycy5nZXRSZWxhdGl2ZVBvc2l0aW9uKGUsIGNoYXJ0KTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gdHJhdmVyc2UgYWxsIG9mIHRoZSB2aXNpYmxlIGVsZW1lbnRzIGluIHRoZSBjaGFydFxuICogQHBhcmFtIGNoYXJ0IHtjaGFydH0gdGhlIGNoYXJ0XG4gKiBAcGFyYW0gaGFuZGxlciB7RnVuY3Rpb259IHRoZSBjYWxsYmFjayB0byBleGVjdXRlIGZvciBlYWNoIHZpc2libGUgaXRlbVxuICovXG5mdW5jdGlvbiBwYXJzZVZpc2libGVJdGVtcyhjaGFydCwgaGFuZGxlcikge1xuXHR2YXIgZGF0YXNldHMgPSBjaGFydC5kYXRhLmRhdGFzZXRzO1xuXHR2YXIgbWV0YSwgaSwgaiwgaWxlbiwgamxlbjtcblxuXHRmb3IgKGkgPSAwLCBpbGVuID0gZGF0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0aWYgKCFjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGkpKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoaSk7XG5cdFx0Zm9yIChqID0gMCwgamxlbiA9IG1ldGEuZGF0YS5sZW5ndGg7IGogPCBqbGVuOyArK2opIHtcblx0XHRcdHZhciBlbGVtZW50ID0gbWV0YS5kYXRhW2pdO1xuXHRcdFx0aWYgKCFlbGVtZW50Ll92aWV3LnNraXApIHtcblx0XHRcdFx0aGFuZGxlcihlbGVtZW50KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBpdGVtcyB0aGF0IGludGVyc2VjdCB0aGUgZXZlbnQgcG9zaXRpb25cbiAqIEBwYXJhbSBpdGVtcyB7Q2hhcnRFbGVtZW50W119IGVsZW1lbnRzIHRvIGZpbHRlclxuICogQHBhcmFtIHBvc2l0aW9uIHtQb2ludH0gdGhlIHBvaW50IHRvIGJlIG5lYXJlc3QgdG9cbiAqIEByZXR1cm4ge0NoYXJ0RWxlbWVudFtdfSB0aGUgbmVhcmVzdCBpdGVtc1xuICovXG5mdW5jdGlvbiBnZXRJbnRlcnNlY3RJdGVtcyhjaGFydCwgcG9zaXRpb24pIHtcblx0dmFyIGVsZW1lbnRzID0gW107XG5cblx0cGFyc2VWaXNpYmxlSXRlbXMoY2hhcnQsIGZ1bmN0aW9uKGVsZW1lbnQpIHtcblx0XHRpZiAoZWxlbWVudC5pblJhbmdlKHBvc2l0aW9uLngsIHBvc2l0aW9uLnkpKSB7XG5cdFx0XHRlbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuXHRcdH1cblx0fSk7XG5cblx0cmV0dXJuIGVsZW1lbnRzO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIGl0ZW1zIG5lYXJlc3QgdG8gdGhlIGV2ZW50IHBvc2l0aW9uIGNvbnNpZGVyaW5nIGFsbCB2aXNpYmxlIGl0ZW1zIGluIHRlaCBjaGFydFxuICogQHBhcmFtIGNoYXJ0IHtDaGFydH0gdGhlIGNoYXJ0IHRvIGxvb2sgYXQgZWxlbWVudHMgZnJvbVxuICogQHBhcmFtIHBvc2l0aW9uIHtQb2ludH0gdGhlIHBvaW50IHRvIGJlIG5lYXJlc3QgdG9cbiAqIEBwYXJhbSBpbnRlcnNlY3Qge0Jvb2xlYW59IGlmIHRydWUsIG9ubHkgY29uc2lkZXIgaXRlbXMgdGhhdCBpbnRlcnNlY3QgdGhlIHBvc2l0aW9uXG4gKiBAcGFyYW0gZGlzdGFuY2VNZXRyaWMge0Z1bmN0aW9ufSBmdW5jdGlvbiB0byBwcm92aWRlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHBvaW50c1xuICogQHJldHVybiB7Q2hhcnRFbGVtZW50W119IHRoZSBuZWFyZXN0IGl0ZW1zXG4gKi9cbmZ1bmN0aW9uIGdldE5lYXJlc3RJdGVtcyhjaGFydCwgcG9zaXRpb24sIGludGVyc2VjdCwgZGlzdGFuY2VNZXRyaWMpIHtcblx0dmFyIG1pbkRpc3RhbmNlID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuXHR2YXIgbmVhcmVzdEl0ZW1zID0gW107XG5cblx0cGFyc2VWaXNpYmxlSXRlbXMoY2hhcnQsIGZ1bmN0aW9uKGVsZW1lbnQpIHtcblx0XHRpZiAoaW50ZXJzZWN0ICYmICFlbGVtZW50LmluUmFuZ2UocG9zaXRpb24ueCwgcG9zaXRpb24ueSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgY2VudGVyID0gZWxlbWVudC5nZXRDZW50ZXJQb2ludCgpO1xuXHRcdHZhciBkaXN0YW5jZSA9IGRpc3RhbmNlTWV0cmljKHBvc2l0aW9uLCBjZW50ZXIpO1xuXG5cdFx0aWYgKGRpc3RhbmNlIDwgbWluRGlzdGFuY2UpIHtcblx0XHRcdG5lYXJlc3RJdGVtcyA9IFtlbGVtZW50XTtcblx0XHRcdG1pbkRpc3RhbmNlID0gZGlzdGFuY2U7XG5cdFx0fSBlbHNlIGlmIChkaXN0YW5jZSA9PT0gbWluRGlzdGFuY2UpIHtcblx0XHRcdC8vIENhbiBoYXZlIG11bHRpcGxlIGl0ZW1zIGF0IHRoZSBzYW1lIGRpc3RhbmNlIGluIHdoaWNoIGNhc2Ugd2Ugc29ydCBieSBzaXplXG5cdFx0XHRuZWFyZXN0SXRlbXMucHVzaChlbGVtZW50KTtcblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiBuZWFyZXN0SXRlbXM7XG59XG5cbi8qKlxuICogR2V0IGEgZGlzdGFuY2UgbWV0cmljIGZ1bmN0aW9uIGZvciB0d28gcG9pbnRzIGJhc2VkIG9uIHRoZVxuICogYXhpcyBtb2RlIHNldHRpbmdcbiAqIEBwYXJhbSB7U3RyaW5nfSBheGlzIHRoZSBheGlzIG1vZGUuIHh8eXx4eVxuICovXG5mdW5jdGlvbiBnZXREaXN0YW5jZU1ldHJpY0ZvckF4aXMoYXhpcykge1xuXHR2YXIgdXNlWCA9IGF4aXMuaW5kZXhPZigneCcpICE9PSAtMTtcblx0dmFyIHVzZVkgPSBheGlzLmluZGV4T2YoJ3knKSAhPT0gLTE7XG5cblx0cmV0dXJuIGZ1bmN0aW9uKHB0MSwgcHQyKSB7XG5cdFx0dmFyIGRlbHRhWCA9IHVzZVggPyBNYXRoLmFicyhwdDEueCAtIHB0Mi54KSA6IDA7XG5cdFx0dmFyIGRlbHRhWSA9IHVzZVkgPyBNYXRoLmFicyhwdDEueSAtIHB0Mi55KSA6IDA7XG5cdFx0cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhkZWx0YVgsIDIpICsgTWF0aC5wb3coZGVsdGFZLCAyKSk7XG5cdH07XG59XG5cbmZ1bmN0aW9uIGluZGV4TW9kZShjaGFydCwgZSwgb3B0aW9ucykge1xuXHR2YXIgcG9zaXRpb24gPSBnZXRSZWxhdGl2ZVBvc2l0aW9uKGUsIGNoYXJ0KTtcblx0Ly8gRGVmYXVsdCBheGlzIGZvciBpbmRleCBtb2RlIGlzICd4JyB0byBtYXRjaCBvbGQgYmVoYXZpb3VyXG5cdG9wdGlvbnMuYXhpcyA9IG9wdGlvbnMuYXhpcyB8fCAneCc7XG5cdHZhciBkaXN0YW5jZU1ldHJpYyA9IGdldERpc3RhbmNlTWV0cmljRm9yQXhpcyhvcHRpb25zLmF4aXMpO1xuXHR2YXIgaXRlbXMgPSBvcHRpb25zLmludGVyc2VjdCA/IGdldEludGVyc2VjdEl0ZW1zKGNoYXJ0LCBwb3NpdGlvbikgOiBnZXROZWFyZXN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBmYWxzZSwgZGlzdGFuY2VNZXRyaWMpO1xuXHR2YXIgZWxlbWVudHMgPSBbXTtcblxuXHRpZiAoIWl0ZW1zLmxlbmd0aCkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXG5cdGNoYXJ0LmRhdGEuZGF0YXNldHMuZm9yRWFjaChmdW5jdGlvbihkYXRhc2V0LCBkYXRhc2V0SW5kZXgpIHtcblx0XHRpZiAoY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShkYXRhc2V0SW5kZXgpKSB7XG5cdFx0XHR2YXIgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG5cdFx0XHR2YXIgZWxlbWVudCA9IG1ldGEuZGF0YVtpdGVtc1swXS5faW5kZXhdO1xuXG5cdFx0XHQvLyBkb24ndCBjb3VudCBpdGVtcyB0aGF0IGFyZSBza2lwcGVkIChudWxsIGRhdGEpXG5cdFx0XHRpZiAoZWxlbWVudCAmJiAhZWxlbWVudC5fdmlldy5za2lwKSB7XG5cdFx0XHRcdGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRyZXR1cm4gZWxlbWVudHM7XG59XG5cbi8qKlxuICogQGludGVyZmFjZSBJSW50ZXJhY3Rpb25PcHRpb25zXG4gKi9cbi8qKlxuICogSWYgdHJ1ZSwgb25seSBjb25zaWRlciBpdGVtcyB0aGF0IGludGVyc2VjdCB0aGUgcG9pbnRcbiAqIEBuYW1lIElJbnRlcmZhY2VPcHRpb25zI2Jvb2xlYW5cbiAqIEB0eXBlIEJvb2xlYW5cbiAqL1xuXG4vKipcbiAqIENvbnRhaW5zIGludGVyYWN0aW9uIHJlbGF0ZWQgZnVuY3Rpb25zXG4gKiBAbmFtZXNwYWNlIENoYXJ0LkludGVyYWN0aW9uXG4gKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuXHQvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGRpZmZlcmVudCBtb2Rlc1xuXHRtb2Rlczoge1xuXHRcdHNpbmdsZTogZnVuY3Rpb24oY2hhcnQsIGUpIHtcblx0XHRcdHZhciBwb3NpdGlvbiA9IGdldFJlbGF0aXZlUG9zaXRpb24oZSwgY2hhcnQpO1xuXHRcdFx0dmFyIGVsZW1lbnRzID0gW107XG5cblx0XHRcdHBhcnNlVmlzaWJsZUl0ZW1zKGNoYXJ0LCBmdW5jdGlvbihlbGVtZW50KSB7XG5cdFx0XHRcdGlmIChlbGVtZW50LmluUmFuZ2UocG9zaXRpb24ueCwgcG9zaXRpb24ueSkpIHtcblx0XHRcdFx0XHRlbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuXHRcdFx0XHRcdHJldHVybiBlbGVtZW50cztcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiBlbGVtZW50cy5zbGljZSgwLCAxKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQGZ1bmN0aW9uIENoYXJ0LkludGVyYWN0aW9uLm1vZGVzLmxhYmVsXG5cdFx0ICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjQuMFxuXHRcdCAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdGxhYmVsOiBpbmRleE1vZGUsXG5cblx0XHQvKipcblx0XHQgKiBSZXR1cm5zIGl0ZW1zIGF0IHRoZSBzYW1lIGluZGV4LiBJZiB0aGUgb3B0aW9ucy5pbnRlcnNlY3QgcGFyYW1ldGVyIGlzIHRydWUsIHdlIG9ubHkgcmV0dXJuIGl0ZW1zIGlmIHdlIGludGVyc2VjdCBzb21ldGhpbmdcblx0XHQgKiBJZiB0aGUgb3B0aW9ucy5pbnRlcnNlY3QgbW9kZSBpcyBmYWxzZSwgd2UgZmluZCB0aGUgbmVhcmVzdCBpdGVtIGFuZCByZXR1cm4gdGhlIGl0ZW1zIGF0IHRoZSBzYW1lIGluZGV4IGFzIHRoYXQgaXRlbVxuXHRcdCAqIEBmdW5jdGlvbiBDaGFydC5JbnRlcmFjdGlvbi5tb2Rlcy5pbmRleFxuXHRcdCAqIEBzaW5jZSB2Mi40LjBcblx0XHQgKiBAcGFyYW0gY2hhcnQge2NoYXJ0fSB0aGUgY2hhcnQgd2UgYXJlIHJldHVybmluZyBpdGVtcyBmcm9tXG5cdFx0ICogQHBhcmFtIGUge0V2ZW50fSB0aGUgZXZlbnQgd2UgYXJlIGZpbmQgdGhpbmdzIGF0XG5cdFx0ICogQHBhcmFtIG9wdGlvbnMge0lJbnRlcmFjdGlvbk9wdGlvbnN9IG9wdGlvbnMgdG8gdXNlIGR1cmluZyBpbnRlcmFjdGlvblxuXHRcdCAqIEByZXR1cm4ge0NoYXJ0LkVsZW1lbnRbXX0gQXJyYXkgb2YgZWxlbWVudHMgdGhhdCBhcmUgdW5kZXIgdGhlIHBvaW50LiBJZiBub25lIGFyZSBmb3VuZCwgYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWRcblx0XHQgKi9cblx0XHRpbmRleDogaW5kZXhNb2RlLFxuXG5cdFx0LyoqXG5cdFx0ICogUmV0dXJucyBpdGVtcyBpbiB0aGUgc2FtZSBkYXRhc2V0LiBJZiB0aGUgb3B0aW9ucy5pbnRlcnNlY3QgcGFyYW1ldGVyIGlzIHRydWUsIHdlIG9ubHkgcmV0dXJuIGl0ZW1zIGlmIHdlIGludGVyc2VjdCBzb21ldGhpbmdcblx0XHQgKiBJZiB0aGUgb3B0aW9ucy5pbnRlcnNlY3QgaXMgZmFsc2UsIHdlIGZpbmQgdGhlIG5lYXJlc3QgaXRlbSBhbmQgcmV0dXJuIHRoZSBpdGVtcyBpbiB0aGF0IGRhdGFzZXRcblx0XHQgKiBAZnVuY3Rpb24gQ2hhcnQuSW50ZXJhY3Rpb24ubW9kZXMuZGF0YXNldFxuXHRcdCAqIEBwYXJhbSBjaGFydCB7Y2hhcnR9IHRoZSBjaGFydCB3ZSBhcmUgcmV0dXJuaW5nIGl0ZW1zIGZyb21cblx0XHQgKiBAcGFyYW0gZSB7RXZlbnR9IHRoZSBldmVudCB3ZSBhcmUgZmluZCB0aGluZ3MgYXRcblx0XHQgKiBAcGFyYW0gb3B0aW9ucyB7SUludGVyYWN0aW9uT3B0aW9uc30gb3B0aW9ucyB0byB1c2UgZHVyaW5nIGludGVyYWN0aW9uXG5cdFx0ICogQHJldHVybiB7Q2hhcnQuRWxlbWVudFtdfSBBcnJheSBvZiBlbGVtZW50cyB0aGF0IGFyZSB1bmRlciB0aGUgcG9pbnQuIElmIG5vbmUgYXJlIGZvdW5kLCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZFxuXHRcdCAqL1xuXHRcdGRhdGFzZXQ6IGZ1bmN0aW9uKGNoYXJ0LCBlLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgcG9zaXRpb24gPSBnZXRSZWxhdGl2ZVBvc2l0aW9uKGUsIGNoYXJ0KTtcblx0XHRcdG9wdGlvbnMuYXhpcyA9IG9wdGlvbnMuYXhpcyB8fCAneHknO1xuXHRcdFx0dmFyIGRpc3RhbmNlTWV0cmljID0gZ2V0RGlzdGFuY2VNZXRyaWNGb3JBeGlzKG9wdGlvbnMuYXhpcyk7XG5cdFx0XHR2YXIgaXRlbXMgPSBvcHRpb25zLmludGVyc2VjdCA/IGdldEludGVyc2VjdEl0ZW1zKGNoYXJ0LCBwb3NpdGlvbikgOiBnZXROZWFyZXN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uLCBmYWxzZSwgZGlzdGFuY2VNZXRyaWMpO1xuXG5cdFx0XHRpZiAoaXRlbXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRpdGVtcyA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGl0ZW1zWzBdLl9kYXRhc2V0SW5kZXgpLmRhdGE7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBpdGVtcztcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQGZ1bmN0aW9uIENoYXJ0LkludGVyYWN0aW9uLm1vZGVzLngtYXhpc1xuXHRcdCAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi40LjAuIFVzZSBpbmRleCBtb2RlIGFuZCBpbnRlcnNlY3QgPT0gdHJ1ZVxuXHRcdCAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdCd4LWF4aXMnOiBmdW5jdGlvbihjaGFydCwgZSkge1xuXHRcdFx0cmV0dXJuIGluZGV4TW9kZShjaGFydCwgZSwge2ludGVyc2VjdDogZmFsc2V9KTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogUG9pbnQgbW9kZSByZXR1cm5zIGFsbCBlbGVtZW50cyB0aGF0IGhpdCB0ZXN0IGJhc2VkIG9uIHRoZSBldmVudCBwb3NpdGlvblxuXHRcdCAqIG9mIHRoZSBldmVudFxuXHRcdCAqIEBmdW5jdGlvbiBDaGFydC5JbnRlcmFjdGlvbi5tb2Rlcy5pbnRlcnNlY3Rcblx0XHQgKiBAcGFyYW0gY2hhcnQge2NoYXJ0fSB0aGUgY2hhcnQgd2UgYXJlIHJldHVybmluZyBpdGVtcyBmcm9tXG5cdFx0ICogQHBhcmFtIGUge0V2ZW50fSB0aGUgZXZlbnQgd2UgYXJlIGZpbmQgdGhpbmdzIGF0XG5cdFx0ICogQHJldHVybiB7Q2hhcnQuRWxlbWVudFtdfSBBcnJheSBvZiBlbGVtZW50cyB0aGF0IGFyZSB1bmRlciB0aGUgcG9pbnQuIElmIG5vbmUgYXJlIGZvdW5kLCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZFxuXHRcdCAqL1xuXHRcdHBvaW50OiBmdW5jdGlvbihjaGFydCwgZSkge1xuXHRcdFx0dmFyIHBvc2l0aW9uID0gZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCk7XG5cdFx0XHRyZXR1cm4gZ2V0SW50ZXJzZWN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogbmVhcmVzdCBtb2RlIHJldHVybnMgdGhlIGVsZW1lbnQgY2xvc2VzdCB0byB0aGUgcG9pbnRcblx0XHQgKiBAZnVuY3Rpb24gQ2hhcnQuSW50ZXJhY3Rpb24ubW9kZXMuaW50ZXJzZWN0XG5cdFx0ICogQHBhcmFtIGNoYXJ0IHtjaGFydH0gdGhlIGNoYXJ0IHdlIGFyZSByZXR1cm5pbmcgaXRlbXMgZnJvbVxuXHRcdCAqIEBwYXJhbSBlIHtFdmVudH0gdGhlIGV2ZW50IHdlIGFyZSBmaW5kIHRoaW5ncyBhdFxuXHRcdCAqIEBwYXJhbSBvcHRpb25zIHtJSW50ZXJhY3Rpb25PcHRpb25zfSBvcHRpb25zIHRvIHVzZVxuXHRcdCAqIEByZXR1cm4ge0NoYXJ0LkVsZW1lbnRbXX0gQXJyYXkgb2YgZWxlbWVudHMgdGhhdCBhcmUgdW5kZXIgdGhlIHBvaW50LiBJZiBub25lIGFyZSBmb3VuZCwgYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWRcblx0XHQgKi9cblx0XHRuZWFyZXN0OiBmdW5jdGlvbihjaGFydCwgZSwgb3B0aW9ucykge1xuXHRcdFx0dmFyIHBvc2l0aW9uID0gZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCk7XG5cdFx0XHRvcHRpb25zLmF4aXMgPSBvcHRpb25zLmF4aXMgfHwgJ3h5Jztcblx0XHRcdHZhciBkaXN0YW5jZU1ldHJpYyA9IGdldERpc3RhbmNlTWV0cmljRm9yQXhpcyhvcHRpb25zLmF4aXMpO1xuXHRcdFx0dmFyIG5lYXJlc3RJdGVtcyA9IGdldE5lYXJlc3RJdGVtcyhjaGFydCwgcG9zaXRpb24sIG9wdGlvbnMuaW50ZXJzZWN0LCBkaXN0YW5jZU1ldHJpYyk7XG5cblx0XHRcdC8vIFdlIGhhdmUgbXVsdGlwbGUgaXRlbXMgYXQgdGhlIHNhbWUgZGlzdGFuY2UgZnJvbSB0aGUgZXZlbnQuIE5vdyBzb3J0IGJ5IHNtYWxsZXN0XG5cdFx0XHRpZiAobmVhcmVzdEl0ZW1zLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0bmVhcmVzdEl0ZW1zLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuXHRcdFx0XHRcdHZhciBzaXplQSA9IGEuZ2V0QXJlYSgpO1xuXHRcdFx0XHRcdHZhciBzaXplQiA9IGIuZ2V0QXJlYSgpO1xuXHRcdFx0XHRcdHZhciByZXQgPSBzaXplQSAtIHNpemVCO1xuXG5cdFx0XHRcdFx0aWYgKHJldCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0Ly8gaWYgZXF1YWwgc29ydCBieSBkYXRhc2V0IGluZGV4XG5cdFx0XHRcdFx0XHRyZXQgPSBhLl9kYXRhc2V0SW5kZXggLSBiLl9kYXRhc2V0SW5kZXg7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJldHVybiBvbmx5IDEgaXRlbVxuXHRcdFx0cmV0dXJuIG5lYXJlc3RJdGVtcy5zbGljZSgwLCAxKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogeCBtb2RlIHJldHVybnMgdGhlIGVsZW1lbnRzIHRoYXQgaGl0LXRlc3QgYXQgdGhlIGN1cnJlbnQgeCBjb29yZGluYXRlXG5cdFx0ICogQGZ1bmN0aW9uIENoYXJ0LkludGVyYWN0aW9uLm1vZGVzLnhcblx0XHQgKiBAcGFyYW0gY2hhcnQge2NoYXJ0fSB0aGUgY2hhcnQgd2UgYXJlIHJldHVybmluZyBpdGVtcyBmcm9tXG5cdFx0ICogQHBhcmFtIGUge0V2ZW50fSB0aGUgZXZlbnQgd2UgYXJlIGZpbmQgdGhpbmdzIGF0XG5cdFx0ICogQHBhcmFtIG9wdGlvbnMge0lJbnRlcmFjdGlvbk9wdGlvbnN9IG9wdGlvbnMgdG8gdXNlXG5cdFx0ICogQHJldHVybiB7Q2hhcnQuRWxlbWVudFtdfSBBcnJheSBvZiBlbGVtZW50cyB0aGF0IGFyZSB1bmRlciB0aGUgcG9pbnQuIElmIG5vbmUgYXJlIGZvdW5kLCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZFxuXHRcdCAqL1xuXHRcdHg6IGZ1bmN0aW9uKGNoYXJ0LCBlLCBvcHRpb25zKSB7XG5cdFx0XHR2YXIgcG9zaXRpb24gPSBnZXRSZWxhdGl2ZVBvc2l0aW9uKGUsIGNoYXJ0KTtcblx0XHRcdHZhciBpdGVtcyA9IFtdO1xuXHRcdFx0dmFyIGludGVyc2VjdHNJdGVtID0gZmFsc2U7XG5cblx0XHRcdHBhcnNlVmlzaWJsZUl0ZW1zKGNoYXJ0LCBmdW5jdGlvbihlbGVtZW50KSB7XG5cdFx0XHRcdGlmIChlbGVtZW50LmluWFJhbmdlKHBvc2l0aW9uLngpKSB7XG5cdFx0XHRcdFx0aXRlbXMucHVzaChlbGVtZW50KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChlbGVtZW50LmluUmFuZ2UocG9zaXRpb24ueCwgcG9zaXRpb24ueSkpIHtcblx0XHRcdFx0XHRpbnRlcnNlY3RzSXRlbSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBJZiB3ZSB3YW50IHRvIHRyaWdnZXIgb24gYW4gaW50ZXJzZWN0IGFuZCB3ZSBkb24ndCBoYXZlIGFueSBpdGVtc1xuXHRcdFx0Ly8gdGhhdCBpbnRlcnNlY3QgdGhlIHBvc2l0aW9uLCByZXR1cm4gbm90aGluZ1xuXHRcdFx0aWYgKG9wdGlvbnMuaW50ZXJzZWN0ICYmICFpbnRlcnNlY3RzSXRlbSkge1xuXHRcdFx0XHRpdGVtcyA9IFtdO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGl0ZW1zO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiB5IG1vZGUgcmV0dXJucyB0aGUgZWxlbWVudHMgdGhhdCBoaXQtdGVzdCBhdCB0aGUgY3VycmVudCB5IGNvb3JkaW5hdGVcblx0XHQgKiBAZnVuY3Rpb24gQ2hhcnQuSW50ZXJhY3Rpb24ubW9kZXMueVxuXHRcdCAqIEBwYXJhbSBjaGFydCB7Y2hhcnR9IHRoZSBjaGFydCB3ZSBhcmUgcmV0dXJuaW5nIGl0ZW1zIGZyb21cblx0XHQgKiBAcGFyYW0gZSB7RXZlbnR9IHRoZSBldmVudCB3ZSBhcmUgZmluZCB0aGluZ3MgYXRcblx0XHQgKiBAcGFyYW0gb3B0aW9ucyB7SUludGVyYWN0aW9uT3B0aW9uc30gb3B0aW9ucyB0byB1c2Vcblx0XHQgKiBAcmV0dXJuIHtDaGFydC5FbGVtZW50W119IEFycmF5IG9mIGVsZW1lbnRzIHRoYXQgYXJlIHVuZGVyIHRoZSBwb2ludC4gSWYgbm9uZSBhcmUgZm91bmQsIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkXG5cdFx0ICovXG5cdFx0eTogZnVuY3Rpb24oY2hhcnQsIGUsIG9wdGlvbnMpIHtcblx0XHRcdHZhciBwb3NpdGlvbiA9IGdldFJlbGF0aXZlUG9zaXRpb24oZSwgY2hhcnQpO1xuXHRcdFx0dmFyIGl0ZW1zID0gW107XG5cdFx0XHR2YXIgaW50ZXJzZWN0c0l0ZW0gPSBmYWxzZTtcblxuXHRcdFx0cGFyc2VWaXNpYmxlSXRlbXMoY2hhcnQsIGZ1bmN0aW9uKGVsZW1lbnQpIHtcblx0XHRcdFx0aWYgKGVsZW1lbnQuaW5ZUmFuZ2UocG9zaXRpb24ueSkpIHtcblx0XHRcdFx0XHRpdGVtcy5wdXNoKGVsZW1lbnQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGVsZW1lbnQuaW5SYW5nZShwb3NpdGlvbi54LCBwb3NpdGlvbi55KSkge1xuXHRcdFx0XHRcdGludGVyc2VjdHNJdGVtID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIElmIHdlIHdhbnQgdG8gdHJpZ2dlciBvbiBhbiBpbnRlcnNlY3QgYW5kIHdlIGRvbid0IGhhdmUgYW55IGl0ZW1zXG5cdFx0XHQvLyB0aGF0IGludGVyc2VjdCB0aGUgcG9zaXRpb24sIHJldHVybiBub3RoaW5nXG5cdFx0XHRpZiAob3B0aW9ucy5pbnRlcnNlY3QgJiYgIWludGVyc2VjdHNJdGVtKSB7XG5cdFx0XHRcdGl0ZW1zID0gW107XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gaXRlbXM7XG5cdFx0fVxuXHR9XG59O1xuXG59LHtcIjQ2XCI6NDZ9XSwzMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xuXG5kZWZhdWx0cy5fc2V0KCdnbG9iYWwnLCB7XG5cdHJlc3BvbnNpdmU6IHRydWUsXG5cdHJlc3BvbnNpdmVBbmltYXRpb25EdXJhdGlvbjogMCxcblx0bWFpbnRhaW5Bc3BlY3RSYXRpbzogdHJ1ZSxcblx0ZXZlbnRzOiBbJ21vdXNlbW92ZScsICdtb3VzZW91dCcsICdjbGljaycsICd0b3VjaHN0YXJ0JywgJ3RvdWNobW92ZSddLFxuXHRob3Zlcjoge1xuXHRcdG9uSG92ZXI6IG51bGwsXG5cdFx0bW9kZTogJ25lYXJlc3QnLFxuXHRcdGludGVyc2VjdDogdHJ1ZSxcblx0XHRhbmltYXRpb25EdXJhdGlvbjogNDAwXG5cdH0sXG5cdG9uQ2xpY2s6IG51bGwsXG5cdGRlZmF1bHRDb2xvcjogJ3JnYmEoMCwwLDAsMC4xKScsXG5cdGRlZmF1bHRGb250Q29sb3I6ICcjNjY2Jyxcblx0ZGVmYXVsdEZvbnRGYW1pbHk6IFwiJ0hlbHZldGljYSBOZXVlJywgJ0hlbHZldGljYScsICdBcmlhbCcsIHNhbnMtc2VyaWZcIixcblx0ZGVmYXVsdEZvbnRTaXplOiAxMixcblx0ZGVmYXVsdEZvbnRTdHlsZTogJ25vcm1hbCcsXG5cdHNob3dMaW5lczogdHJ1ZSxcblxuXHQvLyBFbGVtZW50IGRlZmF1bHRzIGRlZmluZWQgaW4gZWxlbWVudCBleHRlbnNpb25zXG5cdGVsZW1lbnRzOiB7fSxcblxuXHQvLyBMYXlvdXQgb3B0aW9ucyBzdWNoIGFzIHBhZGRpbmdcblx0bGF5b3V0OiB7XG5cdFx0cGFkZGluZzoge1xuXHRcdFx0dG9wOiAwLFxuXHRcdFx0cmlnaHQ6IDAsXG5cdFx0XHRib3R0b206IDAsXG5cdFx0XHRsZWZ0OiAwXG5cdFx0fVxuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcblxuXHQvLyBPY2N1cHkgdGhlIGdsb2JhbCB2YXJpYWJsZSBvZiBDaGFydCwgYW5kIGNyZWF0ZSBhIHNpbXBsZSBiYXNlIGNsYXNzXG5cdHZhciBDaGFydCA9IGZ1bmN0aW9uKGl0ZW0sIGNvbmZpZykge1xuXHRcdHRoaXMuY29uc3RydWN0KGl0ZW0sIGNvbmZpZyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0Q2hhcnQuQ2hhcnQgPSBDaGFydDtcblxuXHRyZXR1cm4gQ2hhcnQ7XG59O1xuXG59LHtcIjI2XCI6MjZ9XSwzMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XG5cbmZ1bmN0aW9uIGZpbHRlckJ5UG9zaXRpb24oYXJyYXksIHBvc2l0aW9uKSB7XG5cdHJldHVybiBoZWxwZXJzLndoZXJlKGFycmF5LCBmdW5jdGlvbih2KSB7XG5cdFx0cmV0dXJuIHYucG9zaXRpb24gPT09IHBvc2l0aW9uO1xuXHR9KTtcbn1cblxuZnVuY3Rpb24gc29ydEJ5V2VpZ2h0KGFycmF5LCByZXZlcnNlKSB7XG5cdGFycmF5LmZvckVhY2goZnVuY3Rpb24odiwgaSkge1xuXHRcdHYuX3RtcEluZGV4XyA9IGk7XG5cdFx0cmV0dXJuIHY7XG5cdH0pO1xuXHRhcnJheS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcblx0XHR2YXIgdjAgPSByZXZlcnNlID8gYiA6IGE7XG5cdFx0dmFyIHYxID0gcmV2ZXJzZSA/IGEgOiBiO1xuXHRcdHJldHVybiB2MC53ZWlnaHQgPT09IHYxLndlaWdodCA/XG5cdFx0XHR2MC5fdG1wSW5kZXhfIC0gdjEuX3RtcEluZGV4XyA6XG5cdFx0XHR2MC53ZWlnaHQgLSB2MS53ZWlnaHQ7XG5cdH0pO1xuXHRhcnJheS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHtcblx0XHRkZWxldGUgdi5fdG1wSW5kZXhfO1xuXHR9KTtcbn1cblxuLyoqXG4gKiBAaW50ZXJmYWNlIElMYXlvdXRJdGVtXG4gKiBAcHJvcCB7U3RyaW5nfSBwb3NpdGlvbiAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbSBpbiB0aGUgY2hhcnQgbGF5b3V0LiBQb3NzaWJsZSB2YWx1ZXMgYXJlXG4gKiAnbGVmdCcsICd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgYW5kICdjaGFydEFyZWEnXG4gKiBAcHJvcCB7TnVtYmVyfSB3ZWlnaHQgLSBUaGUgd2VpZ2h0IHVzZWQgdG8gc29ydCB0aGUgaXRlbS4gSGlnaGVyIHdlaWdodHMgYXJlIGZ1cnRoZXIgYXdheSBmcm9tIHRoZSBjaGFydCBhcmVhXG4gKiBAcHJvcCB7Qm9vbGVhbn0gZnVsbFdpZHRoIC0gaWYgdHJ1ZSwgYW5kIHRoZSBpdGVtIGlzIGhvcml6b250YWwsIHRoZW4gcHVzaCB2ZXJ0aWNhbCBib3hlcyBkb3duXG4gKiBAcHJvcCB7RnVuY3Rpb259IGlzSG9yaXpvbnRhbCAtIHJldHVybnMgdHJ1ZSBpZiB0aGUgbGF5b3V0IGl0ZW0gaXMgaG9yaXpvbnRhbCAoaWUuIHRvcCBvciBib3R0b20pXG4gKiBAcHJvcCB7RnVuY3Rpb259IHVwZGF0ZSAtIFRha2VzIHR3byBwYXJhbWV0ZXJzOiB3aWR0aCBhbmQgaGVpZ2h0LiBSZXR1cm5zIHNpemUgb2YgaXRlbVxuICogQHByb3Age0Z1bmN0aW9ufSBnZXRQYWRkaW5nIC0gIFJldHVybnMgYW4gb2JqZWN0IHdpdGggcGFkZGluZyBvbiB0aGUgZWRnZXNcbiAqIEBwcm9wIHtOdW1iZXJ9IHdpZHRoIC0gV2lkdGggb2YgaXRlbS4gTXVzdCBiZSB2YWxpZCBhZnRlciB1cGRhdGUoKVxuICogQHByb3Age051bWJlcn0gaGVpZ2h0IC0gSGVpZ2h0IG9mIGl0ZW0uIE11c3QgYmUgdmFsaWQgYWZ0ZXIgdXBkYXRlKClcbiAqIEBwcm9wIHtOdW1iZXJ9IGxlZnQgLSBMZWZ0IGVkZ2Ugb2YgdGhlIGl0ZW0uIFNldCBieSBsYXlvdXQgc3lzdGVtIGFuZCBjYW5ub3QgYmUgdXNlZCBpbiB1cGRhdGVcbiAqIEBwcm9wIHtOdW1iZXJ9IHRvcCAtIFRvcCBlZGdlIG9mIHRoZSBpdGVtLiBTZXQgYnkgbGF5b3V0IHN5c3RlbSBhbmQgY2Fubm90IGJlIHVzZWQgaW4gdXBkYXRlXG4gKiBAcHJvcCB7TnVtYmVyfSByaWdodCAtIFJpZ2h0IGVkZ2Ugb2YgdGhlIGl0ZW0uIFNldCBieSBsYXlvdXQgc3lzdGVtIGFuZCBjYW5ub3QgYmUgdXNlZCBpbiB1cGRhdGVcbiAqIEBwcm9wIHtOdW1iZXJ9IGJvdHRvbSAtIEJvdHRvbSBlZGdlIG9mIHRoZSBpdGVtLiBTZXQgYnkgbGF5b3V0IHN5c3RlbSBhbmQgY2Fubm90IGJlIHVzZWQgaW4gdXBkYXRlXG4gKi9cblxuLy8gVGhlIGxheW91dCBzZXJ2aWNlIGlzIHZlcnkgc2VsZiBleHBsYW5hdG9yeS4gIEl0J3MgcmVzcG9uc2libGUgZm9yIHRoZSBsYXlvdXQgd2l0aGluIGEgY2hhcnQuXG4vLyBTY2FsZXMsIExlZ2VuZHMgYW5kIFBsdWdpbnMgYWxsIHJlbHkgb24gdGhlIGxheW91dCBzZXJ2aWNlIGFuZCBjYW4gZWFzaWx5IHJlZ2lzdGVyIHRvIGJlIHBsYWNlZCBhbnl3aGVyZSB0aGV5IG5lZWRcbi8vIEl0IGlzIHRoaXMgc2VydmljZSdzIHJlc3BvbnNpYmlsaXR5IG9mIGNhcnJ5aW5nIG91dCB0aGF0IGxheW91dC5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRkZWZhdWx0czoge30sXG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVyIGEgYm94IHRvIGEgY2hhcnQuXG5cdCAqIEEgYm94IGlzIHNpbXBseSBhIHJlZmVyZW5jZSB0byBhbiBvYmplY3QgdGhhdCByZXF1aXJlcyBsYXlvdXQuIGVnLiBTY2FsZXMsIExlZ2VuZCwgVGl0bGUuXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gdGhlIGNoYXJ0IHRvIHVzZVxuXHQgKiBAcGFyYW0ge0lMYXlvdXRJdGVtfSBpdGVtIC0gdGhlIGl0ZW0gdG8gYWRkIHRvIGJlIGxheWVkIG91dFxuXHQgKi9cblx0YWRkQm94OiBmdW5jdGlvbihjaGFydCwgaXRlbSkge1xuXHRcdGlmICghY2hhcnQuYm94ZXMpIHtcblx0XHRcdGNoYXJ0LmJveGVzID0gW107XG5cdFx0fVxuXG5cdFx0Ly8gaW5pdGlhbGl6ZSBpdGVtIHdpdGggZGVmYXVsdCB2YWx1ZXNcblx0XHRpdGVtLmZ1bGxXaWR0aCA9IGl0ZW0uZnVsbFdpZHRoIHx8IGZhbHNlO1xuXHRcdGl0ZW0ucG9zaXRpb24gPSBpdGVtLnBvc2l0aW9uIHx8ICd0b3AnO1xuXHRcdGl0ZW0ud2VpZ2h0ID0gaXRlbS53ZWlnaHQgfHwgMDtcblxuXHRcdGNoYXJ0LmJveGVzLnB1c2goaXRlbSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlbW92ZSBhIGxheW91dEl0ZW0gZnJvbSBhIGNoYXJ0XG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gdGhlIGNoYXJ0IHRvIHJlbW92ZSB0aGUgYm94IGZyb21cblx0ICogQHBhcmFtIHtPYmplY3R9IGxheW91dEl0ZW0gLSB0aGUgaXRlbSB0byByZW1vdmUgZnJvbSB0aGUgbGF5b3V0XG5cdCAqL1xuXHRyZW1vdmVCb3g6IGZ1bmN0aW9uKGNoYXJ0LCBsYXlvdXRJdGVtKSB7XG5cdFx0dmFyIGluZGV4ID0gY2hhcnQuYm94ZXMgPyBjaGFydC5ib3hlcy5pbmRleE9mKGxheW91dEl0ZW0pIDogLTE7XG5cdFx0aWYgKGluZGV4ICE9PSAtMSkge1xuXHRcdFx0Y2hhcnQuYm94ZXMuc3BsaWNlKGluZGV4LCAxKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFNldHMgKG9yIHVwZGF0ZXMpIG9wdGlvbnMgb24gdGhlIGdpdmVuIGBpdGVtYC5cblx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSB0aGUgY2hhcnQgaW4gd2hpY2ggdGhlIGl0ZW0gbGl2ZXMgKG9yIHdpbGwgYmUgYWRkZWQgdG8pXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIC0gdGhlIGl0ZW0gdG8gY29uZmlndXJlIHdpdGggdGhlIGdpdmVuIG9wdGlvbnNcblx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSB0aGUgbmV3IGl0ZW0gb3B0aW9ucy5cblx0ICovXG5cdGNvbmZpZ3VyZTogZnVuY3Rpb24oY2hhcnQsIGl0ZW0sIG9wdGlvbnMpIHtcblx0XHR2YXIgcHJvcHMgPSBbJ2Z1bGxXaWR0aCcsICdwb3NpdGlvbicsICd3ZWlnaHQnXTtcblx0XHR2YXIgaWxlbiA9IHByb3BzLmxlbmd0aDtcblx0XHR2YXIgaSA9IDA7XG5cdFx0dmFyIHByb3A7XG5cblx0XHRmb3IgKDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0cHJvcCA9IHByb3BzW2ldO1xuXHRcdFx0aWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcblx0XHRcdFx0aXRlbVtwcm9wXSA9IG9wdGlvbnNbcHJvcF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBGaXRzIGJveGVzIG9mIHRoZSBnaXZlbiBjaGFydCBpbnRvIHRoZSBnaXZlbiBzaXplIGJ5IGhhdmluZyBlYWNoIGJveCBtZWFzdXJlIGl0c2VsZlxuXHQgKiB0aGVuIHJ1bm5pbmcgYSBmaXR0aW5nIGFsZ29yaXRobVxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydFxuXHQgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSB0aGUgd2lkdGggdG8gZml0IGludG9cblx0ICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIHRoZSBoZWlnaHQgdG8gZml0IGludG9cblx0ICovXG5cdHVwZGF0ZTogZnVuY3Rpb24oY2hhcnQsIHdpZHRoLCBoZWlnaHQpIHtcblx0XHRpZiAoIWNoYXJ0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGxheW91dE9wdGlvbnMgPSBjaGFydC5vcHRpb25zLmxheW91dCB8fCB7fTtcblx0XHR2YXIgcGFkZGluZyA9IGhlbHBlcnMub3B0aW9ucy50b1BhZGRpbmcobGF5b3V0T3B0aW9ucy5wYWRkaW5nKTtcblx0XHR2YXIgbGVmdFBhZGRpbmcgPSBwYWRkaW5nLmxlZnQ7XG5cdFx0dmFyIHJpZ2h0UGFkZGluZyA9IHBhZGRpbmcucmlnaHQ7XG5cdFx0dmFyIHRvcFBhZGRpbmcgPSBwYWRkaW5nLnRvcDtcblx0XHR2YXIgYm90dG9tUGFkZGluZyA9IHBhZGRpbmcuYm90dG9tO1xuXG5cdFx0dmFyIGxlZnRCb3hlcyA9IGZpbHRlckJ5UG9zaXRpb24oY2hhcnQuYm94ZXMsICdsZWZ0Jyk7XG5cdFx0dmFyIHJpZ2h0Qm94ZXMgPSBmaWx0ZXJCeVBvc2l0aW9uKGNoYXJ0LmJveGVzLCAncmlnaHQnKTtcblx0XHR2YXIgdG9wQm94ZXMgPSBmaWx0ZXJCeVBvc2l0aW9uKGNoYXJ0LmJveGVzLCAndG9wJyk7XG5cdFx0dmFyIGJvdHRvbUJveGVzID0gZmlsdGVyQnlQb3NpdGlvbihjaGFydC5ib3hlcywgJ2JvdHRvbScpO1xuXHRcdHZhciBjaGFydEFyZWFCb3hlcyA9IGZpbHRlckJ5UG9zaXRpb24oY2hhcnQuYm94ZXMsICdjaGFydEFyZWEnKTtcblxuXHRcdC8vIFNvcnQgYm94ZXMgYnkgd2VpZ2h0LiBBIGhpZ2hlciB3ZWlnaHQgaXMgZnVydGhlciBhd2F5IGZyb20gdGhlIGNoYXJ0IGFyZWFcblx0XHRzb3J0QnlXZWlnaHQobGVmdEJveGVzLCB0cnVlKTtcblx0XHRzb3J0QnlXZWlnaHQocmlnaHRCb3hlcywgZmFsc2UpO1xuXHRcdHNvcnRCeVdlaWdodCh0b3BCb3hlcywgdHJ1ZSk7XG5cdFx0c29ydEJ5V2VpZ2h0KGJvdHRvbUJveGVzLCBmYWxzZSk7XG5cblx0XHQvLyBFc3NlbnRpYWxseSB3ZSBub3cgaGF2ZSBhbnkgbnVtYmVyIG9mIGJveGVzIG9uIGVhY2ggb2YgdGhlIDQgc2lkZXMuXG5cdFx0Ly8gT3VyIGNhbnZhcyBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmcuXG5cdFx0Ly8gVGhlIGFyZWFzIEwxIGFuZCBMMiBhcmUgdGhlIGxlZnQgYXhlcy4gUjEgaXMgdGhlIHJpZ2h0IGF4aXMsIFQxIGlzIHRoZSB0b3AgYXhpcyBhbmRcblx0XHQvLyBCMSBpcyB0aGUgYm90dG9tIGF4aXNcblx0XHQvLyBUaGVyZSBhcmUgYWxzbyA0IHF1YWRyYW50LWxpa2UgbG9jYXRpb25zIChsZWZ0IHRvIHJpZ2h0IGluc3RlYWQgb2YgY2xvY2t3aXNlKSByZXNlcnZlZCBmb3IgY2hhcnQgb3ZlcmxheXNcblx0XHQvLyBUaGVzZSBsb2NhdGlvbnMgYXJlIHNpbmdsZS1ib3ggbG9jYXRpb25zIG9ubHksIHdoZW4gdHJ5aW5nIHRvIHJlZ2lzdGVyIGEgY2hhcnRBcmVhIGxvY2F0aW9uIHRoYXQgaXMgYWxyZWFkeSB0YWtlbixcblx0XHQvLyBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cblx0XHQvL1xuXHRcdC8vIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuXHRcdC8vIHwgICAgICAgICAgICAgICAgICBUMSAoRnVsbCBXaWR0aCkgICAgICAgICAgICAgICAgICAgfFxuXHRcdC8vIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuXHRcdC8vIHwgICAgfCAgICB8ICAgICAgICAgICAgICAgICBUMiAgICAgICAgICAgICAgICAgIHwgICAgfFxuXHRcdC8vIHwgICAgfC0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tfFxuXHRcdC8vIHwgICAgfCAgICB8IEMxIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEMyIHwgICAgfFxuXHRcdC8vIHwgICAgfCAgICB8LS0tLXwgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0tLXwgICAgfFxuXHRcdC8vIHwgICAgfCAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgfFxuXHRcdC8vIHwgTDEgfCBMMiB8ICAgICAgICAgICBDaGFydEFyZWEgKEMwKSAgICAgICAgICAgIHwgUjEgfFxuXHRcdC8vIHwgICAgfCAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgfFxuXHRcdC8vIHwgICAgfCAgICB8LS0tLXwgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0tLXwgICAgfFxuXHRcdC8vIHwgICAgfCAgICB8IEMzIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEM0IHwgICAgfFxuXHRcdC8vIHwgICAgfC0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tfFxuXHRcdC8vIHwgICAgfCAgICB8ICAgICAgICAgICAgICAgICBCMSAgICAgICAgICAgICAgICAgIHwgICAgfFxuXHRcdC8vIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuXHRcdC8vIHwgICAgICAgICAgICAgICAgICBCMiAoRnVsbCBXaWR0aCkgICAgICAgICAgICAgICAgICAgfFxuXHRcdC8vIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuXHRcdC8vXG5cdFx0Ly8gV2hhdCB3ZSBkbyB0byBmaW5kIHRoZSBiZXN0IHNpemluZywgd2UgZG8gdGhlIGZvbGxvd2luZ1xuXHRcdC8vIDEuIERldGVybWluZSB0aGUgbWluaW11bSBzaXplIG9mIHRoZSBjaGFydCBhcmVhLlxuXHRcdC8vIDIuIFNwbGl0IHRoZSByZW1haW5pbmcgd2lkdGggZXF1YWxseSBiZXR3ZWVuIGVhY2ggdmVydGljYWwgYXhpc1xuXHRcdC8vIDMuIFNwbGl0IHRoZSByZW1haW5pbmcgaGVpZ2h0IGVxdWFsbHkgYmV0d2VlbiBlYWNoIGhvcml6b250YWwgYXhpc1xuXHRcdC8vIDQuIEdpdmUgZWFjaCBsYXlvdXQgdGhlIG1heGltdW0gc2l6ZSBpdCBjYW4gYmUuIFRoZSBsYXlvdXQgd2lsbCByZXR1cm4gaXQncyBtaW5pbXVtIHNpemVcblx0XHQvLyA1LiBBZGp1c3QgdGhlIHNpemVzIG9mIGVhY2ggYXhpcyBiYXNlZCBvbiBpdCdzIG1pbmltdW0gcmVwb3J0ZWQgc2l6ZS5cblx0XHQvLyA2LiBSZWZpdCBlYWNoIGF4aXNcblx0XHQvLyA3LiBQb3NpdGlvbiBlYWNoIGF4aXMgaW4gdGhlIGZpbmFsIGxvY2F0aW9uXG5cdFx0Ly8gOC4gVGVsbCB0aGUgY2hhcnQgdGhlIGZpbmFsIGxvY2F0aW9uIG9mIHRoZSBjaGFydCBhcmVhXG5cdFx0Ly8gOS4gVGVsbCBhbnkgYXhlcyB0aGF0IG92ZXJsYXkgdGhlIGNoYXJ0IGFyZWEgdGhlIHBvc2l0aW9ucyBvZiB0aGUgY2hhcnQgYXJlYVxuXG5cdFx0Ly8gU3RlcCAxXG5cdFx0dmFyIGNoYXJ0V2lkdGggPSB3aWR0aCAtIGxlZnRQYWRkaW5nIC0gcmlnaHRQYWRkaW5nO1xuXHRcdHZhciBjaGFydEhlaWdodCA9IGhlaWdodCAtIHRvcFBhZGRpbmcgLSBib3R0b21QYWRkaW5nO1xuXHRcdHZhciBjaGFydEFyZWFXaWR0aCA9IGNoYXJ0V2lkdGggLyAyOyAvLyBtaW4gNTAlXG5cdFx0dmFyIGNoYXJ0QXJlYUhlaWdodCA9IGNoYXJ0SGVpZ2h0IC8gMjsgLy8gbWluIDUwJVxuXG5cdFx0Ly8gU3RlcCAyXG5cdFx0dmFyIHZlcnRpY2FsQm94V2lkdGggPSAod2lkdGggLSBjaGFydEFyZWFXaWR0aCkgLyAobGVmdEJveGVzLmxlbmd0aCArIHJpZ2h0Qm94ZXMubGVuZ3RoKTtcblxuXHRcdC8vIFN0ZXAgM1xuXHRcdHZhciBob3Jpem9udGFsQm94SGVpZ2h0ID0gKGhlaWdodCAtIGNoYXJ0QXJlYUhlaWdodCkgLyAodG9wQm94ZXMubGVuZ3RoICsgYm90dG9tQm94ZXMubGVuZ3RoKTtcblxuXHRcdC8vIFN0ZXAgNFxuXHRcdHZhciBtYXhDaGFydEFyZWFXaWR0aCA9IGNoYXJ0V2lkdGg7XG5cdFx0dmFyIG1heENoYXJ0QXJlYUhlaWdodCA9IGNoYXJ0SGVpZ2h0O1xuXHRcdHZhciBtaW5Cb3hTaXplcyA9IFtdO1xuXG5cdFx0ZnVuY3Rpb24gZ2V0TWluaW11bUJveFNpemUoYm94KSB7XG5cdFx0XHR2YXIgbWluU2l6ZTtcblx0XHRcdHZhciBpc0hvcml6b250YWwgPSBib3guaXNIb3Jpem9udGFsKCk7XG5cblx0XHRcdGlmIChpc0hvcml6b250YWwpIHtcblx0XHRcdFx0bWluU2l6ZSA9IGJveC51cGRhdGUoYm94LmZ1bGxXaWR0aCA/IGNoYXJ0V2lkdGggOiBtYXhDaGFydEFyZWFXaWR0aCwgaG9yaXpvbnRhbEJveEhlaWdodCk7XG5cdFx0XHRcdG1heENoYXJ0QXJlYUhlaWdodCAtPSBtaW5TaXplLmhlaWdodDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1pblNpemUgPSBib3gudXBkYXRlKHZlcnRpY2FsQm94V2lkdGgsIG1heENoYXJ0QXJlYUhlaWdodCk7XG5cdFx0XHRcdG1heENoYXJ0QXJlYVdpZHRoIC09IG1pblNpemUud2lkdGg7XG5cdFx0XHR9XG5cblx0XHRcdG1pbkJveFNpemVzLnB1c2goe1xuXHRcdFx0XHRob3Jpem9udGFsOiBpc0hvcml6b250YWwsXG5cdFx0XHRcdG1pblNpemU6IG1pblNpemUsXG5cdFx0XHRcdGJveDogYm94LFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aGVscGVycy5lYWNoKGxlZnRCb3hlcy5jb25jYXQocmlnaHRCb3hlcywgdG9wQm94ZXMsIGJvdHRvbUJveGVzKSwgZ2V0TWluaW11bUJveFNpemUpO1xuXG5cdFx0Ly8gSWYgYSBob3Jpem9udGFsIGJveCBoYXMgcGFkZGluZywgd2UgbW92ZSB0aGUgbGVmdCBib3hlcyBvdmVyIHRvIGF2b2lkIHVnbHkgY2hhcnRzIChzZWUgaXNzdWUgIzI0NzgpXG5cdFx0dmFyIG1heEhvcml6b250YWxMZWZ0UGFkZGluZyA9IDA7XG5cdFx0dmFyIG1heEhvcml6b250YWxSaWdodFBhZGRpbmcgPSAwO1xuXHRcdHZhciBtYXhWZXJ0aWNhbFRvcFBhZGRpbmcgPSAwO1xuXHRcdHZhciBtYXhWZXJ0aWNhbEJvdHRvbVBhZGRpbmcgPSAwO1xuXG5cdFx0aGVscGVycy5lYWNoKHRvcEJveGVzLmNvbmNhdChib3R0b21Cb3hlcyksIGZ1bmN0aW9uKGhvcml6b250YWxCb3gpIHtcblx0XHRcdGlmIChob3Jpem9udGFsQm94LmdldFBhZGRpbmcpIHtcblx0XHRcdFx0dmFyIGJveFBhZGRpbmcgPSBob3Jpem9udGFsQm94LmdldFBhZGRpbmcoKTtcblx0XHRcdFx0bWF4SG9yaXpvbnRhbExlZnRQYWRkaW5nID0gTWF0aC5tYXgobWF4SG9yaXpvbnRhbExlZnRQYWRkaW5nLCBib3hQYWRkaW5nLmxlZnQpO1xuXHRcdFx0XHRtYXhIb3Jpem9udGFsUmlnaHRQYWRkaW5nID0gTWF0aC5tYXgobWF4SG9yaXpvbnRhbFJpZ2h0UGFkZGluZywgYm94UGFkZGluZy5yaWdodCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRoZWxwZXJzLmVhY2gobGVmdEJveGVzLmNvbmNhdChyaWdodEJveGVzKSwgZnVuY3Rpb24odmVydGljYWxCb3gpIHtcblx0XHRcdGlmICh2ZXJ0aWNhbEJveC5nZXRQYWRkaW5nKSB7XG5cdFx0XHRcdHZhciBib3hQYWRkaW5nID0gdmVydGljYWxCb3guZ2V0UGFkZGluZygpO1xuXHRcdFx0XHRtYXhWZXJ0aWNhbFRvcFBhZGRpbmcgPSBNYXRoLm1heChtYXhWZXJ0aWNhbFRvcFBhZGRpbmcsIGJveFBhZGRpbmcudG9wKTtcblx0XHRcdFx0bWF4VmVydGljYWxCb3R0b21QYWRkaW5nID0gTWF0aC5tYXgobWF4VmVydGljYWxCb3R0b21QYWRkaW5nLCBib3hQYWRkaW5nLmJvdHRvbSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBBdCB0aGlzIHBvaW50LCBtYXhDaGFydEFyZWFIZWlnaHQgYW5kIG1heENoYXJ0QXJlYVdpZHRoIGFyZSB0aGUgc2l6ZSB0aGUgY2hhcnQgYXJlYSBjb3VsZFxuXHRcdC8vIGJlIGlmIHRoZSBheGVzIGFyZSBkcmF3biBhdCB0aGVpciBtaW5pbXVtIHNpemVzLlxuXHRcdC8vIFN0ZXBzIDUgJiA2XG5cdFx0dmFyIHRvdGFsTGVmdEJveGVzV2lkdGggPSBsZWZ0UGFkZGluZztcblx0XHR2YXIgdG90YWxSaWdodEJveGVzV2lkdGggPSByaWdodFBhZGRpbmc7XG5cdFx0dmFyIHRvdGFsVG9wQm94ZXNIZWlnaHQgPSB0b3BQYWRkaW5nO1xuXHRcdHZhciB0b3RhbEJvdHRvbUJveGVzSGVpZ2h0ID0gYm90dG9tUGFkZGluZztcblxuXHRcdC8vIEZ1bmN0aW9uIHRvIGZpdCBhIGJveFxuXHRcdGZ1bmN0aW9uIGZpdEJveChib3gpIHtcblx0XHRcdHZhciBtaW5Cb3hTaXplID0gaGVscGVycy5maW5kTmV4dFdoZXJlKG1pbkJveFNpemVzLCBmdW5jdGlvbihtaW5Cb3gpIHtcblx0XHRcdFx0cmV0dXJuIG1pbkJveC5ib3ggPT09IGJveDtcblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAobWluQm94U2l6ZSkge1xuXHRcdFx0XHRpZiAoYm94LmlzSG9yaXpvbnRhbCgpKSB7XG5cdFx0XHRcdFx0dmFyIHNjYWxlTWFyZ2luID0ge1xuXHRcdFx0XHRcdFx0bGVmdDogTWF0aC5tYXgodG90YWxMZWZ0Qm94ZXNXaWR0aCwgbWF4SG9yaXpvbnRhbExlZnRQYWRkaW5nKSxcblx0XHRcdFx0XHRcdHJpZ2h0OiBNYXRoLm1heCh0b3RhbFJpZ2h0Qm94ZXNXaWR0aCwgbWF4SG9yaXpvbnRhbFJpZ2h0UGFkZGluZyksXG5cdFx0XHRcdFx0XHR0b3A6IDAsXG5cdFx0XHRcdFx0XHRib3R0b206IDBcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0Ly8gRG9uJ3QgdXNlIG1pbiBzaXplIGhlcmUgYmVjYXVzZSBvZiBsYWJlbCByb3RhdGlvbi4gV2hlbiB0aGUgbGFiZWxzIGFyZSByb3RhdGVkLCB0aGVpciByb3RhdGlvbiBoaWdobHkgZGVwZW5kc1xuXHRcdFx0XHRcdC8vIG9uIHRoZSBtYXJnaW4uIFNvbWV0aW1lcyB0aGV5IG5lZWQgdG8gaW5jcmVhc2UgaW4gc2l6ZSBzbGlnaHRseVxuXHRcdFx0XHRcdGJveC51cGRhdGUoYm94LmZ1bGxXaWR0aCA/IGNoYXJ0V2lkdGggOiBtYXhDaGFydEFyZWFXaWR0aCwgY2hhcnRIZWlnaHQgLyAyLCBzY2FsZU1hcmdpbik7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ym94LnVwZGF0ZShtaW5Cb3hTaXplLm1pblNpemUud2lkdGgsIG1heENoYXJ0QXJlYUhlaWdodCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBVcGRhdGUsIGFuZCBjYWxjdWxhdGUgdGhlIGxlZnQgYW5kIHJpZ2h0IG1hcmdpbnMgZm9yIHRoZSBob3Jpem9udGFsIGJveGVzXG5cdFx0aGVscGVycy5lYWNoKGxlZnRCb3hlcy5jb25jYXQocmlnaHRCb3hlcyksIGZpdEJveCk7XG5cblx0XHRoZWxwZXJzLmVhY2gobGVmdEJveGVzLCBmdW5jdGlvbihib3gpIHtcblx0XHRcdHRvdGFsTGVmdEJveGVzV2lkdGggKz0gYm94LndpZHRoO1xuXHRcdH0pO1xuXG5cdFx0aGVscGVycy5lYWNoKHJpZ2h0Qm94ZXMsIGZ1bmN0aW9uKGJveCkge1xuXHRcdFx0dG90YWxSaWdodEJveGVzV2lkdGggKz0gYm94LndpZHRoO1xuXHRcdH0pO1xuXG5cdFx0Ly8gU2V0IHRoZSBMZWZ0IGFuZCBSaWdodCBtYXJnaW5zIGZvciB0aGUgaG9yaXpvbnRhbCBib3hlc1xuXHRcdGhlbHBlcnMuZWFjaCh0b3BCb3hlcy5jb25jYXQoYm90dG9tQm94ZXMpLCBmaXRCb3gpO1xuXG5cdFx0Ly8gRmlndXJlIG91dCBob3cgbXVjaCBtYXJnaW4gaXMgb24gdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSB2ZXJ0aWNhbCBib3hlc1xuXHRcdGhlbHBlcnMuZWFjaCh0b3BCb3hlcywgZnVuY3Rpb24oYm94KSB7XG5cdFx0XHR0b3RhbFRvcEJveGVzSGVpZ2h0ICs9IGJveC5oZWlnaHQ7XG5cdFx0fSk7XG5cblx0XHRoZWxwZXJzLmVhY2goYm90dG9tQm94ZXMsIGZ1bmN0aW9uKGJveCkge1xuXHRcdFx0dG90YWxCb3R0b21Cb3hlc0hlaWdodCArPSBib3guaGVpZ2h0O1xuXHRcdH0pO1xuXG5cdFx0ZnVuY3Rpb24gZmluYWxGaXRWZXJ0aWNhbEJveChib3gpIHtcblx0XHRcdHZhciBtaW5Cb3hTaXplID0gaGVscGVycy5maW5kTmV4dFdoZXJlKG1pbkJveFNpemVzLCBmdW5jdGlvbihtaW5TaXplKSB7XG5cdFx0XHRcdHJldHVybiBtaW5TaXplLmJveCA9PT0gYm94O1xuXHRcdFx0fSk7XG5cblx0XHRcdHZhciBzY2FsZU1hcmdpbiA9IHtcblx0XHRcdFx0bGVmdDogMCxcblx0XHRcdFx0cmlnaHQ6IDAsXG5cdFx0XHRcdHRvcDogdG90YWxUb3BCb3hlc0hlaWdodCxcblx0XHRcdFx0Ym90dG9tOiB0b3RhbEJvdHRvbUJveGVzSGVpZ2h0XG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAobWluQm94U2l6ZSkge1xuXHRcdFx0XHRib3gudXBkYXRlKG1pbkJveFNpemUubWluU2l6ZS53aWR0aCwgbWF4Q2hhcnRBcmVhSGVpZ2h0LCBzY2FsZU1hcmdpbik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gTGV0IHRoZSBsZWZ0IGxheW91dCBrbm93IHRoZSBmaW5hbCBtYXJnaW5cblx0XHRoZWxwZXJzLmVhY2gobGVmdEJveGVzLmNvbmNhdChyaWdodEJveGVzKSwgZmluYWxGaXRWZXJ0aWNhbEJveCk7XG5cblx0XHQvLyBSZWNhbGN1bGF0ZSBiZWNhdXNlIHRoZSBzaXplIG9mIGVhY2ggbGF5b3V0IG1pZ2h0IGhhdmUgY2hhbmdlZCBzbGlnaHRseSBkdWUgdG8gdGhlIG1hcmdpbnMgKGxhYmVsIHJvdGF0aW9uIGZvciBpbnN0YW5jZSlcblx0XHR0b3RhbExlZnRCb3hlc1dpZHRoID0gbGVmdFBhZGRpbmc7XG5cdFx0dG90YWxSaWdodEJveGVzV2lkdGggPSByaWdodFBhZGRpbmc7XG5cdFx0dG90YWxUb3BCb3hlc0hlaWdodCA9IHRvcFBhZGRpbmc7XG5cdFx0dG90YWxCb3R0b21Cb3hlc0hlaWdodCA9IGJvdHRvbVBhZGRpbmc7XG5cblx0XHRoZWxwZXJzLmVhY2gobGVmdEJveGVzLCBmdW5jdGlvbihib3gpIHtcblx0XHRcdHRvdGFsTGVmdEJveGVzV2lkdGggKz0gYm94LndpZHRoO1xuXHRcdH0pO1xuXG5cdFx0aGVscGVycy5lYWNoKHJpZ2h0Qm94ZXMsIGZ1bmN0aW9uKGJveCkge1xuXHRcdFx0dG90YWxSaWdodEJveGVzV2lkdGggKz0gYm94LndpZHRoO1xuXHRcdH0pO1xuXG5cdFx0aGVscGVycy5lYWNoKHRvcEJveGVzLCBmdW5jdGlvbihib3gpIHtcblx0XHRcdHRvdGFsVG9wQm94ZXNIZWlnaHQgKz0gYm94LmhlaWdodDtcblx0XHR9KTtcblx0XHRoZWxwZXJzLmVhY2goYm90dG9tQm94ZXMsIGZ1bmN0aW9uKGJveCkge1xuXHRcdFx0dG90YWxCb3R0b21Cb3hlc0hlaWdodCArPSBib3guaGVpZ2h0O1xuXHRcdH0pO1xuXG5cdFx0Ly8gV2UgbWF5IGJlIGFkZGluZyBzb21lIHBhZGRpbmcgdG8gYWNjb3VudCBmb3Igcm90YXRlZCB4IGF4aXMgbGFiZWxzXG5cdFx0dmFyIGxlZnRQYWRkaW5nQWRkaXRpb24gPSBNYXRoLm1heChtYXhIb3Jpem9udGFsTGVmdFBhZGRpbmcgLSB0b3RhbExlZnRCb3hlc1dpZHRoLCAwKTtcblx0XHR0b3RhbExlZnRCb3hlc1dpZHRoICs9IGxlZnRQYWRkaW5nQWRkaXRpb247XG5cdFx0dG90YWxSaWdodEJveGVzV2lkdGggKz0gTWF0aC5tYXgobWF4SG9yaXpvbnRhbFJpZ2h0UGFkZGluZyAtIHRvdGFsUmlnaHRCb3hlc1dpZHRoLCAwKTtcblxuXHRcdHZhciB0b3BQYWRkaW5nQWRkaXRpb24gPSBNYXRoLm1heChtYXhWZXJ0aWNhbFRvcFBhZGRpbmcgLSB0b3RhbFRvcEJveGVzSGVpZ2h0LCAwKTtcblx0XHR0b3RhbFRvcEJveGVzSGVpZ2h0ICs9IHRvcFBhZGRpbmdBZGRpdGlvbjtcblx0XHR0b3RhbEJvdHRvbUJveGVzSGVpZ2h0ICs9IE1hdGgubWF4KG1heFZlcnRpY2FsQm90dG9tUGFkZGluZyAtIHRvdGFsQm90dG9tQm94ZXNIZWlnaHQsIDApO1xuXG5cdFx0Ly8gRmlndXJlIG91dCBpZiBvdXIgY2hhcnQgYXJlYSBjaGFuZ2VkLiBUaGlzIHdvdWxkIG9jY3VyIGlmIHRoZSBkYXRhc2V0IGxheW91dCBsYWJlbCByb3RhdGlvblxuXHRcdC8vIGNoYW5nZWQgZHVlIHRvIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgbWFyZ2lucyBpbiBzdGVwIDYuIFNpbmNlIHdlIGNhbiBvbmx5IGdldCBiaWdnZXIsIHRoaXMgaXMgc2FmZSB0byBkb1xuXHRcdC8vIHdpdGhvdXQgY2FsbGluZyBgZml0YCBhZ2FpblxuXHRcdHZhciBuZXdNYXhDaGFydEFyZWFIZWlnaHQgPSBoZWlnaHQgLSB0b3RhbFRvcEJveGVzSGVpZ2h0IC0gdG90YWxCb3R0b21Cb3hlc0hlaWdodDtcblx0XHR2YXIgbmV3TWF4Q2hhcnRBcmVhV2lkdGggPSB3aWR0aCAtIHRvdGFsTGVmdEJveGVzV2lkdGggLSB0b3RhbFJpZ2h0Qm94ZXNXaWR0aDtcblxuXHRcdGlmIChuZXdNYXhDaGFydEFyZWFXaWR0aCAhPT0gbWF4Q2hhcnRBcmVhV2lkdGggfHwgbmV3TWF4Q2hhcnRBcmVhSGVpZ2h0ICE9PSBtYXhDaGFydEFyZWFIZWlnaHQpIHtcblx0XHRcdGhlbHBlcnMuZWFjaChsZWZ0Qm94ZXMsIGZ1bmN0aW9uKGJveCkge1xuXHRcdFx0XHRib3guaGVpZ2h0ID0gbmV3TWF4Q2hhcnRBcmVhSGVpZ2h0O1xuXHRcdFx0fSk7XG5cblx0XHRcdGhlbHBlcnMuZWFjaChyaWdodEJveGVzLCBmdW5jdGlvbihib3gpIHtcblx0XHRcdFx0Ym94LmhlaWdodCA9IG5ld01heENoYXJ0QXJlYUhlaWdodDtcblx0XHRcdH0pO1xuXG5cdFx0XHRoZWxwZXJzLmVhY2godG9wQm94ZXMsIGZ1bmN0aW9uKGJveCkge1xuXHRcdFx0XHRpZiAoIWJveC5mdWxsV2lkdGgpIHtcblx0XHRcdFx0XHRib3gud2lkdGggPSBuZXdNYXhDaGFydEFyZWFXaWR0aDtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGhlbHBlcnMuZWFjaChib3R0b21Cb3hlcywgZnVuY3Rpb24oYm94KSB7XG5cdFx0XHRcdGlmICghYm94LmZ1bGxXaWR0aCkge1xuXHRcdFx0XHRcdGJveC53aWR0aCA9IG5ld01heENoYXJ0QXJlYVdpZHRoO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0bWF4Q2hhcnRBcmVhSGVpZ2h0ID0gbmV3TWF4Q2hhcnRBcmVhSGVpZ2h0O1xuXHRcdFx0bWF4Q2hhcnRBcmVhV2lkdGggPSBuZXdNYXhDaGFydEFyZWFXaWR0aDtcblx0XHR9XG5cblx0XHQvLyBTdGVwIDcgLSBQb3NpdGlvbiB0aGUgYm94ZXNcblx0XHR2YXIgbGVmdCA9IGxlZnRQYWRkaW5nICsgbGVmdFBhZGRpbmdBZGRpdGlvbjtcblx0XHR2YXIgdG9wID0gdG9wUGFkZGluZyArIHRvcFBhZGRpbmdBZGRpdGlvbjtcblxuXHRcdGZ1bmN0aW9uIHBsYWNlQm94KGJveCkge1xuXHRcdFx0aWYgKGJveC5pc0hvcml6b250YWwoKSkge1xuXHRcdFx0XHRib3gubGVmdCA9IGJveC5mdWxsV2lkdGggPyBsZWZ0UGFkZGluZyA6IHRvdGFsTGVmdEJveGVzV2lkdGg7XG5cdFx0XHRcdGJveC5yaWdodCA9IGJveC5mdWxsV2lkdGggPyB3aWR0aCAtIHJpZ2h0UGFkZGluZyA6IHRvdGFsTGVmdEJveGVzV2lkdGggKyBtYXhDaGFydEFyZWFXaWR0aDtcblx0XHRcdFx0Ym94LnRvcCA9IHRvcDtcblx0XHRcdFx0Ym94LmJvdHRvbSA9IHRvcCArIGJveC5oZWlnaHQ7XG5cblx0XHRcdFx0Ly8gTW92ZSB0byBuZXh0IHBvaW50XG5cdFx0XHRcdHRvcCA9IGJveC5ib3R0b207XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ym94LmxlZnQgPSBsZWZ0O1xuXHRcdFx0XHRib3gucmlnaHQgPSBsZWZ0ICsgYm94LndpZHRoO1xuXHRcdFx0XHRib3gudG9wID0gdG90YWxUb3BCb3hlc0hlaWdodDtcblx0XHRcdFx0Ym94LmJvdHRvbSA9IHRvdGFsVG9wQm94ZXNIZWlnaHQgKyBtYXhDaGFydEFyZWFIZWlnaHQ7XG5cblx0XHRcdFx0Ly8gTW92ZSB0byBuZXh0IHBvaW50XG5cdFx0XHRcdGxlZnQgPSBib3gucmlnaHQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aGVscGVycy5lYWNoKGxlZnRCb3hlcy5jb25jYXQodG9wQm94ZXMpLCBwbGFjZUJveCk7XG5cblx0XHQvLyBBY2NvdW50IGZvciBjaGFydCB3aWR0aCBhbmQgaGVpZ2h0XG5cdFx0bGVmdCArPSBtYXhDaGFydEFyZWFXaWR0aDtcblx0XHR0b3AgKz0gbWF4Q2hhcnRBcmVhSGVpZ2h0O1xuXG5cdFx0aGVscGVycy5lYWNoKHJpZ2h0Qm94ZXMsIHBsYWNlQm94KTtcblx0XHRoZWxwZXJzLmVhY2goYm90dG9tQm94ZXMsIHBsYWNlQm94KTtcblxuXHRcdC8vIFN0ZXAgOFxuXHRcdGNoYXJ0LmNoYXJ0QXJlYSA9IHtcblx0XHRcdGxlZnQ6IHRvdGFsTGVmdEJveGVzV2lkdGgsXG5cdFx0XHR0b3A6IHRvdGFsVG9wQm94ZXNIZWlnaHQsXG5cdFx0XHRyaWdodDogdG90YWxMZWZ0Qm94ZXNXaWR0aCArIG1heENoYXJ0QXJlYVdpZHRoLFxuXHRcdFx0Ym90dG9tOiB0b3RhbFRvcEJveGVzSGVpZ2h0ICsgbWF4Q2hhcnRBcmVhSGVpZ2h0XG5cdFx0fTtcblxuXHRcdC8vIFN0ZXAgOVxuXHRcdGhlbHBlcnMuZWFjaChjaGFydEFyZWFCb3hlcywgZnVuY3Rpb24oYm94KSB7XG5cdFx0XHRib3gubGVmdCA9IGNoYXJ0LmNoYXJ0QXJlYS5sZWZ0O1xuXHRcdFx0Ym94LnRvcCA9IGNoYXJ0LmNoYXJ0QXJlYS50b3A7XG5cdFx0XHRib3gucmlnaHQgPSBjaGFydC5jaGFydEFyZWEucmlnaHQ7XG5cdFx0XHRib3guYm90dG9tID0gY2hhcnQuY2hhcnRBcmVhLmJvdHRvbTtcblxuXHRcdFx0Ym94LnVwZGF0ZShtYXhDaGFydEFyZWFXaWR0aCwgbWF4Q2hhcnRBcmVhSGVpZ2h0KTtcblx0XHR9KTtcblx0fVxufTtcblxufSx7XCI0NlwiOjQ2fV0sMzI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XG5cbmRlZmF1bHRzLl9zZXQoJ2dsb2JhbCcsIHtcblx0cGx1Z2luczoge31cbn0pO1xuXG4vKipcbiAqIFRoZSBwbHVnaW4gc2VydmljZSBzaW5nbGV0b25cbiAqIEBuYW1lc3BhY2UgQ2hhcnQucGx1Z2luc1xuICogQHNpbmNlIDIuMS4wXG4gKi9cbm1vZHVsZS5leHBvcnRzID0ge1xuXHQvKipcblx0ICogR2xvYmFsbHkgcmVnaXN0ZXJlZCBwbHVnaW5zLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X3BsdWdpbnM6IFtdLFxuXG5cdC8qKlxuXHQgKiBUaGlzIGlkZW50aWZpZXIgaXMgdXNlZCB0byBpbnZhbGlkYXRlIHRoZSBkZXNjcmlwdG9ycyBjYWNoZSBhdHRhY2hlZCB0byBlYWNoIGNoYXJ0XG5cdCAqIHdoZW4gYSBnbG9iYWwgcGx1Z2luIGlzIHJlZ2lzdGVyZWQgb3IgdW5yZWdpc3RlcmVkLiBJbiB0aGlzIGNhc2UsIHRoZSBjYWNoZSBJRCBpc1xuXHQgKiBpbmNyZW1lbnRlZCBhbmQgZGVzY3JpcHRvcnMgYXJlIHJlZ2VuZXJhdGVkIGR1cmluZyBmb2xsb3dpbmcgQVBJIGNhbGxzLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2NhY2hlSWQ6IDAsXG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVycyB0aGUgZ2l2ZW4gcGx1Z2luKHMpIGlmIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQuXG5cdCAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBwbHVnaW5zIHBsdWdpbiBpbnN0YW5jZShzKS5cblx0ICovXG5cdHJlZ2lzdGVyOiBmdW5jdGlvbihwbHVnaW5zKSB7XG5cdFx0dmFyIHAgPSB0aGlzLl9wbHVnaW5zO1xuXHRcdChbXSkuY29uY2F0KHBsdWdpbnMpLmZvckVhY2goZnVuY3Rpb24ocGx1Z2luKSB7XG5cdFx0XHRpZiAocC5pbmRleE9mKHBsdWdpbikgPT09IC0xKSB7XG5cdFx0XHRcdHAucHVzaChwbHVnaW4pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0dGhpcy5fY2FjaGVJZCsrO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVbnJlZ2lzdGVycyB0aGUgZ2l2ZW4gcGx1Z2luKHMpIG9ubHkgaWYgcmVnaXN0ZXJlZC5cblx0ICogQHBhcmFtIHtBcnJheXxPYmplY3R9IHBsdWdpbnMgcGx1Z2luIGluc3RhbmNlKHMpLlxuXHQgKi9cblx0dW5yZWdpc3RlcjogZnVuY3Rpb24ocGx1Z2lucykge1xuXHRcdHZhciBwID0gdGhpcy5fcGx1Z2lucztcblx0XHQoW10pLmNvbmNhdChwbHVnaW5zKS5mb3JFYWNoKGZ1bmN0aW9uKHBsdWdpbikge1xuXHRcdFx0dmFyIGlkeCA9IHAuaW5kZXhPZihwbHVnaW4pO1xuXHRcdFx0aWYgKGlkeCAhPT0gLTEpIHtcblx0XHRcdFx0cC5zcGxpY2UoaWR4LCAxKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHRoaXMuX2NhY2hlSWQrKztcblx0fSxcblxuXHQvKipcblx0ICogUmVtb3ZlIGFsbCByZWdpc3RlcmVkIHBsdWdpbnMuXG5cdCAqIEBzaW5jZSAyLjEuNVxuXHQgKi9cblx0Y2xlYXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuX3BsdWdpbnMgPSBbXTtcblx0XHR0aGlzLl9jYWNoZUlkKys7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIG51bWJlciBvZiByZWdpc3RlcmVkIHBsdWdpbnM/XG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9XG5cdCAqIEBzaW5jZSAyLjEuNVxuXHQgKi9cblx0Y291bnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLl9wbHVnaW5zLmxlbmd0aDtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyBhbGwgcmVnaXN0ZXJlZCBwbHVnaW4gaW5zdGFuY2VzLlxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IGFycmF5IG9mIHBsdWdpbiBvYmplY3RzLlxuXHQgKiBAc2luY2UgMi4xLjVcblx0ICovXG5cdGdldEFsbDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3BsdWdpbnM7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGxzIGVuYWJsZWQgcGx1Z2lucyBmb3IgYGNoYXJ0YCBvbiB0aGUgc3BlY2lmaWVkIGhvb2sgYW5kIHdpdGggdGhlIGdpdmVuIGFyZ3MuXG5cdCAqIFRoaXMgbWV0aG9kIGltbWVkaWF0ZWx5IHJldHVybnMgYXMgc29vbiBhcyBhIHBsdWdpbiBleHBsaWNpdGx5IHJldHVybnMgZmFsc2UuIFRoZVxuXHQgKiByZXR1cm5lZCB2YWx1ZSBjYW4gYmUgdXNlZCwgZm9yIGluc3RhbmNlLCB0byBpbnRlcnJ1cHQgdGhlIGN1cnJlbnQgYWN0aW9uLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UgZm9yIHdoaWNoIHBsdWdpbnMgc2hvdWxkIGJlIGNhbGxlZC5cblx0ICogQHBhcmFtIHtTdHJpbmd9IGhvb2sgLSBUaGUgbmFtZSBvZiB0aGUgcGx1Z2luIG1ldGhvZCB0byBjYWxsIChlLmcuICdiZWZvcmVVcGRhdGUnKS5cblx0ICogQHBhcmFtIHtBcnJheX0gW2FyZ3NdIC0gRXh0cmEgYXJndW1lbnRzIHRvIGFwcGx5IHRvIHRoZSBob29rIGNhbGwuXG5cdCAqIEByZXR1cm5zIHtCb29sZWFufSBmYWxzZSBpZiBhbnkgb2YgdGhlIHBsdWdpbnMgcmV0dXJuIGZhbHNlLCBlbHNlIHJldHVybnMgdHJ1ZS5cblx0ICovXG5cdG5vdGlmeTogZnVuY3Rpb24oY2hhcnQsIGhvb2ssIGFyZ3MpIHtcblx0XHR2YXIgZGVzY3JpcHRvcnMgPSB0aGlzLmRlc2NyaXB0b3JzKGNoYXJ0KTtcblx0XHR2YXIgaWxlbiA9IGRlc2NyaXB0b3JzLmxlbmd0aDtcblx0XHR2YXIgaSwgZGVzY3JpcHRvciwgcGx1Z2luLCBwYXJhbXMsIG1ldGhvZDtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yc1tpXTtcblx0XHRcdHBsdWdpbiA9IGRlc2NyaXB0b3IucGx1Z2luO1xuXHRcdFx0bWV0aG9kID0gcGx1Z2luW2hvb2tdO1xuXHRcdFx0aWYgKHR5cGVvZiBtZXRob2QgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0cGFyYW1zID0gW2NoYXJ0XS5jb25jYXQoYXJncyB8fCBbXSk7XG5cdFx0XHRcdHBhcmFtcy5wdXNoKGRlc2NyaXB0b3Iub3B0aW9ucyk7XG5cdFx0XHRcdGlmIChtZXRob2QuYXBwbHkocGx1Z2luLCBwYXJhbXMpID09PSBmYWxzZSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGRlc2NyaXB0b3JzIG9mIGVuYWJsZWQgcGx1Z2lucyBmb3IgdGhlIGdpdmVuIGNoYXJ0LlxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IFt7IHBsdWdpbiwgb3B0aW9ucyB9XVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0ZGVzY3JpcHRvcnM6IGZ1bmN0aW9uKGNoYXJ0KSB7XG5cdFx0dmFyIGNhY2hlID0gY2hhcnQuJHBsdWdpbnMgfHwgKGNoYXJ0LiRwbHVnaW5zID0ge30pO1xuXHRcdGlmIChjYWNoZS5pZCA9PT0gdGhpcy5fY2FjaGVJZCkge1xuXHRcdFx0cmV0dXJuIGNhY2hlLmRlc2NyaXB0b3JzO1xuXHRcdH1cblxuXHRcdHZhciBwbHVnaW5zID0gW107XG5cdFx0dmFyIGRlc2NyaXB0b3JzID0gW107XG5cdFx0dmFyIGNvbmZpZyA9IChjaGFydCAmJiBjaGFydC5jb25maWcpIHx8IHt9O1xuXHRcdHZhciBvcHRpb25zID0gKGNvbmZpZy5vcHRpb25zICYmIGNvbmZpZy5vcHRpb25zLnBsdWdpbnMpIHx8IHt9O1xuXG5cdFx0dGhpcy5fcGx1Z2lucy5jb25jYXQoY29uZmlnLnBsdWdpbnMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24ocGx1Z2luKSB7XG5cdFx0XHR2YXIgaWR4ID0gcGx1Z2lucy5pbmRleE9mKHBsdWdpbik7XG5cdFx0XHRpZiAoaWR4ICE9PSAtMSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHZhciBpZCA9IHBsdWdpbi5pZDtcblx0XHRcdHZhciBvcHRzID0gb3B0aW9uc1tpZF07XG5cdFx0XHRpZiAob3B0cyA9PT0gZmFsc2UpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob3B0cyA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRvcHRzID0gaGVscGVycy5jbG9uZShkZWZhdWx0cy5nbG9iYWwucGx1Z2luc1tpZF0pO1xuXHRcdFx0fVxuXG5cdFx0XHRwbHVnaW5zLnB1c2gocGx1Z2luKTtcblx0XHRcdGRlc2NyaXB0b3JzLnB1c2goe1xuXHRcdFx0XHRwbHVnaW46IHBsdWdpbixcblx0XHRcdFx0b3B0aW9uczogb3B0cyB8fCB7fVxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHRjYWNoZS5kZXNjcmlwdG9ycyA9IGRlc2NyaXB0b3JzO1xuXHRcdGNhY2hlLmlkID0gdGhpcy5fY2FjaGVJZDtcblx0XHRyZXR1cm4gZGVzY3JpcHRvcnM7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEludmFsaWRhdGVzIGNhY2hlIGZvciB0aGUgZ2l2ZW4gY2hhcnQ6IGRlc2NyaXB0b3JzIGhvbGQgYSByZWZlcmVuY2Ugb24gcGx1Z2luIG9wdGlvbixcblx0ICogYnV0IGluIHNvbWUgY2FzZXMsIHRoaXMgcmVmZXJlbmNlIGNhbiBiZSBjaGFuZ2VkIGJ5IHRoZSB1c2VyIHdoZW4gdXBkYXRpbmcgb3B0aW9ucy5cblx0ICogaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzUxMTEjaXNzdWVjb21tZW50LTM1NTkzNDE2N1xuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2ludmFsaWRhdGU6IGZ1bmN0aW9uKGNoYXJ0KSB7XG5cdFx0ZGVsZXRlIGNoYXJ0LiRwbHVnaW5zO1xuXHR9XG59O1xuXG4vKipcbiAqIFBsdWdpbiBleHRlbnNpb24gaG9va3MuXG4gKiBAaW50ZXJmYWNlIElQbHVnaW5cbiAqIEBzaW5jZSAyLjEuMFxuICovXG4vKipcbiAqIEBtZXRob2QgSVBsdWdpbiNiZWZvcmVJbml0XG4gKiBAZGVzYyBDYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBgY2hhcnRgLlxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxuICovXG4vKipcbiAqIEBtZXRob2QgSVBsdWdpbiNhZnRlckluaXRcbiAqIEBkZXNjIENhbGxlZCBhZnRlciBgY2hhcnRgIGhhcyBiZWVuIGluaXRpYWxpemVkIGFuZCBiZWZvcmUgdGhlIGZpcnN0IHVwZGF0ZS5cbiAqIEBwYXJhbSB7Q2hhcnQuQ29udHJvbGxlcn0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBwbHVnaW4gb3B0aW9ucy5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIElQbHVnaW4jYmVmb3JlVXBkYXRlXG4gKiBAZGVzYyBDYWxsZWQgYmVmb3JlIHVwZGF0aW5nIGBjaGFydGAuIElmIGFueSBwbHVnaW4gcmV0dXJucyBgZmFsc2VgLCB0aGUgdXBkYXRlXG4gKiBpcyBjYW5jZWxsZWQgKGFuZCB0aHVzIHN1YnNlcXVlbnQgcmVuZGVyKHMpKSB1bnRpbCBhbm90aGVyIGB1cGRhdGVgIGlzIHRyaWdnZXJlZC5cbiAqIEBwYXJhbSB7Q2hhcnQuQ29udHJvbGxlcn0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBwbHVnaW4gb3B0aW9ucy5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBgZmFsc2VgIHRvIGNhbmNlbCB0aGUgY2hhcnQgdXBkYXRlLlxuICovXG4vKipcbiAqIEBtZXRob2QgSVBsdWdpbiNhZnRlclVwZGF0ZVxuICogQGRlc2MgQ2FsbGVkIGFmdGVyIGBjaGFydGAgaGFzIGJlZW4gdXBkYXRlZCBhbmQgYmVmb3JlIHJlbmRlcmluZy4gTm90ZSB0aGF0IHRoaXNcbiAqIGhvb2sgd2lsbCBub3QgYmUgY2FsbGVkIGlmIHRoZSBjaGFydCB1cGRhdGUgaGFzIGJlZW4gcHJldmlvdXNseSBjYW5jZWxsZWQuXG4gKiBAcGFyYW0ge0NoYXJ0LkNvbnRyb2xsZXJ9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXG4gKi9cbi8qKlxuICogQG1ldGhvZCBJUGx1Z2luI2JlZm9yZURhdGFzZXRzVXBkYXRlXG4gKiBAZGVzYyBDYWxsZWQgYmVmb3JlIHVwZGF0aW5nIHRoZSBgY2hhcnRgIGRhdGFzZXRzLiBJZiBhbnkgcGx1Z2luIHJldHVybnMgYGZhbHNlYCxcbiAqIHRoZSBkYXRhc2V0cyB1cGRhdGUgaXMgY2FuY2VsbGVkIHVudGlsIGFub3RoZXIgYHVwZGF0ZWAgaXMgdHJpZ2dlcmVkLlxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxuICogQHJldHVybnMge0Jvb2xlYW59IGZhbHNlIHRvIGNhbmNlbCB0aGUgZGF0YXNldHMgdXBkYXRlLlxuICogQHNpbmNlIHZlcnNpb24gMi4xLjVcbiovXG4vKipcbiAqIEBtZXRob2QgSVBsdWdpbiNhZnRlckRhdGFzZXRzVXBkYXRlXG4gKiBAZGVzYyBDYWxsZWQgYWZ0ZXIgdGhlIGBjaGFydGAgZGF0YXNldHMgaGF2ZSBiZWVuIHVwZGF0ZWQuIE5vdGUgdGhhdCB0aGlzIGhvb2tcbiAqIHdpbGwgbm90IGJlIGNhbGxlZCBpZiB0aGUgZGF0YXNldHMgdXBkYXRlIGhhcyBiZWVuIHByZXZpb3VzbHkgY2FuY2VsbGVkLlxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxuICogQHNpbmNlIHZlcnNpb24gMi4xLjVcbiAqL1xuLyoqXG4gKiBAbWV0aG9kIElQbHVnaW4jYmVmb3JlRGF0YXNldFVwZGF0ZVxuICogQGRlc2MgQ2FsbGVkIGJlZm9yZSB1cGRhdGluZyB0aGUgYGNoYXJ0YCBkYXRhc2V0IGF0IHRoZSBnaXZlbiBgYXJncy5pbmRleGAuIElmIGFueSBwbHVnaW5cbiAqIHJldHVybnMgYGZhbHNlYCwgdGhlIGRhdGFzZXRzIHVwZGF0ZSBpcyBjYW5jZWxsZWQgdW50aWwgYW5vdGhlciBgdXBkYXRlYCBpcyB0cmlnZ2VyZWQuXG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzIC0gVGhlIGNhbGwgYXJndW1lbnRzLlxuICogQHBhcmFtIHtOdW1iZXJ9IGFyZ3MuaW5kZXggLSBUaGUgZGF0YXNldCBpbmRleC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzLm1ldGEgLSBUaGUgZGF0YXNldCBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxuICogQHJldHVybnMge0Jvb2xlYW59IGBmYWxzZWAgdG8gY2FuY2VsIHRoZSBjaGFydCBkYXRhc2V0cyBkcmF3aW5nLlxuICovXG4vKipcbiAqIEBtZXRob2QgSVBsdWdpbiNhZnRlckRhdGFzZXRVcGRhdGVcbiAqIEBkZXNjIENhbGxlZCBhZnRlciB0aGUgYGNoYXJ0YCBkYXRhc2V0cyBhdCB0aGUgZ2l2ZW4gYGFyZ3MuaW5kZXhgIGhhcyBiZWVuIHVwZGF0ZWQuIE5vdGVcbiAqIHRoYXQgdGhpcyBob29rIHdpbGwgbm90IGJlIGNhbGxlZCBpZiB0aGUgZGF0YXNldHMgdXBkYXRlIGhhcyBiZWVuIHByZXZpb3VzbHkgY2FuY2VsbGVkLlxuICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncyAtIFRoZSBjYWxsIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBhcmdzLmluZGV4IC0gVGhlIGRhdGFzZXQgaW5kZXguXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncy5tZXRhIC0gVGhlIGRhdGFzZXQgbWV0YWRhdGEuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBwbHVnaW4gb3B0aW9ucy5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIElQbHVnaW4jYmVmb3JlTGF5b3V0XG4gKiBAZGVzYyBDYWxsZWQgYmVmb3JlIGxheWluZyBvdXQgYGNoYXJ0YC4gSWYgYW55IHBsdWdpbiByZXR1cm5zIGBmYWxzZWAsXG4gKiB0aGUgbGF5b3V0IHVwZGF0ZSBpcyBjYW5jZWxsZWQgdW50aWwgYW5vdGhlciBgdXBkYXRlYCBpcyB0cmlnZ2VyZWQuXG4gKiBAcGFyYW0ge0NoYXJ0LkNvbnRyb2xsZXJ9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYGZhbHNlYCB0byBjYW5jZWwgdGhlIGNoYXJ0IGxheW91dC5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIElQbHVnaW4jYWZ0ZXJMYXlvdXRcbiAqIEBkZXNjIENhbGxlZCBhZnRlciB0aGUgYGNoYXJ0YCBoYXMgYmVlbiBsYXllZCBvdXQuIE5vdGUgdGhhdCB0aGlzIGhvb2sgd2lsbCBub3RcbiAqIGJlIGNhbGxlZCBpZiB0aGUgbGF5b3V0IHVwZGF0ZSBoYXMgYmVlbiBwcmV2aW91c2x5IGNhbmNlbGxlZC5cbiAqIEBwYXJhbSB7Q2hhcnQuQ29udHJvbGxlcn0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBwbHVnaW4gb3B0aW9ucy5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIElQbHVnaW4jYmVmb3JlUmVuZGVyXG4gKiBAZGVzYyBDYWxsZWQgYmVmb3JlIHJlbmRlcmluZyBgY2hhcnRgLiBJZiBhbnkgcGx1Z2luIHJldHVybnMgYGZhbHNlYCxcbiAqIHRoZSByZW5kZXJpbmcgaXMgY2FuY2VsbGVkIHVudGlsIGFub3RoZXIgYHJlbmRlcmAgaXMgdHJpZ2dlcmVkLlxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxuICogQHJldHVybnMge0Jvb2xlYW59IGBmYWxzZWAgdG8gY2FuY2VsIHRoZSBjaGFydCByZW5kZXJpbmcuXG4gKi9cbi8qKlxuICogQG1ldGhvZCBJUGx1Z2luI2FmdGVyUmVuZGVyXG4gKiBAZGVzYyBDYWxsZWQgYWZ0ZXIgdGhlIGBjaGFydGAgaGFzIGJlZW4gZnVsbHkgcmVuZGVyZWQgKGFuZCBhbmltYXRpb24gY29tcGxldGVkKS4gTm90ZVxuICogdGhhdCB0aGlzIGhvb2sgd2lsbCBub3QgYmUgY2FsbGVkIGlmIHRoZSByZW5kZXJpbmcgaGFzIGJlZW4gcHJldmlvdXNseSBjYW5jZWxsZWQuXG4gKiBAcGFyYW0ge0NoYXJ0LkNvbnRyb2xsZXJ9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXG4gKi9cbi8qKlxuICogQG1ldGhvZCBJUGx1Z2luI2JlZm9yZURyYXdcbiAqIEBkZXNjIENhbGxlZCBiZWZvcmUgZHJhd2luZyBgY2hhcnRgIGF0IGV2ZXJ5IGFuaW1hdGlvbiBmcmFtZSBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuXG4gKiBlYXNpbmcgdmFsdWUuIElmIGFueSBwbHVnaW4gcmV0dXJucyBgZmFsc2VgLCB0aGUgZnJhbWUgZHJhd2luZyBpcyBjYW5jZWxsZWQgdW50aWxcbiAqIGFub3RoZXIgYHJlbmRlcmAgaXMgdHJpZ2dlcmVkLlxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7TnVtYmVyfSBlYXNpbmdWYWx1ZSAtIFRoZSBjdXJyZW50IGFuaW1hdGlvbiB2YWx1ZSwgYmV0d2VlbiAwLjAgYW5kIDEuMC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxuICogQHJldHVybnMge0Jvb2xlYW59IGBmYWxzZWAgdG8gY2FuY2VsIHRoZSBjaGFydCBkcmF3aW5nLlxuICovXG4vKipcbiAqIEBtZXRob2QgSVBsdWdpbiNhZnRlckRyYXdcbiAqIEBkZXNjIENhbGxlZCBhZnRlciB0aGUgYGNoYXJ0YCBoYXMgYmVlbiBkcmF3biBmb3IgdGhlIHNwZWNpZmljIGVhc2luZyB2YWx1ZS4gTm90ZVxuICogdGhhdCB0aGlzIGhvb2sgd2lsbCBub3QgYmUgY2FsbGVkIGlmIHRoZSBkcmF3aW5nIGhhcyBiZWVuIHByZXZpb3VzbHkgY2FuY2VsbGVkLlxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7TnVtYmVyfSBlYXNpbmdWYWx1ZSAtIFRoZSBjdXJyZW50IGFuaW1hdGlvbiB2YWx1ZSwgYmV0d2VlbiAwLjAgYW5kIDEuMC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxuICovXG4vKipcbiAqIEBtZXRob2QgSVBsdWdpbiNiZWZvcmVEYXRhc2V0c0RyYXdcbiAqIEBkZXNjIENhbGxlZCBiZWZvcmUgZHJhd2luZyB0aGUgYGNoYXJ0YCBkYXRhc2V0cy4gSWYgYW55IHBsdWdpbiByZXR1cm5zIGBmYWxzZWAsXG4gKiB0aGUgZGF0YXNldHMgZHJhd2luZyBpcyBjYW5jZWxsZWQgdW50aWwgYW5vdGhlciBgcmVuZGVyYCBpcyB0cmlnZ2VyZWQuXG4gKiBAcGFyYW0ge0NoYXJ0LkNvbnRyb2xsZXJ9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGVhc2luZ1ZhbHVlIC0gVGhlIGN1cnJlbnQgYW5pbWF0aW9uIHZhbHVlLCBiZXR3ZWVuIDAuMCBhbmQgMS4wLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYGZhbHNlYCB0byBjYW5jZWwgdGhlIGNoYXJ0IGRhdGFzZXRzIGRyYXdpbmcuXG4gKi9cbi8qKlxuICogQG1ldGhvZCBJUGx1Z2luI2FmdGVyRGF0YXNldHNEcmF3XG4gKiBAZGVzYyBDYWxsZWQgYWZ0ZXIgdGhlIGBjaGFydGAgZGF0YXNldHMgaGF2ZSBiZWVuIGRyYXduLiBOb3RlIHRoYXQgdGhpcyBob29rXG4gKiB3aWxsIG5vdCBiZSBjYWxsZWQgaWYgdGhlIGRhdGFzZXRzIGRyYXdpbmcgaGFzIGJlZW4gcHJldmlvdXNseSBjYW5jZWxsZWQuXG4gKiBAcGFyYW0ge0NoYXJ0LkNvbnRyb2xsZXJ9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGVhc2luZ1ZhbHVlIC0gVGhlIGN1cnJlbnQgYW5pbWF0aW9uIHZhbHVlLCBiZXR3ZWVuIDAuMCBhbmQgMS4wLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXG4gKi9cbi8qKlxuICogQG1ldGhvZCBJUGx1Z2luI2JlZm9yZURhdGFzZXREcmF3XG4gKiBAZGVzYyBDYWxsZWQgYmVmb3JlIGRyYXdpbmcgdGhlIGBjaGFydGAgZGF0YXNldCBhdCB0aGUgZ2l2ZW4gYGFyZ3MuaW5kZXhgIChkYXRhc2V0c1xuICogYXJlIGRyYXduIGluIHRoZSByZXZlcnNlIG9yZGVyKS4gSWYgYW55IHBsdWdpbiByZXR1cm5zIGBmYWxzZWAsIHRoZSBkYXRhc2V0cyBkcmF3aW5nXG4gKiBpcyBjYW5jZWxsZWQgdW50aWwgYW5vdGhlciBgcmVuZGVyYCBpcyB0cmlnZ2VyZWQuXG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzIC0gVGhlIGNhbGwgYXJndW1lbnRzLlxuICogQHBhcmFtIHtOdW1iZXJ9IGFyZ3MuaW5kZXggLSBUaGUgZGF0YXNldCBpbmRleC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzLm1ldGEgLSBUaGUgZGF0YXNldCBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7TnVtYmVyfSBhcmdzLmVhc2luZ1ZhbHVlIC0gVGhlIGN1cnJlbnQgYW5pbWF0aW9uIHZhbHVlLCBiZXR3ZWVuIDAuMCBhbmQgMS4wLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYGZhbHNlYCB0byBjYW5jZWwgdGhlIGNoYXJ0IGRhdGFzZXRzIGRyYXdpbmcuXG4gKi9cbi8qKlxuICogQG1ldGhvZCBJUGx1Z2luI2FmdGVyRGF0YXNldERyYXdcbiAqIEBkZXNjIENhbGxlZCBhZnRlciB0aGUgYGNoYXJ0YCBkYXRhc2V0cyBhdCB0aGUgZ2l2ZW4gYGFyZ3MuaW5kZXhgIGhhdmUgYmVlbiBkcmF3blxuICogKGRhdGFzZXRzIGFyZSBkcmF3biBpbiB0aGUgcmV2ZXJzZSBvcmRlcikuIE5vdGUgdGhhdCB0aGlzIGhvb2sgd2lsbCBub3QgYmUgY2FsbGVkXG4gKiBpZiB0aGUgZGF0YXNldHMgZHJhd2luZyBoYXMgYmVlbiBwcmV2aW91c2x5IGNhbmNlbGxlZC5cbiAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MgLSBUaGUgY2FsbCBhcmd1bWVudHMuXG4gKiBAcGFyYW0ge051bWJlcn0gYXJncy5pbmRleCAtIFRoZSBkYXRhc2V0IGluZGV4LlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MubWV0YSAtIFRoZSBkYXRhc2V0IG1ldGFkYXRhLlxuICogQHBhcmFtIHtOdW1iZXJ9IGFyZ3MuZWFzaW5nVmFsdWUgLSBUaGUgY3VycmVudCBhbmltYXRpb24gdmFsdWUsIGJldHdlZW4gMC4wIGFuZCAxLjAuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBwbHVnaW4gb3B0aW9ucy5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIElQbHVnaW4jYmVmb3JlVG9vbHRpcERyYXdcbiAqIEBkZXNjIENhbGxlZCBiZWZvcmUgZHJhd2luZyB0aGUgYHRvb2x0aXBgLiBJZiBhbnkgcGx1Z2luIHJldHVybnMgYGZhbHNlYCxcbiAqIHRoZSB0b29sdGlwIGRyYXdpbmcgaXMgY2FuY2VsbGVkIHVudGlsIGFub3RoZXIgYHJlbmRlcmAgaXMgdHJpZ2dlcmVkLlxuICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncyAtIFRoZSBjYWxsIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzLnRvb2x0aXAgLSBUaGUgdG9vbHRpcC5cbiAqIEBwYXJhbSB7TnVtYmVyfSBhcmdzLmVhc2luZ1ZhbHVlIC0gVGhlIGN1cnJlbnQgYW5pbWF0aW9uIHZhbHVlLCBiZXR3ZWVuIDAuMCBhbmQgMS4wLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYGZhbHNlYCB0byBjYW5jZWwgdGhlIGNoYXJ0IHRvb2x0aXAgZHJhd2luZy5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIElQbHVnaW4jYWZ0ZXJUb29sdGlwRHJhd1xuICogQGRlc2MgQ2FsbGVkIGFmdGVyIGRyYXdpbmcgdGhlIGB0b29sdGlwYC4gTm90ZSB0aGF0IHRoaXMgaG9vayB3aWxsIG5vdFxuICogYmUgY2FsbGVkIGlmIHRoZSB0b29sdGlwIGRyYXdpbmcgaGFzIGJlZW4gcHJldmlvdXNseSBjYW5jZWxsZWQuXG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzIC0gVGhlIGNhbGwgYXJndW1lbnRzLlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MudG9vbHRpcCAtIFRoZSB0b29sdGlwLlxuICogQHBhcmFtIHtOdW1iZXJ9IGFyZ3MuZWFzaW5nVmFsdWUgLSBUaGUgY3VycmVudCBhbmltYXRpb24gdmFsdWUsIGJldHdlZW4gMC4wIGFuZCAxLjAuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBwbHVnaW4gb3B0aW9ucy5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIElQbHVnaW4jYmVmb3JlRXZlbnRcbiAqIEBkZXNjIENhbGxlZCBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgc3BlY2lmaWVkIGBldmVudGAuIElmIGFueSBwbHVnaW4gcmV0dXJucyBgZmFsc2VgLFxuICogdGhlIGV2ZW50IHdpbGwgYmUgZGlzY2FyZGVkLlxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7SUV2ZW50fSBldmVudCAtIFRoZSBldmVudCBvYmplY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBwbHVnaW4gb3B0aW9ucy5cbiAqL1xuLyoqXG4gKiBAbWV0aG9kIElQbHVnaW4jYWZ0ZXJFdmVudFxuICogQGRlc2MgQ2FsbGVkIGFmdGVyIHRoZSBgZXZlbnRgIGhhcyBiZWVuIGNvbnN1bWVkLiBOb3RlIHRoYXQgdGhpcyBob29rXG4gKiB3aWxsIG5vdCBiZSBjYWxsZWQgaWYgdGhlIGBldmVudGAgaGFzIGJlZW4gcHJldmlvdXNseSBkaXNjYXJkZWQuXG4gKiBAcGFyYW0ge0NoYXJ0LkNvbnRyb2xsZXJ9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxuICogQHBhcmFtIHtJRXZlbnR9IGV2ZW50IC0gVGhlIGV2ZW50IG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxuICovXG4vKipcbiAqIEBtZXRob2QgSVBsdWdpbiNyZXNpemVcbiAqIEBkZXNjIENhbGxlZCBhZnRlciB0aGUgY2hhcnQgYXMgYmVlbiByZXNpemVkLlxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7TnVtYmVyfSBzaXplIC0gVGhlIG5ldyBjYW52YXMgZGlzcGxheSBzaXplIChlcS4gY2FudmFzLnN0eWxlIHdpZHRoICYgaGVpZ2h0KS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxuICovXG4vKipcbiAqIEBtZXRob2QgSVBsdWdpbiNkZXN0cm95XG4gKiBAZGVzYyBDYWxsZWQgYWZ0ZXIgdGhlIGNoYXJ0IGFzIGJlZW4gZGVzdHJveWVkLlxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxuICovXG5cbn0se1wiMjZcIjoyNixcIjQ2XCI6NDZ9XSwzMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xudmFyIEVsZW1lbnQgPSByZXF1aXJlKDI3KTtcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XG52YXIgVGlja3MgPSByZXF1aXJlKDM1KTtcblxuZGVmYXVsdHMuX3NldCgnc2NhbGUnLCB7XG5cdGRpc3BsYXk6IHRydWUsXG5cdHBvc2l0aW9uOiAnbGVmdCcsXG5cdG9mZnNldDogZmFsc2UsXG5cblx0Ly8gZ3JpZCBsaW5lIHNldHRpbmdzXG5cdGdyaWRMaW5lczoge1xuXHRcdGRpc3BsYXk6IHRydWUsXG5cdFx0Y29sb3I6ICdyZ2JhKDAsIDAsIDAsIDAuMSknLFxuXHRcdGxpbmVXaWR0aDogMSxcblx0XHRkcmF3Qm9yZGVyOiB0cnVlLFxuXHRcdGRyYXdPbkNoYXJ0QXJlYTogdHJ1ZSxcblx0XHRkcmF3VGlja3M6IHRydWUsXG5cdFx0dGlja01hcmtMZW5ndGg6IDEwLFxuXHRcdHplcm9MaW5lV2lkdGg6IDEsXG5cdFx0emVyb0xpbmVDb2xvcjogJ3JnYmEoMCwwLDAsMC4yNSknLFxuXHRcdHplcm9MaW5lQm9yZGVyRGFzaDogW10sXG5cdFx0emVyb0xpbmVCb3JkZXJEYXNoT2Zmc2V0OiAwLjAsXG5cdFx0b2Zmc2V0R3JpZExpbmVzOiBmYWxzZSxcblx0XHRib3JkZXJEYXNoOiBbXSxcblx0XHRib3JkZXJEYXNoT2Zmc2V0OiAwLjBcblx0fSxcblxuXHQvLyBzY2FsZSBsYWJlbFxuXHRzY2FsZUxhYmVsOiB7XG5cdFx0Ly8gZGlzcGxheSBwcm9wZXJ0eVxuXHRcdGRpc3BsYXk6IGZhbHNlLFxuXG5cdFx0Ly8gYWN0dWFsIGxhYmVsXG5cdFx0bGFiZWxTdHJpbmc6ICcnLFxuXG5cdFx0Ly8gbGluZSBoZWlnaHRcblx0XHRsaW5lSGVpZ2h0OiAxLjIsXG5cblx0XHQvLyB0b3AvYm90dG9tIHBhZGRpbmdcblx0XHRwYWRkaW5nOiB7XG5cdFx0XHR0b3A6IDQsXG5cdFx0XHRib3R0b206IDRcblx0XHR9XG5cdH0sXG5cblx0Ly8gbGFiZWwgc2V0dGluZ3Ncblx0dGlja3M6IHtcblx0XHRiZWdpbkF0WmVybzogZmFsc2UsXG5cdFx0bWluUm90YXRpb246IDAsXG5cdFx0bWF4Um90YXRpb246IDUwLFxuXHRcdG1pcnJvcjogZmFsc2UsXG5cdFx0cGFkZGluZzogMCxcblx0XHRyZXZlcnNlOiBmYWxzZSxcblx0XHRkaXNwbGF5OiB0cnVlLFxuXHRcdGF1dG9Ta2lwOiB0cnVlLFxuXHRcdGF1dG9Ta2lwUGFkZGluZzogMCxcblx0XHRsYWJlbE9mZnNldDogMCxcblx0XHQvLyBXZSBwYXNzIHRocm91Z2ggYXJyYXlzIHRvIGJlIHJlbmRlcmVkIGFzIG11bHRpbGluZSBsYWJlbHMsIHdlIGNvbnZlcnQgT3RoZXJzIHRvIHN0cmluZ3MgaGVyZS5cblx0XHRjYWxsYmFjazogVGlja3MuZm9ybWF0dGVycy52YWx1ZXMsXG5cdFx0bWlub3I6IHt9LFxuXHRcdG1ham9yOiB7fVxuXHR9XG59KTtcblxuZnVuY3Rpb24gbGFiZWxzRnJvbVRpY2tzKHRpY2tzKSB7XG5cdHZhciBsYWJlbHMgPSBbXTtcblx0dmFyIGksIGlsZW47XG5cblx0Zm9yIChpID0gMCwgaWxlbiA9IHRpY2tzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdGxhYmVscy5wdXNoKHRpY2tzW2ldLmxhYmVsKTtcblx0fVxuXG5cdHJldHVybiBsYWJlbHM7XG59XG5cbmZ1bmN0aW9uIGdldExpbmVWYWx1ZShzY2FsZSwgaW5kZXgsIG9mZnNldEdyaWRMaW5lcykge1xuXHR2YXIgbGluZVZhbHVlID0gc2NhbGUuZ2V0UGl4ZWxGb3JUaWNrKGluZGV4KTtcblxuXHRpZiAob2Zmc2V0R3JpZExpbmVzKSB7XG5cdFx0aWYgKGluZGV4ID09PSAwKSB7XG5cdFx0XHRsaW5lVmFsdWUgLT0gKHNjYWxlLmdldFBpeGVsRm9yVGljaygxKSAtIGxpbmVWYWx1ZSkgLyAyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsaW5lVmFsdWUgLT0gKGxpbmVWYWx1ZSAtIHNjYWxlLmdldFBpeGVsRm9yVGljayhpbmRleCAtIDEpKSAvIDI7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBsaW5lVmFsdWU7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVUZXh0U2l6ZShjb250ZXh0LCB0aWNrLCBmb250KSB7XG5cdHJldHVybiBoZWxwZXJzLmlzQXJyYXkodGljaykgP1xuXHRcdGhlbHBlcnMubG9uZ2VzdFRleHQoY29udGV4dCwgZm9udCwgdGljaykgOlxuXHRcdGNvbnRleHQubWVhc3VyZVRleHQodGljaykud2lkdGg7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRm9udE9wdGlvbnMob3B0aW9ucykge1xuXHR2YXIgdmFsdWVPckRlZmF1bHQgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0O1xuXHR2YXIgZ2xvYmFsRGVmYXVsdHMgPSBkZWZhdWx0cy5nbG9iYWw7XG5cdHZhciBzaXplID0gdmFsdWVPckRlZmF1bHQob3B0aW9ucy5mb250U2l6ZSwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRTaXplKTtcblx0dmFyIHN0eWxlID0gdmFsdWVPckRlZmF1bHQob3B0aW9ucy5mb250U3R5bGUsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250U3R5bGUpO1xuXHR2YXIgZmFtaWx5ID0gdmFsdWVPckRlZmF1bHQob3B0aW9ucy5mb250RmFtaWx5LCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udEZhbWlseSk7XG5cblx0cmV0dXJuIHtcblx0XHRzaXplOiBzaXplLFxuXHRcdHN0eWxlOiBzdHlsZSxcblx0XHRmYW1pbHk6IGZhbWlseSxcblx0XHRmb250OiBoZWxwZXJzLmZvbnRTdHJpbmcoc2l6ZSwgc3R5bGUsIGZhbWlseSlcblx0fTtcbn1cblxuZnVuY3Rpb24gcGFyc2VMaW5lSGVpZ2h0KG9wdGlvbnMpIHtcblx0cmV0dXJuIGhlbHBlcnMub3B0aW9ucy50b0xpbmVIZWlnaHQoXG5cdFx0aGVscGVycy52YWx1ZU9yRGVmYXVsdChvcHRpb25zLmxpbmVIZWlnaHQsIDEuMiksXG5cdFx0aGVscGVycy52YWx1ZU9yRGVmYXVsdChvcHRpb25zLmZvbnRTaXplLCBkZWZhdWx0cy5nbG9iYWwuZGVmYXVsdEZvbnRTaXplKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRWxlbWVudC5leHRlbmQoe1xuXHQvKipcblx0ICogR2V0IHRoZSBwYWRkaW5nIG5lZWRlZCBmb3IgdGhlIHNjYWxlXG5cdCAqIEBtZXRob2QgZ2V0UGFkZGluZ1xuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcmV0dXJucyB7UGFkZGluZ30gdGhlIG5lY2Vzc2FyeSBwYWRkaW5nXG5cdCAqL1xuXHRnZXRQYWRkaW5nOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHJldHVybiB7XG5cdFx0XHRsZWZ0OiBtZS5wYWRkaW5nTGVmdCB8fCAwLFxuXHRcdFx0dG9wOiBtZS5wYWRkaW5nVG9wIHx8IDAsXG5cdFx0XHRyaWdodDogbWUucGFkZGluZ1JpZ2h0IHx8IDAsXG5cdFx0XHRib3R0b206IG1lLnBhZGRpbmdCb3R0b20gfHwgMFxuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHNjYWxlIHRpY2sgb2JqZWN0cyAoe2xhYmVsLCBtYWpvcn0pXG5cdCAqIEBzaW5jZSAyLjdcblx0ICovXG5cdGdldFRpY2tzOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5fdGlja3M7XG5cdH0sXG5cblx0Ly8gVGhlc2UgbWV0aG9kcyBhcmUgb3JkZXJlZCBieSBsaWZlY3lsZS4gVXRpbGl0aWVzIHRoZW4gZm9sbG93LlxuXHQvLyBBbnkgZnVuY3Rpb24gZGVmaW5lZCBoZXJlIGlzIGluaGVyaXRlZCBieSBhbGwgc2NhbGUgdHlwZXMuXG5cdC8vIEFueSBmdW5jdGlvbiBjYW4gYmUgZXh0ZW5kZWQgYnkgdGhlIHNjYWxlIHR5cGVcblxuXHRtZXJnZVRpY2tzT3B0aW9uczogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHRpY2tzID0gdGhpcy5vcHRpb25zLnRpY2tzO1xuXHRcdGlmICh0aWNrcy5taW5vciA9PT0gZmFsc2UpIHtcblx0XHRcdHRpY2tzLm1pbm9yID0ge1xuXHRcdFx0XHRkaXNwbGF5OiBmYWxzZVxuXHRcdFx0fTtcblx0XHR9XG5cdFx0aWYgKHRpY2tzLm1ham9yID09PSBmYWxzZSkge1xuXHRcdFx0dGlja3MubWFqb3IgPSB7XG5cdFx0XHRcdGRpc3BsYXk6IGZhbHNlXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRmb3IgKHZhciBrZXkgaW4gdGlja3MpIHtcblx0XHRcdGlmIChrZXkgIT09ICdtYWpvcicgJiYga2V5ICE9PSAnbWlub3InKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgdGlja3MubWlub3Jba2V5XSA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0XHR0aWNrcy5taW5vcltrZXldID0gdGlja3Nba2V5XTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodHlwZW9mIHRpY2tzLm1ham9yW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdFx0dGlja3MubWFqb3Jba2V5XSA9IHRpY2tzW2tleV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdGJlZm9yZVVwZGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0aGVscGVycy5jYWxsYmFjayh0aGlzLm9wdGlvbnMuYmVmb3JlVXBkYXRlLCBbdGhpc10pO1xuXHR9LFxuXG5cdHVwZGF0ZTogZnVuY3Rpb24obWF4V2lkdGgsIG1heEhlaWdodCwgbWFyZ2lucykge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIGksIGlsZW4sIGxhYmVscywgbGFiZWwsIHRpY2tzLCB0aWNrO1xuXG5cdFx0Ly8gVXBkYXRlIExpZmVjeWNsZSAtIFByb2JhYmx5IGRvbid0IHdhbnQgdG8gZXZlciBleHRlbmQgb3Igb3ZlcndyaXRlIHRoaXMgZnVuY3Rpb24gOylcblx0XHRtZS5iZWZvcmVVcGRhdGUoKTtcblxuXHRcdC8vIEFic29yYiB0aGUgbWFzdGVyIG1lYXN1cmVtZW50c1xuXHRcdG1lLm1heFdpZHRoID0gbWF4V2lkdGg7XG5cdFx0bWUubWF4SGVpZ2h0ID0gbWF4SGVpZ2h0O1xuXHRcdG1lLm1hcmdpbnMgPSBoZWxwZXJzLmV4dGVuZCh7XG5cdFx0XHRsZWZ0OiAwLFxuXHRcdFx0cmlnaHQ6IDAsXG5cdFx0XHR0b3A6IDAsXG5cdFx0XHRib3R0b206IDBcblx0XHR9LCBtYXJnaW5zKTtcblx0XHRtZS5sb25nZXN0VGV4dENhY2hlID0gbWUubG9uZ2VzdFRleHRDYWNoZSB8fCB7fTtcblxuXHRcdC8vIERpbWVuc2lvbnNcblx0XHRtZS5iZWZvcmVTZXREaW1lbnNpb25zKCk7XG5cdFx0bWUuc2V0RGltZW5zaW9ucygpO1xuXHRcdG1lLmFmdGVyU2V0RGltZW5zaW9ucygpO1xuXG5cdFx0Ly8gRGF0YSBtaW4vbWF4XG5cdFx0bWUuYmVmb3JlRGF0YUxpbWl0cygpO1xuXHRcdG1lLmRldGVybWluZURhdGFMaW1pdHMoKTtcblx0XHRtZS5hZnRlckRhdGFMaW1pdHMoKTtcblxuXHRcdC8vIFRpY2tzIC0gYHRoaXMudGlja3NgIGlzIG5vdyBERVBSRUNBVEVEIVxuXHRcdC8vIEludGVybmFsIHRpY2tzIGFyZSBub3cgc3RvcmVkIGFzIG9iamVjdHMgaW4gdGhlIFBSSVZBVEUgYHRoaXMuX3RpY2tzYCBtZW1iZXJcblx0XHQvLyBhbmQgbXVzdCBub3QgYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBvdXRzaWRlIHRoaXMgY2xhc3MuIGB0aGlzLnRpY2tzYCBiZWluZ1xuXHRcdC8vIGFyb3VuZCBmb3IgbG9uZyB0aW1lIGFuZCBub3QgbWFya2VkIGFzIHByaXZhdGUsIHdlIGNhbid0IGNoYW5nZSBpdHMgc3RydWN0dXJlXG5cdFx0Ly8gd2l0aG91dCB1bmV4cGVjdGVkIGJyZWFraW5nIGNoYW5nZXMuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2NhbGUgdGlja3MsXG5cdFx0Ly8gdXNlIHNjYWxlLmdldFRpY2tzKCkgaW5zdGVhZC5cblxuXHRcdG1lLmJlZm9yZUJ1aWxkVGlja3MoKTtcblxuXHRcdC8vIE5ldyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHJldHVybiBhbiBhcnJheSBvZiBvYmplY3RzIGJ1dCBmb3IgQkFDS1dBUkQgQ09NUEFULFxuXHRcdC8vIHdlIHN0aWxsIHN1cHBvcnQgbm8gcmV0dXJuIChgdGhpcy50aWNrc2AgaW50ZXJuYWxseSBzZXQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCkuXG5cdFx0dGlja3MgPSBtZS5idWlsZFRpY2tzKCkgfHwgW107XG5cblx0XHRtZS5hZnRlckJ1aWxkVGlja3MoKTtcblxuXHRcdG1lLmJlZm9yZVRpY2tUb0xhYmVsQ29udmVyc2lvbigpO1xuXG5cdFx0Ly8gTmV3IGltcGxlbWVudGF0aW9ucyBzaG91bGQgcmV0dXJuIHRoZSBmb3JtYXR0ZWQgdGljayBsYWJlbHMgYnV0IGZvciBCQUNLV0FSRFxuXHRcdC8vIENPTVBBVCwgd2Ugc3RpbGwgc3VwcG9ydCBubyByZXR1cm4gKGB0aGlzLnRpY2tzYCBpbnRlcm5hbGx5IGNoYW5nZWQgYnkgY2FsbGluZ1xuXHRcdC8vIHRoaXMgbWV0aG9kIGFuZCBzdXBwb3NlZCB0byBjb250YWluIG9ubHkgc3RyaW5nIHZhbHVlcykuXG5cdFx0bGFiZWxzID0gbWUuY29udmVydFRpY2tzVG9MYWJlbHModGlja3MpIHx8IG1lLnRpY2tzO1xuXG5cdFx0bWUuYWZ0ZXJUaWNrVG9MYWJlbENvbnZlcnNpb24oKTtcblxuXHRcdG1lLnRpY2tzID0gbGFiZWxzOyAgIC8vIEJBQ0tXQVJEIENPTVBBVElCSUxJVFlcblxuXHRcdC8vIElNUE9SVEFOVDogZnJvbSB0aGlzIHBvaW50LCB3ZSBjb25zaWRlciB0aGF0IGB0aGlzLnRpY2tzYCB3aWxsIE5FVkVSIGNoYW5nZSFcblxuXHRcdC8vIEJBQ0tXQVJEIENPTVBBVDogc3luY2hyb25pemUgYF90aWNrc2Agd2l0aCBsYWJlbHMgKHNvIHBvdGVudGlhbGx5IGB0aGlzLnRpY2tzYClcblx0XHRmb3IgKGkgPSAwLCBpbGVuID0gbGFiZWxzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0bGFiZWwgPSBsYWJlbHNbaV07XG5cdFx0XHR0aWNrID0gdGlja3NbaV07XG5cdFx0XHRpZiAoIXRpY2spIHtcblx0XHRcdFx0dGlja3MucHVzaCh0aWNrID0ge1xuXHRcdFx0XHRcdGxhYmVsOiBsYWJlbCxcblx0XHRcdFx0XHRtYWpvcjogZmFsc2Vcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aWNrLmxhYmVsID0gbGFiZWw7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bWUuX3RpY2tzID0gdGlja3M7XG5cblx0XHQvLyBUaWNrIFJvdGF0aW9uXG5cdFx0bWUuYmVmb3JlQ2FsY3VsYXRlVGlja1JvdGF0aW9uKCk7XG5cdFx0bWUuY2FsY3VsYXRlVGlja1JvdGF0aW9uKCk7XG5cdFx0bWUuYWZ0ZXJDYWxjdWxhdGVUaWNrUm90YXRpb24oKTtcblx0XHQvLyBGaXRcblx0XHRtZS5iZWZvcmVGaXQoKTtcblx0XHRtZS5maXQoKTtcblx0XHRtZS5hZnRlckZpdCgpO1xuXHRcdC8vXG5cdFx0bWUuYWZ0ZXJVcGRhdGUoKTtcblxuXHRcdHJldHVybiBtZS5taW5TaXplO1xuXG5cdH0sXG5cdGFmdGVyVXBkYXRlOiBmdW5jdGlvbigpIHtcblx0XHRoZWxwZXJzLmNhbGxiYWNrKHRoaXMub3B0aW9ucy5hZnRlclVwZGF0ZSwgW3RoaXNdKTtcblx0fSxcblxuXHQvL1xuXG5cdGJlZm9yZVNldERpbWVuc2lvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdGhlbHBlcnMuY2FsbGJhY2sodGhpcy5vcHRpb25zLmJlZm9yZVNldERpbWVuc2lvbnMsIFt0aGlzXSk7XG5cdH0sXG5cdHNldERpbWVuc2lvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0Ly8gU2V0IHRoZSB1bmNvbnN0cmFpbmVkIGRpbWVuc2lvbiBiZWZvcmUgbGFiZWwgcm90YXRpb25cblx0XHRpZiAobWUuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdC8vIFJlc2V0IHBvc2l0aW9uIGJlZm9yZSBjYWxjdWxhdGluZyByb3RhdGlvblxuXHRcdFx0bWUud2lkdGggPSBtZS5tYXhXaWR0aDtcblx0XHRcdG1lLmxlZnQgPSAwO1xuXHRcdFx0bWUucmlnaHQgPSBtZS53aWR0aDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWUuaGVpZ2h0ID0gbWUubWF4SGVpZ2h0O1xuXG5cdFx0XHQvLyBSZXNldCBwb3NpdGlvbiBiZWZvcmUgY2FsY3VsYXRpbmcgcm90YXRpb25cblx0XHRcdG1lLnRvcCA9IDA7XG5cdFx0XHRtZS5ib3R0b20gPSBtZS5oZWlnaHQ7XG5cdFx0fVxuXG5cdFx0Ly8gUmVzZXQgcGFkZGluZ1xuXHRcdG1lLnBhZGRpbmdMZWZ0ID0gMDtcblx0XHRtZS5wYWRkaW5nVG9wID0gMDtcblx0XHRtZS5wYWRkaW5nUmlnaHQgPSAwO1xuXHRcdG1lLnBhZGRpbmdCb3R0b20gPSAwO1xuXHR9LFxuXHRhZnRlclNldERpbWVuc2lvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdGhlbHBlcnMuY2FsbGJhY2sodGhpcy5vcHRpb25zLmFmdGVyU2V0RGltZW5zaW9ucywgW3RoaXNdKTtcblx0fSxcblxuXHQvLyBEYXRhIGxpbWl0c1xuXHRiZWZvcmVEYXRhTGltaXRzOiBmdW5jdGlvbigpIHtcblx0XHRoZWxwZXJzLmNhbGxiYWNrKHRoaXMub3B0aW9ucy5iZWZvcmVEYXRhTGltaXRzLCBbdGhpc10pO1xuXHR9LFxuXHRkZXRlcm1pbmVEYXRhTGltaXRzOiBoZWxwZXJzLm5vb3AsXG5cdGFmdGVyRGF0YUxpbWl0czogZnVuY3Rpb24oKSB7XG5cdFx0aGVscGVycy5jYWxsYmFjayh0aGlzLm9wdGlvbnMuYWZ0ZXJEYXRhTGltaXRzLCBbdGhpc10pO1xuXHR9LFxuXG5cdC8vXG5cdGJlZm9yZUJ1aWxkVGlja3M6IGZ1bmN0aW9uKCkge1xuXHRcdGhlbHBlcnMuY2FsbGJhY2sodGhpcy5vcHRpb25zLmJlZm9yZUJ1aWxkVGlja3MsIFt0aGlzXSk7XG5cdH0sXG5cdGJ1aWxkVGlja3M6IGhlbHBlcnMubm9vcCxcblx0YWZ0ZXJCdWlsZFRpY2tzOiBmdW5jdGlvbigpIHtcblx0XHRoZWxwZXJzLmNhbGxiYWNrKHRoaXMub3B0aW9ucy5hZnRlckJ1aWxkVGlja3MsIFt0aGlzXSk7XG5cdH0sXG5cblx0YmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uOiBmdW5jdGlvbigpIHtcblx0XHRoZWxwZXJzLmNhbGxiYWNrKHRoaXMub3B0aW9ucy5iZWZvcmVUaWNrVG9MYWJlbENvbnZlcnNpb24sIFt0aGlzXSk7XG5cdH0sXG5cdGNvbnZlcnRUaWNrc1RvTGFiZWxzOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdC8vIENvbnZlcnQgdGlja3MgdG8gc3RyaW5nc1xuXHRcdHZhciB0aWNrT3B0cyA9IG1lLm9wdGlvbnMudGlja3M7XG5cdFx0bWUudGlja3MgPSBtZS50aWNrcy5tYXAodGlja09wdHMudXNlckNhbGxiYWNrIHx8IHRpY2tPcHRzLmNhbGxiYWNrLCB0aGlzKTtcblx0fSxcblx0YWZ0ZXJUaWNrVG9MYWJlbENvbnZlcnNpb246IGZ1bmN0aW9uKCkge1xuXHRcdGhlbHBlcnMuY2FsbGJhY2sodGhpcy5vcHRpb25zLmFmdGVyVGlja1RvTGFiZWxDb252ZXJzaW9uLCBbdGhpc10pO1xuXHR9LFxuXG5cdC8vXG5cblx0YmVmb3JlQ2FsY3VsYXRlVGlja1JvdGF0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRoZWxwZXJzLmNhbGxiYWNrKHRoaXMub3B0aW9ucy5iZWZvcmVDYWxjdWxhdGVUaWNrUm90YXRpb24sIFt0aGlzXSk7XG5cdH0sXG5cdGNhbGN1bGF0ZVRpY2tSb3RhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgY29udGV4dCA9IG1lLmN0eDtcblx0XHR2YXIgdGlja09wdHMgPSBtZS5vcHRpb25zLnRpY2tzO1xuXHRcdHZhciBsYWJlbHMgPSBsYWJlbHNGcm9tVGlja3MobWUuX3RpY2tzKTtcblxuXHRcdC8vIEdldCB0aGUgd2lkdGggb2YgZWFjaCBncmlkIGJ5IGNhbGN1bGF0aW5nIHRoZSBkaWZmZXJlbmNlXG5cdFx0Ly8gYmV0d2VlbiB4IG9mZnNldHMgYmV0d2VlbiAwIGFuZCAxLlxuXHRcdHZhciB0aWNrRm9udCA9IHBhcnNlRm9udE9wdGlvbnModGlja09wdHMpO1xuXHRcdGNvbnRleHQuZm9udCA9IHRpY2tGb250LmZvbnQ7XG5cblx0XHR2YXIgbGFiZWxSb3RhdGlvbiA9IHRpY2tPcHRzLm1pblJvdGF0aW9uIHx8IDA7XG5cblx0XHRpZiAobGFiZWxzLmxlbmd0aCAmJiBtZS5vcHRpb25zLmRpc3BsYXkgJiYgbWUuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdHZhciBvcmlnaW5hbExhYmVsV2lkdGggPSBoZWxwZXJzLmxvbmdlc3RUZXh0KGNvbnRleHQsIHRpY2tGb250LmZvbnQsIGxhYmVscywgbWUubG9uZ2VzdFRleHRDYWNoZSk7XG5cdFx0XHR2YXIgbGFiZWxXaWR0aCA9IG9yaWdpbmFsTGFiZWxXaWR0aDtcblx0XHRcdHZhciBjb3NSb3RhdGlvbiwgc2luUm90YXRpb247XG5cblx0XHRcdC8vIEFsbG93IDMgcGl4ZWxzIHgyIHBhZGRpbmcgZWl0aGVyIHNpZGUgZm9yIGxhYmVsIHJlYWRhYmlsaXR5XG5cdFx0XHR2YXIgdGlja1dpZHRoID0gbWUuZ2V0UGl4ZWxGb3JUaWNrKDEpIC0gbWUuZ2V0UGl4ZWxGb3JUaWNrKDApIC0gNjtcblxuXHRcdFx0Ly8gTWF4IGxhYmVsIHJvdGF0aW9uIGNhbiBiZSBzZXQgb3IgZGVmYXVsdCB0byA5MCAtIGFsc28gYWN0IGFzIGEgbG9vcCBjb3VudGVyXG5cdFx0XHR3aGlsZSAobGFiZWxXaWR0aCA+IHRpY2tXaWR0aCAmJiBsYWJlbFJvdGF0aW9uIDwgdGlja09wdHMubWF4Um90YXRpb24pIHtcblx0XHRcdFx0dmFyIGFuZ2xlUmFkaWFucyA9IGhlbHBlcnMudG9SYWRpYW5zKGxhYmVsUm90YXRpb24pO1xuXHRcdFx0XHRjb3NSb3RhdGlvbiA9IE1hdGguY29zKGFuZ2xlUmFkaWFucyk7XG5cdFx0XHRcdHNpblJvdGF0aW9uID0gTWF0aC5zaW4oYW5nbGVSYWRpYW5zKTtcblxuXHRcdFx0XHRpZiAoc2luUm90YXRpb24gKiBvcmlnaW5hbExhYmVsV2lkdGggPiBtZS5tYXhIZWlnaHQpIHtcblx0XHRcdFx0XHQvLyBnbyBiYWNrIG9uZSBzdGVwXG5cdFx0XHRcdFx0bGFiZWxSb3RhdGlvbi0tO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGFiZWxSb3RhdGlvbisrO1xuXHRcdFx0XHRsYWJlbFdpZHRoID0gY29zUm90YXRpb24gKiBvcmlnaW5hbExhYmVsV2lkdGg7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bWUubGFiZWxSb3RhdGlvbiA9IGxhYmVsUm90YXRpb247XG5cdH0sXG5cdGFmdGVyQ2FsY3VsYXRlVGlja1JvdGF0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRoZWxwZXJzLmNhbGxiYWNrKHRoaXMub3B0aW9ucy5hZnRlckNhbGN1bGF0ZVRpY2tSb3RhdGlvbiwgW3RoaXNdKTtcblx0fSxcblxuXHQvL1xuXG5cdGJlZm9yZUZpdDogZnVuY3Rpb24oKSB7XG5cdFx0aGVscGVycy5jYWxsYmFjayh0aGlzLm9wdGlvbnMuYmVmb3JlRml0LCBbdGhpc10pO1xuXHR9LFxuXHRmaXQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0Ly8gUmVzZXRcblx0XHR2YXIgbWluU2l6ZSA9IG1lLm1pblNpemUgPSB7XG5cdFx0XHR3aWR0aDogMCxcblx0XHRcdGhlaWdodDogMFxuXHRcdH07XG5cblx0XHR2YXIgbGFiZWxzID0gbGFiZWxzRnJvbVRpY2tzKG1lLl90aWNrcyk7XG5cblx0XHR2YXIgb3B0cyA9IG1lLm9wdGlvbnM7XG5cdFx0dmFyIHRpY2tPcHRzID0gb3B0cy50aWNrcztcblx0XHR2YXIgc2NhbGVMYWJlbE9wdHMgPSBvcHRzLnNjYWxlTGFiZWw7XG5cdFx0dmFyIGdyaWRMaW5lT3B0cyA9IG9wdHMuZ3JpZExpbmVzO1xuXHRcdHZhciBkaXNwbGF5ID0gb3B0cy5kaXNwbGF5O1xuXHRcdHZhciBpc0hvcml6b250YWwgPSBtZS5pc0hvcml6b250YWwoKTtcblxuXHRcdHZhciB0aWNrRm9udCA9IHBhcnNlRm9udE9wdGlvbnModGlja09wdHMpO1xuXHRcdHZhciB0aWNrTWFya0xlbmd0aCA9IG9wdHMuZ3JpZExpbmVzLnRpY2tNYXJrTGVuZ3RoO1xuXG5cdFx0Ly8gV2lkdGhcblx0XHRpZiAoaXNIb3Jpem9udGFsKSB7XG5cdFx0XHQvLyBzdWJ0cmFjdCB0aGUgbWFyZ2lucyB0byBsaW5lIHVwIHdpdGggdGhlIGNoYXJ0QXJlYSBpZiB3ZSBhcmUgYSBmdWxsIHdpZHRoIHNjYWxlXG5cdFx0XHRtaW5TaXplLndpZHRoID0gbWUuaXNGdWxsV2lkdGgoKSA/IG1lLm1heFdpZHRoIC0gbWUubWFyZ2lucy5sZWZ0IC0gbWUubWFyZ2lucy5yaWdodCA6IG1lLm1heFdpZHRoO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtaW5TaXplLndpZHRoID0gZGlzcGxheSAmJiBncmlkTGluZU9wdHMuZHJhd1RpY2tzID8gdGlja01hcmtMZW5ndGggOiAwO1xuXHRcdH1cblxuXHRcdC8vIGhlaWdodFxuXHRcdGlmIChpc0hvcml6b250YWwpIHtcblx0XHRcdG1pblNpemUuaGVpZ2h0ID0gZGlzcGxheSAmJiBncmlkTGluZU9wdHMuZHJhd1RpY2tzID8gdGlja01hcmtMZW5ndGggOiAwO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtaW5TaXplLmhlaWdodCA9IG1lLm1heEhlaWdodDsgLy8gZmlsbCBhbGwgdGhlIGhlaWdodFxuXHRcdH1cblxuXHRcdC8vIEFyZSB3ZSBzaG93aW5nIGEgdGl0bGUgZm9yIHRoZSBzY2FsZT9cblx0XHRpZiAoc2NhbGVMYWJlbE9wdHMuZGlzcGxheSAmJiBkaXNwbGF5KSB7XG5cdFx0XHR2YXIgc2NhbGVMYWJlbExpbmVIZWlnaHQgPSBwYXJzZUxpbmVIZWlnaHQoc2NhbGVMYWJlbE9wdHMpO1xuXHRcdFx0dmFyIHNjYWxlTGFiZWxQYWRkaW5nID0gaGVscGVycy5vcHRpb25zLnRvUGFkZGluZyhzY2FsZUxhYmVsT3B0cy5wYWRkaW5nKTtcblx0XHRcdHZhciBkZWx0YUhlaWdodCA9IHNjYWxlTGFiZWxMaW5lSGVpZ2h0ICsgc2NhbGVMYWJlbFBhZGRpbmcuaGVpZ2h0O1xuXG5cdFx0XHRpZiAoaXNIb3Jpem9udGFsKSB7XG5cdFx0XHRcdG1pblNpemUuaGVpZ2h0ICs9IGRlbHRhSGVpZ2h0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWluU2l6ZS53aWR0aCArPSBkZWx0YUhlaWdodDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBEb24ndCBib3RoZXIgZml0dGluZyB0aGUgdGlja3MgaWYgd2UgYXJlIG5vdCBzaG93aW5nIHRoZW1cblx0XHRpZiAodGlja09wdHMuZGlzcGxheSAmJiBkaXNwbGF5KSB7XG5cdFx0XHR2YXIgbGFyZ2VzdFRleHRXaWR0aCA9IGhlbHBlcnMubG9uZ2VzdFRleHQobWUuY3R4LCB0aWNrRm9udC5mb250LCBsYWJlbHMsIG1lLmxvbmdlc3RUZXh0Q2FjaGUpO1xuXHRcdFx0dmFyIHRhbGxlc3RMYWJlbEhlaWdodEluTGluZXMgPSBoZWxwZXJzLm51bWJlck9mTGFiZWxMaW5lcyhsYWJlbHMpO1xuXHRcdFx0dmFyIGxpbmVTcGFjZSA9IHRpY2tGb250LnNpemUgKiAwLjU7XG5cdFx0XHR2YXIgdGlja1BhZGRpbmcgPSBtZS5vcHRpb25zLnRpY2tzLnBhZGRpbmc7XG5cblx0XHRcdGlmIChpc0hvcml6b250YWwpIHtcblx0XHRcdFx0Ly8gQSBob3Jpem9udGFsIGF4aXMgaXMgbW9yZSBjb25zdHJhaW5lZCBieSB0aGUgaGVpZ2h0LlxuXHRcdFx0XHRtZS5sb25nZXN0TGFiZWxXaWR0aCA9IGxhcmdlc3RUZXh0V2lkdGg7XG5cblx0XHRcdFx0dmFyIGFuZ2xlUmFkaWFucyA9IGhlbHBlcnMudG9SYWRpYW5zKG1lLmxhYmVsUm90YXRpb24pO1xuXHRcdFx0XHR2YXIgY29zUm90YXRpb24gPSBNYXRoLmNvcyhhbmdsZVJhZGlhbnMpO1xuXHRcdFx0XHR2YXIgc2luUm90YXRpb24gPSBNYXRoLnNpbihhbmdsZVJhZGlhbnMpO1xuXG5cdFx0XHRcdC8vIFRPRE8gLSBpbXByb3ZlIHRoaXMgY2FsY3VsYXRpb25cblx0XHRcdFx0dmFyIGxhYmVsSGVpZ2h0ID0gKHNpblJvdGF0aW9uICogbGFyZ2VzdFRleHRXaWR0aClcblx0XHRcdFx0XHQrICh0aWNrRm9udC5zaXplICogdGFsbGVzdExhYmVsSGVpZ2h0SW5MaW5lcylcblx0XHRcdFx0XHQrIChsaW5lU3BhY2UgKiAodGFsbGVzdExhYmVsSGVpZ2h0SW5MaW5lcyAtIDEpKVxuXHRcdFx0XHRcdCsgbGluZVNwYWNlOyAvLyBwYWRkaW5nXG5cblx0XHRcdFx0bWluU2l6ZS5oZWlnaHQgPSBNYXRoLm1pbihtZS5tYXhIZWlnaHQsIG1pblNpemUuaGVpZ2h0ICsgbGFiZWxIZWlnaHQgKyB0aWNrUGFkZGluZyk7XG5cblx0XHRcdFx0bWUuY3R4LmZvbnQgPSB0aWNrRm9udC5mb250O1xuXHRcdFx0XHR2YXIgZmlyc3RMYWJlbFdpZHRoID0gY29tcHV0ZVRleHRTaXplKG1lLmN0eCwgbGFiZWxzWzBdLCB0aWNrRm9udC5mb250KTtcblx0XHRcdFx0dmFyIGxhc3RMYWJlbFdpZHRoID0gY29tcHV0ZVRleHRTaXplKG1lLmN0eCwgbGFiZWxzW2xhYmVscy5sZW5ndGggLSAxXSwgdGlja0ZvbnQuZm9udCk7XG5cblx0XHRcdFx0Ly8gRW5zdXJlIHRoYXQgb3VyIHRpY2tzIGFyZSBhbHdheXMgaW5zaWRlIHRoZSBjYW52YXMuIFdoZW4gcm90YXRlZCwgdGlja3MgYXJlIHJpZ2h0IGFsaWduZWRcblx0XHRcdFx0Ly8gd2hpY2ggbWVhbnMgdGhhdCB0aGUgcmlnaHQgcGFkZGluZyBpcyBkb21pbmF0ZWQgYnkgdGhlIGZvbnQgaGVpZ2h0XG5cdFx0XHRcdGlmIChtZS5sYWJlbFJvdGF0aW9uICE9PSAwKSB7XG5cdFx0XHRcdFx0bWUucGFkZGluZ0xlZnQgPSBvcHRzLnBvc2l0aW9uID09PSAnYm90dG9tJyA/IChjb3NSb3RhdGlvbiAqIGZpcnN0TGFiZWxXaWR0aCkgKyAzIDogKGNvc1JvdGF0aW9uICogbGluZVNwYWNlKSArIDM7IC8vIGFkZCAzIHB4IHRvIG1vdmUgYXdheSBmcm9tIGNhbnZhcyBlZGdlc1xuXHRcdFx0XHRcdG1lLnBhZGRpbmdSaWdodCA9IG9wdHMucG9zaXRpb24gPT09ICdib3R0b20nID8gKGNvc1JvdGF0aW9uICogbGluZVNwYWNlKSArIDMgOiAoY29zUm90YXRpb24gKiBsYXN0TGFiZWxXaWR0aCkgKyAzO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG1lLnBhZGRpbmdMZWZ0ID0gZmlyc3RMYWJlbFdpZHRoIC8gMiArIDM7IC8vIGFkZCAzIHB4IHRvIG1vdmUgYXdheSBmcm9tIGNhbnZhcyBlZGdlc1xuXHRcdFx0XHRcdG1lLnBhZGRpbmdSaWdodCA9IGxhc3RMYWJlbFdpZHRoIC8gMiArIDM7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIEEgdmVydGljYWwgYXhpcyBpcyBtb3JlIGNvbnN0cmFpbmVkIGJ5IHRoZSB3aWR0aC4gTGFiZWxzIGFyZSB0aGVcblx0XHRcdFx0Ly8gZG9taW5hbnQgZmFjdG9yIGhlcmUsIHNvIGdldCB0aGF0IGxlbmd0aCBmaXJzdCBhbmQgYWNjb3VudCBmb3IgcGFkZGluZ1xuXHRcdFx0XHRpZiAodGlja09wdHMubWlycm9yKSB7XG5cdFx0XHRcdFx0bGFyZ2VzdFRleHRXaWR0aCA9IDA7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdXNlIGxpbmVTcGFjZSBmb3IgY29uc2lzdGVuY3kgd2l0aCBob3Jpem9udGFsIGF4aXNcblx0XHRcdFx0XHQvLyB0aWNrUGFkZGluZyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIGhvcml6b250YWxcblx0XHRcdFx0XHRsYXJnZXN0VGV4dFdpZHRoICs9IHRpY2tQYWRkaW5nICsgbGluZVNwYWNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bWluU2l6ZS53aWR0aCA9IE1hdGgubWluKG1lLm1heFdpZHRoLCBtaW5TaXplLndpZHRoICsgbGFyZ2VzdFRleHRXaWR0aCk7XG5cblx0XHRcdFx0bWUucGFkZGluZ1RvcCA9IHRpY2tGb250LnNpemUgLyAyO1xuXHRcdFx0XHRtZS5wYWRkaW5nQm90dG9tID0gdGlja0ZvbnQuc2l6ZSAvIDI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bWUuaGFuZGxlTWFyZ2lucygpO1xuXG5cdFx0bWUud2lkdGggPSBtaW5TaXplLndpZHRoO1xuXHRcdG1lLmhlaWdodCA9IG1pblNpemUuaGVpZ2h0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBIYW5kbGUgbWFyZ2lucyBhbmQgcGFkZGluZyBpbnRlcmFjdGlvbnNcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGhhbmRsZU1hcmdpbnM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0aWYgKG1lLm1hcmdpbnMpIHtcblx0XHRcdG1lLnBhZGRpbmdMZWZ0ID0gTWF0aC5tYXgobWUucGFkZGluZ0xlZnQgLSBtZS5tYXJnaW5zLmxlZnQsIDApO1xuXHRcdFx0bWUucGFkZGluZ1RvcCA9IE1hdGgubWF4KG1lLnBhZGRpbmdUb3AgLSBtZS5tYXJnaW5zLnRvcCwgMCk7XG5cdFx0XHRtZS5wYWRkaW5nUmlnaHQgPSBNYXRoLm1heChtZS5wYWRkaW5nUmlnaHQgLSBtZS5tYXJnaW5zLnJpZ2h0LCAwKTtcblx0XHRcdG1lLnBhZGRpbmdCb3R0b20gPSBNYXRoLm1heChtZS5wYWRkaW5nQm90dG9tIC0gbWUubWFyZ2lucy5ib3R0b20sIDApO1xuXHRcdH1cblx0fSxcblxuXHRhZnRlckZpdDogZnVuY3Rpb24oKSB7XG5cdFx0aGVscGVycy5jYWxsYmFjayh0aGlzLm9wdGlvbnMuYWZ0ZXJGaXQsIFt0aGlzXSk7XG5cdH0sXG5cblx0Ly8gU2hhcmVkIE1ldGhvZHNcblx0aXNIb3Jpem9udGFsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5vcHRpb25zLnBvc2l0aW9uID09PSAndG9wJyB8fCB0aGlzLm9wdGlvbnMucG9zaXRpb24gPT09ICdib3R0b20nO1xuXHR9LFxuXHRpc0Z1bGxXaWR0aDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuICh0aGlzLm9wdGlvbnMuZnVsbFdpZHRoKTtcblx0fSxcblxuXHQvLyBHZXQgdGhlIGNvcnJlY3QgdmFsdWUuIE5hTiBiYWQgaW5wdXRzLCBJZiB0aGUgdmFsdWUgdHlwZSBpcyBvYmplY3QgZ2V0IHRoZSB4IG9yIHkgYmFzZWQgb24gd2hldGhlciB3ZSBhcmUgaG9yaXpvbnRhbCBvciBub3Rcblx0Z2V0UmlnaHRWYWx1ZTogZnVuY3Rpb24ocmF3VmFsdWUpIHtcblx0XHQvLyBOdWxsIGFuZCB1bmRlZmluZWQgdmFsdWVzIGZpcnN0XG5cdFx0aWYgKGhlbHBlcnMuaXNOdWxsT3JVbmRlZihyYXdWYWx1ZSkpIHtcblx0XHRcdHJldHVybiBOYU47XG5cdFx0fVxuXHRcdC8vIGlzTmFOKG9iamVjdCkgcmV0dXJucyB0cnVlLCBzbyBtYWtlIHN1cmUgTmFOIGlzIGNoZWNraW5nIGZvciBhIG51bWJlcjsgRGlzY2FyZCBJbmZpbml0ZSB2YWx1ZXNcblx0XHRpZiAodHlwZW9mIHJhd1ZhbHVlID09PSAnbnVtYmVyJyAmJiAhaXNGaW5pdGUocmF3VmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gTmFOO1xuXHRcdH1cblx0XHQvLyBJZiBpdCBpcyBpbiBmYWN0IGFuIG9iamVjdCwgZGl2ZSBpbiBvbmUgbW9yZSBsZXZlbFxuXHRcdGlmIChyYXdWYWx1ZSkge1xuXHRcdFx0aWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdFx0aWYgKHJhd1ZhbHVlLnggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmdldFJpZ2h0VmFsdWUocmF3VmFsdWUueCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAocmF3VmFsdWUueSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmdldFJpZ2h0VmFsdWUocmF3VmFsdWUueSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gVmFsdWUgaXMgZ29vZCwgcmV0dXJuIGl0XG5cdFx0cmV0dXJuIHJhd1ZhbHVlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVc2VkIHRvIGdldCB0aGUgdmFsdWUgdG8gZGlzcGxheSBpbiB0aGUgdG9vbHRpcCBmb3IgdGhlIGRhdGEgYXQgdGhlIGdpdmVuIGluZGV4XG5cdCAqIEBwYXJhbSBpbmRleFxuXHQgKiBAcGFyYW0gZGF0YXNldEluZGV4XG5cdCAqL1xuXHRnZXRMYWJlbEZvckluZGV4OiBoZWxwZXJzLm5vb3AsXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBnaXZlbiBkYXRhIHBvaW50LiBWYWx1ZSBjYW4gZWl0aGVyIGJlIGFuIGluZGV4IG9yIGEgbnVtZXJpY2FsIHZhbHVlXG5cdCAqIFRoZSBjb29yZGluYXRlICgwLCAwKSBpcyBhdCB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIGNhbnZhc1xuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICogQHBhcmFtIGluZGV4XG5cdCAqIEBwYXJhbSBkYXRhc2V0SW5kZXhcblx0ICovXG5cdGdldFBpeGVsRm9yVmFsdWU6IGhlbHBlcnMubm9vcCxcblxuXHQvKipcblx0ICogVXNlZCB0byBnZXQgdGhlIGRhdGEgdmFsdWUgZnJvbSBhIGdpdmVuIHBpeGVsLiBUaGlzIGlzIHRoZSBpbnZlcnNlIG9mIGdldFBpeGVsRm9yVmFsdWVcblx0ICogVGhlIGNvb3JkaW5hdGUgKDAsIDApIGlzIGF0IHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgY2FudmFzXG5cdCAqIEBwYXJhbSBwaXhlbFxuXHQgKi9cblx0Z2V0VmFsdWVGb3JQaXhlbDogaGVscGVycy5ub29wLFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgdGljayBhdCB0aGUgZ2l2ZW4gaW5kZXhcblx0ICogVGhlIGNvb3JkaW5hdGUgKDAsIDApIGlzIGF0IHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgY2FudmFzXG5cdCAqL1xuXHRnZXRQaXhlbEZvclRpY2s6IGZ1bmN0aW9uKGluZGV4KSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgb2Zmc2V0ID0gbWUub3B0aW9ucy5vZmZzZXQ7XG5cdFx0aWYgKG1lLmlzSG9yaXpvbnRhbCgpKSB7XG5cdFx0XHR2YXIgaW5uZXJXaWR0aCA9IG1lLndpZHRoIC0gKG1lLnBhZGRpbmdMZWZ0ICsgbWUucGFkZGluZ1JpZ2h0KTtcblx0XHRcdHZhciB0aWNrV2lkdGggPSBpbm5lcldpZHRoIC8gTWF0aC5tYXgoKG1lLl90aWNrcy5sZW5ndGggLSAob2Zmc2V0ID8gMCA6IDEpKSwgMSk7XG5cdFx0XHR2YXIgcGl4ZWwgPSAodGlja1dpZHRoICogaW5kZXgpICsgbWUucGFkZGluZ0xlZnQ7XG5cblx0XHRcdGlmIChvZmZzZXQpIHtcblx0XHRcdFx0cGl4ZWwgKz0gdGlja1dpZHRoIC8gMjtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGZpbmFsVmFsID0gbWUubGVmdCArIE1hdGgucm91bmQocGl4ZWwpO1xuXHRcdFx0ZmluYWxWYWwgKz0gbWUuaXNGdWxsV2lkdGgoKSA/IG1lLm1hcmdpbnMubGVmdCA6IDA7XG5cdFx0XHRyZXR1cm4gZmluYWxWYWw7XG5cdFx0fVxuXHRcdHZhciBpbm5lckhlaWdodCA9IG1lLmhlaWdodCAtIChtZS5wYWRkaW5nVG9wICsgbWUucGFkZGluZ0JvdHRvbSk7XG5cdFx0cmV0dXJuIG1lLnRvcCArIChpbmRleCAqIChpbm5lckhlaWdodCAvIChtZS5fdGlja3MubGVuZ3RoIC0gMSkpKTtcblx0fSxcblxuXHQvKipcblx0ICogVXRpbGl0eSBmb3IgZ2V0dGluZyB0aGUgcGl4ZWwgbG9jYXRpb24gb2YgYSBwZXJjZW50YWdlIG9mIHNjYWxlXG5cdCAqIFRoZSBjb29yZGluYXRlICgwLCAwKSBpcyBhdCB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIGNhbnZhc1xuXHQgKi9cblx0Z2V0UGl4ZWxGb3JEZWNpbWFsOiBmdW5jdGlvbihkZWNpbWFsKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHRpZiAobWUuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdHZhciBpbm5lcldpZHRoID0gbWUud2lkdGggLSAobWUucGFkZGluZ0xlZnQgKyBtZS5wYWRkaW5nUmlnaHQpO1xuXHRcdFx0dmFyIHZhbHVlT2Zmc2V0ID0gKGlubmVyV2lkdGggKiBkZWNpbWFsKSArIG1lLnBhZGRpbmdMZWZ0O1xuXG5cdFx0XHR2YXIgZmluYWxWYWwgPSBtZS5sZWZ0ICsgTWF0aC5yb3VuZCh2YWx1ZU9mZnNldCk7XG5cdFx0XHRmaW5hbFZhbCArPSBtZS5pc0Z1bGxXaWR0aCgpID8gbWUubWFyZ2lucy5sZWZ0IDogMDtcblx0XHRcdHJldHVybiBmaW5hbFZhbDtcblx0XHR9XG5cdFx0cmV0dXJuIG1lLnRvcCArIChkZWNpbWFsICogbWUuaGVpZ2h0KTtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcGl4ZWwgZm9yIHRoZSBtaW5pbXVtIGNoYXJ0IHZhbHVlXG5cdCAqIFRoZSBjb29yZGluYXRlICgwLCAwKSBpcyBhdCB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIGNhbnZhc1xuXHQgKi9cblx0Z2V0QmFzZVBpeGVsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRQaXhlbEZvclZhbHVlKHRoaXMuZ2V0QmFzZVZhbHVlKCkpO1xuXHR9LFxuXG5cdGdldEJhc2VWYWx1ZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgbWluID0gbWUubWluO1xuXHRcdHZhciBtYXggPSBtZS5tYXg7XG5cblx0XHRyZXR1cm4gbWUuYmVnaW5BdFplcm8gPyAwIDpcblx0XHRcdG1pbiA8IDAgJiYgbWF4IDwgMCA/IG1heCA6XG5cdFx0XHRtaW4gPiAwICYmIG1heCA+IDAgPyBtaW4gOlxuXHRcdFx0MDtcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyBhIHN1YnNldCBvZiB0aWNrcyB0byBiZSBwbG90dGVkIHRvIGF2b2lkIG92ZXJsYXBwaW5nIGxhYmVscy5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9hdXRvU2tpcDogZnVuY3Rpb24odGlja3MpIHtcblx0XHR2YXIgc2tpcFJhdGlvO1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIGlzSG9yaXpvbnRhbCA9IG1lLmlzSG9yaXpvbnRhbCgpO1xuXHRcdHZhciBvcHRpb25UaWNrcyA9IG1lLm9wdGlvbnMudGlja3MubWlub3I7XG5cdFx0dmFyIHRpY2tDb3VudCA9IHRpY2tzLmxlbmd0aDtcblx0XHR2YXIgbGFiZWxSb3RhdGlvblJhZGlhbnMgPSBoZWxwZXJzLnRvUmFkaWFucyhtZS5sYWJlbFJvdGF0aW9uKTtcblx0XHR2YXIgY29zUm90YXRpb24gPSBNYXRoLmNvcyhsYWJlbFJvdGF0aW9uUmFkaWFucyk7XG5cdFx0dmFyIGxvbmdlc3RSb3RhdGVkTGFiZWwgPSBtZS5sb25nZXN0TGFiZWxXaWR0aCAqIGNvc1JvdGF0aW9uO1xuXHRcdHZhciByZXN1bHQgPSBbXTtcblx0XHR2YXIgaSwgdGljaywgc2hvdWxkU2tpcDtcblxuXHRcdC8vIGZpZ3VyZSBvdXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGdyaWRsaW5lcyB0byBzaG93XG5cdFx0dmFyIG1heFRpY2tzO1xuXHRcdGlmIChvcHRpb25UaWNrcy5tYXhUaWNrc0xpbWl0KSB7XG5cdFx0XHRtYXhUaWNrcyA9IG9wdGlvblRpY2tzLm1heFRpY2tzTGltaXQ7XG5cdFx0fVxuXG5cdFx0aWYgKGlzSG9yaXpvbnRhbCkge1xuXHRcdFx0c2tpcFJhdGlvID0gZmFsc2U7XG5cblx0XHRcdGlmICgobG9uZ2VzdFJvdGF0ZWRMYWJlbCArIG9wdGlvblRpY2tzLmF1dG9Ta2lwUGFkZGluZykgKiB0aWNrQ291bnQgPiAobWUud2lkdGggLSAobWUucGFkZGluZ0xlZnQgKyBtZS5wYWRkaW5nUmlnaHQpKSkge1xuXHRcdFx0XHRza2lwUmF0aW8gPSAxICsgTWF0aC5mbG9vcigoKGxvbmdlc3RSb3RhdGVkTGFiZWwgKyBvcHRpb25UaWNrcy5hdXRvU2tpcFBhZGRpbmcpICogdGlja0NvdW50KSAvIChtZS53aWR0aCAtIChtZS5wYWRkaW5nTGVmdCArIG1lLnBhZGRpbmdSaWdodCkpKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gaWYgdGhleSBkZWZpbmVkIGEgbWF4IG51bWJlciBvZiBvcHRpb25UaWNrcyxcblx0XHRcdC8vIGluY3JlYXNlIHNraXBSYXRpbyB1bnRpbCB0aGF0IG51bWJlciBpcyBtZXRcblx0XHRcdGlmIChtYXhUaWNrcyAmJiB0aWNrQ291bnQgPiBtYXhUaWNrcykge1xuXHRcdFx0XHRza2lwUmF0aW8gPSBNYXRoLm1heChza2lwUmF0aW8sIE1hdGguZmxvb3IodGlja0NvdW50IC8gbWF4VGlja3MpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgdGlja0NvdW50OyBpKyspIHtcblx0XHRcdHRpY2sgPSB0aWNrc1tpXTtcblxuXHRcdFx0Ly8gU2luY2Ugd2UgYWx3YXlzIHNob3cgdGhlIGxhc3QgdGljayx3ZSBuZWVkIG1heSBuZWVkIHRvIGhpZGUgdGhlIGxhc3Qgc2hvd24gb25lIGJlZm9yZVxuXHRcdFx0c2hvdWxkU2tpcCA9IChza2lwUmF0aW8gPiAxICYmIGkgJSBza2lwUmF0aW8gPiAwKSB8fCAoaSAlIHNraXBSYXRpbyA9PT0gMCAmJiBpICsgc2tpcFJhdGlvID49IHRpY2tDb3VudCk7XG5cdFx0XHRpZiAoc2hvdWxkU2tpcCAmJiBpICE9PSB0aWNrQ291bnQgLSAxKSB7XG5cdFx0XHRcdC8vIGxlYXZlIHRpY2sgaW4gcGxhY2UgYnV0IG1ha2Ugc3VyZSBpdCdzIG5vdCBkaXNwbGF5ZWQgKCM0NjM1KVxuXHRcdFx0XHRkZWxldGUgdGljay5sYWJlbDtcblx0XHRcdH1cblx0XHRcdHJlc3VsdC5wdXNoKHRpY2spO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LFxuXG5cdC8vIEFjdHVhbGx5IGRyYXcgdGhlIHNjYWxlIG9uIHRoZSBjYW52YXNcblx0Ly8gQHBhcmFtIHtyZWN0YW5nbGV9IGNoYXJ0QXJlYSA6IHRoZSBhcmVhIG9mIHRoZSBjaGFydCB0byBkcmF3IGZ1bGwgZ3JpZCBsaW5lcyBvblxuXHRkcmF3OiBmdW5jdGlvbihjaGFydEFyZWEpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBvcHRpb25zID0gbWUub3B0aW9ucztcblx0XHRpZiAoIW9wdGlvbnMuZGlzcGxheSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBjb250ZXh0ID0gbWUuY3R4O1xuXHRcdHZhciBnbG9iYWxEZWZhdWx0cyA9IGRlZmF1bHRzLmdsb2JhbDtcblx0XHR2YXIgb3B0aW9uVGlja3MgPSBvcHRpb25zLnRpY2tzLm1pbm9yO1xuXHRcdHZhciBvcHRpb25NYWpvclRpY2tzID0gb3B0aW9ucy50aWNrcy5tYWpvciB8fCBvcHRpb25UaWNrcztcblx0XHR2YXIgZ3JpZExpbmVzID0gb3B0aW9ucy5ncmlkTGluZXM7XG5cdFx0dmFyIHNjYWxlTGFiZWwgPSBvcHRpb25zLnNjYWxlTGFiZWw7XG5cblx0XHR2YXIgaXNSb3RhdGVkID0gbWUubGFiZWxSb3RhdGlvbiAhPT0gMDtcblx0XHR2YXIgaXNIb3Jpem9udGFsID0gbWUuaXNIb3Jpem9udGFsKCk7XG5cblx0XHR2YXIgdGlja3MgPSBvcHRpb25UaWNrcy5hdXRvU2tpcCA/IG1lLl9hdXRvU2tpcChtZS5nZXRUaWNrcygpKSA6IG1lLmdldFRpY2tzKCk7XG5cdFx0dmFyIHRpY2tGb250Q29sb3IgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KG9wdGlvblRpY2tzLmZvbnRDb2xvciwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRDb2xvcik7XG5cdFx0dmFyIHRpY2tGb250ID0gcGFyc2VGb250T3B0aW9ucyhvcHRpb25UaWNrcyk7XG5cdFx0dmFyIG1ham9yVGlja0ZvbnRDb2xvciA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQob3B0aW9uTWFqb3JUaWNrcy5mb250Q29sb3IsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250Q29sb3IpO1xuXHRcdHZhciBtYWpvclRpY2tGb250ID0gcGFyc2VGb250T3B0aW9ucyhvcHRpb25NYWpvclRpY2tzKTtcblxuXHRcdHZhciB0bCA9IGdyaWRMaW5lcy5kcmF3VGlja3MgPyBncmlkTGluZXMudGlja01hcmtMZW5ndGggOiAwO1xuXG5cdFx0dmFyIHNjYWxlTGFiZWxGb250Q29sb3IgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KHNjYWxlTGFiZWwuZm9udENvbG9yLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udENvbG9yKTtcblx0XHR2YXIgc2NhbGVMYWJlbEZvbnQgPSBwYXJzZUZvbnRPcHRpb25zKHNjYWxlTGFiZWwpO1xuXHRcdHZhciBzY2FsZUxhYmVsUGFkZGluZyA9IGhlbHBlcnMub3B0aW9ucy50b1BhZGRpbmcoc2NhbGVMYWJlbC5wYWRkaW5nKTtcblx0XHR2YXIgbGFiZWxSb3RhdGlvblJhZGlhbnMgPSBoZWxwZXJzLnRvUmFkaWFucyhtZS5sYWJlbFJvdGF0aW9uKTtcblxuXHRcdHZhciBpdGVtc1RvRHJhdyA9IFtdO1xuXG5cdFx0dmFyIGF4aXNXaWR0aCA9IG1lLm9wdGlvbnMuZ3JpZExpbmVzLmxpbmVXaWR0aDtcblx0XHR2YXIgeFRpY2tTdGFydCA9IG9wdGlvbnMucG9zaXRpb24gPT09ICdyaWdodCcgPyBtZS5sZWZ0IDogbWUucmlnaHQgLSBheGlzV2lkdGggLSB0bDtcblx0XHR2YXIgeFRpY2tFbmQgPSBvcHRpb25zLnBvc2l0aW9uID09PSAncmlnaHQnID8gbWUubGVmdCArIHRsIDogbWUucmlnaHQ7XG5cdFx0dmFyIHlUaWNrU3RhcnQgPSBvcHRpb25zLnBvc2l0aW9uID09PSAnYm90dG9tJyA/IG1lLnRvcCArIGF4aXNXaWR0aCA6IG1lLmJvdHRvbSAtIHRsIC0gYXhpc1dpZHRoO1xuXHRcdHZhciB5VGlja0VuZCA9IG9wdGlvbnMucG9zaXRpb24gPT09ICdib3R0b20nID8gbWUudG9wICsgYXhpc1dpZHRoICsgdGwgOiBtZS5ib3R0b20gKyBheGlzV2lkdGg7XG5cblx0XHRoZWxwZXJzLmVhY2godGlja3MsIGZ1bmN0aW9uKHRpY2ssIGluZGV4KSB7XG5cdFx0XHQvLyBhdXRvc2tpcHBlciBza2lwcGVkIHRoaXMgdGljayAoIzQ2MzUpXG5cdFx0XHRpZiAoaGVscGVycy5pc051bGxPclVuZGVmKHRpY2subGFiZWwpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGxhYmVsID0gdGljay5sYWJlbDtcblx0XHRcdHZhciBsaW5lV2lkdGgsIGxpbmVDb2xvciwgYm9yZGVyRGFzaCwgYm9yZGVyRGFzaE9mZnNldDtcblx0XHRcdGlmIChpbmRleCA9PT0gbWUuemVyb0xpbmVJbmRleCAmJiBvcHRpb25zLm9mZnNldCA9PT0gZ3JpZExpbmVzLm9mZnNldEdyaWRMaW5lcykge1xuXHRcdFx0XHQvLyBEcmF3IHRoZSBmaXJzdCBpbmRleCBzcGVjaWFsbHlcblx0XHRcdFx0bGluZVdpZHRoID0gZ3JpZExpbmVzLnplcm9MaW5lV2lkdGg7XG5cdFx0XHRcdGxpbmVDb2xvciA9IGdyaWRMaW5lcy56ZXJvTGluZUNvbG9yO1xuXHRcdFx0XHRib3JkZXJEYXNoID0gZ3JpZExpbmVzLnplcm9MaW5lQm9yZGVyRGFzaDtcblx0XHRcdFx0Ym9yZGVyRGFzaE9mZnNldCA9IGdyaWRMaW5lcy56ZXJvTGluZUJvcmRlckRhc2hPZmZzZXQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRsaW5lV2lkdGggPSBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChncmlkTGluZXMubGluZVdpZHRoLCBpbmRleCk7XG5cdFx0XHRcdGxpbmVDb2xvciA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGdyaWRMaW5lcy5jb2xvciwgaW5kZXgpO1xuXHRcdFx0XHRib3JkZXJEYXNoID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdChncmlkTGluZXMuYm9yZGVyRGFzaCwgZ2xvYmFsRGVmYXVsdHMuYm9yZGVyRGFzaCk7XG5cdFx0XHRcdGJvcmRlckRhc2hPZmZzZXQgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KGdyaWRMaW5lcy5ib3JkZXJEYXNoT2Zmc2V0LCBnbG9iYWxEZWZhdWx0cy5ib3JkZXJEYXNoT2Zmc2V0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29tbW9uIHByb3BlcnRpZXNcblx0XHRcdHZhciB0eDEsIHR5MSwgdHgyLCB0eTIsIHgxLCB5MSwgeDIsIHkyLCBsYWJlbFgsIGxhYmVsWTtcblx0XHRcdHZhciB0ZXh0QWxpZ24gPSAnbWlkZGxlJztcblx0XHRcdHZhciB0ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcblx0XHRcdHZhciB0aWNrUGFkZGluZyA9IG9wdGlvblRpY2tzLnBhZGRpbmc7XG5cblx0XHRcdGlmIChpc0hvcml6b250YWwpIHtcblx0XHRcdFx0dmFyIGxhYmVsWU9mZnNldCA9IHRsICsgdGlja1BhZGRpbmc7XG5cblx0XHRcdFx0aWYgKG9wdGlvbnMucG9zaXRpb24gPT09ICdib3R0b20nKSB7XG5cdFx0XHRcdFx0Ly8gYm90dG9tXG5cdFx0XHRcdFx0dGV4dEJhc2VsaW5lID0gIWlzUm90YXRlZCA/ICd0b3AnIDogJ21pZGRsZSc7XG5cdFx0XHRcdFx0dGV4dEFsaWduID0gIWlzUm90YXRlZCA/ICdjZW50ZXInIDogJ3JpZ2h0Jztcblx0XHRcdFx0XHRsYWJlbFkgPSBtZS50b3AgKyBsYWJlbFlPZmZzZXQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdG9wXG5cdFx0XHRcdFx0dGV4dEJhc2VsaW5lID0gIWlzUm90YXRlZCA/ICdib3R0b20nIDogJ21pZGRsZSc7XG5cdFx0XHRcdFx0dGV4dEFsaWduID0gIWlzUm90YXRlZCA/ICdjZW50ZXInIDogJ2xlZnQnO1xuXHRcdFx0XHRcdGxhYmVsWSA9IG1lLmJvdHRvbSAtIGxhYmVsWU9mZnNldDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciB4TGluZVZhbHVlID0gZ2V0TGluZVZhbHVlKG1lLCBpbmRleCwgZ3JpZExpbmVzLm9mZnNldEdyaWRMaW5lcyAmJiB0aWNrcy5sZW5ndGggPiAxKTtcblx0XHRcdFx0aWYgKHhMaW5lVmFsdWUgPCBtZS5sZWZ0KSB7XG5cdFx0XHRcdFx0bGluZUNvbG9yID0gJ3JnYmEoMCwwLDAsMCknO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHhMaW5lVmFsdWUgKz0gaGVscGVycy5hbGlhc1BpeGVsKGxpbmVXaWR0aCk7XG5cblx0XHRcdFx0bGFiZWxYID0gbWUuZ2V0UGl4ZWxGb3JUaWNrKGluZGV4KSArIG9wdGlvblRpY2tzLmxhYmVsT2Zmc2V0OyAvLyB4IHZhbHVlcyBmb3Igb3B0aW9uVGlja3MgKG5lZWQgdG8gY29uc2lkZXIgb2Zmc2V0TGFiZWwgb3B0aW9uKVxuXG5cdFx0XHRcdHR4MSA9IHR4MiA9IHgxID0geDIgPSB4TGluZVZhbHVlO1xuXHRcdFx0XHR0eTEgPSB5VGlja1N0YXJ0O1xuXHRcdFx0XHR0eTIgPSB5VGlja0VuZDtcblx0XHRcdFx0eTEgPSBjaGFydEFyZWEudG9wO1xuXHRcdFx0XHR5MiA9IGNoYXJ0QXJlYS5ib3R0b20gKyBheGlzV2lkdGg7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YXIgaXNMZWZ0ID0gb3B0aW9ucy5wb3NpdGlvbiA9PT0gJ2xlZnQnO1xuXHRcdFx0XHR2YXIgbGFiZWxYT2Zmc2V0O1xuXG5cdFx0XHRcdGlmIChvcHRpb25UaWNrcy5taXJyb3IpIHtcblx0XHRcdFx0XHR0ZXh0QWxpZ24gPSBpc0xlZnQgPyAnbGVmdCcgOiAncmlnaHQnO1xuXHRcdFx0XHRcdGxhYmVsWE9mZnNldCA9IHRpY2tQYWRkaW5nO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRleHRBbGlnbiA9IGlzTGVmdCA/ICdyaWdodCcgOiAnbGVmdCc7XG5cdFx0XHRcdFx0bGFiZWxYT2Zmc2V0ID0gdGwgKyB0aWNrUGFkZGluZztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxhYmVsWCA9IGlzTGVmdCA/IG1lLnJpZ2h0IC0gbGFiZWxYT2Zmc2V0IDogbWUubGVmdCArIGxhYmVsWE9mZnNldDtcblxuXHRcdFx0XHR2YXIgeUxpbmVWYWx1ZSA9IGdldExpbmVWYWx1ZShtZSwgaW5kZXgsIGdyaWRMaW5lcy5vZmZzZXRHcmlkTGluZXMgJiYgdGlja3MubGVuZ3RoID4gMSk7XG5cdFx0XHRcdGlmICh5TGluZVZhbHVlIDwgbWUudG9wKSB7XG5cdFx0XHRcdFx0bGluZUNvbG9yID0gJ3JnYmEoMCwwLDAsMCknO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHlMaW5lVmFsdWUgKz0gaGVscGVycy5hbGlhc1BpeGVsKGxpbmVXaWR0aCk7XG5cblx0XHRcdFx0bGFiZWxZID0gbWUuZ2V0UGl4ZWxGb3JUaWNrKGluZGV4KSArIG9wdGlvblRpY2tzLmxhYmVsT2Zmc2V0O1xuXG5cdFx0XHRcdHR4MSA9IHhUaWNrU3RhcnQ7XG5cdFx0XHRcdHR4MiA9IHhUaWNrRW5kO1xuXHRcdFx0XHR4MSA9IGNoYXJ0QXJlYS5sZWZ0O1xuXHRcdFx0XHR4MiA9IGNoYXJ0QXJlYS5yaWdodCArIGF4aXNXaWR0aDtcblx0XHRcdFx0dHkxID0gdHkyID0geTEgPSB5MiA9IHlMaW5lVmFsdWU7XG5cdFx0XHR9XG5cblx0XHRcdGl0ZW1zVG9EcmF3LnB1c2goe1xuXHRcdFx0XHR0eDE6IHR4MSxcblx0XHRcdFx0dHkxOiB0eTEsXG5cdFx0XHRcdHR4MjogdHgyLFxuXHRcdFx0XHR0eTI6IHR5Mixcblx0XHRcdFx0eDE6IHgxLFxuXHRcdFx0XHR5MTogeTEsXG5cdFx0XHRcdHgyOiB4Mixcblx0XHRcdFx0eTI6IHkyLFxuXHRcdFx0XHRsYWJlbFg6IGxhYmVsWCxcblx0XHRcdFx0bGFiZWxZOiBsYWJlbFksXG5cdFx0XHRcdGdsV2lkdGg6IGxpbmVXaWR0aCxcblx0XHRcdFx0Z2xDb2xvcjogbGluZUNvbG9yLFxuXHRcdFx0XHRnbEJvcmRlckRhc2g6IGJvcmRlckRhc2gsXG5cdFx0XHRcdGdsQm9yZGVyRGFzaE9mZnNldDogYm9yZGVyRGFzaE9mZnNldCxcblx0XHRcdFx0cm90YXRpb246IC0xICogbGFiZWxSb3RhdGlvblJhZGlhbnMsXG5cdFx0XHRcdGxhYmVsOiBsYWJlbCxcblx0XHRcdFx0bWFqb3I6IHRpY2subWFqb3IsXG5cdFx0XHRcdHRleHRCYXNlbGluZTogdGV4dEJhc2VsaW5lLFxuXHRcdFx0XHR0ZXh0QWxpZ246IHRleHRBbGlnblxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHQvLyBEcmF3IGFsbCBvZiB0aGUgdGljayBsYWJlbHMsIHRpY2sgbWFya3MsIGFuZCBncmlkIGxpbmVzIGF0IHRoZSBjb3JyZWN0IHBsYWNlc1xuXHRcdGhlbHBlcnMuZWFjaChpdGVtc1RvRHJhdywgZnVuY3Rpb24oaXRlbVRvRHJhdykge1xuXHRcdFx0aWYgKGdyaWRMaW5lcy5kaXNwbGF5KSB7XG5cdFx0XHRcdGNvbnRleHQuc2F2ZSgpO1xuXHRcdFx0XHRjb250ZXh0LmxpbmVXaWR0aCA9IGl0ZW1Ub0RyYXcuZ2xXaWR0aDtcblx0XHRcdFx0Y29udGV4dC5zdHJva2VTdHlsZSA9IGl0ZW1Ub0RyYXcuZ2xDb2xvcjtcblx0XHRcdFx0aWYgKGNvbnRleHQuc2V0TGluZURhc2gpIHtcblx0XHRcdFx0XHRjb250ZXh0LnNldExpbmVEYXNoKGl0ZW1Ub0RyYXcuZ2xCb3JkZXJEYXNoKTtcblx0XHRcdFx0XHRjb250ZXh0LmxpbmVEYXNoT2Zmc2V0ID0gaXRlbVRvRHJhdy5nbEJvcmRlckRhc2hPZmZzZXQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb250ZXh0LmJlZ2luUGF0aCgpO1xuXG5cdFx0XHRcdGlmIChncmlkTGluZXMuZHJhd1RpY2tzKSB7XG5cdFx0XHRcdFx0Y29udGV4dC5tb3ZlVG8oaXRlbVRvRHJhdy50eDEsIGl0ZW1Ub0RyYXcudHkxKTtcblx0XHRcdFx0XHRjb250ZXh0LmxpbmVUbyhpdGVtVG9EcmF3LnR4MiwgaXRlbVRvRHJhdy50eTIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGdyaWRMaW5lcy5kcmF3T25DaGFydEFyZWEpIHtcblx0XHRcdFx0XHRjb250ZXh0Lm1vdmVUbyhpdGVtVG9EcmF3LngxLCBpdGVtVG9EcmF3LnkxKTtcblx0XHRcdFx0XHRjb250ZXh0LmxpbmVUbyhpdGVtVG9EcmF3LngyLCBpdGVtVG9EcmF3LnkyKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnRleHQuc3Ryb2tlKCk7XG5cdFx0XHRcdGNvbnRleHQucmVzdG9yZSgpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob3B0aW9uVGlja3MuZGlzcGxheSkge1xuXHRcdFx0XHQvLyBNYWtlIHN1cmUgd2UgZHJhdyB0ZXh0IGluIHRoZSBjb3JyZWN0IGNvbG9yIGFuZCBmb250XG5cdFx0XHRcdGNvbnRleHQuc2F2ZSgpO1xuXHRcdFx0XHRjb250ZXh0LnRyYW5zbGF0ZShpdGVtVG9EcmF3LmxhYmVsWCwgaXRlbVRvRHJhdy5sYWJlbFkpO1xuXHRcdFx0XHRjb250ZXh0LnJvdGF0ZShpdGVtVG9EcmF3LnJvdGF0aW9uKTtcblx0XHRcdFx0Y29udGV4dC5mb250ID0gaXRlbVRvRHJhdy5tYWpvciA/IG1ham9yVGlja0ZvbnQuZm9udCA6IHRpY2tGb250LmZvbnQ7XG5cdFx0XHRcdGNvbnRleHQuZmlsbFN0eWxlID0gaXRlbVRvRHJhdy5tYWpvciA/IG1ham9yVGlja0ZvbnRDb2xvciA6IHRpY2tGb250Q29sb3I7XG5cdFx0XHRcdGNvbnRleHQudGV4dEJhc2VsaW5lID0gaXRlbVRvRHJhdy50ZXh0QmFzZWxpbmU7XG5cdFx0XHRcdGNvbnRleHQudGV4dEFsaWduID0gaXRlbVRvRHJhdy50ZXh0QWxpZ247XG5cblx0XHRcdFx0dmFyIGxhYmVsID0gaXRlbVRvRHJhdy5sYWJlbDtcblx0XHRcdFx0aWYgKGhlbHBlcnMuaXNBcnJheShsYWJlbCkpIHtcblx0XHRcdFx0XHR2YXIgbGluZUNvdW50ID0gbGFiZWwubGVuZ3RoO1xuXHRcdFx0XHRcdHZhciBsaW5lSGVpZ2h0ID0gdGlja0ZvbnQuc2l6ZSAqIDEuNTtcblx0XHRcdFx0XHR2YXIgeSA9IG1lLmlzSG9yaXpvbnRhbCgpID8gMCA6IC1saW5lSGVpZ2h0ICogKGxpbmVDb3VudCAtIDEpIC8gMjtcblxuXHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbGluZUNvdW50OyArK2kpIHtcblx0XHRcdFx0XHRcdC8vIFdlIGp1c3QgbWFrZSBzdXJlIHRoZSBtdWx0aWxpbmUgZWxlbWVudCBpcyBhIHN0cmluZyBoZXJlLi5cblx0XHRcdFx0XHRcdGNvbnRleHQuZmlsbFRleHQoJycgKyBsYWJlbFtpXSwgMCwgeSk7XG5cdFx0XHRcdFx0XHQvLyBhcHBseSBzYW1lIGxpbmVTcGFjaW5nIGFzIGNhbGN1bGF0ZWQgQCBMIzMyMFxuXHRcdFx0XHRcdFx0eSArPSBsaW5lSGVpZ2h0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb250ZXh0LmZpbGxUZXh0KGxhYmVsLCAwLCAwKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250ZXh0LnJlc3RvcmUoKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGlmIChzY2FsZUxhYmVsLmRpc3BsYXkpIHtcblx0XHRcdC8vIERyYXcgdGhlIHNjYWxlIGxhYmVsXG5cdFx0XHR2YXIgc2NhbGVMYWJlbFg7XG5cdFx0XHR2YXIgc2NhbGVMYWJlbFk7XG5cdFx0XHR2YXIgcm90YXRpb24gPSAwO1xuXHRcdFx0dmFyIGhhbGZMaW5lSGVpZ2h0ID0gcGFyc2VMaW5lSGVpZ2h0KHNjYWxlTGFiZWwpIC8gMjtcblxuXHRcdFx0aWYgKGlzSG9yaXpvbnRhbCkge1xuXHRcdFx0XHRzY2FsZUxhYmVsWCA9IG1lLmxlZnQgKyAoKG1lLnJpZ2h0IC0gbWUubGVmdCkgLyAyKTsgLy8gbWlkcG9pbnQgb2YgdGhlIHdpZHRoXG5cdFx0XHRcdHNjYWxlTGFiZWxZID0gb3B0aW9ucy5wb3NpdGlvbiA9PT0gJ2JvdHRvbSdcblx0XHRcdFx0XHQ/IG1lLmJvdHRvbSAtIGhhbGZMaW5lSGVpZ2h0IC0gc2NhbGVMYWJlbFBhZGRpbmcuYm90dG9tXG5cdFx0XHRcdFx0OiBtZS50b3AgKyBoYWxmTGluZUhlaWdodCArIHNjYWxlTGFiZWxQYWRkaW5nLnRvcDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciBpc0xlZnQgPSBvcHRpb25zLnBvc2l0aW9uID09PSAnbGVmdCc7XG5cdFx0XHRcdHNjYWxlTGFiZWxYID0gaXNMZWZ0XG5cdFx0XHRcdFx0PyBtZS5sZWZ0ICsgaGFsZkxpbmVIZWlnaHQgKyBzY2FsZUxhYmVsUGFkZGluZy50b3Bcblx0XHRcdFx0XHQ6IG1lLnJpZ2h0IC0gaGFsZkxpbmVIZWlnaHQgLSBzY2FsZUxhYmVsUGFkZGluZy50b3A7XG5cdFx0XHRcdHNjYWxlTGFiZWxZID0gbWUudG9wICsgKChtZS5ib3R0b20gLSBtZS50b3ApIC8gMik7XG5cdFx0XHRcdHJvdGF0aW9uID0gaXNMZWZ0ID8gLTAuNSAqIE1hdGguUEkgOiAwLjUgKiBNYXRoLlBJO1xuXHRcdFx0fVxuXG5cdFx0XHRjb250ZXh0LnNhdmUoKTtcblx0XHRcdGNvbnRleHQudHJhbnNsYXRlKHNjYWxlTGFiZWxYLCBzY2FsZUxhYmVsWSk7XG5cdFx0XHRjb250ZXh0LnJvdGF0ZShyb3RhdGlvbik7XG5cdFx0XHRjb250ZXh0LnRleHRBbGlnbiA9ICdjZW50ZXInO1xuXHRcdFx0Y29udGV4dC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcblx0XHRcdGNvbnRleHQuZmlsbFN0eWxlID0gc2NhbGVMYWJlbEZvbnRDb2xvcjsgLy8gcmVuZGVyIGluIGNvcnJlY3QgY29sb3VyXG5cdFx0XHRjb250ZXh0LmZvbnQgPSBzY2FsZUxhYmVsRm9udC5mb250O1xuXHRcdFx0Y29udGV4dC5maWxsVGV4dChzY2FsZUxhYmVsLmxhYmVsU3RyaW5nLCAwLCAwKTtcblx0XHRcdGNvbnRleHQucmVzdG9yZSgpO1xuXHRcdH1cblxuXHRcdGlmIChncmlkTGluZXMuZHJhd0JvcmRlcikge1xuXHRcdFx0Ly8gRHJhdyB0aGUgbGluZSBhdCB0aGUgZWRnZSBvZiB0aGUgYXhpc1xuXHRcdFx0Y29udGV4dC5saW5lV2lkdGggPSBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChncmlkTGluZXMubGluZVdpZHRoLCAwKTtcblx0XHRcdGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChncmlkTGluZXMuY29sb3IsIDApO1xuXHRcdFx0dmFyIHgxID0gbWUubGVmdDtcblx0XHRcdHZhciB4MiA9IG1lLnJpZ2h0ICsgYXhpc1dpZHRoO1xuXHRcdFx0dmFyIHkxID0gbWUudG9wO1xuXHRcdFx0dmFyIHkyID0gbWUuYm90dG9tICsgYXhpc1dpZHRoO1xuXG5cdFx0XHR2YXIgYWxpYXNQaXhlbCA9IGhlbHBlcnMuYWxpYXNQaXhlbChjb250ZXh0LmxpbmVXaWR0aCk7XG5cdFx0XHRpZiAoaXNIb3Jpem9udGFsKSB7XG5cdFx0XHRcdHkxID0geTIgPSBvcHRpb25zLnBvc2l0aW9uID09PSAndG9wJyA/IG1lLmJvdHRvbSA6IG1lLnRvcDtcblx0XHRcdFx0eTEgKz0gYWxpYXNQaXhlbDtcblx0XHRcdFx0eTIgKz0gYWxpYXNQaXhlbDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHgxID0geDIgPSBvcHRpb25zLnBvc2l0aW9uID09PSAnbGVmdCcgPyBtZS5yaWdodCA6IG1lLmxlZnQ7XG5cdFx0XHRcdHgxICs9IGFsaWFzUGl4ZWw7XG5cdFx0XHRcdHgyICs9IGFsaWFzUGl4ZWw7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnRleHQuYmVnaW5QYXRoKCk7XG5cdFx0XHRjb250ZXh0Lm1vdmVUbyh4MSwgeTEpO1xuXHRcdFx0Y29udGV4dC5saW5lVG8oeDIsIHkyKTtcblx0XHRcdGNvbnRleHQuc3Ryb2tlKCk7XG5cdFx0fVxuXHR9XG59KTtcblxufSx7XCIyNlwiOjI2LFwiMjdcIjoyNyxcIjM1XCI6MzUsXCI0NlwiOjQ2fV0sMzQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XG52YXIgbGF5b3V0cyA9IHJlcXVpcmUoMzEpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0Ly8gU2NhbGUgcmVnaXN0cmF0aW9uIG9iamVjdC4gRXh0ZW5zaW9ucyBjYW4gcmVnaXN0ZXIgbmV3IHNjYWxlIHR5cGVzIChzdWNoIGFzIGxvZyBvciBEQiBzY2FsZXMpIGFuZCB0aGVuXG5cdC8vIHVzZSB0aGUgbmV3IGNoYXJ0IG9wdGlvbnMgdG8gZ3JhYiB0aGUgY29ycmVjdCBzY2FsZVxuXHRjb25zdHJ1Y3RvcnM6IHt9LFxuXHQvLyBVc2UgYSByZWdpc3RyYXRpb24gZnVuY3Rpb24gc28gdGhhdCB3ZSBjYW4gbW92ZSB0byBhbiBFUzYgbWFwIHdoZW4gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gc3VwcG9ydFxuXHQvLyBvbGQgYnJvd3NlcnNcblxuXHQvLyBTY2FsZSBjb25maWcgZGVmYXVsdHNcblx0ZGVmYXVsdHM6IHt9LFxuXHRyZWdpc3RlclNjYWxlVHlwZTogZnVuY3Rpb24odHlwZSwgc2NhbGVDb25zdHJ1Y3Rvciwgc2NhbGVEZWZhdWx0cykge1xuXHRcdHRoaXMuY29uc3RydWN0b3JzW3R5cGVdID0gc2NhbGVDb25zdHJ1Y3Rvcjtcblx0XHR0aGlzLmRlZmF1bHRzW3R5cGVdID0gaGVscGVycy5jbG9uZShzY2FsZURlZmF1bHRzKTtcblx0fSxcblx0Z2V0U2NhbGVDb25zdHJ1Y3RvcjogZnVuY3Rpb24odHlwZSkge1xuXHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9ycy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSA/IHRoaXMuY29uc3RydWN0b3JzW3R5cGVdIDogdW5kZWZpbmVkO1xuXHR9LFxuXHRnZXRTY2FsZURlZmF1bHRzOiBmdW5jdGlvbih0eXBlKSB7XG5cdFx0Ly8gUmV0dXJuIHRoZSBzY2FsZSBkZWZhdWx0cyBtZXJnZWQgd2l0aCB0aGUgZ2xvYmFsIHNldHRpbmdzIHNvIHRoYXQgd2UgYWx3YXlzIHVzZSB0aGUgbGF0ZXN0IG9uZXNcblx0XHRyZXR1cm4gdGhpcy5kZWZhdWx0cy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSA/IGhlbHBlcnMubWVyZ2Uoe30sIFtkZWZhdWx0cy5zY2FsZSwgdGhpcy5kZWZhdWx0c1t0eXBlXV0pIDoge307XG5cdH0sXG5cdHVwZGF0ZVNjYWxlRGVmYXVsdHM6IGZ1bmN0aW9uKHR5cGUsIGFkZGl0aW9ucykge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0aWYgKG1lLmRlZmF1bHRzLmhhc093blByb3BlcnR5KHR5cGUpKSB7XG5cdFx0XHRtZS5kZWZhdWx0c1t0eXBlXSA9IGhlbHBlcnMuZXh0ZW5kKG1lLmRlZmF1bHRzW3R5cGVdLCBhZGRpdGlvbnMpO1xuXHRcdH1cblx0fSxcblx0YWRkU2NhbGVzVG9MYXlvdXQ6IGZ1bmN0aW9uKGNoYXJ0KSB7XG5cdFx0Ly8gQWRkcyBlYWNoIHNjYWxlIHRvIHRoZSBjaGFydC5ib3hlcyBhcnJheSB0byBiZSBzaXplZCBhY2NvcmRpbmdseVxuXHRcdGhlbHBlcnMuZWFjaChjaGFydC5zY2FsZXMsIGZ1bmN0aW9uKHNjYWxlKSB7XG5cdFx0XHQvLyBTZXQgSUxheW91dEl0ZW0gcGFyYW1ldGVycyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblx0XHRcdHNjYWxlLmZ1bGxXaWR0aCA9IHNjYWxlLm9wdGlvbnMuZnVsbFdpZHRoO1xuXHRcdFx0c2NhbGUucG9zaXRpb24gPSBzY2FsZS5vcHRpb25zLnBvc2l0aW9uO1xuXHRcdFx0c2NhbGUud2VpZ2h0ID0gc2NhbGUub3B0aW9ucy53ZWlnaHQ7XG5cdFx0XHRsYXlvdXRzLmFkZEJveChjaGFydCwgc2NhbGUpO1xuXHRcdH0pO1xuXHR9XG59O1xuXG59LHtcIjI2XCI6MjYsXCIzMVwiOjMxLFwiNDZcIjo0Nn1dLDM1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcblxuLyoqXG4gKiBOYW1lc3BhY2UgdG8gaG9sZCBzdGF0aWMgdGljayBnZW5lcmF0aW9uIGZ1bmN0aW9uc1xuICogQG5hbWVzcGFjZSBDaGFydC5UaWNrc1xuICovXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0LyoqXG5cdCAqIE5hbWVzcGFjZSB0byBob2xkIGZvcm1hdHRlcnMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiB0aWNrc1xuXHQgKiBAbmFtZXNwYWNlIENoYXJ0LlRpY2tzLmZvcm1hdHRlcnNcblx0ICovXG5cdGZvcm1hdHRlcnM6IHtcblx0XHQvKipcblx0XHQgKiBGb3JtYXR0ZXIgZm9yIHZhbHVlIGxhYmVsc1xuXHRcdCAqIEBtZXRob2QgQ2hhcnQuVGlja3MuZm9ybWF0dGVycy52YWx1ZXNcblx0XHQgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGRpc3BsYXlcblx0XHQgKiBAcmV0dXJuIHtTdHJpbmd8QXJyYXl9IHRoZSBsYWJlbCB0byBkaXNwbGF5XG5cdFx0ICovXG5cdFx0dmFsdWVzOiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0cmV0dXJuIGhlbHBlcnMuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6ICcnICsgdmFsdWU7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEZvcm1hdHRlciBmb3IgbGluZWFyIG51bWVyaWMgdGlja3Ncblx0XHQgKiBAbWV0aG9kIENoYXJ0LlRpY2tzLmZvcm1hdHRlcnMubGluZWFyXG5cdFx0ICogQHBhcmFtIHRpY2tWYWx1ZSB7TnVtYmVyfSB0aGUgdmFsdWUgdG8gYmUgZm9ybWF0dGVkXG5cdFx0ICogQHBhcmFtIGluZGV4IHtOdW1iZXJ9IHRoZSBwb3NpdGlvbiBvZiB0aGUgdGlja1ZhbHVlIHBhcmFtZXRlciBpbiB0aGUgdGlja3MgYXJyYXlcblx0XHQgKiBAcGFyYW0gdGlja3Mge0FycmF5PE51bWJlcj59IHRoZSBsaXN0IG9mIHRpY2tzIGJlaW5nIGNvbnZlcnRlZFxuXHRcdCAqIEByZXR1cm4ge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0aWNrVmFsdWUgcGFyYW1ldGVyXG5cdFx0ICovXG5cdFx0bGluZWFyOiBmdW5jdGlvbih0aWNrVmFsdWUsIGluZGV4LCB0aWNrcykge1xuXHRcdFx0Ly8gSWYgd2UgaGF2ZSBsb3RzIG9mIHRpY2tzLCBkb24ndCB1c2UgdGhlIG9uZXNcblx0XHRcdHZhciBkZWx0YSA9IHRpY2tzLmxlbmd0aCA+IDMgPyB0aWNrc1syXSAtIHRpY2tzWzFdIDogdGlja3NbMV0gLSB0aWNrc1swXTtcblxuXHRcdFx0Ly8gSWYgd2UgaGF2ZSBhIG51bWJlciBsaWtlIDIuNSBhcyB0aGUgZGVsdGEsIGZpZ3VyZSBvdXQgaG93IG1hbnkgZGVjaW1hbCBwbGFjZXMgd2UgbmVlZFxuXHRcdFx0aWYgKE1hdGguYWJzKGRlbHRhKSA+IDEpIHtcblx0XHRcdFx0aWYgKHRpY2tWYWx1ZSAhPT0gTWF0aC5mbG9vcih0aWNrVmFsdWUpKSB7XG5cdFx0XHRcdFx0Ly8gbm90IGFuIGludGVnZXJcblx0XHRcdFx0XHRkZWx0YSA9IHRpY2tWYWx1ZSAtIE1hdGguZmxvb3IodGlja1ZhbHVlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbG9nRGVsdGEgPSBoZWxwZXJzLmxvZzEwKE1hdGguYWJzKGRlbHRhKSk7XG5cdFx0XHR2YXIgdGlja1N0cmluZyA9ICcnO1xuXG5cdFx0XHRpZiAodGlja1ZhbHVlICE9PSAwKSB7XG5cdFx0XHRcdHZhciBtYXhUaWNrID0gTWF0aC5tYXgoTWF0aC5hYnModGlja3NbMF0pLCBNYXRoLmFicyh0aWNrc1t0aWNrcy5sZW5ndGggLSAxXSkpO1xuXHRcdFx0XHRpZiAobWF4VGljayA8IDFlLTQpIHsgLy8gYWxsIHRpY2tzIGFyZSBzbWFsbCBudW1iZXJzOyB1c2Ugc2NpZW50aWZpYyBub3RhdGlvblxuXHRcdFx0XHRcdHZhciBsb2dUaWNrID0gaGVscGVycy5sb2cxMChNYXRoLmFicyh0aWNrVmFsdWUpKTtcblx0XHRcdFx0XHR0aWNrU3RyaW5nID0gdGlja1ZhbHVlLnRvRXhwb25lbnRpYWwoTWF0aC5mbG9vcihsb2dUaWNrKSAtIE1hdGguZmxvb3IobG9nRGVsdGEpKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2YXIgbnVtRGVjaW1hbCA9IC0xICogTWF0aC5mbG9vcihsb2dEZWx0YSk7XG5cdFx0XHRcdFx0bnVtRGVjaW1hbCA9IE1hdGgubWF4KE1hdGgubWluKG51bURlY2ltYWwsIDIwKSwgMCk7IC8vIHRvRml4ZWQgaGFzIGEgbWF4IG9mIDIwIGRlY2ltYWwgcGxhY2VzXG5cdFx0XHRcdFx0dGlja1N0cmluZyA9IHRpY2tWYWx1ZS50b0ZpeGVkKG51bURlY2ltYWwpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aWNrU3RyaW5nID0gJzAnOyAvLyBuZXZlciBzaG93IGRlY2ltYWwgcGxhY2VzIGZvciAwXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aWNrU3RyaW5nO1xuXHRcdH0sXG5cblx0XHRsb2dhcml0aG1pYzogZnVuY3Rpb24odGlja1ZhbHVlLCBpbmRleCwgdGlja3MpIHtcblx0XHRcdHZhciByZW1haW4gPSB0aWNrVmFsdWUgLyAoTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoaGVscGVycy5sb2cxMCh0aWNrVmFsdWUpKSkpO1xuXG5cdFx0XHRpZiAodGlja1ZhbHVlID09PSAwKSB7XG5cdFx0XHRcdHJldHVybiAnMCc7XG5cdFx0XHR9IGVsc2UgaWYgKHJlbWFpbiA9PT0gMSB8fCByZW1haW4gPT09IDIgfHwgcmVtYWluID09PSA1IHx8IGluZGV4ID09PSAwIHx8IGluZGV4ID09PSB0aWNrcy5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdHJldHVybiB0aWNrVmFsdWUudG9FeHBvbmVudGlhbCgpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuICcnO1xuXHRcdH1cblx0fVxufTtcblxufSx7XCI0NlwiOjQ2fV0sMzY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcbnZhciBFbGVtZW50ID0gcmVxdWlyZSgyNyk7XG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xuXG5kZWZhdWx0cy5fc2V0KCdnbG9iYWwnLCB7XG5cdHRvb2x0aXBzOiB7XG5cdFx0ZW5hYmxlZDogdHJ1ZSxcblx0XHRjdXN0b206IG51bGwsXG5cdFx0bW9kZTogJ25lYXJlc3QnLFxuXHRcdHBvc2l0aW9uOiAnYXZlcmFnZScsXG5cdFx0aW50ZXJzZWN0OiB0cnVlLFxuXHRcdGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMCwwLDAsMC44KScsXG5cdFx0dGl0bGVGb250U3R5bGU6ICdib2xkJyxcblx0XHR0aXRsZVNwYWNpbmc6IDIsXG5cdFx0dGl0bGVNYXJnaW5Cb3R0b206IDYsXG5cdFx0dGl0bGVGb250Q29sb3I6ICcjZmZmJyxcblx0XHR0aXRsZUFsaWduOiAnbGVmdCcsXG5cdFx0Ym9keVNwYWNpbmc6IDIsXG5cdFx0Ym9keUZvbnRDb2xvcjogJyNmZmYnLFxuXHRcdGJvZHlBbGlnbjogJ2xlZnQnLFxuXHRcdGZvb3RlckZvbnRTdHlsZTogJ2JvbGQnLFxuXHRcdGZvb3RlclNwYWNpbmc6IDIsXG5cdFx0Zm9vdGVyTWFyZ2luVG9wOiA2LFxuXHRcdGZvb3RlckZvbnRDb2xvcjogJyNmZmYnLFxuXHRcdGZvb3RlckFsaWduOiAnbGVmdCcsXG5cdFx0eVBhZGRpbmc6IDYsXG5cdFx0eFBhZGRpbmc6IDYsXG5cdFx0Y2FyZXRQYWRkaW5nOiAyLFxuXHRcdGNhcmV0U2l6ZTogNSxcblx0XHRjb3JuZXJSYWRpdXM6IDYsXG5cdFx0bXVsdGlLZXlCYWNrZ3JvdW5kOiAnI2ZmZicsXG5cdFx0ZGlzcGxheUNvbG9yczogdHJ1ZSxcblx0XHRib3JkZXJDb2xvcjogJ3JnYmEoMCwwLDAsMCknLFxuXHRcdGJvcmRlcldpZHRoOiAwLFxuXHRcdGNhbGxiYWNrczoge1xuXHRcdFx0Ly8gQXJncyBhcmU6ICh0b29sdGlwSXRlbXMsIGRhdGEpXG5cdFx0XHRiZWZvcmVUaXRsZTogaGVscGVycy5ub29wLFxuXHRcdFx0dGl0bGU6IGZ1bmN0aW9uKHRvb2x0aXBJdGVtcywgZGF0YSkge1xuXHRcdFx0XHQvLyBQaWNrIGZpcnN0IHhMYWJlbCBmb3Igbm93XG5cdFx0XHRcdHZhciB0aXRsZSA9ICcnO1xuXHRcdFx0XHR2YXIgbGFiZWxzID0gZGF0YS5sYWJlbHM7XG5cdFx0XHRcdHZhciBsYWJlbENvdW50ID0gbGFiZWxzID8gbGFiZWxzLmxlbmd0aCA6IDA7XG5cblx0XHRcdFx0aWYgKHRvb2x0aXBJdGVtcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0dmFyIGl0ZW0gPSB0b29sdGlwSXRlbXNbMF07XG5cblx0XHRcdFx0XHRpZiAoaXRlbS54TGFiZWwpIHtcblx0XHRcdFx0XHRcdHRpdGxlID0gaXRlbS54TGFiZWw7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChsYWJlbENvdW50ID4gMCAmJiBpdGVtLmluZGV4IDwgbGFiZWxDb3VudCkge1xuXHRcdFx0XHRcdFx0dGl0bGUgPSBsYWJlbHNbaXRlbS5pbmRleF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRpdGxlO1xuXHRcdFx0fSxcblx0XHRcdGFmdGVyVGl0bGU6IGhlbHBlcnMubm9vcCxcblxuXHRcdFx0Ly8gQXJncyBhcmU6ICh0b29sdGlwSXRlbXMsIGRhdGEpXG5cdFx0XHRiZWZvcmVCb2R5OiBoZWxwZXJzLm5vb3AsXG5cblx0XHRcdC8vIEFyZ3MgYXJlOiAodG9vbHRpcEl0ZW0sIGRhdGEpXG5cdFx0XHRiZWZvcmVMYWJlbDogaGVscGVycy5ub29wLFxuXHRcdFx0bGFiZWw6IGZ1bmN0aW9uKHRvb2x0aXBJdGVtLCBkYXRhKSB7XG5cdFx0XHRcdHZhciBsYWJlbCA9IGRhdGEuZGF0YXNldHNbdG9vbHRpcEl0ZW0uZGF0YXNldEluZGV4XS5sYWJlbCB8fCAnJztcblxuXHRcdFx0XHRpZiAobGFiZWwpIHtcblx0XHRcdFx0XHRsYWJlbCArPSAnOiAnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGxhYmVsICs9IHRvb2x0aXBJdGVtLnlMYWJlbDtcblx0XHRcdFx0cmV0dXJuIGxhYmVsO1xuXHRcdFx0fSxcblx0XHRcdGxhYmVsQ29sb3I6IGZ1bmN0aW9uKHRvb2x0aXBJdGVtLCBjaGFydCkge1xuXHRcdFx0XHR2YXIgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKHRvb2x0aXBJdGVtLmRhdGFzZXRJbmRleCk7XG5cdFx0XHRcdHZhciBhY3RpdmVFbGVtZW50ID0gbWV0YS5kYXRhW3Rvb2x0aXBJdGVtLmluZGV4XTtcblx0XHRcdFx0dmFyIHZpZXcgPSBhY3RpdmVFbGVtZW50Ll92aWV3O1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGJvcmRlckNvbG9yOiB2aWV3LmJvcmRlckNvbG9yLFxuXHRcdFx0XHRcdGJhY2tncm91bmRDb2xvcjogdmlldy5iYWNrZ3JvdW5kQ29sb3Jcblx0XHRcdFx0fTtcblx0XHRcdH0sXG5cdFx0XHRsYWJlbFRleHRDb2xvcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLl9vcHRpb25zLmJvZHlGb250Q29sb3I7XG5cdFx0XHR9LFxuXHRcdFx0YWZ0ZXJMYWJlbDogaGVscGVycy5ub29wLFxuXG5cdFx0XHQvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtcywgZGF0YSlcblx0XHRcdGFmdGVyQm9keTogaGVscGVycy5ub29wLFxuXG5cdFx0XHQvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtcywgZGF0YSlcblx0XHRcdGJlZm9yZUZvb3RlcjogaGVscGVycy5ub29wLFxuXHRcdFx0Zm9vdGVyOiBoZWxwZXJzLm5vb3AsXG5cdFx0XHRhZnRlckZvb3RlcjogaGVscGVycy5ub29wXG5cdFx0fVxuXHR9XG59KTtcblxudmFyIHBvc2l0aW9uZXJzID0ge1xuXHQvKipcblx0ICogQXZlcmFnZSBtb2RlIHBsYWNlcyB0aGUgdG9vbHRpcCBhdCB0aGUgYXZlcmFnZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudHMgc2hvd25cblx0ICogQGZ1bmN0aW9uIENoYXJ0LlRvb2x0aXAucG9zaXRpb25lcnMuYXZlcmFnZVxuXHQgKiBAcGFyYW0gZWxlbWVudHMge0NoYXJ0RWxlbWVudFtdfSB0aGUgZWxlbWVudHMgYmVpbmcgZGlzcGxheWVkIGluIHRoZSB0b29sdGlwXG5cdCAqIEByZXR1cm5zIHtQb2ludH0gdG9vbHRpcCBwb3NpdGlvblxuXHQgKi9cblx0YXZlcmFnZTogZnVuY3Rpb24oZWxlbWVudHMpIHtcblx0XHRpZiAoIWVsZW1lbnRzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHZhciBpLCBsZW47XG5cdFx0dmFyIHggPSAwO1xuXHRcdHZhciB5ID0gMDtcblx0XHR2YXIgY291bnQgPSAwO1xuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcblx0XHRcdHZhciBlbCA9IGVsZW1lbnRzW2ldO1xuXHRcdFx0aWYgKGVsICYmIGVsLmhhc1ZhbHVlKCkpIHtcblx0XHRcdFx0dmFyIHBvcyA9IGVsLnRvb2x0aXBQb3NpdGlvbigpO1xuXHRcdFx0XHR4ICs9IHBvcy54O1xuXHRcdFx0XHR5ICs9IHBvcy55O1xuXHRcdFx0XHQrK2NvdW50O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHR4OiBNYXRoLnJvdW5kKHggLyBjb3VudCksXG5cdFx0XHR5OiBNYXRoLnJvdW5kKHkgLyBjb3VudClcblx0XHR9O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSB0b29sdGlwIHBvc2l0aW9uIG5lYXJlc3Qgb2YgdGhlIGl0ZW0gbmVhcmVzdCB0byB0aGUgZXZlbnQgcG9zaXRpb25cblx0ICogQGZ1bmN0aW9uIENoYXJ0LlRvb2x0aXAucG9zaXRpb25lcnMubmVhcmVzdFxuXHQgKiBAcGFyYW0gZWxlbWVudHMge0NoYXJ0LkVsZW1lbnRbXX0gdGhlIHRvb2x0aXAgZWxlbWVudHNcblx0ICogQHBhcmFtIGV2ZW50UG9zaXRpb24ge1BvaW50fSB0aGUgcG9zaXRpb24gb2YgdGhlIGV2ZW50IGluIGNhbnZhcyBjb29yZGluYXRlc1xuXHQgKiBAcmV0dXJucyB7UG9pbnR9IHRoZSB0b29sdGlwIHBvc2l0aW9uXG5cdCAqL1xuXHRuZWFyZXN0OiBmdW5jdGlvbihlbGVtZW50cywgZXZlbnRQb3NpdGlvbikge1xuXHRcdHZhciB4ID0gZXZlbnRQb3NpdGlvbi54O1xuXHRcdHZhciB5ID0gZXZlbnRQb3NpdGlvbi55O1xuXHRcdHZhciBtaW5EaXN0YW5jZSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblx0XHR2YXIgaSwgbGVuLCBuZWFyZXN0RWxlbWVudDtcblxuXHRcdGZvciAoaSA9IDAsIGxlbiA9IGVsZW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG5cdFx0XHR2YXIgZWwgPSBlbGVtZW50c1tpXTtcblx0XHRcdGlmIChlbCAmJiBlbC5oYXNWYWx1ZSgpKSB7XG5cdFx0XHRcdHZhciBjZW50ZXIgPSBlbC5nZXRDZW50ZXJQb2ludCgpO1xuXHRcdFx0XHR2YXIgZCA9IGhlbHBlcnMuZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKGV2ZW50UG9zaXRpb24sIGNlbnRlcik7XG5cblx0XHRcdFx0aWYgKGQgPCBtaW5EaXN0YW5jZSkge1xuXHRcdFx0XHRcdG1pbkRpc3RhbmNlID0gZDtcblx0XHRcdFx0XHRuZWFyZXN0RWxlbWVudCA9IGVsO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKG5lYXJlc3RFbGVtZW50KSB7XG5cdFx0XHR2YXIgdHAgPSBuZWFyZXN0RWxlbWVudC50b29sdGlwUG9zaXRpb24oKTtcblx0XHRcdHggPSB0cC54O1xuXHRcdFx0eSA9IHRwLnk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHg6IHgsXG5cdFx0XHR5OiB5XG5cdFx0fTtcblx0fVxufTtcblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kIHRvIG1lcmdlIHRoZSBvcGFjaXR5IGludG8gYSBjb2xvclxuICovXG5mdW5jdGlvbiBtZXJnZU9wYWNpdHkoY29sb3JTdHJpbmcsIG9wYWNpdHkpIHtcblx0dmFyIGNvbG9yID0gaGVscGVycy5jb2xvcihjb2xvclN0cmluZyk7XG5cdHJldHVybiBjb2xvci5hbHBoYShvcGFjaXR5ICogY29sb3IuYWxwaGEoKSkucmdiYVN0cmluZygpO1xufVxuXG4vLyBIZWxwZXIgdG8gcHVzaCBvciBjb25jYXQgYmFzZWQgb24gaWYgdGhlIDJuZCBwYXJhbWV0ZXIgaXMgYW4gYXJyYXkgb3Igbm90XG5mdW5jdGlvbiBwdXNoT3JDb25jYXQoYmFzZSwgdG9QdXNoKSB7XG5cdGlmICh0b1B1c2gpIHtcblx0XHRpZiAoaGVscGVycy5pc0FycmF5KHRvUHVzaCkpIHtcblx0XHRcdC8vIGJhc2UgPSBiYXNlLmNvbmNhdCh0b1B1c2gpO1xuXHRcdFx0QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoYmFzZSwgdG9QdXNoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YmFzZS5wdXNoKHRvUHVzaCk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGJhc2U7XG59XG5cbi8qKlxuICogUmV0dXJucyBhcnJheSBvZiBzdHJpbmdzIHNwbGl0IGJ5IG5ld2xpbmVcbiAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzcGxpdCBieSBuZXdsaW5lLlxuICogQHJldHVybnMge0FycmF5fSB2YWx1ZSBpZiBuZXdsaW5lIHByZXNlbnQgLSBSZXR1cm5lZCBmcm9tIFN0cmluZyBzcGxpdCgpIG1ldGhvZFxuICogQGZ1bmN0aW9uXG4gKi9cbmZ1bmN0aW9uIHNwbGl0TmV3bGluZXMoc3RyKSB7XG5cdGlmICgodHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgfHwgc3RyIGluc3RhbmNlb2YgU3RyaW5nKSAmJiBzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuXHRcdHJldHVybiBzdHIuc3BsaXQoJ1xcbicpO1xuXHR9XG5cdHJldHVybiBzdHI7XG59XG5cblxuLy8gUHJpdmF0ZSBoZWxwZXIgdG8gY3JlYXRlIGEgdG9vbHRpcCBpdGVtIG1vZGVsXG4vLyBAcGFyYW0gZWxlbWVudCA6IHRoZSBjaGFydCBlbGVtZW50IChwb2ludCwgYXJjLCBiYXIpIHRvIGNyZWF0ZSB0aGUgdG9vbHRpcCBpdGVtIGZvclxuLy8gQHJldHVybiA6IG5ldyB0b29sdGlwIGl0ZW1cbmZ1bmN0aW9uIGNyZWF0ZVRvb2x0aXBJdGVtKGVsZW1lbnQpIHtcblx0dmFyIHhTY2FsZSA9IGVsZW1lbnQuX3hTY2FsZTtcblx0dmFyIHlTY2FsZSA9IGVsZW1lbnQuX3lTY2FsZSB8fCBlbGVtZW50Ll9zY2FsZTsgLy8gaGFuZGxlIHJhZGFyIHx8IHBvbGFyQXJlYSBjaGFydHNcblx0dmFyIGluZGV4ID0gZWxlbWVudC5faW5kZXg7XG5cdHZhciBkYXRhc2V0SW5kZXggPSBlbGVtZW50Ll9kYXRhc2V0SW5kZXg7XG5cblx0cmV0dXJuIHtcblx0XHR4TGFiZWw6IHhTY2FsZSA/IHhTY2FsZS5nZXRMYWJlbEZvckluZGV4KGluZGV4LCBkYXRhc2V0SW5kZXgpIDogJycsXG5cdFx0eUxhYmVsOiB5U2NhbGUgPyB5U2NhbGUuZ2V0TGFiZWxGb3JJbmRleChpbmRleCwgZGF0YXNldEluZGV4KSA6ICcnLFxuXHRcdGluZGV4OiBpbmRleCxcblx0XHRkYXRhc2V0SW5kZXg6IGRhdGFzZXRJbmRleCxcblx0XHR4OiBlbGVtZW50Ll9tb2RlbC54LFxuXHRcdHk6IGVsZW1lbnQuX21vZGVsLnlcblx0fTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZ2V0IHRoZSByZXNldCBtb2RlbCBmb3IgdGhlIHRvb2x0aXBcbiAqIEBwYXJhbSB0b29sdGlwT3B0cyB7T2JqZWN0fSB0aGUgdG9vbHRpcCBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIGdldEJhc2VNb2RlbCh0b29sdGlwT3B0cykge1xuXHR2YXIgZ2xvYmFsRGVmYXVsdHMgPSBkZWZhdWx0cy5nbG9iYWw7XG5cdHZhciB2YWx1ZU9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQ7XG5cblx0cmV0dXJuIHtcblx0XHQvLyBQb3NpdGlvbmluZ1xuXHRcdHhQYWRkaW5nOiB0b29sdGlwT3B0cy54UGFkZGluZyxcblx0XHR5UGFkZGluZzogdG9vbHRpcE9wdHMueVBhZGRpbmcsXG5cdFx0eEFsaWduOiB0b29sdGlwT3B0cy54QWxpZ24sXG5cdFx0eUFsaWduOiB0b29sdGlwT3B0cy55QWxpZ24sXG5cblx0XHQvLyBCb2R5XG5cdFx0Ym9keUZvbnRDb2xvcjogdG9vbHRpcE9wdHMuYm9keUZvbnRDb2xvcixcblx0XHRfYm9keUZvbnRGYW1pbHk6IHZhbHVlT3JEZWZhdWx0KHRvb2x0aXBPcHRzLmJvZHlGb250RmFtaWx5LCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udEZhbWlseSksXG5cdFx0X2JvZHlGb250U3R5bGU6IHZhbHVlT3JEZWZhdWx0KHRvb2x0aXBPcHRzLmJvZHlGb250U3R5bGUsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250U3R5bGUpLFxuXHRcdF9ib2R5QWxpZ246IHRvb2x0aXBPcHRzLmJvZHlBbGlnbixcblx0XHRib2R5Rm9udFNpemU6IHZhbHVlT3JEZWZhdWx0KHRvb2x0aXBPcHRzLmJvZHlGb250U2l6ZSwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRTaXplKSxcblx0XHRib2R5U3BhY2luZzogdG9vbHRpcE9wdHMuYm9keVNwYWNpbmcsXG5cblx0XHQvLyBUaXRsZVxuXHRcdHRpdGxlRm9udENvbG9yOiB0b29sdGlwT3B0cy50aXRsZUZvbnRDb2xvcixcblx0XHRfdGl0bGVGb250RmFtaWx5OiB2YWx1ZU9yRGVmYXVsdCh0b29sdGlwT3B0cy50aXRsZUZvbnRGYW1pbHksIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250RmFtaWx5KSxcblx0XHRfdGl0bGVGb250U3R5bGU6IHZhbHVlT3JEZWZhdWx0KHRvb2x0aXBPcHRzLnRpdGxlRm9udFN0eWxlLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFN0eWxlKSxcblx0XHR0aXRsZUZvbnRTaXplOiB2YWx1ZU9yRGVmYXVsdCh0b29sdGlwT3B0cy50aXRsZUZvbnRTaXplLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFNpemUpLFxuXHRcdF90aXRsZUFsaWduOiB0b29sdGlwT3B0cy50aXRsZUFsaWduLFxuXHRcdHRpdGxlU3BhY2luZzogdG9vbHRpcE9wdHMudGl0bGVTcGFjaW5nLFxuXHRcdHRpdGxlTWFyZ2luQm90dG9tOiB0b29sdGlwT3B0cy50aXRsZU1hcmdpbkJvdHRvbSxcblxuXHRcdC8vIEZvb3RlclxuXHRcdGZvb3RlckZvbnRDb2xvcjogdG9vbHRpcE9wdHMuZm9vdGVyRm9udENvbG9yLFxuXHRcdF9mb290ZXJGb250RmFtaWx5OiB2YWx1ZU9yRGVmYXVsdCh0b29sdGlwT3B0cy5mb290ZXJGb250RmFtaWx5LCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udEZhbWlseSksXG5cdFx0X2Zvb3RlckZvbnRTdHlsZTogdmFsdWVPckRlZmF1bHQodG9vbHRpcE9wdHMuZm9vdGVyRm9udFN0eWxlLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFN0eWxlKSxcblx0XHRmb290ZXJGb250U2l6ZTogdmFsdWVPckRlZmF1bHQodG9vbHRpcE9wdHMuZm9vdGVyRm9udFNpemUsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250U2l6ZSksXG5cdFx0X2Zvb3RlckFsaWduOiB0b29sdGlwT3B0cy5mb290ZXJBbGlnbixcblx0XHRmb290ZXJTcGFjaW5nOiB0b29sdGlwT3B0cy5mb290ZXJTcGFjaW5nLFxuXHRcdGZvb3Rlck1hcmdpblRvcDogdG9vbHRpcE9wdHMuZm9vdGVyTWFyZ2luVG9wLFxuXG5cdFx0Ly8gQXBwZWFyYW5jZVxuXHRcdGNhcmV0U2l6ZTogdG9vbHRpcE9wdHMuY2FyZXRTaXplLFxuXHRcdGNvcm5lclJhZGl1czogdG9vbHRpcE9wdHMuY29ybmVyUmFkaXVzLFxuXHRcdGJhY2tncm91bmRDb2xvcjogdG9vbHRpcE9wdHMuYmFja2dyb3VuZENvbG9yLFxuXHRcdG9wYWNpdHk6IDAsXG5cdFx0bGVnZW5kQ29sb3JCYWNrZ3JvdW5kOiB0b29sdGlwT3B0cy5tdWx0aUtleUJhY2tncm91bmQsXG5cdFx0ZGlzcGxheUNvbG9yczogdG9vbHRpcE9wdHMuZGlzcGxheUNvbG9ycyxcblx0XHRib3JkZXJDb2xvcjogdG9vbHRpcE9wdHMuYm9yZGVyQ29sb3IsXG5cdFx0Ym9yZGVyV2lkdGg6IHRvb2x0aXBPcHRzLmJvcmRlcldpZHRoXG5cdH07XG59XG5cbi8qKlxuICogR2V0IHRoZSBzaXplIG9mIHRoZSB0b29sdGlwXG4gKi9cbmZ1bmN0aW9uIGdldFRvb2x0aXBTaXplKHRvb2x0aXAsIG1vZGVsKSB7XG5cdHZhciBjdHggPSB0b29sdGlwLl9jaGFydC5jdHg7XG5cblx0dmFyIGhlaWdodCA9IG1vZGVsLnlQYWRkaW5nICogMjsgLy8gVG9vbHRpcCBQYWRkaW5nXG5cdHZhciB3aWR0aCA9IDA7XG5cblx0Ly8gQ291bnQgb2YgYWxsIGxpbmVzIGluIHRoZSBib2R5XG5cdHZhciBib2R5ID0gbW9kZWwuYm9keTtcblx0dmFyIGNvbWJpbmVkQm9keUxlbmd0aCA9IGJvZHkucmVkdWNlKGZ1bmN0aW9uKGNvdW50LCBib2R5SXRlbSkge1xuXHRcdHJldHVybiBjb3VudCArIGJvZHlJdGVtLmJlZm9yZS5sZW5ndGggKyBib2R5SXRlbS5saW5lcy5sZW5ndGggKyBib2R5SXRlbS5hZnRlci5sZW5ndGg7XG5cdH0sIDApO1xuXHRjb21iaW5lZEJvZHlMZW5ndGggKz0gbW9kZWwuYmVmb3JlQm9keS5sZW5ndGggKyBtb2RlbC5hZnRlckJvZHkubGVuZ3RoO1xuXG5cdHZhciB0aXRsZUxpbmVDb3VudCA9IG1vZGVsLnRpdGxlLmxlbmd0aDtcblx0dmFyIGZvb3RlckxpbmVDb3VudCA9IG1vZGVsLmZvb3Rlci5sZW5ndGg7XG5cdHZhciB0aXRsZUZvbnRTaXplID0gbW9kZWwudGl0bGVGb250U2l6ZTtcblx0dmFyIGJvZHlGb250U2l6ZSA9IG1vZGVsLmJvZHlGb250U2l6ZTtcblx0dmFyIGZvb3RlckZvbnRTaXplID0gbW9kZWwuZm9vdGVyRm9udFNpemU7XG5cblx0aGVpZ2h0ICs9IHRpdGxlTGluZUNvdW50ICogdGl0bGVGb250U2l6ZTsgLy8gVGl0bGUgTGluZXNcblx0aGVpZ2h0ICs9IHRpdGxlTGluZUNvdW50ID8gKHRpdGxlTGluZUNvdW50IC0gMSkgKiBtb2RlbC50aXRsZVNwYWNpbmcgOiAwOyAvLyBUaXRsZSBMaW5lIFNwYWNpbmdcblx0aGVpZ2h0ICs9IHRpdGxlTGluZUNvdW50ID8gbW9kZWwudGl0bGVNYXJnaW5Cb3R0b20gOiAwOyAvLyBUaXRsZSdzIGJvdHRvbSBNYXJnaW5cblx0aGVpZ2h0ICs9IGNvbWJpbmVkQm9keUxlbmd0aCAqIGJvZHlGb250U2l6ZTsgLy8gQm9keSBMaW5lc1xuXHRoZWlnaHQgKz0gY29tYmluZWRCb2R5TGVuZ3RoID8gKGNvbWJpbmVkQm9keUxlbmd0aCAtIDEpICogbW9kZWwuYm9keVNwYWNpbmcgOiAwOyAvLyBCb2R5IExpbmUgU3BhY2luZ1xuXHRoZWlnaHQgKz0gZm9vdGVyTGluZUNvdW50ID8gbW9kZWwuZm9vdGVyTWFyZ2luVG9wIDogMDsgLy8gRm9vdGVyIE1hcmdpblxuXHRoZWlnaHQgKz0gZm9vdGVyTGluZUNvdW50ICogKGZvb3RlckZvbnRTaXplKTsgLy8gRm9vdGVyIExpbmVzXG5cdGhlaWdodCArPSBmb290ZXJMaW5lQ291bnQgPyAoZm9vdGVyTGluZUNvdW50IC0gMSkgKiBtb2RlbC5mb290ZXJTcGFjaW5nIDogMDsgLy8gRm9vdGVyIExpbmUgU3BhY2luZ1xuXG5cdC8vIFRpdGxlIHdpZHRoXG5cdHZhciB3aWR0aFBhZGRpbmcgPSAwO1xuXHR2YXIgbWF4TGluZVdpZHRoID0gZnVuY3Rpb24obGluZSkge1xuXHRcdHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIGN0eC5tZWFzdXJlVGV4dChsaW5lKS53aWR0aCArIHdpZHRoUGFkZGluZyk7XG5cdH07XG5cblx0Y3R4LmZvbnQgPSBoZWxwZXJzLmZvbnRTdHJpbmcodGl0bGVGb250U2l6ZSwgbW9kZWwuX3RpdGxlRm9udFN0eWxlLCBtb2RlbC5fdGl0bGVGb250RmFtaWx5KTtcblx0aGVscGVycy5lYWNoKG1vZGVsLnRpdGxlLCBtYXhMaW5lV2lkdGgpO1xuXG5cdC8vIEJvZHkgd2lkdGhcblx0Y3R4LmZvbnQgPSBoZWxwZXJzLmZvbnRTdHJpbmcoYm9keUZvbnRTaXplLCBtb2RlbC5fYm9keUZvbnRTdHlsZSwgbW9kZWwuX2JvZHlGb250RmFtaWx5KTtcblx0aGVscGVycy5lYWNoKG1vZGVsLmJlZm9yZUJvZHkuY29uY2F0KG1vZGVsLmFmdGVyQm9keSksIG1heExpbmVXaWR0aCk7XG5cblx0Ly8gQm9keSBsaW5lcyBtYXkgaW5jbHVkZSBzb21lIGV4dHJhIHdpZHRoIGR1ZSB0byB0aGUgY29sb3IgYm94XG5cdHdpZHRoUGFkZGluZyA9IG1vZGVsLmRpc3BsYXlDb2xvcnMgPyAoYm9keUZvbnRTaXplICsgMikgOiAwO1xuXHRoZWxwZXJzLmVhY2goYm9keSwgZnVuY3Rpb24oYm9keUl0ZW0pIHtcblx0XHRoZWxwZXJzLmVhY2goYm9keUl0ZW0uYmVmb3JlLCBtYXhMaW5lV2lkdGgpO1xuXHRcdGhlbHBlcnMuZWFjaChib2R5SXRlbS5saW5lcywgbWF4TGluZVdpZHRoKTtcblx0XHRoZWxwZXJzLmVhY2goYm9keUl0ZW0uYWZ0ZXIsIG1heExpbmVXaWR0aCk7XG5cdH0pO1xuXG5cdC8vIFJlc2V0IGJhY2sgdG8gMFxuXHR3aWR0aFBhZGRpbmcgPSAwO1xuXG5cdC8vIEZvb3RlciB3aWR0aFxuXHRjdHguZm9udCA9IGhlbHBlcnMuZm9udFN0cmluZyhmb290ZXJGb250U2l6ZSwgbW9kZWwuX2Zvb3RlckZvbnRTdHlsZSwgbW9kZWwuX2Zvb3RlckZvbnRGYW1pbHkpO1xuXHRoZWxwZXJzLmVhY2gobW9kZWwuZm9vdGVyLCBtYXhMaW5lV2lkdGgpO1xuXG5cdC8vIEFkZCBwYWRkaW5nXG5cdHdpZHRoICs9IDIgKiBtb2RlbC54UGFkZGluZztcblxuXHRyZXR1cm4ge1xuXHRcdHdpZHRoOiB3aWR0aCxcblx0XHRoZWlnaHQ6IGhlaWdodFxuXHR9O1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgdGhlIGFsaWdubWVudCBvZiBhIHRvb2x0aXAgZ2l2ZW4gdGhlIHNpemVcbiAqL1xuZnVuY3Rpb24gZGV0ZXJtaW5lQWxpZ25tZW50KHRvb2x0aXAsIHNpemUpIHtcblx0dmFyIG1vZGVsID0gdG9vbHRpcC5fbW9kZWw7XG5cdHZhciBjaGFydCA9IHRvb2x0aXAuX2NoYXJ0O1xuXHR2YXIgY2hhcnRBcmVhID0gdG9vbHRpcC5fY2hhcnQuY2hhcnRBcmVhO1xuXHR2YXIgeEFsaWduID0gJ2NlbnRlcic7XG5cdHZhciB5QWxpZ24gPSAnY2VudGVyJztcblxuXHRpZiAobW9kZWwueSA8IHNpemUuaGVpZ2h0KSB7XG5cdFx0eUFsaWduID0gJ3RvcCc7XG5cdH0gZWxzZSBpZiAobW9kZWwueSA+IChjaGFydC5oZWlnaHQgLSBzaXplLmhlaWdodCkpIHtcblx0XHR5QWxpZ24gPSAnYm90dG9tJztcblx0fVxuXG5cdHZhciBsZiwgcmY7IC8vIGZ1bmN0aW9ucyB0byBkZXRlcm1pbmUgbGVmdCwgcmlnaHQgYWxpZ25tZW50XG5cdHZhciBvbGYsIG9yZjsgLy8gZnVuY3Rpb25zIHRvIGRldGVybWluZSBpZiBsZWZ0L3JpZ2h0IGFsaWdubWVudCBjYXVzZXMgdG9vbHRpcCB0byBnbyBvdXRzaWRlIGNoYXJ0XG5cdHZhciB5ZjsgLy8gZnVuY3Rpb24gdG8gZ2V0IHRoZSB5IGFsaWdubWVudCBpZiB0aGUgdG9vbHRpcCBnb2VzIG91dHNpZGUgb2YgdGhlIGxlZnQgb3IgcmlnaHQgZWRnZXNcblx0dmFyIG1pZFggPSAoY2hhcnRBcmVhLmxlZnQgKyBjaGFydEFyZWEucmlnaHQpIC8gMjtcblx0dmFyIG1pZFkgPSAoY2hhcnRBcmVhLnRvcCArIGNoYXJ0QXJlYS5ib3R0b20pIC8gMjtcblxuXHRpZiAoeUFsaWduID09PSAnY2VudGVyJykge1xuXHRcdGxmID0gZnVuY3Rpb24oeCkge1xuXHRcdFx0cmV0dXJuIHggPD0gbWlkWDtcblx0XHR9O1xuXHRcdHJmID0gZnVuY3Rpb24oeCkge1xuXHRcdFx0cmV0dXJuIHggPiBtaWRYO1xuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0bGYgPSBmdW5jdGlvbih4KSB7XG5cdFx0XHRyZXR1cm4geCA8PSAoc2l6ZS53aWR0aCAvIDIpO1xuXHRcdH07XG5cdFx0cmYgPSBmdW5jdGlvbih4KSB7XG5cdFx0XHRyZXR1cm4geCA+PSAoY2hhcnQud2lkdGggLSAoc2l6ZS53aWR0aCAvIDIpKTtcblx0XHR9O1xuXHR9XG5cblx0b2xmID0gZnVuY3Rpb24oeCkge1xuXHRcdHJldHVybiB4ICsgc2l6ZS53aWR0aCArIG1vZGVsLmNhcmV0U2l6ZSArIG1vZGVsLmNhcmV0UGFkZGluZyA+IGNoYXJ0LndpZHRoO1xuXHR9O1xuXHRvcmYgPSBmdW5jdGlvbih4KSB7XG5cdFx0cmV0dXJuIHggLSBzaXplLndpZHRoIC0gbW9kZWwuY2FyZXRTaXplIC0gbW9kZWwuY2FyZXRQYWRkaW5nIDwgMDtcblx0fTtcblx0eWYgPSBmdW5jdGlvbih5KSB7XG5cdFx0cmV0dXJuIHkgPD0gbWlkWSA/ICd0b3AnIDogJ2JvdHRvbSc7XG5cdH07XG5cblx0aWYgKGxmKG1vZGVsLngpKSB7XG5cdFx0eEFsaWduID0gJ2xlZnQnO1xuXG5cdFx0Ly8gSXMgdG9vbHRpcCB0b28gd2lkZSBhbmQgZ29lcyBvdmVyIHRoZSByaWdodCBzaWRlIG9mIHRoZSBjaGFydC4/XG5cdFx0aWYgKG9sZihtb2RlbC54KSkge1xuXHRcdFx0eEFsaWduID0gJ2NlbnRlcic7XG5cdFx0XHR5QWxpZ24gPSB5Zihtb2RlbC55KTtcblx0XHR9XG5cdH0gZWxzZSBpZiAocmYobW9kZWwueCkpIHtcblx0XHR4QWxpZ24gPSAncmlnaHQnO1xuXG5cdFx0Ly8gSXMgdG9vbHRpcCB0b28gd2lkZSBhbmQgZ29lcyBvdXRzaWRlIGxlZnQgZWRnZSBvZiBjYW52YXM/XG5cdFx0aWYgKG9yZihtb2RlbC54KSkge1xuXHRcdFx0eEFsaWduID0gJ2NlbnRlcic7XG5cdFx0XHR5QWxpZ24gPSB5Zihtb2RlbC55KTtcblx0XHR9XG5cdH1cblxuXHR2YXIgb3B0cyA9IHRvb2x0aXAuX29wdGlvbnM7XG5cdHJldHVybiB7XG5cdFx0eEFsaWduOiBvcHRzLnhBbGlnbiA/IG9wdHMueEFsaWduIDogeEFsaWduLFxuXHRcdHlBbGlnbjogb3B0cy55QWxpZ24gPyBvcHRzLnlBbGlnbiA6IHlBbGlnblxuXHR9O1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBnZXQgdGhlIGxvY2F0aW9uIGEgdG9vbHRpcCBuZWVkcyB0byBiZSBwbGFjZWQgYXQgZ2l2ZW4gdGhlIGluaXRpYWwgcG9zaXRpb24gKHZpYSB0aGUgdm0pIGFuZCB0aGUgc2l6ZSBhbmQgYWxpZ25tZW50XG4gKi9cbmZ1bmN0aW9uIGdldEJhY2tncm91bmRQb2ludCh2bSwgc2l6ZSwgYWxpZ25tZW50LCBjaGFydCkge1xuXHQvLyBCYWNrZ3JvdW5kIFBvc2l0aW9uXG5cdHZhciB4ID0gdm0ueDtcblx0dmFyIHkgPSB2bS55O1xuXG5cdHZhciBjYXJldFNpemUgPSB2bS5jYXJldFNpemU7XG5cdHZhciBjYXJldFBhZGRpbmcgPSB2bS5jYXJldFBhZGRpbmc7XG5cdHZhciBjb3JuZXJSYWRpdXMgPSB2bS5jb3JuZXJSYWRpdXM7XG5cdHZhciB4QWxpZ24gPSBhbGlnbm1lbnQueEFsaWduO1xuXHR2YXIgeUFsaWduID0gYWxpZ25tZW50LnlBbGlnbjtcblx0dmFyIHBhZGRpbmdBbmRTaXplID0gY2FyZXRTaXplICsgY2FyZXRQYWRkaW5nO1xuXHR2YXIgcmFkaXVzQW5kUGFkZGluZyA9IGNvcm5lclJhZGl1cyArIGNhcmV0UGFkZGluZztcblxuXHRpZiAoeEFsaWduID09PSAncmlnaHQnKSB7XG5cdFx0eCAtPSBzaXplLndpZHRoO1xuXHR9IGVsc2UgaWYgKHhBbGlnbiA9PT0gJ2NlbnRlcicpIHtcblx0XHR4IC09IChzaXplLndpZHRoIC8gMik7XG5cdFx0aWYgKHggKyBzaXplLndpZHRoID4gY2hhcnQud2lkdGgpIHtcblx0XHRcdHggPSBjaGFydC53aWR0aCAtIHNpemUud2lkdGg7XG5cdFx0fVxuXHRcdGlmICh4IDwgMCkge1xuXHRcdFx0eCA9IDA7XG5cdFx0fVxuXHR9XG5cblx0aWYgKHlBbGlnbiA9PT0gJ3RvcCcpIHtcblx0XHR5ICs9IHBhZGRpbmdBbmRTaXplO1xuXHR9IGVsc2UgaWYgKHlBbGlnbiA9PT0gJ2JvdHRvbScpIHtcblx0XHR5IC09IHNpemUuaGVpZ2h0ICsgcGFkZGluZ0FuZFNpemU7XG5cdH0gZWxzZSB7XG5cdFx0eSAtPSAoc2l6ZS5oZWlnaHQgLyAyKTtcblx0fVxuXG5cdGlmICh5QWxpZ24gPT09ICdjZW50ZXInKSB7XG5cdFx0aWYgKHhBbGlnbiA9PT0gJ2xlZnQnKSB7XG5cdFx0XHR4ICs9IHBhZGRpbmdBbmRTaXplO1xuXHRcdH0gZWxzZSBpZiAoeEFsaWduID09PSAncmlnaHQnKSB7XG5cdFx0XHR4IC09IHBhZGRpbmdBbmRTaXplO1xuXHRcdH1cblx0fSBlbHNlIGlmICh4QWxpZ24gPT09ICdsZWZ0Jykge1xuXHRcdHggLT0gcmFkaXVzQW5kUGFkZGluZztcblx0fSBlbHNlIGlmICh4QWxpZ24gPT09ICdyaWdodCcpIHtcblx0XHR4ICs9IHJhZGl1c0FuZFBhZGRpbmc7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdHg6IHgsXG5cdFx0eTogeVxuXHR9O1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBidWlsZCBiZWZvcmUgYW5kIGFmdGVyIGJvZHkgbGluZXNcbiAqL1xuZnVuY3Rpb24gZ2V0QmVmb3JlQWZ0ZXJCb2R5TGluZXMoY2FsbGJhY2spIHtcblx0cmV0dXJuIHB1c2hPckNvbmNhdChbXSwgc3BsaXROZXdsaW5lcyhjYWxsYmFjaykpO1xufVxuXG52YXIgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gRWxlbWVudC5leHRlbmQoe1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLl9tb2RlbCA9IGdldEJhc2VNb2RlbCh0aGlzLl9vcHRpb25zKTtcblx0XHR0aGlzLl9sYXN0QWN0aXZlID0gW107XG5cdH0sXG5cblx0Ly8gR2V0IHRoZSB0aXRsZVxuXHQvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtLCBkYXRhKVxuXHRnZXRUaXRsZTogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgb3B0cyA9IG1lLl9vcHRpb25zO1xuXHRcdHZhciBjYWxsYmFja3MgPSBvcHRzLmNhbGxiYWNrcztcblxuXHRcdHZhciBiZWZvcmVUaXRsZSA9IGNhbGxiYWNrcy5iZWZvcmVUaXRsZS5hcHBseShtZSwgYXJndW1lbnRzKTtcblx0XHR2YXIgdGl0bGUgPSBjYWxsYmFja3MudGl0bGUuYXBwbHkobWUsIGFyZ3VtZW50cyk7XG5cdFx0dmFyIGFmdGVyVGl0bGUgPSBjYWxsYmFja3MuYWZ0ZXJUaXRsZS5hcHBseShtZSwgYXJndW1lbnRzKTtcblxuXHRcdHZhciBsaW5lcyA9IFtdO1xuXHRcdGxpbmVzID0gcHVzaE9yQ29uY2F0KGxpbmVzLCBzcGxpdE5ld2xpbmVzKGJlZm9yZVRpdGxlKSk7XG5cdFx0bGluZXMgPSBwdXNoT3JDb25jYXQobGluZXMsIHNwbGl0TmV3bGluZXModGl0bGUpKTtcblx0XHRsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyhhZnRlclRpdGxlKSk7XG5cblx0XHRyZXR1cm4gbGluZXM7XG5cdH0sXG5cblx0Ly8gQXJncyBhcmU6ICh0b29sdGlwSXRlbSwgZGF0YSlcblx0Z2V0QmVmb3JlQm9keTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGdldEJlZm9yZUFmdGVyQm9keUxpbmVzKHRoaXMuX29wdGlvbnMuY2FsbGJhY2tzLmJlZm9yZUJvZHkuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG5cdH0sXG5cblx0Ly8gQXJncyBhcmU6ICh0b29sdGlwSXRlbSwgZGF0YSlcblx0Z2V0Qm9keTogZnVuY3Rpb24odG9vbHRpcEl0ZW1zLCBkYXRhKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgY2FsbGJhY2tzID0gbWUuX29wdGlvbnMuY2FsbGJhY2tzO1xuXHRcdHZhciBib2R5SXRlbXMgPSBbXTtcblxuXHRcdGhlbHBlcnMuZWFjaCh0b29sdGlwSXRlbXMsIGZ1bmN0aW9uKHRvb2x0aXBJdGVtKSB7XG5cdFx0XHR2YXIgYm9keUl0ZW0gPSB7XG5cdFx0XHRcdGJlZm9yZTogW10sXG5cdFx0XHRcdGxpbmVzOiBbXSxcblx0XHRcdFx0YWZ0ZXI6IFtdXG5cdFx0XHR9O1xuXHRcdFx0cHVzaE9yQ29uY2F0KGJvZHlJdGVtLmJlZm9yZSwgc3BsaXROZXdsaW5lcyhjYWxsYmFja3MuYmVmb3JlTGFiZWwuY2FsbChtZSwgdG9vbHRpcEl0ZW0sIGRhdGEpKSk7XG5cdFx0XHRwdXNoT3JDb25jYXQoYm9keUl0ZW0ubGluZXMsIGNhbGxiYWNrcy5sYWJlbC5jYWxsKG1lLCB0b29sdGlwSXRlbSwgZGF0YSkpO1xuXHRcdFx0cHVzaE9yQ29uY2F0KGJvZHlJdGVtLmFmdGVyLCBzcGxpdE5ld2xpbmVzKGNhbGxiYWNrcy5hZnRlckxhYmVsLmNhbGwobWUsIHRvb2x0aXBJdGVtLCBkYXRhKSkpO1xuXG5cdFx0XHRib2R5SXRlbXMucHVzaChib2R5SXRlbSk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gYm9keUl0ZW1zO1xuXHR9LFxuXG5cdC8vIEFyZ3MgYXJlOiAodG9vbHRpcEl0ZW0sIGRhdGEpXG5cdGdldEFmdGVyQm9keTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGdldEJlZm9yZUFmdGVyQm9keUxpbmVzKHRoaXMuX29wdGlvbnMuY2FsbGJhY2tzLmFmdGVyQm9keS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcblx0fSxcblxuXHQvLyBHZXQgdGhlIGZvb3RlciBhbmQgYmVmb3JlRm9vdGVyIGFuZCBhZnRlckZvb3RlciBsaW5lc1xuXHQvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtLCBkYXRhKVxuXHRnZXRGb290ZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIGNhbGxiYWNrcyA9IG1lLl9vcHRpb25zLmNhbGxiYWNrcztcblxuXHRcdHZhciBiZWZvcmVGb290ZXIgPSBjYWxsYmFja3MuYmVmb3JlRm9vdGVyLmFwcGx5KG1lLCBhcmd1bWVudHMpO1xuXHRcdHZhciBmb290ZXIgPSBjYWxsYmFja3MuZm9vdGVyLmFwcGx5KG1lLCBhcmd1bWVudHMpO1xuXHRcdHZhciBhZnRlckZvb3RlciA9IGNhbGxiYWNrcy5hZnRlckZvb3Rlci5hcHBseShtZSwgYXJndW1lbnRzKTtcblxuXHRcdHZhciBsaW5lcyA9IFtdO1xuXHRcdGxpbmVzID0gcHVzaE9yQ29uY2F0KGxpbmVzLCBzcGxpdE5ld2xpbmVzKGJlZm9yZUZvb3RlcikpO1xuXHRcdGxpbmVzID0gcHVzaE9yQ29uY2F0KGxpbmVzLCBzcGxpdE5ld2xpbmVzKGZvb3RlcikpO1xuXHRcdGxpbmVzID0gcHVzaE9yQ29uY2F0KGxpbmVzLCBzcGxpdE5ld2xpbmVzKGFmdGVyRm9vdGVyKSk7XG5cblx0XHRyZXR1cm4gbGluZXM7XG5cdH0sXG5cblx0dXBkYXRlOiBmdW5jdGlvbihjaGFuZ2VkKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgb3B0cyA9IG1lLl9vcHRpb25zO1xuXG5cdFx0Ly8gTmVlZCB0byByZWdlbmVyYXRlIHRoZSBtb2RlbCBiZWNhdXNlIGl0cyBmYXN0ZXIgdGhhbiB1c2luZyBleHRlbmQgYW5kIGl0IGlzIG5lY2Vzc2FyeSBkdWUgdG8gdGhlIG9wdGltaXphdGlvbiBpbiBDaGFydC5FbGVtZW50LnRyYW5zaXRpb25cblx0XHQvLyB0aGF0IGRvZXMgX3ZpZXcgPSBfbW9kZWwgaWYgZWFzZSA9PT0gMS4gVGhpcyBjYXVzZXMgdGhlIDJuZCB0b29sdGlwIHVwZGF0ZSB0byBzZXQgcHJvcGVydGllcyBpbiBib3RoIHRoZSB2aWV3IGFuZCBtb2RlbCBhdCB0aGUgc2FtZSB0aW1lXG5cdFx0Ly8gd2hpY2ggYnJlYWtzIGFueSBhbmltYXRpb25zLlxuXHRcdHZhciBleGlzdGluZ01vZGVsID0gbWUuX21vZGVsO1xuXHRcdHZhciBtb2RlbCA9IG1lLl9tb2RlbCA9IGdldEJhc2VNb2RlbChvcHRzKTtcblx0XHR2YXIgYWN0aXZlID0gbWUuX2FjdGl2ZTtcblxuXHRcdHZhciBkYXRhID0gbWUuX2RhdGE7XG5cblx0XHQvLyBJbiB0aGUgY2FzZSB3aGVyZSBhY3RpdmUubGVuZ3RoID09PSAwIHdlIG5lZWQgdG8ga2VlcCB0aGVzZSBhdCBleGlzdGluZyB2YWx1ZXMgZm9yIGdvb2QgYW5pbWF0aW9uc1xuXHRcdHZhciBhbGlnbm1lbnQgPSB7XG5cdFx0XHR4QWxpZ246IGV4aXN0aW5nTW9kZWwueEFsaWduLFxuXHRcdFx0eUFsaWduOiBleGlzdGluZ01vZGVsLnlBbGlnblxuXHRcdH07XG5cdFx0dmFyIGJhY2tncm91bmRQb2ludCA9IHtcblx0XHRcdHg6IGV4aXN0aW5nTW9kZWwueCxcblx0XHRcdHk6IGV4aXN0aW5nTW9kZWwueVxuXHRcdH07XG5cdFx0dmFyIHRvb2x0aXBTaXplID0ge1xuXHRcdFx0d2lkdGg6IGV4aXN0aW5nTW9kZWwud2lkdGgsXG5cdFx0XHRoZWlnaHQ6IGV4aXN0aW5nTW9kZWwuaGVpZ2h0XG5cdFx0fTtcblx0XHR2YXIgdG9vbHRpcFBvc2l0aW9uID0ge1xuXHRcdFx0eDogZXhpc3RpbmdNb2RlbC5jYXJldFgsXG5cdFx0XHR5OiBleGlzdGluZ01vZGVsLmNhcmV0WVxuXHRcdH07XG5cblx0XHR2YXIgaSwgbGVuO1xuXG5cdFx0aWYgKGFjdGl2ZS5sZW5ndGgpIHtcblx0XHRcdG1vZGVsLm9wYWNpdHkgPSAxO1xuXG5cdFx0XHR2YXIgbGFiZWxDb2xvcnMgPSBbXTtcblx0XHRcdHZhciBsYWJlbFRleHRDb2xvcnMgPSBbXTtcblx0XHRcdHRvb2x0aXBQb3NpdGlvbiA9IHBvc2l0aW9uZXJzW29wdHMucG9zaXRpb25dLmNhbGwobWUsIGFjdGl2ZSwgbWUuX2V2ZW50UG9zaXRpb24pO1xuXG5cdFx0XHR2YXIgdG9vbHRpcEl0ZW1zID0gW107XG5cdFx0XHRmb3IgKGkgPSAwLCBsZW4gPSBhY3RpdmUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcblx0XHRcdFx0dG9vbHRpcEl0ZW1zLnB1c2goY3JlYXRlVG9vbHRpcEl0ZW0oYWN0aXZlW2ldKSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIHRoZSB1c2VyIHByb3ZpZGVkIGEgZmlsdGVyIGZ1bmN0aW9uLCB1c2UgaXQgdG8gbW9kaWZ5IHRoZSB0b29sdGlwIGl0ZW1zXG5cdFx0XHRpZiAob3B0cy5maWx0ZXIpIHtcblx0XHRcdFx0dG9vbHRpcEl0ZW1zID0gdG9vbHRpcEl0ZW1zLmZpbHRlcihmdW5jdGlvbihhKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9wdHMuZmlsdGVyKGEsIGRhdGEpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgdGhlIHVzZXIgcHJvdmlkZWQgYSBzb3J0aW5nIGZ1bmN0aW9uLCB1c2UgaXQgdG8gbW9kaWZ5IHRoZSB0b29sdGlwIGl0ZW1zXG5cdFx0XHRpZiAob3B0cy5pdGVtU29ydCkge1xuXHRcdFx0XHR0b29sdGlwSXRlbXMgPSB0b29sdGlwSXRlbXMuc29ydChmdW5jdGlvbihhLCBiKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9wdHMuaXRlbVNvcnQoYSwgYiwgZGF0YSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBEZXRlcm1pbmUgY29sb3JzIGZvciBib3hlc1xuXHRcdFx0aGVscGVycy5lYWNoKHRvb2x0aXBJdGVtcywgZnVuY3Rpb24odG9vbHRpcEl0ZW0pIHtcblx0XHRcdFx0bGFiZWxDb2xvcnMucHVzaChvcHRzLmNhbGxiYWNrcy5sYWJlbENvbG9yLmNhbGwobWUsIHRvb2x0aXBJdGVtLCBtZS5fY2hhcnQpKTtcblx0XHRcdFx0bGFiZWxUZXh0Q29sb3JzLnB1c2gob3B0cy5jYWxsYmFja3MubGFiZWxUZXh0Q29sb3IuY2FsbChtZSwgdG9vbHRpcEl0ZW0sIG1lLl9jaGFydCkpO1xuXHRcdFx0fSk7XG5cblxuXHRcdFx0Ly8gQnVpbGQgdGhlIFRleHQgTGluZXNcblx0XHRcdG1vZGVsLnRpdGxlID0gbWUuZ2V0VGl0bGUodG9vbHRpcEl0ZW1zLCBkYXRhKTtcblx0XHRcdG1vZGVsLmJlZm9yZUJvZHkgPSBtZS5nZXRCZWZvcmVCb2R5KHRvb2x0aXBJdGVtcywgZGF0YSk7XG5cdFx0XHRtb2RlbC5ib2R5ID0gbWUuZ2V0Qm9keSh0b29sdGlwSXRlbXMsIGRhdGEpO1xuXHRcdFx0bW9kZWwuYWZ0ZXJCb2R5ID0gbWUuZ2V0QWZ0ZXJCb2R5KHRvb2x0aXBJdGVtcywgZGF0YSk7XG5cdFx0XHRtb2RlbC5mb290ZXIgPSBtZS5nZXRGb290ZXIodG9vbHRpcEl0ZW1zLCBkYXRhKTtcblxuXHRcdFx0Ly8gSW5pdGlhbCBwb3NpdGlvbmluZyBhbmQgY29sb3JzXG5cdFx0XHRtb2RlbC54ID0gTWF0aC5yb3VuZCh0b29sdGlwUG9zaXRpb24ueCk7XG5cdFx0XHRtb2RlbC55ID0gTWF0aC5yb3VuZCh0b29sdGlwUG9zaXRpb24ueSk7XG5cdFx0XHRtb2RlbC5jYXJldFBhZGRpbmcgPSBvcHRzLmNhcmV0UGFkZGluZztcblx0XHRcdG1vZGVsLmxhYmVsQ29sb3JzID0gbGFiZWxDb2xvcnM7XG5cdFx0XHRtb2RlbC5sYWJlbFRleHRDb2xvcnMgPSBsYWJlbFRleHRDb2xvcnM7XG5cblx0XHRcdC8vIGRhdGEgcG9pbnRzXG5cdFx0XHRtb2RlbC5kYXRhUG9pbnRzID0gdG9vbHRpcEl0ZW1zO1xuXG5cdFx0XHQvLyBXZSBuZWVkIHRvIGRldGVybWluZSBhbGlnbm1lbnQgb2YgdGhlIHRvb2x0aXBcblx0XHRcdHRvb2x0aXBTaXplID0gZ2V0VG9vbHRpcFNpemUodGhpcywgbW9kZWwpO1xuXHRcdFx0YWxpZ25tZW50ID0gZGV0ZXJtaW5lQWxpZ25tZW50KHRoaXMsIHRvb2x0aXBTaXplKTtcblx0XHRcdC8vIEZpbmFsIFNpemUgYW5kIFBvc2l0aW9uXG5cdFx0XHRiYWNrZ3JvdW5kUG9pbnQgPSBnZXRCYWNrZ3JvdW5kUG9pbnQobW9kZWwsIHRvb2x0aXBTaXplLCBhbGlnbm1lbnQsIG1lLl9jaGFydCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1vZGVsLm9wYWNpdHkgPSAwO1xuXHRcdH1cblxuXHRcdG1vZGVsLnhBbGlnbiA9IGFsaWdubWVudC54QWxpZ247XG5cdFx0bW9kZWwueUFsaWduID0gYWxpZ25tZW50LnlBbGlnbjtcblx0XHRtb2RlbC54ID0gYmFja2dyb3VuZFBvaW50Lng7XG5cdFx0bW9kZWwueSA9IGJhY2tncm91bmRQb2ludC55O1xuXHRcdG1vZGVsLndpZHRoID0gdG9vbHRpcFNpemUud2lkdGg7XG5cdFx0bW9kZWwuaGVpZ2h0ID0gdG9vbHRpcFNpemUuaGVpZ2h0O1xuXG5cdFx0Ly8gUG9pbnQgd2hlcmUgdGhlIGNhcmV0IG9uIHRoZSB0b29sdGlwIHBvaW50cyB0b1xuXHRcdG1vZGVsLmNhcmV0WCA9IHRvb2x0aXBQb3NpdGlvbi54O1xuXHRcdG1vZGVsLmNhcmV0WSA9IHRvb2x0aXBQb3NpdGlvbi55O1xuXG5cdFx0bWUuX21vZGVsID0gbW9kZWw7XG5cblx0XHRpZiAoY2hhbmdlZCAmJiBvcHRzLmN1c3RvbSkge1xuXHRcdFx0b3B0cy5jdXN0b20uY2FsbChtZSwgbW9kZWwpO1xuXHRcdH1cblxuXHRcdHJldHVybiBtZTtcblx0fSxcblxuXHRkcmF3Q2FyZXQ6IGZ1bmN0aW9uKHRvb2x0aXBQb2ludCwgc2l6ZSkge1xuXHRcdHZhciBjdHggPSB0aGlzLl9jaGFydC5jdHg7XG5cdFx0dmFyIHZtID0gdGhpcy5fdmlldztcblx0XHR2YXIgY2FyZXRQb3NpdGlvbiA9IHRoaXMuZ2V0Q2FyZXRQb3NpdGlvbih0b29sdGlwUG9pbnQsIHNpemUsIHZtKTtcblxuXHRcdGN0eC5saW5lVG8oY2FyZXRQb3NpdGlvbi54MSwgY2FyZXRQb3NpdGlvbi55MSk7XG5cdFx0Y3R4LmxpbmVUbyhjYXJldFBvc2l0aW9uLngyLCBjYXJldFBvc2l0aW9uLnkyKTtcblx0XHRjdHgubGluZVRvKGNhcmV0UG9zaXRpb24ueDMsIGNhcmV0UG9zaXRpb24ueTMpO1xuXHR9LFxuXHRnZXRDYXJldFBvc2l0aW9uOiBmdW5jdGlvbih0b29sdGlwUG9pbnQsIHNpemUsIHZtKSB7XG5cdFx0dmFyIHgxLCB4MiwgeDMsIHkxLCB5MiwgeTM7XG5cdFx0dmFyIGNhcmV0U2l6ZSA9IHZtLmNhcmV0U2l6ZTtcblx0XHR2YXIgY29ybmVyUmFkaXVzID0gdm0uY29ybmVyUmFkaXVzO1xuXHRcdHZhciB4QWxpZ24gPSB2bS54QWxpZ247XG5cdFx0dmFyIHlBbGlnbiA9IHZtLnlBbGlnbjtcblx0XHR2YXIgcHRYID0gdG9vbHRpcFBvaW50Lng7XG5cdFx0dmFyIHB0WSA9IHRvb2x0aXBQb2ludC55O1xuXHRcdHZhciB3aWR0aCA9IHNpemUud2lkdGg7XG5cdFx0dmFyIGhlaWdodCA9IHNpemUuaGVpZ2h0O1xuXG5cdFx0aWYgKHlBbGlnbiA9PT0gJ2NlbnRlcicpIHtcblx0XHRcdHkyID0gcHRZICsgKGhlaWdodCAvIDIpO1xuXG5cdFx0XHRpZiAoeEFsaWduID09PSAnbGVmdCcpIHtcblx0XHRcdFx0eDEgPSBwdFg7XG5cdFx0XHRcdHgyID0geDEgLSBjYXJldFNpemU7XG5cdFx0XHRcdHgzID0geDE7XG5cblx0XHRcdFx0eTEgPSB5MiArIGNhcmV0U2l6ZTtcblx0XHRcdFx0eTMgPSB5MiAtIGNhcmV0U2l6ZTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHgxID0gcHRYICsgd2lkdGg7XG5cdFx0XHRcdHgyID0geDEgKyBjYXJldFNpemU7XG5cdFx0XHRcdHgzID0geDE7XG5cblx0XHRcdFx0eTEgPSB5MiAtIGNhcmV0U2l6ZTtcblx0XHRcdFx0eTMgPSB5MiArIGNhcmV0U2l6ZTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHhBbGlnbiA9PT0gJ2xlZnQnKSB7XG5cdFx0XHRcdHgyID0gcHRYICsgY29ybmVyUmFkaXVzICsgKGNhcmV0U2l6ZSk7XG5cdFx0XHRcdHgxID0geDIgLSBjYXJldFNpemU7XG5cdFx0XHRcdHgzID0geDIgKyBjYXJldFNpemU7XG5cdFx0XHR9IGVsc2UgaWYgKHhBbGlnbiA9PT0gJ3JpZ2h0Jykge1xuXHRcdFx0XHR4MiA9IHB0WCArIHdpZHRoIC0gY29ybmVyUmFkaXVzIC0gY2FyZXRTaXplO1xuXHRcdFx0XHR4MSA9IHgyIC0gY2FyZXRTaXplO1xuXHRcdFx0XHR4MyA9IHgyICsgY2FyZXRTaXplO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0eDIgPSB2bS5jYXJldFg7XG5cdFx0XHRcdHgxID0geDIgLSBjYXJldFNpemU7XG5cdFx0XHRcdHgzID0geDIgKyBjYXJldFNpemU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoeUFsaWduID09PSAndG9wJykge1xuXHRcdFx0XHR5MSA9IHB0WTtcblx0XHRcdFx0eTIgPSB5MSAtIGNhcmV0U2l6ZTtcblx0XHRcdFx0eTMgPSB5MTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHkxID0gcHRZICsgaGVpZ2h0O1xuXHRcdFx0XHR5MiA9IHkxICsgY2FyZXRTaXplO1xuXHRcdFx0XHR5MyA9IHkxO1xuXHRcdFx0XHQvLyBpbnZlcnQgZHJhd2luZyBvcmRlclxuXHRcdFx0XHR2YXIgdG1wID0geDM7XG5cdFx0XHRcdHgzID0geDE7XG5cdFx0XHRcdHgxID0gdG1wO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4ge3gxOiB4MSwgeDI6IHgyLCB4MzogeDMsIHkxOiB5MSwgeTI6IHkyLCB5MzogeTN9O1xuXHR9LFxuXG5cdGRyYXdUaXRsZTogZnVuY3Rpb24ocHQsIHZtLCBjdHgsIG9wYWNpdHkpIHtcblx0XHR2YXIgdGl0bGUgPSB2bS50aXRsZTtcblxuXHRcdGlmICh0aXRsZS5sZW5ndGgpIHtcblx0XHRcdGN0eC50ZXh0QWxpZ24gPSB2bS5fdGl0bGVBbGlnbjtcblx0XHRcdGN0eC50ZXh0QmFzZWxpbmUgPSAndG9wJztcblxuXHRcdFx0dmFyIHRpdGxlRm9udFNpemUgPSB2bS50aXRsZUZvbnRTaXplO1xuXHRcdFx0dmFyIHRpdGxlU3BhY2luZyA9IHZtLnRpdGxlU3BhY2luZztcblxuXHRcdFx0Y3R4LmZpbGxTdHlsZSA9IG1lcmdlT3BhY2l0eSh2bS50aXRsZUZvbnRDb2xvciwgb3BhY2l0eSk7XG5cdFx0XHRjdHguZm9udCA9IGhlbHBlcnMuZm9udFN0cmluZyh0aXRsZUZvbnRTaXplLCB2bS5fdGl0bGVGb250U3R5bGUsIHZtLl90aXRsZUZvbnRGYW1pbHkpO1xuXG5cdFx0XHR2YXIgaSwgbGVuO1xuXHRcdFx0Zm9yIChpID0gMCwgbGVuID0gdGl0bGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcblx0XHRcdFx0Y3R4LmZpbGxUZXh0KHRpdGxlW2ldLCBwdC54LCBwdC55KTtcblx0XHRcdFx0cHQueSArPSB0aXRsZUZvbnRTaXplICsgdGl0bGVTcGFjaW5nOyAvLyBMaW5lIEhlaWdodCBhbmQgc3BhY2luZ1xuXG5cdFx0XHRcdGlmIChpICsgMSA9PT0gdGl0bGUubGVuZ3RoKSB7XG5cdFx0XHRcdFx0cHQueSArPSB2bS50aXRsZU1hcmdpbkJvdHRvbSAtIHRpdGxlU3BhY2luZzsgLy8gSWYgTGFzdCwgYWRkIG1hcmdpbiwgcmVtb3ZlIHNwYWNpbmdcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRkcmF3Qm9keTogZnVuY3Rpb24ocHQsIHZtLCBjdHgsIG9wYWNpdHkpIHtcblx0XHR2YXIgYm9keUZvbnRTaXplID0gdm0uYm9keUZvbnRTaXplO1xuXHRcdHZhciBib2R5U3BhY2luZyA9IHZtLmJvZHlTcGFjaW5nO1xuXHRcdHZhciBib2R5ID0gdm0uYm9keTtcblxuXHRcdGN0eC50ZXh0QWxpZ24gPSB2bS5fYm9keUFsaWduO1xuXHRcdGN0eC50ZXh0QmFzZWxpbmUgPSAndG9wJztcblx0XHRjdHguZm9udCA9IGhlbHBlcnMuZm9udFN0cmluZyhib2R5Rm9udFNpemUsIHZtLl9ib2R5Rm9udFN0eWxlLCB2bS5fYm9keUZvbnRGYW1pbHkpO1xuXG5cdFx0Ly8gQmVmb3JlIEJvZHlcblx0XHR2YXIgeExpbmVQYWRkaW5nID0gMDtcblx0XHR2YXIgZmlsbExpbmVPZlRleHQgPSBmdW5jdGlvbihsaW5lKSB7XG5cdFx0XHRjdHguZmlsbFRleHQobGluZSwgcHQueCArIHhMaW5lUGFkZGluZywgcHQueSk7XG5cdFx0XHRwdC55ICs9IGJvZHlGb250U2l6ZSArIGJvZHlTcGFjaW5nO1xuXHRcdH07XG5cblx0XHQvLyBCZWZvcmUgYm9keSBsaW5lc1xuXHRcdGN0eC5maWxsU3R5bGUgPSBtZXJnZU9wYWNpdHkodm0uYm9keUZvbnRDb2xvciwgb3BhY2l0eSk7XG5cdFx0aGVscGVycy5lYWNoKHZtLmJlZm9yZUJvZHksIGZpbGxMaW5lT2ZUZXh0KTtcblxuXHRcdHZhciBkcmF3Q29sb3JCb3hlcyA9IHZtLmRpc3BsYXlDb2xvcnM7XG5cdFx0eExpbmVQYWRkaW5nID0gZHJhd0NvbG9yQm94ZXMgPyAoYm9keUZvbnRTaXplICsgMikgOiAwO1xuXG5cdFx0Ly8gRHJhdyBib2R5IGxpbmVzIG5vd1xuXHRcdGhlbHBlcnMuZWFjaChib2R5LCBmdW5jdGlvbihib2R5SXRlbSwgaSkge1xuXHRcdFx0dmFyIHRleHRDb2xvciA9IG1lcmdlT3BhY2l0eSh2bS5sYWJlbFRleHRDb2xvcnNbaV0sIG9wYWNpdHkpO1xuXHRcdFx0Y3R4LmZpbGxTdHlsZSA9IHRleHRDb2xvcjtcblx0XHRcdGhlbHBlcnMuZWFjaChib2R5SXRlbS5iZWZvcmUsIGZpbGxMaW5lT2ZUZXh0KTtcblxuXHRcdFx0aGVscGVycy5lYWNoKGJvZHlJdGVtLmxpbmVzLCBmdW5jdGlvbihsaW5lKSB7XG5cdFx0XHRcdC8vIERyYXcgTGVnZW5kLWxpa2UgYm94ZXMgaWYgbmVlZGVkXG5cdFx0XHRcdGlmIChkcmF3Q29sb3JCb3hlcykge1xuXHRcdFx0XHRcdC8vIEZpbGwgYSB3aGl0ZSByZWN0IHNvIHRoYXQgY29sb3VycyBtZXJnZSBuaWNlbHkgaWYgdGhlIG9wYWNpdHkgaXMgPCAxXG5cdFx0XHRcdFx0Y3R4LmZpbGxTdHlsZSA9IG1lcmdlT3BhY2l0eSh2bS5sZWdlbmRDb2xvckJhY2tncm91bmQsIG9wYWNpdHkpO1xuXHRcdFx0XHRcdGN0eC5maWxsUmVjdChwdC54LCBwdC55LCBib2R5Rm9udFNpemUsIGJvZHlGb250U2l6ZSk7XG5cblx0XHRcdFx0XHQvLyBCb3JkZXJcblx0XHRcdFx0XHRjdHgubGluZVdpZHRoID0gMTtcblx0XHRcdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSBtZXJnZU9wYWNpdHkodm0ubGFiZWxDb2xvcnNbaV0uYm9yZGVyQ29sb3IsIG9wYWNpdHkpO1xuXHRcdFx0XHRcdGN0eC5zdHJva2VSZWN0KHB0LngsIHB0LnksIGJvZHlGb250U2l6ZSwgYm9keUZvbnRTaXplKTtcblxuXHRcdFx0XHRcdC8vIElubmVyIHNxdWFyZVxuXHRcdFx0XHRcdGN0eC5maWxsU3R5bGUgPSBtZXJnZU9wYWNpdHkodm0ubGFiZWxDb2xvcnNbaV0uYmFja2dyb3VuZENvbG9yLCBvcGFjaXR5KTtcblx0XHRcdFx0XHRjdHguZmlsbFJlY3QocHQueCArIDEsIHB0LnkgKyAxLCBib2R5Rm9udFNpemUgLSAyLCBib2R5Rm9udFNpemUgLSAyKTtcblx0XHRcdFx0XHRjdHguZmlsbFN0eWxlID0gdGV4dENvbG9yO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZmlsbExpbmVPZlRleHQobGluZSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0aGVscGVycy5lYWNoKGJvZHlJdGVtLmFmdGVyLCBmaWxsTGluZU9mVGV4dCk7XG5cdFx0fSk7XG5cblx0XHQvLyBSZXNldCBiYWNrIHRvIDAgZm9yIGFmdGVyIGJvZHlcblx0XHR4TGluZVBhZGRpbmcgPSAwO1xuXG5cdFx0Ly8gQWZ0ZXIgYm9keSBsaW5lc1xuXHRcdGhlbHBlcnMuZWFjaCh2bS5hZnRlckJvZHksIGZpbGxMaW5lT2ZUZXh0KTtcblx0XHRwdC55IC09IGJvZHlTcGFjaW5nOyAvLyBSZW1vdmUgbGFzdCBib2R5IHNwYWNpbmdcblx0fSxcblxuXHRkcmF3Rm9vdGVyOiBmdW5jdGlvbihwdCwgdm0sIGN0eCwgb3BhY2l0eSkge1xuXHRcdHZhciBmb290ZXIgPSB2bS5mb290ZXI7XG5cblx0XHRpZiAoZm9vdGVyLmxlbmd0aCkge1xuXHRcdFx0cHQueSArPSB2bS5mb290ZXJNYXJnaW5Ub3A7XG5cblx0XHRcdGN0eC50ZXh0QWxpZ24gPSB2bS5fZm9vdGVyQWxpZ247XG5cdFx0XHRjdHgudGV4dEJhc2VsaW5lID0gJ3RvcCc7XG5cblx0XHRcdGN0eC5maWxsU3R5bGUgPSBtZXJnZU9wYWNpdHkodm0uZm9vdGVyRm9udENvbG9yLCBvcGFjaXR5KTtcblx0XHRcdGN0eC5mb250ID0gaGVscGVycy5mb250U3RyaW5nKHZtLmZvb3RlckZvbnRTaXplLCB2bS5fZm9vdGVyRm9udFN0eWxlLCB2bS5fZm9vdGVyRm9udEZhbWlseSk7XG5cblx0XHRcdGhlbHBlcnMuZWFjaChmb290ZXIsIGZ1bmN0aW9uKGxpbmUpIHtcblx0XHRcdFx0Y3R4LmZpbGxUZXh0KGxpbmUsIHB0LngsIHB0LnkpO1xuXHRcdFx0XHRwdC55ICs9IHZtLmZvb3RlckZvbnRTaXplICsgdm0uZm9vdGVyU3BhY2luZztcblx0XHRcdH0pO1xuXHRcdH1cblx0fSxcblxuXHRkcmF3QmFja2dyb3VuZDogZnVuY3Rpb24ocHQsIHZtLCBjdHgsIHRvb2x0aXBTaXplLCBvcGFjaXR5KSB7XG5cdFx0Y3R4LmZpbGxTdHlsZSA9IG1lcmdlT3BhY2l0eSh2bS5iYWNrZ3JvdW5kQ29sb3IsIG9wYWNpdHkpO1xuXHRcdGN0eC5zdHJva2VTdHlsZSA9IG1lcmdlT3BhY2l0eSh2bS5ib3JkZXJDb2xvciwgb3BhY2l0eSk7XG5cdFx0Y3R4LmxpbmVXaWR0aCA9IHZtLmJvcmRlcldpZHRoO1xuXHRcdHZhciB4QWxpZ24gPSB2bS54QWxpZ247XG5cdFx0dmFyIHlBbGlnbiA9IHZtLnlBbGlnbjtcblx0XHR2YXIgeCA9IHB0Lng7XG5cdFx0dmFyIHkgPSBwdC55O1xuXHRcdHZhciB3aWR0aCA9IHRvb2x0aXBTaXplLndpZHRoO1xuXHRcdHZhciBoZWlnaHQgPSB0b29sdGlwU2l6ZS5oZWlnaHQ7XG5cdFx0dmFyIHJhZGl1cyA9IHZtLmNvcm5lclJhZGl1cztcblxuXHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRjdHgubW92ZVRvKHggKyByYWRpdXMsIHkpO1xuXHRcdGlmICh5QWxpZ24gPT09ICd0b3AnKSB7XG5cdFx0XHR0aGlzLmRyYXdDYXJldChwdCwgdG9vbHRpcFNpemUpO1xuXHRcdH1cblx0XHRjdHgubGluZVRvKHggKyB3aWR0aCAtIHJhZGl1cywgeSk7XG5cdFx0Y3R4LnF1YWRyYXRpY0N1cnZlVG8oeCArIHdpZHRoLCB5LCB4ICsgd2lkdGgsIHkgKyByYWRpdXMpO1xuXHRcdGlmICh5QWxpZ24gPT09ICdjZW50ZXInICYmIHhBbGlnbiA9PT0gJ3JpZ2h0Jykge1xuXHRcdFx0dGhpcy5kcmF3Q2FyZXQocHQsIHRvb2x0aXBTaXplKTtcblx0XHR9XG5cdFx0Y3R4LmxpbmVUbyh4ICsgd2lkdGgsIHkgKyBoZWlnaHQgLSByYWRpdXMpO1xuXHRcdGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCArIHdpZHRoIC0gcmFkaXVzLCB5ICsgaGVpZ2h0KTtcblx0XHRpZiAoeUFsaWduID09PSAnYm90dG9tJykge1xuXHRcdFx0dGhpcy5kcmF3Q2FyZXQocHQsIHRvb2x0aXBTaXplKTtcblx0XHR9XG5cdFx0Y3R4LmxpbmVUbyh4ICsgcmFkaXVzLCB5ICsgaGVpZ2h0KTtcblx0XHRjdHgucXVhZHJhdGljQ3VydmVUbyh4LCB5ICsgaGVpZ2h0LCB4LCB5ICsgaGVpZ2h0IC0gcmFkaXVzKTtcblx0XHRpZiAoeUFsaWduID09PSAnY2VudGVyJyAmJiB4QWxpZ24gPT09ICdsZWZ0Jykge1xuXHRcdFx0dGhpcy5kcmF3Q2FyZXQocHQsIHRvb2x0aXBTaXplKTtcblx0XHR9XG5cdFx0Y3R4LmxpbmVUbyh4LCB5ICsgcmFkaXVzKTtcblx0XHRjdHgucXVhZHJhdGljQ3VydmVUbyh4LCB5LCB4ICsgcmFkaXVzLCB5KTtcblx0XHRjdHguY2xvc2VQYXRoKCk7XG5cblx0XHRjdHguZmlsbCgpO1xuXG5cdFx0aWYgKHZtLmJvcmRlcldpZHRoID4gMCkge1xuXHRcdFx0Y3R4LnN0cm9rZSgpO1xuXHRcdH1cblx0fSxcblxuXHRkcmF3OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY3R4ID0gdGhpcy5fY2hhcnQuY3R4O1xuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XG5cblx0XHRpZiAodm0ub3BhY2l0eSA9PT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciB0b29sdGlwU2l6ZSA9IHtcblx0XHRcdHdpZHRoOiB2bS53aWR0aCxcblx0XHRcdGhlaWdodDogdm0uaGVpZ2h0XG5cdFx0fTtcblx0XHR2YXIgcHQgPSB7XG5cdFx0XHR4OiB2bS54LFxuXHRcdFx0eTogdm0ueVxuXHRcdH07XG5cblx0XHQvLyBJRTExL0VkZ2UgZG9lcyBub3QgbGlrZSB2ZXJ5IHNtYWxsIG9wYWNpdGllcywgc28gc25hcCB0byAwXG5cdFx0dmFyIG9wYWNpdHkgPSBNYXRoLmFicyh2bS5vcGFjaXR5IDwgMWUtMykgPyAwIDogdm0ub3BhY2l0eTtcblxuXHRcdC8vIFRydXRoeS9mYWxzZXkgdmFsdWUgZm9yIGVtcHR5IHRvb2x0aXBcblx0XHR2YXIgaGFzVG9vbHRpcENvbnRlbnQgPSB2bS50aXRsZS5sZW5ndGggfHwgdm0uYmVmb3JlQm9keS5sZW5ndGggfHwgdm0uYm9keS5sZW5ndGggfHwgdm0uYWZ0ZXJCb2R5Lmxlbmd0aCB8fCB2bS5mb290ZXIubGVuZ3RoO1xuXG5cdFx0aWYgKHRoaXMuX29wdGlvbnMuZW5hYmxlZCAmJiBoYXNUb29sdGlwQ29udGVudCkge1xuXHRcdFx0Ly8gRHJhdyBCYWNrZ3JvdW5kXG5cdFx0XHR0aGlzLmRyYXdCYWNrZ3JvdW5kKHB0LCB2bSwgY3R4LCB0b29sdGlwU2l6ZSwgb3BhY2l0eSk7XG5cblx0XHRcdC8vIERyYXcgVGl0bGUsIEJvZHksIGFuZCBGb290ZXJcblx0XHRcdHB0LnggKz0gdm0ueFBhZGRpbmc7XG5cdFx0XHRwdC55ICs9IHZtLnlQYWRkaW5nO1xuXG5cdFx0XHQvLyBUaXRsZXNcblx0XHRcdHRoaXMuZHJhd1RpdGxlKHB0LCB2bSwgY3R4LCBvcGFjaXR5KTtcblxuXHRcdFx0Ly8gQm9keVxuXHRcdFx0dGhpcy5kcmF3Qm9keShwdCwgdm0sIGN0eCwgb3BhY2l0eSk7XG5cblx0XHRcdC8vIEZvb3RlclxuXHRcdFx0dGhpcy5kcmF3Rm9vdGVyKHB0LCB2bSwgY3R4LCBvcGFjaXR5KTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIEhhbmRsZSBhbiBldmVudFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge0lFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgdG8gaGFuZGxlXG5cdCAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHRoZSB0b29sdGlwIGNoYW5nZWRcblx0ICovXG5cdGhhbmRsZUV2ZW50OiBmdW5jdGlvbihlKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgb3B0aW9ucyA9IG1lLl9vcHRpb25zO1xuXHRcdHZhciBjaGFuZ2VkID0gZmFsc2U7XG5cblx0XHRtZS5fbGFzdEFjdGl2ZSA9IG1lLl9sYXN0QWN0aXZlIHx8IFtdO1xuXG5cdFx0Ly8gRmluZCBBY3RpdmUgRWxlbWVudHMgZm9yIHRvb2x0aXBzXG5cdFx0aWYgKGUudHlwZSA9PT0gJ21vdXNlb3V0Jykge1xuXHRcdFx0bWUuX2FjdGl2ZSA9IFtdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtZS5fYWN0aXZlID0gbWUuX2NoYXJ0LmdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUoZSwgb3B0aW9ucy5tb2RlLCBvcHRpb25zKTtcblx0XHR9XG5cblx0XHQvLyBSZW1lbWJlciBMYXN0IEFjdGl2ZXNcblx0XHRjaGFuZ2VkID0gIWhlbHBlcnMuYXJyYXlFcXVhbHMobWUuX2FjdGl2ZSwgbWUuX2xhc3RBY3RpdmUpO1xuXG5cdFx0Ly8gT25seSBoYW5kbGUgdGFyZ2V0IGV2ZW50IG9uIHRvb2x0aXAgY2hhbmdlXG5cdFx0aWYgKGNoYW5nZWQpIHtcblx0XHRcdG1lLl9sYXN0QWN0aXZlID0gbWUuX2FjdGl2ZTtcblxuXHRcdFx0aWYgKG9wdGlvbnMuZW5hYmxlZCB8fCBvcHRpb25zLmN1c3RvbSkge1xuXHRcdFx0XHRtZS5fZXZlbnRQb3NpdGlvbiA9IHtcblx0XHRcdFx0XHR4OiBlLngsXG5cdFx0XHRcdFx0eTogZS55XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0bWUudXBkYXRlKHRydWUpO1xuXHRcdFx0XHRtZS5waXZvdCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjaGFuZ2VkO1xuXHR9XG59KTtcblxuLyoqXG4gKiBAbmFtZXNwYWNlIENoYXJ0LlRvb2x0aXAucG9zaXRpb25lcnNcbiAqL1xuZXhwb3J0cy5wb3NpdGlvbmVycyA9IHBvc2l0aW9uZXJzO1xuXG5cbn0se1wiMjZcIjoyNixcIjI3XCI6MjcsXCI0NlwiOjQ2fV0sMzc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcbnZhciBFbGVtZW50ID0gcmVxdWlyZSgyNyk7XG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xuXG5kZWZhdWx0cy5fc2V0KCdnbG9iYWwnLCB7XG5cdGVsZW1lbnRzOiB7XG5cdFx0YXJjOiB7XG5cdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IGRlZmF1bHRzLmdsb2JhbC5kZWZhdWx0Q29sb3IsXG5cdFx0XHRib3JkZXJDb2xvcjogJyNmZmYnLFxuXHRcdFx0Ym9yZGVyV2lkdGg6IDJcblx0XHR9XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVsZW1lbnQuZXh0ZW5kKHtcblx0aW5MYWJlbFJhbmdlOiBmdW5jdGlvbihtb3VzZVgpIHtcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xuXG5cdFx0aWYgKHZtKSB7XG5cdFx0XHRyZXR1cm4gKE1hdGgucG93KG1vdXNlWCAtIHZtLngsIDIpIDwgTWF0aC5wb3codm0ucmFkaXVzICsgdm0uaG92ZXJSYWRpdXMsIDIpKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdGluUmFuZ2U6IGZ1bmN0aW9uKGNoYXJ0WCwgY2hhcnRZKSB7XG5cdFx0dmFyIHZtID0gdGhpcy5fdmlldztcblxuXHRcdGlmICh2bSkge1xuXHRcdFx0dmFyIHBvaW50UmVsYXRpdmVQb3NpdGlvbiA9IGhlbHBlcnMuZ2V0QW5nbGVGcm9tUG9pbnQodm0sIHt4OiBjaGFydFgsIHk6IGNoYXJ0WX0pO1xuXHRcdFx0dmFyXHRhbmdsZSA9IHBvaW50UmVsYXRpdmVQb3NpdGlvbi5hbmdsZTtcblx0XHRcdHZhciBkaXN0YW5jZSA9IHBvaW50UmVsYXRpdmVQb3NpdGlvbi5kaXN0YW5jZTtcblxuXHRcdFx0Ly8gU2FuaXRpc2UgYW5nbGUgcmFuZ2Vcblx0XHRcdHZhciBzdGFydEFuZ2xlID0gdm0uc3RhcnRBbmdsZTtcblx0XHRcdHZhciBlbmRBbmdsZSA9IHZtLmVuZEFuZ2xlO1xuXHRcdFx0d2hpbGUgKGVuZEFuZ2xlIDwgc3RhcnRBbmdsZSkge1xuXHRcdFx0XHRlbmRBbmdsZSArPSAyLjAgKiBNYXRoLlBJO1xuXHRcdFx0fVxuXHRcdFx0d2hpbGUgKGFuZ2xlID4gZW5kQW5nbGUpIHtcblx0XHRcdFx0YW5nbGUgLT0gMi4wICogTWF0aC5QSTtcblx0XHRcdH1cblx0XHRcdHdoaWxlIChhbmdsZSA8IHN0YXJ0QW5nbGUpIHtcblx0XHRcdFx0YW5nbGUgKz0gMi4wICogTWF0aC5QSTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2hlY2sgaWYgd2l0aGluIHRoZSByYW5nZSBvZiB0aGUgb3Blbi9jbG9zZSBhbmdsZVxuXHRcdFx0dmFyIGJldHdlZW5BbmdsZXMgPSAoYW5nbGUgPj0gc3RhcnRBbmdsZSAmJiBhbmdsZSA8PSBlbmRBbmdsZSk7XG5cdFx0XHR2YXIgd2l0aGluUmFkaXVzID0gKGRpc3RhbmNlID49IHZtLmlubmVyUmFkaXVzICYmIGRpc3RhbmNlIDw9IHZtLm91dGVyUmFkaXVzKTtcblxuXHRcdFx0cmV0dXJuIChiZXR3ZWVuQW5nbGVzICYmIHdpdGhpblJhZGl1cyk7XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblxuXHRnZXRDZW50ZXJQb2ludDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHZtID0gdGhpcy5fdmlldztcblx0XHR2YXIgaGFsZkFuZ2xlID0gKHZtLnN0YXJ0QW5nbGUgKyB2bS5lbmRBbmdsZSkgLyAyO1xuXHRcdHZhciBoYWxmUmFkaXVzID0gKHZtLmlubmVyUmFkaXVzICsgdm0ub3V0ZXJSYWRpdXMpIC8gMjtcblx0XHRyZXR1cm4ge1xuXHRcdFx0eDogdm0ueCArIE1hdGguY29zKGhhbGZBbmdsZSkgKiBoYWxmUmFkaXVzLFxuXHRcdFx0eTogdm0ueSArIE1hdGguc2luKGhhbGZBbmdsZSkgKiBoYWxmUmFkaXVzXG5cdFx0fTtcblx0fSxcblxuXHRnZXRBcmVhOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xuXHRcdHJldHVybiBNYXRoLlBJICogKCh2bS5lbmRBbmdsZSAtIHZtLnN0YXJ0QW5nbGUpIC8gKDIgKiBNYXRoLlBJKSkgKiAoTWF0aC5wb3codm0ub3V0ZXJSYWRpdXMsIDIpIC0gTWF0aC5wb3codm0uaW5uZXJSYWRpdXMsIDIpKTtcblx0fSxcblxuXHR0b29sdGlwUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XG5cdFx0dmFyIGNlbnRyZUFuZ2xlID0gdm0uc3RhcnRBbmdsZSArICgodm0uZW5kQW5nbGUgLSB2bS5zdGFydEFuZ2xlKSAvIDIpO1xuXHRcdHZhciByYW5nZUZyb21DZW50cmUgPSAodm0ub3V0ZXJSYWRpdXMgLSB2bS5pbm5lclJhZGl1cykgLyAyICsgdm0uaW5uZXJSYWRpdXM7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0eDogdm0ueCArIChNYXRoLmNvcyhjZW50cmVBbmdsZSkgKiByYW5nZUZyb21DZW50cmUpLFxuXHRcdFx0eTogdm0ueSArIChNYXRoLnNpbihjZW50cmVBbmdsZSkgKiByYW5nZUZyb21DZW50cmUpXG5cdFx0fTtcblx0fSxcblxuXHRkcmF3OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY3R4ID0gdGhpcy5fY2hhcnQuY3R4O1xuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XG5cdFx0dmFyIHNBID0gdm0uc3RhcnRBbmdsZTtcblx0XHR2YXIgZUEgPSB2bS5lbmRBbmdsZTtcblxuXHRcdGN0eC5iZWdpblBhdGgoKTtcblxuXHRcdGN0eC5hcmModm0ueCwgdm0ueSwgdm0ub3V0ZXJSYWRpdXMsIHNBLCBlQSk7XG5cdFx0Y3R4LmFyYyh2bS54LCB2bS55LCB2bS5pbm5lclJhZGl1cywgZUEsIHNBLCB0cnVlKTtcblxuXHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHRjdHguc3Ryb2tlU3R5bGUgPSB2bS5ib3JkZXJDb2xvcjtcblx0XHRjdHgubGluZVdpZHRoID0gdm0uYm9yZGVyV2lkdGg7XG5cblx0XHRjdHguZmlsbFN0eWxlID0gdm0uYmFja2dyb3VuZENvbG9yO1xuXG5cdFx0Y3R4LmZpbGwoKTtcblx0XHRjdHgubGluZUpvaW4gPSAnYmV2ZWwnO1xuXG5cdFx0aWYgKHZtLmJvcmRlcldpZHRoKSB7XG5cdFx0XHRjdHguc3Ryb2tlKCk7XG5cdFx0fVxuXHR9XG59KTtcblxufSx7XCIyNlwiOjI2LFwiMjdcIjoyNyxcIjQ2XCI6NDZ9XSwzODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xudmFyIEVsZW1lbnQgPSByZXF1aXJlKDI3KTtcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XG5cbnZhciBnbG9iYWxEZWZhdWx0cyA9IGRlZmF1bHRzLmdsb2JhbDtcblxuZGVmYXVsdHMuX3NldCgnZ2xvYmFsJywge1xuXHRlbGVtZW50czoge1xuXHRcdGxpbmU6IHtcblx0XHRcdHRlbnNpb246IDAuNCxcblx0XHRcdGJhY2tncm91bmRDb2xvcjogZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdENvbG9yLFxuXHRcdFx0Ym9yZGVyV2lkdGg6IDMsXG5cdFx0XHRib3JkZXJDb2xvcjogZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdENvbG9yLFxuXHRcdFx0Ym9yZGVyQ2FwU3R5bGU6ICdidXR0Jyxcblx0XHRcdGJvcmRlckRhc2g6IFtdLFxuXHRcdFx0Ym9yZGVyRGFzaE9mZnNldDogMC4wLFxuXHRcdFx0Ym9yZGVySm9pblN0eWxlOiAnbWl0ZXInLFxuXHRcdFx0Y2FwQmV6aWVyUG9pbnRzOiB0cnVlLFxuXHRcdFx0ZmlsbDogdHJ1ZSwgLy8gZG8gd2UgZmlsbCBpbiB0aGUgYXJlYSBiZXR3ZWVuIHRoZSBsaW5lIGFuZCBpdHMgYmFzZSBheGlzXG5cdFx0fVxuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBFbGVtZW50LmV4dGVuZCh7XG5cdGRyYXc6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIHZtID0gbWUuX3ZpZXc7XG5cdFx0dmFyIGN0eCA9IG1lLl9jaGFydC5jdHg7XG5cdFx0dmFyIHNwYW5HYXBzID0gdm0uc3BhbkdhcHM7XG5cdFx0dmFyIHBvaW50cyA9IG1lLl9jaGlsZHJlbi5zbGljZSgpOyAvLyBjbG9uZSBhcnJheVxuXHRcdHZhciBnbG9iYWxPcHRpb25MaW5lRWxlbWVudHMgPSBnbG9iYWxEZWZhdWx0cy5lbGVtZW50cy5saW5lO1xuXHRcdHZhciBsYXN0RHJhd25JbmRleCA9IC0xO1xuXHRcdHZhciBpbmRleCwgY3VycmVudCwgcHJldmlvdXMsIGN1cnJlbnRWTTtcblxuXHRcdC8vIElmIHdlIGFyZSBsb29waW5nLCBhZGRpbmcgdGhlIGZpcnN0IHBvaW50IGFnYWluXG5cdFx0aWYgKG1lLl9sb29wICYmIHBvaW50cy5sZW5ndGgpIHtcblx0XHRcdHBvaW50cy5wdXNoKHBvaW50c1swXSk7XG5cdFx0fVxuXG5cdFx0Y3R4LnNhdmUoKTtcblxuXHRcdC8vIFN0cm9rZSBMaW5lIE9wdGlvbnNcblx0XHRjdHgubGluZUNhcCA9IHZtLmJvcmRlckNhcFN0eWxlIHx8IGdsb2JhbE9wdGlvbkxpbmVFbGVtZW50cy5ib3JkZXJDYXBTdHlsZTtcblxuXHRcdC8vIElFIDkgYW5kIDEwIGRvIG5vdCBzdXBwb3J0IGxpbmUgZGFzaFxuXHRcdGlmIChjdHguc2V0TGluZURhc2gpIHtcblx0XHRcdGN0eC5zZXRMaW5lRGFzaCh2bS5ib3JkZXJEYXNoIHx8IGdsb2JhbE9wdGlvbkxpbmVFbGVtZW50cy5ib3JkZXJEYXNoKTtcblx0XHR9XG5cblx0XHRjdHgubGluZURhc2hPZmZzZXQgPSB2bS5ib3JkZXJEYXNoT2Zmc2V0IHx8IGdsb2JhbE9wdGlvbkxpbmVFbGVtZW50cy5ib3JkZXJEYXNoT2Zmc2V0O1xuXHRcdGN0eC5saW5lSm9pbiA9IHZtLmJvcmRlckpvaW5TdHlsZSB8fCBnbG9iYWxPcHRpb25MaW5lRWxlbWVudHMuYm9yZGVySm9pblN0eWxlO1xuXHRcdGN0eC5saW5lV2lkdGggPSB2bS5ib3JkZXJXaWR0aCB8fCBnbG9iYWxPcHRpb25MaW5lRWxlbWVudHMuYm9yZGVyV2lkdGg7XG5cdFx0Y3R4LnN0cm9rZVN0eWxlID0gdm0uYm9yZGVyQ29sb3IgfHwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdENvbG9yO1xuXG5cdFx0Ly8gU3Ryb2tlIExpbmVcblx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0bGFzdERyYXduSW5kZXggPSAtMTtcblxuXHRcdGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBvaW50cy5sZW5ndGg7ICsraW5kZXgpIHtcblx0XHRcdGN1cnJlbnQgPSBwb2ludHNbaW5kZXhdO1xuXHRcdFx0cHJldmlvdXMgPSBoZWxwZXJzLnByZXZpb3VzSXRlbShwb2ludHMsIGluZGV4KTtcblx0XHRcdGN1cnJlbnRWTSA9IGN1cnJlbnQuX3ZpZXc7XG5cblx0XHRcdC8vIEZpcnN0IHBvaW50IG1vdmVzIHRvIGl0J3Mgc3RhcnRpbmcgcG9zaXRpb24gbm8gbWF0dGVyIHdoYXRcblx0XHRcdGlmIChpbmRleCA9PT0gMCkge1xuXHRcdFx0XHRpZiAoIWN1cnJlbnRWTS5za2lwKSB7XG5cdFx0XHRcdFx0Y3R4Lm1vdmVUbyhjdXJyZW50Vk0ueCwgY3VycmVudFZNLnkpO1xuXHRcdFx0XHRcdGxhc3REcmF3bkluZGV4ID0gaW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHByZXZpb3VzID0gbGFzdERyYXduSW5kZXggPT09IC0xID8gcHJldmlvdXMgOiBwb2ludHNbbGFzdERyYXduSW5kZXhdO1xuXG5cdFx0XHRcdGlmICghY3VycmVudFZNLnNraXApIHtcblx0XHRcdFx0XHRpZiAoKGxhc3REcmF3bkluZGV4ICE9PSAoaW5kZXggLSAxKSAmJiAhc3BhbkdhcHMpIHx8IGxhc3REcmF3bkluZGV4ID09PSAtMSkge1xuXHRcdFx0XHRcdFx0Ly8gVGhlcmUgd2FzIGEgZ2FwIGFuZCB0aGlzIGlzIHRoZSBmaXJzdCBwb2ludCBhZnRlciB0aGUgZ2FwXG5cdFx0XHRcdFx0XHRjdHgubW92ZVRvKGN1cnJlbnRWTS54LCBjdXJyZW50Vk0ueSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdC8vIExpbmUgdG8gbmV4dCBwb2ludFxuXHRcdFx0XHRcdFx0aGVscGVycy5jYW52YXMubGluZVRvKGN0eCwgcHJldmlvdXMuX3ZpZXcsIGN1cnJlbnQuX3ZpZXcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRsYXN0RHJhd25JbmRleCA9IGluZGV4O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y3R4LnN0cm9rZSgpO1xuXHRcdGN0eC5yZXN0b3JlKCk7XG5cdH1cbn0pO1xuXG59LHtcIjI2XCI6MjYsXCIyN1wiOjI3LFwiNDZcIjo0Nn1dLDM5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgyNik7XG52YXIgRWxlbWVudCA9IHJlcXVpcmUoMjcpO1xudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcblxudmFyIGRlZmF1bHRDb2xvciA9IGRlZmF1bHRzLmdsb2JhbC5kZWZhdWx0Q29sb3I7XG5cbmRlZmF1bHRzLl9zZXQoJ2dsb2JhbCcsIHtcblx0ZWxlbWVudHM6IHtcblx0XHRwb2ludDoge1xuXHRcdFx0cmFkaXVzOiAzLFxuXHRcdFx0cG9pbnRTdHlsZTogJ2NpcmNsZScsXG5cdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IGRlZmF1bHRDb2xvcixcblx0XHRcdGJvcmRlckNvbG9yOiBkZWZhdWx0Q29sb3IsXG5cdFx0XHRib3JkZXJXaWR0aDogMSxcblx0XHRcdC8vIEhvdmVyXG5cdFx0XHRoaXRSYWRpdXM6IDEsXG5cdFx0XHRob3ZlclJhZGl1czogNCxcblx0XHRcdGhvdmVyQm9yZGVyV2lkdGg6IDFcblx0XHR9XG5cdH1cbn0pO1xuXG5mdW5jdGlvbiB4UmFuZ2UobW91c2VYKSB7XG5cdHZhciB2bSA9IHRoaXMuX3ZpZXc7XG5cdHJldHVybiB2bSA/IChNYXRoLmFicyhtb3VzZVggLSB2bS54KSA8IHZtLnJhZGl1cyArIHZtLmhpdFJhZGl1cykgOiBmYWxzZTtcbn1cblxuZnVuY3Rpb24geVJhbmdlKG1vdXNlWSkge1xuXHR2YXIgdm0gPSB0aGlzLl92aWV3O1xuXHRyZXR1cm4gdm0gPyAoTWF0aC5hYnMobW91c2VZIC0gdm0ueSkgPCB2bS5yYWRpdXMgKyB2bS5oaXRSYWRpdXMpIDogZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRWxlbWVudC5leHRlbmQoe1xuXHRpblJhbmdlOiBmdW5jdGlvbihtb3VzZVgsIG1vdXNlWSkge1xuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XG5cdFx0cmV0dXJuIHZtID8gKChNYXRoLnBvdyhtb3VzZVggLSB2bS54LCAyKSArIE1hdGgucG93KG1vdXNlWSAtIHZtLnksIDIpKSA8IE1hdGgucG93KHZtLmhpdFJhZGl1cyArIHZtLnJhZGl1cywgMikpIDogZmFsc2U7XG5cdH0sXG5cblx0aW5MYWJlbFJhbmdlOiB4UmFuZ2UsXG5cdGluWFJhbmdlOiB4UmFuZ2UsXG5cdGluWVJhbmdlOiB5UmFuZ2UsXG5cblx0Z2V0Q2VudGVyUG9pbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHg6IHZtLngsXG5cdFx0XHR5OiB2bS55XG5cdFx0fTtcblx0fSxcblxuXHRnZXRBcmVhOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gTWF0aC5QSSAqIE1hdGgucG93KHRoaXMuX3ZpZXcucmFkaXVzLCAyKTtcblx0fSxcblxuXHR0b29sdGlwUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHg6IHZtLngsXG5cdFx0XHR5OiB2bS55LFxuXHRcdFx0cGFkZGluZzogdm0ucmFkaXVzICsgdm0uYm9yZGVyV2lkdGhcblx0XHR9O1xuXHR9LFxuXG5cdGRyYXc6IGZ1bmN0aW9uKGNoYXJ0QXJlYSkge1xuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XG5cdFx0dmFyIG1vZGVsID0gdGhpcy5fbW9kZWw7XG5cdFx0dmFyIGN0eCA9IHRoaXMuX2NoYXJ0LmN0eDtcblx0XHR2YXIgcG9pbnRTdHlsZSA9IHZtLnBvaW50U3R5bGU7XG5cdFx0dmFyIHJvdGF0aW9uID0gdm0ucm90YXRpb247XG5cdFx0dmFyIHJhZGl1cyA9IHZtLnJhZGl1cztcblx0XHR2YXIgeCA9IHZtLng7XG5cdFx0dmFyIHkgPSB2bS55O1xuXHRcdHZhciBlcnJNYXJnaW4gPSAxLjAxOyAvLyAxLjAxIGlzIG1hcmdpbiBmb3IgQWNjdW11bGF0ZWQgZXJyb3IuIChFc3BlY2lhbGx5IEVkZ2UsIElFLilcblxuXHRcdGlmICh2bS5za2lwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2xpcHBpbmcgZm9yIFBvaW50cy5cblx0XHRpZiAoY2hhcnRBcmVhID09PSB1bmRlZmluZWQgfHwgKG1vZGVsLnggPj0gY2hhcnRBcmVhLmxlZnQgJiYgY2hhcnRBcmVhLnJpZ2h0ICogZXJyTWFyZ2luID49IG1vZGVsLnggJiYgbW9kZWwueSA+PSBjaGFydEFyZWEudG9wICYmIGNoYXJ0QXJlYS5ib3R0b20gKiBlcnJNYXJnaW4gPj0gbW9kZWwueSkpIHtcblx0XHRcdGN0eC5zdHJva2VTdHlsZSA9IHZtLmJvcmRlckNvbG9yIHx8IGRlZmF1bHRDb2xvcjtcblx0XHRcdGN0eC5saW5lV2lkdGggPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KHZtLmJvcmRlcldpZHRoLCBkZWZhdWx0cy5nbG9iYWwuZWxlbWVudHMucG9pbnQuYm9yZGVyV2lkdGgpO1xuXHRcdFx0Y3R4LmZpbGxTdHlsZSA9IHZtLmJhY2tncm91bmRDb2xvciB8fCBkZWZhdWx0Q29sb3I7XG5cdFx0XHRoZWxwZXJzLmNhbnZhcy5kcmF3UG9pbnQoY3R4LCBwb2ludFN0eWxlLCByYWRpdXMsIHgsIHksIHJvdGF0aW9uKTtcblx0XHR9XG5cdH1cbn0pO1xuXG59LHtcIjI2XCI6MjYsXCIyN1wiOjI3LFwiNDZcIjo0Nn1dLDQwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgyNik7XG52YXIgRWxlbWVudCA9IHJlcXVpcmUoMjcpO1xuXG5kZWZhdWx0cy5fc2V0KCdnbG9iYWwnLCB7XG5cdGVsZW1lbnRzOiB7XG5cdFx0cmVjdGFuZ2xlOiB7XG5cdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IGRlZmF1bHRzLmdsb2JhbC5kZWZhdWx0Q29sb3IsXG5cdFx0XHRib3JkZXJDb2xvcjogZGVmYXVsdHMuZ2xvYmFsLmRlZmF1bHRDb2xvcixcblx0XHRcdGJvcmRlclNraXBwZWQ6ICdib3R0b20nLFxuXHRcdFx0Ym9yZGVyV2lkdGg6IDBcblx0XHR9XG5cdH1cbn0pO1xuXG5mdW5jdGlvbiBpc1ZlcnRpY2FsKGJhcikge1xuXHRyZXR1cm4gYmFyLl92aWV3LndpZHRoICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgYm91bmRzIG9mIHRoZSBiYXIgcmVnYXJkbGVzcyBvZiB0aGUgb3JpZW50YXRpb25cbiAqIEBwYXJhbSBiYXIge0NoYXJ0LkVsZW1lbnQuUmVjdGFuZ2xlfSB0aGUgYmFyXG4gKiBAcmV0dXJuIHtCb3VuZHN9IGJvdW5kcyBvZiB0aGUgYmFyXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBnZXRCYXJCb3VuZHMoYmFyKSB7XG5cdHZhciB2bSA9IGJhci5fdmlldztcblx0dmFyIHgxLCB4MiwgeTEsIHkyO1xuXG5cdGlmIChpc1ZlcnRpY2FsKGJhcikpIHtcblx0XHQvLyB2ZXJ0aWNhbFxuXHRcdHZhciBoYWxmV2lkdGggPSB2bS53aWR0aCAvIDI7XG5cdFx0eDEgPSB2bS54IC0gaGFsZldpZHRoO1xuXHRcdHgyID0gdm0ueCArIGhhbGZXaWR0aDtcblx0XHR5MSA9IE1hdGgubWluKHZtLnksIHZtLmJhc2UpO1xuXHRcdHkyID0gTWF0aC5tYXgodm0ueSwgdm0uYmFzZSk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gaG9yaXpvbnRhbCBiYXJcblx0XHR2YXIgaGFsZkhlaWdodCA9IHZtLmhlaWdodCAvIDI7XG5cdFx0eDEgPSBNYXRoLm1pbih2bS54LCB2bS5iYXNlKTtcblx0XHR4MiA9IE1hdGgubWF4KHZtLngsIHZtLmJhc2UpO1xuXHRcdHkxID0gdm0ueSAtIGhhbGZIZWlnaHQ7XG5cdFx0eTIgPSB2bS55ICsgaGFsZkhlaWdodDtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0bGVmdDogeDEsXG5cdFx0dG9wOiB5MSxcblx0XHRyaWdodDogeDIsXG5cdFx0Ym90dG9tOiB5MlxuXHR9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEVsZW1lbnQuZXh0ZW5kKHtcblx0ZHJhdzogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGN0eCA9IHRoaXMuX2NoYXJ0LmN0eDtcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xuXHRcdHZhciBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIHNpZ25YLCBzaWduWSwgYm9yZGVyU2tpcHBlZDtcblx0XHR2YXIgYm9yZGVyV2lkdGggPSB2bS5ib3JkZXJXaWR0aDtcblxuXHRcdGlmICghdm0uaG9yaXpvbnRhbCkge1xuXHRcdFx0Ly8gYmFyXG5cdFx0XHRsZWZ0ID0gdm0ueCAtIHZtLndpZHRoIC8gMjtcblx0XHRcdHJpZ2h0ID0gdm0ueCArIHZtLndpZHRoIC8gMjtcblx0XHRcdHRvcCA9IHZtLnk7XG5cdFx0XHRib3R0b20gPSB2bS5iYXNlO1xuXHRcdFx0c2lnblggPSAxO1xuXHRcdFx0c2lnblkgPSBib3R0b20gPiB0b3AgPyAxIDogLTE7XG5cdFx0XHRib3JkZXJTa2lwcGVkID0gdm0uYm9yZGVyU2tpcHBlZCB8fCAnYm90dG9tJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gaG9yaXpvbnRhbCBiYXJcblx0XHRcdGxlZnQgPSB2bS5iYXNlO1xuXHRcdFx0cmlnaHQgPSB2bS54O1xuXHRcdFx0dG9wID0gdm0ueSAtIHZtLmhlaWdodCAvIDI7XG5cdFx0XHRib3R0b20gPSB2bS55ICsgdm0uaGVpZ2h0IC8gMjtcblx0XHRcdHNpZ25YID0gcmlnaHQgPiBsZWZ0ID8gMSA6IC0xO1xuXHRcdFx0c2lnblkgPSAxO1xuXHRcdFx0Ym9yZGVyU2tpcHBlZCA9IHZtLmJvcmRlclNraXBwZWQgfHwgJ2xlZnQnO1xuXHRcdH1cblxuXHRcdC8vIENhbnZhcyBkb2Vzbid0IGFsbG93IHVzIHRvIHN0cm9rZSBpbnNpZGUgdGhlIHdpZHRoIHNvIHdlIGNhblxuXHRcdC8vIGFkanVzdCB0aGUgc2l6ZXMgdG8gZml0IGlmIHdlJ3JlIHNldHRpbmcgYSBzdHJva2Ugb24gdGhlIGxpbmVcblx0XHRpZiAoYm9yZGVyV2lkdGgpIHtcblx0XHRcdC8vIGJvcmRlcldpZHRoIHNob2xkIGJlIGxlc3MgdGhhbiBiYXIgd2lkdGggYW5kIGJhciBoZWlnaHQuXG5cdFx0XHR2YXIgYmFyU2l6ZSA9IE1hdGgubWluKE1hdGguYWJzKGxlZnQgLSByaWdodCksIE1hdGguYWJzKHRvcCAtIGJvdHRvbSkpO1xuXHRcdFx0Ym9yZGVyV2lkdGggPSBib3JkZXJXaWR0aCA+IGJhclNpemUgPyBiYXJTaXplIDogYm9yZGVyV2lkdGg7XG5cdFx0XHR2YXIgaGFsZlN0cm9rZSA9IGJvcmRlcldpZHRoIC8gMjtcblx0XHRcdC8vIEFkanVzdCBib3JkZXJXaWR0aCB3aGVuIGJhciB0b3AgcG9zaXRpb24gaXMgbmVhciB2bS5iYXNlKHplcm8pLlxuXHRcdFx0dmFyIGJvcmRlckxlZnQgPSBsZWZ0ICsgKGJvcmRlclNraXBwZWQgIT09ICdsZWZ0JyA/IGhhbGZTdHJva2UgKiBzaWduWCA6IDApO1xuXHRcdFx0dmFyIGJvcmRlclJpZ2h0ID0gcmlnaHQgKyAoYm9yZGVyU2tpcHBlZCAhPT0gJ3JpZ2h0JyA/IC1oYWxmU3Ryb2tlICogc2lnblggOiAwKTtcblx0XHRcdHZhciBib3JkZXJUb3AgPSB0b3AgKyAoYm9yZGVyU2tpcHBlZCAhPT0gJ3RvcCcgPyBoYWxmU3Ryb2tlICogc2lnblkgOiAwKTtcblx0XHRcdHZhciBib3JkZXJCb3R0b20gPSBib3R0b20gKyAoYm9yZGVyU2tpcHBlZCAhPT0gJ2JvdHRvbScgPyAtaGFsZlN0cm9rZSAqIHNpZ25ZIDogMCk7XG5cdFx0XHQvLyBub3QgYmVjb21lIGEgdmVydGljYWwgbGluZT9cblx0XHRcdGlmIChib3JkZXJMZWZ0ICE9PSBib3JkZXJSaWdodCkge1xuXHRcdFx0XHR0b3AgPSBib3JkZXJUb3A7XG5cdFx0XHRcdGJvdHRvbSA9IGJvcmRlckJvdHRvbTtcblx0XHRcdH1cblx0XHRcdC8vIG5vdCBiZWNvbWUgYSBob3Jpem9udGFsIGxpbmU/XG5cdFx0XHRpZiAoYm9yZGVyVG9wICE9PSBib3JkZXJCb3R0b20pIHtcblx0XHRcdFx0bGVmdCA9IGJvcmRlckxlZnQ7XG5cdFx0XHRcdHJpZ2h0ID0gYm9yZGVyUmlnaHQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdGN0eC5maWxsU3R5bGUgPSB2bS5iYWNrZ3JvdW5kQ29sb3I7XG5cdFx0Y3R4LnN0cm9rZVN0eWxlID0gdm0uYm9yZGVyQ29sb3I7XG5cdFx0Y3R4LmxpbmVXaWR0aCA9IGJvcmRlcldpZHRoO1xuXG5cdFx0Ly8gQ29ybmVyIHBvaW50cywgZnJvbSBib3R0b20tbGVmdCB0byBib3R0b20tcmlnaHQgY2xvY2t3aXNlXG5cdFx0Ly8gfCAxIDIgfFxuXHRcdC8vIHwgMCAzIHxcblx0XHR2YXIgY29ybmVycyA9IFtcblx0XHRcdFtsZWZ0LCBib3R0b21dLFxuXHRcdFx0W2xlZnQsIHRvcF0sXG5cdFx0XHRbcmlnaHQsIHRvcF0sXG5cdFx0XHRbcmlnaHQsIGJvdHRvbV1cblx0XHRdO1xuXG5cdFx0Ly8gRmluZCBmaXJzdCAoc3RhcnRpbmcpIGNvcm5lciB3aXRoIGZhbGxiYWNrIHRvICdib3R0b20nXG5cdFx0dmFyIGJvcmRlcnMgPSBbJ2JvdHRvbScsICdsZWZ0JywgJ3RvcCcsICdyaWdodCddO1xuXHRcdHZhciBzdGFydENvcm5lciA9IGJvcmRlcnMuaW5kZXhPZihib3JkZXJTa2lwcGVkLCAwKTtcblx0XHRpZiAoc3RhcnRDb3JuZXIgPT09IC0xKSB7XG5cdFx0XHRzdGFydENvcm5lciA9IDA7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gY29ybmVyQXQoaW5kZXgpIHtcblx0XHRcdHJldHVybiBjb3JuZXJzWyhzdGFydENvcm5lciArIGluZGV4KSAlIDRdO1xuXHRcdH1cblxuXHRcdC8vIERyYXcgcmVjdGFuZ2xlIGZyb20gJ3N0YXJ0Q29ybmVyJ1xuXHRcdHZhciBjb3JuZXIgPSBjb3JuZXJBdCgwKTtcblx0XHRjdHgubW92ZVRvKGNvcm5lclswXSwgY29ybmVyWzFdKTtcblxuXHRcdGZvciAodmFyIGkgPSAxOyBpIDwgNDsgaSsrKSB7XG5cdFx0XHRjb3JuZXIgPSBjb3JuZXJBdChpKTtcblx0XHRcdGN0eC5saW5lVG8oY29ybmVyWzBdLCBjb3JuZXJbMV0pO1xuXHRcdH1cblxuXHRcdGN0eC5maWxsKCk7XG5cdFx0aWYgKGJvcmRlcldpZHRoKSB7XG5cdFx0XHRjdHguc3Ryb2tlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdGhlaWdodDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHZtID0gdGhpcy5fdmlldztcblx0XHRyZXR1cm4gdm0uYmFzZSAtIHZtLnk7XG5cdH0sXG5cblx0aW5SYW5nZTogZnVuY3Rpb24obW91c2VYLCBtb3VzZVkpIHtcblx0XHR2YXIgaW5SYW5nZSA9IGZhbHNlO1xuXG5cdFx0aWYgKHRoaXMuX3ZpZXcpIHtcblx0XHRcdHZhciBib3VuZHMgPSBnZXRCYXJCb3VuZHModGhpcyk7XG5cdFx0XHRpblJhbmdlID0gbW91c2VYID49IGJvdW5kcy5sZWZ0ICYmIG1vdXNlWCA8PSBib3VuZHMucmlnaHQgJiYgbW91c2VZID49IGJvdW5kcy50b3AgJiYgbW91c2VZIDw9IGJvdW5kcy5ib3R0b207XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGluUmFuZ2U7XG5cdH0sXG5cblx0aW5MYWJlbFJhbmdlOiBmdW5jdGlvbihtb3VzZVgsIG1vdXNlWSkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0aWYgKCFtZS5fdmlldykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHZhciBpblJhbmdlID0gZmFsc2U7XG5cdFx0dmFyIGJvdW5kcyA9IGdldEJhckJvdW5kcyhtZSk7XG5cblx0XHRpZiAoaXNWZXJ0aWNhbChtZSkpIHtcblx0XHRcdGluUmFuZ2UgPSBtb3VzZVggPj0gYm91bmRzLmxlZnQgJiYgbW91c2VYIDw9IGJvdW5kcy5yaWdodDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aW5SYW5nZSA9IG1vdXNlWSA+PSBib3VuZHMudG9wICYmIG1vdXNlWSA8PSBib3VuZHMuYm90dG9tO1xuXHRcdH1cblxuXHRcdHJldHVybiBpblJhbmdlO1xuXHR9LFxuXG5cdGluWFJhbmdlOiBmdW5jdGlvbihtb3VzZVgpIHtcblx0XHR2YXIgYm91bmRzID0gZ2V0QmFyQm91bmRzKHRoaXMpO1xuXHRcdHJldHVybiBtb3VzZVggPj0gYm91bmRzLmxlZnQgJiYgbW91c2VYIDw9IGJvdW5kcy5yaWdodDtcblx0fSxcblxuXHRpbllSYW5nZTogZnVuY3Rpb24obW91c2VZKSB7XG5cdFx0dmFyIGJvdW5kcyA9IGdldEJhckJvdW5kcyh0aGlzKTtcblx0XHRyZXR1cm4gbW91c2VZID49IGJvdW5kcy50b3AgJiYgbW91c2VZIDw9IGJvdW5kcy5ib3R0b207XG5cdH0sXG5cblx0Z2V0Q2VudGVyUG9pbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XG5cdFx0dmFyIHgsIHk7XG5cdFx0aWYgKGlzVmVydGljYWwodGhpcykpIHtcblx0XHRcdHggPSB2bS54O1xuXHRcdFx0eSA9ICh2bS55ICsgdm0uYmFzZSkgLyAyO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR4ID0gKHZtLnggKyB2bS5iYXNlKSAvIDI7XG5cdFx0XHR5ID0gdm0ueTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge3g6IHgsIHk6IHl9O1xuXHR9LFxuXG5cdGdldEFyZWE6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XG5cdFx0cmV0dXJuIHZtLndpZHRoICogTWF0aC5hYnModm0ueSAtIHZtLmJhc2UpO1xuXHR9LFxuXG5cdHRvb2x0aXBQb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHZtID0gdGhpcy5fdmlldztcblx0XHRyZXR1cm4ge1xuXHRcdFx0eDogdm0ueCxcblx0XHRcdHk6IHZtLnlcblx0XHR9O1xuXHR9XG59KTtcblxufSx7XCIyNlwiOjI2LFwiMjdcIjoyN31dLDQxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7fTtcbm1vZHVsZS5leHBvcnRzLkFyYyA9IHJlcXVpcmUoMzcpO1xubW9kdWxlLmV4cG9ydHMuTGluZSA9IHJlcXVpcmUoMzgpO1xubW9kdWxlLmV4cG9ydHMuUG9pbnQgPSByZXF1aXJlKDM5KTtcbm1vZHVsZS5leHBvcnRzLlJlY3RhbmdsZSA9IHJlcXVpcmUoNDApO1xuXG59LHtcIjM3XCI6MzcsXCIzOFwiOjM4LFwiMzlcIjozOSxcIjQwXCI6NDB9XSw0MjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Myk7XG5cbi8qKlxuICogQG5hbWVzcGFjZSBDaGFydC5oZWxwZXJzLmNhbnZhc1xuICovXG52YXIgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0ge1xuXHQvKipcblx0ICogQ2xlYXJzIHRoZSBlbnRpcmUgY2FudmFzIGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIGBjaGFydGAuXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gVGhlIGNoYXJ0IGZvciB3aGljaCB0byBjbGVhciB0aGUgY2FudmFzLlxuXHQgKi9cblx0Y2xlYXI6IGZ1bmN0aW9uKGNoYXJ0KSB7XG5cdFx0Y2hhcnQuY3R4LmNsZWFyUmVjdCgwLCAwLCBjaGFydC53aWR0aCwgY2hhcnQuaGVpZ2h0KTtcblx0fSxcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIFwicGF0aFwiIGZvciBhIHJlY3RhbmdsZSB3aXRoIHJvdW5kZWQgY29ybmVycyBhdCBwb3NpdGlvbiAoeCwgeSkgd2l0aCBhXG5cdCAqIGdpdmVuIHNpemUgKHdpZHRoLCBoZWlnaHQpIGFuZCB0aGUgc2FtZSBgcmFkaXVzYCBmb3IgYWxsIGNvcm5lcnMuXG5cdCAqIEBwYXJhbSB7Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEfSBjdHggLSBUaGUgY2FudmFzIDJEIENvbnRleHQuXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB4IC0gVGhlIHggYXhpcyBvZiB0aGUgY29vcmRpbmF0ZSBmb3IgdGhlIHJlY3RhbmdsZSBzdGFydGluZyBwb2ludC5cblx0ICogQHBhcmFtIHtOdW1iZXJ9IHkgLSBUaGUgeSBheGlzIG9mIHRoZSBjb29yZGluYXRlIGZvciB0aGUgcmVjdGFuZ2xlIHN0YXJ0aW5nIHBvaW50LlxuXHQgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgcmVjdGFuZ2xlJ3Mgd2lkdGguXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgcmVjdGFuZ2xlJ3MgaGVpZ2h0LlxuXHQgKiBAcGFyYW0ge051bWJlcn0gcmFkaXVzIC0gVGhlIHJvdW5kZWQgYW1vdW50IChpbiBwaXhlbHMpIGZvciB0aGUgZm91ciBjb3JuZXJzLlxuXHQgKiBAdG9kbyBoYW5kbGUgYHJhZGl1c2AgYXMgdG9wLWxlZnQsIHRvcC1yaWdodCwgYm90dG9tLXJpZ2h0LCBib3R0b20tbGVmdCBhcnJheS9vYmplY3Q/XG5cdCAqL1xuXHRyb3VuZGVkUmVjdDogZnVuY3Rpb24oY3R4LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMpIHtcblx0XHRpZiAocmFkaXVzKSB7XG5cdFx0XHQvLyBOT1RFKFNCKSBgZXBzaWxvbmAgaGVscHMgdG8gcHJldmVudCBtaW5vciBhcnRpZmFjdHMgYXBwZWFyaW5nXG5cdFx0XHQvLyBvbiBDaHJvbWUgd2hlbiBgcmAgaXMgZXhhY3RseSBoYWxmIHRoZSBoZWlnaHQgb3IgdGhlIHdpZHRoLlxuXHRcdFx0dmFyIGVwc2lsb24gPSAwLjAwMDAwMDE7XG5cdFx0XHR2YXIgciA9IE1hdGgubWluKHJhZGl1cywgKGhlaWdodCAvIDIpIC0gZXBzaWxvbiwgKHdpZHRoIC8gMikgLSBlcHNpbG9uKTtcblxuXHRcdFx0Y3R4Lm1vdmVUbyh4ICsgciwgeSk7XG5cdFx0XHRjdHgubGluZVRvKHggKyB3aWR0aCAtIHIsIHkpO1xuXHRcdFx0Y3R4LmFyY1RvKHggKyB3aWR0aCwgeSwgeCArIHdpZHRoLCB5ICsgciwgcik7XG5cdFx0XHRjdHgubGluZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCAtIHIpO1xuXHRcdFx0Y3R4LmFyY1RvKHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCArIHdpZHRoIC0gciwgeSArIGhlaWdodCwgcik7XG5cdFx0XHRjdHgubGluZVRvKHggKyByLCB5ICsgaGVpZ2h0KTtcblx0XHRcdGN0eC5hcmNUbyh4LCB5ICsgaGVpZ2h0LCB4LCB5ICsgaGVpZ2h0IC0gciwgcik7XG5cdFx0XHRjdHgubGluZVRvKHgsIHkgKyByKTtcblx0XHRcdGN0eC5hcmNUbyh4LCB5LCB4ICsgciwgeSwgcik7XG5cdFx0XHRjdHguY2xvc2VQYXRoKCk7XG5cdFx0XHRjdHgubW92ZVRvKHgsIHkpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjdHgucmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcblx0XHR9XG5cdH0sXG5cblx0ZHJhd1BvaW50OiBmdW5jdGlvbihjdHgsIHN0eWxlLCByYWRpdXMsIHgsIHksIHJvdGF0aW9uKSB7XG5cdFx0dmFyIHR5cGUsIGVkZ2VMZW5ndGgsIHhPZmZzZXQsIHlPZmZzZXQsIGhlaWdodCwgc2l6ZTtcblx0XHRyb3RhdGlvbiA9IHJvdGF0aW9uIHx8IDA7XG5cblx0XHRpZiAoc3R5bGUgJiYgdHlwZW9mIHN0eWxlID09PSAnb2JqZWN0Jykge1xuXHRcdFx0dHlwZSA9IHN0eWxlLnRvU3RyaW5nKCk7XG5cdFx0XHRpZiAodHlwZSA9PT0gJ1tvYmplY3QgSFRNTEltYWdlRWxlbWVudF0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEhUTUxDYW52YXNFbGVtZW50XScpIHtcblx0XHRcdFx0Y3R4LmRyYXdJbWFnZShzdHlsZSwgeCAtIHN0eWxlLndpZHRoIC8gMiwgeSAtIHN0eWxlLmhlaWdodCAvIDIsIHN0eWxlLndpZHRoLCBzdHlsZS5oZWlnaHQpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGlzTmFOKHJhZGl1cykgfHwgcmFkaXVzIDw9IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjdHguc2F2ZSgpO1xuXHRcdGN0eC50cmFuc2xhdGUoeCwgeSk7XG5cdFx0Y3R4LnJvdGF0ZShyb3RhdGlvbiAqIE1hdGguUEkgLyAxODApO1xuXHRcdGN0eC5iZWdpblBhdGgoKTtcblxuXHRcdHN3aXRjaCAoc3R5bGUpIHtcblx0XHQvLyBEZWZhdWx0IGluY2x1ZGVzIGNpcmNsZVxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRjdHguYXJjKDAsIDAsIHJhZGl1cywgMCwgTWF0aC5QSSAqIDIpO1xuXHRcdFx0Y3R4LmNsb3NlUGF0aCgpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAndHJpYW5nbGUnOlxuXHRcdFx0ZWRnZUxlbmd0aCA9IDMgKiByYWRpdXMgLyBNYXRoLnNxcnQoMyk7XG5cdFx0XHRoZWlnaHQgPSBlZGdlTGVuZ3RoICogTWF0aC5zcXJ0KDMpIC8gMjtcblx0XHRcdGN0eC5tb3ZlVG8oLWVkZ2VMZW5ndGggLyAyLCBoZWlnaHQgLyAzKTtcblx0XHRcdGN0eC5saW5lVG8oZWRnZUxlbmd0aCAvIDIsIGhlaWdodCAvIDMpO1xuXHRcdFx0Y3R4LmxpbmVUbygwLCAtMiAqIGhlaWdodCAvIDMpO1xuXHRcdFx0Y3R4LmNsb3NlUGF0aCgpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAncmVjdCc6XG5cdFx0XHRzaXplID0gMSAvIE1hdGguU1FSVDIgKiByYWRpdXM7XG5cdFx0XHRjdHgucmVjdCgtc2l6ZSwgLXNpemUsIDIgKiBzaXplLCAyICogc2l6ZSk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdyZWN0Um91bmRlZCc6XG5cdFx0XHR2YXIgb2Zmc2V0ID0gcmFkaXVzIC8gTWF0aC5TUVJUMjtcblx0XHRcdHZhciBsZWZ0WCA9IC1vZmZzZXQ7XG5cdFx0XHR2YXIgdG9wWSA9IC1vZmZzZXQ7XG5cdFx0XHR2YXIgc2lkZVNpemUgPSBNYXRoLlNRUlQyICogcmFkaXVzO1xuXG5cdFx0XHQvLyBOT1RFKFNCKSB0aGUgcm91bmRlZCByZWN0IGltcGxlbWVudGF0aW9uIGNoYW5nZWQgdG8gdXNlIGBhcmNUb2Bcblx0XHRcdC8vIGluc3RlYWQgb2YgYHF1YWRyYXRpY0N1cnZlVG9gIHNpbmNlIGl0IGdlbmVyYXRlcyBiZXR0ZXIgcmVzdWx0c1xuXHRcdFx0Ly8gd2hlbiByZWN0IGlzIGFsbW9zdCBhIGNpcmNsZS4gMC40MjUgKGluc3RlYWQgb2YgMC41KSBwcm9kdWNlc1xuXHRcdFx0Ly8gcmVzdWx0cyB2aXN1YWxseSBjbG9zZXIgdG8gdGhlIHByZXZpb3VzIGltcGwuXG5cdFx0XHR0aGlzLnJvdW5kZWRSZWN0KGN0eCwgbGVmdFgsIHRvcFksIHNpZGVTaXplLCBzaWRlU2l6ZSwgcmFkaXVzICogMC40MjUpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAncmVjdFJvdCc6XG5cdFx0XHRzaXplID0gMSAvIE1hdGguU1FSVDIgKiByYWRpdXM7XG5cdFx0XHRjdHgubW92ZVRvKC1zaXplLCAwKTtcblx0XHRcdGN0eC5saW5lVG8oMCwgc2l6ZSk7XG5cdFx0XHRjdHgubGluZVRvKHNpemUsIDApO1xuXHRcdFx0Y3R4LmxpbmVUbygwLCAtc2l6ZSk7XG5cdFx0XHRjdHguY2xvc2VQYXRoKCk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdjcm9zcyc6XG5cdFx0XHRjdHgubW92ZVRvKDAsIHJhZGl1cyk7XG5cdFx0XHRjdHgubGluZVRvKDAsIC1yYWRpdXMpO1xuXHRcdFx0Y3R4Lm1vdmVUbygtcmFkaXVzLCAwKTtcblx0XHRcdGN0eC5saW5lVG8ocmFkaXVzLCAwKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ2Nyb3NzUm90Jzpcblx0XHRcdHhPZmZzZXQgPSBNYXRoLmNvcyhNYXRoLlBJIC8gNCkgKiByYWRpdXM7XG5cdFx0XHR5T2Zmc2V0ID0gTWF0aC5zaW4oTWF0aC5QSSAvIDQpICogcmFkaXVzO1xuXHRcdFx0Y3R4Lm1vdmVUbygteE9mZnNldCwgLXlPZmZzZXQpO1xuXHRcdFx0Y3R4LmxpbmVUbyh4T2Zmc2V0LCB5T2Zmc2V0KTtcblx0XHRcdGN0eC5tb3ZlVG8oLXhPZmZzZXQsIHlPZmZzZXQpO1xuXHRcdFx0Y3R4LmxpbmVUbyh4T2Zmc2V0LCAteU9mZnNldCk7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdzdGFyJzpcblx0XHRcdGN0eC5tb3ZlVG8oMCwgcmFkaXVzKTtcblx0XHRcdGN0eC5saW5lVG8oMCwgLXJhZGl1cyk7XG5cdFx0XHRjdHgubW92ZVRvKC1yYWRpdXMsIDApO1xuXHRcdFx0Y3R4LmxpbmVUbyhyYWRpdXMsIDApO1xuXHRcdFx0eE9mZnNldCA9IE1hdGguY29zKE1hdGguUEkgLyA0KSAqIHJhZGl1cztcblx0XHRcdHlPZmZzZXQgPSBNYXRoLnNpbihNYXRoLlBJIC8gNCkgKiByYWRpdXM7XG5cdFx0XHRjdHgubW92ZVRvKC14T2Zmc2V0LCAteU9mZnNldCk7XG5cdFx0XHRjdHgubGluZVRvKHhPZmZzZXQsIHlPZmZzZXQpO1xuXHRcdFx0Y3R4Lm1vdmVUbygteE9mZnNldCwgeU9mZnNldCk7XG5cdFx0XHRjdHgubGluZVRvKHhPZmZzZXQsIC15T2Zmc2V0KTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ2xpbmUnOlxuXHRcdFx0Y3R4Lm1vdmVUbygtcmFkaXVzLCAwKTtcblx0XHRcdGN0eC5saW5lVG8ocmFkaXVzLCAwKTtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJ2Rhc2gnOlxuXHRcdFx0Y3R4Lm1vdmVUbygwLCAwKTtcblx0XHRcdGN0eC5saW5lVG8ocmFkaXVzLCAwKTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdGN0eC5maWxsKCk7XG5cdFx0Y3R4LnN0cm9rZSgpO1xuXHRcdGN0eC5yZXN0b3JlKCk7XG5cdH0sXG5cblx0Y2xpcEFyZWE6IGZ1bmN0aW9uKGN0eCwgYXJlYSkge1xuXHRcdGN0eC5zYXZlKCk7XG5cdFx0Y3R4LmJlZ2luUGF0aCgpO1xuXHRcdGN0eC5yZWN0KGFyZWEubGVmdCwgYXJlYS50b3AsIGFyZWEucmlnaHQgLSBhcmVhLmxlZnQsIGFyZWEuYm90dG9tIC0gYXJlYS50b3ApO1xuXHRcdGN0eC5jbGlwKCk7XG5cdH0sXG5cblx0dW5jbGlwQXJlYTogZnVuY3Rpb24oY3R4KSB7XG5cdFx0Y3R4LnJlc3RvcmUoKTtcblx0fSxcblxuXHRsaW5lVG86IGZ1bmN0aW9uKGN0eCwgcHJldmlvdXMsIHRhcmdldCwgZmxpcCkge1xuXHRcdGlmICh0YXJnZXQuc3RlcHBlZExpbmUpIHtcblx0XHRcdGlmICgodGFyZ2V0LnN0ZXBwZWRMaW5lID09PSAnYWZ0ZXInICYmICFmbGlwKSB8fCAodGFyZ2V0LnN0ZXBwZWRMaW5lICE9PSAnYWZ0ZXInICYmIGZsaXApKSB7XG5cdFx0XHRcdGN0eC5saW5lVG8ocHJldmlvdXMueCwgdGFyZ2V0LnkpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3R4LmxpbmVUbyh0YXJnZXQueCwgcHJldmlvdXMueSk7XG5cdFx0XHR9XG5cdFx0XHRjdHgubGluZVRvKHRhcmdldC54LCB0YXJnZXQueSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCF0YXJnZXQudGVuc2lvbikge1xuXHRcdFx0Y3R4LmxpbmVUbyh0YXJnZXQueCwgdGFyZ2V0LnkpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGN0eC5iZXppZXJDdXJ2ZVRvKFxuXHRcdFx0ZmxpcCA/IHByZXZpb3VzLmNvbnRyb2xQb2ludFByZXZpb3VzWCA6IHByZXZpb3VzLmNvbnRyb2xQb2ludE5leHRYLFxuXHRcdFx0ZmxpcCA/IHByZXZpb3VzLmNvbnRyb2xQb2ludFByZXZpb3VzWSA6IHByZXZpb3VzLmNvbnRyb2xQb2ludE5leHRZLFxuXHRcdFx0ZmxpcCA/IHRhcmdldC5jb250cm9sUG9pbnROZXh0WCA6IHRhcmdldC5jb250cm9sUG9pbnRQcmV2aW91c1gsXG5cdFx0XHRmbGlwID8gdGFyZ2V0LmNvbnRyb2xQb2ludE5leHRZIDogdGFyZ2V0LmNvbnRyb2xQb2ludFByZXZpb3VzWSxcblx0XHRcdHRhcmdldC54LFxuXHRcdFx0dGFyZ2V0LnkpO1xuXHR9XG59O1xuXG4vLyBERVBSRUNBVElPTlNcblxuLyoqXG4gKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdXNlIENoYXJ0LmhlbHBlcnMuY2FudmFzLmNsZWFyIGluc3RlYWQuXG4gKiBAbmFtZXNwYWNlIENoYXJ0LmhlbHBlcnMuY2xlYXJcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi43LjBcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcbiAqIEBwcml2YXRlXG4gKi9cbmhlbHBlcnMuY2xlYXIgPSBleHBvcnRzLmNsZWFyO1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB1c2UgQ2hhcnQuaGVscGVycy5jYW52YXMucm91bmRlZFJlY3QgaW5zdGVhZC5cbiAqIEBuYW1lc3BhY2UgQ2hhcnQuaGVscGVycy5kcmF3Um91bmRlZFJlY3RhbmdsZVxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjcuMFxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuICogQHByaXZhdGVcbiAqL1xuaGVscGVycy5kcmF3Um91bmRlZFJlY3RhbmdsZSA9IGZ1bmN0aW9uKGN0eCkge1xuXHRjdHguYmVnaW5QYXRoKCk7XG5cdGV4cG9ydHMucm91bmRlZFJlY3QuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKTtcbn07XG5cbn0se1wiNDNcIjo0M31dLDQzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAbmFtZXNwYWNlIENoYXJ0LmhlbHBlcnNcbiAqL1xudmFyIGhlbHBlcnMgPSB7XG5cdC8qKlxuXHQgKiBBbiBlbXB0eSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgZm9yIG9wdGlvbmFsIGNhbGxiYWNrLlxuXHQgKi9cblx0bm9vcDogZnVuY3Rpb24oKSB7fSxcblxuXHQvKipcblx0ICogUmV0dXJucyBhIHVuaXF1ZSBpZCwgc2VxdWVudGlhbGx5IGdlbmVyYXRlZCBmcm9tIGEgZ2xvYmFsIHZhcmlhYmxlLlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfVxuXHQgKiBAZnVuY3Rpb25cblx0ICovXG5cdHVpZDogKGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpZCA9IDA7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGlkKys7XG5cdFx0fTtcblx0fSgpKSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgbmVpdGhlciBudWxsIG5vciB1bmRlZmluZWQsIGVsc2UgcmV0dXJucyBmYWxzZS5cblx0ICogQHBhcmFtIHsqfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB0ZXN0LlxuXHQgKiBAcmV0dXJucyB7Qm9vbGVhbn1cblx0ICogQHNpbmNlIDIuNy4wXG5cdCAqL1xuXHRpc051bGxPclVuZGVmOiBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSByZXR1cm5zIGZhbHNlLlxuXHQgKiBAcGFyYW0geyp9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHRlc3QuXG5cdCAqIEByZXR1cm5zIHtCb29sZWFufVxuXHQgKiBAZnVuY3Rpb25cblx0ICovXG5cdGlzQXJyYXk6IEFycmF5LmlzQXJyYXkgPyBBcnJheS5pc0FycmF5IDogZnVuY3Rpb24odmFsdWUpIHtcblx0XHRyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcblx0fSxcblxuXHQvKipcblx0ICogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0IChleGNsdWRpbmcgbnVsbCksIGVsc2UgcmV0dXJucyBmYWxzZS5cblx0ICogQHBhcmFtIHsqfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB0ZXN0LlxuXHQgKiBAcmV0dXJucyB7Qm9vbGVhbn1cblx0ICogQHNpbmNlIDIuNy4wXG5cdCAqL1xuXHRpc09iamVjdDogZnVuY3Rpb24odmFsdWUpIHtcblx0XHRyZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgYHZhbHVlYCBpZiBkZWZpbmVkLCBlbHNlIHJldHVybnMgYGRlZmF1bHRWYWx1ZWAuXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gcmV0dXJuIGlmIGRlZmluZWQuXG5cdCAqIEBwYXJhbSB7Kn0gZGVmYXVsdFZhbHVlIC0gVGhlIHZhbHVlIHRvIHJldHVybiBpZiBgdmFsdWVgIGlzIHVuZGVmaW5lZC5cblx0ICogQHJldHVybnMgeyp9XG5cdCAqL1xuXHR2YWx1ZU9yRGVmYXVsdDogZnVuY3Rpb24odmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xuXHRcdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnID8gZGVmYXVsdFZhbHVlIDogdmFsdWU7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdmFsdWUgYXQgdGhlIGdpdmVuIGBpbmRleGAgaW4gYXJyYXkgaWYgZGVmaW5lZCwgZWxzZSByZXR1cm5zIGBkZWZhdWx0VmFsdWVgLlxuXHQgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZSAtIFRoZSBhcnJheSB0byBsb29rdXAgZm9yIHZhbHVlIGF0IGBpbmRleGAuXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBpbmRleCAtIFRoZSBpbmRleCBpbiBgdmFsdWVgIHRvIGxvb2t1cCBmb3IgdmFsdWUuXG5cdCAqIEBwYXJhbSB7Kn0gZGVmYXVsdFZhbHVlIC0gVGhlIHZhbHVlIHRvIHJldHVybiBpZiBgdmFsdWVbaW5kZXhdYCBpcyB1bmRlZmluZWQuXG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKi9cblx0dmFsdWVBdEluZGV4T3JEZWZhdWx0OiBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGRlZmF1bHRWYWx1ZSkge1xuXHRcdHJldHVybiBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KGhlbHBlcnMuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZVtpbmRleF0gOiB2YWx1ZSwgZGVmYXVsdFZhbHVlKTtcblx0fSxcblxuXHQvKipcblx0ICogQ2FsbHMgYGZuYCB3aXRoIHRoZSBnaXZlbiBgYXJnc2AgaW4gdGhlIHNjb3BlIGRlZmluZWQgYnkgYHRoaXNBcmdgIGFuZCByZXR1cm5zIHRoZVxuXHQgKiB2YWx1ZSByZXR1cm5lZCBieSBgZm5gLiBJZiBgZm5gIGlzIG5vdCBhIGZ1bmN0aW9uLCB0aGlzIG1ldGhvZCByZXR1cm5zIHVuZGVmaW5lZC5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gY2FsbC5cblx0ICogQHBhcmFtIHtBcnJheXx1bmRlZmluZWR8bnVsbH0gYXJncyAtIFRoZSBhcmd1bWVudHMgd2l0aCB3aGljaCBgZm5gIHNob3VsZCBiZSBjYWxsZWQuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbdGhpc0FyZ10gLSBUaGUgdmFsdWUgb2YgYHRoaXNgIHByb3ZpZGVkIGZvciB0aGUgY2FsbCB0byBgZm5gLlxuXHQgKiBAcmV0dXJucyB7Kn1cblx0ICovXG5cdGNhbGxiYWNrOiBmdW5jdGlvbihmbiwgYXJncywgdGhpc0FyZykge1xuXHRcdGlmIChmbiAmJiB0eXBlb2YgZm4uY2FsbCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0cmV0dXJuIGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuXHRcdH1cblx0fSxcblxuXHQvKipcblx0ICogTm90ZShTQikgZm9yIHBlcmZvcm1hbmNlIHNha2UsIHRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBsb29wYWJsZSB0eXBlXG5cdCAqIGlzIHVua25vd24gb3IgaW4gbm9uZSBpbnRlbnNpdmUgY29kZSAobm90IGNhbGxlZCBvZnRlbiBhbmQgc21hbGwgbG9vcGFibGUpLiBFbHNlXG5cdCAqIGl0J3MgcHJlZmVyYWJsZSB0byB1c2UgYSByZWd1bGFyIGZvcigpIGxvb3AgYW5kIHNhdmUgZXh0cmEgZnVuY3Rpb24gY2FsbHMuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBsb29wYWJsZSAtIFRoZSBvYmplY3Qgb3IgYXJyYXkgdG8gYmUgaXRlcmF0ZWQuXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggaXRlbS5cblx0ICogQHBhcmFtIHtPYmplY3R9IFt0aGlzQXJnXSAtIFRoZSB2YWx1ZSBvZiBgdGhpc2AgcHJvdmlkZWQgZm9yIHRoZSBjYWxsIHRvIGBmbmAuXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3JldmVyc2VdIC0gSWYgdHJ1ZSwgaXRlcmF0ZXMgYmFja3dhcmQgb24gdGhlIGxvb3BhYmxlLlxuXHQgKi9cblx0ZWFjaDogZnVuY3Rpb24obG9vcGFibGUsIGZuLCB0aGlzQXJnLCByZXZlcnNlKSB7XG5cdFx0dmFyIGksIGxlbiwga2V5cztcblx0XHRpZiAoaGVscGVycy5pc0FycmF5KGxvb3BhYmxlKSkge1xuXHRcdFx0bGVuID0gbG9vcGFibGUubGVuZ3RoO1xuXHRcdFx0aWYgKHJldmVyc2UpIHtcblx0XHRcdFx0Zm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0XHRcdFx0XHRmbi5jYWxsKHRoaXNBcmcsIGxvb3BhYmxlW2ldLCBpKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRcdFx0Zm4uY2FsbCh0aGlzQXJnLCBsb29wYWJsZVtpXSwgaSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKGhlbHBlcnMuaXNPYmplY3QobG9vcGFibGUpKSB7XG5cdFx0XHRrZXlzID0gT2JqZWN0LmtleXMobG9vcGFibGUpO1xuXHRcdFx0bGVuID0ga2V5cy5sZW5ndGg7XG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0Zm4uY2FsbCh0aGlzQXJnLCBsb29wYWJsZVtrZXlzW2ldXSwga2V5c1tpXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGBhMGAgYW5kIGBhMWAgYXJyYXlzIGhhdmUgdGhlIHNhbWUgY29udGVudCwgZWxzZSByZXR1cm5zIGZhbHNlLlxuXHQgKiBAc2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE0ODUzOTc0XG5cdCAqIEBwYXJhbSB7QXJyYXl9IGEwIC0gVGhlIGFycmF5IHRvIGNvbXBhcmVcblx0ICogQHBhcmFtIHtBcnJheX0gYTEgLSBUaGUgYXJyYXkgdG8gY29tcGFyZVxuXHQgKiBAcmV0dXJucyB7Qm9vbGVhbn1cblx0ICovXG5cdGFycmF5RXF1YWxzOiBmdW5jdGlvbihhMCwgYTEpIHtcblx0XHR2YXIgaSwgaWxlbiwgdjAsIHYxO1xuXG5cdFx0aWYgKCFhMCB8fCAhYTEgfHwgYTAubGVuZ3RoICE9PSBhMS5sZW5ndGgpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBpbGVuID0gYTAubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHR2MCA9IGEwW2ldO1xuXHRcdFx0djEgPSBhMVtpXTtcblxuXHRcdFx0aWYgKHYwIGluc3RhbmNlb2YgQXJyYXkgJiYgdjEgaW5zdGFuY2VvZiBBcnJheSkge1xuXHRcdFx0XHRpZiAoIWhlbHBlcnMuYXJyYXlFcXVhbHModjAsIHYxKSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmICh2MCAhPT0gdjEpIHtcblx0XHRcdFx0Ly8gTk9URTogdHdvIGRpZmZlcmVudCBvYmplY3QgaW5zdGFuY2VzIHdpbGwgbmV2ZXIgYmUgZXF1YWw6IHt4OjIwfSAhPSB7eDoyMH1cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgZGVlcCBjb3B5IG9mIGBzb3VyY2VgIHdpdGhvdXQga2VlcGluZyByZWZlcmVuY2VzIG9uIG9iamVjdHMgYW5kIGFycmF5cy5cblx0ICogQHBhcmFtIHsqfSBzb3VyY2UgLSBUaGUgdmFsdWUgdG8gY2xvbmUuXG5cdCAqIEByZXR1cm5zIHsqfVxuXHQgKi9cblx0Y2xvbmU6IGZ1bmN0aW9uKHNvdXJjZSkge1xuXHRcdGlmIChoZWxwZXJzLmlzQXJyYXkoc291cmNlKSkge1xuXHRcdFx0cmV0dXJuIHNvdXJjZS5tYXAoaGVscGVycy5jbG9uZSk7XG5cdFx0fVxuXG5cdFx0aWYgKGhlbHBlcnMuaXNPYmplY3Qoc291cmNlKSkge1xuXHRcdFx0dmFyIHRhcmdldCA9IHt9O1xuXHRcdFx0dmFyIGtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuXHRcdFx0dmFyIGtsZW4gPSBrZXlzLmxlbmd0aDtcblx0XHRcdHZhciBrID0gMDtcblxuXHRcdFx0Zm9yICg7IGsgPCBrbGVuOyArK2spIHtcblx0XHRcdFx0dGFyZ2V0W2tleXNba11dID0gaGVscGVycy5jbG9uZShzb3VyY2Vba2V5c1trXV0pO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0O1xuXHRcdH1cblxuXHRcdHJldHVybiBzb3VyY2U7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFRoZSBkZWZhdWx0IG1lcmdlciB3aGVuIENoYXJ0LmhlbHBlcnMubWVyZ2UgaXMgY2FsbGVkIHdpdGhvdXQgbWVyZ2VyIG9wdGlvbi5cblx0ICogTm90ZShTQik6IHRoaXMgbWV0aG9kIGlzIGFsc28gdXNlZCBieSBjb25maWdNZXJnZSBhbmQgc2NhbGVNZXJnZSBhcyBmYWxsYmFjay5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9tZXJnZXI6IGZ1bmN0aW9uKGtleSwgdGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpIHtcblx0XHR2YXIgdHZhbCA9IHRhcmdldFtrZXldO1xuXHRcdHZhciBzdmFsID0gc291cmNlW2tleV07XG5cblx0XHRpZiAoaGVscGVycy5pc09iamVjdCh0dmFsKSAmJiBoZWxwZXJzLmlzT2JqZWN0KHN2YWwpKSB7XG5cdFx0XHRoZWxwZXJzLm1lcmdlKHR2YWwsIHN2YWwsIG9wdGlvbnMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0YXJnZXRba2V5XSA9IGhlbHBlcnMuY2xvbmUoc3ZhbCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBNZXJnZXMgc291cmNlW2tleV0gaW4gdGFyZ2V0W2tleV0gb25seSBpZiB0YXJnZXRba2V5XSBpcyB1bmRlZmluZWQuXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfbWVyZ2VySWY6IGZ1bmN0aW9uKGtleSwgdGFyZ2V0LCBzb3VyY2UpIHtcblx0XHR2YXIgdHZhbCA9IHRhcmdldFtrZXldO1xuXHRcdHZhciBzdmFsID0gc291cmNlW2tleV07XG5cblx0XHRpZiAoaGVscGVycy5pc09iamVjdCh0dmFsKSAmJiBoZWxwZXJzLmlzT2JqZWN0KHN2YWwpKSB7XG5cdFx0XHRoZWxwZXJzLm1lcmdlSWYodHZhbCwgc3ZhbCk7XG5cdFx0fSBlbHNlIGlmICghdGFyZ2V0Lmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRcdHRhcmdldFtrZXldID0gaGVscGVycy5jbG9uZShzdmFsKTtcblx0XHR9XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlY3Vyc2l2ZWx5IGRlZXAgY29waWVzIGBzb3VyY2VgIHByb3BlcnRpZXMgaW50byBgdGFyZ2V0YCB3aXRoIHRoZSBnaXZlbiBgb3B0aW9uc2AuXG5cdCAqIElNUE9SVEFOVDogYHRhcmdldGAgaXMgbm90IGNsb25lZCBhbmQgd2lsbCBiZSB1cGRhdGVkIHdpdGggYHNvdXJjZWAgcHJvcGVydGllcy5cblx0ICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IGluIHdoaWNoIGFsbCBzb3VyY2VzIGFyZSBtZXJnZWQgaW50by5cblx0ICogQHBhcmFtIHtPYmplY3R8QXJyYXkoT2JqZWN0KX0gc291cmNlIC0gT2JqZWN0KHMpIHRvIG1lcmdlIGludG8gYHRhcmdldGAuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBNZXJnaW5nIG9wdGlvbnM6XG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRpb25zLm1lcmdlcl0gLSBUaGUgbWVyZ2UgbWV0aG9kIChrZXksIHRhcmdldCwgc291cmNlLCBvcHRpb25zKVxuXHQgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgYHRhcmdldGAgb2JqZWN0LlxuXHQgKi9cblx0bWVyZ2U6IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG5cdFx0dmFyIHNvdXJjZXMgPSBoZWxwZXJzLmlzQXJyYXkoc291cmNlKSA/IHNvdXJjZSA6IFtzb3VyY2VdO1xuXHRcdHZhciBpbGVuID0gc291cmNlcy5sZW5ndGg7XG5cdFx0dmFyIG1lcmdlLCBpLCBrZXlzLCBrbGVuLCBrO1xuXG5cdFx0aWYgKCFoZWxwZXJzLmlzT2JqZWN0KHRhcmdldCkpIHtcblx0XHRcdHJldHVybiB0YXJnZXQ7XG5cdFx0fVxuXG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cdFx0bWVyZ2UgPSBvcHRpb25zLm1lcmdlciB8fCBoZWxwZXJzLl9tZXJnZXI7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRzb3VyY2UgPSBzb3VyY2VzW2ldO1xuXHRcdFx0aWYgKCFoZWxwZXJzLmlzT2JqZWN0KHNvdXJjZSkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuXHRcdFx0Zm9yIChrID0gMCwga2xlbiA9IGtleXMubGVuZ3RoOyBrIDwga2xlbjsgKytrKSB7XG5cdFx0XHRcdG1lcmdlKGtleXNba10sIHRhcmdldCwgc291cmNlLCBvcHRpb25zKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBSZWN1cnNpdmVseSBkZWVwIGNvcGllcyBgc291cmNlYCBwcm9wZXJ0aWVzIGludG8gYHRhcmdldGAgKm9ubHkqIGlmIG5vdCBkZWZpbmVkIGluIHRhcmdldC5cblx0ICogSU1QT1JUQU5UOiBgdGFyZ2V0YCBpcyBub3QgY2xvbmVkIGFuZCB3aWxsIGJlIHVwZGF0ZWQgd2l0aCBgc291cmNlYCBwcm9wZXJ0aWVzLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0IC0gVGhlIHRhcmdldCBvYmplY3QgaW4gd2hpY2ggYWxsIHNvdXJjZXMgYXJlIG1lcmdlZCBpbnRvLlxuXHQgKiBAcGFyYW0ge09iamVjdHxBcnJheShPYmplY3QpfSBzb3VyY2UgLSBPYmplY3QocykgdG8gbWVyZ2UgaW50byBgdGFyZ2V0YC5cblx0ICogQHJldHVybnMge09iamVjdH0gVGhlIGB0YXJnZXRgIG9iamVjdC5cblx0ICovXG5cdG1lcmdlSWY6IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7XG5cdFx0cmV0dXJuIGhlbHBlcnMubWVyZ2UodGFyZ2V0LCBzb3VyY2UsIHttZXJnZXI6IGhlbHBlcnMuX21lcmdlcklmfSk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEFwcGxpZXMgdGhlIGNvbnRlbnRzIG9mIHR3byBvciBtb3JlIG9iamVjdHMgdG9nZXRoZXIgaW50byB0aGUgZmlyc3Qgb2JqZWN0LlxuXHQgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0IC0gVGhlIHRhcmdldCBvYmplY3QgaW4gd2hpY2ggYWxsIG9iamVjdHMgYXJlIG1lcmdlZCBpbnRvLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gYXJnMSAtIE9iamVjdCBjb250YWluaW5nIGFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBtZXJnZSBpbiB0YXJnZXQuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBhcmdOIC0gQWRkaXRpb25hbCBvYmplY3RzIGNvbnRhaW5pbmcgcHJvcGVydGllcyB0byBtZXJnZSBpbiB0YXJnZXQuXG5cdCAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBgdGFyZ2V0YCBvYmplY3QuXG5cdCAqL1xuXHRleHRlbmQ6IGZ1bmN0aW9uKHRhcmdldCkge1xuXHRcdHZhciBzZXRGbiA9IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcblx0XHRcdHRhcmdldFtrZXldID0gdmFsdWU7XG5cdFx0fTtcblx0XHRmb3IgKHZhciBpID0gMSwgaWxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRcdGhlbHBlcnMuZWFjaChhcmd1bWVudHNbaV0sIHNldEZuKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRhcmdldDtcblx0fSxcblxuXHQvKipcblx0ICogQmFzaWMgamF2YXNjcmlwdCBpbmhlcml0YW5jZSBiYXNlZCBvbiB0aGUgbW9kZWwgY3JlYXRlZCBpbiBCYWNrYm9uZS5qc1xuXHQgKi9cblx0aW5oZXJpdHM6IGZ1bmN0aW9uKGV4dGVuc2lvbnMpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciBDaGFydEVsZW1lbnQgPSAoZXh0ZW5zaW9ucyAmJiBleHRlbnNpb25zLmhhc093blByb3BlcnR5KCdjb25zdHJ1Y3RvcicpKSA/IGV4dGVuc2lvbnMuY29uc3RydWN0b3IgOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBtZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdH07XG5cblx0XHR2YXIgU3Vycm9nYXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLmNvbnN0cnVjdG9yID0gQ2hhcnRFbGVtZW50O1xuXHRcdH07XG5cblx0XHRTdXJyb2dhdGUucHJvdG90eXBlID0gbWUucHJvdG90eXBlO1xuXHRcdENoYXJ0RWxlbWVudC5wcm90b3R5cGUgPSBuZXcgU3Vycm9nYXRlKCk7XG5cdFx0Q2hhcnRFbGVtZW50LmV4dGVuZCA9IGhlbHBlcnMuaW5oZXJpdHM7XG5cblx0XHRpZiAoZXh0ZW5zaW9ucykge1xuXHRcdFx0aGVscGVycy5leHRlbmQoQ2hhcnRFbGVtZW50LnByb3RvdHlwZSwgZXh0ZW5zaW9ucyk7XG5cdFx0fVxuXG5cdFx0Q2hhcnRFbGVtZW50Ll9fc3VwZXJfXyA9IG1lLnByb3RvdHlwZTtcblx0XHRyZXR1cm4gQ2hhcnRFbGVtZW50O1xuXHR9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGhlbHBlcnM7XG5cbi8vIERFUFJFQ0FUSU9OU1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB1c2UgQ2hhcnQuaGVscGVycy5jYWxsYmFjayBpbnN0ZWFkLlxuICogQGZ1bmN0aW9uIENoYXJ0LmhlbHBlcnMuY2FsbENhbGxiYWNrXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNi4wXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXG4gKiBAcHJpdmF0ZVxuICovXG5oZWxwZXJzLmNhbGxDYWxsYmFjayA9IGhlbHBlcnMuY2FsbGJhY2s7XG5cbi8qKlxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiBpbnN0ZWFkLlxuICogQXJyYXkucHJvdG90eXBlLmluZGV4T2YgY29tcGF0aWJpbGl0eTogQ2hyb21lLCBPcGVyYSwgU2FmYXJpLCBGRjEuNSssIElFOStcbiAqIEBmdW5jdGlvbiBDaGFydC5oZWxwZXJzLmluZGV4T2ZcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi43LjBcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcbiAqIEBwcml2YXRlXG4gKi9cbmhlbHBlcnMuaW5kZXhPZiA9IGZ1bmN0aW9uKGFycmF5LCBpdGVtLCBmcm9tSW5kZXgpIHtcblx0cmV0dXJuIEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYXJyYXksIGl0ZW0sIGZyb21JbmRleCk7XG59O1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB1c2UgQ2hhcnQuaGVscGVycy52YWx1ZU9yRGVmYXVsdCBpbnN0ZWFkLlxuICogQGZ1bmN0aW9uIENoYXJ0LmhlbHBlcnMuZ2V0VmFsdWVPckRlZmF1bHRcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi43LjBcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcbiAqIEBwcml2YXRlXG4gKi9cbmhlbHBlcnMuZ2V0VmFsdWVPckRlZmF1bHQgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0O1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB1c2UgQ2hhcnQuaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQgaW5zdGVhZC5cbiAqIEBmdW5jdGlvbiBDaGFydC5oZWxwZXJzLmdldFZhbHVlQXRJbmRleE9yRGVmYXVsdFxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjcuMFxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuICogQHByaXZhdGVcbiAqL1xuaGVscGVycy5nZXRWYWx1ZUF0SW5kZXhPckRlZmF1bHQgPSBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdDtcblxufSx7fV0sNDQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDMpO1xuXG4vKipcbiAqIEVhc2luZyBmdW5jdGlvbnMgYWRhcHRlZCBmcm9tIFJvYmVydCBQZW5uZXIncyBlYXNpbmcgZXF1YXRpb25zLlxuICogQG5hbWVzcGFjZSBDaGFydC5oZWxwZXJzLmVhc2luZ0VmZmVjdHNcbiAqIEBzZWUgaHR0cDovL3d3dy5yb2JlcnRwZW5uZXIuY29tL2Vhc2luZy9cbiAqL1xudmFyIGVmZmVjdHMgPSB7XG5cdGxpbmVhcjogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiB0O1xuXHR9LFxuXG5cdGVhc2VJblF1YWQ6IGZ1bmN0aW9uKHQpIHtcblx0XHRyZXR1cm4gdCAqIHQ7XG5cdH0sXG5cblx0ZWFzZU91dFF1YWQ6IGZ1bmN0aW9uKHQpIHtcblx0XHRyZXR1cm4gLXQgKiAodCAtIDIpO1xuXHR9LFxuXG5cdGVhc2VJbk91dFF1YWQ6IGZ1bmN0aW9uKHQpIHtcblx0XHRpZiAoKHQgLz0gMC41KSA8IDEpIHtcblx0XHRcdHJldHVybiAwLjUgKiB0ICogdDtcblx0XHR9XG5cdFx0cmV0dXJuIC0wLjUgKiAoKC0tdCkgKiAodCAtIDIpIC0gMSk7XG5cdH0sXG5cblx0ZWFzZUluQ3ViaWM6IGZ1bmN0aW9uKHQpIHtcblx0XHRyZXR1cm4gdCAqIHQgKiB0O1xuXHR9LFxuXG5cdGVhc2VPdXRDdWJpYzogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiAodCA9IHQgLSAxKSAqIHQgKiB0ICsgMTtcblx0fSxcblxuXHRlYXNlSW5PdXRDdWJpYzogZnVuY3Rpb24odCkge1xuXHRcdGlmICgodCAvPSAwLjUpIDwgMSkge1xuXHRcdFx0cmV0dXJuIDAuNSAqIHQgKiB0ICogdDtcblx0XHR9XG5cdFx0cmV0dXJuIDAuNSAqICgodCAtPSAyKSAqIHQgKiB0ICsgMik7XG5cdH0sXG5cblx0ZWFzZUluUXVhcnQ6IGZ1bmN0aW9uKHQpIHtcblx0XHRyZXR1cm4gdCAqIHQgKiB0ICogdDtcblx0fSxcblxuXHRlYXNlT3V0UXVhcnQ6IGZ1bmN0aW9uKHQpIHtcblx0XHRyZXR1cm4gLSgodCA9IHQgLSAxKSAqIHQgKiB0ICogdCAtIDEpO1xuXHR9LFxuXG5cdGVhc2VJbk91dFF1YXJ0OiBmdW5jdGlvbih0KSB7XG5cdFx0aWYgKCh0IC89IDAuNSkgPCAxKSB7XG5cdFx0XHRyZXR1cm4gMC41ICogdCAqIHQgKiB0ICogdDtcblx0XHR9XG5cdFx0cmV0dXJuIC0wLjUgKiAoKHQgLT0gMikgKiB0ICogdCAqIHQgLSAyKTtcblx0fSxcblxuXHRlYXNlSW5RdWludDogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiB0ICogdCAqIHQgKiB0ICogdDtcblx0fSxcblxuXHRlYXNlT3V0UXVpbnQ6IGZ1bmN0aW9uKHQpIHtcblx0XHRyZXR1cm4gKHQgPSB0IC0gMSkgKiB0ICogdCAqIHQgKiB0ICsgMTtcblx0fSxcblxuXHRlYXNlSW5PdXRRdWludDogZnVuY3Rpb24odCkge1xuXHRcdGlmICgodCAvPSAwLjUpIDwgMSkge1xuXHRcdFx0cmV0dXJuIDAuNSAqIHQgKiB0ICogdCAqIHQgKiB0O1xuXHRcdH1cblx0XHRyZXR1cm4gMC41ICogKCh0IC09IDIpICogdCAqIHQgKiB0ICogdCArIDIpO1xuXHR9LFxuXG5cdGVhc2VJblNpbmU6IGZ1bmN0aW9uKHQpIHtcblx0XHRyZXR1cm4gLU1hdGguY29zKHQgKiAoTWF0aC5QSSAvIDIpKSArIDE7XG5cdH0sXG5cblx0ZWFzZU91dFNpbmU6IGZ1bmN0aW9uKHQpIHtcblx0XHRyZXR1cm4gTWF0aC5zaW4odCAqIChNYXRoLlBJIC8gMikpO1xuXHR9LFxuXG5cdGVhc2VJbk91dFNpbmU6IGZ1bmN0aW9uKHQpIHtcblx0XHRyZXR1cm4gLTAuNSAqIChNYXRoLmNvcyhNYXRoLlBJICogdCkgLSAxKTtcblx0fSxcblxuXHRlYXNlSW5FeHBvOiBmdW5jdGlvbih0KSB7XG5cdFx0cmV0dXJuICh0ID09PSAwKSA/IDAgOiBNYXRoLnBvdygyLCAxMCAqICh0IC0gMSkpO1xuXHR9LFxuXG5cdGVhc2VPdXRFeHBvOiBmdW5jdGlvbih0KSB7XG5cdFx0cmV0dXJuICh0ID09PSAxKSA/IDEgOiAtTWF0aC5wb3coMiwgLTEwICogdCkgKyAxO1xuXHR9LFxuXG5cdGVhc2VJbk91dEV4cG86IGZ1bmN0aW9uKHQpIHtcblx0XHRpZiAodCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXHRcdGlmICh0ID09PSAxKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cdFx0aWYgKCh0IC89IDAuNSkgPCAxKSB7XG5cdFx0XHRyZXR1cm4gMC41ICogTWF0aC5wb3coMiwgMTAgKiAodCAtIDEpKTtcblx0XHR9XG5cdFx0cmV0dXJuIDAuNSAqICgtTWF0aC5wb3coMiwgLTEwICogLS10KSArIDIpO1xuXHR9LFxuXG5cdGVhc2VJbkNpcmM6IGZ1bmN0aW9uKHQpIHtcblx0XHRpZiAodCA+PSAxKSB7XG5cdFx0XHRyZXR1cm4gdDtcblx0XHR9XG5cdFx0cmV0dXJuIC0oTWF0aC5zcXJ0KDEgLSB0ICogdCkgLSAxKTtcblx0fSxcblxuXHRlYXNlT3V0Q2lyYzogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiBNYXRoLnNxcnQoMSAtICh0ID0gdCAtIDEpICogdCk7XG5cdH0sXG5cblx0ZWFzZUluT3V0Q2lyYzogZnVuY3Rpb24odCkge1xuXHRcdGlmICgodCAvPSAwLjUpIDwgMSkge1xuXHRcdFx0cmV0dXJuIC0wLjUgKiAoTWF0aC5zcXJ0KDEgLSB0ICogdCkgLSAxKTtcblx0XHR9XG5cdFx0cmV0dXJuIDAuNSAqIChNYXRoLnNxcnQoMSAtICh0IC09IDIpICogdCkgKyAxKTtcblx0fSxcblxuXHRlYXNlSW5FbGFzdGljOiBmdW5jdGlvbih0KSB7XG5cdFx0dmFyIHMgPSAxLjcwMTU4O1xuXHRcdHZhciBwID0gMDtcblx0XHR2YXIgYSA9IDE7XG5cdFx0aWYgKHQgPT09IDApIHtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblx0XHRpZiAodCA9PT0gMSkge1xuXHRcdFx0cmV0dXJuIDE7XG5cdFx0fVxuXHRcdGlmICghcCkge1xuXHRcdFx0cCA9IDAuMztcblx0XHR9XG5cdFx0aWYgKGEgPCAxKSB7XG5cdFx0XHRhID0gMTtcblx0XHRcdHMgPSBwIC8gNDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cyA9IHAgLyAoMiAqIE1hdGguUEkpICogTWF0aC5hc2luKDEgLyBhKTtcblx0XHR9XG5cdFx0cmV0dXJuIC0oYSAqIE1hdGgucG93KDIsIDEwICogKHQgLT0gMSkpICogTWF0aC5zaW4oKHQgLSBzKSAqICgyICogTWF0aC5QSSkgLyBwKSk7XG5cdH0sXG5cblx0ZWFzZU91dEVsYXN0aWM6IGZ1bmN0aW9uKHQpIHtcblx0XHR2YXIgcyA9IDEuNzAxNTg7XG5cdFx0dmFyIHAgPSAwO1xuXHRcdHZhciBhID0gMTtcblx0XHRpZiAodCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXHRcdGlmICh0ID09PSAxKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cdFx0aWYgKCFwKSB7XG5cdFx0XHRwID0gMC4zO1xuXHRcdH1cblx0XHRpZiAoYSA8IDEpIHtcblx0XHRcdGEgPSAxO1xuXHRcdFx0cyA9IHAgLyA0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzID0gcCAvICgyICogTWF0aC5QSSkgKiBNYXRoLmFzaW4oMSAvIGEpO1xuXHRcdH1cblx0XHRyZXR1cm4gYSAqIE1hdGgucG93KDIsIC0xMCAqIHQpICogTWF0aC5zaW4oKHQgLSBzKSAqICgyICogTWF0aC5QSSkgLyBwKSArIDE7XG5cdH0sXG5cblx0ZWFzZUluT3V0RWxhc3RpYzogZnVuY3Rpb24odCkge1xuXHRcdHZhciBzID0gMS43MDE1ODtcblx0XHR2YXIgcCA9IDA7XG5cdFx0dmFyIGEgPSAxO1xuXHRcdGlmICh0ID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cdFx0aWYgKCh0IC89IDAuNSkgPT09IDIpIHtcblx0XHRcdHJldHVybiAxO1xuXHRcdH1cblx0XHRpZiAoIXApIHtcblx0XHRcdHAgPSAwLjQ1O1xuXHRcdH1cblx0XHRpZiAoYSA8IDEpIHtcblx0XHRcdGEgPSAxO1xuXHRcdFx0cyA9IHAgLyA0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzID0gcCAvICgyICogTWF0aC5QSSkgKiBNYXRoLmFzaW4oMSAvIGEpO1xuXHRcdH1cblx0XHRpZiAodCA8IDEpIHtcblx0XHRcdHJldHVybiAtMC41ICogKGEgKiBNYXRoLnBvdygyLCAxMCAqICh0IC09IDEpKSAqIE1hdGguc2luKCh0IC0gcykgKiAoMiAqIE1hdGguUEkpIC8gcCkpO1xuXHRcdH1cblx0XHRyZXR1cm4gYSAqIE1hdGgucG93KDIsIC0xMCAqICh0IC09IDEpKSAqIE1hdGguc2luKCh0IC0gcykgKiAoMiAqIE1hdGguUEkpIC8gcCkgKiAwLjUgKyAxO1xuXHR9LFxuXHRlYXNlSW5CYWNrOiBmdW5jdGlvbih0KSB7XG5cdFx0dmFyIHMgPSAxLjcwMTU4O1xuXHRcdHJldHVybiB0ICogdCAqICgocyArIDEpICogdCAtIHMpO1xuXHR9LFxuXG5cdGVhc2VPdXRCYWNrOiBmdW5jdGlvbih0KSB7XG5cdFx0dmFyIHMgPSAxLjcwMTU4O1xuXHRcdHJldHVybiAodCA9IHQgLSAxKSAqIHQgKiAoKHMgKyAxKSAqIHQgKyBzKSArIDE7XG5cdH0sXG5cblx0ZWFzZUluT3V0QmFjazogZnVuY3Rpb24odCkge1xuXHRcdHZhciBzID0gMS43MDE1ODtcblx0XHRpZiAoKHQgLz0gMC41KSA8IDEpIHtcblx0XHRcdHJldHVybiAwLjUgKiAodCAqIHQgKiAoKChzICo9ICgxLjUyNSkpICsgMSkgKiB0IC0gcykpO1xuXHRcdH1cblx0XHRyZXR1cm4gMC41ICogKCh0IC09IDIpICogdCAqICgoKHMgKj0gKDEuNTI1KSkgKyAxKSAqIHQgKyBzKSArIDIpO1xuXHR9LFxuXG5cdGVhc2VJbkJvdW5jZTogZnVuY3Rpb24odCkge1xuXHRcdHJldHVybiAxIC0gZWZmZWN0cy5lYXNlT3V0Qm91bmNlKDEgLSB0KTtcblx0fSxcblxuXHRlYXNlT3V0Qm91bmNlOiBmdW5jdGlvbih0KSB7XG5cdFx0aWYgKHQgPCAoMSAvIDIuNzUpKSB7XG5cdFx0XHRyZXR1cm4gNy41NjI1ICogdCAqIHQ7XG5cdFx0fVxuXHRcdGlmICh0IDwgKDIgLyAyLjc1KSkge1xuXHRcdFx0cmV0dXJuIDcuNTYyNSAqICh0IC09ICgxLjUgLyAyLjc1KSkgKiB0ICsgMC43NTtcblx0XHR9XG5cdFx0aWYgKHQgPCAoMi41IC8gMi43NSkpIHtcblx0XHRcdHJldHVybiA3LjU2MjUgKiAodCAtPSAoMi4yNSAvIDIuNzUpKSAqIHQgKyAwLjkzNzU7XG5cdFx0fVxuXHRcdHJldHVybiA3LjU2MjUgKiAodCAtPSAoMi42MjUgLyAyLjc1KSkgKiB0ICsgMC45ODQzNzU7XG5cdH0sXG5cblx0ZWFzZUluT3V0Qm91bmNlOiBmdW5jdGlvbih0KSB7XG5cdFx0aWYgKHQgPCAwLjUpIHtcblx0XHRcdHJldHVybiBlZmZlY3RzLmVhc2VJbkJvdW5jZSh0ICogMikgKiAwLjU7XG5cdFx0fVxuXHRcdHJldHVybiBlZmZlY3RzLmVhc2VPdXRCb3VuY2UodCAqIDIgLSAxKSAqIDAuNSArIDAuNTtcblx0fVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdGVmZmVjdHM6IGVmZmVjdHNcbn07XG5cbi8vIERFUFJFQ0FUSU9OU1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB1c2UgQ2hhcnQuaGVscGVycy5lYXNpbmcuZWZmZWN0cyBpbnN0ZWFkLlxuICogQGZ1bmN0aW9uIENoYXJ0LmhlbHBlcnMuZWFzaW5nRWZmZWN0c1xuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjcuMFxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuICogQHByaXZhdGVcbiAqL1xuaGVscGVycy5lYXNpbmdFZmZlY3RzID0gZWZmZWN0cztcblxufSx7XCI0M1wiOjQzfV0sNDU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDMpO1xuXG4vKipcbiAqIEBhbGlhcyBDaGFydC5oZWxwZXJzLm9wdGlvbnNcbiAqIEBuYW1lc3BhY2VcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSB7XG5cdC8qKlxuXHQgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gbGluZSBoZWlnaHQgYHZhbHVlYCBpbiBwaXhlbHMgZm9yIGEgc3BlY2lmaWMgZm9udCBgc2l6ZWAuXG5cdCAqIEBwYXJhbSB7TnVtYmVyfFN0cmluZ30gdmFsdWUgLSBUaGUgbGluZUhlaWdodCB0byBwYXJzZSAoZWcuIDEuNiwgJzE0cHgnLCAnNzUlJywgJzEuNmVtJykuXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBzaXplIC0gVGhlIGZvbnQgc2l6ZSAoaW4gcGl4ZWxzKSB1c2VkIHRvIHJlc29sdmUgcmVsYXRpdmUgYHZhbHVlYC5cblx0ICogQHJldHVybnMge051bWJlcn0gVGhlIGVmZmVjdGl2ZSBsaW5lIGhlaWdodCBpbiBwaXhlbHMgKHNpemUgKiAxLjIgaWYgdmFsdWUgaXMgaW52YWxpZCkuXG5cdCAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2xpbmUtaGVpZ2h0XG5cdCAqIEBzaW5jZSAyLjcuMFxuXHQgKi9cblx0dG9MaW5lSGVpZ2h0OiBmdW5jdGlvbih2YWx1ZSwgc2l6ZSkge1xuXHRcdHZhciBtYXRjaGVzID0gKCcnICsgdmFsdWUpLm1hdGNoKC9eKG5vcm1hbHwoXFxkKyg/OlxcLlxcZCspPykocHh8ZW18JSk/KSQvKTtcblx0XHRpZiAoIW1hdGNoZXMgfHwgbWF0Y2hlc1sxXSA9PT0gJ25vcm1hbCcpIHtcblx0XHRcdHJldHVybiBzaXplICogMS4yO1xuXHRcdH1cblxuXHRcdHZhbHVlID0gK21hdGNoZXNbMl07XG5cblx0XHRzd2l0Y2ggKG1hdGNoZXNbM10pIHtcblx0XHRjYXNlICdweCc6XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0Y2FzZSAnJSc6XG5cdFx0XHR2YWx1ZSAvPSAxMDA7XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNpemUgKiB2YWx1ZTtcblx0fSxcblxuXHQvKipcblx0ICogQ29udmVydHMgdGhlIGdpdmVuIHZhbHVlIGludG8gYSBwYWRkaW5nIG9iamVjdCB3aXRoIHByZS1jb21wdXRlZCB3aWR0aC9oZWlnaHQuXG5cdCAqIEBwYXJhbSB7TnVtYmVyfE9iamVjdH0gdmFsdWUgLSBJZiBhIG51bWJlciwgc2V0IHRoZSB2YWx1ZSB0byBhbGwgVFJCTCBjb21wb25lbnQsXG5cdCAqICBlbHNlLCBpZiBhbmQgb2JqZWN0LCB1c2UgZGVmaW5lZCBwcm9wZXJ0aWVzIGFuZCBzZXRzIHVuZGVmaW5lZCBvbmVzIHRvIDAuXG5cdCAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBwYWRkaW5nIHZhbHVlcyAodG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0KVxuXHQgKiBAc2luY2UgMi43LjBcblx0ICovXG5cdHRvUGFkZGluZzogZnVuY3Rpb24odmFsdWUpIHtcblx0XHR2YXIgdCwgciwgYiwgbDtcblxuXHRcdGlmIChoZWxwZXJzLmlzT2JqZWN0KHZhbHVlKSkge1xuXHRcdFx0dCA9ICt2YWx1ZS50b3AgfHwgMDtcblx0XHRcdHIgPSArdmFsdWUucmlnaHQgfHwgMDtcblx0XHRcdGIgPSArdmFsdWUuYm90dG9tIHx8IDA7XG5cdFx0XHRsID0gK3ZhbHVlLmxlZnQgfHwgMDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dCA9IHIgPSBiID0gbCA9ICt2YWx1ZSB8fCAwO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IHQsXG5cdFx0XHRyaWdodDogcixcblx0XHRcdGJvdHRvbTogYixcblx0XHRcdGxlZnQ6IGwsXG5cdFx0XHRoZWlnaHQ6IHQgKyBiLFxuXHRcdFx0d2lkdGg6IGwgKyByXG5cdFx0fTtcblx0fSxcblxuXHQvKipcblx0ICogRXZhbHVhdGVzIHRoZSBnaXZlbiBgaW5wdXRzYCBzZXF1ZW50aWFsbHkgYW5kIHJldHVybnMgdGhlIGZpcnN0IGRlZmluZWQgdmFsdWUuXG5cdCAqIEBwYXJhbSB7QXJyYXlbXX0gaW5wdXRzIC0gQW4gYXJyYXkgb2YgdmFsdWVzLCBmYWxsaW5nIGJhY2sgdG8gdGhlIGxhc3QgdmFsdWUuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbY29udGV4dF0gLSBJZiBkZWZpbmVkIGFuZCB0aGUgY3VycmVudCB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCB0aGUgdmFsdWVcblx0ICogaXMgY2FsbGVkIHdpdGggYGNvbnRleHRgIGFzIGZpcnN0IGFyZ3VtZW50IGFuZCB0aGUgcmVzdWx0IGJlY29tZXMgdGhlIG5ldyBpbnB1dC5cblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtpbmRleF0gLSBJZiBkZWZpbmVkIGFuZCB0aGUgY3VycmVudCB2YWx1ZSBpcyBhbiBhcnJheSwgdGhlIHZhbHVlXG5cdCAqIGF0IGBpbmRleGAgYmVjb21lIHRoZSBuZXcgaW5wdXQuXG5cdCAqIEBzaW5jZSAyLjcuMFxuXHQgKi9cblx0cmVzb2x2ZTogZnVuY3Rpb24oaW5wdXRzLCBjb250ZXh0LCBpbmRleCkge1xuXHRcdHZhciBpLCBpbGVuLCB2YWx1ZTtcblxuXHRcdGZvciAoaSA9IDAsIGlsZW4gPSBpbnB1dHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHR2YWx1ZSA9IGlucHV0c1tpXTtcblx0XHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGNvbnRleHQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZShjb250ZXh0KTtcblx0XHRcdH1cblx0XHRcdGlmIChpbmRleCAhPT0gdW5kZWZpbmVkICYmIGhlbHBlcnMuaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdFx0dmFsdWUgPSB2YWx1ZVtpbmRleF07XG5cdFx0XHR9XG5cdFx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG59LHtcIjQzXCI6NDN9XSw0NjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSg0Myk7XG5tb2R1bGUuZXhwb3J0cy5lYXNpbmcgPSByZXF1aXJlKDQ0KTtcbm1vZHVsZS5leHBvcnRzLmNhbnZhcyA9IHJlcXVpcmUoNDIpO1xubW9kdWxlLmV4cG9ydHMub3B0aW9ucyA9IHJlcXVpcmUoNDUpO1xuXG59LHtcIjQyXCI6NDIsXCI0M1wiOjQzLFwiNDRcIjo0NCxcIjQ1XCI6NDV9XSw0NzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4vKipcbiAqIFBsYXRmb3JtIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIChtaW5pbWFsKS5cbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvcHVsbC80NTkxI2lzc3VlY29tbWVudC0zMTk1NzU5MzlcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0YWNxdWlyZUNvbnRleHQ6IGZ1bmN0aW9uKGl0ZW0pIHtcblx0XHRpZiAoaXRlbSAmJiBpdGVtLmNhbnZhcykge1xuXHRcdFx0Ly8gU3VwcG9ydCBmb3IgYW55IG9iamVjdCBhc3NvY2lhdGVkIHRvIGEgY2FudmFzIChpbmNsdWRpbmcgYSBjb250ZXh0MmQpXG5cdFx0XHRpdGVtID0gaXRlbS5jYW52YXM7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGl0ZW0gJiYgaXRlbS5nZXRDb250ZXh0KCcyZCcpIHx8IG51bGw7XG5cdH1cbn07XG5cbn0se31dLDQ4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbi8qKlxuICogQ2hhcnQuUGxhdGZvcm0gaW1wbGVtZW50YXRpb24gZm9yIHRhcmdldGluZyBhIHdlYiBicm93c2VyXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xuXG52YXIgRVhQQU5ET19LRVkgPSAnJGNoYXJ0anMnO1xudmFyIENTU19QUkVGSVggPSAnY2hhcnRqcy0nO1xudmFyIENTU19SRU5ERVJfTU9OSVRPUiA9IENTU19QUkVGSVggKyAncmVuZGVyLW1vbml0b3InO1xudmFyIENTU19SRU5ERVJfQU5JTUFUSU9OID0gQ1NTX1BSRUZJWCArICdyZW5kZXItYW5pbWF0aW9uJztcbnZhciBBTklNQVRJT05fU1RBUlRfRVZFTlRTID0gWydhbmltYXRpb25zdGFydCcsICd3ZWJraXRBbmltYXRpb25TdGFydCddO1xuXG4vKipcbiAqIERPTSBldmVudCB0eXBlcyAtPiBDaGFydC5qcyBldmVudCB0eXBlcy5cbiAqIE5vdGU6IG9ubHkgZXZlbnRzIHdpdGggZGlmZmVyZW50IHR5cGVzIGFyZSBtYXBwZWQuXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50c1xuICovXG52YXIgRVZFTlRfVFlQRVMgPSB7XG5cdHRvdWNoc3RhcnQ6ICdtb3VzZWRvd24nLFxuXHR0b3VjaG1vdmU6ICdtb3VzZW1vdmUnLFxuXHR0b3VjaGVuZDogJ21vdXNldXAnLFxuXHRwb2ludGVyZW50ZXI6ICdtb3VzZWVudGVyJyxcblx0cG9pbnRlcmRvd246ICdtb3VzZWRvd24nLFxuXHRwb2ludGVybW92ZTogJ21vdXNlbW92ZScsXG5cdHBvaW50ZXJ1cDogJ21vdXNldXAnLFxuXHRwb2ludGVybGVhdmU6ICdtb3VzZW91dCcsXG5cdHBvaW50ZXJvdXQ6ICdtb3VzZW91dCdcbn07XG5cbi8qKlxuICogVGhlIFwidXNlZFwiIHNpemUgaXMgdGhlIGZpbmFsIHZhbHVlIG9mIGEgZGltZW5zaW9uIHByb3BlcnR5IGFmdGVyIGFsbCBjYWxjdWxhdGlvbnMgaGF2ZVxuICogYmVlbiBwZXJmb3JtZWQuIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGNvbXB1dGVkIHN0eWxlIG9mIGBlbGVtZW50YCBidXQgcmV0dXJucyB1bmRlZmluZWRcbiAqIGlmIHRoZSBjb21wdXRlZCBzdHlsZSBpcyBub3QgZXhwcmVzc2VkIGluIHBpeGVscy4gVGhhdCBjYW4gaGFwcGVuIGluIHNvbWUgY2FzZXMgd2hlcmVcbiAqIGBlbGVtZW50YCBoYXMgYSBzaXplIHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQgYW5kIHRoaXMgbGFzdCBvbmUgaXMgbm90IHlldCBkaXNwbGF5ZWQsXG4gKiBmb3IgZXhhbXBsZSBiZWNhdXNlIG9mIGBkaXNwbGF5OiBub25lYCBvbiBhIHBhcmVudCBub2RlLlxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvdXNlZF92YWx1ZVxuICogQHJldHVybnMge051bWJlcn0gU2l6ZSBpbiBwaXhlbHMgb3IgdW5kZWZpbmVkIGlmIHVua25vd24uXG4gKi9cbmZ1bmN0aW9uIHJlYWRVc2VkU2l6ZShlbGVtZW50LCBwcm9wZXJ0eSkge1xuXHR2YXIgdmFsdWUgPSBoZWxwZXJzLmdldFN0eWxlKGVsZW1lbnQsIHByb3BlcnR5KTtcblx0dmFyIG1hdGNoZXMgPSB2YWx1ZSAmJiB2YWx1ZS5tYXRjaCgvXihcXGQrKShcXC5cXGQrKT9weCQvKTtcblx0cmV0dXJuIG1hdGNoZXMgPyBOdW1iZXIobWF0Y2hlc1sxXSkgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgdGhlIGNhbnZhcyBzdHlsZSBhbmQgcmVuZGVyIHNpemUgd2l0aG91dCBtb2RpZnlpbmcgdGhlIGNhbnZhcyBkaXNwbGF5IHNpemUsXG4gKiBzaW5jZSByZXNwb25zaXZlbmVzcyBpcyBoYW5kbGVkIGJ5IHRoZSBjb250cm9sbGVyLnJlc2l6ZSgpIG1ldGhvZC4gVGhlIGNvbmZpZyBpcyB1c2VkXG4gKiB0byBkZXRlcm1pbmUgdGhlIGFzcGVjdCByYXRpbyB0byBhcHBseSBpbiBjYXNlIG5vIGV4cGxpY2l0IGhlaWdodCBoYXMgYmVlbiBzcGVjaWZpZWQuXG4gKi9cbmZ1bmN0aW9uIGluaXRDYW52YXMoY2FudmFzLCBjb25maWcpIHtcblx0dmFyIHN0eWxlID0gY2FudmFzLnN0eWxlO1xuXG5cdC8vIE5PVEUoU0IpIGNhbnZhcy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykgIT09IGNhbnZhcy53aWR0aDogaW4gdGhlIGZpcnN0IGNhc2UgaXRcblx0Ly8gcmV0dXJucyBudWxsIG9yICcnIGlmIG5vIGV4cGxpY2l0IHZhbHVlIGhhcyBiZWVuIHNldCB0byB0aGUgY2FudmFzIGF0dHJpYnV0ZS5cblx0dmFyIHJlbmRlckhlaWdodCA9IGNhbnZhcy5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpO1xuXHR2YXIgcmVuZGVyV2lkdGggPSBjYW52YXMuZ2V0QXR0cmlidXRlKCd3aWR0aCcpO1xuXG5cdC8vIENoYXJ0LmpzIG1vZGlmaWVzIHNvbWUgY2FudmFzIHZhbHVlcyB0aGF0IHdlIHdhbnQgdG8gcmVzdG9yZSBvbiBkZXN0cm95XG5cdGNhbnZhc1tFWFBBTkRPX0tFWV0gPSB7XG5cdFx0aW5pdGlhbDoge1xuXHRcdFx0aGVpZ2h0OiByZW5kZXJIZWlnaHQsXG5cdFx0XHR3aWR0aDogcmVuZGVyV2lkdGgsXG5cdFx0XHRzdHlsZToge1xuXHRcdFx0XHRkaXNwbGF5OiBzdHlsZS5kaXNwbGF5LFxuXHRcdFx0XHRoZWlnaHQ6IHN0eWxlLmhlaWdodCxcblx0XHRcdFx0d2lkdGg6IHN0eWxlLndpZHRoXG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdC8vIEZvcmNlIGNhbnZhcyB0byBkaXNwbGF5IGFzIGJsb2NrIHRvIGF2b2lkIGV4dHJhIHNwYWNlIGNhdXNlZCBieSBpbmxpbmVcblx0Ly8gZWxlbWVudHMsIHdoaWNoIHdvdWxkIGludGVyZmVyZSB3aXRoIHRoZSByZXNwb25zaXZlIHJlc2l6ZSBwcm9jZXNzLlxuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvMjUzOFxuXHRzdHlsZS5kaXNwbGF5ID0gc3R5bGUuZGlzcGxheSB8fCAnYmxvY2snO1xuXG5cdGlmIChyZW5kZXJXaWR0aCA9PT0gbnVsbCB8fCByZW5kZXJXaWR0aCA9PT0gJycpIHtcblx0XHR2YXIgZGlzcGxheVdpZHRoID0gcmVhZFVzZWRTaXplKGNhbnZhcywgJ3dpZHRoJyk7XG5cdFx0aWYgKGRpc3BsYXlXaWR0aCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjYW52YXMud2lkdGggPSBkaXNwbGF5V2lkdGg7XG5cdFx0fVxuXHR9XG5cblx0aWYgKHJlbmRlckhlaWdodCA9PT0gbnVsbCB8fCByZW5kZXJIZWlnaHQgPT09ICcnKSB7XG5cdFx0aWYgKGNhbnZhcy5zdHlsZS5oZWlnaHQgPT09ICcnKSB7XG5cdFx0XHQvLyBJZiBubyBleHBsaWNpdCByZW5kZXIgaGVpZ2h0IGFuZCBzdHlsZSBoZWlnaHQsIGxldCdzIGFwcGx5IHRoZSBhc3BlY3QgcmF0aW8sXG5cdFx0XHQvLyB3aGljaCBvbmUgY2FuIGJlIHNwZWNpZmllZCBieSB0aGUgdXNlciBidXQgYWxzbyBieSBjaGFydHMgYXMgZGVmYXVsdCBvcHRpb25cblx0XHRcdC8vIChpLmUuIG9wdGlvbnMuYXNwZWN0UmF0aW8pLiBJZiBub3Qgc3BlY2lmaWVkLCB1c2UgY2FudmFzIGFzcGVjdCByYXRpbyBvZiAyLlxuXHRcdFx0Y2FudmFzLmhlaWdodCA9IGNhbnZhcy53aWR0aCAvIChjb25maWcub3B0aW9ucy5hc3BlY3RSYXRpbyB8fCAyKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIGRpc3BsYXlIZWlnaHQgPSByZWFkVXNlZFNpemUoY2FudmFzLCAnaGVpZ2h0Jyk7XG5cdFx0XHRpZiAoZGlzcGxheVdpZHRoICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y2FudmFzLmhlaWdodCA9IGRpc3BsYXlIZWlnaHQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNhbnZhcztcbn1cblxuLyoqXG4gKiBEZXRlY3RzIHN1cHBvcnQgZm9yIG9wdGlvbnMgb2JqZWN0IGFyZ3VtZW50IGluIGFkZEV2ZW50TGlzdGVuZXIuXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRUYXJnZXQvYWRkRXZlbnRMaXN0ZW5lciNTYWZlbHlfZGV0ZWN0aW5nX29wdGlvbl9zdXBwb3J0XG4gKiBAcHJpdmF0ZVxuICovXG52YXIgc3VwcG9ydHNFdmVudExpc3RlbmVyT3B0aW9ucyA9IChmdW5jdGlvbigpIHtcblx0dmFyIHN1cHBvcnRzID0gZmFsc2U7XG5cdHRyeSB7XG5cdFx0dmFyIG9wdGlvbnMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0c3VwcG9ydHMgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlJywgbnVsbCwgb3B0aW9ucyk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHQvLyBjb250aW51ZSByZWdhcmRsZXNzIG9mIGVycm9yXG5cdH1cblx0cmV0dXJuIHN1cHBvcnRzO1xufSgpKTtcblxuLy8gRGVmYXVsdCBwYXNzaXZlIHRvIHRydWUgYXMgZXhwZWN0ZWQgYnkgQ2hyb21lIGZvciAndG91Y2hzdGFydCcgYW5kICd0b3VjaGVuZCcgZXZlbnRzLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzQyODdcbnZhciBldmVudExpc3RlbmVyT3B0aW9ucyA9IHN1cHBvcnRzRXZlbnRMaXN0ZW5lck9wdGlvbnMgPyB7cGFzc2l2ZTogdHJ1ZX0gOiBmYWxzZTtcblxuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihub2RlLCB0eXBlLCBsaXN0ZW5lcikge1xuXHRub2RlLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIGV2ZW50TGlzdGVuZXJPcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcihub2RlLCB0eXBlLCBsaXN0ZW5lcikge1xuXHRub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIGV2ZW50TGlzdGVuZXJPcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRXZlbnQodHlwZSwgY2hhcnQsIHgsIHksIG5hdGl2ZUV2ZW50KSB7XG5cdHJldHVybiB7XG5cdFx0dHlwZTogdHlwZSxcblx0XHRjaGFydDogY2hhcnQsXG5cdFx0bmF0aXZlOiBuYXRpdmVFdmVudCB8fCBudWxsLFxuXHRcdHg6IHggIT09IHVuZGVmaW5lZCA/IHggOiBudWxsLFxuXHRcdHk6IHkgIT09IHVuZGVmaW5lZCA/IHkgOiBudWxsLFxuXHR9O1xufVxuXG5mdW5jdGlvbiBmcm9tTmF0aXZlRXZlbnQoZXZlbnQsIGNoYXJ0KSB7XG5cdHZhciB0eXBlID0gRVZFTlRfVFlQRVNbZXZlbnQudHlwZV0gfHwgZXZlbnQudHlwZTtcblx0dmFyIHBvcyA9IGhlbHBlcnMuZ2V0UmVsYXRpdmVQb3NpdGlvbihldmVudCwgY2hhcnQpO1xuXHRyZXR1cm4gY3JlYXRlRXZlbnQodHlwZSwgY2hhcnQsIHBvcy54LCBwb3MueSwgZXZlbnQpO1xufVxuXG5mdW5jdGlvbiB0aHJvdHRsZWQoZm4sIHRoaXNBcmcpIHtcblx0dmFyIHRpY2tpbmcgPSBmYWxzZTtcblx0dmFyIGFyZ3MgPSBbXTtcblxuXHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0YXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG5cdFx0dGhpc0FyZyA9IHRoaXNBcmcgfHwgdGhpcztcblxuXHRcdGlmICghdGlja2luZykge1xuXHRcdFx0dGlja2luZyA9IHRydWU7XG5cdFx0XHRoZWxwZXJzLnJlcXVlc3RBbmltRnJhbWUuY2FsbCh3aW5kb3csIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR0aWNraW5nID0gZmFsc2U7XG5cdFx0XHRcdGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xufVxuXG4vLyBJbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vbWFyY2ovY3NzLWVsZW1lbnQtcXVlcmllc1xuZnVuY3Rpb24gY3JlYXRlUmVzaXplcihoYW5kbGVyKSB7XG5cdHZhciByZXNpemVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdHZhciBjbHMgPSBDU1NfUFJFRklYICsgJ3NpemUtbW9uaXRvcic7XG5cdHZhciBtYXhTaXplID0gMTAwMDAwMDtcblx0dmFyIHN0eWxlID1cblx0XHQncG9zaXRpb246YWJzb2x1dGU7JyArXG5cdFx0J2xlZnQ6MDsnICtcblx0XHQndG9wOjA7JyArXG5cdFx0J3JpZ2h0OjA7JyArXG5cdFx0J2JvdHRvbTowOycgK1xuXHRcdCdvdmVyZmxvdzpoaWRkZW47JyArXG5cdFx0J3BvaW50ZXItZXZlbnRzOm5vbmU7JyArXG5cdFx0J3Zpc2liaWxpdHk6aGlkZGVuOycgK1xuXHRcdCd6LWluZGV4Oi0xOyc7XG5cblx0cmVzaXplci5zdHlsZS5jc3NUZXh0ID0gc3R5bGU7XG5cdHJlc2l6ZXIuY2xhc3NOYW1lID0gY2xzO1xuXHRyZXNpemVyLmlubmVySFRNTCA9XG5cdFx0JzxkaXYgY2xhc3M9XCInICsgY2xzICsgJy1leHBhbmRcIiBzdHlsZT1cIicgKyBzdHlsZSArICdcIj4nICtcblx0XHRcdCc8ZGl2IHN0eWxlPVwiJyArXG5cdFx0XHRcdCdwb3NpdGlvbjphYnNvbHV0ZTsnICtcblx0XHRcdFx0J3dpZHRoOicgKyBtYXhTaXplICsgJ3B4OycgK1xuXHRcdFx0XHQnaGVpZ2h0OicgKyBtYXhTaXplICsgJ3B4OycgK1xuXHRcdFx0XHQnbGVmdDowOycgK1xuXHRcdFx0XHQndG9wOjBcIj4nICtcblx0XHRcdCc8L2Rpdj4nICtcblx0XHQnPC9kaXY+JyArXG5cdFx0JzxkaXYgY2xhc3M9XCInICsgY2xzICsgJy1zaHJpbmtcIiBzdHlsZT1cIicgKyBzdHlsZSArICdcIj4nICtcblx0XHRcdCc8ZGl2IHN0eWxlPVwiJyArXG5cdFx0XHRcdCdwb3NpdGlvbjphYnNvbHV0ZTsnICtcblx0XHRcdFx0J3dpZHRoOjIwMCU7JyArXG5cdFx0XHRcdCdoZWlnaHQ6MjAwJTsnICtcblx0XHRcdFx0J2xlZnQ6MDsgJyArXG5cdFx0XHRcdCd0b3A6MFwiPicgK1xuXHRcdFx0JzwvZGl2PicgK1xuXHRcdCc8L2Rpdj4nO1xuXG5cdHZhciBleHBhbmQgPSByZXNpemVyLmNoaWxkTm9kZXNbMF07XG5cdHZhciBzaHJpbmsgPSByZXNpemVyLmNoaWxkTm9kZXNbMV07XG5cblx0cmVzaXplci5fcmVzZXQgPSBmdW5jdGlvbigpIHtcblx0XHRleHBhbmQuc2Nyb2xsTGVmdCA9IG1heFNpemU7XG5cdFx0ZXhwYW5kLnNjcm9sbFRvcCA9IG1heFNpemU7XG5cdFx0c2hyaW5rLnNjcm9sbExlZnQgPSBtYXhTaXplO1xuXHRcdHNocmluay5zY3JvbGxUb3AgPSBtYXhTaXplO1xuXHR9O1xuXHR2YXIgb25TY3JvbGwgPSBmdW5jdGlvbigpIHtcblx0XHRyZXNpemVyLl9yZXNldCgpO1xuXHRcdGhhbmRsZXIoKTtcblx0fTtcblxuXHRhZGRFdmVudExpc3RlbmVyKGV4cGFuZCwgJ3Njcm9sbCcsIG9uU2Nyb2xsLmJpbmQoZXhwYW5kLCAnZXhwYW5kJykpO1xuXHRhZGRFdmVudExpc3RlbmVyKHNocmluaywgJ3Njcm9sbCcsIG9uU2Nyb2xsLmJpbmQoc2hyaW5rLCAnc2hyaW5rJykpO1xuXG5cdHJldHVybiByZXNpemVyO1xufVxuXG4vLyBodHRwczovL2Rhdmlkd2Fsc2gubmFtZS9kZXRlY3Qtbm9kZS1pbnNlcnRpb25cbmZ1bmN0aW9uIHdhdGNoRm9yUmVuZGVyKG5vZGUsIGhhbmRsZXIpIHtcblx0dmFyIGV4cGFuZG8gPSBub2RlW0VYUEFORE9fS0VZXSB8fCAobm9kZVtFWFBBTkRPX0tFWV0gPSB7fSk7XG5cdHZhciBwcm94eSA9IGV4cGFuZG8ucmVuZGVyUHJveHkgPSBmdW5jdGlvbihlKSB7XG5cdFx0aWYgKGUuYW5pbWF0aW9uTmFtZSA9PT0gQ1NTX1JFTkRFUl9BTklNQVRJT04pIHtcblx0XHRcdGhhbmRsZXIoKTtcblx0XHR9XG5cdH07XG5cblx0aGVscGVycy5lYWNoKEFOSU1BVElPTl9TVEFSVF9FVkVOVFMsIGZ1bmN0aW9uKHR5cGUpIHtcblx0XHRhZGRFdmVudExpc3RlbmVyKG5vZGUsIHR5cGUsIHByb3h5KTtcblx0fSk7XG5cblx0Ly8gIzQ3Mzc6IENocm9tZSBtaWdodCBza2lwIHRoZSBDU1MgYW5pbWF0aW9uIHdoZW4gdGhlIENTU19SRU5ERVJfTU9OSVRPUiBjbGFzc1xuXHQvLyBpcyByZW1vdmVkIHRoZW4gYWRkZWQgYmFjayBpbW1lZGlhdGVseSAoc2FtZSBhbmltYXRpb24gZnJhbWU/KS4gQWNjZXNzaW5nIHRoZVxuXHQvLyBgb2Zmc2V0UGFyZW50YCBwcm9wZXJ0eSB3aWxsIGZvcmNlIGEgcmVmbG93IGFuZCByZS1ldmFsdWF0ZSB0aGUgQ1NTIGFuaW1hdGlvbi5cblx0Ly8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vcGF1bGlyaXNoLzVkNTJmYjA4MWIzNTcwYzgxZTNhI2JveC1tZXRyaWNzXG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy80NzM3XG5cdGV4cGFuZG8ucmVmbG93ID0gISFub2RlLm9mZnNldFBhcmVudDtcblxuXHRub2RlLmNsYXNzTGlzdC5hZGQoQ1NTX1JFTkRFUl9NT05JVE9SKTtcbn1cblxuZnVuY3Rpb24gdW53YXRjaEZvclJlbmRlcihub2RlKSB7XG5cdHZhciBleHBhbmRvID0gbm9kZVtFWFBBTkRPX0tFWV0gfHwge307XG5cdHZhciBwcm94eSA9IGV4cGFuZG8ucmVuZGVyUHJveHk7XG5cblx0aWYgKHByb3h5KSB7XG5cdFx0aGVscGVycy5lYWNoKEFOSU1BVElPTl9TVEFSVF9FVkVOVFMsIGZ1bmN0aW9uKHR5cGUpIHtcblx0XHRcdHJlbW92ZUV2ZW50TGlzdGVuZXIobm9kZSwgdHlwZSwgcHJveHkpO1xuXHRcdH0pO1xuXG5cdFx0ZGVsZXRlIGV4cGFuZG8ucmVuZGVyUHJveHk7XG5cdH1cblxuXHRub2RlLmNsYXNzTGlzdC5yZW1vdmUoQ1NTX1JFTkRFUl9NT05JVE9SKTtcbn1cblxuZnVuY3Rpb24gYWRkUmVzaXplTGlzdGVuZXIobm9kZSwgbGlzdGVuZXIsIGNoYXJ0KSB7XG5cdHZhciBleHBhbmRvID0gbm9kZVtFWFBBTkRPX0tFWV0gfHwgKG5vZGVbRVhQQU5ET19LRVldID0ge30pO1xuXG5cdC8vIExldCdzIGtlZXAgdHJhY2sgb2YgdGhpcyBhZGRlZCByZXNpemVyIGFuZCB0aHVzIGF2b2lkIERPTSBxdWVyeSB3aGVuIHJlbW92aW5nIGl0LlxuXHR2YXIgcmVzaXplciA9IGV4cGFuZG8ucmVzaXplciA9IGNyZWF0ZVJlc2l6ZXIodGhyb3R0bGVkKGZ1bmN0aW9uKCkge1xuXHRcdGlmIChleHBhbmRvLnJlc2l6ZXIpIHtcblx0XHRcdHJldHVybiBsaXN0ZW5lcihjcmVhdGVFdmVudCgncmVzaXplJywgY2hhcnQpKTtcblx0XHR9XG5cdH0pKTtcblxuXHQvLyBUaGUgcmVzaXplciBuZWVkcyB0byBiZSBhdHRhY2hlZCB0byB0aGUgbm9kZSBwYXJlbnQsIHNvIHdlIGZpcnN0IG5lZWQgdG8gYmVcblx0Ly8gc3VyZSB0aGF0IGBub2RlYCBpcyBhdHRhY2hlZCB0byB0aGUgRE9NIGJlZm9yZSBpbmplY3RpbmcgdGhlIHJlc2l6ZXIgZWxlbWVudC5cblx0d2F0Y2hGb3JSZW5kZXIobm9kZSwgZnVuY3Rpb24oKSB7XG5cdFx0aWYgKGV4cGFuZG8ucmVzaXplcikge1xuXHRcdFx0dmFyIGNvbnRhaW5lciA9IG5vZGUucGFyZW50Tm9kZTtcblx0XHRcdGlmIChjb250YWluZXIgJiYgY29udGFpbmVyICE9PSByZXNpemVyLnBhcmVudE5vZGUpIHtcblx0XHRcdFx0Y29udGFpbmVyLmluc2VydEJlZm9yZShyZXNpemVyLCBjb250YWluZXIuZmlyc3RDaGlsZCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZSBjb250YWluZXIgc2l6ZSBtaWdodCBoYXZlIGNoYW5nZWQsIGxldCdzIHJlc2V0IHRoZSByZXNpemVyIHN0YXRlLlxuXHRcdFx0cmVzaXplci5fcmVzZXQoKTtcblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVSZXNpemVMaXN0ZW5lcihub2RlKSB7XG5cdHZhciBleHBhbmRvID0gbm9kZVtFWFBBTkRPX0tFWV0gfHwge307XG5cdHZhciByZXNpemVyID0gZXhwYW5kby5yZXNpemVyO1xuXG5cdGRlbGV0ZSBleHBhbmRvLnJlc2l6ZXI7XG5cdHVud2F0Y2hGb3JSZW5kZXIobm9kZSk7XG5cblx0aWYgKHJlc2l6ZXIgJiYgcmVzaXplci5wYXJlbnROb2RlKSB7XG5cdFx0cmVzaXplci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHJlc2l6ZXIpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGluamVjdENTUyhwbGF0Zm9ybSwgY3NzKSB7XG5cdC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xLzM5MjIxMzlcblx0dmFyIHN0eWxlID0gcGxhdGZvcm0uX3N0eWxlIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG5cdGlmICghcGxhdGZvcm0uX3N0eWxlKSB7XG5cdFx0cGxhdGZvcm0uX3N0eWxlID0gc3R5bGU7XG5cdFx0Y3NzID0gJy8qIENoYXJ0LmpzICovXFxuJyArIGNzcztcblx0XHRzdHlsZS5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9jc3MnKTtcblx0XHRkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdLmFwcGVuZENoaWxkKHN0eWxlKTtcblx0fVxuXG5cdHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0LyoqXG5cdCAqIFRoaXMgcHJvcGVydHkgaG9sZHMgd2hldGhlciB0aGlzIHBsYXRmb3JtIGlzIGVuYWJsZWQgZm9yIHRoZSBjdXJyZW50IGVudmlyb25tZW50LlxuXHQgKiBDdXJyZW50bHkgdXNlZCBieSBwbGF0Zm9ybS5qcyB0byBzZWxlY3QgdGhlIHByb3BlciBpbXBsZW1lbnRhdGlvbi5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9lbmFibGVkOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnLFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBrZXlmcmFtZXMgPSAnZnJvbXtvcGFjaXR5OjAuOTl9dG97b3BhY2l0eToxfSc7XG5cblx0XHRpbmplY3RDU1ModGhpcyxcblx0XHRcdC8vIERPTSByZW5kZXJpbmcgZGV0ZWN0aW9uXG5cdFx0XHQvLyBodHRwczovL2Rhdmlkd2Fsc2gubmFtZS9kZXRlY3Qtbm9kZS1pbnNlcnRpb25cblx0XHRcdCdALXdlYmtpdC1rZXlmcmFtZXMgJyArIENTU19SRU5ERVJfQU5JTUFUSU9OICsgJ3snICsga2V5ZnJhbWVzICsgJ30nICtcblx0XHRcdCdAa2V5ZnJhbWVzICcgKyBDU1NfUkVOREVSX0FOSU1BVElPTiArICd7JyArIGtleWZyYW1lcyArICd9JyArXG5cdFx0XHQnLicgKyBDU1NfUkVOREVSX01PTklUT1IgKyAneycgK1xuXHRcdFx0XHQnLXdlYmtpdC1hbmltYXRpb246JyArIENTU19SRU5ERVJfQU5JTUFUSU9OICsgJyAwLjAwMXM7JyArXG5cdFx0XHRcdCdhbmltYXRpb246JyArIENTU19SRU5ERVJfQU5JTUFUSU9OICsgJyAwLjAwMXM7JyArXG5cdFx0XHQnfSdcblx0XHQpO1xuXHR9LFxuXG5cdGFjcXVpcmVDb250ZXh0OiBmdW5jdGlvbihpdGVtLCBjb25maWcpIHtcblx0XHRpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRpdGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaXRlbSk7XG5cdFx0fSBlbHNlIGlmIChpdGVtLmxlbmd0aCkge1xuXHRcdFx0Ly8gU3VwcG9ydCBmb3IgYXJyYXkgYmFzZWQgcXVlcmllcyAoc3VjaCBhcyBqUXVlcnkpXG5cdFx0XHRpdGVtID0gaXRlbVswXTtcblx0XHR9XG5cblx0XHRpZiAoaXRlbSAmJiBpdGVtLmNhbnZhcykge1xuXHRcdFx0Ly8gU3VwcG9ydCBmb3IgYW55IG9iamVjdCBhc3NvY2lhdGVkIHRvIGEgY2FudmFzIChpbmNsdWRpbmcgYSBjb250ZXh0MmQpXG5cdFx0XHRpdGVtID0gaXRlbS5jYW52YXM7XG5cdFx0fVxuXG5cdFx0Ly8gVG8gcHJldmVudCBjYW52YXMgZmluZ2VycHJpbnRpbmcsIHNvbWUgYWRkLW9ucyB1bmRlZmluZSB0aGUgZ2V0Q29udGV4dFxuXHRcdC8vIG1ldGhvZCwgZm9yIGV4YW1wbGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ra2Fwc25lci9DYW52YXNCbG9ja2VyXG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzI4MDdcblx0XHR2YXIgY29udGV4dCA9IGl0ZW0gJiYgaXRlbS5nZXRDb250ZXh0ICYmIGl0ZW0uZ2V0Q29udGV4dCgnMmQnKTtcblxuXHRcdC8vIGBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50L0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRGAgZmFpbHMgd2hlbiB0aGUgaXRlbSBpc1xuXHRcdC8vIGluc2lkZSBhbiBpZnJhbWUgb3Igd2hlbiBydW5uaW5nIGluIGEgcHJvdGVjdGVkIGVudmlyb25tZW50LiBXZSBjb3VsZCBndWVzcyB0aGVcblx0XHQvLyB0eXBlcyBmcm9tIHRoZWlyIHRvU3RyaW5nKCkgdmFsdWUgYnV0IGxldCdzIGtlZXAgdGhpbmdzIGZsZXhpYmxlIGFuZCBhc3N1bWUgaXQnc1xuXHRcdC8vIGEgc3VmZmljaWVudCBjb25kaXRpb24gaWYgdGhlIGl0ZW0gaGFzIGEgY29udGV4dDJEIHdoaWNoIGhhcyBpdGVtIGFzIGBjYW52YXNgLlxuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy8zODg3XG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzQxMDJcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvNDE1MlxuXHRcdGlmIChjb250ZXh0ICYmIGNvbnRleHQuY2FudmFzID09PSBpdGVtKSB7XG5cdFx0XHRpbml0Q2FudmFzKGl0ZW0sIGNvbmZpZyk7XG5cdFx0XHRyZXR1cm4gY29udGV4dDtcblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fSxcblxuXHRyZWxlYXNlQ29udGV4dDogZnVuY3Rpb24oY29udGV4dCkge1xuXHRcdHZhciBjYW52YXMgPSBjb250ZXh0LmNhbnZhcztcblx0XHRpZiAoIWNhbnZhc1tFWFBBTkRPX0tFWV0pIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgaW5pdGlhbCA9IGNhbnZhc1tFWFBBTkRPX0tFWV0uaW5pdGlhbDtcblx0XHRbJ2hlaWdodCcsICd3aWR0aCddLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuXHRcdFx0dmFyIHZhbHVlID0gaW5pdGlhbFtwcm9wXTtcblx0XHRcdGlmIChoZWxwZXJzLmlzTnVsbE9yVW5kZWYodmFsdWUpKSB7XG5cdFx0XHRcdGNhbnZhcy5yZW1vdmVBdHRyaWJ1dGUocHJvcCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjYW52YXMuc2V0QXR0cmlidXRlKHByb3AsIHZhbHVlKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGhlbHBlcnMuZWFjaChpbml0aWFsLnN0eWxlIHx8IHt9LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG5cdFx0XHRjYW52YXMuc3R5bGVba2V5XSA9IHZhbHVlO1xuXHRcdH0pO1xuXG5cdFx0Ly8gVGhlIGNhbnZhcyByZW5kZXIgc2l6ZSBtaWdodCBoYXZlIGJlZW4gY2hhbmdlZCAoYW5kIHRodXMgdGhlIHN0YXRlIHN0YWNrIGRpc2NhcmRlZCksXG5cdFx0Ly8gd2UgY2FuJ3QgdXNlIHNhdmUoKSBhbmQgcmVzdG9yZSgpIHRvIHJlc3RvcmUgdGhlIGluaXRpYWwgc3RhdGUuIFNvIG1ha2Ugc3VyZSB0aGF0IGF0XG5cdFx0Ly8gbGVhc3QgdGhlIGNhbnZhcyBjb250ZXh0IGlzIHJlc2V0IHRvIHRoZSBkZWZhdWx0IHN0YXRlIGJ5IHNldHRpbmcgdGhlIGNhbnZhcyB3aWR0aC5cblx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMS9XRC1odG1sNS0yMDExMDUyNS90aGUtY2FudmFzLWVsZW1lbnQuaHRtbFxuXHRcdGNhbnZhcy53aWR0aCA9IGNhbnZhcy53aWR0aDtcblxuXHRcdGRlbGV0ZSBjYW52YXNbRVhQQU5ET19LRVldO1xuXHR9LFxuXG5cdGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uKGNoYXJ0LCB0eXBlLCBsaXN0ZW5lcikge1xuXHRcdHZhciBjYW52YXMgPSBjaGFydC5jYW52YXM7XG5cdFx0aWYgKHR5cGUgPT09ICdyZXNpemUnKSB7XG5cdFx0XHQvLyBOb3RlOiB0aGUgcmVzaXplIGV2ZW50IGlzIG5vdCBzdXBwb3J0ZWQgb24gYWxsIGJyb3dzZXJzLlxuXHRcdFx0YWRkUmVzaXplTGlzdGVuZXIoY2FudmFzLCBsaXN0ZW5lciwgY2hhcnQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBleHBhbmRvID0gbGlzdGVuZXJbRVhQQU5ET19LRVldIHx8IChsaXN0ZW5lcltFWFBBTkRPX0tFWV0gPSB7fSk7XG5cdFx0dmFyIHByb3hpZXMgPSBleHBhbmRvLnByb3hpZXMgfHwgKGV4cGFuZG8ucHJveGllcyA9IHt9KTtcblx0XHR2YXIgcHJveHkgPSBwcm94aWVzW2NoYXJ0LmlkICsgJ18nICsgdHlwZV0gPSBmdW5jdGlvbihldmVudCkge1xuXHRcdFx0bGlzdGVuZXIoZnJvbU5hdGl2ZUV2ZW50KGV2ZW50LCBjaGFydCkpO1xuXHRcdH07XG5cblx0XHRhZGRFdmVudExpc3RlbmVyKGNhbnZhcywgdHlwZSwgcHJveHkpO1xuXHR9LFxuXG5cdHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uKGNoYXJ0LCB0eXBlLCBsaXN0ZW5lcikge1xuXHRcdHZhciBjYW52YXMgPSBjaGFydC5jYW52YXM7XG5cdFx0aWYgKHR5cGUgPT09ICdyZXNpemUnKSB7XG5cdFx0XHQvLyBOb3RlOiB0aGUgcmVzaXplIGV2ZW50IGlzIG5vdCBzdXBwb3J0ZWQgb24gYWxsIGJyb3dzZXJzLlxuXHRcdFx0cmVtb3ZlUmVzaXplTGlzdGVuZXIoY2FudmFzLCBsaXN0ZW5lcik7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGV4cGFuZG8gPSBsaXN0ZW5lcltFWFBBTkRPX0tFWV0gfHwge307XG5cdFx0dmFyIHByb3hpZXMgPSBleHBhbmRvLnByb3hpZXMgfHwge307XG5cdFx0dmFyIHByb3h5ID0gcHJveGllc1tjaGFydC5pZCArICdfJyArIHR5cGVdO1xuXHRcdGlmICghcHJveHkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRyZW1vdmVFdmVudExpc3RlbmVyKGNhbnZhcywgdHlwZSwgcHJveHkpO1xuXHR9XG59O1xuXG4vLyBERVBSRUNBVElPTlNcblxuLyoqXG4gKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdXNlIEV2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIgaW5zdGVhZC5cbiAqIEV2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIgY29tcGF0aWJpbGl0eTogQ2hyb21lLCBPcGVyYSA3LCBTYWZhcmksIEZGMS41KywgSUU5K1xuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRUYXJnZXQvYWRkRXZlbnRMaXN0ZW5lclxuICogQGZ1bmN0aW9uIENoYXJ0LmhlbHBlcnMuYWRkRXZlbnRcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi43LjBcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcbiAqIEBwcml2YXRlXG4gKi9cbmhlbHBlcnMuYWRkRXZlbnQgPSBhZGRFdmVudExpc3RlbmVyO1xuXG4vKipcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB1c2UgRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lciBpbnN0ZWFkLlxuICogRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lciBjb21wYXRpYmlsaXR5OiBDaHJvbWUsIE9wZXJhIDcsIFNhZmFyaSwgRkYxLjUrLCBJRTkrXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9FdmVudFRhcmdldC9yZW1vdmVFdmVudExpc3RlbmVyXG4gKiBAZnVuY3Rpb24gQ2hhcnQuaGVscGVycy5yZW1vdmVFdmVudFxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjcuMFxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xuICogQHByaXZhdGVcbiAqL1xuaGVscGVycy5yZW1vdmVFdmVudCA9IHJlbW92ZUV2ZW50TGlzdGVuZXI7XG5cbn0se1wiNDZcIjo0Nn1dLDQ5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcbnZhciBiYXNpYyA9IHJlcXVpcmUoNDcpO1xudmFyIGRvbSA9IHJlcXVpcmUoNDgpO1xuXG4vLyBAVE9ETyBNYWtlIHBvc3NpYmxlIHRvIHNlbGVjdCBhbm90aGVyIHBsYXRmb3JtIGF0IGJ1aWxkIHRpbWUuXG52YXIgaW1wbGVtZW50YXRpb24gPSBkb20uX2VuYWJsZWQgPyBkb20gOiBiYXNpYztcblxuLyoqXG4gKiBAbmFtZXNwYWNlIENoYXJ0LnBsYXRmb3JtXG4gKiBAc2VlIGh0dHBzOi8vY2hhcnRqcy5naXRib29rcy5pby9wcm9wb3NhbHMvY29udGVudC9QbGF0Zm9ybS5odG1sXG4gKiBAc2luY2UgMi40LjBcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBoZWxwZXJzLmV4dGVuZCh7XG5cdC8qKlxuXHQgKiBAc2luY2UgMi43LjBcblx0ICovXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge30sXG5cblx0LyoqXG5cdCAqIENhbGxlZCBhdCBjaGFydCBjb25zdHJ1Y3Rpb24gdGltZSwgcmV0dXJucyBhIGNvbnRleHQyZCBpbnN0YW5jZSBpbXBsZW1lbnRpbmdcblx0ICogdGhlIFtXM0MgQ2FudmFzIDJEIENvbnRleHQgQVBJIHN0YW5kYXJkXXtAbGluayBodHRwczovL3d3dy53My5vcmcvVFIvMmRjb250ZXh0L30uXG5cdCAqIEBwYXJhbSB7Kn0gaXRlbSAtIFRoZSBuYXRpdmUgaXRlbSBmcm9tIHdoaWNoIHRvIGFjcXVpcmUgY29udGV4dCAocGxhdGZvcm0gc3BlY2lmaWMpXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIGNoYXJ0IG9wdGlvbnNcblx0ICogQHJldHVybnMge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY29udGV4dDJkIGluc3RhbmNlXG5cdCAqL1xuXHRhY3F1aXJlQ29udGV4dDogZnVuY3Rpb24oKSB7fSxcblxuXHQvKipcblx0ICogQ2FsbGVkIGF0IGNoYXJ0IGRlc3RydWN0aW9uIHRpbWUsIHJlbGVhc2VzIGFueSByZXNvdXJjZXMgYXNzb2NpYXRlZCB0byB0aGUgY29udGV4dFxuXHQgKiBwcmV2aW91c2x5IHJldHVybmVkIGJ5IHRoZSBhY3F1aXJlQ29udGV4dCgpIG1ldGhvZC5cblx0ICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGNvbnRleHQgLSBUaGUgY29udGV4dDJkIGluc3RhbmNlXG5cdCAqIEByZXR1cm5zIHtCb29sZWFufSB0cnVlIGlmIHRoZSBtZXRob2Qgc3VjY2VlZGVkLCBlbHNlIGZhbHNlXG5cdCAqL1xuXHRyZWxlYXNlQ29udGV4dDogZnVuY3Rpb24oKSB7fSxcblxuXHQvKipcblx0ICogUmVnaXN0ZXJzIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgb24gdGhlIGdpdmVuIGNoYXJ0LlxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIENoYXJ0IGZyb20gd2hpY2ggdG8gbGlzdGVuIGZvciBldmVudFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSAtIFRoZSAoe0BsaW5rIElFdmVudH0pIHR5cGUgdG8gbGlzdGVuIGZvclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciAtIFJlY2VpdmVzIGEgbm90aWZpY2F0aW9uIChhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzXG5cdCAqIHRoZSB7QGxpbmsgSUV2ZW50fSBpbnRlcmZhY2UpIHdoZW4gYW4gZXZlbnQgb2YgdGhlIHNwZWNpZmllZCB0eXBlIG9jY3Vycy5cblx0ICovXG5cdGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uKCkge30sXG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgd2l0aCBhZGRFdmVudExpc3RlbmVyLlxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtQ2hhcnQgZnJvbSB3aGljaCB0byByZW1vdmUgdGhlIGxpc3RlbmVyXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIC0gVGhlICh7QGxpbmsgSUV2ZW50fSkgdHlwZSB0byByZW1vdmVcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgLSBUaGUgbGlzdGVuZXIgZnVuY3Rpb24gdG8gcmVtb3ZlIGZyb20gdGhlIGV2ZW50IHRhcmdldC5cblx0ICovXG5cdHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uKCkge31cblxufSwgaW1wbGVtZW50YXRpb24pO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgSVBsYXRmb3JtXG4gKiBBbGxvd3MgYWJzdHJhY3RpbmcgcGxhdGZvcm0gZGVwZW5kZW5jaWVzIGF3YXkgZnJvbSB0aGUgY2hhcnRcbiAqIEBib3Jyb3dzIENoYXJ0LnBsYXRmb3JtLmFjcXVpcmVDb250ZXh0IGFzIGFjcXVpcmVDb250ZXh0XG4gKiBAYm9ycm93cyBDaGFydC5wbGF0Zm9ybS5yZWxlYXNlQ29udGV4dCBhcyByZWxlYXNlQ29udGV4dFxuICogQGJvcnJvd3MgQ2hhcnQucGxhdGZvcm0uYWRkRXZlbnRMaXN0ZW5lciBhcyBhZGRFdmVudExpc3RlbmVyXG4gKiBAYm9ycm93cyBDaGFydC5wbGF0Zm9ybS5yZW1vdmVFdmVudExpc3RlbmVyIGFzIHJlbW92ZUV2ZW50TGlzdGVuZXJcbiAqL1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgSUV2ZW50XG4gKiBAcHJvcCB7U3RyaW5nfSB0eXBlIC0gVGhlIGV2ZW50IHR5cGUgbmFtZSwgcG9zc2libGUgdmFsdWVzIGFyZTpcbiAqICdjb250ZXh0bWVudScsICdtb3VzZWVudGVyJywgJ21vdXNlZG93bicsICdtb3VzZW1vdmUnLCAnbW91c2V1cCcsICdtb3VzZW91dCcsXG4gKiAnY2xpY2snLCAnZGJsY2xpY2snLCAna2V5ZG93bicsICdrZXlwcmVzcycsICdrZXl1cCcgYW5kICdyZXNpemUnXG4gKiBAcHJvcCB7Kn0gbmF0aXZlIC0gVGhlIG9yaWdpbmFsIG5hdGl2ZSBldmVudCAobnVsbCBmb3IgZW11bGF0ZWQgZXZlbnRzLCBlLmcuICdyZXNpemUnKVxuICogQHByb3Age051bWJlcn0geCAtIFRoZSBtb3VzZSB4IHBvc2l0aW9uLCByZWxhdGl2ZSB0byB0aGUgY2FudmFzIChudWxsIGZvciBpbmNvbXBhdGlibGUgZXZlbnRzKVxuICogQHByb3Age051bWJlcn0geSAtIFRoZSBtb3VzZSB5IHBvc2l0aW9uLCByZWxhdGl2ZSB0byB0aGUgY2FudmFzIChudWxsIGZvciBpbmNvbXBhdGlibGUgZXZlbnRzKVxuICovXG5cbn0se1wiNDZcIjo0NixcIjQ3XCI6NDcsXCI0OFwiOjQ4fV0sNTA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHt9O1xubW9kdWxlLmV4cG9ydHMuZmlsbGVyID0gcmVxdWlyZSg1MSk7XG5tb2R1bGUuZXhwb3J0cy5sZWdlbmQgPSByZXF1aXJlKDUyKTtcbm1vZHVsZS5leHBvcnRzLnRpdGxlID0gcmVxdWlyZSg1Myk7XG5cbn0se1wiNTFcIjo1MSxcIjUyXCI6NTIsXCI1M1wiOjUzfV0sNTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuLyoqXG4gKiBQbHVnaW4gYmFzZWQgb24gZGlzY3Vzc2lvbiBmcm9tIHRoZSBmb2xsb3dpbmcgQ2hhcnQuanMgaXNzdWVzOlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvMjM4MCNpc3N1ZWNvbW1lbnQtMjc5OTYxNTY5XG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy8yNDQwI2lzc3VlY29tbWVudC0yNTY0NjE4OTdcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xudmFyIGVsZW1lbnRzID0gcmVxdWlyZSg0MSk7XG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xuXG5kZWZhdWx0cy5fc2V0KCdnbG9iYWwnLCB7XG5cdHBsdWdpbnM6IHtcblx0XHRmaWxsZXI6IHtcblx0XHRcdHByb3BhZ2F0ZTogdHJ1ZVxuXHRcdH1cblx0fVxufSk7XG5cbnZhciBtYXBwZXJzID0ge1xuXHRkYXRhc2V0OiBmdW5jdGlvbihzb3VyY2UpIHtcblx0XHR2YXIgaW5kZXggPSBzb3VyY2UuZmlsbDtcblx0XHR2YXIgY2hhcnQgPSBzb3VyY2UuY2hhcnQ7XG5cdFx0dmFyIG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShpbmRleCk7XG5cdFx0dmFyIHZpc2libGUgPSBtZXRhICYmIGNoYXJ0LmlzRGF0YXNldFZpc2libGUoaW5kZXgpO1xuXHRcdHZhciBwb2ludHMgPSAodmlzaWJsZSAmJiBtZXRhLmRhdGFzZXQuX2NoaWxkcmVuKSB8fCBbXTtcblx0XHR2YXIgbGVuZ3RoID0gcG9pbnRzLmxlbmd0aCB8fCAwO1xuXG5cdFx0cmV0dXJuICFsZW5ndGggPyBudWxsIDogZnVuY3Rpb24ocG9pbnQsIGkpIHtcblx0XHRcdHJldHVybiAoaSA8IGxlbmd0aCAmJiBwb2ludHNbaV0uX3ZpZXcpIHx8IG51bGw7XG5cdFx0fTtcblx0fSxcblxuXHRib3VuZGFyeTogZnVuY3Rpb24oc291cmNlKSB7XG5cdFx0dmFyIGJvdW5kYXJ5ID0gc291cmNlLmJvdW5kYXJ5O1xuXHRcdHZhciB4ID0gYm91bmRhcnkgPyBib3VuZGFyeS54IDogbnVsbDtcblx0XHR2YXIgeSA9IGJvdW5kYXJ5ID8gYm91bmRhcnkueSA6IG51bGw7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24ocG9pbnQpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHg6IHggPT09IG51bGwgPyBwb2ludC54IDogeCxcblx0XHRcdFx0eTogeSA9PT0gbnVsbCA/IHBvaW50LnkgOiB5LFxuXHRcdFx0fTtcblx0XHR9O1xuXHR9XG59O1xuXG4vLyBAdG9kbyBpZiAoZmlsbFswXSA9PT0gJyMnKVxuZnVuY3Rpb24gZGVjb2RlRmlsbChlbCwgaW5kZXgsIGNvdW50KSB7XG5cdHZhciBtb2RlbCA9IGVsLl9tb2RlbCB8fCB7fTtcblx0dmFyIGZpbGwgPSBtb2RlbC5maWxsO1xuXHR2YXIgdGFyZ2V0O1xuXG5cdGlmIChmaWxsID09PSB1bmRlZmluZWQpIHtcblx0XHRmaWxsID0gISFtb2RlbC5iYWNrZ3JvdW5kQ29sb3I7XG5cdH1cblxuXHRpZiAoZmlsbCA9PT0gZmFsc2UgfHwgZmlsbCA9PT0gbnVsbCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGlmIChmaWxsID09PSB0cnVlKSB7XG5cdFx0cmV0dXJuICdvcmlnaW4nO1xuXHR9XG5cblx0dGFyZ2V0ID0gcGFyc2VGbG9hdChmaWxsLCAxMCk7XG5cdGlmIChpc0Zpbml0ZSh0YXJnZXQpICYmIE1hdGguZmxvb3IodGFyZ2V0KSA9PT0gdGFyZ2V0KSB7XG5cdFx0aWYgKGZpbGxbMF0gPT09ICctJyB8fCBmaWxsWzBdID09PSAnKycpIHtcblx0XHRcdHRhcmdldCA9IGluZGV4ICsgdGFyZ2V0O1xuXHRcdH1cblxuXHRcdGlmICh0YXJnZXQgPT09IGluZGV4IHx8IHRhcmdldCA8IDAgfHwgdGFyZ2V0ID49IGNvdW50KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldDtcblx0fVxuXG5cdHN3aXRjaCAoZmlsbCkge1xuXHQvLyBjb21wYXRpYmlsaXR5XG5cdGNhc2UgJ2JvdHRvbSc6XG5cdFx0cmV0dXJuICdzdGFydCc7XG5cdGNhc2UgJ3RvcCc6XG5cdFx0cmV0dXJuICdlbmQnO1xuXHRjYXNlICd6ZXJvJzpcblx0XHRyZXR1cm4gJ29yaWdpbic7XG5cdC8vIHN1cHBvcnRlZCBib3VuZGFyaWVzXG5cdGNhc2UgJ29yaWdpbic6XG5cdGNhc2UgJ3N0YXJ0Jzpcblx0Y2FzZSAnZW5kJzpcblx0XHRyZXR1cm4gZmlsbDtcblx0Ly8gaW52YWxpZCBmaWxsIHZhbHVlc1xuXHRkZWZhdWx0OlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5mdW5jdGlvbiBjb21wdXRlQm91bmRhcnkoc291cmNlKSB7XG5cdHZhciBtb2RlbCA9IHNvdXJjZS5lbC5fbW9kZWwgfHwge307XG5cdHZhciBzY2FsZSA9IHNvdXJjZS5lbC5fc2NhbGUgfHwge307XG5cdHZhciBmaWxsID0gc291cmNlLmZpbGw7XG5cdHZhciB0YXJnZXQgPSBudWxsO1xuXHR2YXIgaG9yaXpvbnRhbDtcblxuXHRpZiAoaXNGaW5pdGUoZmlsbCkpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIEJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IHVudGlsIHYzLCB3ZSBzdGlsbCBuZWVkIHRvIHN1cHBvcnQgYm91bmRhcnkgdmFsdWVzIHNldCBvblxuXHQvLyB0aGUgbW9kZWwgKHNjYWxlVG9wLCBzY2FsZUJvdHRvbSBhbmQgc2NhbGVaZXJvKSBiZWNhdXNlIHNvbWUgZXh0ZXJuYWwgcGx1Z2lucyBhbmRcblx0Ly8gY29udHJvbGxlcnMgbWlnaHQgc3RpbGwgdXNlIGl0IChlLmcuIHRoZSBTbWl0aCBjaGFydCkuXG5cblx0aWYgKGZpbGwgPT09ICdzdGFydCcpIHtcblx0XHR0YXJnZXQgPSBtb2RlbC5zY2FsZUJvdHRvbSA9PT0gdW5kZWZpbmVkID8gc2NhbGUuYm90dG9tIDogbW9kZWwuc2NhbGVCb3R0b207XG5cdH0gZWxzZSBpZiAoZmlsbCA9PT0gJ2VuZCcpIHtcblx0XHR0YXJnZXQgPSBtb2RlbC5zY2FsZVRvcCA9PT0gdW5kZWZpbmVkID8gc2NhbGUudG9wIDogbW9kZWwuc2NhbGVUb3A7XG5cdH0gZWxzZSBpZiAobW9kZWwuc2NhbGVaZXJvICE9PSB1bmRlZmluZWQpIHtcblx0XHR0YXJnZXQgPSBtb2RlbC5zY2FsZVplcm87XG5cdH0gZWxzZSBpZiAoc2NhbGUuZ2V0QmFzZVBvc2l0aW9uKSB7XG5cdFx0dGFyZ2V0ID0gc2NhbGUuZ2V0QmFzZVBvc2l0aW9uKCk7XG5cdH0gZWxzZSBpZiAoc2NhbGUuZ2V0QmFzZVBpeGVsKSB7XG5cdFx0dGFyZ2V0ID0gc2NhbGUuZ2V0QmFzZVBpeGVsKCk7XG5cdH1cblxuXHRpZiAodGFyZ2V0ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0ICE9PSBudWxsKSB7XG5cdFx0aWYgKHRhcmdldC54ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0LnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRhcmdldDtcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIHRhcmdldCA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodGFyZ2V0KSkge1xuXHRcdFx0aG9yaXpvbnRhbCA9IHNjYWxlLmlzSG9yaXpvbnRhbCgpO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0eDogaG9yaXpvbnRhbCA/IHRhcmdldCA6IG51bGwsXG5cdFx0XHRcdHk6IGhvcml6b250YWwgPyBudWxsIDogdGFyZ2V0XG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlVGFyZ2V0KHNvdXJjZXMsIGluZGV4LCBwcm9wYWdhdGUpIHtcblx0dmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xuXHR2YXIgZmlsbCA9IHNvdXJjZS5maWxsO1xuXHR2YXIgdmlzaXRlZCA9IFtpbmRleF07XG5cdHZhciB0YXJnZXQ7XG5cblx0aWYgKCFwcm9wYWdhdGUpIHtcblx0XHRyZXR1cm4gZmlsbDtcblx0fVxuXG5cdHdoaWxlIChmaWxsICE9PSBmYWxzZSAmJiB2aXNpdGVkLmluZGV4T2YoZmlsbCkgPT09IC0xKSB7XG5cdFx0aWYgKCFpc0Zpbml0ZShmaWxsKSkge1xuXHRcdFx0cmV0dXJuIGZpbGw7XG5cdFx0fVxuXG5cdFx0dGFyZ2V0ID0gc291cmNlc1tmaWxsXTtcblx0XHRpZiAoIXRhcmdldCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmICh0YXJnZXQudmlzaWJsZSkge1xuXHRcdFx0cmV0dXJuIGZpbGw7XG5cdFx0fVxuXG5cdFx0dmlzaXRlZC5wdXNoKGZpbGwpO1xuXHRcdGZpbGwgPSB0YXJnZXQuZmlsbDtcblx0fVxuXG5cdHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlTWFwcGVyKHNvdXJjZSkge1xuXHR2YXIgZmlsbCA9IHNvdXJjZS5maWxsO1xuXHR2YXIgdHlwZSA9ICdkYXRhc2V0JztcblxuXHRpZiAoZmlsbCA9PT0gZmFsc2UpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGlmICghaXNGaW5pdGUoZmlsbCkpIHtcblx0XHR0eXBlID0gJ2JvdW5kYXJ5Jztcblx0fVxuXG5cdHJldHVybiBtYXBwZXJzW3R5cGVdKHNvdXJjZSk7XG59XG5cbmZ1bmN0aW9uIGlzRHJhd2FibGUocG9pbnQpIHtcblx0cmV0dXJuIHBvaW50ICYmICFwb2ludC5za2lwO1xufVxuXG5mdW5jdGlvbiBkcmF3QXJlYShjdHgsIGN1cnZlMCwgY3VydmUxLCBsZW4wLCBsZW4xKSB7XG5cdHZhciBpO1xuXG5cdGlmICghbGVuMCB8fCAhbGVuMSkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIGJ1aWxkaW5nIGZpcnN0IGFyZWEgY3VydmUgKG5vcm1hbClcblx0Y3R4Lm1vdmVUbyhjdXJ2ZTBbMF0ueCwgY3VydmUwWzBdLnkpO1xuXHRmb3IgKGkgPSAxOyBpIDwgbGVuMDsgKytpKSB7XG5cdFx0aGVscGVycy5jYW52YXMubGluZVRvKGN0eCwgY3VydmUwW2kgLSAxXSwgY3VydmUwW2ldKTtcblx0fVxuXG5cdC8vIGpvaW5pbmcgdGhlIHR3byBhcmVhIGN1cnZlc1xuXHRjdHgubGluZVRvKGN1cnZlMVtsZW4xIC0gMV0ueCwgY3VydmUxW2xlbjEgLSAxXS55KTtcblxuXHQvLyBidWlsZGluZyBvcHBvc2l0ZSBhcmVhIGN1cnZlIChyZXZlcnNlKVxuXHRmb3IgKGkgPSBsZW4xIC0gMTsgaSA+IDA7IC0taSkge1xuXHRcdGhlbHBlcnMuY2FudmFzLmxpbmVUbyhjdHgsIGN1cnZlMVtpXSwgY3VydmUxW2kgLSAxXSwgdHJ1ZSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gZG9GaWxsKGN0eCwgcG9pbnRzLCBtYXBwZXIsIHZpZXcsIGNvbG9yLCBsb29wKSB7XG5cdHZhciBjb3VudCA9IHBvaW50cy5sZW5ndGg7XG5cdHZhciBzcGFuID0gdmlldy5zcGFuR2Fwcztcblx0dmFyIGN1cnZlMCA9IFtdO1xuXHR2YXIgY3VydmUxID0gW107XG5cdHZhciBsZW4wID0gMDtcblx0dmFyIGxlbjEgPSAwO1xuXHR2YXIgaSwgaWxlbiwgaW5kZXgsIHAwLCBwMSwgZDAsIGQxO1xuXG5cdGN0eC5iZWdpblBhdGgoKTtcblxuXHRmb3IgKGkgPSAwLCBpbGVuID0gKGNvdW50ICsgISFsb29wKTsgaSA8IGlsZW47ICsraSkge1xuXHRcdGluZGV4ID0gaSAlIGNvdW50O1xuXHRcdHAwID0gcG9pbnRzW2luZGV4XS5fdmlldztcblx0XHRwMSA9IG1hcHBlcihwMCwgaW5kZXgsIHZpZXcpO1xuXHRcdGQwID0gaXNEcmF3YWJsZShwMCk7XG5cdFx0ZDEgPSBpc0RyYXdhYmxlKHAxKTtcblxuXHRcdGlmIChkMCAmJiBkMSkge1xuXHRcdFx0bGVuMCA9IGN1cnZlMC5wdXNoKHAwKTtcblx0XHRcdGxlbjEgPSBjdXJ2ZTEucHVzaChwMSk7XG5cdFx0fSBlbHNlIGlmIChsZW4wICYmIGxlbjEpIHtcblx0XHRcdGlmICghc3Bhbikge1xuXHRcdFx0XHRkcmF3QXJlYShjdHgsIGN1cnZlMCwgY3VydmUxLCBsZW4wLCBsZW4xKTtcblx0XHRcdFx0bGVuMCA9IGxlbjEgPSAwO1xuXHRcdFx0XHRjdXJ2ZTAgPSBbXTtcblx0XHRcdFx0Y3VydmUxID0gW107XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoZDApIHtcblx0XHRcdFx0XHRjdXJ2ZTAucHVzaChwMCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGQxKSB7XG5cdFx0XHRcdFx0Y3VydmUxLnB1c2gocDEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0ZHJhd0FyZWEoY3R4LCBjdXJ2ZTAsIGN1cnZlMSwgbGVuMCwgbGVuMSk7XG5cblx0Y3R4LmNsb3NlUGF0aCgpO1xuXHRjdHguZmlsbFN0eWxlID0gY29sb3I7XG5cdGN0eC5maWxsKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRpZDogJ2ZpbGxlcicsXG5cblx0YWZ0ZXJEYXRhc2V0c1VwZGF0ZTogZnVuY3Rpb24oY2hhcnQsIG9wdGlvbnMpIHtcblx0XHR2YXIgY291bnQgPSAoY2hhcnQuZGF0YS5kYXRhc2V0cyB8fCBbXSkubGVuZ3RoO1xuXHRcdHZhciBwcm9wYWdhdGUgPSBvcHRpb25zLnByb3BhZ2F0ZTtcblx0XHR2YXIgc291cmNlcyA9IFtdO1xuXHRcdHZhciBtZXRhLCBpLCBlbCwgc291cmNlO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcblx0XHRcdG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShpKTtcblx0XHRcdGVsID0gbWV0YS5kYXRhc2V0O1xuXHRcdFx0c291cmNlID0gbnVsbDtcblxuXHRcdFx0aWYgKGVsICYmIGVsLl9tb2RlbCAmJiBlbCBpbnN0YW5jZW9mIGVsZW1lbnRzLkxpbmUpIHtcblx0XHRcdFx0c291cmNlID0ge1xuXHRcdFx0XHRcdHZpc2libGU6IGNoYXJ0LmlzRGF0YXNldFZpc2libGUoaSksXG5cdFx0XHRcdFx0ZmlsbDogZGVjb2RlRmlsbChlbCwgaSwgY291bnQpLFxuXHRcdFx0XHRcdGNoYXJ0OiBjaGFydCxcblx0XHRcdFx0XHRlbDogZWxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0bWV0YS4kZmlsbGVyID0gc291cmNlO1xuXHRcdFx0c291cmNlcy5wdXNoKHNvdXJjZSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHtcblx0XHRcdHNvdXJjZSA9IHNvdXJjZXNbaV07XG5cdFx0XHRpZiAoIXNvdXJjZSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0c291cmNlLmZpbGwgPSByZXNvbHZlVGFyZ2V0KHNvdXJjZXMsIGksIHByb3BhZ2F0ZSk7XG5cdFx0XHRzb3VyY2UuYm91bmRhcnkgPSBjb21wdXRlQm91bmRhcnkoc291cmNlKTtcblx0XHRcdHNvdXJjZS5tYXBwZXIgPSBjcmVhdGVNYXBwZXIoc291cmNlKTtcblx0XHR9XG5cdH0sXG5cblx0YmVmb3JlRGF0YXNldERyYXc6IGZ1bmN0aW9uKGNoYXJ0LCBhcmdzKSB7XG5cdFx0dmFyIG1ldGEgPSBhcmdzLm1ldGEuJGZpbGxlcjtcblx0XHRpZiAoIW1ldGEpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgY3R4ID0gY2hhcnQuY3R4O1xuXHRcdHZhciBlbCA9IG1ldGEuZWw7XG5cdFx0dmFyIHZpZXcgPSBlbC5fdmlldztcblx0XHR2YXIgcG9pbnRzID0gZWwuX2NoaWxkcmVuIHx8IFtdO1xuXHRcdHZhciBtYXBwZXIgPSBtZXRhLm1hcHBlcjtcblx0XHR2YXIgY29sb3IgPSB2aWV3LmJhY2tncm91bmRDb2xvciB8fCBkZWZhdWx0cy5nbG9iYWwuZGVmYXVsdENvbG9yO1xuXG5cdFx0aWYgKG1hcHBlciAmJiBjb2xvciAmJiBwb2ludHMubGVuZ3RoKSB7XG5cdFx0XHRoZWxwZXJzLmNhbnZhcy5jbGlwQXJlYShjdHgsIGNoYXJ0LmNoYXJ0QXJlYSk7XG5cdFx0XHRkb0ZpbGwoY3R4LCBwb2ludHMsIG1hcHBlciwgdmlldywgY29sb3IsIGVsLl9sb29wKTtcblx0XHRcdGhlbHBlcnMuY2FudmFzLnVuY2xpcEFyZWEoY3R4KTtcblx0XHR9XG5cdH1cbn07XG5cbn0se1wiMjZcIjoyNixcIjQxXCI6NDEsXCI0NlwiOjQ2fV0sNTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcbnZhciBFbGVtZW50ID0gcmVxdWlyZSgyNyk7XG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xudmFyIGxheW91dHMgPSByZXF1aXJlKDMxKTtcblxudmFyIG5vb3AgPSBoZWxwZXJzLm5vb3A7XG5cbmRlZmF1bHRzLl9zZXQoJ2dsb2JhbCcsIHtcblx0bGVnZW5kOiB7XG5cdFx0ZGlzcGxheTogdHJ1ZSxcblx0XHRwb3NpdGlvbjogJ3RvcCcsXG5cdFx0ZnVsbFdpZHRoOiB0cnVlLFxuXHRcdHJldmVyc2U6IGZhbHNlLFxuXHRcdHdlaWdodDogMTAwMCxcblxuXHRcdC8vIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGhhbmRsZVxuXHRcdG9uQ2xpY2s6IGZ1bmN0aW9uKGUsIGxlZ2VuZEl0ZW0pIHtcblx0XHRcdHZhciBpbmRleCA9IGxlZ2VuZEl0ZW0uZGF0YXNldEluZGV4O1xuXHRcdFx0dmFyIGNpID0gdGhpcy5jaGFydDtcblx0XHRcdHZhciBtZXRhID0gY2kuZ2V0RGF0YXNldE1ldGEoaW5kZXgpO1xuXG5cdFx0XHQvLyBTZWUgY29udHJvbGxlci5pc0RhdGFzZXRWaXNpYmxlIGNvbW1lbnRcblx0XHRcdG1ldGEuaGlkZGVuID0gbWV0YS5oaWRkZW4gPT09IG51bGwgPyAhY2kuZGF0YS5kYXRhc2V0c1tpbmRleF0uaGlkZGVuIDogbnVsbDtcblxuXHRcdFx0Ly8gV2UgaGlkIGEgZGF0YXNldCAuLi4gcmVyZW5kZXIgdGhlIGNoYXJ0XG5cdFx0XHRjaS51cGRhdGUoKTtcblx0XHR9LFxuXG5cdFx0b25Ib3ZlcjogbnVsbCxcblxuXHRcdGxhYmVsczoge1xuXHRcdFx0Ym94V2lkdGg6IDQwLFxuXHRcdFx0cGFkZGluZzogMTAsXG5cdFx0XHQvLyBHZW5lcmF0ZXMgbGFiZWxzIHNob3duIGluIHRoZSBsZWdlbmRcblx0XHRcdC8vIFZhbGlkIHByb3BlcnRpZXMgdG8gcmV0dXJuOlxuXHRcdFx0Ly8gdGV4dCA6IHRleHQgdG8gZGlzcGxheVxuXHRcdFx0Ly8gZmlsbFN0eWxlIDogZmlsbCBvZiBjb2xvdXJlZCBib3hcblx0XHRcdC8vIHN0cm9rZVN0eWxlOiBzdHJva2Ugb2YgY29sb3VyZWQgYm94XG5cdFx0XHQvLyBoaWRkZW4gOiBpZiB0aGlzIGxlZ2VuZCBpdGVtIHJlZmVycyB0byBhIGhpZGRlbiBpdGVtXG5cdFx0XHQvLyBsaW5lQ2FwIDogY2FwIHN0eWxlIGZvciBsaW5lXG5cdFx0XHQvLyBsaW5lRGFzaFxuXHRcdFx0Ly8gbGluZURhc2hPZmZzZXQgOlxuXHRcdFx0Ly8gbGluZUpvaW4gOlxuXHRcdFx0Ly8gbGluZVdpZHRoIDpcblx0XHRcdGdlbmVyYXRlTGFiZWxzOiBmdW5jdGlvbihjaGFydCkge1xuXHRcdFx0XHR2YXIgZGF0YSA9IGNoYXJ0LmRhdGE7XG5cdFx0XHRcdHJldHVybiBoZWxwZXJzLmlzQXJyYXkoZGF0YS5kYXRhc2V0cykgPyBkYXRhLmRhdGFzZXRzLm1hcChmdW5jdGlvbihkYXRhc2V0LCBpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdHRleHQ6IGRhdGFzZXQubGFiZWwsXG5cdFx0XHRcdFx0XHRmaWxsU3R5bGU6ICghaGVscGVycy5pc0FycmF5KGRhdGFzZXQuYmFja2dyb3VuZENvbG9yKSA/IGRhdGFzZXQuYmFja2dyb3VuZENvbG9yIDogZGF0YXNldC5iYWNrZ3JvdW5kQ29sb3JbMF0pLFxuXHRcdFx0XHRcdFx0aGlkZGVuOiAhY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShpKSxcblx0XHRcdFx0XHRcdGxpbmVDYXA6IGRhdGFzZXQuYm9yZGVyQ2FwU3R5bGUsXG5cdFx0XHRcdFx0XHRsaW5lRGFzaDogZGF0YXNldC5ib3JkZXJEYXNoLFxuXHRcdFx0XHRcdFx0bGluZURhc2hPZmZzZXQ6IGRhdGFzZXQuYm9yZGVyRGFzaE9mZnNldCxcblx0XHRcdFx0XHRcdGxpbmVKb2luOiBkYXRhc2V0LmJvcmRlckpvaW5TdHlsZSxcblx0XHRcdFx0XHRcdGxpbmVXaWR0aDogZGF0YXNldC5ib3JkZXJXaWR0aCxcblx0XHRcdFx0XHRcdHN0cm9rZVN0eWxlOiBkYXRhc2V0LmJvcmRlckNvbG9yLFxuXHRcdFx0XHRcdFx0cG9pbnRTdHlsZTogZGF0YXNldC5wb2ludFN0eWxlLFxuXG5cdFx0XHRcdFx0XHQvLyBCZWxvdyBpcyBleHRyYSBkYXRhIHVzZWQgZm9yIHRvZ2dsaW5nIHRoZSBkYXRhc2V0c1xuXHRcdFx0XHRcdFx0ZGF0YXNldEluZGV4OiBpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSwgdGhpcykgOiBbXTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0bGVnZW5kQ2FsbGJhY2s6IGZ1bmN0aW9uKGNoYXJ0KSB7XG5cdFx0dmFyIHRleHQgPSBbXTtcblx0XHR0ZXh0LnB1c2goJzx1bCBjbGFzcz1cIicgKyBjaGFydC5pZCArICctbGVnZW5kXCI+Jyk7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBjaGFydC5kYXRhLmRhdGFzZXRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR0ZXh0LnB1c2goJzxsaT48c3BhbiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6JyArIGNoYXJ0LmRhdGEuZGF0YXNldHNbaV0uYmFja2dyb3VuZENvbG9yICsgJ1wiPjwvc3Bhbj4nKTtcblx0XHRcdGlmIChjaGFydC5kYXRhLmRhdGFzZXRzW2ldLmxhYmVsKSB7XG5cdFx0XHRcdHRleHQucHVzaChjaGFydC5kYXRhLmRhdGFzZXRzW2ldLmxhYmVsKTtcblx0XHRcdH1cblx0XHRcdHRleHQucHVzaCgnPC9saT4nKTtcblx0XHR9XG5cdFx0dGV4dC5wdXNoKCc8L3VsPicpO1xuXHRcdHJldHVybiB0ZXh0LmpvaW4oJycpO1xuXHR9XG59KTtcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBib3ggd2lkdGggYmFzZWQgb24gdGhlIHVzZVBvaW50U3R5bGUgb3B0aW9uXG4gKiBAcGFyYW0gbGFiZWxvcHRzIHtPYmplY3R9IHRoZSBsYWJlbCBvcHRpb25zIG9uIHRoZSBsZWdlbmRcbiAqIEBwYXJhbSBmb250U2l6ZSB7TnVtYmVyfSB0aGUgbGFiZWwgZm9udCBzaXplXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHdpZHRoIG9mIHRoZSBjb2xvciBib3ggYXJlYVxuICovXG5mdW5jdGlvbiBnZXRCb3hXaWR0aChsYWJlbE9wdHMsIGZvbnRTaXplKSB7XG5cdHJldHVybiBsYWJlbE9wdHMudXNlUG9pbnRTdHlsZSA/XG5cdFx0Zm9udFNpemUgKiBNYXRoLlNRUlQyIDpcblx0XHRsYWJlbE9wdHMuYm94V2lkdGg7XG59XG5cbi8qKlxuICogSU1QT1JUQU5UOiB0aGlzIGNsYXNzIGlzIGV4cG9zZWQgcHVibGljbHkgYXMgQ2hhcnQuTGVnZW5kLCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHJlcXVpcmVkIVxuICovXG52YXIgTGVnZW5kID0gRWxlbWVudC5leHRlbmQoe1xuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKGNvbmZpZykge1xuXHRcdGhlbHBlcnMuZXh0ZW5kKHRoaXMsIGNvbmZpZyk7XG5cblx0XHQvLyBDb250YWlucyBoaXQgYm94ZXMgZm9yIGVhY2ggZGF0YXNldCAoaW4gZGF0YXNldCBvcmRlcilcblx0XHR0aGlzLmxlZ2VuZEhpdEJveGVzID0gW107XG5cblx0XHQvLyBBcmUgd2UgaW4gZG91Z2hudXQgbW9kZSB3aGljaCBoYXMgYSBkaWZmZXJlbnQgZGF0YSB0eXBlXG5cdFx0dGhpcy5kb3VnaG51dE1vZGUgPSBmYWxzZTtcblx0fSxcblxuXHQvLyBUaGVzZSBtZXRob2RzIGFyZSBvcmRlcmVkIGJ5IGxpZmVjeWNsZS4gVXRpbGl0aWVzIHRoZW4gZm9sbG93LlxuXHQvLyBBbnkgZnVuY3Rpb24gZGVmaW5lZCBoZXJlIGlzIGluaGVyaXRlZCBieSBhbGwgbGVnZW5kIHR5cGVzLlxuXHQvLyBBbnkgZnVuY3Rpb24gY2FuIGJlIGV4dGVuZGVkIGJ5IHRoZSBsZWdlbmQgdHlwZVxuXG5cdGJlZm9yZVVwZGF0ZTogbm9vcCxcblx0dXBkYXRlOiBmdW5jdGlvbihtYXhXaWR0aCwgbWF4SGVpZ2h0LCBtYXJnaW5zKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblxuXHRcdC8vIFVwZGF0ZSBMaWZlY3ljbGUgLSBQcm9iYWJseSBkb24ndCB3YW50IHRvIGV2ZXIgZXh0ZW5kIG9yIG92ZXJ3cml0ZSB0aGlzIGZ1bmN0aW9uIDspXG5cdFx0bWUuYmVmb3JlVXBkYXRlKCk7XG5cblx0XHQvLyBBYnNvcmIgdGhlIG1hc3RlciBtZWFzdXJlbWVudHNcblx0XHRtZS5tYXhXaWR0aCA9IG1heFdpZHRoO1xuXHRcdG1lLm1heEhlaWdodCA9IG1heEhlaWdodDtcblx0XHRtZS5tYXJnaW5zID0gbWFyZ2lucztcblxuXHRcdC8vIERpbWVuc2lvbnNcblx0XHRtZS5iZWZvcmVTZXREaW1lbnNpb25zKCk7XG5cdFx0bWUuc2V0RGltZW5zaW9ucygpO1xuXHRcdG1lLmFmdGVyU2V0RGltZW5zaW9ucygpO1xuXHRcdC8vIExhYmVsc1xuXHRcdG1lLmJlZm9yZUJ1aWxkTGFiZWxzKCk7XG5cdFx0bWUuYnVpbGRMYWJlbHMoKTtcblx0XHRtZS5hZnRlckJ1aWxkTGFiZWxzKCk7XG5cblx0XHQvLyBGaXRcblx0XHRtZS5iZWZvcmVGaXQoKTtcblx0XHRtZS5maXQoKTtcblx0XHRtZS5hZnRlckZpdCgpO1xuXHRcdC8vXG5cdFx0bWUuYWZ0ZXJVcGRhdGUoKTtcblxuXHRcdHJldHVybiBtZS5taW5TaXplO1xuXHR9LFxuXHRhZnRlclVwZGF0ZTogbm9vcCxcblxuXHQvL1xuXG5cdGJlZm9yZVNldERpbWVuc2lvbnM6IG5vb3AsXG5cdHNldERpbWVuc2lvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0Ly8gU2V0IHRoZSB1bmNvbnN0cmFpbmVkIGRpbWVuc2lvbiBiZWZvcmUgbGFiZWwgcm90YXRpb25cblx0XHRpZiAobWUuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdC8vIFJlc2V0IHBvc2l0aW9uIGJlZm9yZSBjYWxjdWxhdGluZyByb3RhdGlvblxuXHRcdFx0bWUud2lkdGggPSBtZS5tYXhXaWR0aDtcblx0XHRcdG1lLmxlZnQgPSAwO1xuXHRcdFx0bWUucmlnaHQgPSBtZS53aWR0aDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWUuaGVpZ2h0ID0gbWUubWF4SGVpZ2h0O1xuXG5cdFx0XHQvLyBSZXNldCBwb3NpdGlvbiBiZWZvcmUgY2FsY3VsYXRpbmcgcm90YXRpb25cblx0XHRcdG1lLnRvcCA9IDA7XG5cdFx0XHRtZS5ib3R0b20gPSBtZS5oZWlnaHQ7XG5cdFx0fVxuXG5cdFx0Ly8gUmVzZXQgcGFkZGluZ1xuXHRcdG1lLnBhZGRpbmdMZWZ0ID0gMDtcblx0XHRtZS5wYWRkaW5nVG9wID0gMDtcblx0XHRtZS5wYWRkaW5nUmlnaHQgPSAwO1xuXHRcdG1lLnBhZGRpbmdCb3R0b20gPSAwO1xuXG5cdFx0Ly8gUmVzZXQgbWluU2l6ZVxuXHRcdG1lLm1pblNpemUgPSB7XG5cdFx0XHR3aWR0aDogMCxcblx0XHRcdGhlaWdodDogMFxuXHRcdH07XG5cdH0sXG5cdGFmdGVyU2V0RGltZW5zaW9uczogbm9vcCxcblxuXHQvL1xuXG5cdGJlZm9yZUJ1aWxkTGFiZWxzOiBub29wLFxuXHRidWlsZExhYmVsczogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgbGFiZWxPcHRzID0gbWUub3B0aW9ucy5sYWJlbHMgfHwge307XG5cdFx0dmFyIGxlZ2VuZEl0ZW1zID0gaGVscGVycy5jYWxsYmFjayhsYWJlbE9wdHMuZ2VuZXJhdGVMYWJlbHMsIFttZS5jaGFydF0sIG1lKSB8fCBbXTtcblxuXHRcdGlmIChsYWJlbE9wdHMuZmlsdGVyKSB7XG5cdFx0XHRsZWdlbmRJdGVtcyA9IGxlZ2VuZEl0ZW1zLmZpbHRlcihmdW5jdGlvbihpdGVtKSB7XG5cdFx0XHRcdHJldHVybiBsYWJlbE9wdHMuZmlsdGVyKGl0ZW0sIG1lLmNoYXJ0LmRhdGEpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKG1lLm9wdGlvbnMucmV2ZXJzZSkge1xuXHRcdFx0bGVnZW5kSXRlbXMucmV2ZXJzZSgpO1xuXHRcdH1cblxuXHRcdG1lLmxlZ2VuZEl0ZW1zID0gbGVnZW5kSXRlbXM7XG5cdH0sXG5cdGFmdGVyQnVpbGRMYWJlbHM6IG5vb3AsXG5cblx0Ly9cblxuXHRiZWZvcmVGaXQ6IG5vb3AsXG5cdGZpdDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgb3B0cyA9IG1lLm9wdGlvbnM7XG5cdFx0dmFyIGxhYmVsT3B0cyA9IG9wdHMubGFiZWxzO1xuXHRcdHZhciBkaXNwbGF5ID0gb3B0cy5kaXNwbGF5O1xuXG5cdFx0dmFyIGN0eCA9IG1lLmN0eDtcblxuXHRcdHZhciBnbG9iYWxEZWZhdWx0ID0gZGVmYXVsdHMuZ2xvYmFsO1xuXHRcdHZhciB2YWx1ZU9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQ7XG5cdFx0dmFyIGZvbnRTaXplID0gdmFsdWVPckRlZmF1bHQobGFiZWxPcHRzLmZvbnRTaXplLCBnbG9iYWxEZWZhdWx0LmRlZmF1bHRGb250U2l6ZSk7XG5cdFx0dmFyIGZvbnRTdHlsZSA9IHZhbHVlT3JEZWZhdWx0KGxhYmVsT3B0cy5mb250U3R5bGUsIGdsb2JhbERlZmF1bHQuZGVmYXVsdEZvbnRTdHlsZSk7XG5cdFx0dmFyIGZvbnRGYW1pbHkgPSB2YWx1ZU9yRGVmYXVsdChsYWJlbE9wdHMuZm9udEZhbWlseSwgZ2xvYmFsRGVmYXVsdC5kZWZhdWx0Rm9udEZhbWlseSk7XG5cdFx0dmFyIGxhYmVsRm9udCA9IGhlbHBlcnMuZm9udFN0cmluZyhmb250U2l6ZSwgZm9udFN0eWxlLCBmb250RmFtaWx5KTtcblxuXHRcdC8vIFJlc2V0IGhpdCBib3hlc1xuXHRcdHZhciBoaXRib3hlcyA9IG1lLmxlZ2VuZEhpdEJveGVzID0gW107XG5cblx0XHR2YXIgbWluU2l6ZSA9IG1lLm1pblNpemU7XG5cdFx0dmFyIGlzSG9yaXpvbnRhbCA9IG1lLmlzSG9yaXpvbnRhbCgpO1xuXG5cdFx0aWYgKGlzSG9yaXpvbnRhbCkge1xuXHRcdFx0bWluU2l6ZS53aWR0aCA9IG1lLm1heFdpZHRoOyAvLyBmaWxsIGFsbCB0aGUgd2lkdGhcblx0XHRcdG1pblNpemUuaGVpZ2h0ID0gZGlzcGxheSA/IDEwIDogMDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWluU2l6ZS53aWR0aCA9IGRpc3BsYXkgPyAxMCA6IDA7XG5cdFx0XHRtaW5TaXplLmhlaWdodCA9IG1lLm1heEhlaWdodDsgLy8gZmlsbCBhbGwgdGhlIGhlaWdodFxuXHRcdH1cblxuXHRcdC8vIEluY3JlYXNlIHNpemVzIGhlcmVcblx0XHRpZiAoZGlzcGxheSkge1xuXHRcdFx0Y3R4LmZvbnQgPSBsYWJlbEZvbnQ7XG5cblx0XHRcdGlmIChpc0hvcml6b250YWwpIHtcblx0XHRcdFx0Ly8gTGFiZWxzXG5cblx0XHRcdFx0Ly8gV2lkdGggb2YgZWFjaCBsaW5lIG9mIGxlZ2VuZCBib3hlcy4gTGFiZWxzIHdyYXAgb250byBtdWx0aXBsZSBsaW5lcyB3aGVuIHRoZXJlIGFyZSB0b28gbWFueSB0byBmaXQgb24gb25lXG5cdFx0XHRcdHZhciBsaW5lV2lkdGhzID0gbWUubGluZVdpZHRocyA9IFswXTtcblx0XHRcdFx0dmFyIHRvdGFsSGVpZ2h0ID0gbWUubGVnZW5kSXRlbXMubGVuZ3RoID8gZm9udFNpemUgKyAobGFiZWxPcHRzLnBhZGRpbmcpIDogMDtcblxuXHRcdFx0XHRjdHgudGV4dEFsaWduID0gJ2xlZnQnO1xuXHRcdFx0XHRjdHgudGV4dEJhc2VsaW5lID0gJ3RvcCc7XG5cblx0XHRcdFx0aGVscGVycy5lYWNoKG1lLmxlZ2VuZEl0ZW1zLCBmdW5jdGlvbihsZWdlbmRJdGVtLCBpKSB7XG5cdFx0XHRcdFx0dmFyIGJveFdpZHRoID0gZ2V0Qm94V2lkdGgobGFiZWxPcHRzLCBmb250U2l6ZSk7XG5cdFx0XHRcdFx0dmFyIHdpZHRoID0gYm94V2lkdGggKyAoZm9udFNpemUgLyAyKSArIGN0eC5tZWFzdXJlVGV4dChsZWdlbmRJdGVtLnRleHQpLndpZHRoO1xuXG5cdFx0XHRcdFx0aWYgKGxpbmVXaWR0aHNbbGluZVdpZHRocy5sZW5ndGggLSAxXSArIHdpZHRoICsgbGFiZWxPcHRzLnBhZGRpbmcgPj0gbWUud2lkdGgpIHtcblx0XHRcdFx0XHRcdHRvdGFsSGVpZ2h0ICs9IGZvbnRTaXplICsgKGxhYmVsT3B0cy5wYWRkaW5nKTtcblx0XHRcdFx0XHRcdGxpbmVXaWR0aHNbbGluZVdpZHRocy5sZW5ndGhdID0gbWUubGVmdDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBTdG9yZSB0aGUgaGl0Ym94IHdpZHRoIGFuZCBoZWlnaHQgaGVyZS4gRmluYWwgcG9zaXRpb24gd2lsbCBiZSB1cGRhdGVkIGluIGBkcmF3YFxuXHRcdFx0XHRcdGhpdGJveGVzW2ldID0ge1xuXHRcdFx0XHRcdFx0bGVmdDogMCxcblx0XHRcdFx0XHRcdHRvcDogMCxcblx0XHRcdFx0XHRcdHdpZHRoOiB3aWR0aCxcblx0XHRcdFx0XHRcdGhlaWdodDogZm9udFNpemVcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0bGluZVdpZHRoc1tsaW5lV2lkdGhzLmxlbmd0aCAtIDFdICs9IHdpZHRoICsgbGFiZWxPcHRzLnBhZGRpbmc7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdG1pblNpemUuaGVpZ2h0ICs9IHRvdGFsSGVpZ2h0O1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YXIgdlBhZGRpbmcgPSBsYWJlbE9wdHMucGFkZGluZztcblx0XHRcdFx0dmFyIGNvbHVtbldpZHRocyA9IG1lLmNvbHVtbldpZHRocyA9IFtdO1xuXHRcdFx0XHR2YXIgdG90YWxXaWR0aCA9IGxhYmVsT3B0cy5wYWRkaW5nO1xuXHRcdFx0XHR2YXIgY3VycmVudENvbFdpZHRoID0gMDtcblx0XHRcdFx0dmFyIGN1cnJlbnRDb2xIZWlnaHQgPSAwO1xuXHRcdFx0XHR2YXIgaXRlbUhlaWdodCA9IGZvbnRTaXplICsgdlBhZGRpbmc7XG5cblx0XHRcdFx0aGVscGVycy5lYWNoKG1lLmxlZ2VuZEl0ZW1zLCBmdW5jdGlvbihsZWdlbmRJdGVtLCBpKSB7XG5cdFx0XHRcdFx0dmFyIGJveFdpZHRoID0gZ2V0Qm94V2lkdGgobGFiZWxPcHRzLCBmb250U2l6ZSk7XG5cdFx0XHRcdFx0dmFyIGl0ZW1XaWR0aCA9IGJveFdpZHRoICsgKGZvbnRTaXplIC8gMikgKyBjdHgubWVhc3VyZVRleHQobGVnZW5kSXRlbS50ZXh0KS53aWR0aDtcblxuXHRcdFx0XHRcdC8vIElmIHRvbyB0YWxsLCBnbyB0byBuZXcgY29sdW1uXG5cdFx0XHRcdFx0aWYgKGN1cnJlbnRDb2xIZWlnaHQgKyBpdGVtSGVpZ2h0ID4gbWluU2l6ZS5oZWlnaHQpIHtcblx0XHRcdFx0XHRcdHRvdGFsV2lkdGggKz0gY3VycmVudENvbFdpZHRoICsgbGFiZWxPcHRzLnBhZGRpbmc7XG5cdFx0XHRcdFx0XHRjb2x1bW5XaWR0aHMucHVzaChjdXJyZW50Q29sV2lkdGgpOyAvLyBwcmV2aW91cyBjb2x1bW4gd2lkdGhcblxuXHRcdFx0XHRcdFx0Y3VycmVudENvbFdpZHRoID0gMDtcblx0XHRcdFx0XHRcdGN1cnJlbnRDb2xIZWlnaHQgPSAwO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIEdldCBtYXggd2lkdGhcblx0XHRcdFx0XHRjdXJyZW50Q29sV2lkdGggPSBNYXRoLm1heChjdXJyZW50Q29sV2lkdGgsIGl0ZW1XaWR0aCk7XG5cdFx0XHRcdFx0Y3VycmVudENvbEhlaWdodCArPSBpdGVtSGVpZ2h0O1xuXG5cdFx0XHRcdFx0Ly8gU3RvcmUgdGhlIGhpdGJveCB3aWR0aCBhbmQgaGVpZ2h0IGhlcmUuIEZpbmFsIHBvc2l0aW9uIHdpbGwgYmUgdXBkYXRlZCBpbiBgZHJhd2Bcblx0XHRcdFx0XHRoaXRib3hlc1tpXSA9IHtcblx0XHRcdFx0XHRcdGxlZnQ6IDAsXG5cdFx0XHRcdFx0XHR0b3A6IDAsXG5cdFx0XHRcdFx0XHR3aWR0aDogaXRlbVdpZHRoLFxuXHRcdFx0XHRcdFx0aGVpZ2h0OiBmb250U2l6ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHRvdGFsV2lkdGggKz0gY3VycmVudENvbFdpZHRoO1xuXHRcdFx0XHRjb2x1bW5XaWR0aHMucHVzaChjdXJyZW50Q29sV2lkdGgpO1xuXHRcdFx0XHRtaW5TaXplLndpZHRoICs9IHRvdGFsV2lkdGg7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0bWUud2lkdGggPSBtaW5TaXplLndpZHRoO1xuXHRcdG1lLmhlaWdodCA9IG1pblNpemUuaGVpZ2h0O1xuXHR9LFxuXHRhZnRlckZpdDogbm9vcCxcblxuXHQvLyBTaGFyZWQgTWV0aG9kc1xuXHRpc0hvcml6b250YWw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm9wdGlvbnMucG9zaXRpb24gPT09ICd0b3AnIHx8IHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9PT0gJ2JvdHRvbSc7XG5cdH0sXG5cblx0Ly8gQWN0dWFsbHkgZHJhdyB0aGUgbGVnZW5kIG9uIHRoZSBjYW52YXNcblx0ZHJhdzogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgb3B0cyA9IG1lLm9wdGlvbnM7XG5cdFx0dmFyIGxhYmVsT3B0cyA9IG9wdHMubGFiZWxzO1xuXHRcdHZhciBnbG9iYWxEZWZhdWx0ID0gZGVmYXVsdHMuZ2xvYmFsO1xuXHRcdHZhciBsaW5lRGVmYXVsdCA9IGdsb2JhbERlZmF1bHQuZWxlbWVudHMubGluZTtcblx0XHR2YXIgbGVnZW5kV2lkdGggPSBtZS53aWR0aDtcblx0XHR2YXIgbGluZVdpZHRocyA9IG1lLmxpbmVXaWR0aHM7XG5cblx0XHRpZiAob3B0cy5kaXNwbGF5KSB7XG5cdFx0XHR2YXIgY3R4ID0gbWUuY3R4O1xuXHRcdFx0dmFyIHZhbHVlT3JEZWZhdWx0ID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdDtcblx0XHRcdHZhciBmb250Q29sb3IgPSB2YWx1ZU9yRGVmYXVsdChsYWJlbE9wdHMuZm9udENvbG9yLCBnbG9iYWxEZWZhdWx0LmRlZmF1bHRGb250Q29sb3IpO1xuXHRcdFx0dmFyIGZvbnRTaXplID0gdmFsdWVPckRlZmF1bHQobGFiZWxPcHRzLmZvbnRTaXplLCBnbG9iYWxEZWZhdWx0LmRlZmF1bHRGb250U2l6ZSk7XG5cdFx0XHR2YXIgZm9udFN0eWxlID0gdmFsdWVPckRlZmF1bHQobGFiZWxPcHRzLmZvbnRTdHlsZSwgZ2xvYmFsRGVmYXVsdC5kZWZhdWx0Rm9udFN0eWxlKTtcblx0XHRcdHZhciBmb250RmFtaWx5ID0gdmFsdWVPckRlZmF1bHQobGFiZWxPcHRzLmZvbnRGYW1pbHksIGdsb2JhbERlZmF1bHQuZGVmYXVsdEZvbnRGYW1pbHkpO1xuXHRcdFx0dmFyIGxhYmVsRm9udCA9IGhlbHBlcnMuZm9udFN0cmluZyhmb250U2l6ZSwgZm9udFN0eWxlLCBmb250RmFtaWx5KTtcblx0XHRcdHZhciBjdXJzb3I7XG5cblx0XHRcdC8vIENhbnZhcyBzZXR1cFxuXHRcdFx0Y3R4LnRleHRBbGlnbiA9ICdsZWZ0Jztcblx0XHRcdGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcblx0XHRcdGN0eC5saW5lV2lkdGggPSAwLjU7XG5cdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSBmb250Q29sb3I7IC8vIGZvciBzdHJpa2V0aHJvdWdoIGVmZmVjdFxuXHRcdFx0Y3R4LmZpbGxTdHlsZSA9IGZvbnRDb2xvcjsgLy8gcmVuZGVyIGluIGNvcnJlY3QgY29sb3VyXG5cdFx0XHRjdHguZm9udCA9IGxhYmVsRm9udDtcblxuXHRcdFx0dmFyIGJveFdpZHRoID0gZ2V0Qm94V2lkdGgobGFiZWxPcHRzLCBmb250U2l6ZSk7XG5cdFx0XHR2YXIgaGl0Ym94ZXMgPSBtZS5sZWdlbmRIaXRCb3hlcztcblxuXHRcdFx0Ly8gY3VycmVudCBwb3NpdGlvblxuXHRcdFx0dmFyIGRyYXdMZWdlbmRCb3ggPSBmdW5jdGlvbih4LCB5LCBsZWdlbmRJdGVtKSB7XG5cdFx0XHRcdGlmIChpc05hTihib3hXaWR0aCkgfHwgYm94V2lkdGggPD0gMCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFNldCB0aGUgY3R4IGZvciB0aGUgYm94XG5cdFx0XHRcdGN0eC5zYXZlKCk7XG5cblx0XHRcdFx0Y3R4LmZpbGxTdHlsZSA9IHZhbHVlT3JEZWZhdWx0KGxlZ2VuZEl0ZW0uZmlsbFN0eWxlLCBnbG9iYWxEZWZhdWx0LmRlZmF1bHRDb2xvcik7XG5cdFx0XHRcdGN0eC5saW5lQ2FwID0gdmFsdWVPckRlZmF1bHQobGVnZW5kSXRlbS5saW5lQ2FwLCBsaW5lRGVmYXVsdC5ib3JkZXJDYXBTdHlsZSk7XG5cdFx0XHRcdGN0eC5saW5lRGFzaE9mZnNldCA9IHZhbHVlT3JEZWZhdWx0KGxlZ2VuZEl0ZW0ubGluZURhc2hPZmZzZXQsIGxpbmVEZWZhdWx0LmJvcmRlckRhc2hPZmZzZXQpO1xuXHRcdFx0XHRjdHgubGluZUpvaW4gPSB2YWx1ZU9yRGVmYXVsdChsZWdlbmRJdGVtLmxpbmVKb2luLCBsaW5lRGVmYXVsdC5ib3JkZXJKb2luU3R5bGUpO1xuXHRcdFx0XHRjdHgubGluZVdpZHRoID0gdmFsdWVPckRlZmF1bHQobGVnZW5kSXRlbS5saW5lV2lkdGgsIGxpbmVEZWZhdWx0LmJvcmRlcldpZHRoKTtcblx0XHRcdFx0Y3R4LnN0cm9rZVN0eWxlID0gdmFsdWVPckRlZmF1bHQobGVnZW5kSXRlbS5zdHJva2VTdHlsZSwgZ2xvYmFsRGVmYXVsdC5kZWZhdWx0Q29sb3IpO1xuXHRcdFx0XHR2YXIgaXNMaW5lV2lkdGhaZXJvID0gKHZhbHVlT3JEZWZhdWx0KGxlZ2VuZEl0ZW0ubGluZVdpZHRoLCBsaW5lRGVmYXVsdC5ib3JkZXJXaWR0aCkgPT09IDApO1xuXG5cdFx0XHRcdGlmIChjdHguc2V0TGluZURhc2gpIHtcblx0XHRcdFx0XHQvLyBJRSA5IGFuZCAxMCBkbyBub3Qgc3VwcG9ydCBsaW5lIGRhc2hcblx0XHRcdFx0XHRjdHguc2V0TGluZURhc2godmFsdWVPckRlZmF1bHQobGVnZW5kSXRlbS5saW5lRGFzaCwgbGluZURlZmF1bHQuYm9yZGVyRGFzaCkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKG9wdHMubGFiZWxzICYmIG9wdHMubGFiZWxzLnVzZVBvaW50U3R5bGUpIHtcblx0XHRcdFx0XHQvLyBSZWNhbGN1bGF0ZSB4IGFuZCB5IGZvciBkcmF3UG9pbnQoKSBiZWNhdXNlIGl0cyBleHBlY3Rpbmdcblx0XHRcdFx0XHQvLyB4IGFuZCB5IHRvIGJlIGNlbnRlciBvZiBmaWd1cmUgKGluc3RlYWQgb2YgdG9wIGxlZnQpXG5cdFx0XHRcdFx0dmFyIHJhZGl1cyA9IGZvbnRTaXplICogTWF0aC5TUVJUMiAvIDI7XG5cdFx0XHRcdFx0dmFyIG9mZlNldCA9IHJhZGl1cyAvIE1hdGguU1FSVDI7XG5cdFx0XHRcdFx0dmFyIGNlbnRlclggPSB4ICsgb2ZmU2V0O1xuXHRcdFx0XHRcdHZhciBjZW50ZXJZID0geSArIG9mZlNldDtcblxuXHRcdFx0XHRcdC8vIERyYXcgcG9pbnRTdHlsZSBhcyBsZWdlbmQgc3ltYm9sXG5cdFx0XHRcdFx0aGVscGVycy5jYW52YXMuZHJhd1BvaW50KGN0eCwgbGVnZW5kSXRlbS5wb2ludFN0eWxlLCByYWRpdXMsIGNlbnRlclgsIGNlbnRlclkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIERyYXcgYm94IGFzIGxlZ2VuZCBzeW1ib2xcblx0XHRcdFx0XHRpZiAoIWlzTGluZVdpZHRoWmVybykge1xuXHRcdFx0XHRcdFx0Y3R4LnN0cm9rZVJlY3QoeCwgeSwgYm94V2lkdGgsIGZvbnRTaXplKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y3R4LmZpbGxSZWN0KHgsIHksIGJveFdpZHRoLCBmb250U2l6ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjdHgucmVzdG9yZSgpO1xuXHRcdFx0fTtcblx0XHRcdHZhciBmaWxsVGV4dCA9IGZ1bmN0aW9uKHgsIHksIGxlZ2VuZEl0ZW0sIHRleHRXaWR0aCkge1xuXHRcdFx0XHR2YXIgaGFsZkZvbnRTaXplID0gZm9udFNpemUgLyAyO1xuXHRcdFx0XHR2YXIgeExlZnQgPSBib3hXaWR0aCArIGhhbGZGb250U2l6ZSArIHg7XG5cdFx0XHRcdHZhciB5TWlkZGxlID0geSArIGhhbGZGb250U2l6ZTtcblxuXHRcdFx0XHRjdHguZmlsbFRleHQobGVnZW5kSXRlbS50ZXh0LCB4TGVmdCwgeU1pZGRsZSk7XG5cblx0XHRcdFx0aWYgKGxlZ2VuZEl0ZW0uaGlkZGVuKSB7XG5cdFx0XHRcdFx0Ly8gU3RyaWtldGhyb3VnaCB0aGUgdGV4dCBpZiBoaWRkZW5cblx0XHRcdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRcdFx0Y3R4LmxpbmVXaWR0aCA9IDI7XG5cdFx0XHRcdFx0Y3R4Lm1vdmVUbyh4TGVmdCwgeU1pZGRsZSk7XG5cdFx0XHRcdFx0Y3R4LmxpbmVUbyh4TGVmdCArIHRleHRXaWR0aCwgeU1pZGRsZSk7XG5cdFx0XHRcdFx0Y3R4LnN0cm9rZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBIb3Jpem9udGFsXG5cdFx0XHR2YXIgaXNIb3Jpem9udGFsID0gbWUuaXNIb3Jpem9udGFsKCk7XG5cdFx0XHRpZiAoaXNIb3Jpem9udGFsKSB7XG5cdFx0XHRcdGN1cnNvciA9IHtcblx0XHRcdFx0XHR4OiBtZS5sZWZ0ICsgKChsZWdlbmRXaWR0aCAtIGxpbmVXaWR0aHNbMF0pIC8gMiksXG5cdFx0XHRcdFx0eTogbWUudG9wICsgbGFiZWxPcHRzLnBhZGRpbmcsXG5cdFx0XHRcdFx0bGluZTogMFxuXHRcdFx0XHR9O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3Vyc29yID0ge1xuXHRcdFx0XHRcdHg6IG1lLmxlZnQgKyBsYWJlbE9wdHMucGFkZGluZyxcblx0XHRcdFx0XHR5OiBtZS50b3AgKyBsYWJlbE9wdHMucGFkZGluZyxcblx0XHRcdFx0XHRsaW5lOiAwXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHZhciBpdGVtSGVpZ2h0ID0gZm9udFNpemUgKyBsYWJlbE9wdHMucGFkZGluZztcblx0XHRcdGhlbHBlcnMuZWFjaChtZS5sZWdlbmRJdGVtcywgZnVuY3Rpb24obGVnZW5kSXRlbSwgaSkge1xuXHRcdFx0XHR2YXIgdGV4dFdpZHRoID0gY3R4Lm1lYXN1cmVUZXh0KGxlZ2VuZEl0ZW0udGV4dCkud2lkdGg7XG5cdFx0XHRcdHZhciB3aWR0aCA9IGJveFdpZHRoICsgKGZvbnRTaXplIC8gMikgKyB0ZXh0V2lkdGg7XG5cdFx0XHRcdHZhciB4ID0gY3Vyc29yLng7XG5cdFx0XHRcdHZhciB5ID0gY3Vyc29yLnk7XG5cblx0XHRcdFx0aWYgKGlzSG9yaXpvbnRhbCkge1xuXHRcdFx0XHRcdGlmICh4ICsgd2lkdGggPj0gbGVnZW5kV2lkdGgpIHtcblx0XHRcdFx0XHRcdHkgPSBjdXJzb3IueSArPSBpdGVtSGVpZ2h0O1xuXHRcdFx0XHRcdFx0Y3Vyc29yLmxpbmUrKztcblx0XHRcdFx0XHRcdHggPSBjdXJzb3IueCA9IG1lLmxlZnQgKyAoKGxlZ2VuZFdpZHRoIC0gbGluZVdpZHRoc1tjdXJzb3IubGluZV0pIC8gMik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKHkgKyBpdGVtSGVpZ2h0ID4gbWUuYm90dG9tKSB7XG5cdFx0XHRcdFx0eCA9IGN1cnNvci54ID0geCArIG1lLmNvbHVtbldpZHRoc1tjdXJzb3IubGluZV0gKyBsYWJlbE9wdHMucGFkZGluZztcblx0XHRcdFx0XHR5ID0gY3Vyc29yLnkgPSBtZS50b3AgKyBsYWJlbE9wdHMucGFkZGluZztcblx0XHRcdFx0XHRjdXJzb3IubGluZSsrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZHJhd0xlZ2VuZEJveCh4LCB5LCBsZWdlbmRJdGVtKTtcblxuXHRcdFx0XHRoaXRib3hlc1tpXS5sZWZ0ID0geDtcblx0XHRcdFx0aGl0Ym94ZXNbaV0udG9wID0geTtcblxuXHRcdFx0XHQvLyBGaWxsIHRoZSBhY3R1YWwgbGFiZWxcblx0XHRcdFx0ZmlsbFRleHQoeCwgeSwgbGVnZW5kSXRlbSwgdGV4dFdpZHRoKTtcblxuXHRcdFx0XHRpZiAoaXNIb3Jpem9udGFsKSB7XG5cdFx0XHRcdFx0Y3Vyc29yLnggKz0gd2lkdGggKyAobGFiZWxPcHRzLnBhZGRpbmcpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGN1cnNvci55ICs9IGl0ZW1IZWlnaHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBIYW5kbGUgYW4gZXZlbnRcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtJRXZlbnR9IGV2ZW50IC0gVGhlIGV2ZW50IHRvIGhhbmRsZVxuXHQgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIGEgY2hhbmdlIG9jY3VyZWRcblx0ICovXG5cdGhhbmRsZUV2ZW50OiBmdW5jdGlvbihlKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHR2YXIgb3B0cyA9IG1lLm9wdGlvbnM7XG5cdFx0dmFyIHR5cGUgPSBlLnR5cGUgPT09ICdtb3VzZXVwJyA/ICdjbGljaycgOiBlLnR5cGU7XG5cdFx0dmFyIGNoYW5nZWQgPSBmYWxzZTtcblxuXHRcdGlmICh0eXBlID09PSAnbW91c2Vtb3ZlJykge1xuXHRcdFx0aWYgKCFvcHRzLm9uSG92ZXIpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gJ2NsaWNrJykge1xuXHRcdFx0aWYgKCFvcHRzLm9uQ2xpY2spIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2hhcnQgZXZlbnQgYWxyZWFkeSBoYXMgcmVsYXRpdmUgcG9zaXRpb24gaW4gaXRcblx0XHR2YXIgeCA9IGUueDtcblx0XHR2YXIgeSA9IGUueTtcblxuXHRcdGlmICh4ID49IG1lLmxlZnQgJiYgeCA8PSBtZS5yaWdodCAmJiB5ID49IG1lLnRvcCAmJiB5IDw9IG1lLmJvdHRvbSkge1xuXHRcdFx0Ly8gU2VlIGlmIHdlIGFyZSB0b3VjaGluZyBvbmUgb2YgdGhlIGRhdGFzZXQgYm94ZXNcblx0XHRcdHZhciBsaCA9IG1lLmxlZ2VuZEhpdEJveGVzO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsaC5sZW5ndGg7ICsraSkge1xuXHRcdFx0XHR2YXIgaGl0Qm94ID0gbGhbaV07XG5cblx0XHRcdFx0aWYgKHggPj0gaGl0Qm94LmxlZnQgJiYgeCA8PSBoaXRCb3gubGVmdCArIGhpdEJveC53aWR0aCAmJiB5ID49IGhpdEJveC50b3AgJiYgeSA8PSBoaXRCb3gudG9wICsgaGl0Qm94LmhlaWdodCkge1xuXHRcdFx0XHRcdC8vIFRvdWNoaW5nIGFuIGVsZW1lbnRcblx0XHRcdFx0XHRpZiAodHlwZSA9PT0gJ2NsaWNrJykge1xuXHRcdFx0XHRcdFx0Ly8gdXNlIGUubmF0aXZlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXHRcdFx0XHRcdFx0b3B0cy5vbkNsaWNrLmNhbGwobWUsIGUubmF0aXZlLCBtZS5sZWdlbmRJdGVtc1tpXSk7XG5cdFx0XHRcdFx0XHRjaGFuZ2VkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gJ21vdXNlbW92ZScpIHtcblx0XHRcdFx0XHRcdC8vIHVzZSBlLm5hdGl2ZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblx0XHRcdFx0XHRcdG9wdHMub25Ib3Zlci5jYWxsKG1lLCBlLm5hdGl2ZSwgbWUubGVnZW5kSXRlbXNbaV0pO1xuXHRcdFx0XHRcdFx0Y2hhbmdlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY2hhbmdlZDtcblx0fVxufSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZU5ld0xlZ2VuZEFuZEF0dGFjaChjaGFydCwgbGVnZW5kT3B0cykge1xuXHR2YXIgbGVnZW5kID0gbmV3IExlZ2VuZCh7XG5cdFx0Y3R4OiBjaGFydC5jdHgsXG5cdFx0b3B0aW9uczogbGVnZW5kT3B0cyxcblx0XHRjaGFydDogY2hhcnRcblx0fSk7XG5cblx0bGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIGxlZ2VuZCwgbGVnZW5kT3B0cyk7XG5cdGxheW91dHMuYWRkQm94KGNoYXJ0LCBsZWdlbmQpO1xuXHRjaGFydC5sZWdlbmQgPSBsZWdlbmQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRpZDogJ2xlZ2VuZCcsXG5cblx0LyoqXG5cdCAqIEJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IHNpbmNlIDIuMS41LCB0aGUgbGVnZW5kIGlzIHJlZ2lzdGVyZWQgYXMgYSBwbHVnaW4sIG1ha2luZ1xuXHQgKiBDaGFydC5MZWdlbmQgb2Jzb2xldGUuIFRvIGF2b2lkIGEgYnJlYWtpbmcgY2hhbmdlLCB3ZSBleHBvcnQgdGhlIExlZ2VuZCBhcyBwYXJ0IG9mXG5cdCAqIHRoZSBwbHVnaW4sIHdoaWNoIG9uZSB3aWxsIGJlIHJlLWV4cG9zZWQgaW4gdGhlIGNoYXJ0LmpzIGZpbGUuXG5cdCAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL3B1bGwvMjY0MFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2VsZW1lbnQ6IExlZ2VuZCxcblxuXHRiZWZvcmVJbml0OiBmdW5jdGlvbihjaGFydCkge1xuXHRcdHZhciBsZWdlbmRPcHRzID0gY2hhcnQub3B0aW9ucy5sZWdlbmQ7XG5cblx0XHRpZiAobGVnZW5kT3B0cykge1xuXHRcdFx0Y3JlYXRlTmV3TGVnZW5kQW5kQXR0YWNoKGNoYXJ0LCBsZWdlbmRPcHRzKTtcblx0XHR9XG5cdH0sXG5cblx0YmVmb3JlVXBkYXRlOiBmdW5jdGlvbihjaGFydCkge1xuXHRcdHZhciBsZWdlbmRPcHRzID0gY2hhcnQub3B0aW9ucy5sZWdlbmQ7XG5cdFx0dmFyIGxlZ2VuZCA9IGNoYXJ0LmxlZ2VuZDtcblxuXHRcdGlmIChsZWdlbmRPcHRzKSB7XG5cdFx0XHRoZWxwZXJzLm1lcmdlSWYobGVnZW5kT3B0cywgZGVmYXVsdHMuZ2xvYmFsLmxlZ2VuZCk7XG5cblx0XHRcdGlmIChsZWdlbmQpIHtcblx0XHRcdFx0bGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIGxlZ2VuZCwgbGVnZW5kT3B0cyk7XG5cdFx0XHRcdGxlZ2VuZC5vcHRpb25zID0gbGVnZW5kT3B0cztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNyZWF0ZU5ld0xlZ2VuZEFuZEF0dGFjaChjaGFydCwgbGVnZW5kT3B0cyk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChsZWdlbmQpIHtcblx0XHRcdGxheW91dHMucmVtb3ZlQm94KGNoYXJ0LCBsZWdlbmQpO1xuXHRcdFx0ZGVsZXRlIGNoYXJ0LmxlZ2VuZDtcblx0XHR9XG5cdH0sXG5cblx0YWZ0ZXJFdmVudDogZnVuY3Rpb24oY2hhcnQsIGUpIHtcblx0XHR2YXIgbGVnZW5kID0gY2hhcnQubGVnZW5kO1xuXHRcdGlmIChsZWdlbmQpIHtcblx0XHRcdGxlZ2VuZC5oYW5kbGVFdmVudChlKTtcblx0XHR9XG5cdH1cbn07XG5cbn0se1wiMjZcIjoyNixcIjI3XCI6MjcsXCIzMVwiOjMxLFwiNDZcIjo0Nn1dLDUzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgyNik7XG52YXIgRWxlbWVudCA9IHJlcXVpcmUoMjcpO1xudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcbnZhciBsYXlvdXRzID0gcmVxdWlyZSgzMSk7XG5cbnZhciBub29wID0gaGVscGVycy5ub29wO1xuXG5kZWZhdWx0cy5fc2V0KCdnbG9iYWwnLCB7XG5cdHRpdGxlOiB7XG5cdFx0ZGlzcGxheTogZmFsc2UsXG5cdFx0Zm9udFN0eWxlOiAnYm9sZCcsXG5cdFx0ZnVsbFdpZHRoOiB0cnVlLFxuXHRcdGxpbmVIZWlnaHQ6IDEuMixcblx0XHRwYWRkaW5nOiAxMCxcblx0XHRwb3NpdGlvbjogJ3RvcCcsXG5cdFx0dGV4dDogJycsXG5cdFx0d2VpZ2h0OiAyMDAwICAgICAgICAgLy8gYnkgZGVmYXVsdCBncmVhdGVyIHRoYW4gbGVnZW5kICgxMDAwKSB0byBiZSBhYm92ZVxuXHR9XG59KTtcblxuLyoqXG4gKiBJTVBPUlRBTlQ6IHRoaXMgY2xhc3MgaXMgZXhwb3NlZCBwdWJsaWNseSBhcyBDaGFydC5MZWdlbmQsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcmVxdWlyZWQhXG4gKi9cbnZhciBUaXRsZSA9IEVsZW1lbnQuZXh0ZW5kKHtcblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oY29uZmlnKSB7XG5cdFx0dmFyIG1lID0gdGhpcztcblx0XHRoZWxwZXJzLmV4dGVuZChtZSwgY29uZmlnKTtcblxuXHRcdC8vIENvbnRhaW5zIGhpdCBib3hlcyBmb3IgZWFjaCBkYXRhc2V0IChpbiBkYXRhc2V0IG9yZGVyKVxuXHRcdG1lLmxlZ2VuZEhpdEJveGVzID0gW107XG5cdH0sXG5cblx0Ly8gVGhlc2UgbWV0aG9kcyBhcmUgb3JkZXJlZCBieSBsaWZlY3ljbGUuIFV0aWxpdGllcyB0aGVuIGZvbGxvdy5cblxuXHRiZWZvcmVVcGRhdGU6IG5vb3AsXG5cdHVwZGF0ZTogZnVuY3Rpb24obWF4V2lkdGgsIG1heEhlaWdodCwgbWFyZ2lucykge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cblx0XHQvLyBVcGRhdGUgTGlmZWN5Y2xlIC0gUHJvYmFibHkgZG9uJ3Qgd2FudCB0byBldmVyIGV4dGVuZCBvciBvdmVyd3JpdGUgdGhpcyBmdW5jdGlvbiA7KVxuXHRcdG1lLmJlZm9yZVVwZGF0ZSgpO1xuXG5cdFx0Ly8gQWJzb3JiIHRoZSBtYXN0ZXIgbWVhc3VyZW1lbnRzXG5cdFx0bWUubWF4V2lkdGggPSBtYXhXaWR0aDtcblx0XHRtZS5tYXhIZWlnaHQgPSBtYXhIZWlnaHQ7XG5cdFx0bWUubWFyZ2lucyA9IG1hcmdpbnM7XG5cblx0XHQvLyBEaW1lbnNpb25zXG5cdFx0bWUuYmVmb3JlU2V0RGltZW5zaW9ucygpO1xuXHRcdG1lLnNldERpbWVuc2lvbnMoKTtcblx0XHRtZS5hZnRlclNldERpbWVuc2lvbnMoKTtcblx0XHQvLyBMYWJlbHNcblx0XHRtZS5iZWZvcmVCdWlsZExhYmVscygpO1xuXHRcdG1lLmJ1aWxkTGFiZWxzKCk7XG5cdFx0bWUuYWZ0ZXJCdWlsZExhYmVscygpO1xuXG5cdFx0Ly8gRml0XG5cdFx0bWUuYmVmb3JlRml0KCk7XG5cdFx0bWUuZml0KCk7XG5cdFx0bWUuYWZ0ZXJGaXQoKTtcblx0XHQvL1xuXHRcdG1lLmFmdGVyVXBkYXRlKCk7XG5cblx0XHRyZXR1cm4gbWUubWluU2l6ZTtcblxuXHR9LFxuXHRhZnRlclVwZGF0ZTogbm9vcCxcblxuXHQvL1xuXG5cdGJlZm9yZVNldERpbWVuc2lvbnM6IG5vb3AsXG5cdHNldERpbWVuc2lvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0Ly8gU2V0IHRoZSB1bmNvbnN0cmFpbmVkIGRpbWVuc2lvbiBiZWZvcmUgbGFiZWwgcm90YXRpb25cblx0XHRpZiAobWUuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdC8vIFJlc2V0IHBvc2l0aW9uIGJlZm9yZSBjYWxjdWxhdGluZyByb3RhdGlvblxuXHRcdFx0bWUud2lkdGggPSBtZS5tYXhXaWR0aDtcblx0XHRcdG1lLmxlZnQgPSAwO1xuXHRcdFx0bWUucmlnaHQgPSBtZS53aWR0aDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWUuaGVpZ2h0ID0gbWUubWF4SGVpZ2h0O1xuXG5cdFx0XHQvLyBSZXNldCBwb3NpdGlvbiBiZWZvcmUgY2FsY3VsYXRpbmcgcm90YXRpb25cblx0XHRcdG1lLnRvcCA9IDA7XG5cdFx0XHRtZS5ib3R0b20gPSBtZS5oZWlnaHQ7XG5cdFx0fVxuXG5cdFx0Ly8gUmVzZXQgcGFkZGluZ1xuXHRcdG1lLnBhZGRpbmdMZWZ0ID0gMDtcblx0XHRtZS5wYWRkaW5nVG9wID0gMDtcblx0XHRtZS5wYWRkaW5nUmlnaHQgPSAwO1xuXHRcdG1lLnBhZGRpbmdCb3R0b20gPSAwO1xuXG5cdFx0Ly8gUmVzZXQgbWluU2l6ZVxuXHRcdG1lLm1pblNpemUgPSB7XG5cdFx0XHR3aWR0aDogMCxcblx0XHRcdGhlaWdodDogMFxuXHRcdH07XG5cdH0sXG5cdGFmdGVyU2V0RGltZW5zaW9uczogbm9vcCxcblxuXHQvL1xuXG5cdGJlZm9yZUJ1aWxkTGFiZWxzOiBub29wLFxuXHRidWlsZExhYmVsczogbm9vcCxcblx0YWZ0ZXJCdWlsZExhYmVsczogbm9vcCxcblxuXHQvL1xuXG5cdGJlZm9yZUZpdDogbm9vcCxcblx0Zml0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdHZhciB2YWx1ZU9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQ7XG5cdFx0dmFyIG9wdHMgPSBtZS5vcHRpb25zO1xuXHRcdHZhciBkaXNwbGF5ID0gb3B0cy5kaXNwbGF5O1xuXHRcdHZhciBmb250U2l6ZSA9IHZhbHVlT3JEZWZhdWx0KG9wdHMuZm9udFNpemUsIGRlZmF1bHRzLmdsb2JhbC5kZWZhdWx0Rm9udFNpemUpO1xuXHRcdHZhciBtaW5TaXplID0gbWUubWluU2l6ZTtcblx0XHR2YXIgbGluZUNvdW50ID0gaGVscGVycy5pc0FycmF5KG9wdHMudGV4dCkgPyBvcHRzLnRleHQubGVuZ3RoIDogMTtcblx0XHR2YXIgbGluZUhlaWdodCA9IGhlbHBlcnMub3B0aW9ucy50b0xpbmVIZWlnaHQob3B0cy5saW5lSGVpZ2h0LCBmb250U2l6ZSk7XG5cdFx0dmFyIHRleHRTaXplID0gZGlzcGxheSA/IChsaW5lQ291bnQgKiBsaW5lSGVpZ2h0KSArIChvcHRzLnBhZGRpbmcgKiAyKSA6IDA7XG5cblx0XHRpZiAobWUuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdG1pblNpemUud2lkdGggPSBtZS5tYXhXaWR0aDsgLy8gZmlsbCBhbGwgdGhlIHdpZHRoXG5cdFx0XHRtaW5TaXplLmhlaWdodCA9IHRleHRTaXplO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtaW5TaXplLndpZHRoID0gdGV4dFNpemU7XG5cdFx0XHRtaW5TaXplLmhlaWdodCA9IG1lLm1heEhlaWdodDsgLy8gZmlsbCBhbGwgdGhlIGhlaWdodFxuXHRcdH1cblxuXHRcdG1lLndpZHRoID0gbWluU2l6ZS53aWR0aDtcblx0XHRtZS5oZWlnaHQgPSBtaW5TaXplLmhlaWdodDtcblxuXHR9LFxuXHRhZnRlckZpdDogbm9vcCxcblxuXHQvLyBTaGFyZWQgTWV0aG9kc1xuXHRpc0hvcml6b250YWw6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBwb3MgPSB0aGlzLm9wdGlvbnMucG9zaXRpb247XG5cdFx0cmV0dXJuIHBvcyA9PT0gJ3RvcCcgfHwgcG9zID09PSAnYm90dG9tJztcblx0fSxcblxuXHQvLyBBY3R1YWxseSBkcmF3IHRoZSB0aXRsZSBibG9jayBvbiB0aGUgY2FudmFzXG5cdGRyYXc6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0dmFyIGN0eCA9IG1lLmN0eDtcblx0XHR2YXIgdmFsdWVPckRlZmF1bHQgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0O1xuXHRcdHZhciBvcHRzID0gbWUub3B0aW9ucztcblx0XHR2YXIgZ2xvYmFsRGVmYXVsdHMgPSBkZWZhdWx0cy5nbG9iYWw7XG5cblx0XHRpZiAob3B0cy5kaXNwbGF5KSB7XG5cdFx0XHR2YXIgZm9udFNpemUgPSB2YWx1ZU9yRGVmYXVsdChvcHRzLmZvbnRTaXplLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFNpemUpO1xuXHRcdFx0dmFyIGZvbnRTdHlsZSA9IHZhbHVlT3JEZWZhdWx0KG9wdHMuZm9udFN0eWxlLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFN0eWxlKTtcblx0XHRcdHZhciBmb250RmFtaWx5ID0gdmFsdWVPckRlZmF1bHQob3B0cy5mb250RmFtaWx5LCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udEZhbWlseSk7XG5cdFx0XHR2YXIgdGl0bGVGb250ID0gaGVscGVycy5mb250U3RyaW5nKGZvbnRTaXplLCBmb250U3R5bGUsIGZvbnRGYW1pbHkpO1xuXHRcdFx0dmFyIGxpbmVIZWlnaHQgPSBoZWxwZXJzLm9wdGlvbnMudG9MaW5lSGVpZ2h0KG9wdHMubGluZUhlaWdodCwgZm9udFNpemUpO1xuXHRcdFx0dmFyIG9mZnNldCA9IGxpbmVIZWlnaHQgLyAyICsgb3B0cy5wYWRkaW5nO1xuXHRcdFx0dmFyIHJvdGF0aW9uID0gMDtcblx0XHRcdHZhciB0b3AgPSBtZS50b3A7XG5cdFx0XHR2YXIgbGVmdCA9IG1lLmxlZnQ7XG5cdFx0XHR2YXIgYm90dG9tID0gbWUuYm90dG9tO1xuXHRcdFx0dmFyIHJpZ2h0ID0gbWUucmlnaHQ7XG5cdFx0XHR2YXIgbWF4V2lkdGgsIHRpdGxlWCwgdGl0bGVZO1xuXG5cdFx0XHRjdHguZmlsbFN0eWxlID0gdmFsdWVPckRlZmF1bHQob3B0cy5mb250Q29sb3IsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250Q29sb3IpOyAvLyByZW5kZXIgaW4gY29ycmVjdCBjb2xvdXJcblx0XHRcdGN0eC5mb250ID0gdGl0bGVGb250O1xuXG5cdFx0XHQvLyBIb3Jpem9udGFsXG5cdFx0XHRpZiAobWUuaXNIb3Jpem9udGFsKCkpIHtcblx0XHRcdFx0dGl0bGVYID0gbGVmdCArICgocmlnaHQgLSBsZWZ0KSAvIDIpOyAvLyBtaWRwb2ludCBvZiB0aGUgd2lkdGhcblx0XHRcdFx0dGl0bGVZID0gdG9wICsgb2Zmc2V0O1xuXHRcdFx0XHRtYXhXaWR0aCA9IHJpZ2h0IC0gbGVmdDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRpdGxlWCA9IG9wdHMucG9zaXRpb24gPT09ICdsZWZ0JyA/IGxlZnQgKyBvZmZzZXQgOiByaWdodCAtIG9mZnNldDtcblx0XHRcdFx0dGl0bGVZID0gdG9wICsgKChib3R0b20gLSB0b3ApIC8gMik7XG5cdFx0XHRcdG1heFdpZHRoID0gYm90dG9tIC0gdG9wO1xuXHRcdFx0XHRyb3RhdGlvbiA9IE1hdGguUEkgKiAob3B0cy5wb3NpdGlvbiA9PT0gJ2xlZnQnID8gLTAuNSA6IDAuNSk7XG5cdFx0XHR9XG5cblx0XHRcdGN0eC5zYXZlKCk7XG5cdFx0XHRjdHgudHJhbnNsYXRlKHRpdGxlWCwgdGl0bGVZKTtcblx0XHRcdGN0eC5yb3RhdGUocm90YXRpb24pO1xuXHRcdFx0Y3R4LnRleHRBbGlnbiA9ICdjZW50ZXInO1xuXHRcdFx0Y3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuXG5cdFx0XHR2YXIgdGV4dCA9IG9wdHMudGV4dDtcblx0XHRcdGlmIChoZWxwZXJzLmlzQXJyYXkodGV4dCkpIHtcblx0XHRcdFx0dmFyIHkgPSAwO1xuXHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyArK2kpIHtcblx0XHRcdFx0XHRjdHguZmlsbFRleHQodGV4dFtpXSwgMCwgeSwgbWF4V2lkdGgpO1xuXHRcdFx0XHRcdHkgKz0gbGluZUhlaWdodDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3R4LmZpbGxUZXh0KHRleHQsIDAsIDAsIG1heFdpZHRoKTtcblx0XHRcdH1cblxuXHRcdFx0Y3R4LnJlc3RvcmUoKTtcblx0XHR9XG5cdH1cbn0pO1xuXG5mdW5jdGlvbiBjcmVhdGVOZXdUaXRsZUJsb2NrQW5kQXR0YWNoKGNoYXJ0LCB0aXRsZU9wdHMpIHtcblx0dmFyIHRpdGxlID0gbmV3IFRpdGxlKHtcblx0XHRjdHg6IGNoYXJ0LmN0eCxcblx0XHRvcHRpb25zOiB0aXRsZU9wdHMsXG5cdFx0Y2hhcnQ6IGNoYXJ0XG5cdH0pO1xuXG5cdGxheW91dHMuY29uZmlndXJlKGNoYXJ0LCB0aXRsZSwgdGl0bGVPcHRzKTtcblx0bGF5b3V0cy5hZGRCb3goY2hhcnQsIHRpdGxlKTtcblx0Y2hhcnQudGl0bGVCbG9jayA9IHRpdGxlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0aWQ6ICd0aXRsZScsXG5cblx0LyoqXG5cdCAqIEJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IHNpbmNlIDIuMS41LCB0aGUgdGl0bGUgaXMgcmVnaXN0ZXJlZCBhcyBhIHBsdWdpbiwgbWFraW5nXG5cdCAqIENoYXJ0LlRpdGxlIG9ic29sZXRlLiBUbyBhdm9pZCBhIGJyZWFraW5nIGNoYW5nZSwgd2UgZXhwb3J0IHRoZSBUaXRsZSBhcyBwYXJ0IG9mXG5cdCAqIHRoZSBwbHVnaW4sIHdoaWNoIG9uZSB3aWxsIGJlIHJlLWV4cG9zZWQgaW4gdGhlIGNoYXJ0LmpzIGZpbGUuXG5cdCAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL3B1bGwvMjY0MFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2VsZW1lbnQ6IFRpdGxlLFxuXG5cdGJlZm9yZUluaXQ6IGZ1bmN0aW9uKGNoYXJ0KSB7XG5cdFx0dmFyIHRpdGxlT3B0cyA9IGNoYXJ0Lm9wdGlvbnMudGl0bGU7XG5cblx0XHRpZiAodGl0bGVPcHRzKSB7XG5cdFx0XHRjcmVhdGVOZXdUaXRsZUJsb2NrQW5kQXR0YWNoKGNoYXJ0LCB0aXRsZU9wdHMpO1xuXHRcdH1cblx0fSxcblxuXHRiZWZvcmVVcGRhdGU6IGZ1bmN0aW9uKGNoYXJ0KSB7XG5cdFx0dmFyIHRpdGxlT3B0cyA9IGNoYXJ0Lm9wdGlvbnMudGl0bGU7XG5cdFx0dmFyIHRpdGxlQmxvY2sgPSBjaGFydC50aXRsZUJsb2NrO1xuXG5cdFx0aWYgKHRpdGxlT3B0cykge1xuXHRcdFx0aGVscGVycy5tZXJnZUlmKHRpdGxlT3B0cywgZGVmYXVsdHMuZ2xvYmFsLnRpdGxlKTtcblxuXHRcdFx0aWYgKHRpdGxlQmxvY2spIHtcblx0XHRcdFx0bGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIHRpdGxlQmxvY2ssIHRpdGxlT3B0cyk7XG5cdFx0XHRcdHRpdGxlQmxvY2sub3B0aW9ucyA9IHRpdGxlT3B0cztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNyZWF0ZU5ld1RpdGxlQmxvY2tBbmRBdHRhY2goY2hhcnQsIHRpdGxlT3B0cyk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh0aXRsZUJsb2NrKSB7XG5cdFx0XHRsYXlvdXRzLnJlbW92ZUJveChjaGFydCwgdGl0bGVCbG9jayk7XG5cdFx0XHRkZWxldGUgY2hhcnQudGl0bGVCbG9jaztcblx0XHR9XG5cdH1cbn07XG5cbn0se1wiMjZcIjoyNixcIjI3XCI6MjcsXCIzMVwiOjMxLFwiNDZcIjo0Nn1dLDU0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcbid1c2Ugc3RyaWN0JztcblxudmFyIFNjYWxlID0gcmVxdWlyZSgzMyk7XG52YXIgc2NhbGVTZXJ2aWNlID0gcmVxdWlyZSgzNCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG5cblx0Ly8gRGVmYXVsdCBjb25maWcgZm9yIGEgY2F0ZWdvcnkgc2NhbGVcblx0dmFyIGRlZmF1bHRDb25maWcgPSB7XG5cdFx0cG9zaXRpb246ICdib3R0b20nXG5cdH07XG5cblx0dmFyIERhdGFzZXRTY2FsZSA9IFNjYWxlLmV4dGVuZCh7XG5cdFx0LyoqXG5cdFx0KiBJbnRlcm5hbCBmdW5jdGlvbiB0byBnZXQgdGhlIGNvcnJlY3QgbGFiZWxzLiBJZiBkYXRhLnhMYWJlbHMgb3IgZGF0YS55TGFiZWxzIGFyZSBkZWZpbmVkLCB1c2UgdGhvc2Vcblx0XHQqIGVsc2UgZmFsbCBiYWNrIHRvIGRhdGEubGFiZWxzXG5cdFx0KiBAcHJpdmF0ZVxuXHRcdCovXG5cdFx0Z2V0TGFiZWxzOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBkYXRhID0gdGhpcy5jaGFydC5kYXRhO1xuXHRcdFx0cmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbHMgfHwgKHRoaXMuaXNIb3Jpem9udGFsKCkgPyBkYXRhLnhMYWJlbHMgOiBkYXRhLnlMYWJlbHMpIHx8IGRhdGEubGFiZWxzO1xuXHRcdH0sXG5cblx0XHRkZXRlcm1pbmVEYXRhTGltaXRzOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgbGFiZWxzID0gbWUuZ2V0TGFiZWxzKCk7XG5cdFx0XHRtZS5taW5JbmRleCA9IDA7XG5cdFx0XHRtZS5tYXhJbmRleCA9IGxhYmVscy5sZW5ndGggLSAxO1xuXHRcdFx0dmFyIGZpbmRJbmRleDtcblxuXHRcdFx0aWYgKG1lLm9wdGlvbnMudGlja3MubWluICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Ly8gdXNlciBzcGVjaWZpZWQgbWluIHZhbHVlXG5cdFx0XHRcdGZpbmRJbmRleCA9IGxhYmVscy5pbmRleE9mKG1lLm9wdGlvbnMudGlja3MubWluKTtcblx0XHRcdFx0bWUubWluSW5kZXggPSBmaW5kSW5kZXggIT09IC0xID8gZmluZEluZGV4IDogbWUubWluSW5kZXg7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtZS5vcHRpb25zLnRpY2tzLm1heCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdC8vIHVzZXIgc3BlY2lmaWVkIG1heCB2YWx1ZVxuXHRcdFx0XHRmaW5kSW5kZXggPSBsYWJlbHMuaW5kZXhPZihtZS5vcHRpb25zLnRpY2tzLm1heCk7XG5cdFx0XHRcdG1lLm1heEluZGV4ID0gZmluZEluZGV4ICE9PSAtMSA/IGZpbmRJbmRleCA6IG1lLm1heEluZGV4O1xuXHRcdFx0fVxuXG5cdFx0XHRtZS5taW4gPSBsYWJlbHNbbWUubWluSW5kZXhdO1xuXHRcdFx0bWUubWF4ID0gbGFiZWxzW21lLm1heEluZGV4XTtcblx0XHR9LFxuXG5cdFx0YnVpbGRUaWNrczogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIGxhYmVscyA9IG1lLmdldExhYmVscygpO1xuXHRcdFx0Ly8gSWYgd2UgYXJlIHZpZXdpbmcgc29tZSBzdWJzZXQgb2YgbGFiZWxzLCBzbGljZSB0aGUgb3JpZ2luYWwgYXJyYXlcblx0XHRcdG1lLnRpY2tzID0gKG1lLm1pbkluZGV4ID09PSAwICYmIG1lLm1heEluZGV4ID09PSBsYWJlbHMubGVuZ3RoIC0gMSkgPyBsYWJlbHMgOiBsYWJlbHMuc2xpY2UobWUubWluSW5kZXgsIG1lLm1heEluZGV4ICsgMSk7XG5cdFx0fSxcblxuXHRcdGdldExhYmVsRm9ySW5kZXg6IGZ1bmN0aW9uKGluZGV4LCBkYXRhc2V0SW5kZXgpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgZGF0YSA9IG1lLmNoYXJ0LmRhdGE7XG5cdFx0XHR2YXIgaXNIb3Jpem9udGFsID0gbWUuaXNIb3Jpem9udGFsKCk7XG5cblx0XHRcdGlmIChkYXRhLnlMYWJlbHMgJiYgIWlzSG9yaXpvbnRhbCkge1xuXHRcdFx0XHRyZXR1cm4gbWUuZ2V0UmlnaHRWYWx1ZShkYXRhLmRhdGFzZXRzW2RhdGFzZXRJbmRleF0uZGF0YVtpbmRleF0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1lLnRpY2tzW2luZGV4IC0gbWUubWluSW5kZXhdO1xuXHRcdH0sXG5cblx0XHQvLyBVc2VkIHRvIGdldCBkYXRhIHZhbHVlIGxvY2F0aW9ucy4gIFZhbHVlIGNhbiBlaXRoZXIgYmUgYW4gaW5kZXggb3IgYSBudW1lcmljYWwgdmFsdWVcblx0XHRnZXRQaXhlbEZvclZhbHVlOiBmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgb2Zmc2V0ID0gbWUub3B0aW9ucy5vZmZzZXQ7XG5cdFx0XHQvLyAxIGlzIGFkZGVkIGJlY2F1c2Ugd2UgbmVlZCB0aGUgbGVuZ3RoIGJ1dCB3ZSBoYXZlIHRoZSBpbmRleGVzXG5cdFx0XHR2YXIgb2Zmc2V0QW10ID0gTWF0aC5tYXgoKG1lLm1heEluZGV4ICsgMSAtIG1lLm1pbkluZGV4IC0gKG9mZnNldCA/IDAgOiAxKSksIDEpO1xuXG5cdFx0XHQvLyBJZiB2YWx1ZSBpcyBhIGRhdGEgb2JqZWN0LCB0aGVuIGluZGV4IGlzIHRoZSBpbmRleCBpbiB0aGUgZGF0YSBhcnJheSxcblx0XHRcdC8vIG5vdCB0aGUgaW5kZXggb2YgdGhlIHNjYWxlLiBXZSBuZWVkIHRvIGNoYW5nZSB0aGF0LlxuXHRcdFx0dmFyIHZhbHVlQ2F0ZWdvcnk7XG5cdFx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuXHRcdFx0XHR2YWx1ZUNhdGVnb3J5ID0gbWUuaXNIb3Jpem9udGFsKCkgPyB2YWx1ZS54IDogdmFsdWUueTtcblx0XHRcdH1cblx0XHRcdGlmICh2YWx1ZUNhdGVnb3J5ICE9PSB1bmRlZmluZWQgfHwgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgaXNOYU4oaW5kZXgpKSkge1xuXHRcdFx0XHR2YXIgbGFiZWxzID0gbWUuZ2V0TGFiZWxzKCk7XG5cdFx0XHRcdHZhbHVlID0gdmFsdWVDYXRlZ29yeSB8fCB2YWx1ZTtcblx0XHRcdFx0dmFyIGlkeCA9IGxhYmVscy5pbmRleE9mKHZhbHVlKTtcblx0XHRcdFx0aW5kZXggPSBpZHggIT09IC0xID8gaWR4IDogaW5kZXg7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtZS5pc0hvcml6b250YWwoKSkge1xuXHRcdFx0XHR2YXIgdmFsdWVXaWR0aCA9IG1lLndpZHRoIC8gb2Zmc2V0QW10O1xuXHRcdFx0XHR2YXIgd2lkdGhPZmZzZXQgPSAodmFsdWVXaWR0aCAqIChpbmRleCAtIG1lLm1pbkluZGV4KSk7XG5cblx0XHRcdFx0aWYgKG9mZnNldCkge1xuXHRcdFx0XHRcdHdpZHRoT2Zmc2V0ICs9ICh2YWx1ZVdpZHRoIC8gMik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbWUubGVmdCArIE1hdGgucm91bmQod2lkdGhPZmZzZXQpO1xuXHRcdFx0fVxuXHRcdFx0dmFyIHZhbHVlSGVpZ2h0ID0gbWUuaGVpZ2h0IC8gb2Zmc2V0QW10O1xuXHRcdFx0dmFyIGhlaWdodE9mZnNldCA9ICh2YWx1ZUhlaWdodCAqIChpbmRleCAtIG1lLm1pbkluZGV4KSk7XG5cblx0XHRcdGlmIChvZmZzZXQpIHtcblx0XHRcdFx0aGVpZ2h0T2Zmc2V0ICs9ICh2YWx1ZUhlaWdodCAvIDIpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWUudG9wICsgTWF0aC5yb3VuZChoZWlnaHRPZmZzZXQpO1xuXHRcdH0sXG5cdFx0Z2V0UGl4ZWxGb3JUaWNrOiBmdW5jdGlvbihpbmRleCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0UGl4ZWxGb3JWYWx1ZSh0aGlzLnRpY2tzW2luZGV4XSwgaW5kZXggKyB0aGlzLm1pbkluZGV4LCBudWxsKTtcblx0XHR9LFxuXHRcdGdldFZhbHVlRm9yUGl4ZWw6IGZ1bmN0aW9uKHBpeGVsKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG9mZnNldCA9IG1lLm9wdGlvbnMub2Zmc2V0O1xuXHRcdFx0dmFyIHZhbHVlO1xuXHRcdFx0dmFyIG9mZnNldEFtdCA9IE1hdGgubWF4KChtZS5fdGlja3MubGVuZ3RoIC0gKG9mZnNldCA/IDAgOiAxKSksIDEpO1xuXHRcdFx0dmFyIGhvcnogPSBtZS5pc0hvcml6b250YWwoKTtcblx0XHRcdHZhciB2YWx1ZURpbWVuc2lvbiA9IChob3J6ID8gbWUud2lkdGggOiBtZS5oZWlnaHQpIC8gb2Zmc2V0QW10O1xuXG5cdFx0XHRwaXhlbCAtPSBob3J6ID8gbWUubGVmdCA6IG1lLnRvcDtcblxuXHRcdFx0aWYgKG9mZnNldCkge1xuXHRcdFx0XHRwaXhlbCAtPSAodmFsdWVEaW1lbnNpb24gLyAyKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHBpeGVsIDw9IDApIHtcblx0XHRcdFx0dmFsdWUgPSAwO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFsdWUgPSBNYXRoLnJvdW5kKHBpeGVsIC8gdmFsdWVEaW1lbnNpb24pO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmFsdWUgKyBtZS5taW5JbmRleDtcblx0XHR9LFxuXHRcdGdldEJhc2VQaXhlbDogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5ib3R0b207XG5cdFx0fVxuXHR9KTtcblxuXHRzY2FsZVNlcnZpY2UucmVnaXN0ZXJTY2FsZVR5cGUoJ2NhdGVnb3J5JywgRGF0YXNldFNjYWxlLCBkZWZhdWx0Q29uZmlnKTtcbn07XG5cbn0se1wiMzNcIjozMyxcIjM0XCI6MzR9XSw1NTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcbnZhciBzY2FsZVNlcnZpY2UgPSByZXF1aXJlKDM0KTtcbnZhciBUaWNrcyA9IHJlcXVpcmUoMzUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENoYXJ0KSB7XG5cblx0dmFyIGRlZmF1bHRDb25maWcgPSB7XG5cdFx0cG9zaXRpb246ICdsZWZ0Jyxcblx0XHR0aWNrczoge1xuXHRcdFx0Y2FsbGJhY2s6IFRpY2tzLmZvcm1hdHRlcnMubGluZWFyXG5cdFx0fVxuXHR9O1xuXG5cdHZhciBMaW5lYXJTY2FsZSA9IENoYXJ0LkxpbmVhclNjYWxlQmFzZS5leHRlbmQoe1xuXG5cdFx0ZGV0ZXJtaW5lRGF0YUxpbWl0czogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG9wdHMgPSBtZS5vcHRpb25zO1xuXHRcdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XG5cdFx0XHR2YXIgZGF0YSA9IGNoYXJ0LmRhdGE7XG5cdFx0XHR2YXIgZGF0YXNldHMgPSBkYXRhLmRhdGFzZXRzO1xuXHRcdFx0dmFyIGlzSG9yaXpvbnRhbCA9IG1lLmlzSG9yaXpvbnRhbCgpO1xuXHRcdFx0dmFyIERFRkFVTFRfTUlOID0gMDtcblx0XHRcdHZhciBERUZBVUxUX01BWCA9IDE7XG5cblx0XHRcdGZ1bmN0aW9uIElETWF0Y2hlcyhtZXRhKSB7XG5cdFx0XHRcdHJldHVybiBpc0hvcml6b250YWwgPyBtZXRhLnhBeGlzSUQgPT09IG1lLmlkIDogbWV0YS55QXhpc0lEID09PSBtZS5pZDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRmlyc3QgQ2FsY3VsYXRlIHRoZSByYW5nZVxuXHRcdFx0bWUubWluID0gbnVsbDtcblx0XHRcdG1lLm1heCA9IG51bGw7XG5cblx0XHRcdHZhciBoYXNTdGFja3MgPSBvcHRzLnN0YWNrZWQ7XG5cdFx0XHRpZiAoaGFzU3RhY2tzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aGVscGVycy5lYWNoKGRhdGFzZXRzLCBmdW5jdGlvbihkYXRhc2V0LCBkYXRhc2V0SW5kZXgpIHtcblx0XHRcdFx0XHRpZiAoaGFzU3RhY2tzKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmFyIG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpO1xuXHRcdFx0XHRcdGlmIChjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGRhdGFzZXRJbmRleCkgJiYgSURNYXRjaGVzKG1ldGEpICYmXG5cdFx0XHRcdFx0XHRtZXRhLnN0YWNrICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdGhhc1N0YWNrcyA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG9wdHMuc3RhY2tlZCB8fCBoYXNTdGFja3MpIHtcblx0XHRcdFx0dmFyIHZhbHVlc1BlclN0YWNrID0ge307XG5cblx0XHRcdFx0aGVscGVycy5lYWNoKGRhdGFzZXRzLCBmdW5jdGlvbihkYXRhc2V0LCBkYXRhc2V0SW5kZXgpIHtcblx0XHRcdFx0XHR2YXIgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG5cdFx0XHRcdFx0dmFyIGtleSA9IFtcblx0XHRcdFx0XHRcdG1ldGEudHlwZSxcblx0XHRcdFx0XHRcdC8vIHdlIGhhdmUgYSBzZXBhcmF0ZSBzdGFjayBmb3Igc3RhY2s9dW5kZWZpbmVkIGRhdGFzZXRzIHdoZW4gdGhlIG9wdHMuc3RhY2tlZCBpcyB1bmRlZmluZWRcblx0XHRcdFx0XHRcdCgob3B0cy5zdGFja2VkID09PSB1bmRlZmluZWQgJiYgbWV0YS5zdGFjayA9PT0gdW5kZWZpbmVkKSA/IGRhdGFzZXRJbmRleCA6ICcnKSxcblx0XHRcdFx0XHRcdG1ldGEuc3RhY2tcblx0XHRcdFx0XHRdLmpvaW4oJy4nKTtcblxuXHRcdFx0XHRcdGlmICh2YWx1ZXNQZXJTdGFja1trZXldID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHZhbHVlc1BlclN0YWNrW2tleV0gPSB7XG5cdFx0XHRcdFx0XHRcdHBvc2l0aXZlVmFsdWVzOiBbXSxcblx0XHRcdFx0XHRcdFx0bmVnYXRpdmVWYWx1ZXM6IFtdXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFN0b3JlIHRoZXNlIHBlciB0eXBlXG5cdFx0XHRcdFx0dmFyIHBvc2l0aXZlVmFsdWVzID0gdmFsdWVzUGVyU3RhY2tba2V5XS5wb3NpdGl2ZVZhbHVlcztcblx0XHRcdFx0XHR2YXIgbmVnYXRpdmVWYWx1ZXMgPSB2YWx1ZXNQZXJTdGFja1trZXldLm5lZ2F0aXZlVmFsdWVzO1xuXG5cdFx0XHRcdFx0aWYgKGNoYXJ0LmlzRGF0YXNldFZpc2libGUoZGF0YXNldEluZGV4KSAmJiBJRE1hdGNoZXMobWV0YSkpIHtcblx0XHRcdFx0XHRcdGhlbHBlcnMuZWFjaChkYXRhc2V0LmRhdGEsIGZ1bmN0aW9uKHJhd1ZhbHVlLCBpbmRleCkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdmFsdWUgPSArbWUuZ2V0UmlnaHRWYWx1ZShyYXdWYWx1ZSk7XG5cdFx0XHRcdFx0XHRcdGlmIChpc05hTih2YWx1ZSkgfHwgbWV0YS5kYXRhW2luZGV4XS5oaWRkZW4pIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRwb3NpdGl2ZVZhbHVlc1tpbmRleF0gPSBwb3NpdGl2ZVZhbHVlc1tpbmRleF0gfHwgMDtcblx0XHRcdFx0XHRcdFx0bmVnYXRpdmVWYWx1ZXNbaW5kZXhdID0gbmVnYXRpdmVWYWx1ZXNbaW5kZXhdIHx8IDA7XG5cblx0XHRcdFx0XHRcdFx0aWYgKG9wdHMucmVsYXRpdmVQb2ludHMpIHtcblx0XHRcdFx0XHRcdFx0XHRwb3NpdGl2ZVZhbHVlc1tpbmRleF0gPSAxMDA7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodmFsdWUgPCAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0bmVnYXRpdmVWYWx1ZXNbaW5kZXhdICs9IHZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHBvc2l0aXZlVmFsdWVzW2luZGV4XSArPSB2YWx1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRoZWxwZXJzLmVhY2godmFsdWVzUGVyU3RhY2ssIGZ1bmN0aW9uKHZhbHVlc0ZvclR5cGUpIHtcblx0XHRcdFx0XHR2YXIgdmFsdWVzID0gdmFsdWVzRm9yVHlwZS5wb3NpdGl2ZVZhbHVlcy5jb25jYXQodmFsdWVzRm9yVHlwZS5uZWdhdGl2ZVZhbHVlcyk7XG5cdFx0XHRcdFx0dmFyIG1pblZhbCA9IGhlbHBlcnMubWluKHZhbHVlcyk7XG5cdFx0XHRcdFx0dmFyIG1heFZhbCA9IGhlbHBlcnMubWF4KHZhbHVlcyk7XG5cdFx0XHRcdFx0bWUubWluID0gbWUubWluID09PSBudWxsID8gbWluVmFsIDogTWF0aC5taW4obWUubWluLCBtaW5WYWwpO1xuXHRcdFx0XHRcdG1lLm1heCA9IG1lLm1heCA9PT0gbnVsbCA/IG1heFZhbCA6IE1hdGgubWF4KG1lLm1heCwgbWF4VmFsKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGhlbHBlcnMuZWFjaChkYXRhc2V0cywgZnVuY3Rpb24oZGF0YXNldCwgZGF0YXNldEluZGV4KSB7XG5cdFx0XHRcdFx0dmFyIG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpO1xuXHRcdFx0XHRcdGlmIChjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGRhdGFzZXRJbmRleCkgJiYgSURNYXRjaGVzKG1ldGEpKSB7XG5cdFx0XHRcdFx0XHRoZWxwZXJzLmVhY2goZGF0YXNldC5kYXRhLCBmdW5jdGlvbihyYXdWYWx1ZSwgaW5kZXgpIHtcblx0XHRcdFx0XHRcdFx0dmFyIHZhbHVlID0gK21lLmdldFJpZ2h0VmFsdWUocmF3VmFsdWUpO1xuXHRcdFx0XHRcdFx0XHRpZiAoaXNOYU4odmFsdWUpIHx8IG1ldGEuZGF0YVtpbmRleF0uaGlkZGVuKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKG1lLm1pbiA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0XHRcdG1lLm1pbiA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHZhbHVlIDwgbWUubWluKSB7XG5cdFx0XHRcdFx0XHRcdFx0bWUubWluID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAobWUubWF4ID09PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRcdFx0bWUubWF4ID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodmFsdWUgPiBtZS5tYXgpIHtcblx0XHRcdFx0XHRcdFx0XHRtZS5tYXggPSB2YWx1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0bWUubWluID0gaXNGaW5pdGUobWUubWluKSAmJiAhaXNOYU4obWUubWluKSA/IG1lLm1pbiA6IERFRkFVTFRfTUlOO1xuXHRcdFx0bWUubWF4ID0gaXNGaW5pdGUobWUubWF4KSAmJiAhaXNOYU4obWUubWF4KSA/IG1lLm1heCA6IERFRkFVTFRfTUFYO1xuXG5cdFx0XHQvLyBDb21tb24gYmFzZSBpbXBsZW1lbnRhdGlvbiB0byBoYW5kbGUgdGlja3MubWluLCB0aWNrcy5tYXgsIHRpY2tzLmJlZ2luQXRaZXJvXG5cdFx0XHR0aGlzLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKTtcblx0XHR9LFxuXHRcdGdldFRpY2tMaW1pdDogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWF4VGlja3M7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIHRpY2tPcHRzID0gbWUub3B0aW9ucy50aWNrcztcblxuXHRcdFx0aWYgKG1lLmlzSG9yaXpvbnRhbCgpKSB7XG5cdFx0XHRcdG1heFRpY2tzID0gTWF0aC5taW4odGlja09wdHMubWF4VGlja3NMaW1pdCA/IHRpY2tPcHRzLm1heFRpY2tzTGltaXQgOiAxMSwgTWF0aC5jZWlsKG1lLndpZHRoIC8gNTApKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIFRoZSBmYWN0b3Igb2YgMiB1c2VkIHRvIHNjYWxlIHRoZSBmb250IHNpemUgaGFzIGJlZW4gZXhwZXJpbWVudGFsbHkgZGV0ZXJtaW5lZC5cblx0XHRcdFx0dmFyIHRpY2tGb250U2l6ZSA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQodGlja09wdHMuZm9udFNpemUsIGRlZmF1bHRzLmdsb2JhbC5kZWZhdWx0Rm9udFNpemUpO1xuXHRcdFx0XHRtYXhUaWNrcyA9IE1hdGgubWluKHRpY2tPcHRzLm1heFRpY2tzTGltaXQgPyB0aWNrT3B0cy5tYXhUaWNrc0xpbWl0IDogMTEsIE1hdGguY2VpbChtZS5oZWlnaHQgLyAoMiAqIHRpY2tGb250U2l6ZSkpKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1heFRpY2tzO1xuXHRcdH0sXG5cdFx0Ly8gQ2FsbGVkIGFmdGVyIHRoZSB0aWNrcyBhcmUgYnVpbHQuIFdlIG5lZWRcblx0XHRoYW5kbGVEaXJlY3Rpb25hbENoYW5nZXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCF0aGlzLmlzSG9yaXpvbnRhbCgpKSB7XG5cdFx0XHRcdC8vIFdlIGFyZSBpbiBhIHZlcnRpY2FsIG9yaWVudGF0aW9uLiBUaGUgdG9wIHZhbHVlIGlzIHRoZSBoaWdoZXN0LiBTbyByZXZlcnNlIHRoZSBhcnJheVxuXHRcdFx0XHR0aGlzLnRpY2tzLnJldmVyc2UoKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGdldExhYmVsRm9ySW5kZXg6IGZ1bmN0aW9uKGluZGV4LCBkYXRhc2V0SW5kZXgpIHtcblx0XHRcdHJldHVybiArdGhpcy5nZXRSaWdodFZhbHVlKHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1tkYXRhc2V0SW5kZXhdLmRhdGFbaW5kZXhdKTtcblx0XHR9LFxuXHRcdC8vIFV0aWxzXG5cdFx0Z2V0UGl4ZWxGb3JWYWx1ZTogZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdC8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZml0IGhhcyBiZWVuIHJ1biBzbyB0aGF0XG5cdFx0XHQvLyB0aGlzLmxlZnQsIHRoaXMudG9wLCB0aGlzLnJpZ2h0LCBhbmQgdGhpcy5ib3R0b20gaGF2ZSBiZWVuIGRlZmluZWRcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgc3RhcnQgPSBtZS5zdGFydDtcblxuXHRcdFx0dmFyIHJpZ2h0VmFsdWUgPSArbWUuZ2V0UmlnaHRWYWx1ZSh2YWx1ZSk7XG5cdFx0XHR2YXIgcGl4ZWw7XG5cdFx0XHR2YXIgcmFuZ2UgPSBtZS5lbmQgLSBzdGFydDtcblxuXHRcdFx0aWYgKG1lLmlzSG9yaXpvbnRhbCgpKSB7XG5cdFx0XHRcdHBpeGVsID0gbWUubGVmdCArIChtZS53aWR0aCAvIHJhbmdlICogKHJpZ2h0VmFsdWUgLSBzdGFydCkpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cGl4ZWwgPSBtZS5ib3R0b20gLSAobWUuaGVpZ2h0IC8gcmFuZ2UgKiAocmlnaHRWYWx1ZSAtIHN0YXJ0KSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcGl4ZWw7XG5cdFx0fSxcblx0XHRnZXRWYWx1ZUZvclBpeGVsOiBmdW5jdGlvbihwaXhlbCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBpc0hvcml6b250YWwgPSBtZS5pc0hvcml6b250YWwoKTtcblx0XHRcdHZhciBpbm5lckRpbWVuc2lvbiA9IGlzSG9yaXpvbnRhbCA/IG1lLndpZHRoIDogbWUuaGVpZ2h0O1xuXHRcdFx0dmFyIG9mZnNldCA9IChpc0hvcml6b250YWwgPyBwaXhlbCAtIG1lLmxlZnQgOiBtZS5ib3R0b20gLSBwaXhlbCkgLyBpbm5lckRpbWVuc2lvbjtcblx0XHRcdHJldHVybiBtZS5zdGFydCArICgobWUuZW5kIC0gbWUuc3RhcnQpICogb2Zmc2V0KTtcblx0XHR9LFxuXHRcdGdldFBpeGVsRm9yVGljazogZnVuY3Rpb24oaW5kZXgpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldFBpeGVsRm9yVmFsdWUodGhpcy50aWNrc0FzTnVtYmVyc1tpbmRleF0pO1xuXHRcdH1cblx0fSk7XG5cblx0c2NhbGVTZXJ2aWNlLnJlZ2lzdGVyU2NhbGVUeXBlKCdsaW5lYXInLCBMaW5lYXJTY2FsZSwgZGVmYXVsdENvbmZpZyk7XG59O1xuXG59LHtcIjI2XCI6MjYsXCIzNFwiOjM0LFwiMzVcIjozNSxcIjQ2XCI6NDZ9XSw1NjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XG52YXIgU2NhbGUgPSByZXF1aXJlKDMzKTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHNldCBvZiBsaW5lYXIgdGlja3NcbiAqIEBwYXJhbSBnZW5lcmF0aW9uT3B0aW9ucyB0aGUgb3B0aW9ucyB1c2VkIHRvIGdlbmVyYXRlIHRoZSB0aWNrc1xuICogQHBhcmFtIGRhdGFSYW5nZSB0aGUgcmFuZ2Ugb2YgdGhlIGRhdGFcbiAqIEByZXR1cm5zIHtBcnJheTxOdW1iZXI+fSBhcnJheSBvZiB0aWNrIHZhbHVlc1xuICovXG5mdW5jdGlvbiBnZW5lcmF0ZVRpY2tzKGdlbmVyYXRpb25PcHRpb25zLCBkYXRhUmFuZ2UpIHtcblx0dmFyIHRpY2tzID0gW107XG5cdC8vIFRvIGdldCBhIFwibmljZVwiIHZhbHVlIGZvciB0aGUgdGljayBzcGFjaW5nLCB3ZSB3aWxsIHVzZSB0aGUgYXBwcm9wcmlhdGVseSBuYW1lZFxuXHQvLyBcIm5pY2UgbnVtYmVyXCIgYWxnb3JpdGhtLiBTZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy84NTA2ODgxL25pY2UtbGFiZWwtYWxnb3JpdGhtLWZvci1jaGFydHMtd2l0aC1taW5pbXVtLXRpY2tzXG5cdC8vIGZvciBkZXRhaWxzLlxuXG5cdHZhciBmYWN0b3I7XG5cdHZhciBwcmVjaXNpb247XG5cdHZhciBzcGFjaW5nO1xuXG5cdGlmIChnZW5lcmF0aW9uT3B0aW9ucy5zdGVwU2l6ZSAmJiBnZW5lcmF0aW9uT3B0aW9ucy5zdGVwU2l6ZSA+IDApIHtcblx0XHRzcGFjaW5nID0gZ2VuZXJhdGlvbk9wdGlvbnMuc3RlcFNpemU7XG5cdH0gZWxzZSB7XG5cdFx0dmFyIG5pY2VSYW5nZSA9IGhlbHBlcnMubmljZU51bShkYXRhUmFuZ2UubWF4IC0gZGF0YVJhbmdlLm1pbiwgZmFsc2UpO1xuXHRcdHNwYWNpbmcgPSBoZWxwZXJzLm5pY2VOdW0obmljZVJhbmdlIC8gKGdlbmVyYXRpb25PcHRpb25zLm1heFRpY2tzIC0gMSksIHRydWUpO1xuXG5cdFx0cHJlY2lzaW9uID0gZ2VuZXJhdGlvbk9wdGlvbnMucHJlY2lzaW9uO1xuXHRcdGlmIChwcmVjaXNpb24gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGEgcHJlY2lzaW9uLCByb3VuZCB0byB0aGF0IG51bWJlciBvZiBkZWNpbWFsIHBsYWNlc1xuXHRcdFx0ZmFjdG9yID0gTWF0aC5wb3coMTAsIHByZWNpc2lvbik7XG5cdFx0XHRzcGFjaW5nID0gTWF0aC5jZWlsKHNwYWNpbmcgKiBmYWN0b3IpIC8gZmFjdG9yO1xuXHRcdH1cblx0fVxuXHR2YXIgbmljZU1pbiA9IE1hdGguZmxvb3IoZGF0YVJhbmdlLm1pbiAvIHNwYWNpbmcpICogc3BhY2luZztcblx0dmFyIG5pY2VNYXggPSBNYXRoLmNlaWwoZGF0YVJhbmdlLm1heCAvIHNwYWNpbmcpICogc3BhY2luZztcblxuXHQvLyBJZiBtaW4sIG1heCBhbmQgc3RlcFNpemUgaXMgc2V0IGFuZCB0aGV5IG1ha2UgYW4gZXZlbmx5IHNwYWNlZCBzY2FsZSB1c2UgaXQuXG5cdGlmICghaGVscGVycy5pc051bGxPclVuZGVmKGdlbmVyYXRpb25PcHRpb25zLm1pbikgJiYgIWhlbHBlcnMuaXNOdWxsT3JVbmRlZihnZW5lcmF0aW9uT3B0aW9ucy5tYXgpICYmIGdlbmVyYXRpb25PcHRpb25zLnN0ZXBTaXplKSB7XG5cdFx0Ly8gSWYgdmVyeSBjbG9zZSB0byBvdXIgd2hvbGUgbnVtYmVyLCB1c2UgaXQuXG5cdFx0aWYgKGhlbHBlcnMuYWxtb3N0V2hvbGUoKGdlbmVyYXRpb25PcHRpb25zLm1heCAtIGdlbmVyYXRpb25PcHRpb25zLm1pbikgLyBnZW5lcmF0aW9uT3B0aW9ucy5zdGVwU2l6ZSwgc3BhY2luZyAvIDEwMDApKSB7XG5cdFx0XHRuaWNlTWluID0gZ2VuZXJhdGlvbk9wdGlvbnMubWluO1xuXHRcdFx0bmljZU1heCA9IGdlbmVyYXRpb25PcHRpb25zLm1heDtcblx0XHR9XG5cdH1cblxuXHR2YXIgbnVtU3BhY2VzID0gKG5pY2VNYXggLSBuaWNlTWluKSAvIHNwYWNpbmc7XG5cdC8vIElmIHZlcnkgY2xvc2UgdG8gb3VyIHJvdW5kZWQgdmFsdWUsIHVzZSBpdC5cblx0aWYgKGhlbHBlcnMuYWxtb3N0RXF1YWxzKG51bVNwYWNlcywgTWF0aC5yb3VuZChudW1TcGFjZXMpLCBzcGFjaW5nIC8gMTAwMCkpIHtcblx0XHRudW1TcGFjZXMgPSBNYXRoLnJvdW5kKG51bVNwYWNlcyk7XG5cdH0gZWxzZSB7XG5cdFx0bnVtU3BhY2VzID0gTWF0aC5jZWlsKG51bVNwYWNlcyk7XG5cdH1cblxuXHRwcmVjaXNpb24gPSAxO1xuXHRpZiAoc3BhY2luZyA8IDEpIHtcblx0XHRwcmVjaXNpb24gPSBNYXRoLnBvdygxMCwgMSAtIE1hdGguZmxvb3IoaGVscGVycy5sb2cxMChzcGFjaW5nKSkpO1xuXHRcdG5pY2VNaW4gPSBNYXRoLnJvdW5kKG5pY2VNaW4gKiBwcmVjaXNpb24pIC8gcHJlY2lzaW9uO1xuXHRcdG5pY2VNYXggPSBNYXRoLnJvdW5kKG5pY2VNYXggKiBwcmVjaXNpb24pIC8gcHJlY2lzaW9uO1xuXHR9XG5cdHRpY2tzLnB1c2goZ2VuZXJhdGlvbk9wdGlvbnMubWluICE9PSB1bmRlZmluZWQgPyBnZW5lcmF0aW9uT3B0aW9ucy5taW4gOiBuaWNlTWluKTtcblx0Zm9yICh2YXIgaiA9IDE7IGogPCBudW1TcGFjZXM7ICsraikge1xuXHRcdHRpY2tzLnB1c2goTWF0aC5yb3VuZCgobmljZU1pbiArIGogKiBzcGFjaW5nKSAqIHByZWNpc2lvbikgLyBwcmVjaXNpb24pO1xuXHR9XG5cdHRpY2tzLnB1c2goZ2VuZXJhdGlvbk9wdGlvbnMubWF4ICE9PSB1bmRlZmluZWQgPyBnZW5lcmF0aW9uT3B0aW9ucy5tYXggOiBuaWNlTWF4KTtcblxuXHRyZXR1cm4gdGlja3M7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcblxuXHR2YXIgbm9vcCA9IGhlbHBlcnMubm9vcDtcblxuXHRDaGFydC5MaW5lYXJTY2FsZUJhc2UgPSBTY2FsZS5leHRlbmQoe1xuXHRcdGdldFJpZ2h0VmFsdWU6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRyZXR1cm4gK3ZhbHVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFNjYWxlLnByb3RvdHlwZS5nZXRSaWdodFZhbHVlLmNhbGwodGhpcywgdmFsdWUpO1xuXHRcdH0sXG5cblx0XHRoYW5kbGVUaWNrUmFuZ2VPcHRpb25zOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgb3B0cyA9IG1lLm9wdGlvbnM7XG5cdFx0XHR2YXIgdGlja09wdHMgPSBvcHRzLnRpY2tzO1xuXG5cdFx0XHQvLyBJZiB3ZSBhcmUgZm9yY2luZyBpdCB0byBiZWdpbiBhdCAwLCBidXQgMCB3aWxsIGFscmVhZHkgYmUgcmVuZGVyZWQgb24gdGhlIGNoYXJ0LFxuXHRcdFx0Ly8gZG8gbm90aGluZyBzaW5jZSB0aGF0IHdvdWxkIG1ha2UgdGhlIGNoYXJ0IHdlaXJkLiBJZiB0aGUgdXNlciByZWFsbHkgd2FudHMgYSB3ZWlyZCBjaGFydFxuXHRcdFx0Ly8gYXhpcywgdGhleSBjYW4gbWFudWFsbHkgb3ZlcnJpZGUgaXRcblx0XHRcdGlmICh0aWNrT3B0cy5iZWdpbkF0WmVybykge1xuXHRcdFx0XHR2YXIgbWluU2lnbiA9IGhlbHBlcnMuc2lnbihtZS5taW4pO1xuXHRcdFx0XHR2YXIgbWF4U2lnbiA9IGhlbHBlcnMuc2lnbihtZS5tYXgpO1xuXG5cdFx0XHRcdGlmIChtaW5TaWduIDwgMCAmJiBtYXhTaWduIDwgMCkge1xuXHRcdFx0XHRcdC8vIG1vdmUgdGhlIHRvcCB1cCB0byAwXG5cdFx0XHRcdFx0bWUubWF4ID0gMDtcblx0XHRcdFx0fSBlbHNlIGlmIChtaW5TaWduID4gMCAmJiBtYXhTaWduID4gMCkge1xuXHRcdFx0XHRcdC8vIG1vdmUgdGhlIGJvdHRvbSBkb3duIHRvIDBcblx0XHRcdFx0XHRtZS5taW4gPSAwO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHZhciBzZXRNaW4gPSB0aWNrT3B0cy5taW4gIT09IHVuZGVmaW5lZCB8fCB0aWNrT3B0cy5zdWdnZXN0ZWRNaW4gIT09IHVuZGVmaW5lZDtcblx0XHRcdHZhciBzZXRNYXggPSB0aWNrT3B0cy5tYXggIT09IHVuZGVmaW5lZCB8fCB0aWNrT3B0cy5zdWdnZXN0ZWRNYXggIT09IHVuZGVmaW5lZDtcblxuXHRcdFx0aWYgKHRpY2tPcHRzLm1pbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdG1lLm1pbiA9IHRpY2tPcHRzLm1pbjtcblx0XHRcdH0gZWxzZSBpZiAodGlja09wdHMuc3VnZ2VzdGVkTWluICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aWYgKG1lLm1pbiA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdG1lLm1pbiA9IHRpY2tPcHRzLnN1Z2dlc3RlZE1pbjtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtZS5taW4gPSBNYXRoLm1pbihtZS5taW4sIHRpY2tPcHRzLnN1Z2dlc3RlZE1pbik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHRpY2tPcHRzLm1heCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdG1lLm1heCA9IHRpY2tPcHRzLm1heDtcblx0XHRcdH0gZWxzZSBpZiAodGlja09wdHMuc3VnZ2VzdGVkTWF4ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aWYgKG1lLm1heCA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdG1lLm1heCA9IHRpY2tPcHRzLnN1Z2dlc3RlZE1heDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtZS5tYXggPSBNYXRoLm1heChtZS5tYXgsIHRpY2tPcHRzLnN1Z2dlc3RlZE1heCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHNldE1pbiAhPT0gc2V0TWF4KSB7XG5cdFx0XHRcdC8vIFdlIHNldCB0aGUgbWluIG9yIHRoZSBtYXggYnV0IG5vdCBib3RoLlxuXHRcdFx0XHQvLyBTbyBlbnN1cmUgdGhhdCBvdXIgcmFuZ2UgaXMgZ29vZFxuXHRcdFx0XHQvLyBJbnZlcnRlZCBvciAwIGxlbmd0aCByYW5nZSBjYW4gaGFwcGVuIHdoZW5cblx0XHRcdFx0Ly8gdGlja3MubWluIGlzIHNldCwgYW5kIG5vIGRhdGFzZXRzIGFyZSB2aXNpYmxlXG5cdFx0XHRcdGlmIChtZS5taW4gPj0gbWUubWF4KSB7XG5cdFx0XHRcdFx0aWYgKHNldE1pbikge1xuXHRcdFx0XHRcdFx0bWUubWF4ID0gbWUubWluICsgMTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bWUubWluID0gbWUubWF4IC0gMTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKG1lLm1pbiA9PT0gbWUubWF4KSB7XG5cdFx0XHRcdG1lLm1heCsrO1xuXG5cdFx0XHRcdGlmICghdGlja09wdHMuYmVnaW5BdFplcm8pIHtcblx0XHRcdFx0XHRtZS5taW4tLTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Z2V0VGlja0xpbWl0OiBub29wLFxuXHRcdGhhbmRsZURpcmVjdGlvbmFsQ2hhbmdlczogbm9vcCxcblxuXHRcdGJ1aWxkVGlja3M6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBvcHRzID0gbWUub3B0aW9ucztcblx0XHRcdHZhciB0aWNrT3B0cyA9IG9wdHMudGlja3M7XG5cblx0XHRcdC8vIEZpZ3VyZSBvdXQgd2hhdCB0aGUgbWF4IG51bWJlciBvZiB0aWNrcyB3ZSBjYW4gc3VwcG9ydCBpdCBpcyBiYXNlZCBvbiB0aGUgc2l6ZSBvZlxuXHRcdFx0Ly8gdGhlIGF4aXMgYXJlYS4gRm9yIG5vdywgd2Ugc2F5IHRoYXQgdGhlIG1pbmltdW0gdGljayBzcGFjaW5nIGluIHBpeGVscyBtdXN0IGJlIDUwXG5cdFx0XHQvLyBXZSBhbHNvIGxpbWl0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aWNrcyB0byAxMSB3aGljaCBnaXZlcyBhIG5pY2UgMTAgc3F1YXJlcyBvblxuXHRcdFx0Ly8gdGhlIGdyYXBoLiBNYWtlIHN1cmUgd2UgYWx3YXlzIGhhdmUgYXQgbGVhc3QgMiB0aWNrc1xuXHRcdFx0dmFyIG1heFRpY2tzID0gbWUuZ2V0VGlja0xpbWl0KCk7XG5cdFx0XHRtYXhUaWNrcyA9IE1hdGgubWF4KDIsIG1heFRpY2tzKTtcblxuXHRcdFx0dmFyIG51bWVyaWNHZW5lcmF0b3JPcHRpb25zID0ge1xuXHRcdFx0XHRtYXhUaWNrczogbWF4VGlja3MsXG5cdFx0XHRcdG1pbjogdGlja09wdHMubWluLFxuXHRcdFx0XHRtYXg6IHRpY2tPcHRzLm1heCxcblx0XHRcdFx0cHJlY2lzaW9uOiB0aWNrT3B0cy5wcmVjaXNpb24sXG5cdFx0XHRcdHN0ZXBTaXplOiBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KHRpY2tPcHRzLmZpeGVkU3RlcFNpemUsIHRpY2tPcHRzLnN0ZXBTaXplKVxuXHRcdFx0fTtcblx0XHRcdHZhciB0aWNrcyA9IG1lLnRpY2tzID0gZ2VuZXJhdGVUaWNrcyhudW1lcmljR2VuZXJhdG9yT3B0aW9ucywgbWUpO1xuXG5cdFx0XHRtZS5oYW5kbGVEaXJlY3Rpb25hbENoYW5nZXMoKTtcblxuXHRcdFx0Ly8gQXQgdGhpcyBwb2ludCwgd2UgbmVlZCB0byB1cGRhdGUgb3VyIG1heCBhbmQgbWluIGdpdmVuIHRoZSB0aWNrIHZhbHVlcyBzaW5jZSB3ZSBoYXZlIGV4cGFuZGVkIHRoZVxuXHRcdFx0Ly8gcmFuZ2Ugb2YgdGhlIHNjYWxlXG5cdFx0XHRtZS5tYXggPSBoZWxwZXJzLm1heCh0aWNrcyk7XG5cdFx0XHRtZS5taW4gPSBoZWxwZXJzLm1pbih0aWNrcyk7XG5cblx0XHRcdGlmICh0aWNrT3B0cy5yZXZlcnNlKSB7XG5cdFx0XHRcdHRpY2tzLnJldmVyc2UoKTtcblxuXHRcdFx0XHRtZS5zdGFydCA9IG1lLm1heDtcblx0XHRcdFx0bWUuZW5kID0gbWUubWluO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWUuc3RhcnQgPSBtZS5taW47XG5cdFx0XHRcdG1lLmVuZCA9IG1lLm1heDtcblx0XHRcdH1cblx0XHR9LFxuXHRcdGNvbnZlcnRUaWNrc1RvTGFiZWxzOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHRtZS50aWNrc0FzTnVtYmVycyA9IG1lLnRpY2tzLnNsaWNlKCk7XG5cdFx0XHRtZS56ZXJvTGluZUluZGV4ID0gbWUudGlja3MuaW5kZXhPZigwKTtcblxuXHRcdFx0U2NhbGUucHJvdG90eXBlLmNvbnZlcnRUaWNrc1RvTGFiZWxzLmNhbGwobWUpO1xuXHRcdH1cblx0fSk7XG59O1xuXG59LHtcIjMzXCI6MzMsXCI0NlwiOjQ2fV0sNTc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xudmFyIFNjYWxlID0gcmVxdWlyZSgzMyk7XG52YXIgc2NhbGVTZXJ2aWNlID0gcmVxdWlyZSgzNCk7XG52YXIgVGlja3MgPSByZXF1aXJlKDM1KTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHNldCBvZiBsb2dhcml0aG1pYyB0aWNrc1xuICogQHBhcmFtIGdlbmVyYXRpb25PcHRpb25zIHRoZSBvcHRpb25zIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHRpY2tzXG4gKiBAcGFyYW0gZGF0YVJhbmdlIHRoZSByYW5nZSBvZiB0aGUgZGF0YVxuICogQHJldHVybnMge0FycmF5PE51bWJlcj59IGFycmF5IG9mIHRpY2sgdmFsdWVzXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlVGlja3MoZ2VuZXJhdGlvbk9wdGlvbnMsIGRhdGFSYW5nZSkge1xuXHR2YXIgdGlja3MgPSBbXTtcblx0dmFyIHZhbHVlT3JEZWZhdWx0ID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdDtcblxuXHQvLyBGaWd1cmUgb3V0IHdoYXQgdGhlIG1heCBudW1iZXIgb2YgdGlja3Mgd2UgY2FuIHN1cHBvcnQgaXQgaXMgYmFzZWQgb24gdGhlIHNpemUgb2Zcblx0Ly8gdGhlIGF4aXMgYXJlYS4gRm9yIG5vdywgd2Ugc2F5IHRoYXQgdGhlIG1pbmltdW0gdGljayBzcGFjaW5nIGluIHBpeGVscyBtdXN0IGJlIDUwXG5cdC8vIFdlIGFsc28gbGltaXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRpY2tzIHRvIDExIHdoaWNoIGdpdmVzIGEgbmljZSAxMCBzcXVhcmVzIG9uXG5cdC8vIHRoZSBncmFwaFxuXHR2YXIgdGlja1ZhbCA9IHZhbHVlT3JEZWZhdWx0KGdlbmVyYXRpb25PcHRpb25zLm1pbiwgTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoaGVscGVycy5sb2cxMChkYXRhUmFuZ2UubWluKSkpKTtcblxuXHR2YXIgZW5kRXhwID0gTWF0aC5mbG9vcihoZWxwZXJzLmxvZzEwKGRhdGFSYW5nZS5tYXgpKTtcblx0dmFyIGVuZFNpZ25pZmljYW5kID0gTWF0aC5jZWlsKGRhdGFSYW5nZS5tYXggLyBNYXRoLnBvdygxMCwgZW5kRXhwKSk7XG5cdHZhciBleHAsIHNpZ25pZmljYW5kO1xuXG5cdGlmICh0aWNrVmFsID09PSAwKSB7XG5cdFx0ZXhwID0gTWF0aC5mbG9vcihoZWxwZXJzLmxvZzEwKGRhdGFSYW5nZS5taW5Ob3RaZXJvKSk7XG5cdFx0c2lnbmlmaWNhbmQgPSBNYXRoLmZsb29yKGRhdGFSYW5nZS5taW5Ob3RaZXJvIC8gTWF0aC5wb3coMTAsIGV4cCkpO1xuXG5cdFx0dGlja3MucHVzaCh0aWNrVmFsKTtcblx0XHR0aWNrVmFsID0gc2lnbmlmaWNhbmQgKiBNYXRoLnBvdygxMCwgZXhwKTtcblx0fSBlbHNlIHtcblx0XHRleHAgPSBNYXRoLmZsb29yKGhlbHBlcnMubG9nMTAodGlja1ZhbCkpO1xuXHRcdHNpZ25pZmljYW5kID0gTWF0aC5mbG9vcih0aWNrVmFsIC8gTWF0aC5wb3coMTAsIGV4cCkpO1xuXHR9XG5cdHZhciBwcmVjaXNpb24gPSBleHAgPCAwID8gTWF0aC5wb3coMTAsIE1hdGguYWJzKGV4cCkpIDogMTtcblxuXHRkbyB7XG5cdFx0dGlja3MucHVzaCh0aWNrVmFsKTtcblxuXHRcdCsrc2lnbmlmaWNhbmQ7XG5cdFx0aWYgKHNpZ25pZmljYW5kID09PSAxMCkge1xuXHRcdFx0c2lnbmlmaWNhbmQgPSAxO1xuXHRcdFx0KytleHA7XG5cdFx0XHRwcmVjaXNpb24gPSBleHAgPj0gMCA/IDEgOiBwcmVjaXNpb247XG5cdFx0fVxuXG5cdFx0dGlja1ZhbCA9IE1hdGgucm91bmQoc2lnbmlmaWNhbmQgKiBNYXRoLnBvdygxMCwgZXhwKSAqIHByZWNpc2lvbikgLyBwcmVjaXNpb247XG5cdH0gd2hpbGUgKGV4cCA8IGVuZEV4cCB8fCAoZXhwID09PSBlbmRFeHAgJiYgc2lnbmlmaWNhbmQgPCBlbmRTaWduaWZpY2FuZCkpO1xuXG5cdHZhciBsYXN0VGljayA9IHZhbHVlT3JEZWZhdWx0KGdlbmVyYXRpb25PcHRpb25zLm1heCwgdGlja1ZhbCk7XG5cdHRpY2tzLnB1c2gobGFzdFRpY2spO1xuXG5cdHJldHVybiB0aWNrcztcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENoYXJ0KSB7XG5cblx0dmFyIGRlZmF1bHRDb25maWcgPSB7XG5cdFx0cG9zaXRpb246ICdsZWZ0JyxcblxuXHRcdC8vIGxhYmVsIHNldHRpbmdzXG5cdFx0dGlja3M6IHtcblx0XHRcdGNhbGxiYWNrOiBUaWNrcy5mb3JtYXR0ZXJzLmxvZ2FyaXRobWljXG5cdFx0fVxuXHR9O1xuXG5cdHZhciBMb2dhcml0aG1pY1NjYWxlID0gU2NhbGUuZXh0ZW5kKHtcblx0XHRkZXRlcm1pbmVEYXRhTGltaXRzOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgb3B0cyA9IG1lLm9wdGlvbnM7XG5cdFx0XHR2YXIgY2hhcnQgPSBtZS5jaGFydDtcblx0XHRcdHZhciBkYXRhID0gY2hhcnQuZGF0YTtcblx0XHRcdHZhciBkYXRhc2V0cyA9IGRhdGEuZGF0YXNldHM7XG5cdFx0XHR2YXIgaXNIb3Jpem9udGFsID0gbWUuaXNIb3Jpem9udGFsKCk7XG5cdFx0XHRmdW5jdGlvbiBJRE1hdGNoZXMobWV0YSkge1xuXHRcdFx0XHRyZXR1cm4gaXNIb3Jpem9udGFsID8gbWV0YS54QXhpc0lEID09PSBtZS5pZCA6IG1ldGEueUF4aXNJRCA9PT0gbWUuaWQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENhbGN1bGF0ZSBSYW5nZVxuXHRcdFx0bWUubWluID0gbnVsbDtcblx0XHRcdG1lLm1heCA9IG51bGw7XG5cdFx0XHRtZS5taW5Ob3RaZXJvID0gbnVsbDtcblxuXHRcdFx0dmFyIGhhc1N0YWNrcyA9IG9wdHMuc3RhY2tlZDtcblx0XHRcdGlmIChoYXNTdGFja3MgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRoZWxwZXJzLmVhY2goZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0XHRcdGlmIChoYXNTdGFja3MpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR2YXIgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XG5cdFx0XHRcdFx0aWYgKGNoYXJ0LmlzRGF0YXNldFZpc2libGUoZGF0YXNldEluZGV4KSAmJiBJRE1hdGNoZXMobWV0YSkgJiZcblx0XHRcdFx0XHRcdG1ldGEuc3RhY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0aGFzU3RhY2tzID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAob3B0cy5zdGFja2VkIHx8IGhhc1N0YWNrcykge1xuXHRcdFx0XHR2YXIgdmFsdWVzUGVyU3RhY2sgPSB7fTtcblxuXHRcdFx0XHRoZWxwZXJzLmVhY2goZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0XHRcdHZhciBtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcblx0XHRcdFx0XHR2YXIga2V5ID0gW1xuXHRcdFx0XHRcdFx0bWV0YS50eXBlLFxuXHRcdFx0XHRcdFx0Ly8gd2UgaGF2ZSBhIHNlcGFyYXRlIHN0YWNrIGZvciBzdGFjaz11bmRlZmluZWQgZGF0YXNldHMgd2hlbiB0aGUgb3B0cy5zdGFja2VkIGlzIHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0KChvcHRzLnN0YWNrZWQgPT09IHVuZGVmaW5lZCAmJiBtZXRhLnN0YWNrID09PSB1bmRlZmluZWQpID8gZGF0YXNldEluZGV4IDogJycpLFxuXHRcdFx0XHRcdFx0bWV0YS5zdGFja1xuXHRcdFx0XHRcdF0uam9pbignLicpO1xuXG5cdFx0XHRcdFx0aWYgKGNoYXJ0LmlzRGF0YXNldFZpc2libGUoZGF0YXNldEluZGV4KSAmJiBJRE1hdGNoZXMobWV0YSkpIHtcblx0XHRcdFx0XHRcdGlmICh2YWx1ZXNQZXJTdGFja1trZXldID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0dmFsdWVzUGVyU3RhY2tba2V5XSA9IFtdO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRoZWxwZXJzLmVhY2goZGF0YXNldC5kYXRhLCBmdW5jdGlvbihyYXdWYWx1ZSwgaW5kZXgpIHtcblx0XHRcdFx0XHRcdFx0dmFyIHZhbHVlcyA9IHZhbHVlc1BlclN0YWNrW2tleV07XG5cdFx0XHRcdFx0XHRcdHZhciB2YWx1ZSA9ICttZS5nZXRSaWdodFZhbHVlKHJhd1ZhbHVlKTtcblx0XHRcdFx0XHRcdFx0Ly8gaW52YWxpZCwgaGlkZGVuIGFuZCBuZWdhdGl2ZSB2YWx1ZXMgYXJlIGlnbm9yZWRcblx0XHRcdFx0XHRcdFx0aWYgKGlzTmFOKHZhbHVlKSB8fCBtZXRhLmRhdGFbaW5kZXhdLmhpZGRlbiB8fCB2YWx1ZSA8IDApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dmFsdWVzW2luZGV4XSA9IHZhbHVlc1tpbmRleF0gfHwgMDtcblx0XHRcdFx0XHRcdFx0dmFsdWVzW2luZGV4XSArPSB2YWx1ZTtcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aGVscGVycy5lYWNoKHZhbHVlc1BlclN0YWNrLCBmdW5jdGlvbih2YWx1ZXNGb3JUeXBlKSB7XG5cdFx0XHRcdFx0aWYgKHZhbHVlc0ZvclR5cGUubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0dmFyIG1pblZhbCA9IGhlbHBlcnMubWluKHZhbHVlc0ZvclR5cGUpO1xuXHRcdFx0XHRcdFx0dmFyIG1heFZhbCA9IGhlbHBlcnMubWF4KHZhbHVlc0ZvclR5cGUpO1xuXHRcdFx0XHRcdFx0bWUubWluID0gbWUubWluID09PSBudWxsID8gbWluVmFsIDogTWF0aC5taW4obWUubWluLCBtaW5WYWwpO1xuXHRcdFx0XHRcdFx0bWUubWF4ID0gbWUubWF4ID09PSBudWxsID8gbWF4VmFsIDogTWF0aC5tYXgobWUubWF4LCBtYXhWYWwpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGhlbHBlcnMuZWFjaChkYXRhc2V0cywgZnVuY3Rpb24oZGF0YXNldCwgZGF0YXNldEluZGV4KSB7XG5cdFx0XHRcdFx0dmFyIG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpO1xuXHRcdFx0XHRcdGlmIChjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGRhdGFzZXRJbmRleCkgJiYgSURNYXRjaGVzKG1ldGEpKSB7XG5cdFx0XHRcdFx0XHRoZWxwZXJzLmVhY2goZGF0YXNldC5kYXRhLCBmdW5jdGlvbihyYXdWYWx1ZSwgaW5kZXgpIHtcblx0XHRcdFx0XHRcdFx0dmFyIHZhbHVlID0gK21lLmdldFJpZ2h0VmFsdWUocmF3VmFsdWUpO1xuXHRcdFx0XHRcdFx0XHQvLyBpbnZhbGlkLCBoaWRkZW4gYW5kIG5lZ2F0aXZlIHZhbHVlcyBhcmUgaWdub3JlZFxuXHRcdFx0XHRcdFx0XHRpZiAoaXNOYU4odmFsdWUpIHx8IG1ldGEuZGF0YVtpbmRleF0uaGlkZGVuIHx8IHZhbHVlIDwgMCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGlmIChtZS5taW4gPT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0XHRtZS5taW4gPSB2YWx1ZTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICh2YWx1ZSA8IG1lLm1pbikge1xuXHRcdFx0XHRcdFx0XHRcdG1lLm1pbiA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKG1lLm1heCA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0XHRcdG1lLm1heCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHZhbHVlID4gbWUubWF4KSB7XG5cdFx0XHRcdFx0XHRcdFx0bWUubWF4ID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAodmFsdWUgIT09IDAgJiYgKG1lLm1pbk5vdFplcm8gPT09IG51bGwgfHwgdmFsdWUgPCBtZS5taW5Ob3RaZXJvKSkge1xuXHRcdFx0XHRcdFx0XHRcdG1lLm1pbk5vdFplcm8gPSB2YWx1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29tbW9uIGJhc2UgaW1wbGVtZW50YXRpb24gdG8gaGFuZGxlIHRpY2tzLm1pbiwgdGlja3MubWF4XG5cdFx0XHR0aGlzLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKTtcblx0XHR9LFxuXHRcdGhhbmRsZVRpY2tSYW5nZU9wdGlvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBvcHRzID0gbWUub3B0aW9ucztcblx0XHRcdHZhciB0aWNrT3B0cyA9IG9wdHMudGlja3M7XG5cdFx0XHR2YXIgdmFsdWVPckRlZmF1bHQgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0O1xuXHRcdFx0dmFyIERFRkFVTFRfTUlOID0gMTtcblx0XHRcdHZhciBERUZBVUxUX01BWCA9IDEwO1xuXG5cdFx0XHRtZS5taW4gPSB2YWx1ZU9yRGVmYXVsdCh0aWNrT3B0cy5taW4sIG1lLm1pbik7XG5cdFx0XHRtZS5tYXggPSB2YWx1ZU9yRGVmYXVsdCh0aWNrT3B0cy5tYXgsIG1lLm1heCk7XG5cblx0XHRcdGlmIChtZS5taW4gPT09IG1lLm1heCkge1xuXHRcdFx0XHRpZiAobWUubWluICE9PSAwICYmIG1lLm1pbiAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdG1lLm1pbiA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKGhlbHBlcnMubG9nMTAobWUubWluKSkgLSAxKTtcblx0XHRcdFx0XHRtZS5tYXggPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihoZWxwZXJzLmxvZzEwKG1lLm1heCkpICsgMSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bWUubWluID0gREVGQVVMVF9NSU47XG5cdFx0XHRcdFx0bWUubWF4ID0gREVGQVVMVF9NQVg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChtZS5taW4gPT09IG51bGwpIHtcblx0XHRcdFx0bWUubWluID0gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoaGVscGVycy5sb2cxMChtZS5tYXgpKSAtIDEpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1lLm1heCA9PT0gbnVsbCkge1xuXHRcdFx0XHRtZS5tYXggPSBtZS5taW4gIT09IDBcblx0XHRcdFx0XHQ/IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKGhlbHBlcnMubG9nMTAobWUubWluKSkgKyAxKVxuXHRcdFx0XHRcdDogREVGQVVMVF9NQVg7XG5cdFx0XHR9XG5cdFx0XHRpZiAobWUubWluTm90WmVybyA9PT0gbnVsbCkge1xuXHRcdFx0XHRpZiAobWUubWluID4gMCkge1xuXHRcdFx0XHRcdG1lLm1pbk5vdFplcm8gPSBtZS5taW47XG5cdFx0XHRcdH0gZWxzZSBpZiAobWUubWF4IDwgMSkge1xuXHRcdFx0XHRcdG1lLm1pbk5vdFplcm8gPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihoZWxwZXJzLmxvZzEwKG1lLm1heCkpKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRtZS5taW5Ob3RaZXJvID0gREVGQVVMVF9NSU47XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdGJ1aWxkVGlja3M6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBvcHRzID0gbWUub3B0aW9ucztcblx0XHRcdHZhciB0aWNrT3B0cyA9IG9wdHMudGlja3M7XG5cdFx0XHR2YXIgcmV2ZXJzZSA9ICFtZS5pc0hvcml6b250YWwoKTtcblxuXHRcdFx0dmFyIGdlbmVyYXRpb25PcHRpb25zID0ge1xuXHRcdFx0XHRtaW46IHRpY2tPcHRzLm1pbixcblx0XHRcdFx0bWF4OiB0aWNrT3B0cy5tYXhcblx0XHRcdH07XG5cdFx0XHR2YXIgdGlja3MgPSBtZS50aWNrcyA9IGdlbmVyYXRlVGlja3MoZ2VuZXJhdGlvbk9wdGlvbnMsIG1lKTtcblxuXHRcdFx0Ly8gQXQgdGhpcyBwb2ludCwgd2UgbmVlZCB0byB1cGRhdGUgb3VyIG1heCBhbmQgbWluIGdpdmVuIHRoZSB0aWNrIHZhbHVlcyBzaW5jZSB3ZSBoYXZlIGV4cGFuZGVkIHRoZVxuXHRcdFx0Ly8gcmFuZ2Ugb2YgdGhlIHNjYWxlXG5cdFx0XHRtZS5tYXggPSBoZWxwZXJzLm1heCh0aWNrcyk7XG5cdFx0XHRtZS5taW4gPSBoZWxwZXJzLm1pbih0aWNrcyk7XG5cblx0XHRcdGlmICh0aWNrT3B0cy5yZXZlcnNlKSB7XG5cdFx0XHRcdHJldmVyc2UgPSAhcmV2ZXJzZTtcblx0XHRcdFx0bWUuc3RhcnQgPSBtZS5tYXg7XG5cdFx0XHRcdG1lLmVuZCA9IG1lLm1pbjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1lLnN0YXJ0ID0gbWUubWluO1xuXHRcdFx0XHRtZS5lbmQgPSBtZS5tYXg7XG5cdFx0XHR9XG5cdFx0XHRpZiAocmV2ZXJzZSkge1xuXHRcdFx0XHR0aWNrcy5yZXZlcnNlKCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRjb252ZXJ0VGlja3NUb0xhYmVsczogZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLnRpY2tWYWx1ZXMgPSB0aGlzLnRpY2tzLnNsaWNlKCk7XG5cblx0XHRcdFNjYWxlLnByb3RvdHlwZS5jb252ZXJ0VGlja3NUb0xhYmVscy5jYWxsKHRoaXMpO1xuXHRcdH0sXG5cdFx0Ly8gR2V0IHRoZSBjb3JyZWN0IHRvb2x0aXAgbGFiZWxcblx0XHRnZXRMYWJlbEZvckluZGV4OiBmdW5jdGlvbihpbmRleCwgZGF0YXNldEluZGV4KSB7XG5cdFx0XHRyZXR1cm4gK3RoaXMuZ2V0UmlnaHRWYWx1ZSh0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHNbZGF0YXNldEluZGV4XS5kYXRhW2luZGV4XSk7XG5cdFx0fSxcblx0XHRnZXRQaXhlbEZvclRpY2s6IGZ1bmN0aW9uKGluZGV4KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRQaXhlbEZvclZhbHVlKHRoaXMudGlja1ZhbHVlc1tpbmRleF0pO1xuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IHRpY2suXG5cdFx0ICogQHBhcmFtIHtOdW1iZXJ9IHZhbHVlIC0gVGhlIG1pbmltdW0gbm90IHplcm8gdmFsdWUuXG5cdFx0ICogQHJldHVybiB7TnVtYmVyfSBUaGUgZmlyc3QgdGljayB2YWx1ZS5cblx0XHQgKiBAcHJpdmF0ZVxuXHRcdCAqL1xuXHRcdF9nZXRGaXJzdFRpY2tWYWx1ZTogZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdHZhciBleHAgPSBNYXRoLmZsb29yKGhlbHBlcnMubG9nMTAodmFsdWUpKTtcblx0XHRcdHZhciBzaWduaWZpY2FuZCA9IE1hdGguZmxvb3IodmFsdWUgLyBNYXRoLnBvdygxMCwgZXhwKSk7XG5cblx0XHRcdHJldHVybiBzaWduaWZpY2FuZCAqIE1hdGgucG93KDEwLCBleHApO1xuXHRcdH0sXG5cdFx0Z2V0UGl4ZWxGb3JWYWx1ZTogZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgcmV2ZXJzZSA9IG1lLm9wdGlvbnMudGlja3MucmV2ZXJzZTtcblx0XHRcdHZhciBsb2cxMCA9IGhlbHBlcnMubG9nMTA7XG5cdFx0XHR2YXIgZmlyc3RUaWNrVmFsdWUgPSBtZS5fZ2V0Rmlyc3RUaWNrVmFsdWUobWUubWluTm90WmVybyk7XG5cdFx0XHR2YXIgb2Zmc2V0ID0gMDtcblx0XHRcdHZhciBpbm5lckRpbWVuc2lvbiwgcGl4ZWwsIHN0YXJ0LCBlbmQsIHNpZ247XG5cblx0XHRcdHZhbHVlID0gK21lLmdldFJpZ2h0VmFsdWUodmFsdWUpO1xuXHRcdFx0aWYgKHJldmVyc2UpIHtcblx0XHRcdFx0c3RhcnQgPSBtZS5lbmQ7XG5cdFx0XHRcdGVuZCA9IG1lLnN0YXJ0O1xuXHRcdFx0XHRzaWduID0gLTE7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzdGFydCA9IG1lLnN0YXJ0O1xuXHRcdFx0XHRlbmQgPSBtZS5lbmQ7XG5cdFx0XHRcdHNpZ24gPSAxO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1lLmlzSG9yaXpvbnRhbCgpKSB7XG5cdFx0XHRcdGlubmVyRGltZW5zaW9uID0gbWUud2lkdGg7XG5cdFx0XHRcdHBpeGVsID0gcmV2ZXJzZSA/IG1lLnJpZ2h0IDogbWUubGVmdDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlubmVyRGltZW5zaW9uID0gbWUuaGVpZ2h0O1xuXHRcdFx0XHRzaWduICo9IC0xOyAvLyBpbnZlcnQsIHNpbmNlIHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgY2FudmFzIGlzIGF0IHBpeGVsICgwLCAwKVxuXHRcdFx0XHRwaXhlbCA9IHJldmVyc2UgPyBtZS50b3AgOiBtZS5ib3R0b207XG5cdFx0XHR9XG5cdFx0XHRpZiAodmFsdWUgIT09IHN0YXJ0KSB7XG5cdFx0XHRcdGlmIChzdGFydCA9PT0gMCkgeyAvLyBpbmNsdWRlIHplcm8gdGlja1xuXHRcdFx0XHRcdG9mZnNldCA9IGhlbHBlcnMuZ2V0VmFsdWVPckRlZmF1bHQoXG5cdFx0XHRcdFx0XHRtZS5vcHRpb25zLnRpY2tzLmZvbnRTaXplLFxuXHRcdFx0XHRcdFx0Q2hhcnQuZGVmYXVsdHMuZ2xvYmFsLmRlZmF1bHRGb250U2l6ZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0aW5uZXJEaW1lbnNpb24gLT0gb2Zmc2V0O1xuXHRcdFx0XHRcdHN0YXJ0ID0gZmlyc3RUaWNrVmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHZhbHVlICE9PSAwKSB7XG5cdFx0XHRcdFx0b2Zmc2V0ICs9IGlubmVyRGltZW5zaW9uIC8gKGxvZzEwKGVuZCkgLSBsb2cxMChzdGFydCkpICogKGxvZzEwKHZhbHVlKSAtIGxvZzEwKHN0YXJ0KSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cGl4ZWwgKz0gc2lnbiAqIG9mZnNldDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBwaXhlbDtcblx0XHR9LFxuXHRcdGdldFZhbHVlRm9yUGl4ZWw6IGZ1bmN0aW9uKHBpeGVsKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIHJldmVyc2UgPSBtZS5vcHRpb25zLnRpY2tzLnJldmVyc2U7XG5cdFx0XHR2YXIgbG9nMTAgPSBoZWxwZXJzLmxvZzEwO1xuXHRcdFx0dmFyIGZpcnN0VGlja1ZhbHVlID0gbWUuX2dldEZpcnN0VGlja1ZhbHVlKG1lLm1pbk5vdFplcm8pO1xuXHRcdFx0dmFyIGlubmVyRGltZW5zaW9uLCBzdGFydCwgZW5kLCB2YWx1ZTtcblxuXHRcdFx0aWYgKHJldmVyc2UpIHtcblx0XHRcdFx0c3RhcnQgPSBtZS5lbmQ7XG5cdFx0XHRcdGVuZCA9IG1lLnN0YXJ0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c3RhcnQgPSBtZS5zdGFydDtcblx0XHRcdFx0ZW5kID0gbWUuZW5kO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1lLmlzSG9yaXpvbnRhbCgpKSB7XG5cdFx0XHRcdGlubmVyRGltZW5zaW9uID0gbWUud2lkdGg7XG5cdFx0XHRcdHZhbHVlID0gcmV2ZXJzZSA/IG1lLnJpZ2h0IC0gcGl4ZWwgOiBwaXhlbCAtIG1lLmxlZnQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpbm5lckRpbWVuc2lvbiA9IG1lLmhlaWdodDtcblx0XHRcdFx0dmFsdWUgPSByZXZlcnNlID8gcGl4ZWwgLSBtZS50b3AgOiBtZS5ib3R0b20gLSBwaXhlbDtcblx0XHRcdH1cblx0XHRcdGlmICh2YWx1ZSAhPT0gc3RhcnQpIHtcblx0XHRcdFx0aWYgKHN0YXJ0ID09PSAwKSB7IC8vIGluY2x1ZGUgemVybyB0aWNrXG5cdFx0XHRcdFx0dmFyIG9mZnNldCA9IGhlbHBlcnMuZ2V0VmFsdWVPckRlZmF1bHQoXG5cdFx0XHRcdFx0XHRtZS5vcHRpb25zLnRpY2tzLmZvbnRTaXplLFxuXHRcdFx0XHRcdFx0Q2hhcnQuZGVmYXVsdHMuZ2xvYmFsLmRlZmF1bHRGb250U2l6ZVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0dmFsdWUgLT0gb2Zmc2V0O1xuXHRcdFx0XHRcdGlubmVyRGltZW5zaW9uIC09IG9mZnNldDtcblx0XHRcdFx0XHRzdGFydCA9IGZpcnN0VGlja1ZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZhbHVlICo9IGxvZzEwKGVuZCkgLSBsb2cxMChzdGFydCk7XG5cdFx0XHRcdHZhbHVlIC89IGlubmVyRGltZW5zaW9uO1xuXHRcdFx0XHR2YWx1ZSA9IE1hdGgucG93KDEwLCBsb2cxMChzdGFydCkgKyB2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXHR9KTtcblxuXHRzY2FsZVNlcnZpY2UucmVnaXN0ZXJTY2FsZVR5cGUoJ2xvZ2FyaXRobWljJywgTG9nYXJpdGhtaWNTY2FsZSwgZGVmYXVsdENvbmZpZyk7XG59O1xuXG59LHtcIjMzXCI6MzMsXCIzNFwiOjM0LFwiMzVcIjozNSxcIjQ2XCI6NDZ9XSw1ODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4ndXNlIHN0cmljdCc7XG5cbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcbnZhciBzY2FsZVNlcnZpY2UgPSByZXF1aXJlKDM0KTtcbnZhciBUaWNrcyA9IHJlcXVpcmUoMzUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENoYXJ0KSB7XG5cblx0dmFyIGdsb2JhbERlZmF1bHRzID0gZGVmYXVsdHMuZ2xvYmFsO1xuXG5cdHZhciBkZWZhdWx0Q29uZmlnID0ge1xuXHRcdGRpc3BsYXk6IHRydWUsXG5cblx0XHQvLyBCb29sZWFuIC0gV2hldGhlciB0byBhbmltYXRlIHNjYWxpbmcgdGhlIGNoYXJ0IGZyb20gdGhlIGNlbnRyZVxuXHRcdGFuaW1hdGU6IHRydWUsXG5cdFx0cG9zaXRpb246ICdjaGFydEFyZWEnLFxuXG5cdFx0YW5nbGVMaW5lczoge1xuXHRcdFx0ZGlzcGxheTogdHJ1ZSxcblx0XHRcdGNvbG9yOiAncmdiYSgwLCAwLCAwLCAwLjEpJyxcblx0XHRcdGxpbmVXaWR0aDogMVxuXHRcdH0sXG5cblx0XHRncmlkTGluZXM6IHtcblx0XHRcdGNpcmN1bGFyOiBmYWxzZVxuXHRcdH0sXG5cblx0XHQvLyBsYWJlbCBzZXR0aW5nc1xuXHRcdHRpY2tzOiB7XG5cdFx0XHQvLyBCb29sZWFuIC0gU2hvdyBhIGJhY2tkcm9wIHRvIHRoZSBzY2FsZSBsYWJlbFxuXHRcdFx0c2hvd0xhYmVsQmFja2Ryb3A6IHRydWUsXG5cblx0XHRcdC8vIFN0cmluZyAtIFRoZSBjb2xvdXIgb2YgdGhlIGxhYmVsIGJhY2tkcm9wXG5cdFx0XHRiYWNrZHJvcENvbG9yOiAncmdiYSgyNTUsMjU1LDI1NSwwLjc1KScsXG5cblx0XHRcdC8vIE51bWJlciAtIFRoZSBiYWNrZHJvcCBwYWRkaW5nIGFib3ZlICYgYmVsb3cgdGhlIGxhYmVsIGluIHBpeGVsc1xuXHRcdFx0YmFja2Ryb3BQYWRkaW5nWTogMixcblxuXHRcdFx0Ly8gTnVtYmVyIC0gVGhlIGJhY2tkcm9wIHBhZGRpbmcgdG8gdGhlIHNpZGUgb2YgdGhlIGxhYmVsIGluIHBpeGVsc1xuXHRcdFx0YmFja2Ryb3BQYWRkaW5nWDogMixcblxuXHRcdFx0Y2FsbGJhY2s6IFRpY2tzLmZvcm1hdHRlcnMubGluZWFyXG5cdFx0fSxcblxuXHRcdHBvaW50TGFiZWxzOiB7XG5cdFx0XHQvLyBCb29sZWFuIC0gaWYgdHJ1ZSwgc2hvdyBwb2ludCBsYWJlbHNcblx0XHRcdGRpc3BsYXk6IHRydWUsXG5cblx0XHRcdC8vIE51bWJlciAtIFBvaW50IGxhYmVsIGZvbnQgc2l6ZSBpbiBwaXhlbHNcblx0XHRcdGZvbnRTaXplOiAxMCxcblxuXHRcdFx0Ly8gRnVuY3Rpb24gLSBVc2VkIHRvIGNvbnZlcnQgcG9pbnQgbGFiZWxzXG5cdFx0XHRjYWxsYmFjazogZnVuY3Rpb24obGFiZWwpIHtcblx0XHRcdFx0cmV0dXJuIGxhYmVsO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHRmdW5jdGlvbiBnZXRWYWx1ZUNvdW50KHNjYWxlKSB7XG5cdFx0dmFyIG9wdHMgPSBzY2FsZS5vcHRpb25zO1xuXHRcdHJldHVybiBvcHRzLmFuZ2xlTGluZXMuZGlzcGxheSB8fCBvcHRzLnBvaW50TGFiZWxzLmRpc3BsYXkgPyBzY2FsZS5jaGFydC5kYXRhLmxhYmVscy5sZW5ndGggOiAwO1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0UG9pbnRMYWJlbEZvbnRPcHRpb25zKHNjYWxlKSB7XG5cdFx0dmFyIHBvaW50TGFiZWxPcHRpb25zID0gc2NhbGUub3B0aW9ucy5wb2ludExhYmVscztcblx0XHR2YXIgZm9udFNpemUgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KHBvaW50TGFiZWxPcHRpb25zLmZvbnRTaXplLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFNpemUpO1xuXHRcdHZhciBmb250U3R5bGUgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KHBvaW50TGFiZWxPcHRpb25zLmZvbnRTdHlsZSwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRTdHlsZSk7XG5cdFx0dmFyIGZvbnRGYW1pbHkgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KHBvaW50TGFiZWxPcHRpb25zLmZvbnRGYW1pbHksIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250RmFtaWx5KTtcblx0XHR2YXIgZm9udCA9IGhlbHBlcnMuZm9udFN0cmluZyhmb250U2l6ZSwgZm9udFN0eWxlLCBmb250RmFtaWx5KTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRzaXplOiBmb250U2l6ZSxcblx0XHRcdHN0eWxlOiBmb250U3R5bGUsXG5cdFx0XHRmYW1pbHk6IGZvbnRGYW1pbHksXG5cdFx0XHRmb250OiBmb250XG5cdFx0fTtcblx0fVxuXG5cdGZ1bmN0aW9uIG1lYXN1cmVMYWJlbFNpemUoY3R4LCBmb250U2l6ZSwgbGFiZWwpIHtcblx0XHRpZiAoaGVscGVycy5pc0FycmF5KGxhYmVsKSkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dzogaGVscGVycy5sb25nZXN0VGV4dChjdHgsIGN0eC5mb250LCBsYWJlbCksXG5cdFx0XHRcdGg6IChsYWJlbC5sZW5ndGggKiBmb250U2l6ZSkgKyAoKGxhYmVsLmxlbmd0aCAtIDEpICogMS41ICogZm9udFNpemUpXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHR3OiBjdHgubWVhc3VyZVRleHQobGFiZWwpLndpZHRoLFxuXHRcdFx0aDogZm9udFNpemVcblx0XHR9O1xuXHR9XG5cblx0ZnVuY3Rpb24gZGV0ZXJtaW5lTGltaXRzKGFuZ2xlLCBwb3MsIHNpemUsIG1pbiwgbWF4KSB7XG5cdFx0aWYgKGFuZ2xlID09PSBtaW4gfHwgYW5nbGUgPT09IG1heCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0c3RhcnQ6IHBvcyAtIChzaXplIC8gMiksXG5cdFx0XHRcdGVuZDogcG9zICsgKHNpemUgLyAyKVxuXHRcdFx0fTtcblx0XHR9IGVsc2UgaWYgKGFuZ2xlIDwgbWluIHx8IGFuZ2xlID4gbWF4KSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzdGFydDogcG9zIC0gc2l6ZSAtIDUsXG5cdFx0XHRcdGVuZDogcG9zXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRzdGFydDogcG9zLFxuXHRcdFx0ZW5kOiBwb3MgKyBzaXplICsgNVxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogSGVscGVyIGZ1bmN0aW9uIHRvIGZpdCBhIHJhZGlhbCBsaW5lYXIgc2NhbGUgd2l0aCBwb2ludCBsYWJlbHNcblx0ICovXG5cdGZ1bmN0aW9uIGZpdFdpdGhQb2ludExhYmVscyhzY2FsZSkge1xuXHRcdC8qXG5cdFx0ICogUmlnaHQsIHRoaXMgaXMgcmVhbGx5IGNvbmZ1c2luZyBhbmQgdGhlcmUgaXMgYSBsb3Qgb2YgbWF0aHMgZ29pbmcgb24gaGVyZVxuXHRcdCAqIFRoZSBnaXN0IG9mIHRoZSBwcm9ibGVtIGlzIGhlcmU6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL25ubmljay82OTZjYzljNTVmNGIwYmViOGZlOVxuXHRcdCAqXG5cdFx0ICogUmVhY3Rpb246IGh0dHBzOi8vZGwuZHJvcGJveHVzZXJjb250ZW50LmNvbS91LzM0NjAxMzYzL3Rvb211Y2hzY2llbmNlLmdpZlxuXHRcdCAqXG5cdFx0ICogU29sdXRpb246XG5cdFx0ICpcblx0XHQgKiBXZSBhc3N1bWUgdGhlIHJhZGl1cyBvZiB0aGUgcG9seWdvbiBpcyBoYWxmIHRoZSBzaXplIG9mIHRoZSBjYW52YXMgYXQgZmlyc3Rcblx0XHQgKiBhdCBlYWNoIGluZGV4IHdlIGNoZWNrIGlmIHRoZSB0ZXh0IG92ZXJsYXBzLlxuXHRcdCAqXG5cdFx0ICogV2hlcmUgaXQgZG9lcywgd2Ugc3RvcmUgdGhhdCBhbmdsZSBhbmQgdGhhdCBpbmRleC5cblx0XHQgKlxuXHRcdCAqIEFmdGVyIGZpbmRpbmcgdGhlIGxhcmdlc3QgaW5kZXggYW5kIGFuZ2xlIHdlIGNhbGN1bGF0ZSBob3cgbXVjaCB3ZSBuZWVkIHRvIHJlbW92ZVxuXHRcdCAqIGZyb20gdGhlIHNoYXBlIHJhZGl1cyB0byBtb3ZlIHRoZSBwb2ludCBpbndhcmRzIGJ5IHRoYXQgeC5cblx0XHQgKlxuXHRcdCAqIFdlIGF2ZXJhZ2UgdGhlIGxlZnQgYW5kIHJpZ2h0IGRpc3RhbmNlcyB0byBnZXQgdGhlIG1heGltdW0gc2hhcGUgcmFkaXVzIHRoYXQgY2FuIGZpdCBpbiB0aGUgYm94XG5cdFx0ICogYWxvbmcgd2l0aCBsYWJlbHMuXG5cdFx0ICpcblx0XHQgKiBPbmNlIHdlIGhhdmUgdGhhdCwgd2UgY2FuIGZpbmQgdGhlIGNlbnRyZSBwb2ludCBmb3IgdGhlIGNoYXJ0LCBieSB0YWtpbmcgdGhlIHggdGV4dCBwcm90cnVzaW9uXG5cdFx0ICogb24gZWFjaCBzaWRlLCByZW1vdmluZyB0aGF0IGZyb20gdGhlIHNpemUsIGhhbHZpbmcgaXQgYW5kIGFkZGluZyB0aGUgbGVmdCB4IHByb3RydXNpb24gd2lkdGguXG5cdFx0ICpcblx0XHQgKiBUaGlzIHdpbGwgbWVhbiB3ZSBoYXZlIGEgc2hhcGUgZml0dGVkIHRvIHRoZSBjYW52YXMsIGFzIGxhcmdlIGFzIGl0IGNhbiBiZSB3aXRoIHRoZSBsYWJlbHNcblx0XHQgKiBhbmQgcG9zaXRpb24gaXQgaW4gdGhlIG1vc3Qgc3BhY2UgZWZmaWNpZW50IG1hbm5lclxuXHRcdCAqXG5cdFx0ICogaHR0cHM6Ly9kbC5kcm9wYm94dXNlcmNvbnRlbnQuY29tL3UvMzQ2MDEzNjMveWVhaHNjaWVuY2UuZ2lmXG5cdFx0ICovXG5cblx0XHR2YXIgcGxGb250ID0gZ2V0UG9pbnRMYWJlbEZvbnRPcHRpb25zKHNjYWxlKTtcblxuXHRcdC8vIEdldCBtYXhpbXVtIHJhZGl1cyBvZiB0aGUgcG9seWdvbi4gRWl0aGVyIGhhbGYgdGhlIGhlaWdodCAobWludXMgdGhlIHRleHQgd2lkdGgpIG9yIGhhbGYgdGhlIHdpZHRoLlxuXHRcdC8vIFVzZSB0aGlzIHRvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0ICsgY2hhbmdlLiAtIE1ha2Ugc3VyZSBML1IgcHJvdHJ1c2lvbiBpcyBhdCBsZWFzdCAwIHRvIHN0b3AgaXNzdWVzIHdpdGggY2VudHJlIHBvaW50c1xuXHRcdHZhciBsYXJnZXN0UG9zc2libGVSYWRpdXMgPSBNYXRoLm1pbihzY2FsZS5oZWlnaHQgLyAyLCBzY2FsZS53aWR0aCAvIDIpO1xuXHRcdHZhciBmdXJ0aGVzdExpbWl0cyA9IHtcblx0XHRcdHI6IHNjYWxlLndpZHRoLFxuXHRcdFx0bDogMCxcblx0XHRcdHQ6IHNjYWxlLmhlaWdodCxcblx0XHRcdGI6IDBcblx0XHR9O1xuXHRcdHZhciBmdXJ0aGVzdEFuZ2xlcyA9IHt9O1xuXHRcdHZhciBpLCB0ZXh0U2l6ZSwgcG9pbnRQb3NpdGlvbjtcblxuXHRcdHNjYWxlLmN0eC5mb250ID0gcGxGb250LmZvbnQ7XG5cdFx0c2NhbGUuX3BvaW50TGFiZWxTaXplcyA9IFtdO1xuXG5cdFx0dmFyIHZhbHVlQ291bnQgPSBnZXRWYWx1ZUNvdW50KHNjYWxlKTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgdmFsdWVDb3VudDsgaSsrKSB7XG5cdFx0XHRwb2ludFBvc2l0aW9uID0gc2NhbGUuZ2V0UG9pbnRQb3NpdGlvbihpLCBsYXJnZXN0UG9zc2libGVSYWRpdXMpO1xuXHRcdFx0dGV4dFNpemUgPSBtZWFzdXJlTGFiZWxTaXplKHNjYWxlLmN0eCwgcGxGb250LnNpemUsIHNjYWxlLnBvaW50TGFiZWxzW2ldIHx8ICcnKTtcblx0XHRcdHNjYWxlLl9wb2ludExhYmVsU2l6ZXNbaV0gPSB0ZXh0U2l6ZTtcblxuXHRcdFx0Ly8gQWRkIHF1YXJ0ZXIgY2lyY2xlIHRvIG1ha2UgZGVncmVlIDAgbWVhbiB0b3Agb2YgY2lyY2xlXG5cdFx0XHR2YXIgYW5nbGVSYWRpYW5zID0gc2NhbGUuZ2V0SW5kZXhBbmdsZShpKTtcblx0XHRcdHZhciBhbmdsZSA9IGhlbHBlcnMudG9EZWdyZWVzKGFuZ2xlUmFkaWFucykgJSAzNjA7XG5cdFx0XHR2YXIgaExpbWl0cyA9IGRldGVybWluZUxpbWl0cyhhbmdsZSwgcG9pbnRQb3NpdGlvbi54LCB0ZXh0U2l6ZS53LCAwLCAxODApO1xuXHRcdFx0dmFyIHZMaW1pdHMgPSBkZXRlcm1pbmVMaW1pdHMoYW5nbGUsIHBvaW50UG9zaXRpb24ueSwgdGV4dFNpemUuaCwgOTAsIDI3MCk7XG5cblx0XHRcdGlmIChoTGltaXRzLnN0YXJ0IDwgZnVydGhlc3RMaW1pdHMubCkge1xuXHRcdFx0XHRmdXJ0aGVzdExpbWl0cy5sID0gaExpbWl0cy5zdGFydDtcblx0XHRcdFx0ZnVydGhlc3RBbmdsZXMubCA9IGFuZ2xlUmFkaWFucztcblx0XHRcdH1cblxuXHRcdFx0aWYgKGhMaW1pdHMuZW5kID4gZnVydGhlc3RMaW1pdHMucikge1xuXHRcdFx0XHRmdXJ0aGVzdExpbWl0cy5yID0gaExpbWl0cy5lbmQ7XG5cdFx0XHRcdGZ1cnRoZXN0QW5nbGVzLnIgPSBhbmdsZVJhZGlhbnM7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh2TGltaXRzLnN0YXJ0IDwgZnVydGhlc3RMaW1pdHMudCkge1xuXHRcdFx0XHRmdXJ0aGVzdExpbWl0cy50ID0gdkxpbWl0cy5zdGFydDtcblx0XHRcdFx0ZnVydGhlc3RBbmdsZXMudCA9IGFuZ2xlUmFkaWFucztcblx0XHRcdH1cblxuXHRcdFx0aWYgKHZMaW1pdHMuZW5kID4gZnVydGhlc3RMaW1pdHMuYikge1xuXHRcdFx0XHRmdXJ0aGVzdExpbWl0cy5iID0gdkxpbWl0cy5lbmQ7XG5cdFx0XHRcdGZ1cnRoZXN0QW5nbGVzLmIgPSBhbmdsZVJhZGlhbnM7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0c2NhbGUuc2V0UmVkdWN0aW9ucyhsYXJnZXN0UG9zc2libGVSYWRpdXMsIGZ1cnRoZXN0TGltaXRzLCBmdXJ0aGVzdEFuZ2xlcyk7XG5cdH1cblxuXHQvKipcblx0ICogSGVscGVyIGZ1bmN0aW9uIHRvIGZpdCBhIHJhZGlhbCBsaW5lYXIgc2NhbGUgd2l0aCBubyBwb2ludCBsYWJlbHNcblx0ICovXG5cdGZ1bmN0aW9uIGZpdChzY2FsZSkge1xuXHRcdHZhciBsYXJnZXN0UG9zc2libGVSYWRpdXMgPSBNYXRoLm1pbihzY2FsZS5oZWlnaHQgLyAyLCBzY2FsZS53aWR0aCAvIDIpO1xuXHRcdHNjYWxlLmRyYXdpbmdBcmVhID0gTWF0aC5yb3VuZChsYXJnZXN0UG9zc2libGVSYWRpdXMpO1xuXHRcdHNjYWxlLnNldENlbnRlclBvaW50KDAsIDAsIDAsIDApO1xuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0VGV4dEFsaWduRm9yQW5nbGUoYW5nbGUpIHtcblx0XHRpZiAoYW5nbGUgPT09IDAgfHwgYW5nbGUgPT09IDE4MCkge1xuXHRcdFx0cmV0dXJuICdjZW50ZXInO1xuXHRcdH0gZWxzZSBpZiAoYW5nbGUgPCAxODApIHtcblx0XHRcdHJldHVybiAnbGVmdCc7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICdyaWdodCc7XG5cdH1cblxuXHRmdW5jdGlvbiBmaWxsVGV4dChjdHgsIHRleHQsIHBvc2l0aW9uLCBmb250U2l6ZSkge1xuXHRcdGlmIChoZWxwZXJzLmlzQXJyYXkodGV4dCkpIHtcblx0XHRcdHZhciB5ID0gcG9zaXRpb24ueTtcblx0XHRcdHZhciBzcGFjaW5nID0gMS41ICogZm9udFNpemU7XG5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7ICsraSkge1xuXHRcdFx0XHRjdHguZmlsbFRleHQodGV4dFtpXSwgcG9zaXRpb24ueCwgeSk7XG5cdFx0XHRcdHkgKz0gc3BhY2luZztcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3R4LmZpbGxUZXh0KHRleHQsIHBvc2l0aW9uLngsIHBvc2l0aW9uLnkpO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGFkanVzdFBvaW50UG9zaXRpb25Gb3JMYWJlbEhlaWdodChhbmdsZSwgdGV4dFNpemUsIHBvc2l0aW9uKSB7XG5cdFx0aWYgKGFuZ2xlID09PSA5MCB8fCBhbmdsZSA9PT0gMjcwKSB7XG5cdFx0XHRwb3NpdGlvbi55IC09ICh0ZXh0U2l6ZS5oIC8gMik7XG5cdFx0fSBlbHNlIGlmIChhbmdsZSA+IDI3MCB8fCBhbmdsZSA8IDkwKSB7XG5cdFx0XHRwb3NpdGlvbi55IC09IHRleHRTaXplLmg7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gZHJhd1BvaW50TGFiZWxzKHNjYWxlKSB7XG5cdFx0dmFyIGN0eCA9IHNjYWxlLmN0eDtcblx0XHR2YXIgb3B0cyA9IHNjYWxlLm9wdGlvbnM7XG5cdFx0dmFyIGFuZ2xlTGluZU9wdHMgPSBvcHRzLmFuZ2xlTGluZXM7XG5cdFx0dmFyIHBvaW50TGFiZWxPcHRzID0gb3B0cy5wb2ludExhYmVscztcblxuXHRcdGN0eC5saW5lV2lkdGggPSBhbmdsZUxpbmVPcHRzLmxpbmVXaWR0aDtcblx0XHRjdHguc3Ryb2tlU3R5bGUgPSBhbmdsZUxpbmVPcHRzLmNvbG9yO1xuXG5cdFx0dmFyIG91dGVyRGlzdGFuY2UgPSBzY2FsZS5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZShvcHRzLnRpY2tzLnJldmVyc2UgPyBzY2FsZS5taW4gOiBzY2FsZS5tYXgpO1xuXG5cdFx0Ly8gUG9pbnQgTGFiZWwgRm9udFxuXHRcdHZhciBwbEZvbnQgPSBnZXRQb2ludExhYmVsRm9udE9wdGlvbnMoc2NhbGUpO1xuXG5cdFx0Y3R4LnRleHRCYXNlbGluZSA9ICd0b3AnO1xuXG5cdFx0Zm9yICh2YXIgaSA9IGdldFZhbHVlQ291bnQoc2NhbGUpIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0XHRcdGlmIChhbmdsZUxpbmVPcHRzLmRpc3BsYXkpIHtcblx0XHRcdFx0dmFyIG91dGVyUG9zaXRpb24gPSBzY2FsZS5nZXRQb2ludFBvc2l0aW9uKGksIG91dGVyRGlzdGFuY2UpO1xuXHRcdFx0XHRjdHguYmVnaW5QYXRoKCk7XG5cdFx0XHRcdGN0eC5tb3ZlVG8oc2NhbGUueENlbnRlciwgc2NhbGUueUNlbnRlcik7XG5cdFx0XHRcdGN0eC5saW5lVG8ob3V0ZXJQb3NpdGlvbi54LCBvdXRlclBvc2l0aW9uLnkpO1xuXHRcdFx0XHRjdHguc3Ryb2tlKCk7XG5cdFx0XHRcdGN0eC5jbG9zZVBhdGgoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHBvaW50TGFiZWxPcHRzLmRpc3BsYXkpIHtcblx0XHRcdFx0Ly8gRXh0cmEgM3B4IG91dCBmb3Igc29tZSBsYWJlbCBzcGFjaW5nXG5cdFx0XHRcdHZhciBwb2ludExhYmVsUG9zaXRpb24gPSBzY2FsZS5nZXRQb2ludFBvc2l0aW9uKGksIG91dGVyRGlzdGFuY2UgKyA1KTtcblxuXHRcdFx0XHQvLyBLZWVwIHRoaXMgaW4gbG9vcCBzaW5jZSB3ZSBtYXkgc3VwcG9ydCBhcnJheSBwcm9wZXJ0aWVzIGhlcmVcblx0XHRcdFx0dmFyIHBvaW50TGFiZWxGb250Q29sb3IgPSBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChwb2ludExhYmVsT3B0cy5mb250Q29sb3IsIGksIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250Q29sb3IpO1xuXHRcdFx0XHRjdHguZm9udCA9IHBsRm9udC5mb250O1xuXHRcdFx0XHRjdHguZmlsbFN0eWxlID0gcG9pbnRMYWJlbEZvbnRDb2xvcjtcblxuXHRcdFx0XHR2YXIgYW5nbGVSYWRpYW5zID0gc2NhbGUuZ2V0SW5kZXhBbmdsZShpKTtcblx0XHRcdFx0dmFyIGFuZ2xlID0gaGVscGVycy50b0RlZ3JlZXMoYW5nbGVSYWRpYW5zKTtcblx0XHRcdFx0Y3R4LnRleHRBbGlnbiA9IGdldFRleHRBbGlnbkZvckFuZ2xlKGFuZ2xlKTtcblx0XHRcdFx0YWRqdXN0UG9pbnRQb3NpdGlvbkZvckxhYmVsSGVpZ2h0KGFuZ2xlLCBzY2FsZS5fcG9pbnRMYWJlbFNpemVzW2ldLCBwb2ludExhYmVsUG9zaXRpb24pO1xuXHRcdFx0XHRmaWxsVGV4dChjdHgsIHNjYWxlLnBvaW50TGFiZWxzW2ldIHx8ICcnLCBwb2ludExhYmVsUG9zaXRpb24sIHBsRm9udC5zaXplKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBkcmF3UmFkaXVzTGluZShzY2FsZSwgZ3JpZExpbmVPcHRzLCByYWRpdXMsIGluZGV4KSB7XG5cdFx0dmFyIGN0eCA9IHNjYWxlLmN0eDtcblx0XHRjdHguc3Ryb2tlU3R5bGUgPSBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChncmlkTGluZU9wdHMuY29sb3IsIGluZGV4IC0gMSk7XG5cdFx0Y3R4LmxpbmVXaWR0aCA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGdyaWRMaW5lT3B0cy5saW5lV2lkdGgsIGluZGV4IC0gMSk7XG5cblx0XHRpZiAoc2NhbGUub3B0aW9ucy5ncmlkTGluZXMuY2lyY3VsYXIpIHtcblx0XHRcdC8vIERyYXcgY2lyY3VsYXIgYXJjcyBiZXR3ZWVuIHRoZSBwb2ludHNcblx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdGN0eC5hcmMoc2NhbGUueENlbnRlciwgc2NhbGUueUNlbnRlciwgcmFkaXVzLCAwLCBNYXRoLlBJICogMik7XG5cdFx0XHRjdHguY2xvc2VQYXRoKCk7XG5cdFx0XHRjdHguc3Ryb2tlKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIERyYXcgc3RyYWlnaHQgbGluZXMgY29ubmVjdGluZyBlYWNoIGluZGV4XG5cdFx0XHR2YXIgdmFsdWVDb3VudCA9IGdldFZhbHVlQ291bnQoc2NhbGUpO1xuXG5cdFx0XHRpZiAodmFsdWVDb3VudCA9PT0gMCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGN0eC5iZWdpblBhdGgoKTtcblx0XHRcdHZhciBwb2ludFBvc2l0aW9uID0gc2NhbGUuZ2V0UG9pbnRQb3NpdGlvbigwLCByYWRpdXMpO1xuXHRcdFx0Y3R4Lm1vdmVUbyhwb2ludFBvc2l0aW9uLngsIHBvaW50UG9zaXRpb24ueSk7XG5cblx0XHRcdGZvciAodmFyIGkgPSAxOyBpIDwgdmFsdWVDb3VudDsgaSsrKSB7XG5cdFx0XHRcdHBvaW50UG9zaXRpb24gPSBzY2FsZS5nZXRQb2ludFBvc2l0aW9uKGksIHJhZGl1cyk7XG5cdFx0XHRcdGN0eC5saW5lVG8ocG9pbnRQb3NpdGlvbi54LCBwb2ludFBvc2l0aW9uLnkpO1xuXHRcdFx0fVxuXG5cdFx0XHRjdHguY2xvc2VQYXRoKCk7XG5cdFx0XHRjdHguc3Ryb2tlKCk7XG5cdFx0fVxuXHR9XG5cblx0ZnVuY3Rpb24gbnVtYmVyT3JaZXJvKHBhcmFtKSB7XG5cdFx0cmV0dXJuIGhlbHBlcnMuaXNOdW1iZXIocGFyYW0pID8gcGFyYW0gOiAwO1xuXHR9XG5cblx0dmFyIExpbmVhclJhZGlhbFNjYWxlID0gQ2hhcnQuTGluZWFyU2NhbGVCYXNlLmV4dGVuZCh7XG5cdFx0c2V0RGltZW5zaW9uczogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG9wdHMgPSBtZS5vcHRpb25zO1xuXHRcdFx0dmFyIHRpY2tPcHRzID0gb3B0cy50aWNrcztcblx0XHRcdC8vIFNldCB0aGUgdW5jb25zdHJhaW5lZCBkaW1lbnNpb24gYmVmb3JlIGxhYmVsIHJvdGF0aW9uXG5cdFx0XHRtZS53aWR0aCA9IG1lLm1heFdpZHRoO1xuXHRcdFx0bWUuaGVpZ2h0ID0gbWUubWF4SGVpZ2h0O1xuXHRcdFx0bWUueENlbnRlciA9IE1hdGgucm91bmQobWUud2lkdGggLyAyKTtcblx0XHRcdG1lLnlDZW50ZXIgPSBNYXRoLnJvdW5kKG1lLmhlaWdodCAvIDIpO1xuXG5cdFx0XHR2YXIgbWluU2l6ZSA9IGhlbHBlcnMubWluKFttZS5oZWlnaHQsIG1lLndpZHRoXSk7XG5cdFx0XHR2YXIgdGlja0ZvbnRTaXplID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdCh0aWNrT3B0cy5mb250U2l6ZSwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRTaXplKTtcblx0XHRcdG1lLmRyYXdpbmdBcmVhID0gb3B0cy5kaXNwbGF5ID8gKG1pblNpemUgLyAyKSAtICh0aWNrRm9udFNpemUgLyAyICsgdGlja09wdHMuYmFja2Ryb3BQYWRkaW5nWSkgOiAobWluU2l6ZSAvIDIpO1xuXHRcdH0sXG5cdFx0ZGV0ZXJtaW5lRGF0YUxpbWl0czogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XG5cdFx0XHR2YXIgbWluID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuXHRcdFx0dmFyIG1heCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcblxuXHRcdFx0aGVscGVycy5lYWNoKGNoYXJ0LmRhdGEuZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkge1xuXHRcdFx0XHRpZiAoY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShkYXRhc2V0SW5kZXgpKSB7XG5cdFx0XHRcdFx0dmFyIG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpO1xuXG5cdFx0XHRcdFx0aGVscGVycy5lYWNoKGRhdGFzZXQuZGF0YSwgZnVuY3Rpb24ocmF3VmFsdWUsIGluZGV4KSB7XG5cdFx0XHRcdFx0XHR2YXIgdmFsdWUgPSArbWUuZ2V0UmlnaHRWYWx1ZShyYXdWYWx1ZSk7XG5cdFx0XHRcdFx0XHRpZiAoaXNOYU4odmFsdWUpIHx8IG1ldGEuZGF0YVtpbmRleF0uaGlkZGVuKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0bWluID0gTWF0aC5taW4odmFsdWUsIG1pbik7XG5cdFx0XHRcdFx0XHRtYXggPSBNYXRoLm1heCh2YWx1ZSwgbWF4KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdG1lLm1pbiA9IChtaW4gPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA/IDAgOiBtaW4pO1xuXHRcdFx0bWUubWF4ID0gKG1heCA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZID8gMCA6IG1heCk7XG5cblx0XHRcdC8vIENvbW1vbiBiYXNlIGltcGxlbWVudGF0aW9uIHRvIGhhbmRsZSB0aWNrcy5taW4sIHRpY2tzLm1heCwgdGlja3MuYmVnaW5BdFplcm9cblx0XHRcdG1lLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKTtcblx0XHR9LFxuXHRcdGdldFRpY2tMaW1pdDogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgdGlja09wdHMgPSB0aGlzLm9wdGlvbnMudGlja3M7XG5cdFx0XHR2YXIgdGlja0ZvbnRTaXplID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdCh0aWNrT3B0cy5mb250U2l6ZSwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRTaXplKTtcblx0XHRcdHJldHVybiBNYXRoLm1pbih0aWNrT3B0cy5tYXhUaWNrc0xpbWl0ID8gdGlja09wdHMubWF4VGlja3NMaW1pdCA6IDExLCBNYXRoLmNlaWwodGhpcy5kcmF3aW5nQXJlYSAvICgxLjUgKiB0aWNrRm9udFNpemUpKSk7XG5cdFx0fSxcblx0XHRjb252ZXJ0VGlja3NUb0xhYmVsczogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXG5cdFx0XHRDaGFydC5MaW5lYXJTY2FsZUJhc2UucHJvdG90eXBlLmNvbnZlcnRUaWNrc1RvTGFiZWxzLmNhbGwobWUpO1xuXG5cdFx0XHQvLyBQb2ludCBsYWJlbHNcblx0XHRcdG1lLnBvaW50TGFiZWxzID0gbWUuY2hhcnQuZGF0YS5sYWJlbHMubWFwKG1lLm9wdGlvbnMucG9pbnRMYWJlbHMuY2FsbGJhY2ssIG1lKTtcblx0XHR9LFxuXHRcdGdldExhYmVsRm9ySW5kZXg6IGZ1bmN0aW9uKGluZGV4LCBkYXRhc2V0SW5kZXgpIHtcblx0XHRcdHJldHVybiArdGhpcy5nZXRSaWdodFZhbHVlKHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1tkYXRhc2V0SW5kZXhdLmRhdGFbaW5kZXhdKTtcblx0XHR9LFxuXHRcdGZpdDogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAodGhpcy5vcHRpb25zLnBvaW50TGFiZWxzLmRpc3BsYXkpIHtcblx0XHRcdFx0Zml0V2l0aFBvaW50TGFiZWxzKHRoaXMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Zml0KHRoaXMpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0LyoqXG5cdFx0ICogU2V0IHJhZGl1cyByZWR1Y3Rpb25zIGFuZCBkZXRlcm1pbmUgbmV3IHJhZGl1cyBhbmQgY2VudGVyIHBvaW50XG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHRzZXRSZWR1Y3Rpb25zOiBmdW5jdGlvbihsYXJnZXN0UG9zc2libGVSYWRpdXMsIGZ1cnRoZXN0TGltaXRzLCBmdXJ0aGVzdEFuZ2xlcykge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciByYWRpdXNSZWR1Y3Rpb25MZWZ0ID0gZnVydGhlc3RMaW1pdHMubCAvIE1hdGguc2luKGZ1cnRoZXN0QW5nbGVzLmwpO1xuXHRcdFx0dmFyIHJhZGl1c1JlZHVjdGlvblJpZ2h0ID0gTWF0aC5tYXgoZnVydGhlc3RMaW1pdHMuciAtIG1lLndpZHRoLCAwKSAvIE1hdGguc2luKGZ1cnRoZXN0QW5nbGVzLnIpO1xuXHRcdFx0dmFyIHJhZGl1c1JlZHVjdGlvblRvcCA9IC1mdXJ0aGVzdExpbWl0cy50IC8gTWF0aC5jb3MoZnVydGhlc3RBbmdsZXMudCk7XG5cdFx0XHR2YXIgcmFkaXVzUmVkdWN0aW9uQm90dG9tID0gLU1hdGgubWF4KGZ1cnRoZXN0TGltaXRzLmIgLSBtZS5oZWlnaHQsIDApIC8gTWF0aC5jb3MoZnVydGhlc3RBbmdsZXMuYik7XG5cblx0XHRcdHJhZGl1c1JlZHVjdGlvbkxlZnQgPSBudW1iZXJPclplcm8ocmFkaXVzUmVkdWN0aW9uTGVmdCk7XG5cdFx0XHRyYWRpdXNSZWR1Y3Rpb25SaWdodCA9IG51bWJlck9yWmVybyhyYWRpdXNSZWR1Y3Rpb25SaWdodCk7XG5cdFx0XHRyYWRpdXNSZWR1Y3Rpb25Ub3AgPSBudW1iZXJPclplcm8ocmFkaXVzUmVkdWN0aW9uVG9wKTtcblx0XHRcdHJhZGl1c1JlZHVjdGlvbkJvdHRvbSA9IG51bWJlck9yWmVybyhyYWRpdXNSZWR1Y3Rpb25Cb3R0b20pO1xuXG5cdFx0XHRtZS5kcmF3aW5nQXJlYSA9IE1hdGgubWluKFxuXHRcdFx0XHRNYXRoLnJvdW5kKGxhcmdlc3RQb3NzaWJsZVJhZGl1cyAtIChyYWRpdXNSZWR1Y3Rpb25MZWZ0ICsgcmFkaXVzUmVkdWN0aW9uUmlnaHQpIC8gMiksXG5cdFx0XHRcdE1hdGgucm91bmQobGFyZ2VzdFBvc3NpYmxlUmFkaXVzIC0gKHJhZGl1c1JlZHVjdGlvblRvcCArIHJhZGl1c1JlZHVjdGlvbkJvdHRvbSkgLyAyKSk7XG5cdFx0XHRtZS5zZXRDZW50ZXJQb2ludChyYWRpdXNSZWR1Y3Rpb25MZWZ0LCByYWRpdXNSZWR1Y3Rpb25SaWdodCwgcmFkaXVzUmVkdWN0aW9uVG9wLCByYWRpdXNSZWR1Y3Rpb25Cb3R0b20pO1xuXHRcdH0sXG5cdFx0c2V0Q2VudGVyUG9pbnQ6IGZ1bmN0aW9uKGxlZnRNb3ZlbWVudCwgcmlnaHRNb3ZlbWVudCwgdG9wTW92ZW1lbnQsIGJvdHRvbU1vdmVtZW50KSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG1heFJpZ2h0ID0gbWUud2lkdGggLSByaWdodE1vdmVtZW50IC0gbWUuZHJhd2luZ0FyZWE7XG5cdFx0XHR2YXIgbWF4TGVmdCA9IGxlZnRNb3ZlbWVudCArIG1lLmRyYXdpbmdBcmVhO1xuXHRcdFx0dmFyIG1heFRvcCA9IHRvcE1vdmVtZW50ICsgbWUuZHJhd2luZ0FyZWE7XG5cdFx0XHR2YXIgbWF4Qm90dG9tID0gbWUuaGVpZ2h0IC0gYm90dG9tTW92ZW1lbnQgLSBtZS5kcmF3aW5nQXJlYTtcblxuXHRcdFx0bWUueENlbnRlciA9IE1hdGgucm91bmQoKChtYXhMZWZ0ICsgbWF4UmlnaHQpIC8gMikgKyBtZS5sZWZ0KTtcblx0XHRcdG1lLnlDZW50ZXIgPSBNYXRoLnJvdW5kKCgobWF4VG9wICsgbWF4Qm90dG9tKSAvIDIpICsgbWUudG9wKTtcblx0XHR9LFxuXG5cdFx0Z2V0SW5kZXhBbmdsZTogZnVuY3Rpb24oaW5kZXgpIHtcblx0XHRcdHZhciBhbmdsZU11bHRpcGxpZXIgPSAoTWF0aC5QSSAqIDIpIC8gZ2V0VmFsdWVDb3VudCh0aGlzKTtcblx0XHRcdHZhciBzdGFydEFuZ2xlID0gdGhpcy5jaGFydC5vcHRpb25zICYmIHRoaXMuY2hhcnQub3B0aW9ucy5zdGFydEFuZ2xlID9cblx0XHRcdFx0dGhpcy5jaGFydC5vcHRpb25zLnN0YXJ0QW5nbGUgOlxuXHRcdFx0XHQwO1xuXG5cdFx0XHR2YXIgc3RhcnRBbmdsZVJhZGlhbnMgPSBzdGFydEFuZ2xlICogTWF0aC5QSSAqIDIgLyAzNjA7XG5cblx0XHRcdC8vIFN0YXJ0IGZyb20gdGhlIHRvcCBpbnN0ZWFkIG9mIHJpZ2h0LCBzbyByZW1vdmUgYSBxdWFydGVyIG9mIHRoZSBjaXJjbGVcblx0XHRcdHJldHVybiBpbmRleCAqIGFuZ2xlTXVsdGlwbGllciArIHN0YXJ0QW5nbGVSYWRpYW5zO1xuXHRcdH0sXG5cdFx0Z2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWU6IGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXG5cdFx0XHRpZiAodmFsdWUgPT09IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuIDA7IC8vIG51bGwgYWx3YXlzIGluIGNlbnRlclxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUYWtlIGludG8gYWNjb3VudCBoYWxmIGZvbnQgc2l6ZSArIHRoZSB5UGFkZGluZyBvZiB0aGUgdG9wIHZhbHVlXG5cdFx0XHR2YXIgc2NhbGluZ0ZhY3RvciA9IG1lLmRyYXdpbmdBcmVhIC8gKG1lLm1heCAtIG1lLm1pbik7XG5cdFx0XHRpZiAobWUub3B0aW9ucy50aWNrcy5yZXZlcnNlKSB7XG5cdFx0XHRcdHJldHVybiAobWUubWF4IC0gdmFsdWUpICogc2NhbGluZ0ZhY3Rvcjtcblx0XHRcdH1cblx0XHRcdHJldHVybiAodmFsdWUgLSBtZS5taW4pICogc2NhbGluZ0ZhY3Rvcjtcblx0XHR9LFxuXHRcdGdldFBvaW50UG9zaXRpb246IGZ1bmN0aW9uKGluZGV4LCBkaXN0YW5jZUZyb21DZW50ZXIpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgdGhpc0FuZ2xlID0gbWUuZ2V0SW5kZXhBbmdsZShpbmRleCkgLSAoTWF0aC5QSSAvIDIpO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0eDogTWF0aC5yb3VuZChNYXRoLmNvcyh0aGlzQW5nbGUpICogZGlzdGFuY2VGcm9tQ2VudGVyKSArIG1lLnhDZW50ZXIsXG5cdFx0XHRcdHk6IE1hdGgucm91bmQoTWF0aC5zaW4odGhpc0FuZ2xlKSAqIGRpc3RhbmNlRnJvbUNlbnRlcikgKyBtZS55Q2VudGVyXG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0Z2V0UG9pbnRQb3NpdGlvbkZvclZhbHVlOiBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldFBvaW50UG9zaXRpb24oaW5kZXgsIHRoaXMuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUodmFsdWUpKTtcblx0XHR9LFxuXG5cdFx0Z2V0QmFzZVBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgbWluID0gbWUubWluO1xuXHRcdFx0dmFyIG1heCA9IG1lLm1heDtcblxuXHRcdFx0cmV0dXJuIG1lLmdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZSgwLFxuXHRcdFx0XHRtZS5iZWdpbkF0WmVybyA/IDAgOlxuXHRcdFx0XHRtaW4gPCAwICYmIG1heCA8IDAgPyBtYXggOlxuXHRcdFx0XHRtaW4gPiAwICYmIG1heCA+IDAgPyBtaW4gOlxuXHRcdFx0XHQwKTtcblx0XHR9LFxuXG5cdFx0ZHJhdzogZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xuXHRcdFx0dmFyIG9wdHMgPSBtZS5vcHRpb25zO1xuXHRcdFx0dmFyIGdyaWRMaW5lT3B0cyA9IG9wdHMuZ3JpZExpbmVzO1xuXHRcdFx0dmFyIHRpY2tPcHRzID0gb3B0cy50aWNrcztcblx0XHRcdHZhciB2YWx1ZU9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQ7XG5cblx0XHRcdGlmIChvcHRzLmRpc3BsYXkpIHtcblx0XHRcdFx0dmFyIGN0eCA9IG1lLmN0eDtcblx0XHRcdFx0dmFyIHN0YXJ0QW5nbGUgPSB0aGlzLmdldEluZGV4QW5nbGUoMCk7XG5cblx0XHRcdFx0Ly8gVGljayBGb250XG5cdFx0XHRcdHZhciB0aWNrRm9udFNpemUgPSB2YWx1ZU9yRGVmYXVsdCh0aWNrT3B0cy5mb250U2l6ZSwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRTaXplKTtcblx0XHRcdFx0dmFyIHRpY2tGb250U3R5bGUgPSB2YWx1ZU9yRGVmYXVsdCh0aWNrT3B0cy5mb250U3R5bGUsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250U3R5bGUpO1xuXHRcdFx0XHR2YXIgdGlja0ZvbnRGYW1pbHkgPSB2YWx1ZU9yRGVmYXVsdCh0aWNrT3B0cy5mb250RmFtaWx5LCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udEZhbWlseSk7XG5cdFx0XHRcdHZhciB0aWNrTGFiZWxGb250ID0gaGVscGVycy5mb250U3RyaW5nKHRpY2tGb250U2l6ZSwgdGlja0ZvbnRTdHlsZSwgdGlja0ZvbnRGYW1pbHkpO1xuXG5cdFx0XHRcdGhlbHBlcnMuZWFjaChtZS50aWNrcywgZnVuY3Rpb24obGFiZWwsIGluZGV4KSB7XG5cdFx0XHRcdFx0Ly8gRG9uJ3QgZHJhdyBhIGNlbnRyZSB2YWx1ZSAoaWYgaXQgaXMgbWluaW11bSlcblx0XHRcdFx0XHRpZiAoaW5kZXggPiAwIHx8IHRpY2tPcHRzLnJldmVyc2UpIHtcblx0XHRcdFx0XHRcdHZhciB5Q2VudGVyT2Zmc2V0ID0gbWUuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUobWUudGlja3NBc051bWJlcnNbaW5kZXhdKTtcblxuXHRcdFx0XHRcdFx0Ly8gRHJhdyBjaXJjdWxhciBsaW5lcyBhcm91bmQgdGhlIHNjYWxlXG5cdFx0XHRcdFx0XHRpZiAoZ3JpZExpbmVPcHRzLmRpc3BsYXkgJiYgaW5kZXggIT09IDApIHtcblx0XHRcdFx0XHRcdFx0ZHJhd1JhZGl1c0xpbmUobWUsIGdyaWRMaW5lT3B0cywgeUNlbnRlck9mZnNldCwgaW5kZXgpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAodGlja09wdHMuZGlzcGxheSkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdGlja0ZvbnRDb2xvciA9IHZhbHVlT3JEZWZhdWx0KHRpY2tPcHRzLmZvbnRDb2xvciwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRDb2xvcik7XG5cdFx0XHRcdFx0XHRcdGN0eC5mb250ID0gdGlja0xhYmVsRm9udDtcblxuXHRcdFx0XHRcdFx0XHRjdHguc2F2ZSgpO1xuXHRcdFx0XHRcdFx0XHRjdHgudHJhbnNsYXRlKG1lLnhDZW50ZXIsIG1lLnlDZW50ZXIpO1xuXHRcdFx0XHRcdFx0XHRjdHgucm90YXRlKHN0YXJ0QW5nbGUpO1xuXG5cdFx0XHRcdFx0XHRcdGlmICh0aWNrT3B0cy5zaG93TGFiZWxCYWNrZHJvcCkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciBsYWJlbFdpZHRoID0gY3R4Lm1lYXN1cmVUZXh0KGxhYmVsKS53aWR0aDtcblx0XHRcdFx0XHRcdFx0XHRjdHguZmlsbFN0eWxlID0gdGlja09wdHMuYmFja2Ryb3BDb2xvcjtcblx0XHRcdFx0XHRcdFx0XHRjdHguZmlsbFJlY3QoXG5cdFx0XHRcdFx0XHRcdFx0XHQtbGFiZWxXaWR0aCAvIDIgLSB0aWNrT3B0cy5iYWNrZHJvcFBhZGRpbmdYLFxuXHRcdFx0XHRcdFx0XHRcdFx0LXlDZW50ZXJPZmZzZXQgLSB0aWNrRm9udFNpemUgLyAyIC0gdGlja09wdHMuYmFja2Ryb3BQYWRkaW5nWSxcblx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsV2lkdGggKyB0aWNrT3B0cy5iYWNrZHJvcFBhZGRpbmdYICogMixcblx0XHRcdFx0XHRcdFx0XHRcdHRpY2tGb250U2l6ZSArIHRpY2tPcHRzLmJhY2tkcm9wUGFkZGluZ1kgKiAyXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGN0eC50ZXh0QWxpZ24gPSAnY2VudGVyJztcblx0XHRcdFx0XHRcdFx0Y3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuXHRcdFx0XHRcdFx0XHRjdHguZmlsbFN0eWxlID0gdGlja0ZvbnRDb2xvcjtcblx0XHRcdFx0XHRcdFx0Y3R4LmZpbGxUZXh0KGxhYmVsLCAwLCAteUNlbnRlck9mZnNldCk7XG5cdFx0XHRcdFx0XHRcdGN0eC5yZXN0b3JlKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAob3B0cy5hbmdsZUxpbmVzLmRpc3BsYXkgfHwgb3B0cy5wb2ludExhYmVscy5kaXNwbGF5KSB7XG5cdFx0XHRcdFx0ZHJhd1BvaW50TGFiZWxzKG1lKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0c2NhbGVTZXJ2aWNlLnJlZ2lzdGVyU2NhbGVUeXBlKCdyYWRpYWxMaW5lYXInLCBMaW5lYXJSYWRpYWxTY2FsZSwgZGVmYXVsdENvbmZpZyk7XG59O1xuXG59LHtcIjI2XCI6MjYsXCIzNFwiOjM0LFwiMzVcIjozNSxcIjQ2XCI6NDZ9XSw1OTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XG4vKiBnbG9iYWwgd2luZG93OiBmYWxzZSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgbW9tZW50ID0gcmVxdWlyZSgxKTtcbm1vbWVudCA9IHR5cGVvZiBtb21lbnQgPT09ICdmdW5jdGlvbicgPyBtb21lbnQgOiB3aW5kb3cubW9tZW50O1xuXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XG52YXIgU2NhbGUgPSByZXF1aXJlKDMzKTtcbnZhciBzY2FsZVNlcnZpY2UgPSByZXF1aXJlKDM0KTtcblxuLy8gSW50ZWdlciBjb25zdGFudHMgYXJlIGZyb20gdGhlIEVTNiBzcGVjLlxudmFyIE1JTl9JTlRFR0VSID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIgfHwgLTkwMDcxOTkyNTQ3NDA5OTE7XG52YXIgTUFYX0lOVEVHRVIgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fCA5MDA3MTk5MjU0NzQwOTkxO1xuXG52YXIgSU5URVJWQUxTID0ge1xuXHRtaWxsaXNlY29uZDoge1xuXHRcdGNvbW1vbjogdHJ1ZSxcblx0XHRzaXplOiAxLFxuXHRcdHN0ZXBzOiBbMSwgMiwgNSwgMTAsIDIwLCA1MCwgMTAwLCAyNTAsIDUwMF1cblx0fSxcblx0c2Vjb25kOiB7XG5cdFx0Y29tbW9uOiB0cnVlLFxuXHRcdHNpemU6IDEwMDAsXG5cdFx0c3RlcHM6IFsxLCAyLCA1LCAxMCwgMTUsIDMwXVxuXHR9LFxuXHRtaW51dGU6IHtcblx0XHRjb21tb246IHRydWUsXG5cdFx0c2l6ZTogNjAwMDAsXG5cdFx0c3RlcHM6IFsxLCAyLCA1LCAxMCwgMTUsIDMwXVxuXHR9LFxuXHRob3VyOiB7XG5cdFx0Y29tbW9uOiB0cnVlLFxuXHRcdHNpemU6IDM2MDAwMDAsXG5cdFx0c3RlcHM6IFsxLCAyLCAzLCA2LCAxMl1cblx0fSxcblx0ZGF5OiB7XG5cdFx0Y29tbW9uOiB0cnVlLFxuXHRcdHNpemU6IDg2NDAwMDAwLFxuXHRcdHN0ZXBzOiBbMSwgMiwgNV1cblx0fSxcblx0d2Vlazoge1xuXHRcdGNvbW1vbjogZmFsc2UsXG5cdFx0c2l6ZTogNjA0ODAwMDAwLFxuXHRcdHN0ZXBzOiBbMSwgMiwgMywgNF1cblx0fSxcblx0bW9udGg6IHtcblx0XHRjb21tb246IHRydWUsXG5cdFx0c2l6ZTogMi42MjhlOSxcblx0XHRzdGVwczogWzEsIDIsIDNdXG5cdH0sXG5cdHF1YXJ0ZXI6IHtcblx0XHRjb21tb246IGZhbHNlLFxuXHRcdHNpemU6IDcuODg0ZTksXG5cdFx0c3RlcHM6IFsxLCAyLCAzLCA0XVxuXHR9LFxuXHR5ZWFyOiB7XG5cdFx0Y29tbW9uOiB0cnVlLFxuXHRcdHNpemU6IDMuMTU0ZTEwXG5cdH1cbn07XG5cbnZhciBVTklUUyA9IE9iamVjdC5rZXlzKElOVEVSVkFMUyk7XG5cbmZ1bmN0aW9uIHNvcnRlcihhLCBiKSB7XG5cdHJldHVybiBhIC0gYjtcbn1cblxuZnVuY3Rpb24gYXJyYXlVbmlxdWUoaXRlbXMpIHtcblx0dmFyIGhhc2ggPSB7fTtcblx0dmFyIG91dCA9IFtdO1xuXHR2YXIgaSwgaWxlbiwgaXRlbTtcblxuXHRmb3IgKGkgPSAwLCBpbGVuID0gaXRlbXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0aXRlbSA9IGl0ZW1zW2ldO1xuXHRcdGlmICghaGFzaFtpdGVtXSkge1xuXHRcdFx0aGFzaFtpdGVtXSA9IHRydWU7XG5cdFx0XHRvdXQucHVzaChpdGVtKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2Yge3RpbWUsIHBvc30gb2JqZWN0cyB1c2VkIHRvIGludGVycG9sYXRlIGEgc3BlY2lmaWMgYHRpbWVgIG9yIHBvc2l0aW9uXG4gKiAoYHBvc2ApIG9uIHRoZSBzY2FsZSwgYnkgc2VhcmNoaW5nIGVudHJpZXMgYmVmb3JlIGFuZCBhZnRlciB0aGUgcmVxdWVzdGVkIHZhbHVlLiBgcG9zYCBpc1xuICogYSBkZWNpbWFsIGJldHdlZW4gMCBhbmQgMTogMCBiZWluZyB0aGUgc3RhcnQgb2YgdGhlIHNjYWxlIChsZWZ0IG9yIHRvcCkgYW5kIDEgdGhlIG90aGVyXG4gKiBleHRyZW1pdHkgKGxlZnQgKyB3aWR0aCBvciB0b3AgKyBoZWlnaHQpLiBOb3RlIHRoYXQgaXQgd291bGQgYmUgbW9yZSBvcHRpbWl6ZWQgdG8gZGlyZWN0bHlcbiAqIHN0b3JlIHByZS1jb21wdXRlZCBwaXhlbHMsIGJ1dCB0aGUgc2NhbGUgZGltZW5zaW9ucyBhcmUgbm90IGd1YXJhbnRlZWQgYXQgdGhlIHRpbWUgd2UgbmVlZFxuICogdG8gY3JlYXRlIHRoZSBsb29rdXAgdGFibGUuIFRoZSB0YWJsZSBBTFdBWVMgY29udGFpbnMgYXQgbGVhc3QgdHdvIGl0ZW1zOiBtaW4gYW5kIG1heC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcltdfSB0aW1lc3RhbXBzIC0gdGltZXN0YW1wcyBzb3J0ZWQgZnJvbSBsb3dlc3QgdG8gaGlnaGVzdC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBkaXN0cmlidXRpb24gLSBJZiAnbGluZWFyJywgdGltZXN0YW1wcyB3aWxsIGJlIHNwcmVhZCBsaW5lYXJseSBhbG9uZyB0aGUgbWluXG4gKiBhbmQgbWF4IHJhbmdlLCBzbyBiYXNpY2FsbHksIHRoZSB0YWJsZSB3aWxsIGNvbnRhaW5zIG9ubHkgdHdvIGl0ZW1zOiB7bWluLCAwfSBhbmQge21heCwgMX0uXG4gKiBJZiAnc2VyaWVzJywgdGltZXN0YW1wcyB3aWxsIGJlIHBvc2l0aW9uZWQgYXQgdGhlIHNhbWUgZGlzdGFuY2UgZnJvbSBlYWNoIG90aGVyLiBJbiB0aGlzXG4gKiBjYXNlLCBvbmx5IHRpbWVzdGFtcHMgdGhhdCBicmVhayB0aGUgdGltZSBsaW5lYXJpdHkgYXJlIHJlZ2lzdGVyZWQsIG1lYW5pbmcgdGhhdCBpbiB0aGVcbiAqIGJlc3QgY2FzZSwgYWxsIHRpbWVzdGFtcHMgYXJlIGxpbmVhciwgdGhlIHRhYmxlIGNvbnRhaW5zIG9ubHkgbWluIGFuZCBtYXguXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkTG9va3VwVGFibGUodGltZXN0YW1wcywgbWluLCBtYXgsIGRpc3RyaWJ1dGlvbikge1xuXHRpZiAoZGlzdHJpYnV0aW9uID09PSAnbGluZWFyJyB8fCAhdGltZXN0YW1wcy5sZW5ndGgpIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0e3RpbWU6IG1pbiwgcG9zOiAwfSxcblx0XHRcdHt0aW1lOiBtYXgsIHBvczogMX1cblx0XHRdO1xuXHR9XG5cblx0dmFyIHRhYmxlID0gW107XG5cdHZhciBpdGVtcyA9IFttaW5dO1xuXHR2YXIgaSwgaWxlbiwgcHJldiwgY3VyciwgbmV4dDtcblxuXHRmb3IgKGkgPSAwLCBpbGVuID0gdGltZXN0YW1wcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcblx0XHRjdXJyID0gdGltZXN0YW1wc1tpXTtcblx0XHRpZiAoY3VyciA+IG1pbiAmJiBjdXJyIDwgbWF4KSB7XG5cdFx0XHRpdGVtcy5wdXNoKGN1cnIpO1xuXHRcdH1cblx0fVxuXG5cdGl0ZW1zLnB1c2gobWF4KTtcblxuXHRmb3IgKGkgPSAwLCBpbGVuID0gaXRlbXMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0bmV4dCA9IGl0ZW1zW2kgKyAxXTtcblx0XHRwcmV2ID0gaXRlbXNbaSAtIDFdO1xuXHRcdGN1cnIgPSBpdGVtc1tpXTtcblxuXHRcdC8vIG9ubHkgYWRkIHBvaW50cyB0aGF0IGJyZWFrcyB0aGUgc2NhbGUgbGluZWFyaXR5XG5cdFx0aWYgKHByZXYgPT09IHVuZGVmaW5lZCB8fCBuZXh0ID09PSB1bmRlZmluZWQgfHwgTWF0aC5yb3VuZCgobmV4dCArIHByZXYpIC8gMikgIT09IGN1cnIpIHtcblx0XHRcdHRhYmxlLnB1c2goe3RpbWU6IGN1cnIsIHBvczogaSAvIChpbGVuIC0gMSl9KTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdGFibGU7XG59XG5cbi8vIEBzZWUgYWRhcHRlZCBmcm9tIGh0dHA6Ly93d3cuYW51amdha2hhci5jb20vMjAxNC8wMy8wMS9iaW5hcnktc2VhcmNoLWluLWphdmFzY3JpcHQvXG5mdW5jdGlvbiBsb29rdXAodGFibGUsIGtleSwgdmFsdWUpIHtcblx0dmFyIGxvID0gMDtcblx0dmFyIGhpID0gdGFibGUubGVuZ3RoIC0gMTtcblx0dmFyIG1pZCwgaTAsIGkxO1xuXG5cdHdoaWxlIChsbyA+PSAwICYmIGxvIDw9IGhpKSB7XG5cdFx0bWlkID0gKGxvICsgaGkpID4+IDE7XG5cdFx0aTAgPSB0YWJsZVttaWQgLSAxXSB8fCBudWxsO1xuXHRcdGkxID0gdGFibGVbbWlkXTtcblxuXHRcdGlmICghaTApIHtcblx0XHRcdC8vIGdpdmVuIHZhbHVlIGlzIG91dHNpZGUgdGFibGUgKGJlZm9yZSBmaXJzdCBpdGVtKVxuXHRcdFx0cmV0dXJuIHtsbzogbnVsbCwgaGk6IGkxfTtcblx0XHR9IGVsc2UgaWYgKGkxW2tleV0gPCB2YWx1ZSkge1xuXHRcdFx0bG8gPSBtaWQgKyAxO1xuXHRcdH0gZWxzZSBpZiAoaTBba2V5XSA+IHZhbHVlKSB7XG5cdFx0XHRoaSA9IG1pZCAtIDE7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB7bG86IGkwLCBoaTogaTF9O1xuXHRcdH1cblx0fVxuXG5cdC8vIGdpdmVuIHZhbHVlIGlzIG91dHNpZGUgdGFibGUgKGFmdGVyIGxhc3QgaXRlbSlcblx0cmV0dXJuIHtsbzogaTEsIGhpOiBudWxsfTtcbn1cblxuLyoqXG4gKiBMaW5lYXJseSBpbnRlcnBvbGF0ZXMgdGhlIGdpdmVuIHNvdXJjZSBgdmFsdWVgIHVzaW5nIHRoZSB0YWJsZSBpdGVtcyBgc2tleWAgdmFsdWVzIGFuZFxuICogcmV0dXJucyB0aGUgYXNzb2NpYXRlZCBgdGtleWAgdmFsdWUuIEZvciBleGFtcGxlLCBpbnRlcnBvbGF0ZSh0YWJsZSwgJ3RpbWUnLCA0MiwgJ3BvcycpXG4gKiByZXR1cm5zIHRoZSBwb3NpdGlvbiBmb3IgYSB0aW1lc3RhbXAgZXF1YWwgdG8gNDIuIElmIHZhbHVlIGlzIG91dCBvZiBib3VuZHMsIHZhbHVlcyBhdFxuICogaW5kZXggWzAsIDFdIG9yIFtuIC0gMSwgbl0gYXJlIHVzZWQgZm9yIHRoZSBpbnRlcnBvbGF0aW9uLlxuICovXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZSh0YWJsZSwgc2tleSwgc3ZhbCwgdGtleSkge1xuXHR2YXIgcmFuZ2UgPSBsb29rdXAodGFibGUsIHNrZXksIHN2YWwpO1xuXG5cdC8vIE5vdGU6IHRoZSBsb29rdXAgdGFibGUgQUxXQVlTIGNvbnRhaW5zIGF0IGxlYXN0IDIgaXRlbXMgKG1pbiBhbmQgbWF4KVxuXHR2YXIgcHJldiA9ICFyYW5nZS5sbyA/IHRhYmxlWzBdIDogIXJhbmdlLmhpID8gdGFibGVbdGFibGUubGVuZ3RoIC0gMl0gOiByYW5nZS5sbztcblx0dmFyIG5leHQgPSAhcmFuZ2UubG8gPyB0YWJsZVsxXSA6ICFyYW5nZS5oaSA/IHRhYmxlW3RhYmxlLmxlbmd0aCAtIDFdIDogcmFuZ2UuaGk7XG5cblx0dmFyIHNwYW4gPSBuZXh0W3NrZXldIC0gcHJldltza2V5XTtcblx0dmFyIHJhdGlvID0gc3BhbiA/IChzdmFsIC0gcHJldltza2V5XSkgLyBzcGFuIDogMDtcblx0dmFyIG9mZnNldCA9IChuZXh0W3RrZXldIC0gcHJldlt0a2V5XSkgKiByYXRpbztcblxuXHRyZXR1cm4gcHJldlt0a2V5XSArIG9mZnNldDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IHRoZSBnaXZlbiB2YWx1ZSB0byBhIG1vbWVudCBvYmplY3QgdXNpbmcgdGhlIGdpdmVuIHRpbWUgb3B0aW9ucy5cbiAqIEBzZWUgaHR0cDovL21vbWVudGpzLmNvbS9kb2NzLyMvcGFyc2luZy9cbiAqL1xuZnVuY3Rpb24gbW9tZW50aWZ5KHZhbHVlLCBvcHRpb25zKSB7XG5cdHZhciBwYXJzZXIgPSBvcHRpb25zLnBhcnNlcjtcblx0dmFyIGZvcm1hdCA9IG9wdGlvbnMucGFyc2VyIHx8IG9wdGlvbnMuZm9ybWF0O1xuXG5cdGlmICh0eXBlb2YgcGFyc2VyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0cmV0dXJuIHBhcnNlcih2YWx1ZSk7XG5cdH1cblxuXHRpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgZm9ybWF0ID09PSAnc3RyaW5nJykge1xuXHRcdHJldHVybiBtb21lbnQodmFsdWUsIGZvcm1hdCk7XG5cdH1cblxuXHRpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIG1vbWVudCkpIHtcblx0XHR2YWx1ZSA9IG1vbWVudCh2YWx1ZSk7XG5cdH1cblxuXHRpZiAodmFsdWUuaXNWYWxpZCgpKSB7XG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cblx0Ly8gTGFiZWxzIGFyZSBpbiBhbiBpbmNvbXBhdGlibGUgbW9tZW50IGZvcm1hdCBhbmQgbm8gYHBhcnNlcmAgaGFzIGJlZW4gcHJvdmlkZWQuXG5cdC8vIFRoZSB1c2VyIG1pZ2h0IHN0aWxsIHVzZSB0aGUgZGVwcmVjYXRlZCBgZm9ybWF0YCBvcHRpb24gdG8gY29udmVydCBoaXMgaW5wdXRzLlxuXHRpZiAodHlwZW9mIGZvcm1hdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdHJldHVybiBmb3JtYXQodmFsdWUpO1xuXHR9XG5cblx0cmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBwYXJzZShpbnB1dCwgc2NhbGUpIHtcblx0aWYgKGhlbHBlcnMuaXNOdWxsT3JVbmRlZihpbnB1dCkpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdHZhciBvcHRpb25zID0gc2NhbGUub3B0aW9ucy50aW1lO1xuXHR2YXIgdmFsdWUgPSBtb21lbnRpZnkoc2NhbGUuZ2V0UmlnaHRWYWx1ZShpbnB1dCksIG9wdGlvbnMpO1xuXHRpZiAoIXZhbHVlLmlzVmFsaWQoKSkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0aWYgKG9wdGlvbnMucm91bmQpIHtcblx0XHR2YWx1ZS5zdGFydE9mKG9wdGlvbnMucm91bmQpO1xuXHR9XG5cblx0cmV0dXJuIHZhbHVlLnZhbHVlT2YoKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5pdCB0byBza2lwIHRvIGJlIGFibGUgdG8gZGlzcGxheSB1cCB0byBgY2FwYWNpdHlgIG51bWJlciBvZiB0aWNrc1xuICogaW4gYHVuaXRgIGZvciB0aGUgZ2l2ZW4gYG1pbmAgLyBgbWF4YCByYW5nZSBhbmQgcmVzcGVjdGluZyB0aGUgaW50ZXJ2YWwgc3RlcHMgY29uc3RyYWludHMuXG4gKi9cbmZ1bmN0aW9uIGRldGVybWluZVN0ZXBTaXplKG1pbiwgbWF4LCB1bml0LCBjYXBhY2l0eSkge1xuXHR2YXIgcmFuZ2UgPSBtYXggLSBtaW47XG5cdHZhciBpbnRlcnZhbCA9IElOVEVSVkFMU1t1bml0XTtcblx0dmFyIG1pbGxpc2Vjb25kcyA9IGludGVydmFsLnNpemU7XG5cdHZhciBzdGVwcyA9IGludGVydmFsLnN0ZXBzO1xuXHR2YXIgaSwgaWxlbiwgZmFjdG9yO1xuXG5cdGlmICghc3RlcHMpIHtcblx0XHRyZXR1cm4gTWF0aC5jZWlsKHJhbmdlIC8gKGNhcGFjaXR5ICogbWlsbGlzZWNvbmRzKSk7XG5cdH1cblxuXHRmb3IgKGkgPSAwLCBpbGVuID0gc3RlcHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0ZmFjdG9yID0gc3RlcHNbaV07XG5cdFx0aWYgKE1hdGguY2VpbChyYW5nZSAvIChtaWxsaXNlY29uZHMgKiBmYWN0b3IpKSA8PSBjYXBhY2l0eSkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZhY3Rvcjtcbn1cblxuLyoqXG4gKiBGaWd1cmVzIG91dCB3aGF0IHVuaXQgcmVzdWx0cyBpbiBhbiBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYXV0by1nZW5lcmF0ZWQgdGlja3NcbiAqL1xuZnVuY3Rpb24gZGV0ZXJtaW5lVW5pdEZvckF1dG9UaWNrcyhtaW5Vbml0LCBtaW4sIG1heCwgY2FwYWNpdHkpIHtcblx0dmFyIGlsZW4gPSBVTklUUy5sZW5ndGg7XG5cdHZhciBpLCBpbnRlcnZhbCwgZmFjdG9yO1xuXG5cdGZvciAoaSA9IFVOSVRTLmluZGV4T2YobWluVW5pdCk7IGkgPCBpbGVuIC0gMTsgKytpKSB7XG5cdFx0aW50ZXJ2YWwgPSBJTlRFUlZBTFNbVU5JVFNbaV1dO1xuXHRcdGZhY3RvciA9IGludGVydmFsLnN0ZXBzID8gaW50ZXJ2YWwuc3RlcHNbaW50ZXJ2YWwuc3RlcHMubGVuZ3RoIC0gMV0gOiBNQVhfSU5URUdFUjtcblxuXHRcdGlmIChpbnRlcnZhbC5jb21tb24gJiYgTWF0aC5jZWlsKChtYXggLSBtaW4pIC8gKGZhY3RvciAqIGludGVydmFsLnNpemUpKSA8PSBjYXBhY2l0eSkge1xuXHRcdFx0cmV0dXJuIFVOSVRTW2ldO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBVTklUU1tpbGVuIC0gMV07XG59XG5cbi8qKlxuICogRmlndXJlcyBvdXQgd2hhdCB1bml0IHRvIGZvcm1hdCBhIHNldCBvZiB0aWNrcyB3aXRoXG4gKi9cbmZ1bmN0aW9uIGRldGVybWluZVVuaXRGb3JGb3JtYXR0aW5nKHRpY2tzLCBtaW5Vbml0LCBtaW4sIG1heCkge1xuXHR2YXIgZHVyYXRpb24gPSBtb21lbnQuZHVyYXRpb24obW9tZW50KG1heCkuZGlmZihtb21lbnQobWluKSkpO1xuXHR2YXIgaWxlbiA9IFVOSVRTLmxlbmd0aDtcblx0dmFyIGksIHVuaXQ7XG5cblx0Zm9yIChpID0gaWxlbiAtIDE7IGkgPj0gVU5JVFMuaW5kZXhPZihtaW5Vbml0KTsgaS0tKSB7XG5cdFx0dW5pdCA9IFVOSVRTW2ldO1xuXHRcdGlmIChJTlRFUlZBTFNbdW5pdF0uY29tbW9uICYmIGR1cmF0aW9uLmFzKHVuaXQpID49IHRpY2tzLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIHVuaXQ7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIFVOSVRTW21pblVuaXQgPyBVTklUUy5pbmRleE9mKG1pblVuaXQpIDogMF07XG59XG5cbmZ1bmN0aW9uIGRldGVybWluZU1ham9yVW5pdCh1bml0KSB7XG5cdGZvciAodmFyIGkgPSBVTklUUy5pbmRleE9mKHVuaXQpICsgMSwgaWxlbiA9IFVOSVRTLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdGlmIChJTlRFUlZBTFNbVU5JVFNbaV1dLmNvbW1vbikge1xuXHRcdFx0cmV0dXJuIFVOSVRTW2ldO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIG1heGltdW0gb2YgYGNhcGFjaXR5YCB0aW1lc3RhbXBzIGJldHdlZW4gbWluIGFuZCBtYXgsIHJvdW5kZWQgdG8gdGhlXG4gKiBgbWlub3JgIHVuaXQsIGFsaWduZWQgb24gdGhlIGBtYWpvcmAgdW5pdCBhbmQgdXNpbmcgdGhlIGdpdmVuIHNjYWxlIHRpbWUgYG9wdGlvbnNgLlxuICogSW1wb3J0YW50OiB0aGlzIG1ldGhvZCBjYW4gcmV0dXJuIHRpY2tzIG91dHNpZGUgdGhlIG1pbiBhbmQgbWF4IHJhbmdlLCBpdCdzIHRoZVxuICogcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxpbmcgY29kZSB0byBjbGFtcCB2YWx1ZXMgaWYgbmVlZGVkLlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZShtaW4sIG1heCwgY2FwYWNpdHksIG9wdGlvbnMpIHtcblx0dmFyIHRpbWVPcHRzID0gb3B0aW9ucy50aW1lO1xuXHR2YXIgbWlub3IgPSB0aW1lT3B0cy51bml0IHx8IGRldGVybWluZVVuaXRGb3JBdXRvVGlja3ModGltZU9wdHMubWluVW5pdCwgbWluLCBtYXgsIGNhcGFjaXR5KTtcblx0dmFyIG1ham9yID0gZGV0ZXJtaW5lTWFqb3JVbml0KG1pbm9yKTtcblx0dmFyIHN0ZXBTaXplID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdCh0aW1lT3B0cy5zdGVwU2l6ZSwgdGltZU9wdHMudW5pdFN0ZXBTaXplKTtcblx0dmFyIHdlZWtkYXkgPSBtaW5vciA9PT0gJ3dlZWsnID8gdGltZU9wdHMuaXNvV2Vla2RheSA6IGZhbHNlO1xuXHR2YXIgbWFqb3JUaWNrc0VuYWJsZWQgPSBvcHRpb25zLnRpY2tzLm1ham9yLmVuYWJsZWQ7XG5cdHZhciBpbnRlcnZhbCA9IElOVEVSVkFMU1ttaW5vcl07XG5cdHZhciBmaXJzdCA9IG1vbWVudChtaW4pO1xuXHR2YXIgbGFzdCA9IG1vbWVudChtYXgpO1xuXHR2YXIgdGlja3MgPSBbXTtcblx0dmFyIHRpbWU7XG5cblx0aWYgKCFzdGVwU2l6ZSkge1xuXHRcdHN0ZXBTaXplID0gZGV0ZXJtaW5lU3RlcFNpemUobWluLCBtYXgsIG1pbm9yLCBjYXBhY2l0eSk7XG5cdH1cblxuXHQvLyBGb3IgJ3dlZWsnIHVuaXQsIGhhbmRsZSB0aGUgZmlyc3QgZGF5IG9mIHdlZWsgb3B0aW9uXG5cdGlmICh3ZWVrZGF5KSB7XG5cdFx0Zmlyc3QgPSBmaXJzdC5pc29XZWVrZGF5KHdlZWtkYXkpO1xuXHRcdGxhc3QgPSBsYXN0Lmlzb1dlZWtkYXkod2Vla2RheSk7XG5cdH1cblxuXHQvLyBBbGlnbiBmaXJzdC9sYXN0IHRpY2tzIG9uIHVuaXRcblx0Zmlyc3QgPSBmaXJzdC5zdGFydE9mKHdlZWtkYXkgPyAnZGF5JyA6IG1pbm9yKTtcblx0bGFzdCA9IGxhc3Quc3RhcnRPZih3ZWVrZGF5ID8gJ2RheScgOiBtaW5vcik7XG5cblx0Ly8gTWFrZSBzdXJlIHRoYXQgdGhlIGxhc3QgdGljayBpbmNsdWRlIG1heFxuXHRpZiAobGFzdCA8IG1heCkge1xuXHRcdGxhc3QuYWRkKDEsIG1pbm9yKTtcblx0fVxuXG5cdHRpbWUgPSBtb21lbnQoZmlyc3QpO1xuXG5cdGlmIChtYWpvclRpY2tzRW5hYmxlZCAmJiBtYWpvciAmJiAhd2Vla2RheSAmJiAhdGltZU9wdHMucm91bmQpIHtcblx0XHQvLyBBbGlnbiB0aGUgZmlyc3QgdGljayBvbiB0aGUgcHJldmlvdXMgYG1pbm9yYCB1bml0IGFsaWduZWQgb24gdGhlIGBtYWpvcmAgdW5pdDpcblx0XHQvLyB3ZSBmaXJzdCBhbGlnbmVkIHRpbWUgb24gdGhlIHByZXZpb3VzIGBtYWpvcmAgdW5pdCB0aGVuIGFkZCB0aGUgbnVtYmVyIG9mIGZ1bGxcblx0XHQvLyBzdGVwU2l6ZSB0aGVyZSBpcyBiZXR3ZWVuIGZpcnN0IGFuZCB0aGUgcHJldmlvdXMgbWFqb3IgdGltZS5cblx0XHR0aW1lLnN0YXJ0T2YobWFqb3IpO1xuXHRcdHRpbWUuYWRkKH5+KChmaXJzdCAtIHRpbWUpIC8gKGludGVydmFsLnNpemUgKiBzdGVwU2l6ZSkpICogc3RlcFNpemUsIG1pbm9yKTtcblx0fVxuXG5cdGZvciAoOyB0aW1lIDwgbGFzdDsgdGltZS5hZGQoc3RlcFNpemUsIG1pbm9yKSkge1xuXHRcdHRpY2tzLnB1c2goK3RpbWUpO1xuXHR9XG5cblx0dGlja3MucHVzaCgrdGltZSk7XG5cblx0cmV0dXJuIHRpY2tzO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJpZ2h0IGFuZCBsZWZ0IG9mZnNldHMgZnJvbSBlZGdlcyBpbiB0aGUgZm9ybSBvZiB7bGVmdCwgcmlnaHR9LlxuICogT2Zmc2V0cyBhcmUgYWRkZWQgd2hlbiB0aGUgYG9mZnNldGAgb3B0aW9uIGlzIHRydWUuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVPZmZzZXRzKHRhYmxlLCB0aWNrcywgbWluLCBtYXgsIG9wdGlvbnMpIHtcblx0dmFyIGxlZnQgPSAwO1xuXHR2YXIgcmlnaHQgPSAwO1xuXHR2YXIgdXBwZXIsIGxvd2VyO1xuXG5cdGlmIChvcHRpb25zLm9mZnNldCAmJiB0aWNrcy5sZW5ndGgpIHtcblx0XHRpZiAoIW9wdGlvbnMudGltZS5taW4pIHtcblx0XHRcdHVwcGVyID0gdGlja3MubGVuZ3RoID4gMSA/IHRpY2tzWzFdIDogbWF4O1xuXHRcdFx0bG93ZXIgPSB0aWNrc1swXTtcblx0XHRcdGxlZnQgPSAoXG5cdFx0XHRcdGludGVycG9sYXRlKHRhYmxlLCAndGltZScsIHVwcGVyLCAncG9zJykgLVxuXHRcdFx0XHRpbnRlcnBvbGF0ZSh0YWJsZSwgJ3RpbWUnLCBsb3dlciwgJ3BvcycpXG5cdFx0XHQpIC8gMjtcblx0XHR9XG5cdFx0aWYgKCFvcHRpb25zLnRpbWUubWF4KSB7XG5cdFx0XHR1cHBlciA9IHRpY2tzW3RpY2tzLmxlbmd0aCAtIDFdO1xuXHRcdFx0bG93ZXIgPSB0aWNrcy5sZW5ndGggPiAxID8gdGlja3NbdGlja3MubGVuZ3RoIC0gMl0gOiBtaW47XG5cdFx0XHRyaWdodCA9IChcblx0XHRcdFx0aW50ZXJwb2xhdGUodGFibGUsICd0aW1lJywgdXBwZXIsICdwb3MnKSAtXG5cdFx0XHRcdGludGVycG9sYXRlKHRhYmxlLCAndGltZScsIGxvd2VyLCAncG9zJylcblx0XHRcdCkgLyAyO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB7bGVmdDogbGVmdCwgcmlnaHQ6IHJpZ2h0fTtcbn1cblxuZnVuY3Rpb24gdGlja3NGcm9tVGltZXN0YW1wcyh2YWx1ZXMsIG1ham9yVW5pdCkge1xuXHR2YXIgdGlja3MgPSBbXTtcblx0dmFyIGksIGlsZW4sIHZhbHVlLCBtYWpvcjtcblxuXHRmb3IgKGkgPSAwLCBpbGVuID0gdmFsdWVzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdHZhbHVlID0gdmFsdWVzW2ldO1xuXHRcdG1ham9yID0gbWFqb3JVbml0ID8gdmFsdWUgPT09ICttb21lbnQodmFsdWUpLnN0YXJ0T2YobWFqb3JVbml0KSA6IGZhbHNlO1xuXG5cdFx0dGlja3MucHVzaCh7XG5cdFx0XHR2YWx1ZTogdmFsdWUsXG5cdFx0XHRtYWpvcjogbWFqb3Jcblx0XHR9KTtcblx0fVxuXG5cdHJldHVybiB0aWNrcztcbn1cblxuZnVuY3Rpb24gZGV0ZXJtaW5lTGFiZWxGb3JtYXQoZGF0YSwgdGltZU9wdHMpIHtcblx0dmFyIGksIG1vbWVudERhdGUsIGhhc1RpbWU7XG5cdHZhciBpbGVuID0gZGF0YS5sZW5ndGg7XG5cblx0Ly8gZmluZCB0aGUgbGFiZWwgd2l0aCB0aGUgbW9zdCBwYXJ0cyAobWlsbGlzZWNvbmRzLCBtaW51dGVzLCBldGMuKVxuXHQvLyBmb3JtYXQgYWxsIGxhYmVscyB3aXRoIHRoZSBzYW1lIGxldmVsIG9mIGRldGFpbCBhcyB0aGUgbW9zdCBzcGVjaWZpYyBsYWJlbFxuXHRmb3IgKGkgPSAwOyBpIDwgaWxlbjsgaSsrKSB7XG5cdFx0bW9tZW50RGF0ZSA9IG1vbWVudGlmeShkYXRhW2ldLCB0aW1lT3B0cyk7XG5cdFx0aWYgKG1vbWVudERhdGUubWlsbGlzZWNvbmQoKSAhPT0gMCkge1xuXHRcdFx0cmV0dXJuICdNTU0gRCwgWVlZWSBoOm1tOnNzLlNTUyBhJztcblx0XHR9XG5cdFx0aWYgKG1vbWVudERhdGUuc2Vjb25kKCkgIT09IDAgfHwgbW9tZW50RGF0ZS5taW51dGUoKSAhPT0gMCB8fCBtb21lbnREYXRlLmhvdXIoKSAhPT0gMCkge1xuXHRcdFx0aGFzVGltZSA9IHRydWU7XG5cdFx0fVxuXHR9XG5cdGlmIChoYXNUaW1lKSB7XG5cdFx0cmV0dXJuICdNTU0gRCwgWVlZWSBoOm1tOnNzIGEnO1xuXHR9XG5cdHJldHVybiAnTU1NIEQsIFlZWVknO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuXG5cdHZhciBkZWZhdWx0Q29uZmlnID0ge1xuXHRcdHBvc2l0aW9uOiAnYm90dG9tJyxcblxuXHRcdC8qKlxuXHRcdCAqIERhdGEgZGlzdHJpYnV0aW9uIGFsb25nIHRoZSBzY2FsZTpcblx0XHQgKiAtICdsaW5lYXInOiBkYXRhIGFyZSBzcHJlYWQgYWNjb3JkaW5nIHRvIHRoZWlyIHRpbWUgKGRpc3RhbmNlcyBjYW4gdmFyeSksXG5cdFx0ICogLSAnc2VyaWVzJzogZGF0YSBhcmUgc3ByZWFkIGF0IHRoZSBzYW1lIGRpc3RhbmNlIGZyb20gZWFjaCBvdGhlci5cblx0XHQgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL3B1bGwvNDUwN1xuXHRcdCAqIEBzaW5jZSAyLjcuMFxuXHRcdCAqL1xuXHRcdGRpc3RyaWJ1dGlvbjogJ2xpbmVhcicsXG5cblx0XHQvKipcblx0XHQgKiBTY2FsZSBib3VuZGFyeSBzdHJhdGVneSAoYnlwYXNzZWQgYnkgbWluL21heCB0aW1lIG9wdGlvbnMpXG5cdFx0ICogLSBgZGF0YWA6IG1ha2Ugc3VyZSBkYXRhIGFyZSBmdWxseSB2aXNpYmxlLCB0aWNrcyBvdXRzaWRlIGFyZSByZW1vdmVkXG5cdFx0ICogLSBgdGlja3NgOiBtYWtlIHN1cmUgdGlja3MgYXJlIGZ1bGx5IHZpc2libGUsIGRhdGEgb3V0c2lkZSBhcmUgdHJ1bmNhdGVkXG5cdFx0ICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9wdWxsLzQ1NTZcblx0XHQgKiBAc2luY2UgMi43LjBcblx0XHQgKi9cblx0XHRib3VuZHM6ICdkYXRhJyxcblxuXHRcdHRpbWU6IHtcblx0XHRcdHBhcnNlcjogZmFsc2UsIC8vIGZhbHNlID09IGEgcGF0dGVybiBzdHJpbmcgZnJvbSBodHRwOi8vbW9tZW50anMuY29tL2RvY3MvIy9wYXJzaW5nL3N0cmluZy1mb3JtYXQvIG9yIGEgY3VzdG9tIGNhbGxiYWNrIHRoYXQgY29udmVydHMgaXRzIGFyZ3VtZW50IHRvIGEgbW9tZW50XG5cdFx0XHRmb3JtYXQ6IGZhbHNlLCAvLyBERVBSRUNBVEVEIGZhbHNlID09IGRhdGUgb2JqZWN0cywgbW9tZW50IG9iamVjdCwgY2FsbGJhY2sgb3IgYSBwYXR0ZXJuIHN0cmluZyBmcm9tIGh0dHA6Ly9tb21lbnRqcy5jb20vZG9jcy8jL3BhcnNpbmcvc3RyaW5nLWZvcm1hdC9cblx0XHRcdHVuaXQ6IGZhbHNlLCAvLyBmYWxzZSA9PSBhdXRvbWF0aWMgb3Igb3ZlcnJpZGUgd2l0aCB3ZWVrLCBtb250aCwgeWVhciwgZXRjLlxuXHRcdFx0cm91bmQ6IGZhbHNlLCAvLyBub25lLCBvciBvdmVycmlkZSB3aXRoIHdlZWssIG1vbnRoLCB5ZWFyLCBldGMuXG5cdFx0XHRkaXNwbGF5Rm9ybWF0OiBmYWxzZSwgLy8gREVQUkVDQVRFRFxuXHRcdFx0aXNvV2Vla2RheTogZmFsc2UsIC8vIG92ZXJyaWRlIHdlZWsgc3RhcnQgZGF5IC0gc2VlIGh0dHA6Ly9tb21lbnRqcy5jb20vZG9jcy8jL2dldC1zZXQvaXNvLXdlZWtkYXkvXG5cdFx0XHRtaW5Vbml0OiAnbWlsbGlzZWNvbmQnLFxuXG5cdFx0XHQvLyBkZWZhdWx0cyB0byB1bml0J3MgY29ycmVzcG9uZGluZyB1bml0Rm9ybWF0IGJlbG93IG9yIG92ZXJyaWRlIHVzaW5nIHBhdHRlcm4gc3RyaW5nIGZyb20gaHR0cDovL21vbWVudGpzLmNvbS9kb2NzLyMvZGlzcGxheWluZy9mb3JtYXQvXG5cdFx0XHRkaXNwbGF5Rm9ybWF0czoge1xuXHRcdFx0XHRtaWxsaXNlY29uZDogJ2g6bW06c3MuU1NTIGEnLCAvLyAxMToyMDowMS4xMjMgQU0sXG5cdFx0XHRcdHNlY29uZDogJ2g6bW06c3MgYScsIC8vIDExOjIwOjAxIEFNXG5cdFx0XHRcdG1pbnV0ZTogJ2g6bW0gYScsIC8vIDExOjIwIEFNXG5cdFx0XHRcdGhvdXI6ICdoQScsIC8vIDVQTVxuXHRcdFx0XHRkYXk6ICdNTU0gRCcsIC8vIFNlcCA0XG5cdFx0XHRcdHdlZWs6ICdsbCcsIC8vIFdlZWsgNDYsIG9yIG1heWJlIFwiW1ddV1cgLSBZWVlZXCIgP1xuXHRcdFx0XHRtb250aDogJ01NTSBZWVlZJywgLy8gU2VwdCAyMDE1XG5cdFx0XHRcdHF1YXJ0ZXI6ICdbUV1RIC0gWVlZWScsIC8vIFEzXG5cdFx0XHRcdHllYXI6ICdZWVlZJyAvLyAyMDE1XG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0dGlja3M6IHtcblx0XHRcdGF1dG9Ta2lwOiBmYWxzZSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaWNrcyBnZW5lcmF0aW9uIGlucHV0IHZhbHVlczpcblx0XHRcdCAqIC0gJ2F1dG8nOiBnZW5lcmF0ZXMgXCJvcHRpbWFsXCIgdGlja3MgYmFzZWQgb24gc2NhbGUgc2l6ZSBhbmQgdGltZSBvcHRpb25zLlxuXHRcdFx0ICogLSAnZGF0YSc6IGdlbmVyYXRlcyB0aWNrcyBmcm9tIGRhdGEgKGluY2x1ZGluZyBsYWJlbHMgZnJvbSBkYXRhIHt0fHh8eX0gb2JqZWN0cykuXG5cdFx0XHQgKiAtICdsYWJlbHMnOiBnZW5lcmF0ZXMgdGlja3MgZnJvbSB1c2VyIGdpdmVuIGBkYXRhLmxhYmVsc2AgdmFsdWVzIE9OTFkuXG5cdFx0XHQgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL3B1bGwvNDUwN1xuXHRcdFx0ICogQHNpbmNlIDIuNy4wXG5cdFx0XHQgKi9cblx0XHRcdHNvdXJjZTogJ2F1dG8nLFxuXG5cdFx0XHRtYWpvcjoge1xuXHRcdFx0XHRlbmFibGVkOiBmYWxzZVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHR2YXIgVGltZVNjYWxlID0gU2NhbGUuZXh0ZW5kKHtcblx0XHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICghbW9tZW50KSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignQ2hhcnQuanMgLSBNb21lbnQuanMgY291bGQgbm90IGJlIGZvdW5kISBZb3UgbXVzdCBpbmNsdWRlIGl0IGJlZm9yZSBDaGFydC5qcyB0byB1c2UgdGhlIHRpbWUgc2NhbGUuIERvd25sb2FkIGF0IGh0dHBzOi8vbW9tZW50anMuY29tJyk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubWVyZ2VUaWNrc09wdGlvbnMoKTtcblxuXHRcdFx0U2NhbGUucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzKTtcblx0XHR9LFxuXG5cdFx0dXBkYXRlOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgb3B0aW9ucyA9IG1lLm9wdGlvbnM7XG5cblx0XHRcdC8vIERFUFJFQ0FUSU9OUzogb3V0cHV0IGEgbWVzc2FnZSBvbmx5IG9uZSB0aW1lIHBlciB1cGRhdGVcblx0XHRcdGlmIChvcHRpb25zLnRpbWUgJiYgb3B0aW9ucy50aW1lLmZvcm1hdCkge1xuXHRcdFx0XHRjb25zb2xlLndhcm4oJ29wdGlvbnMudGltZS5mb3JtYXQgaXMgZGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgYnkgb3B0aW9ucy50aW1lLnBhcnNlci4nKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIFNjYWxlLnByb3RvdHlwZS51cGRhdGUuYXBwbHkobWUsIGFyZ3VtZW50cyk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEFsbG93cyBkYXRhIHRvIGJlIHJlZmVyZW5jZWQgdmlhICd0JyBhdHRyaWJ1dGVcblx0XHQgKi9cblx0XHRnZXRSaWdodFZhbHVlOiBmdW5jdGlvbihyYXdWYWx1ZSkge1xuXHRcdFx0aWYgKHJhd1ZhbHVlICYmIHJhd1ZhbHVlLnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyYXdWYWx1ZSA9IHJhd1ZhbHVlLnQ7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gU2NhbGUucHJvdG90eXBlLmdldFJpZ2h0VmFsdWUuY2FsbCh0aGlzLCByYXdWYWx1ZSk7XG5cdFx0fSxcblxuXHRcdGRldGVybWluZURhdGFMaW1pdHM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xuXHRcdFx0dmFyIHRpbWVPcHRzID0gbWUub3B0aW9ucy50aW1lO1xuXHRcdFx0dmFyIHVuaXQgPSB0aW1lT3B0cy51bml0IHx8ICdkYXknO1xuXHRcdFx0dmFyIG1pbiA9IE1BWF9JTlRFR0VSO1xuXHRcdFx0dmFyIG1heCA9IE1JTl9JTlRFR0VSO1xuXHRcdFx0dmFyIHRpbWVzdGFtcHMgPSBbXTtcblx0XHRcdHZhciBkYXRhc2V0cyA9IFtdO1xuXHRcdFx0dmFyIGxhYmVscyA9IFtdO1xuXHRcdFx0dmFyIGksIGosIGlsZW4sIGpsZW4sIGRhdGEsIHRpbWVzdGFtcDtcblxuXHRcdFx0Ly8gQ29udmVydCBsYWJlbHMgdG8gdGltZXN0YW1wc1xuXHRcdFx0Zm9yIChpID0gMCwgaWxlbiA9IGNoYXJ0LmRhdGEubGFiZWxzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0XHRsYWJlbHMucHVzaChwYXJzZShjaGFydC5kYXRhLmxhYmVsc1tpXSwgbWUpKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udmVydCBkYXRhIHRvIHRpbWVzdGFtcHNcblx0XHRcdGZvciAoaSA9IDAsIGlsZW4gPSAoY2hhcnQuZGF0YS5kYXRhc2V0cyB8fCBbXSkubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRcdGlmIChjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGkpKSB7XG5cdFx0XHRcdFx0ZGF0YSA9IGNoYXJ0LmRhdGEuZGF0YXNldHNbaV0uZGF0YTtcblxuXHRcdFx0XHRcdC8vIExldCdzIGNvbnNpZGVyIHRoYXQgYWxsIGRhdGEgaGF2ZSB0aGUgc2FtZSBmb3JtYXQuXG5cdFx0XHRcdFx0aWYgKGhlbHBlcnMuaXNPYmplY3QoZGF0YVswXSkpIHtcblx0XHRcdFx0XHRcdGRhdGFzZXRzW2ldID0gW107XG5cblx0XHRcdFx0XHRcdGZvciAoaiA9IDAsIGpsZW4gPSBkYXRhLmxlbmd0aDsgaiA8IGpsZW47ICsraikge1xuXHRcdFx0XHRcdFx0XHR0aW1lc3RhbXAgPSBwYXJzZShkYXRhW2pdLCBtZSk7XG5cdFx0XHRcdFx0XHRcdHRpbWVzdGFtcHMucHVzaCh0aW1lc3RhbXApO1xuXHRcdFx0XHRcdFx0XHRkYXRhc2V0c1tpXVtqXSA9IHRpbWVzdGFtcDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dGltZXN0YW1wcy5wdXNoLmFwcGx5KHRpbWVzdGFtcHMsIGxhYmVscyk7XG5cdFx0XHRcdFx0XHRkYXRhc2V0c1tpXSA9IGxhYmVscy5zbGljZSgwKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGF0YXNldHNbaV0gPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAobGFiZWxzLmxlbmd0aCkge1xuXHRcdFx0XHQvLyBTb3J0IGxhYmVscyAqKmFmdGVyKiogZGF0YSBoYXZlIGJlZW4gY29udmVydGVkXG5cdFx0XHRcdGxhYmVscyA9IGFycmF5VW5pcXVlKGxhYmVscykuc29ydChzb3J0ZXIpO1xuXHRcdFx0XHRtaW4gPSBNYXRoLm1pbihtaW4sIGxhYmVsc1swXSk7XG5cdFx0XHRcdG1heCA9IE1hdGgubWF4KG1heCwgbGFiZWxzW2xhYmVscy5sZW5ndGggLSAxXSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aW1lc3RhbXBzLmxlbmd0aCkge1xuXHRcdFx0XHR0aW1lc3RhbXBzID0gYXJyYXlVbmlxdWUodGltZXN0YW1wcykuc29ydChzb3J0ZXIpO1xuXHRcdFx0XHRtaW4gPSBNYXRoLm1pbihtaW4sIHRpbWVzdGFtcHNbMF0pO1xuXHRcdFx0XHRtYXggPSBNYXRoLm1heChtYXgsIHRpbWVzdGFtcHNbdGltZXN0YW1wcy5sZW5ndGggLSAxXSk7XG5cdFx0XHR9XG5cblx0XHRcdG1pbiA9IHBhcnNlKHRpbWVPcHRzLm1pbiwgbWUpIHx8IG1pbjtcblx0XHRcdG1heCA9IHBhcnNlKHRpbWVPcHRzLm1heCwgbWUpIHx8IG1heDtcblxuXHRcdFx0Ly8gSW4gY2FzZSB0aGVyZSBpcyBubyB2YWxpZCBtaW4vbWF4LCBzZXQgbGltaXRzIGJhc2VkIG9uIHVuaXQgdGltZSBvcHRpb25cblx0XHRcdG1pbiA9IG1pbiA9PT0gTUFYX0lOVEVHRVIgPyArbW9tZW50KCkuc3RhcnRPZih1bml0KSA6IG1pbjtcblx0XHRcdG1heCA9IG1heCA9PT0gTUlOX0lOVEVHRVIgPyArbW9tZW50KCkuZW5kT2YodW5pdCkgKyAxIDogbWF4O1xuXG5cdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCBtYXggaXMgc3RyaWN0bHkgaGlnaGVyIHRoYW4gbWluIChyZXF1aXJlZCBieSB0aGUgbG9va3VwIHRhYmxlKVxuXHRcdFx0bWUubWluID0gTWF0aC5taW4obWluLCBtYXgpO1xuXHRcdFx0bWUubWF4ID0gTWF0aC5tYXgobWluICsgMSwgbWF4KTtcblxuXHRcdFx0Ly8gUFJJVkFURVxuXHRcdFx0bWUuX2hvcml6b250YWwgPSBtZS5pc0hvcml6b250YWwoKTtcblx0XHRcdG1lLl90YWJsZSA9IFtdO1xuXHRcdFx0bWUuX3RpbWVzdGFtcHMgPSB7XG5cdFx0XHRcdGRhdGE6IHRpbWVzdGFtcHMsXG5cdFx0XHRcdGRhdGFzZXRzOiBkYXRhc2V0cyxcblx0XHRcdFx0bGFiZWxzOiBsYWJlbHNcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdGJ1aWxkVGlja3M6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBtaW4gPSBtZS5taW47XG5cdFx0XHR2YXIgbWF4ID0gbWUubWF4O1xuXHRcdFx0dmFyIG9wdGlvbnMgPSBtZS5vcHRpb25zO1xuXHRcdFx0dmFyIHRpbWVPcHRzID0gb3B0aW9ucy50aW1lO1xuXHRcdFx0dmFyIHRpbWVzdGFtcHMgPSBbXTtcblx0XHRcdHZhciB0aWNrcyA9IFtdO1xuXHRcdFx0dmFyIGksIGlsZW4sIHRpbWVzdGFtcDtcblxuXHRcdFx0c3dpdGNoIChvcHRpb25zLnRpY2tzLnNvdXJjZSkge1xuXHRcdFx0Y2FzZSAnZGF0YSc6XG5cdFx0XHRcdHRpbWVzdGFtcHMgPSBtZS5fdGltZXN0YW1wcy5kYXRhO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2xhYmVscyc6XG5cdFx0XHRcdHRpbWVzdGFtcHMgPSBtZS5fdGltZXN0YW1wcy5sYWJlbHM7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnYXV0byc6XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aW1lc3RhbXBzID0gZ2VuZXJhdGUobWluLCBtYXgsIG1lLmdldExhYmVsQ2FwYWNpdHkobWluKSwgb3B0aW9ucyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvcHRpb25zLmJvdW5kcyA9PT0gJ3RpY2tzJyAmJiB0aW1lc3RhbXBzLmxlbmd0aCkge1xuXHRcdFx0XHRtaW4gPSB0aW1lc3RhbXBzWzBdO1xuXHRcdFx0XHRtYXggPSB0aW1lc3RhbXBzW3RpbWVzdGFtcHMubGVuZ3RoIC0gMV07XG5cdFx0XHR9XG5cblx0XHRcdC8vIEVuZm9yY2UgbGltaXRzIHdpdGggdXNlciBtaW4vbWF4IG9wdGlvbnNcblx0XHRcdG1pbiA9IHBhcnNlKHRpbWVPcHRzLm1pbiwgbWUpIHx8IG1pbjtcblx0XHRcdG1heCA9IHBhcnNlKHRpbWVPcHRzLm1heCwgbWUpIHx8IG1heDtcblxuXHRcdFx0Ly8gUmVtb3ZlIHRpY2tzIG91dHNpZGUgdGhlIG1pbi9tYXggcmFuZ2Vcblx0XHRcdGZvciAoaSA9IDAsIGlsZW4gPSB0aW1lc3RhbXBzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xuXHRcdFx0XHR0aW1lc3RhbXAgPSB0aW1lc3RhbXBzW2ldO1xuXHRcdFx0XHRpZiAodGltZXN0YW1wID49IG1pbiAmJiB0aW1lc3RhbXAgPD0gbWF4KSB7XG5cdFx0XHRcdFx0dGlja3MucHVzaCh0aW1lc3RhbXApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdG1lLm1pbiA9IG1pbjtcblx0XHRcdG1lLm1heCA9IG1heDtcblxuXHRcdFx0Ly8gUFJJVkFURVxuXHRcdFx0bWUuX3VuaXQgPSB0aW1lT3B0cy51bml0IHx8IGRldGVybWluZVVuaXRGb3JGb3JtYXR0aW5nKHRpY2tzLCB0aW1lT3B0cy5taW5Vbml0LCBtZS5taW4sIG1lLm1heCk7XG5cdFx0XHRtZS5fbWFqb3JVbml0ID0gZGV0ZXJtaW5lTWFqb3JVbml0KG1lLl91bml0KTtcblx0XHRcdG1lLl90YWJsZSA9IGJ1aWxkTG9va3VwVGFibGUobWUuX3RpbWVzdGFtcHMuZGF0YSwgbWluLCBtYXgsIG9wdGlvbnMuZGlzdHJpYnV0aW9uKTtcblx0XHRcdG1lLl9vZmZzZXRzID0gY29tcHV0ZU9mZnNldHMobWUuX3RhYmxlLCB0aWNrcywgbWluLCBtYXgsIG9wdGlvbnMpO1xuXHRcdFx0bWUuX2xhYmVsRm9ybWF0ID0gZGV0ZXJtaW5lTGFiZWxGb3JtYXQobWUuX3RpbWVzdGFtcHMuZGF0YSwgdGltZU9wdHMpO1xuXG5cdFx0XHRyZXR1cm4gdGlja3NGcm9tVGltZXN0YW1wcyh0aWNrcywgbWUuX21ham9yVW5pdCk7XG5cdFx0fSxcblxuXHRcdGdldExhYmVsRm9ySW5kZXg6IGZ1bmN0aW9uKGluZGV4LCBkYXRhc2V0SW5kZXgpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgZGF0YSA9IG1lLmNoYXJ0LmRhdGE7XG5cdFx0XHR2YXIgdGltZU9wdHMgPSBtZS5vcHRpb25zLnRpbWU7XG5cdFx0XHR2YXIgbGFiZWwgPSBkYXRhLmxhYmVscyAmJiBpbmRleCA8IGRhdGEubGFiZWxzLmxlbmd0aCA/IGRhdGEubGFiZWxzW2luZGV4XSA6ICcnO1xuXHRcdFx0dmFyIHZhbHVlID0gZGF0YS5kYXRhc2V0c1tkYXRhc2V0SW5kZXhdLmRhdGFbaW5kZXhdO1xuXG5cdFx0XHRpZiAoaGVscGVycy5pc09iamVjdCh2YWx1ZSkpIHtcblx0XHRcdFx0bGFiZWwgPSBtZS5nZXRSaWdodFZhbHVlKHZhbHVlKTtcblx0XHRcdH1cblx0XHRcdGlmICh0aW1lT3B0cy50b29sdGlwRm9ybWF0KSB7XG5cdFx0XHRcdHJldHVybiBtb21lbnRpZnkobGFiZWwsIHRpbWVPcHRzKS5mb3JtYXQodGltZU9wdHMudG9vbHRpcEZvcm1hdCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodHlwZW9mIGxhYmVsID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRyZXR1cm4gbGFiZWw7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtb21lbnRpZnkobGFiZWwsIHRpbWVPcHRzKS5mb3JtYXQobWUuX2xhYmVsRm9ybWF0KTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogRnVuY3Rpb24gdG8gZm9ybWF0IGFuIGluZGl2aWR1YWwgdGljayBtYXJrXG5cdFx0ICogQHByaXZhdGVcblx0XHQgKi9cblx0XHR0aWNrRm9ybWF0RnVuY3Rpb246IGZ1bmN0aW9uKHRpY2ssIGluZGV4LCB0aWNrcywgZm9ybWF0T3ZlcnJpZGUpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgb3B0aW9ucyA9IG1lLm9wdGlvbnM7XG5cdFx0XHR2YXIgdGltZSA9IHRpY2sudmFsdWVPZigpO1xuXHRcdFx0dmFyIGZvcm1hdHMgPSBvcHRpb25zLnRpbWUuZGlzcGxheUZvcm1hdHM7XG5cdFx0XHR2YXIgbWlub3JGb3JtYXQgPSBmb3JtYXRzW21lLl91bml0XTtcblx0XHRcdHZhciBtYWpvclVuaXQgPSBtZS5fbWFqb3JVbml0O1xuXHRcdFx0dmFyIG1ham9yRm9ybWF0ID0gZm9ybWF0c1ttYWpvclVuaXRdO1xuXHRcdFx0dmFyIG1ham9yVGltZSA9IHRpY2suY2xvbmUoKS5zdGFydE9mKG1ham9yVW5pdCkudmFsdWVPZigpO1xuXHRcdFx0dmFyIG1ham9yVGlja09wdHMgPSBvcHRpb25zLnRpY2tzLm1ham9yO1xuXHRcdFx0dmFyIG1ham9yID0gbWFqb3JUaWNrT3B0cy5lbmFibGVkICYmIG1ham9yVW5pdCAmJiBtYWpvckZvcm1hdCAmJiB0aW1lID09PSBtYWpvclRpbWU7XG5cdFx0XHR2YXIgbGFiZWwgPSB0aWNrLmZvcm1hdChmb3JtYXRPdmVycmlkZSA/IGZvcm1hdE92ZXJyaWRlIDogbWFqb3IgPyBtYWpvckZvcm1hdCA6IG1pbm9yRm9ybWF0KTtcblx0XHRcdHZhciB0aWNrT3B0cyA9IG1ham9yID8gbWFqb3JUaWNrT3B0cyA6IG9wdGlvbnMudGlja3MubWlub3I7XG5cdFx0XHR2YXIgZm9ybWF0dGVyID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdCh0aWNrT3B0cy5jYWxsYmFjaywgdGlja09wdHMudXNlckNhbGxiYWNrKTtcblxuXHRcdFx0cmV0dXJuIGZvcm1hdHRlciA/IGZvcm1hdHRlcihsYWJlbCwgaW5kZXgsIHRpY2tzKSA6IGxhYmVsO1xuXHRcdH0sXG5cblx0XHRjb252ZXJ0VGlja3NUb0xhYmVsczogZnVuY3Rpb24odGlja3MpIHtcblx0XHRcdHZhciBsYWJlbHMgPSBbXTtcblx0XHRcdHZhciBpLCBpbGVuO1xuXG5cdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0gdGlja3MubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XG5cdFx0XHRcdGxhYmVscy5wdXNoKHRoaXMudGlja0Zvcm1hdEZ1bmN0aW9uKG1vbWVudCh0aWNrc1tpXS52YWx1ZSksIGksIHRpY2tzKSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBsYWJlbHM7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0Z2V0UGl4ZWxGb3JPZmZzZXQ6IGZ1bmN0aW9uKHRpbWUpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgc2l6ZSA9IG1lLl9ob3Jpem9udGFsID8gbWUud2lkdGggOiBtZS5oZWlnaHQ7XG5cdFx0XHR2YXIgc3RhcnQgPSBtZS5faG9yaXpvbnRhbCA/IG1lLmxlZnQgOiBtZS50b3A7XG5cdFx0XHR2YXIgcG9zID0gaW50ZXJwb2xhdGUobWUuX3RhYmxlLCAndGltZScsIHRpbWUsICdwb3MnKTtcblxuXHRcdFx0cmV0dXJuIHN0YXJ0ICsgc2l6ZSAqIChtZS5fb2Zmc2V0cy5sZWZ0ICsgcG9zKSAvIChtZS5fb2Zmc2V0cy5sZWZ0ICsgMSArIG1lLl9vZmZzZXRzLnJpZ2h0KTtcblx0XHR9LFxuXG5cdFx0Z2V0UGl4ZWxGb3JWYWx1ZTogZnVuY3Rpb24odmFsdWUsIGluZGV4LCBkYXRhc2V0SW5kZXgpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgdGltZSA9IG51bGw7XG5cblx0XHRcdGlmIChpbmRleCAhPT0gdW5kZWZpbmVkICYmIGRhdGFzZXRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRpbWUgPSBtZS5fdGltZXN0YW1wcy5kYXRhc2V0c1tkYXRhc2V0SW5kZXhdW2luZGV4XTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRpbWUgPT09IG51bGwpIHtcblx0XHRcdFx0dGltZSA9IHBhcnNlKHZhbHVlLCBtZSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aW1lICE9PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybiBtZS5nZXRQaXhlbEZvck9mZnNldCh0aW1lKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Z2V0UGl4ZWxGb3JUaWNrOiBmdW5jdGlvbihpbmRleCkge1xuXHRcdFx0dmFyIHRpY2tzID0gdGhpcy5nZXRUaWNrcygpO1xuXHRcdFx0cmV0dXJuIGluZGV4ID49IDAgJiYgaW5kZXggPCB0aWNrcy5sZW5ndGggP1xuXHRcdFx0XHR0aGlzLmdldFBpeGVsRm9yT2Zmc2V0KHRpY2tzW2luZGV4XS52YWx1ZSkgOlxuXHRcdFx0XHRudWxsO1xuXHRcdH0sXG5cblx0XHRnZXRWYWx1ZUZvclBpeGVsOiBmdW5jdGlvbihwaXhlbCkge1xuXHRcdFx0dmFyIG1lID0gdGhpcztcblx0XHRcdHZhciBzaXplID0gbWUuX2hvcml6b250YWwgPyBtZS53aWR0aCA6IG1lLmhlaWdodDtcblx0XHRcdHZhciBzdGFydCA9IG1lLl9ob3Jpem9udGFsID8gbWUubGVmdCA6IG1lLnRvcDtcblx0XHRcdHZhciBwb3MgPSAoc2l6ZSA/IChwaXhlbCAtIHN0YXJ0KSAvIHNpemUgOiAwKSAqIChtZS5fb2Zmc2V0cy5sZWZ0ICsgMSArIG1lLl9vZmZzZXRzLmxlZnQpIC0gbWUuX29mZnNldHMucmlnaHQ7XG5cdFx0XHR2YXIgdGltZSA9IGludGVycG9sYXRlKG1lLl90YWJsZSwgJ3BvcycsIHBvcywgJ3RpbWUnKTtcblxuXHRcdFx0cmV0dXJuIG1vbWVudCh0aW1lKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQ3J1ZGUgYXBwcm94aW1hdGlvbiBvZiB3aGF0IHRoZSBsYWJlbCB3aWR0aCBtaWdodCBiZVxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0Z2V0TGFiZWxXaWR0aDogZnVuY3Rpb24obGFiZWwpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cdFx0XHR2YXIgdGlja3NPcHRzID0gbWUub3B0aW9ucy50aWNrcztcblx0XHRcdHZhciB0aWNrTGFiZWxXaWR0aCA9IG1lLmN0eC5tZWFzdXJlVGV4dChsYWJlbCkud2lkdGg7XG5cdFx0XHR2YXIgYW5nbGUgPSBoZWxwZXJzLnRvUmFkaWFucyh0aWNrc09wdHMubWF4Um90YXRpb24pO1xuXHRcdFx0dmFyIGNvc1JvdGF0aW9uID0gTWF0aC5jb3MoYW5nbGUpO1xuXHRcdFx0dmFyIHNpblJvdGF0aW9uID0gTWF0aC5zaW4oYW5nbGUpO1xuXHRcdFx0dmFyIHRpY2tGb250U2l6ZSA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQodGlja3NPcHRzLmZvbnRTaXplLCBkZWZhdWx0cy5nbG9iYWwuZGVmYXVsdEZvbnRTaXplKTtcblxuXHRcdFx0cmV0dXJuICh0aWNrTGFiZWxXaWR0aCAqIGNvc1JvdGF0aW9uKSArICh0aWNrRm9udFNpemUgKiBzaW5Sb3RhdGlvbik7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEBwcml2YXRlXG5cdFx0ICovXG5cdFx0Z2V0TGFiZWxDYXBhY2l0eTogZnVuY3Rpb24oZXhhbXBsZVRpbWUpIHtcblx0XHRcdHZhciBtZSA9IHRoaXM7XG5cblx0XHRcdHZhciBmb3JtYXRPdmVycmlkZSA9IG1lLm9wdGlvbnMudGltZS5kaXNwbGF5Rm9ybWF0cy5taWxsaXNlY29uZDtcdC8vIFBpY2sgdGhlIGxvbmdlc3QgZm9ybWF0IGZvciBndWVzdGltYXRpb25cblxuXHRcdFx0dmFyIGV4YW1wbGVMYWJlbCA9IG1lLnRpY2tGb3JtYXRGdW5jdGlvbihtb21lbnQoZXhhbXBsZVRpbWUpLCAwLCBbXSwgZm9ybWF0T3ZlcnJpZGUpO1xuXHRcdFx0dmFyIHRpY2tMYWJlbFdpZHRoID0gbWUuZ2V0TGFiZWxXaWR0aChleGFtcGxlTGFiZWwpO1xuXHRcdFx0dmFyIGlubmVyV2lkdGggPSBtZS5pc0hvcml6b250YWwoKSA/IG1lLndpZHRoIDogbWUuaGVpZ2h0O1xuXG5cdFx0XHR2YXIgY2FwYWNpdHkgPSBNYXRoLmZsb29yKGlubmVyV2lkdGggLyB0aWNrTGFiZWxXaWR0aCk7XG5cdFx0XHRyZXR1cm4gY2FwYWNpdHkgPiAwID8gY2FwYWNpdHkgOiAxO1xuXHRcdH1cblx0fSk7XG5cblx0c2NhbGVTZXJ2aWNlLnJlZ2lzdGVyU2NhbGVUeXBlKCd0aW1lJywgVGltZVNjYWxlLCBkZWZhdWx0Q29uZmlnKTtcbn07XG5cbn0se1wiMVwiOjEsXCIyNlwiOjI2LFwiMzNcIjozMyxcIjM0XCI6MzQsXCI0NlwiOjQ2fV19LHt9LFs3XSkoNylcbn0pO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL0NoYXJ0LmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7\n");
|
|
|
|
/***/ })
|
|
|
|
/******/ }); |