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/*!\r\n * Chart.js\r\n * http://chartjs.org/\r\n * Version: 2.7.3\r\n *\r\n * Copyright 2018 Chart.js Contributors\r\n * Released under the MIT license\r\n * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md\r\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/**\r\n * Ported from sass implementation in C\r\n * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\r\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\r\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\r\n a conversion for the space, fetch it, otherwise\r\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/**\r\n * @namespace Chart\r\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/**\r\n * Provided for backward compatibility, not available anymore\r\n * @namespace Chart.Legend\r\n * @deprecated since version 2.1.5\r\n * @todo remove at version 3\r\n * @private\r\n */\n\t\t\tChart.Legend = plugins.legend._element;\n\n\t\t\t/**\r\n * Provided for backward compatibility, not available anymore\r\n * @namespace Chart.Title\r\n * @deprecated since version 2.1.5\r\n * @todo remove at version 3\r\n * @private\r\n */\n\t\t\tChart.Title = plugins.title._element;\n\n\t\t\t/**\r\n * Provided for backward compatibility, use Chart.plugins instead\r\n * @namespace Chart.pluginService\r\n * @deprecated since version 2.1.5\r\n * @todo remove at version 3\r\n * @private\r\n */\n\t\t\tChart.pluginService = Chart.plugins;\n\n\t\t\t/**\r\n * Provided for backward compatibility, inheriting from Chart.PlugingBase has no\r\n * effect, instead simply create/register plugins via plain JavaScript objects.\r\n * @interface Chart.PluginBase\r\n * @deprecated since version 2.5.0\r\n * @todo remove at version 3\r\n * @private\r\n */\n\t\t\tChart.PluginBase = Chart.Element.extend({});\n\n\t\t\t/**\r\n * Provided for backward compatibility, use Chart.helpers.canvas instead.\r\n * @namespace Chart.canvasHelpers\r\n * @deprecated since version 2.6.0\r\n * @todo remove at version 3\r\n * @private\r\n */\n\t\t\tChart.canvasHelpers = Chart.helpers.canvas;\n\n\t\t\t/**\r\n * Provided for backward compatibility, use Chart.layouts instead.\r\n * @namespace Chart.layoutService\r\n * @deprecated since version 2.8.0\r\n * @todo remove at version 3\r\n * @private\r\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/**\r\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\r\n * @private\r\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/**\r\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\r\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\r\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\r\n * @private\r\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/**\r\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\r\n * percentage options are 1), based on the previous and following categories. This mode\r\n * generates bars with different widths when data are not evenly spaced.\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * Returns the stacks based on groups and bar visibility.\r\n * @param {Number} [last] - The dataset index\r\n * @returns {Array} The stack list\r\n * @private\r\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/**\r\n * Returns the effective number of stacks based on groups and bar visibility.\r\n * @private\r\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/**\r\n * Returns the stack index for the given dataset based on groups and bar visibility.\r\n * @param {Number} [datasetIndex] - The dataset index\r\n * @param {String} [name] - The stack name to find\r\n * @returns {Number} The stack index\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * Note: pixel values are not clamped to the scale area.\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * @protected\r\n */\n\t\t\t\t\tdataElementType: elements.Point,\n\n\t\t\t\t\t/**\r\n * @protected\r\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/**\r\n * @protected\r\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/**\r\n * @protected\r\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/**\r\n * @private\r\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) {\r\n \ttotal = NaN;\r\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/**\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * Provided for backward compatibility, use Chart.Animation instead\r\n * @prop Chart.Animation#animationObject\r\n * @deprecated since version 2.6.0\r\n * @todo remove at version 3\r\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/**\r\n * Provided for backward compatibility, use Chart.Animation#chart instead\r\n * @prop Chart.Animation#chartInstance\r\n * @deprecated since version 2.6.0\r\n * @todo remove at version 3\r\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/**\r\n * @param {Chart} chart - The chart to animate.\r\n * @param {Chart.Animation} animation - The animation that we will animate.\r\n * @param {Number} duration - The animation duration in ms.\r\n * @param {Boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions\r\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/**\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * Initializes the given config with global and chart default values.\r\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/**\r\n * Updates the config of the chart\r\n * @param chart {Chart} chart to update the options for\r\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/**\r\n * @private\r\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/**\r\n * Provided for backward compatibility, Chart and Chart.Controller have been merged,\r\n * the \"instance\" still need to be defined since it might be called from plugins.\r\n * @prop Chart#chart\r\n * @deprecated since version 2.6.0\r\n * @todo remove at version 3\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * Builds a map of scale ID to scale object for future lookup.\r\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/**\r\n * Reset the elements of all datasets\r\n * @private\r\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/**\r\n * Resets the chart back to it's state before the initial animation\r\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/**\r\n * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\r\n * hook, in which case, plugins will not be called on `afterLayout`.\r\n * @private\r\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/**\r\n * Provided for backward compatibility, use `afterLayout` instead.\r\n * @method IPlugin#afterScaleUpdate\r\n * @deprecated since version 2.5.0\r\n * @todo remove at version 3\r\n * @private\r\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/**\r\n * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\r\n * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\r\n * @private\r\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/**\r\n * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\r\n * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\r\n * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\r\n * @private\r\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/**\r\n * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\r\n * hook, in which case, plugins will not be called on `afterDatasetDraw`.\r\n * @private\r\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/**\r\n * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw`\r\n * hook, in which case, plugins will not be called on `afterTooltipDraw`.\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * Handle an event\r\n * @private\r\n * @param {IEvent} event the event to handle\r\n * @return {Boolean} true if the chart needs to re-render\r\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/**\r\n * Provided for backward compatibility, use Chart instead.\r\n * @class Chart.Controller\r\n * @deprecated since version 2.6.0\r\n * @todo remove at version 3\r\n * @private\r\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/**\r\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\r\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\r\n * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments.\r\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/**\r\n * Removes the given array event listener and cleanup extra attached properties (such as\r\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\r\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/**\r\n * Element type used to generate a meta dataset (e.g. Chart.element.Line).\r\n * @type {Chart.core.element}\r\n */\n\t\t\t\t\tdatasetElementType: null,\n\n\t\t\t\t\t/**\r\n * Element type used to generate a meta data (e.g. Chart.element.Point).\r\n * @type {Chart.core.element}\r\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/**\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * Returns if the given value contains an effective constraint.\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * Helper function to get relative position for an event\r\n * @param {Event|IEvent} event - The event to get the position for\r\n * @param {Chart} chart - The chart\r\n * @returns {Point} the event position\r\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/**\r\n * Helper function to traverse all of the visible elements in the chart\r\n * @param chart {chart} the chart\r\n * @param handler {Function} the callback to execute for each visible item\r\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/**\r\n * Helper function to get the items that intersect the event position\r\n * @param items {ChartElement[]} elements to filter\r\n * @param position {Point} the point to be nearest to\r\n * @return {ChartElement[]} the nearest items\r\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/**\r\n * Helper function to get the items nearest to the event position considering all visible items in teh chart\r\n * @param chart {Chart} the chart to look at elements from\r\n * @param position {Point} the point to be nearest to\r\n * @param intersect {Boolean} if true, only consider items that intersect the position\r\n * @param distanceMetric {Function} function to provide the distance between points\r\n * @return {ChartElement[]} the nearest items\r\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/**\r\n * Get a distance metric function for two points based on the\r\n * axis mode setting\r\n * @param {String} axis the axis mode. x|y|xy\r\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/**\r\n * @interface IInteractionOptions\r\n */\n\t\t\t/**\r\n * If true, only consider items that intersect the point\r\n * @name IInterfaceOptions#boolean\r\n * @type Boolean\r\n */\n\n\t\t\t/**\r\n * Contains interaction related functions\r\n * @namespace Chart.Interaction\r\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/**\r\n * @function Chart.Interaction.modes.label\r\n * @deprecated since version 2.4.0\r\n * @todo remove at version 3\r\n * @private\r\n */\n\t\t\t\t\tlabel: indexMode,\n\n\t\t\t\t\t/**\r\n * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\r\n * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\r\n * @function Chart.Interaction.modes.index\r\n * @since v2.4.0\r\n * @param chart {chart} the chart we are returning items from\r\n * @param e {Event} the event we are find things at\r\n * @param options {IInteractionOptions} options to use during interaction\r\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\r\n */\n\t\t\t\t\tindex: indexMode,\n\n\t\t\t\t\t/**\r\n * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\r\n * If the options.intersect is false, we find the nearest item and return the items in that dataset\r\n * @function Chart.Interaction.modes.dataset\r\n * @param chart {chart} the chart we are returning items from\r\n * @param e {Event} the event we are find things at\r\n * @param options {IInteractionOptions} options to use during interaction\r\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\r\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/**\r\n * @function Chart.Interaction.modes.x-axis\r\n * @deprecated since version 2.4.0. Use index mode and intersect == true\r\n * @todo remove at version 3\r\n * @private\r\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/**\r\n * Point mode returns all elements that hit test based on the event position\r\n * of the event\r\n * @function Chart.Interaction.modes.intersect\r\n * @param chart {chart} the chart we are returning items from\r\n * @param e {Event} the event we are find things at\r\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\r\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/**\r\n * nearest mode returns the element closest to the point\r\n * @function Chart.Interaction.modes.intersect\r\n * @param chart {chart} the chart we are returning items from\r\n * @param e {Event} the event we are find things at\r\n * @param options {IInteractionOptions} options to use\r\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\r\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/**\r\n * x mode returns the elements that hit-test at the current x coordinate\r\n * @function Chart.Interaction.modes.x\r\n * @param chart {chart} the chart we are returning items from\r\n * @param e {Event} the event we are find things at\r\n * @param options {IInteractionOptions} options to use\r\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\r\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/**\r\n * y mode returns the elements that hit-test at the current y coordinate\r\n * @function Chart.Interaction.modes.y\r\n * @param chart {chart} the chart we are returning items from\r\n * @param e {Event} the event we are find things at\r\n * @param options {IInteractionOptions} options to use\r\n * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\r\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/**\r\n * @interface ILayoutItem\r\n * @prop {String} position - The position of the item in the chart layout. Possible values are\r\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\r\n * @prop {Number} weight - The weight used to sort the item. Higher weights are further away from the chart area\r\n * @prop {Boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down\r\n * @prop {Function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\r\n * @prop {Function} update - Takes two parameters: width and height. Returns size of item\r\n * @prop {Function} getPadding - Returns an object with padding on the edges\r\n * @prop {Number} width - Width of item. Must be valid after update()\r\n * @prop {Number} height - Height of item. Must be valid after update()\r\n * @prop {Number} left - Left edge of the item. Set by layout system and cannot be used in update\r\n * @prop {Number} top - Top edge of the item. Set by layout system and cannot be used in update\r\n * @prop {Number} right - Right edge of the item. Set by layout system and cannot be used in update\r\n * @prop {Number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\r\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/**\r\n * Register a box to a chart.\r\n * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\r\n * @param {Chart} chart - the chart to use\r\n * @param {ILayoutItem} item - the item to add to be layed out\r\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/**\r\n * Remove a layoutItem from a chart\r\n * @param {Chart} chart - the chart to remove the box from\r\n * @param {Object} layoutItem - the item to remove from the layout\r\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/**\r\n * Sets (or updates) options on the given `item`.\r\n * @param {Chart} chart - the chart in which the item lives (or will be added to)\r\n * @param {Object} item - the item to configure with the given options\r\n * @param {Object} options - the new item options.\r\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/**\r\n * Fits boxes of the given chart into the given size by having each box measure itself\r\n * then running a fitting algorithm\r\n * @param {Chart} chart - the chart\r\n * @param {Number} width - the width to fit into\r\n * @param {Number} height - the height to fit into\r\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/**\r\n * The plugin service singleton\r\n * @namespace Chart.plugins\r\n * @since 2.1.0\r\n */\n\t\t\tmodule.exports = {\n\t\t\t\t/**\r\n * Globally registered plugins.\r\n * @private\r\n */\n\t\t\t\t_plugins: [],\n\n\t\t\t\t/**\r\n * This identifier is used to invalidate the descriptors cache attached to each chart\r\n * when a global plugin is registered or unregistered. In this case, the cache ID is\r\n * incremented and descriptors are regenerated during following API calls.\r\n * @private\r\n */\n\t\t\t\t_cacheId: 0,\n\n\t\t\t\t/**\r\n * Registers the given plugin(s) if not already registered.\r\n * @param {Array|Object} plugins plugin instance(s).\r\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/**\r\n * Unregisters the given plugin(s) only if registered.\r\n * @param {Array|Object} plugins plugin instance(s).\r\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/**\r\n * Remove all registered plugins.\r\n * @since 2.1.5\r\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/**\r\n * Returns the number of registered plugins?\r\n * @returns {Number}\r\n * @since 2.1.5\r\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/**\r\n * Returns all registered plugin instances.\r\n * @returns {Array} array of plugin objects.\r\n * @since 2.1.5\r\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/**\r\n * Calls enabled plugins for `chart` on the specified hook and with the given args.\r\n * This method immediately returns as soon as a plugin explicitly returns false. The\r\n * returned value can be used, for instance, to interrupt the current action.\r\n * @param {Object} chart - The chart instance for which plugins should be called.\r\n * @param {String} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\r\n * @param {Array} [args] - Extra arguments to apply to the hook call.\r\n * @returns {Boolean} false if any of the plugins return false, else returns true.\r\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/**\r\n * Returns descriptors of enabled plugins for the given chart.\r\n * @returns {Array} [{ plugin, options }]\r\n * @private\r\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/**\r\n * Invalidates cache for the given chart: descriptors hold a reference on plugin option,\r\n * but in some cases, this reference can be changed by the user when updating options.\r\n * https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\r\n * @private\r\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/**\r\n * Plugin extension hooks.\r\n * @interface IPlugin\r\n * @since 2.1.0\r\n */\n\t\t\t/**\r\n * @method IPlugin#beforeInit\r\n * @desc Called before initializing `chart`.\r\n * @param {Chart.Controller} chart - The chart instance.\r\n * @param {Object} options - The plugin options.\r\n */\n\t\t\t/**\r\n * @method IPlugin#afterInit\r\n * @desc Called after `chart` has been initialized and before the first update.\r\n * @param {Chart.Controller} chart - The chart instance.\r\n * @param {Object} options - The plugin options.\r\n */\n\t\t\t/**\r\n * @method IPlugin#beforeUpdate\r\n * @desc Called before updating `chart`. If any plugin returns `false`, the update\r\n * is cancelled (and thus subsequent render(s)) until another `update` is triggered.\r\n * @param {Chart.Controller} chart - The chart instance.\r\n * @param {Object} options - The plugin options.\r\n * @returns {Boolean} `false` to cancel the chart update.\r\n */\n\t\t\t/**\r\n * @method IPlugin#afterUpdate\r\n * @desc Called after `chart` has been updated and before rendering. Note that this\r\n * hook will not be called if the chart update has been previously cancelled.\r\n * @param {Chart.Controller} chart - The chart instance.\r\n * @param {Object} options - The plugin options.\r\n */\n\t\t\t/**\r\n * @method IPlugin#beforeDatasetsUpdate\r\n * @desc Called before updating the `chart` datasets. If any plugin returns `false`,\r\n * the datasets update is cancelled until another `update` is triggered.\r\n * @param {Chart.Controller} chart - The chart instance.\r\n * @param {Object} options - The plugin options.\r\n * @returns {Boolean} false to cancel the datasets update.\r\n * @since version 2.1.5\r\n */\n\t\t\t/**\r\n * @method IPlugin#afterDatasetsUpdate\r\n * @desc Called after the `chart` datasets have been updated. Note that this hook\r\n * will not be called if the datasets update has been previously cancelled.\r\n * @param {Chart.Controller} chart - The chart instance.\r\n * @param {Object} options - The plugin options.\r\n * @since version 2.1.5\r\n */\n\t\t\t/**\r\n * @method IPlugin#beforeDatasetUpdate\r\n * @desc Called before updating the `chart` dataset at the given `args.index`. If any plugin\r\n * returns `false`, the datasets update is cancelled until another `update` is triggered.\r\n * @param {Chart} chart - The chart instance.\r\n * @param {Object} args - The call arguments.\r\n * @param {Number} args.index - The dataset index.\r\n * @param {Object} args.meta - The dataset metadata.\r\n * @param {Object} options - The plugin options.\r\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\r\n */\n\t\t\t/**\r\n * @method IPlugin#afterDatasetUpdate\r\n * @desc Called after the `chart` datasets at the given `args.index` has been updated. Note\r\n * that this hook will not be called if the datasets update has been previously cancelled.\r\n * @param {Chart} chart - The chart instance.\r\n * @param {Object} args - The call arguments.\r\n * @param {Number} args.index - The dataset index.\r\n * @param {Object} args.meta - The dataset metadata.\r\n * @param {Object} options - The plugin options.\r\n */\n\t\t\t/**\r\n * @method IPlugin#beforeLayout\r\n * @desc Called before laying out `chart`. If any plugin returns `false`,\r\n * the layout update is cancelled until another `update` is triggered.\r\n * @param {Chart.Controller} chart - The chart instance.\r\n * @param {Object} options - The plugin options.\r\n * @returns {Boolean} `false` to cancel the chart layout.\r\n */\n\t\t\t/**\r\n * @method IPlugin#afterLayout\r\n * @desc Called after the `chart` has been layed out. Note that this hook will not\r\n * be called if the layout update has been previously cancelled.\r\n * @param {Chart.Controller} chart - The chart instance.\r\n * @param {Object} options - The plugin options.\r\n */\n\t\t\t/**\r\n * @method IPlugin#beforeRender\r\n * @desc Called before rendering `chart`. If any plugin returns `false`,\r\n * the rendering is cancelled until another `render` is triggered.\r\n * @param {Chart.Controller} chart - The chart instance.\r\n * @param {Object} options - The plugin options.\r\n * @returns {Boolean} `false` to cancel the chart rendering.\r\n */\n\t\t\t/**\r\n * @method IPlugin#afterRender\r\n * @desc Called after the `chart` has been fully rendered (and animation completed). Note\r\n * that this hook will not be called if the rendering has been previously cancelled.\r\n * @param {Chart.Controller} chart - The chart instance.\r\n * @param {Object} options - The plugin options.\r\n */\n\t\t\t/**\r\n * @method IPlugin#beforeDraw\r\n * @desc Called before drawing `chart` at every animation frame specified by the given\r\n * easing value. If any plugin returns `false`, the frame drawing is cancelled until\r\n * another `render` is triggered.\r\n * @param {Chart.Controller} chart - The chart instance.\r\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\r\n * @param {Object} options - The plugin options.\r\n * @returns {Boolean} `false` to cancel the chart drawing.\r\n */\n\t\t\t/**\r\n * @method IPlugin#afterDraw\r\n * @desc Called after the `chart` has been drawn for the specific easing value. Note\r\n * that this hook will not be called if the drawing has been previously cancelled.\r\n * @param {Chart.Controller} chart - The chart instance.\r\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\r\n * @param {Object} options - The plugin options.\r\n */\n\t\t\t/**\r\n * @method IPlugin#beforeDatasetsDraw\r\n * @desc Called before drawing the `chart` datasets. If any plugin returns `false`,\r\n * the datasets drawing is cancelled until another `render` is triggered.\r\n * @param {Chart.Controller} chart - The chart instance.\r\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\r\n * @param {Object} options - The plugin options.\r\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\r\n */\n\t\t\t/**\r\n * @method IPlugin#afterDatasetsDraw\r\n * @desc Called after the `chart` datasets have been drawn. Note that this hook\r\n * will not be called if the datasets drawing has been previously cancelled.\r\n * @param {Chart.Controller} chart - The chart instance.\r\n * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\r\n * @param {Object} options - The plugin options.\r\n */\n\t\t\t/**\r\n * @method IPlugin#beforeDatasetDraw\r\n * @desc Called before drawing the `chart` dataset at the given `args.index` (datasets\r\n * are drawn in the reverse order). If any plugin returns `false`, the datasets drawing\r\n * is cancelled until another `render` is triggered.\r\n * @param {Chart} chart - The chart instance.\r\n * @param {Object} args - The call arguments.\r\n * @param {Number} args.index - The dataset index.\r\n * @param {Object} args.meta - The dataset metadata.\r\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\r\n * @param {Object} options - The plugin options.\r\n * @returns {Boolean} `false` to cancel the chart datasets drawing.\r\n */\n\t\t\t/**\r\n * @method IPlugin#afterDatasetDraw\r\n * @desc Called after the `chart` datasets at the given `args.index` have been drawn\r\n * (datasets are drawn in the reverse order). Note that this hook will not be called\r\n * if the datasets drawing has been previously cancelled.\r\n * @param {Chart} chart - The chart instance.\r\n * @param {Object} args - The call arguments.\r\n * @param {Number} args.index - The dataset index.\r\n * @param {Object} args.meta - The dataset metadata.\r\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\r\n * @param {Object} options - The plugin options.\r\n */\n\t\t\t/**\r\n * @method IPlugin#beforeTooltipDraw\r\n * @desc Called before drawing the `tooltip`. If any plugin returns `false`,\r\n * the tooltip drawing is cancelled until another `render` is triggered.\r\n * @param {Chart} chart - The chart instance.\r\n * @param {Object} args - The call arguments.\r\n * @param {Object} args.tooltip - The tooltip.\r\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\r\n * @param {Object} options - The plugin options.\r\n * @returns {Boolean} `false` to cancel the chart tooltip drawing.\r\n */\n\t\t\t/**\r\n * @method IPlugin#afterTooltipDraw\r\n * @desc Called after drawing the `tooltip`. Note that this hook will not\r\n * be called if the tooltip drawing has been previously cancelled.\r\n * @param {Chart} chart - The chart instance.\r\n * @param {Object} args - The call arguments.\r\n * @param {Object} args.tooltip - The tooltip.\r\n * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\r\n * @param {Object} options - The plugin options.\r\n */\n\t\t\t/**\r\n * @method IPlugin#beforeEvent\r\n * @desc Called before processing the specified `event`. If any plugin returns `false`,\r\n * the event will be discarded.\r\n * @param {Chart.Controller} chart - The chart instance.\r\n * @param {IEvent} event - The event object.\r\n * @param {Object} options - The plugin options.\r\n */\n\t\t\t/**\r\n * @method IPlugin#afterEvent\r\n * @desc Called after the `event` has been consumed. Note that this hook\r\n * will not be called if the `event` has been previously discarded.\r\n * @param {Chart.Controller} chart - The chart instance.\r\n * @param {IEvent} event - The event object.\r\n * @param {Object} options - The plugin options.\r\n */\n\t\t\t/**\r\n * @method IPlugin#resize\r\n * @desc Called after the chart as been resized.\r\n * @param {Chart.Controller} chart - The chart instance.\r\n * @param {Number} size - The new canvas display size (eq. canvas.style width & height).\r\n * @param {Object} options - The plugin options.\r\n */\n\t\t\t/**\r\n * @method IPlugin#destroy\r\n * @desc Called after the chart as been destroyed.\r\n * @param {Chart.Controller} chart - The chart instance.\r\n * @param {Object} options - The plugin options.\r\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/**\r\n * Get the padding needed for the scale\r\n * @method getPadding\r\n * @private\r\n * @returns {Padding} the necessary padding\r\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/**\r\n * Returns the scale tick objects ({label, major})\r\n * @since 2.7\r\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/**\r\n * Handle margins and padding interactions\r\n * @private\r\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/**\r\n * Used to get the value to display in the tooltip for the data at the given index\r\n * @param index\r\n * @param datasetIndex\r\n */\n\t\t\t\tgetLabelForIndex: helpers.noop,\n\n\t\t\t\t/**\r\n * Returns the location of the given data point. Value can either be an index or a numerical value\r\n * The coordinate (0, 0) is at the upper-left corner of the canvas\r\n * @param value\r\n * @param index\r\n * @param datasetIndex\r\n */\n\t\t\t\tgetPixelForValue: helpers.noop,\n\n\t\t\t\t/**\r\n * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\r\n * The coordinate (0, 0) is at the upper-left corner of the canvas\r\n * @param pixel\r\n */\n\t\t\t\tgetValueForPixel: helpers.noop,\n\n\t\t\t\t/**\r\n * Returns the location of the tick at the given index\r\n * The coordinate (0, 0) is at the upper-left corner of the canvas\r\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/**\r\n * Utility for getting the pixel location of a percentage of scale\r\n * The coordinate (0, 0) is at the upper-left corner of the canvas\r\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/**\r\n * Returns the pixel for the minimum chart value\r\n * The coordinate (0, 0) is at the upper-left corner of the canvas\r\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/**\r\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\r\n * @private\r\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/**\r\n * Namespace to hold static tick generation functions\r\n * @namespace Chart.Ticks\r\n */\n\t\t\tmodule.exports = {\n\t\t\t\t/**\r\n * Namespace to hold formatters for different types of ticks\r\n * @namespace Chart.Ticks.formatters\r\n */\n\t\t\t\tformatters: {\n\t\t\t\t\t/**\r\n * Formatter for value labels\r\n * @method Chart.Ticks.formatters.values\r\n * @param value the value to display\r\n * @return {String|Array} the label to display\r\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/**\r\n * Formatter for linear numeric ticks\r\n * @method Chart.Ticks.formatters.linear\r\n * @param tickValue {Number} the value to be formatted\r\n * @param index {Number} the position of the tickValue parameter in the ticks array\r\n * @param ticks {Array<Number>} the list of ticks being converted\r\n * @return {String} string representation of the tickValue parameter\r\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/**\r\n * Average mode places the tooltip at the average position of the elements shown\r\n * @function Chart.Tooltip.positioners.average\r\n * @param elements {ChartElement[]} the elements being displayed in the tooltip\r\n * @returns {Point} tooltip position\r\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/**\r\n * Gets the tooltip position nearest of the item nearest to the event position\r\n * @function Chart.Tooltip.positioners.nearest\r\n * @param elements {Chart.Element[]} the tooltip elements\r\n * @param eventPosition {Point} the position of the event in canvas coordinates\r\n * @returns {Point} the tooltip position\r\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/**\r\n * Helper method to merge the opacity into a color\r\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/**\r\n * Returns array of strings split by newline\r\n * @param {String} value - The value to split by newline.\r\n * @returns {Array} value if newline present - Returned from String split() method\r\n * @function\r\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/**\r\n * Helper to get the reset model for the tooltip\r\n * @param tooltipOpts {Object} the tooltip options\r\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/**\r\n * Get the size of the tooltip\r\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/**\r\n * Helper to get the alignment of a tooltip given the size\r\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/**\r\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\r\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/**\r\n * Helper to build before and after body lines\r\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/**\r\n * Handle an event\r\n * @private\r\n * @param {IEvent} event - The event to handle\r\n * @returns {Boolean} true if the tooltip changed\r\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/**\r\n * @namespace Chart.Tooltip.positioners\r\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/**\r\n * Helper function to get the bounds of the bar regardless of the orientation\r\n * @param bar {Chart.Element.Rectangle} the bar\r\n * @return {Bounds} bounds of the bar\r\n * @private\r\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/**\r\n * @namespace Chart.helpers.canvas\r\n */\n\t\t\tvar exports = module.exports = {\n\t\t\t\t/**\r\n * Clears the entire canvas associated to the given `chart`.\r\n * @param {Chart} chart - The chart for which to clear the canvas.\r\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/**\r\n * Creates a \"path\" for a rectangle with rounded corners at position (x, y) with a\r\n * given size (width, height) and the same `radius` for all corners.\r\n * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context.\r\n * @param {Number} x - The x axis of the coordinate for the rectangle starting point.\r\n * @param {Number} y - The y axis of the coordinate for the rectangle starting point.\r\n * @param {Number} width - The rectangle's width.\r\n * @param {Number} height - The rectangle's height.\r\n * @param {Number} radius - The rounded amount (in pixels) for the four corners.\r\n * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object?\r\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/**\r\n * Provided for backward compatibility, use Chart.helpers.canvas.clear instead.\r\n * @namespace Chart.helpers.clear\r\n * @deprecated since version 2.7.0\r\n * @todo remove at version 3\r\n * @private\r\n */\n\t\t\thelpers.clear = exports.clear;\n\n\t\t\t/**\r\n * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead.\r\n * @namespace Chart.helpers.drawRoundedRectangle\r\n * @deprecated since version 2.7.0\r\n * @todo remove at version 3\r\n * @private\r\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/**\r\n * @namespace Chart.helpers\r\n */\n\n\t\t\tvar helpers = {\n\t\t\t\t/**\r\n * An empty function that can be used, for example, for optional callback.\r\n */\n\t\t\t\tnoop: function noop() {},\n\n\t\t\t\t/**\r\n * Returns a unique id, sequentially generated from a global variable.\r\n * @returns {Number}\r\n * @function\r\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/**\r\n * Returns true if `value` is neither null nor undefined, else returns false.\r\n * @param {*} value - The value to test.\r\n * @returns {Boolean}\r\n * @since 2.7.0\r\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/**\r\n * Returns true if `value` is an array, else returns false.\r\n * @param {*} value - The value to test.\r\n * @returns {Boolean}\r\n * @function\r\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/**\r\n * Returns true if `value` is an object (excluding null), else returns false.\r\n * @param {*} value - The value to test.\r\n * @returns {Boolean}\r\n * @since 2.7.0\r\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/**\r\n * Returns `value` if defined, else returns `defaultValue`.\r\n * @param {*} value - The value to return if defined.\r\n * @param {*} defaultValue - The value to return if `value` is undefined.\r\n * @returns {*}\r\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/**\r\n * Returns value at the given `index` in array if defined, else returns `defaultValue`.\r\n * @param {Array} value - The array to lookup for value at `index`.\r\n * @param {Number} index - The index in `value` to lookup for value.\r\n * @param {*} defaultValue - The value to return if `value[index]` is undefined.\r\n * @returns {*}\r\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/**\r\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\r\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\r\n * @param {Function} fn - The function to call.\r\n * @param {Array|undefined|null} args - The arguments with which `fn` should be called.\r\n * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`.\r\n * @returns {*}\r\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/**\r\n * Note(SB) for performance sake, this method should only be used when loopable type\r\n * is unknown or in none intensive code (not called often and small loopable). Else\r\n * it's preferable to use a regular for() loop and save extra function calls.\r\n * @param {Object|Array} loopable - The object or array to be iterated.\r\n * @param {Function} fn - The function to call for each item.\r\n * @param {Object} [thisArg] - The value of `this` provided for the call to `fn`.\r\n * @param {Boolean} [reverse] - If true, iterates backward on the loopable.\r\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/**\r\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\r\n * @see http://stackoverflow.com/a/14853974\r\n * @param {Array} a0 - The array to compare\r\n * @param {Array} a1 - The array to compare\r\n * @returns {Boolean}\r\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/**\r\n * Returns a deep copy of `source` without keeping references on objects and arrays.\r\n * @param {*} source - The value to clone.\r\n * @returns {*}\r\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/**\r\n * The default merger when Chart.helpers.merge is called without merger option.\r\n * Note(SB): this method is also used by configMerge and scaleMerge as fallback.\r\n * @private\r\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/**\r\n * Merges source[key] in target[key] only if target[key] is undefined.\r\n * @private\r\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/**\r\n * Recursively deep copies `source` properties into `target` with the given `options`.\r\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\r\n * @param {Object} target - The target object in which all sources are merged into.\r\n * @param {Object|Array(Object)} source - Object(s) to merge into `target`.\r\n * @param {Object} [options] - Merging options:\r\n * @param {Function} [options.merger] - The merge method (key, target, source, options)\r\n * @returns {Object} The `target` object.\r\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/**\r\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\r\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\r\n * @param {Object} target - The target object in which all sources are merged into.\r\n * @param {Object|Array(Object)} source - Object(s) to merge into `target`.\r\n * @returns {Object} The `target` object.\r\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/**\r\n * Applies the contents of two or more objects together into the first object.\r\n * @param {Object} target - The target object in which all objects are merged into.\r\n * @param {Object} arg1 - Object containing additional properties to merge in target.\r\n * @param {Object} argN - Additional objects containing properties to merge in target.\r\n * @returns {Object} The `target` object.\r\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/**\r\n * Basic javascript inheritance based on the model created in Backbone.js\r\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/**\r\n * Provided for backward compatibility, use Chart.helpers.callback instead.\r\n * @function Chart.helpers.callCallback\r\n * @deprecated since version 2.6.0\r\n * @todo remove at version 3\r\n * @private\r\n */\n\t\t\thelpers.callCallback = helpers.callback;\n\n\t\t\t/**\r\n * Provided for backward compatibility, use Array.prototype.indexOf instead.\r\n * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+\r\n * @function Chart.helpers.indexOf\r\n * @deprecated since version 2.7.0\r\n * @todo remove at version 3\r\n * @private\r\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/**\r\n * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead.\r\n * @function Chart.helpers.getValueOrDefault\r\n * @deprecated since version 2.7.0\r\n * @todo remove at version 3\r\n * @private\r\n */\n\t\t\thelpers.getValueOrDefault = helpers.valueOrDefault;\n\n\t\t\t/**\r\n * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead.\r\n * @function Chart.helpers.getValueAtIndexOrDefault\r\n * @deprecated since version 2.7.0\r\n * @todo remove at version 3\r\n * @private\r\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/**\r\n * Easing functions adapted from Robert Penner's easing equations.\r\n * @namespace Chart.helpers.easingEffects\r\n * @see http://www.robertpenner.com/easing/\r\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/**\r\n * Provided for backward compatibility, use Chart.helpers.easing.effects instead.\r\n * @function Chart.helpers.easingEffects\r\n * @deprecated since version 2.7.0\r\n * @todo remove at version 3\r\n * @private\r\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/**\r\n * @alias Chart.helpers.options\r\n * @namespace\r\n */\n\t\t\tmodule.exports = {\n\t\t\t\t/**\r\n * Converts the given line height `value` in pixels for a specific font `size`.\r\n * @param {Number|String} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\r\n * @param {Number} size - The font size (in pixels) used to resolve relative `value`.\r\n * @returns {Number} The effective line height in pixels (size * 1.2 if value is invalid).\r\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\r\n * @since 2.7.0\r\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/**\r\n * Converts the given value into a padding object with pre-computed width/height.\r\n * @param {Number|Object} value - If a number, set the value to all TRBL component,\r\n * else, if and object, use defined properties and sets undefined ones to 0.\r\n * @returns {Object} The padding values (top, right, bottom, left, width, height)\r\n * @since 2.7.0\r\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/**\r\n * Evaluates the given `inputs` sequentially and returns the first defined value.\r\n * @param {Array[]} inputs - An array of values, falling back to the last value.\r\n * @param {Object} [context] - If defined and the current value is a function, the value\r\n * is called with `context` as first argument and the result becomes the new input.\r\n * @param {Number} [index] - If defined and the current value is an array, the value\r\n * at `index` become the new input.\r\n * @since 2.7.0\r\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/**\r\n * Platform fallback implementation (minimal).\r\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\r\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/**\r\n * Chart.Platform implementation for targeting a web browser\r\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/**\r\n * DOM event types -> Chart.js event types.\r\n * Note: only events with different types are mapped.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\r\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/**\r\n * The \"used\" size is the final value of a dimension property after all calculations have\r\n * been performed. This method uses the computed style of `element` but returns undefined\r\n * if the computed style is not expressed in pixels. That can happen in some cases where\r\n * `element` has a size relative to its parent and this last one is not yet displayed,\r\n * for example because of `display: none` on a parent node.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\r\n * @returns {Number} Size in pixels or undefined if unknown.\r\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/**\r\n * Initializes the canvas style and render size without modifying the canvas display size,\r\n * since responsiveness is handled by the controller.resize() method. The config is used\r\n * to determine the aspect ratio to apply in case no explicit height has been specified.\r\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/**\r\n * Detects support for options object argument in addEventListener.\r\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\r\n * @private\r\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/**\r\n * This property holds whether this platform is enabled for the current environment.\r\n * Currently used by platform.js to select the proper implementation.\r\n * @private\r\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/**\r\n * Provided for backward compatibility, use EventTarget.addEventListener instead.\r\n * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\r\n * @function Chart.helpers.addEvent\r\n * @deprecated since version 2.7.0\r\n * @todo remove at version 3\r\n * @private\r\n */\n\t\t\thelpers.addEvent = _addEventListener;\n\n\t\t\t/**\r\n * Provided for backward compatibility, use EventTarget.removeEventListener instead.\r\n * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener\r\n * @function Chart.helpers.removeEvent\r\n * @deprecated since version 2.7.0\r\n * @todo remove at version 3\r\n * @private\r\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/**\r\n * @namespace Chart.platform\r\n * @see https://chartjs.gitbooks.io/proposals/content/Platform.html\r\n * @since 2.4.0\r\n */\n\t\t\tmodule.exports = helpers.extend({\n\t\t\t\t/**\r\n * @since 2.7.0\r\n */\n\t\t\t\tinitialize: function initialize() {},\n\n\t\t\t\t/**\r\n * Called at chart construction time, returns a context2d instance implementing\r\n * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\r\n * @param {*} item - The native item from which to acquire context (platform specific)\r\n * @param {Object} options - The chart options\r\n * @returns {CanvasRenderingContext2D} context2d instance\r\n */\n\t\t\t\tacquireContext: function acquireContext() {},\n\n\t\t\t\t/**\r\n * Called at chart destruction time, releases any resources associated to the context\r\n * previously returned by the acquireContext() method.\r\n * @param {CanvasRenderingContext2D} context - The context2d instance\r\n * @returns {Boolean} true if the method succeeded, else false\r\n */\n\t\t\t\treleaseContext: function releaseContext() {},\n\n\t\t\t\t/**\r\n * Registers the specified listener on the given chart.\r\n * @param {Chart} chart - Chart from which to listen for event\r\n * @param {String} type - The ({@link IEvent}) type to listen for\r\n * @param {Function} listener - Receives a notification (an object that implements\r\n * the {@link IEvent} interface) when an event of the specified type occurs.\r\n */\n\t\t\t\taddEventListener: function addEventListener() {},\n\n\t\t\t\t/**\r\n * Removes the specified listener previously registered with addEventListener.\r\n * @param {Chart} chart -Chart from which to remove the listener\r\n * @param {String} type - The ({@link IEvent}) type to remove\r\n * @param {Function} listener - The listener function to remove from the event target.\r\n */\n\t\t\t\tremoveEventListener: function removeEventListener() {}\n\n\t\t\t}, implementation);\n\n\t\t\t/**\r\n * @interface IPlatform\r\n * Allows abstracting platform dependencies away from the chart\r\n * @borrows Chart.platform.acquireContext as acquireContext\r\n * @borrows Chart.platform.releaseContext as releaseContext\r\n * @borrows Chart.platform.addEventListener as addEventListener\r\n * @borrows Chart.platform.removeEventListener as removeEventListener\r\n */\n\n\t\t\t/**\r\n * @interface IEvent\r\n * @prop {String} type - The event type name, possible values are:\r\n * 'contextmenu', 'mouseenter', 'mousedown', 'mousemove', 'mouseup', 'mouseout',\r\n * 'click', 'dblclick', 'keydown', 'keypress', 'keyup' and 'resize'\r\n * @prop {*} native - The original native event (null for emulated events, e.g. 'resize')\r\n * @prop {Number} x - The mouse x position, relative to the canvas (null for incompatible events)\r\n * @prop {Number} y - The mouse y position, relative to the canvas (null for incompatible events)\r\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/**\r\n * Plugin based on discussion from the following Chart.js issues:\r\n * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\r\n * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\r\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/**\r\n * Helper function to get the box width based on the usePointStyle option\r\n * @param labelopts {Object} the label options on the legend\r\n * @param fontSize {Number} the label font size\r\n * @return {Number} width of the color box area\r\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/**\r\n * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required!\r\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/**\r\n * Handle an event\r\n * @private\r\n * @param {IEvent} event - The event to handle\r\n * @return {Boolean} true if a change occured\r\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/**\r\n * Backward compatibility: since 2.1.5, the legend is registered as a plugin, making\r\n * Chart.Legend obsolete. To avoid a breaking change, we export the Legend as part of\r\n * the plugin, which one will be re-exposed in the chart.js file.\r\n * https://github.com/chartjs/Chart.js/pull/2640\r\n * @private\r\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/**\r\n * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required!\r\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/**\r\n * Backward compatibility: since 2.1.5, the title is registered as a plugin, making\r\n * Chart.Title obsolete. To avoid a breaking change, we export the Title as part of\r\n * the plugin, which one will be re-exposed in the chart.js file.\r\n * https://github.com/chartjs/Chart.js/pull/2640\r\n * @private\r\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/**\r\n * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those\r\n * else fall back to data.labels\r\n * @private\r\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/**\r\n * Generate a set of linear ticks\r\n * @param generationOptions the options used to generate the ticks\r\n * @param dataRange the range of the data\r\n * @returns {Array<Number>} array of tick values\r\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/**\r\n * Generate a set of logarithmic ticks\r\n * @param generationOptions the options used to generate the ticks\r\n * @param dataRange the range of the data\r\n * @returns {Array<Number>} array of tick values\r\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/**\r\n * Returns the value of the first tick.\r\n * @param {Number} value - The minimum not zero value.\r\n * @return {Number} The first tick value.\r\n * @private\r\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/**\r\n * Helper function to fit a radial linear scale with point labels\r\n */\n\t\t\t\tfunction fitWithPointLabels(scale) {\n\t\t\t\t\t/*\r\n * Right, this is really confusing and there is a lot of maths going on here\r\n * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\r\n *\r\n * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\r\n *\r\n * Solution:\r\n *\r\n * We assume the radius of the polygon is half the size of the canvas at first\r\n * at each index we check if the text overlaps.\r\n *\r\n * Where it does, we store that angle and that index.\r\n *\r\n * After finding the largest index and angle we calculate how much we need to remove\r\n * from the shape radius to move the point inwards by that x.\r\n *\r\n * We average the left and right distances to get the maximum shape radius that can fit in the box\r\n * along with labels.\r\n *\r\n * Once we have that, we can find the centre point for the chart, by taking the x text protrusion\r\n * on each side, removing that from the size, halving it and adding the left x protrusion width.\r\n *\r\n * This will mean we have a shape fitted to the canvas, as large as it can be with the labels\r\n * and position it in the most space efficient manner\r\n *\r\n * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\r\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/**\r\n * Helper function to fit a radial linear scale with no point labels\r\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/**\r\n * Set radius reductions and determine new radius and center point\r\n * @private\r\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/**\r\n * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\r\n * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\r\n * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\r\n * extremity (left + width or top + height). Note that it would be more optimized to directly\r\n * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\r\n * to create the lookup table. The table ALWAYS contains at least two items: min and max.\r\n *\r\n * @param {Number[]} timestamps - timestamps sorted from lowest to highest.\r\n * @param {String} distribution - If 'linear', timestamps will be spread linearly along the min\r\n * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}.\r\n * If 'series', timestamps will be positioned at the same distance from each other. In this\r\n * case, only timestamps that break the time linearity are registered, meaning that in the\r\n * best case, all timestamps are linear, the table contains only min and max.\r\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/**\r\n * Linearly interpolates the given source `value` using the table items `skey` values and\r\n * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos')\r\n * returns the position for a timestamp equal to 42. If value is out of bounds, values at\r\n * index [0, 1] or [n - 1, n] are used for the interpolation.\r\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/**\r\n * Convert the given value to a moment object using the given time options.\r\n * @see http://momentjs.com/docs/#/parsing/\r\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/**\r\n * Returns the number of unit to skip to be able to display up to `capacity` number of ticks\r\n * in `unit` for the given `min` / `max` range and respecting the interval steps constraints.\r\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/**\r\n * Figures out what unit results in an appropriate number of auto-generated ticks\r\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/**\r\n * Figures out what unit to format a set of ticks with\r\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/**\r\n * Generates a maximum of `capacity` timestamps between min and max, rounded to the\r\n * `minor` unit, aligned on the `major` unit and using the given scale time `options`.\r\n * Important: this method can return ticks outside the min and max range, it's the\r\n * responsibility of the calling code to clamp values if needed.\r\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/**\r\n * Returns the right and left offsets from edges in the form of {left, right}.\r\n * Offsets are added when the `offset` option is true.\r\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/**\r\n * Data distribution along the scale:\r\n * - 'linear': data are spread according to their time (distances can vary),\r\n * - 'series': data are spread at the same distance from each other.\r\n * @see https://github.com/chartjs/Chart.js/pull/4507\r\n * @since 2.7.0\r\n */\n\t\t\t\t\tdistribution: 'linear',\n\n\t\t\t\t\t/**\r\n * Scale boundary strategy (bypassed by min/max time options)\r\n * - `data`: make sure data are fully visible, ticks outside are removed\r\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\r\n * @see https://github.com/chartjs/Chart.js/pull/4556\r\n * @since 2.7.0\r\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/**\r\n * Ticks generation input values:\r\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\r\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\r\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\r\n * @see https://github.com/chartjs/Chart.js/pull/4507\r\n * @since 2.7.0\r\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/**\r\n * Allows data to be referenced via 't' attribute\r\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/**\r\n * Function to format an individual tick mark\r\n * @private\r\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/**\r\n * @private\r\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/**\r\n * Crude approximation of what the label width might be\r\n * @private\r\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/**\r\n * @private\r\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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QWtEaE0sYUFBbEQ7QUFDQSxJQXBXRDtBQXNXQyxHQW54QnVDLEVBbXhCdEMsRUFBQyxLQUFJLENBQUwsRUFBTyxNQUFLLEVBQVosRUFBZSxNQUFLLEVBQXBCLEVBQXVCLE1BQUssRUFBNUIsRUFBK0IsTUFBSyxFQUFwQyxFQW54QnNDLENBMTFhaXhCLEVBQTVjLEVBNm1jalUsRUE3bWNpVSxFQTZtYzlULENBQUMsQ0FBRCxDQTdtYzhULEVBNm1jelQsQ0E3bWN5VCxDQUFQO0FBOG1jclcsQ0E5bWNEIiwiZmlsZSI6IjcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcclxuICogQ2hhcnQuanNcclxuICogaHR0cDovL2NoYXJ0anMub3JnL1xyXG4gKiBWZXJzaW9uOiAyLjcuM1xyXG4gKlxyXG4gKiBDb3B5cmlnaHQgMjAxOCBDaGFydC5qcyBDb250cmlidXRvcnNcclxuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2Jsb2IvbWFzdGVyL0xJQ0VOU0UubWRcclxuICovXHJcbihmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PVwib2JqZWN0XCImJnR5cGVvZiBtb2R1bGUhPT1cInVuZGVmaW5lZFwiKXttb2R1bGUuZXhwb3J0cz1mKCl9ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT09XCJmdW5jdGlvblwiJiZkZWZpbmUuYW1kKXtkZWZpbmUoW10sZil9ZWxzZXt2YXIgZztpZih0eXBlb2Ygd2luZG93IT09XCJ1bmRlZmluZWRcIil7Zz13aW5kb3d9ZWxzZSBpZih0eXBlb2YgZ2xvYmFsIT09XCJ1bmRlZmluZWRcIil7Zz1nbG9iYWx9ZWxzZSBpZih0eXBlb2Ygc2VsZiE9PVwidW5kZWZpbmVkXCIpe2c9c2VsZn1lbHNle2c9dGhpc31nLkNoYXJ0ID0gZigpfX0pKGZ1bmN0aW9uKCl7dmFyIGRlZmluZSxtb2R1bGUsZXhwb3J0cztyZXR1cm4gKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSh7MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcblxyXG59LHt9XSwyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcclxuLyogTUlUIGxpY2Vuc2UgKi9cclxudmFyIGNvbG9yTmFtZXMgPSByZXF1aXJlKDYpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcbiAgIGdldFJnYmE6IGdldFJnYmEsXHJcbiAgIGdldEhzbGE6IGdldEhzbGEsXHJcbiAgIGdldFJnYjogZ2V0UmdiLFxyXG4gICBnZXRIc2w6IGdldEhzbCxcclxuICAgZ2V0SHdiOiBnZXRId2IsXHJcbiAgIGdldEFscGhhOiBnZXRBbHBoYSxcclxuXHJcbiAgIGhleFN0cmluZzogaGV4U3RyaW5nLFxyXG4gICByZ2JTdHJpbmc6IHJnYlN0cmluZyxcclxuICAgcmdiYVN0cmluZzogcmdiYVN0cmluZyxcclxuICAgcGVyY2VudFN0cmluZzogcGVyY2VudFN0cmluZyxcclxuICAgcGVyY2VudGFTdHJpbmc6IHBlcmNlbnRhU3RyaW5nLFxyXG4gICBoc2xTdHJpbmc6IGhzbFN0cmluZyxcclxuICAgaHNsYVN0cmluZzogaHNsYVN0cmluZyxcclxuICAgaHdiU3RyaW5nOiBod2JTdHJpbmcsXHJcbiAgIGtleXdvcmQ6IGtleXdvcmRcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0UmdiYShzdHJpbmcpIHtcclxuICAgaWYgKCFzdHJpbmcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICB9XHJcbiAgIHZhciBhYmJyID0gIC9eIyhbYS1mQS1GMC05XXszfSkkL2ksXHJcbiAgICAgICBoZXggPSAgL14jKFthLWZBLUYwLTldezZ9KSQvaSxcclxuICAgICAgIHJnYmEgPSAvXnJnYmE/XFwoXFxzKihbKy1dP1xcZCspXFxzKixcXHMqKFsrLV0/XFxkKylcXHMqLFxccyooWystXT9cXGQrKVxccyooPzosXFxzKihbKy1dP1tcXGRcXC5dKylcXHMqKT9cXCkkL2ksXHJcbiAgICAgICBwZXIgPSAvXnJnYmE/XFwoXFxzKihbKy1dP1tcXGRcXC5dKylcXCVcXHMqLFxccyooWystXT9bXFxkXFwuXSspXFwlXFxzKixcXHMqKFsrLV0/W1xcZFxcLl0rKVxcJVxccyooPzosXFxzKihbKy1dP1tcXGRcXC5dKylcXHMqKT9cXCkkL2ksXHJcbiAgICAgICBrZXl3b3JkID0gLyhcXHcrKS87XHJcblxyXG4gICB2YXIgcmdiID0gWzAsIDAsIDBdLFxyXG4gICAgICAgYSA9IDEsXHJcbiAgICAgICBtYXRjaCA9IHN0cmluZy5tYXRjaChhYmJyKTtcclxuICAgaWYgKG1hdGNoKSB7XHJcbiAgICAgIG1hdGNoID0gbWF0Y2hbMV07XHJcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmdiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgIHJnYltpXSA9IHBhcnNlSW50KG1hdGNoW2ldICsgbWF0Y2hbaV0sIDE2KTtcclxuICAgICAgfVxyXG4gICB9XHJcbiAgIGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKGhleCkpIHtcclxuICAgICAgbWF0Y2ggPSBtYXRjaFsxXTtcclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZ2IubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgcmdiW2ldID0gcGFyc2VJbnQobWF0Y2guc2xpY2UoaSAqIDIsIGkgKiAyICsgMiksIDE2KTtcclxuICAgICAgfVxyXG4gICB9XHJcbiAgIGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKHJnYmEpKSB7XHJcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmdiLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgIHJnYltpXSA9IHBhcnNlSW50KG1hdGNoW2kgKyAxXSk7XHJcbiAgICAgIH1cclxuICAgICAgYSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pO1xyXG4gICB9XHJcbiAgIGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKHBlcikpIHtcclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZ2IubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgcmdiW2ldID0gTWF0aC5yb3VuZChwYXJzZUZsb2F0KG1hdGNoW2kgKyAxXSkgKiAyLjU1KTtcclxuICAgICAgfVxyXG4gICAgICBhID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XHJcbiAgIH1cclxuICAgZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goa2V5d29yZCkpIHtcclxuICAgICAgaWYgKG1hdGNoWzFdID09IFwidHJhbnNwYXJlbnRcIikge1xyXG4gICAgICAgICByZXR1cm4gWzAsIDAsIDAsIDBdO1xyXG4gICAgICB9XHJcbiAgICAgIHJnYiA9IGNvbG9yTmFtZXNbbWF0Y2hbMV1dO1xyXG4gICAgICBpZiAoIXJnYikge1xyXG4gICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgfVxyXG5cclxuICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZ2IubGVuZ3RoOyBpKyspIHtcclxuICAgICAgcmdiW2ldID0gc2NhbGUocmdiW2ldLCAwLCAyNTUpO1xyXG4gICB9XHJcbiAgIGlmICghYSAmJiBhICE9IDApIHtcclxuICAgICAgYSA9IDE7XHJcbiAgIH1cclxuICAgZWxzZSB7XHJcbiAgICAgIGEgPSBzY2FsZShhLCAwLCAxKTtcclxuICAgfVxyXG4gICByZ2JbM10gPSBhO1xyXG4gICByZXR1cm4gcmdiO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRIc2xhKHN0cmluZykge1xyXG4gICBpZiAoIXN0cmluZykge1xyXG4gICAgICByZXR1cm47XHJcbiAgIH1cclxuICAgdmFyIGhzbCA9IC9eaHNsYT9cXChcXHMqKFsrLV0/XFxkKykoPzpkZWcpP1xccyosXFxzKihbKy1dP1tcXGRcXC5dKyklXFxzKixcXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqKD86LFxccyooWystXT9bXFxkXFwuXSspXFxzKik/XFwpLztcclxuICAgdmFyIG1hdGNoID0gc3RyaW5nLm1hdGNoKGhzbCk7XHJcbiAgIGlmIChtYXRjaCkge1xyXG4gICAgICB2YXIgYWxwaGEgPSBwYXJzZUZsb2F0KG1hdGNoWzRdKTtcclxuICAgICAgdmFyIGggPSBzY2FsZShwYXJzZUludChtYXRjaFsxXSksIDAsIDM2MCksXHJcbiAgICAgICAgICBzID0gc2NhbGUocGFyc2VGbG9hdChtYXRjaFsyXSksIDAsIDEwMCksXHJcbiAgICAgICAgICBsID0gc2NhbGUocGFyc2VGbG9hdChtYXRjaFszXSksIDAsIDEwMCksXHJcbiAgICAgICAgICBhID0gc2NhbGUoaXNOYU4oYWxwaGEpID8gMSA6IGFscGhhLCAwLCAxKTtcclxuICAgICAgcmV0dXJuIFtoLCBzLCBsLCBhXTtcclxuICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRId2Ioc3RyaW5nKSB7XHJcbiAgIGlmICghc3RyaW5nKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgfVxyXG4gICB2YXIgaHdiID0gL15od2JcXChcXHMqKFsrLV0/XFxkKykoPzpkZWcpP1xccyosXFxzKihbKy1dP1tcXGRcXC5dKyklXFxzKixcXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqKD86LFxccyooWystXT9bXFxkXFwuXSspXFxzKik/XFwpLztcclxuICAgdmFyIG1hdGNoID0gc3RyaW5nLm1hdGNoKGh3Yik7XHJcbiAgIGlmIChtYXRjaCkge1xyXG4gICAgdmFyIGFscGhhID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XHJcbiAgICAgIHZhciBoID0gc2NhbGUocGFyc2VJbnQobWF0Y2hbMV0pLCAwLCAzNjApLFxyXG4gICAgICAgICAgdyA9IHNjYWxlKHBhcnNlRmxvYXQobWF0Y2hbMl0pLCAwLCAxMDApLFxyXG4gICAgICAgICAgYiA9IHNjYWxlKHBhcnNlRmxvYXQobWF0Y2hbM10pLCAwLCAxMDApLFxyXG4gICAgICAgICAgYSA9IHNjYWxlKGlzTmFOKGFscGhhKSA/IDEgOiBhbHBoYSwgMCwgMSk7XHJcbiAgICAgIHJldHVybiBbaCwgdywgYiwgYV07XHJcbiAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0UmdiKHN0cmluZykge1xyXG4gICB2YXIgcmdiYSA9IGdldFJnYmEoc3RyaW5nKTtcclxuICAgcmV0dXJuIHJnYmEgJiYgcmdiYS5zbGljZSgwLCAzKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0SHNsKHN0cmluZykge1xyXG4gIHZhciBoc2xhID0gZ2V0SHNsYShzdHJpbmcpO1xyXG4gIHJldHVybiBoc2xhICYmIGhzbGEuc2xpY2UoMCwgMyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEFscGhhKHN0cmluZykge1xyXG4gICB2YXIgdmFscyA9IGdldFJnYmEoc3RyaW5nKTtcclxuICAgaWYgKHZhbHMpIHtcclxuICAgICAgcmV0dXJuIHZhbHNbM107XHJcbiAgIH1cclxuICAgZWxzZSBpZiAodmFscyA9IGdldEhzbGEoc3RyaW5nKSkge1xyXG4gICAgICByZXR1cm4gdmFsc1szXTtcclxuICAgfVxyXG4gICBlbHNlIGlmICh2YWxzID0gZ2V0SHdiKHN0cmluZykpIHtcclxuICAgICAgcmV0dXJuIHZhbHNbM107XHJcbiAgIH1cclxufVxyXG5cclxuLy8gZ2VuZXJhdG9yc1xyXG5mdW5jdGlvbiBoZXhTdHJpbmcocmdiKSB7XHJcbiAgIHJldHVybiBcIiNcIiArIGhleERvdWJsZShyZ2JbMF0pICsgaGV4RG91YmxlKHJnYlsxXSlcclxuICAgICAgICAgICAgICArIGhleERvdWJsZShyZ2JbMl0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZ2JTdHJpbmcocmdiYSwgYWxwaGEpIHtcclxuICAgaWYgKGFscGhhIDwgMSB8fCAocmdiYVszXSAmJiByZ2JhWzNdIDwgMSkpIHtcclxuICAgICAgcmV0dXJuIHJnYmFTdHJpbmcocmdiYSwgYWxwaGEpO1xyXG4gICB9XHJcbiAgIHJldHVybiBcInJnYihcIiArIHJnYmFbMF0gKyBcIiwgXCIgKyByZ2JhWzFdICsgXCIsIFwiICsgcmdiYVsyXSArIFwiKVwiO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZ2JhU3RyaW5nKHJnYmEsIGFscGhhKSB7XHJcbiAgIGlmIChhbHBoYSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGFscGhhID0gKHJnYmFbM10gIT09IHVuZGVmaW5lZCA/IHJnYmFbM10gOiAxKTtcclxuICAgfVxyXG4gICByZXR1cm4gXCJyZ2JhKFwiICsgcmdiYVswXSArIFwiLCBcIiArIHJnYmFbMV0gKyBcIiwgXCIgKyByZ2JhWzJdXHJcbiAgICAgICAgICAgKyBcIiwgXCIgKyBhbHBoYSArIFwiKVwiO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwZXJjZW50U3RyaW5nKHJnYmEsIGFscGhhKSB7XHJcbiAgIGlmIChhbHBoYSA8IDEgfHwgKHJnYmFbM10gJiYgcmdiYVszXSA8IDEpKSB7XHJcbiAgICAgIHJldHVybiBwZXJjZW50YVN0cmluZyhyZ2JhLCBhbHBoYSk7XHJcbiAgIH1cclxuICAgdmFyIHIgPSBNYXRoLnJvdW5kKHJnYmFbMF0vMjU1ICogMTAwKSxcclxuICAgICAgIGcgPSBNYXRoLnJvdW5kKHJnYmFbMV0vMjU1ICogMTAwKSxcclxuICAgICAgIGIgPSBNYXRoLnJvdW5kKHJnYmFbMl0vMjU1ICogMTAwKTtcclxuXHJcbiAgIHJldHVybiBcInJnYihcIiArIHIgKyBcIiUsIFwiICsgZyArIFwiJSwgXCIgKyBiICsgXCIlKVwiO1xyXG59XHJcblxyXG5mdW5jdGlvbiBwZXJjZW50YVN0cmluZyhyZ2JhLCBhbHBoYSkge1xyXG4gICB2YXIgciA9IE1hdGgucm91bmQocmdiYVswXS8yNTUgKiAxMDApLFxyXG4gICAgICAgZyA9IE1hdGgucm91bmQocmdiYVsxXS8yNTUgKiAxMDApLFxyXG4gICAgICAgYiA9IE1hdGgucm91bmQocmdiYVsyXS8yNTUgKiAxMDApO1xyXG4gICByZXR1cm4gXCJyZ2JhKFwiICsgciArIFwiJSwgXCIgKyBnICsgXCIlLCBcIiArIGIgKyBcIiUsIFwiICsgKGFscGhhIHx8IHJnYmFbM10gfHwgMSkgKyBcIilcIjtcclxufVxyXG5cclxuZnVuY3Rpb24gaHNsU3RyaW5nKGhzbGEsIGFscGhhKSB7XHJcbiAgIGlmIChhbHBoYSA8IDEgfHwgKGhzbGFbM10gJiYgaHNsYVszXSA8IDEpKSB7XHJcbiAgICAgIHJldHVybiBoc2xhU3RyaW5nKGhzbGEsIGFscGhhKTtcclxuICAgfVxyXG4gICByZXR1cm4gXCJoc2woXCIgKyBoc2xhWzBdICsgXCIsIFwiICsgaHNsYVsxXSArIFwiJSwgXCIgKyBoc2xhWzJdICsgXCIlKVwiO1xyXG59XHJcblxyXG5mdW5jdGlvbiBoc2xhU3RyaW5nKGhzbGEsIGFscGhhKSB7XHJcbiAgIGlmIChhbHBoYSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGFscGhhID0gKGhzbGFbM10gIT09IHVuZGVmaW5lZCA/IGhzbGFbM10gOiAxKTtcclxuICAgfVxyXG4gICByZXR1cm4gXCJoc2xhKFwiICsgaHNsYVswXSArIFwiLCBcIiArIGhzbGFbMV0gKyBcIiUsIFwiICsgaHNsYVsyXSArIFwiJSwgXCJcclxuICAgICAgICAgICArIGFscGhhICsgXCIpXCI7XHJcbn1cclxuXHJcbi8vIGh3YiBpcyBhIGJpdCBkaWZmZXJlbnQgdGhhbiByZ2IoYSkgJiBoc2woYSkgc2luY2UgdGhlcmUgaXMgbm8gYWxwaGEgc3BlY2lmaWMgc3ludGF4XHJcbi8vIChod2IgaGF2ZSBhbHBoYSBvcHRpb25hbCAmIDEgaXMgZGVmYXVsdCB2YWx1ZSlcclxuZnVuY3Rpb24gaHdiU3RyaW5nKGh3YiwgYWxwaGEpIHtcclxuICAgaWYgKGFscGhhID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgYWxwaGEgPSAoaHdiWzNdICE9PSB1bmRlZmluZWQgPyBod2JbM10gOiAxKTtcclxuICAgfVxyXG4gICByZXR1cm4gXCJod2IoXCIgKyBod2JbMF0gKyBcIiwgXCIgKyBod2JbMV0gKyBcIiUsIFwiICsgaHdiWzJdICsgXCIlXCJcclxuICAgICAgICAgICArIChhbHBoYSAhPT0gdW5kZWZpbmVkICYmIGFscGhhICE9PSAxID8gXCIsIFwiICsgYWxwaGEgOiBcIlwiKSArIFwiKVwiO1xyXG59XHJcblxyXG5mdW5jdGlvbiBrZXl3b3JkKHJnYikge1xyXG4gIHJldHVybiByZXZlcnNlTmFtZXNbcmdiLnNsaWNlKDAsIDMpXTtcclxufVxyXG5cclxuLy8gaGVscGVyc1xyXG5mdW5jdGlvbiBzY2FsZShudW0sIG1pbiwgbWF4KSB7XHJcbiAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChtaW4sIG51bSksIG1heCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhleERvdWJsZShudW0pIHtcclxuICB2YXIgc3RyID0gbnVtLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xyXG4gIHJldHVybiAoc3RyLmxlbmd0aCA8IDIpID8gXCIwXCIgKyBzdHIgOiBzdHI7XHJcbn1cclxuXHJcblxyXG4vL2NyZWF0ZSBhIGxpc3Qgb2YgcmV2ZXJzZSBjb2xvciBuYW1lc1xyXG52YXIgcmV2ZXJzZU5hbWVzID0ge307XHJcbmZvciAodmFyIG5hbWUgaW4gY29sb3JOYW1lcykge1xyXG4gICByZXZlcnNlTmFtZXNbY29sb3JOYW1lc1tuYW1lXV0gPSBuYW1lO1xyXG59XHJcblxyXG59LHtcIjZcIjo2fV0sMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbi8qIE1JVCBsaWNlbnNlICovXHJcbnZhciBjb252ZXJ0ID0gcmVxdWlyZSg1KTtcclxudmFyIHN0cmluZyA9IHJlcXVpcmUoMik7XHJcblxyXG52YXIgQ29sb3IgPSBmdW5jdGlvbiAob2JqKSB7XHJcblx0aWYgKG9iaiBpbnN0YW5jZW9mIENvbG9yKSB7XHJcblx0XHRyZXR1cm4gb2JqO1xyXG5cdH1cclxuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgQ29sb3IpKSB7XHJcblx0XHRyZXR1cm4gbmV3IENvbG9yKG9iaik7XHJcblx0fVxyXG5cclxuXHR0aGlzLnZhbGlkID0gZmFsc2U7XHJcblx0dGhpcy52YWx1ZXMgPSB7XHJcblx0XHRyZ2I6IFswLCAwLCAwXSxcclxuXHRcdGhzbDogWzAsIDAsIDBdLFxyXG5cdFx0aHN2OiBbMCwgMCwgMF0sXHJcblx0XHRod2I6IFswLCAwLCAwXSxcclxuXHRcdGNteWs6IFswLCAwLCAwLCAwXSxcclxuXHRcdGFscGhhOiAxXHJcblx0fTtcclxuXHJcblx0Ly8gcGFyc2UgQ29sb3IoKSBhcmd1bWVudFxyXG5cdHZhciB2YWxzO1xyXG5cdGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xyXG5cdFx0dmFscyA9IHN0cmluZy5nZXRSZ2JhKG9iaik7XHJcblx0XHRpZiAodmFscykge1xyXG5cdFx0XHR0aGlzLnNldFZhbHVlcygncmdiJywgdmFscyk7XHJcblx0XHR9IGVsc2UgaWYgKHZhbHMgPSBzdHJpbmcuZ2V0SHNsYShvYmopKSB7XHJcblx0XHRcdHRoaXMuc2V0VmFsdWVzKCdoc2wnLCB2YWxzKTtcclxuXHRcdH0gZWxzZSBpZiAodmFscyA9IHN0cmluZy5nZXRId2Iob2JqKSkge1xyXG5cdFx0XHR0aGlzLnNldFZhbHVlcygnaHdiJywgdmFscyk7XHJcblx0XHR9XHJcblx0fSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xyXG5cdFx0dmFscyA9IG9iajtcclxuXHRcdGlmICh2YWxzLnIgIT09IHVuZGVmaW5lZCB8fCB2YWxzLnJlZCAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHRoaXMuc2V0VmFsdWVzKCdyZ2InLCB2YWxzKTtcclxuXHRcdH0gZWxzZSBpZiAodmFscy5sICE9PSB1bmRlZmluZWQgfHwgdmFscy5saWdodG5lc3MgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHR0aGlzLnNldFZhbHVlcygnaHNsJywgdmFscyk7XHJcblx0XHR9IGVsc2UgaWYgKHZhbHMudiAhPT0gdW5kZWZpbmVkIHx8IHZhbHMudmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHR0aGlzLnNldFZhbHVlcygnaHN2JywgdmFscyk7XHJcblx0XHR9IGVsc2UgaWYgKHZhbHMudyAhPT0gdW5kZWZpbmVkIHx8IHZhbHMud2hpdGVuZXNzICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0dGhpcy5zZXRWYWx1ZXMoJ2h3YicsIHZhbHMpO1xyXG5cdFx0fSBlbHNlIGlmICh2YWxzLmMgIT09IHVuZGVmaW5lZCB8fCB2YWxzLmN5YW4gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHR0aGlzLnNldFZhbHVlcygnY215aycsIHZhbHMpO1xyXG5cdFx0fVxyXG5cdH1cclxufTtcclxuXHJcbkNvbG9yLnByb3RvdHlwZSA9IHtcclxuXHRpc1ZhbGlkOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy52YWxpZDtcclxuXHR9LFxyXG5cdHJnYjogZnVuY3Rpb24gKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuc2V0U3BhY2UoJ3JnYicsIGFyZ3VtZW50cyk7XHJcblx0fSxcclxuXHRoc2w6IGZ1bmN0aW9uICgpIHtcclxuXHRcdHJldHVybiB0aGlzLnNldFNwYWNlKCdoc2wnLCBhcmd1bWVudHMpO1xyXG5cdH0sXHJcblx0aHN2OiBmdW5jdGlvbiAoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5zZXRTcGFjZSgnaHN2JywgYXJndW1lbnRzKTtcclxuXHR9LFxyXG5cdGh3YjogZnVuY3Rpb24gKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuc2V0U3BhY2UoJ2h3YicsIGFyZ3VtZW50cyk7XHJcblx0fSxcclxuXHRjbXlrOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5zZXRTcGFjZSgnY215aycsIGFyZ3VtZW50cyk7XHJcblx0fSxcclxuXHJcblx0cmdiQXJyYXk6IGZ1bmN0aW9uICgpIHtcclxuXHRcdHJldHVybiB0aGlzLnZhbHVlcy5yZ2I7XHJcblx0fSxcclxuXHRoc2xBcnJheTogZnVuY3Rpb24gKCkge1xyXG5cdFx0cmV0dXJuIHRoaXMudmFsdWVzLmhzbDtcclxuXHR9LFxyXG5cdGhzdkFycmF5OiBmdW5jdGlvbiAoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy52YWx1ZXMuaHN2O1xyXG5cdH0sXHJcblx0aHdiQXJyYXk6IGZ1bmN0aW9uICgpIHtcclxuXHRcdHZhciB2YWx1ZXMgPSB0aGlzLnZhbHVlcztcclxuXHRcdGlmICh2YWx1ZXMuYWxwaGEgIT09IDEpIHtcclxuXHRcdFx0cmV0dXJuIHZhbHVlcy5od2IuY29uY2F0KFt2YWx1ZXMuYWxwaGFdKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB2YWx1ZXMuaHdiO1xyXG5cdH0sXHJcblx0Y215a0FycmF5OiBmdW5jdGlvbiAoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy52YWx1ZXMuY215aztcclxuXHR9LFxyXG5cdHJnYmFBcnJheTogZnVuY3Rpb24gKCkge1xyXG5cdFx0dmFyIHZhbHVlcyA9IHRoaXMudmFsdWVzO1xyXG5cdFx0cmV0dXJuIHZhbHVlcy5yZ2IuY29uY2F0KFt2YWx1ZXMuYWxwaGFdKTtcclxuXHR9LFxyXG5cdGhzbGFBcnJheTogZnVuY3Rpb24gKCkge1xyXG5cdFx0dmFyIHZhbHVlcyA9IHRoaXMudmFsdWVzO1xyXG5cdFx0cmV0dXJuIHZhbHVlcy5oc2wuY29uY2F0KFt2YWx1ZXMuYWxwaGFdKTtcclxuXHR9LFxyXG5cdGFscGhhOiBmdW5jdGlvbiAodmFsKSB7XHJcblx0XHRpZiAodmFsID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMudmFsdWVzLmFscGhhO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoJ2FscGhhJywgdmFsKTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH0sXHJcblxyXG5cdHJlZDogZnVuY3Rpb24gKHZhbCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgncmdiJywgMCwgdmFsKTtcclxuXHR9LFxyXG5cdGdyZWVuOiBmdW5jdGlvbiAodmFsKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdyZ2InLCAxLCB2YWwpO1xyXG5cdH0sXHJcblx0Ymx1ZTogZnVuY3Rpb24gKHZhbCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgncmdiJywgMiwgdmFsKTtcclxuXHR9LFxyXG5cdGh1ZTogZnVuY3Rpb24gKHZhbCkge1xyXG5cdFx0aWYgKHZhbCkge1xyXG5cdFx0XHR2YWwgJT0gMzYwO1xyXG5cdFx0XHR2YWwgPSB2YWwgPCAwID8gMzYwICsgdmFsIDogdmFsO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgnaHNsJywgMCwgdmFsKTtcclxuXHR9LFxyXG5cdHNhdHVyYXRpb246IGZ1bmN0aW9uICh2YWwpIHtcclxuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ2hzbCcsIDEsIHZhbCk7XHJcblx0fSxcclxuXHRsaWdodG5lc3M6IGZ1bmN0aW9uICh2YWwpIHtcclxuXHRcdHJldHVybiB0aGlzLnNldENoYW5uZWwoJ2hzbCcsIDIsIHZhbCk7XHJcblx0fSxcclxuXHRzYXR1cmF0aW9udjogZnVuY3Rpb24gKHZhbCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgnaHN2JywgMSwgdmFsKTtcclxuXHR9LFxyXG5cdHdoaXRlbmVzczogZnVuY3Rpb24gKHZhbCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgnaHdiJywgMSwgdmFsKTtcclxuXHR9LFxyXG5cdGJsYWNrbmVzczogZnVuY3Rpb24gKHZhbCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgnaHdiJywgMiwgdmFsKTtcclxuXHR9LFxyXG5cdHZhbHVlOiBmdW5jdGlvbiAodmFsKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdoc3YnLCAyLCB2YWwpO1xyXG5cdH0sXHJcblx0Y3lhbjogZnVuY3Rpb24gKHZhbCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgnY215aycsIDAsIHZhbCk7XHJcblx0fSxcclxuXHRtYWdlbnRhOiBmdW5jdGlvbiAodmFsKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5zZXRDaGFubmVsKCdjbXlrJywgMSwgdmFsKTtcclxuXHR9LFxyXG5cdHllbGxvdzogZnVuY3Rpb24gKHZhbCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgnY215aycsIDIsIHZhbCk7XHJcblx0fSxcclxuXHRibGFjazogZnVuY3Rpb24gKHZhbCkge1xyXG5cdFx0cmV0dXJuIHRoaXMuc2V0Q2hhbm5lbCgnY215aycsIDMsIHZhbCk7XHJcblx0fSxcclxuXHJcblx0aGV4U3RyaW5nOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRyZXR1cm4gc3RyaW5nLmhleFN0cmluZyh0aGlzLnZhbHVlcy5yZ2IpO1xyXG5cdH0sXHJcblx0cmdiU3RyaW5nOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRyZXR1cm4gc3RyaW5nLnJnYlN0cmluZyh0aGlzLnZhbHVlcy5yZ2IsIHRoaXMudmFsdWVzLmFscGhhKTtcclxuXHR9LFxyXG5cdHJnYmFTdHJpbmc6IGZ1bmN0aW9uICgpIHtcclxuXHRcdHJldHVybiBzdHJpbmcucmdiYVN0cmluZyh0aGlzLnZhbHVlcy5yZ2IsIHRoaXMudmFsdWVzLmFscGhhKTtcclxuXHR9LFxyXG5cdHBlcmNlbnRTdHJpbmc6IGZ1bmN0aW9uICgpIHtcclxuXHRcdHJldHVybiBzdHJpbmcucGVyY2VudFN0cmluZyh0aGlzLnZhbHVlcy5yZ2IsIHRoaXMudmFsdWVzLmFscGhhKTtcclxuXHR9LFxyXG5cdGhzbFN0cmluZzogZnVuY3Rpb24gKCkge1xyXG5cdFx0cmV0dXJuIHN0cmluZy5oc2xTdHJpbmcodGhpcy52YWx1ZXMuaHNsLCB0aGlzLnZhbHVlcy5hbHBoYSk7XHJcblx0fSxcclxuXHRoc2xhU3RyaW5nOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRyZXR1cm4gc3RyaW5nLmhzbGFTdHJpbmcodGhpcy52YWx1ZXMuaHNsLCB0aGlzLnZhbHVlcy5hbHBoYSk7XHJcblx0fSxcclxuXHRod2JTdHJpbmc6IGZ1bmN0aW9uICgpIHtcclxuXHRcdHJldHVybiBzdHJpbmcuaHdiU3RyaW5nKHRoaXMudmFsdWVzLmh3YiwgdGhpcy52YWx1ZXMuYWxwaGEpO1xyXG5cdH0sXHJcblx0a2V5d29yZDogZnVuY3Rpb24gKCkge1xyXG5cdFx0cmV0dXJuIHN0cmluZy5rZXl3b3JkKHRoaXMudmFsdWVzLnJnYiwgdGhpcy52YWx1ZXMuYWxwaGEpO1xyXG5cdH0sXHJcblxyXG5cdHJnYk51bWJlcjogZnVuY3Rpb24gKCkge1xyXG5cdFx0dmFyIHJnYiA9IHRoaXMudmFsdWVzLnJnYjtcclxuXHRcdHJldHVybiAocmdiWzBdIDw8IDE2KSB8IChyZ2JbMV0gPDwgOCkgfCByZ2JbMl07XHJcblx0fSxcclxuXHJcblx0bHVtaW5vc2l0eTogZnVuY3Rpb24gKCkge1xyXG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNyZWxhdGl2ZWx1bWluYW5jZWRlZlxyXG5cdFx0dmFyIHJnYiA9IHRoaXMudmFsdWVzLnJnYjtcclxuXHRcdHZhciBsdW0gPSBbXTtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgcmdiLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdHZhciBjaGFuID0gcmdiW2ldIC8gMjU1O1xyXG5cdFx0XHRsdW1baV0gPSAoY2hhbiA8PSAwLjAzOTI4KSA/IGNoYW4gLyAxMi45MiA6IE1hdGgucG93KCgoY2hhbiArIDAuMDU1KSAvIDEuMDU1KSwgMi40KTtcclxuXHRcdH1cclxuXHRcdHJldHVybiAwLjIxMjYgKiBsdW1bMF0gKyAwLjcxNTIgKiBsdW1bMV0gKyAwLjA3MjIgKiBsdW1bMl07XHJcblx0fSxcclxuXHJcblx0Y29udHJhc3Q6IGZ1bmN0aW9uIChjb2xvcjIpIHtcclxuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1dDQUcyMC8jY29udHJhc3QtcmF0aW9kZWZcclxuXHRcdHZhciBsdW0xID0gdGhpcy5sdW1pbm9zaXR5KCk7XHJcblx0XHR2YXIgbHVtMiA9IGNvbG9yMi5sdW1pbm9zaXR5KCk7XHJcblx0XHRpZiAobHVtMSA+IGx1bTIpIHtcclxuXHRcdFx0cmV0dXJuIChsdW0xICsgMC4wNSkgLyAobHVtMiArIDAuMDUpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIChsdW0yICsgMC4wNSkgLyAobHVtMSArIDAuMDUpO1xyXG5cdH0sXHJcblxyXG5cdGxldmVsOiBmdW5jdGlvbiAoY29sb3IyKSB7XHJcblx0XHR2YXIgY29udHJhc3RSYXRpbyA9IHRoaXMuY29udHJhc3QoY29sb3IyKTtcclxuXHRcdGlmIChjb250cmFzdFJhdGlvID49IDcuMSkge1xyXG5cdFx0XHRyZXR1cm4gJ0FBQSc7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIChjb250cmFzdFJhdGlvID49IDQuNSkgPyAnQUEnIDogJyc7XHJcblx0fSxcclxuXHJcblx0ZGFyazogZnVuY3Rpb24gKCkge1xyXG5cdFx0Ly8gWUlRIGVxdWF0aW9uIGZyb20gaHR0cDovLzI0d2F5cy5vcmcvMjAxMC9jYWxjdWxhdGluZy1jb2xvci1jb250cmFzdFxyXG5cdFx0dmFyIHJnYiA9IHRoaXMudmFsdWVzLnJnYjtcclxuXHRcdHZhciB5aXEgPSAocmdiWzBdICogMjk5ICsgcmdiWzFdICogNTg3ICsgcmdiWzJdICogMTE0KSAvIDEwMDA7XHJcblx0XHRyZXR1cm4geWlxIDwgMTI4O1xyXG5cdH0sXHJcblxyXG5cdGxpZ2h0OiBmdW5jdGlvbiAoKSB7XHJcblx0XHRyZXR1cm4gIXRoaXMuZGFyaygpO1xyXG5cdH0sXHJcblxyXG5cdG5lZ2F0ZTogZnVuY3Rpb24gKCkge1xyXG5cdFx0dmFyIHJnYiA9IFtdO1xyXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHtcclxuXHRcdFx0cmdiW2ldID0gMjU1IC0gdGhpcy52YWx1ZXMucmdiW2ldO1xyXG5cdFx0fVxyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoJ3JnYicsIHJnYik7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cclxuXHRsaWdodGVuOiBmdW5jdGlvbiAocmF0aW8pIHtcclxuXHRcdHZhciBoc2wgPSB0aGlzLnZhbHVlcy5oc2w7XHJcblx0XHRoc2xbMl0gKz0gaHNsWzJdICogcmF0aW87XHJcblx0XHR0aGlzLnNldFZhbHVlcygnaHNsJywgaHNsKTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH0sXHJcblxyXG5cdGRhcmtlbjogZnVuY3Rpb24gKHJhdGlvKSB7XHJcblx0XHR2YXIgaHNsID0gdGhpcy52YWx1ZXMuaHNsO1xyXG5cdFx0aHNsWzJdIC09IGhzbFsyXSAqIHJhdGlvO1xyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoJ2hzbCcsIGhzbCk7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cclxuXHRzYXR1cmF0ZTogZnVuY3Rpb24gKHJhdGlvKSB7XHJcblx0XHR2YXIgaHNsID0gdGhpcy52YWx1ZXMuaHNsO1xyXG5cdFx0aHNsWzFdICs9IGhzbFsxXSAqIHJhdGlvO1xyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoJ2hzbCcsIGhzbCk7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cclxuXHRkZXNhdHVyYXRlOiBmdW5jdGlvbiAocmF0aW8pIHtcclxuXHRcdHZhciBoc2wgPSB0aGlzLnZhbHVlcy5oc2w7XHJcblx0XHRoc2xbMV0gLT0gaHNsWzFdICogcmF0aW87XHJcblx0XHR0aGlzLnNldFZhbHVlcygnaHNsJywgaHNsKTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH0sXHJcblxyXG5cdHdoaXRlbjogZnVuY3Rpb24gKHJhdGlvKSB7XHJcblx0XHR2YXIgaHdiID0gdGhpcy52YWx1ZXMuaHdiO1xyXG5cdFx0aHdiWzFdICs9IGh3YlsxXSAqIHJhdGlvO1xyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoJ2h3YicsIGh3Yik7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cclxuXHRibGFja2VuOiBmdW5jdGlvbiAocmF0aW8pIHtcclxuXHRcdHZhciBod2IgPSB0aGlzLnZhbHVlcy5od2I7XHJcblx0XHRod2JbMl0gKz0gaHdiWzJdICogcmF0aW87XHJcblx0XHR0aGlzLnNldFZhbHVlcygnaHdiJywgaHdiKTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH0sXHJcblxyXG5cdGdyZXlzY2FsZTogZnVuY3Rpb24gKCkge1xyXG5cdFx0dmFyIHJnYiA9IHRoaXMudmFsdWVzLnJnYjtcclxuXHRcdC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR3JheXNjYWxlI0NvbnZlcnRpbmdfY29sb3JfdG9fZ3JheXNjYWxlXHJcblx0XHR2YXIgdmFsID0gcmdiWzBdICogMC4zICsgcmdiWzFdICogMC41OSArIHJnYlsyXSAqIDAuMTE7XHJcblx0XHR0aGlzLnNldFZhbHVlcygncmdiJywgW3ZhbCwgdmFsLCB2YWxdKTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH0sXHJcblxyXG5cdGNsZWFyZXI6IGZ1bmN0aW9uIChyYXRpbykge1xyXG5cdFx0dmFyIGFscGhhID0gdGhpcy52YWx1ZXMuYWxwaGE7XHJcblx0XHR0aGlzLnNldFZhbHVlcygnYWxwaGEnLCBhbHBoYSAtIChhbHBoYSAqIHJhdGlvKSk7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cclxuXHRvcGFxdWVyOiBmdW5jdGlvbiAocmF0aW8pIHtcclxuXHRcdHZhciBhbHBoYSA9IHRoaXMudmFsdWVzLmFscGhhO1xyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoJ2FscGhhJywgYWxwaGEgKyAoYWxwaGEgKiByYXRpbykpO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fSxcclxuXHJcblx0cm90YXRlOiBmdW5jdGlvbiAoZGVncmVlcykge1xyXG5cdFx0dmFyIGhzbCA9IHRoaXMudmFsdWVzLmhzbDtcclxuXHRcdHZhciBodWUgPSAoaHNsWzBdICsgZGVncmVlcykgJSAzNjA7XHJcblx0XHRoc2xbMF0gPSBodWUgPCAwID8gMzYwICsgaHVlIDogaHVlO1xyXG5cdFx0dGhpcy5zZXRWYWx1ZXMoJ2hzbCcsIGhzbCk7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBQb3J0ZWQgZnJvbSBzYXNzIGltcGxlbWVudGF0aW9uIGluIENcclxuXHQgKiBodHRwczovL2dpdGh1Yi5jb20vc2Fzcy9saWJzYXNzL2Jsb2IvMGU2YjRhMjg1MDA5MjM1NmFhM2VjZTA3YzZiMjQ5ZjAyMjFjYWNlZC9mdW5jdGlvbnMuY3BwI0wyMDlcclxuXHQgKi9cclxuXHRtaXg6IGZ1bmN0aW9uIChtaXhpbkNvbG9yLCB3ZWlnaHQpIHtcclxuXHRcdHZhciBjb2xvcjEgPSB0aGlzO1xyXG5cdFx0dmFyIGNvbG9yMiA9IG1peGluQ29sb3I7XHJcblx0XHR2YXIgcCA9IHdlaWdodCA9PT0gdW5kZWZpbmVkID8gMC41IDogd2VpZ2h0O1xyXG5cclxuXHRcdHZhciB3ID0gMiAqIHAgLSAxO1xyXG5cdFx0dmFyIGEgPSBjb2xvcjEuYWxwaGEoKSAtIGNvbG9yMi5hbHBoYSgpO1xyXG5cclxuXHRcdHZhciB3MSA9ICgoKHcgKiBhID09PSAtMSkgPyB3IDogKHcgKyBhKSAvICgxICsgdyAqIGEpKSArIDEpIC8gMi4wO1xyXG5cdFx0dmFyIHcyID0gMSAtIHcxO1xyXG5cclxuXHRcdHJldHVybiB0aGlzXHJcblx0XHRcdC5yZ2IoXHJcblx0XHRcdFx0dzEgKiBjb2xvcjEucmVkKCkgKyB3MiAqIGNvbG9yMi5yZWQoKSxcclxuXHRcdFx0XHR3MSAqIGNvbG9yMS5ncmVlbigpICsgdzIgKiBjb2xvcjIuZ3JlZW4oKSxcclxuXHRcdFx0XHR3MSAqIGNvbG9yMS5ibHVlKCkgKyB3MiAqIGNvbG9yMi5ibHVlKClcclxuXHRcdFx0KVxyXG5cdFx0XHQuYWxwaGEoY29sb3IxLmFscGhhKCkgKiBwICsgY29sb3IyLmFscGhhKCkgKiAoMSAtIHApKTtcclxuXHR9LFxyXG5cclxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcclxuXHRcdHJldHVybiB0aGlzLnJnYigpO1xyXG5cdH0sXHJcblxyXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XHJcblx0XHQvLyBOT1RFKFNCKTogdXNpbmcgbm9kZS1jbG9uZSBjcmVhdGVzIGEgZGVwZW5kZW5jeSB0byBCdWZmZXIgd2hlbiB1c2luZyBicm93c2VyaWZ5LFxyXG5cdFx0Ly8gbWFraW5nIHRoZSBmaW5hbCBidWlsZCB3YXkgdG8gYmlnIHRvIGVtYmVkIGluIENoYXJ0LmpzLiBTbyBsZXQncyBkbyBpdCBtYW51YWxseSxcclxuXHRcdC8vIGFzc3VtaW5nIHRoYXQgdmFsdWVzIHRvIGNsb25lIGFyZSAxIGRpbWVuc2lvbiBhcnJheXMgY29udGFpbmluZyBvbmx5IG51bWJlcnMsXHJcblx0XHQvLyBleGNlcHQgJ2FscGhhJyB3aGljaCBpcyBhIG51bWJlci5cclxuXHRcdHZhciByZXN1bHQgPSBuZXcgQ29sb3IoKTtcclxuXHRcdHZhciBzb3VyY2UgPSB0aGlzLnZhbHVlcztcclxuXHRcdHZhciB0YXJnZXQgPSByZXN1bHQudmFsdWVzO1xyXG5cdFx0dmFyIHZhbHVlLCB0eXBlO1xyXG5cclxuXHRcdGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7XHJcblx0XHRcdGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcclxuXHRcdFx0XHR2YWx1ZSA9IHNvdXJjZVtwcm9wXTtcclxuXHRcdFx0XHR0eXBlID0gKHt9KS50b1N0cmluZy5jYWxsKHZhbHVlKTtcclxuXHRcdFx0XHRpZiAodHlwZSA9PT0gJ1tvYmplY3QgQXJyYXldJykge1xyXG5cdFx0XHRcdFx0dGFyZ2V0W3Byb3BdID0gdmFsdWUuc2xpY2UoMCk7XHJcblx0XHRcdFx0fSBlbHNlIGlmICh0eXBlID09PSAnW29iamVjdCBOdW1iZXJdJykge1xyXG5cdFx0XHRcdFx0dGFyZ2V0W3Byb3BdID0gdmFsdWU7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ3VuZXhwZWN0ZWQgY29sb3IgdmFsdWU6JywgdmFsdWUpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXN1bHQ7XHJcblx0fVxyXG59O1xyXG5cclxuQ29sb3IucHJvdG90eXBlLnNwYWNlcyA9IHtcclxuXHRyZ2I6IFsncmVkJywgJ2dyZWVuJywgJ2JsdWUnXSxcclxuXHRoc2w6IFsnaHVlJywgJ3NhdHVyYXRpb24nLCAnbGlnaHRuZXNzJ10sXHJcblx0aHN2OiBbJ2h1ZScsICdzYXR1cmF0aW9uJywgJ3ZhbHVlJ10sXHJcblx0aHdiOiBbJ2h1ZScsICd3aGl0ZW5lc3MnLCAnYmxhY2tuZXNzJ10sXHJcblx0Y215azogWydjeWFuJywgJ21hZ2VudGEnLCAneWVsbG93JywgJ2JsYWNrJ11cclxufTtcclxuXHJcbkNvbG9yLnByb3RvdHlwZS5tYXhlcyA9IHtcclxuXHRyZ2I6IFsyNTUsIDI1NSwgMjU1XSxcclxuXHRoc2w6IFszNjAsIDEwMCwgMTAwXSxcclxuXHRoc3Y6IFszNjAsIDEwMCwgMTAwXSxcclxuXHRod2I6IFszNjAsIDEwMCwgMTAwXSxcclxuXHRjbXlrOiBbMTAwLCAxMDAsIDEwMCwgMTAwXVxyXG59O1xyXG5cclxuQ29sb3IucHJvdG90eXBlLmdldFZhbHVlcyA9IGZ1bmN0aW9uIChzcGFjZSkge1xyXG5cdHZhciB2YWx1ZXMgPSB0aGlzLnZhbHVlcztcclxuXHR2YXIgdmFscyA9IHt9O1xyXG5cclxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHNwYWNlLmxlbmd0aDsgaSsrKSB7XHJcblx0XHR2YWxzW3NwYWNlLmNoYXJBdChpKV0gPSB2YWx1ZXNbc3BhY2VdW2ldO1xyXG5cdH1cclxuXHJcblx0aWYgKHZhbHVlcy5hbHBoYSAhPT0gMSkge1xyXG5cdFx0dmFscy5hID0gdmFsdWVzLmFscGhhO1xyXG5cdH1cclxuXHJcblx0Ly8ge3I6IDI1NSwgZzogMjU1LCBiOiAyNTUsIGE6IDAuNH1cclxuXHRyZXR1cm4gdmFscztcclxufTtcclxuXHJcbkNvbG9yLnByb3RvdHlwZS5zZXRWYWx1ZXMgPSBmdW5jdGlvbiAoc3BhY2UsIHZhbHMpIHtcclxuXHR2YXIgdmFsdWVzID0gdGhpcy52YWx1ZXM7XHJcblx0dmFyIHNwYWNlcyA9IHRoaXMuc3BhY2VzO1xyXG5cdHZhciBtYXhlcyA9IHRoaXMubWF4ZXM7XHJcblx0dmFyIGFscGhhID0gMTtcclxuXHR2YXIgaTtcclxuXHJcblx0dGhpcy52YWxpZCA9IHRydWU7XHJcblxyXG5cdGlmIChzcGFjZSA9PT0gJ2FscGhhJykge1xyXG5cdFx0YWxwaGEgPSB2YWxzO1xyXG5cdH0gZWxzZSBpZiAodmFscy5sZW5ndGgpIHtcclxuXHRcdC8vIFsxMCwgMTAsIDEwXVxyXG5cdFx0dmFsdWVzW3NwYWNlXSA9IHZhbHMuc2xpY2UoMCwgc3BhY2UubGVuZ3RoKTtcclxuXHRcdGFscGhhID0gdmFsc1tzcGFjZS5sZW5ndGhdO1xyXG5cdH0gZWxzZSBpZiAodmFsc1tzcGFjZS5jaGFyQXQoMCldICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdC8vIHtyOiAxMCwgZzogMTAsIGI6IDEwfVxyXG5cdFx0Zm9yIChpID0gMDsgaSA8IHNwYWNlLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdHZhbHVlc1tzcGFjZV1baV0gPSB2YWxzW3NwYWNlLmNoYXJBdChpKV07XHJcblx0XHR9XHJcblxyXG5cdFx0YWxwaGEgPSB2YWxzLmE7XHJcblx0fSBlbHNlIGlmICh2YWxzW3NwYWNlc1tzcGFjZV1bMF1dICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdC8vIHtyZWQ6IDEwLCBncmVlbjogMTAsIGJsdWU6IDEwfVxyXG5cdFx0dmFyIGNoYW5zID0gc3BhY2VzW3NwYWNlXTtcclxuXHJcblx0XHRmb3IgKGkgPSAwOyBpIDwgc3BhY2UubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0dmFsdWVzW3NwYWNlXVtpXSA9IHZhbHNbY2hhbnNbaV1dO1xyXG5cdFx0fVxyXG5cclxuXHRcdGFscGhhID0gdmFscy5hbHBoYTtcclxuXHR9XHJcblxyXG5cdHZhbHVlcy5hbHBoYSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIChhbHBoYSA9PT0gdW5kZWZpbmVkID8gdmFsdWVzLmFscGhhIDogYWxwaGEpKSk7XHJcblxyXG5cdGlmIChzcGFjZSA9PT0gJ2FscGhhJykge1xyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0dmFyIGNhcHBlZDtcclxuXHJcblx0Ly8gY2FwIHZhbHVlcyBvZiB0aGUgc3BhY2UgcHJpb3IgY29udmVydGluZyBhbGwgdmFsdWVzXHJcblx0Zm9yIChpID0gMDsgaSA8IHNwYWNlLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRjYXBwZWQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihtYXhlc1tzcGFjZV1baV0sIHZhbHVlc1tzcGFjZV1baV0pKTtcclxuXHRcdHZhbHVlc1tzcGFjZV1baV0gPSBNYXRoLnJvdW5kKGNhcHBlZCk7XHJcblx0fVxyXG5cclxuXHQvLyBjb252ZXJ0IHRvIGFsbCB0aGUgb3RoZXIgY29sb3Igc3BhY2VzXHJcblx0Zm9yICh2YXIgc25hbWUgaW4gc3BhY2VzKSB7XHJcblx0XHRpZiAoc25hbWUgIT09IHNwYWNlKSB7XHJcblx0XHRcdHZhbHVlc1tzbmFtZV0gPSBjb252ZXJ0W3NwYWNlXVtzbmFtZV0odmFsdWVzW3NwYWNlXSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gdHJ1ZTtcclxufTtcclxuXHJcbkNvbG9yLnByb3RvdHlwZS5zZXRTcGFjZSA9IGZ1bmN0aW9uIChzcGFjZSwgYXJncykge1xyXG5cdHZhciB2YWxzID0gYXJnc1swXTtcclxuXHJcblx0aWYgKHZhbHMgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0Ly8gY29sb3IucmdiKClcclxuXHRcdHJldHVybiB0aGlzLmdldFZhbHVlcyhzcGFjZSk7XHJcblx0fVxyXG5cclxuXHQvLyBjb2xvci5yZ2IoMTAsIDEwLCAxMClcclxuXHRpZiAodHlwZW9mIHZhbHMgPT09ICdudW1iZXInKSB7XHJcblx0XHR2YWxzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncyk7XHJcblx0fVxyXG5cclxuXHR0aGlzLnNldFZhbHVlcyhzcGFjZSwgdmFscyk7XHJcblx0cmV0dXJuIHRoaXM7XHJcbn07XHJcblxyXG5Db2xvci5wcm90b3R5cGUuc2V0Q2hhbm5lbCA9IGZ1bmN0aW9uIChzcGFjZSwgaW5kZXgsIHZhbCkge1xyXG5cdHZhciBzdmFsdWVzID0gdGhpcy52YWx1ZXNbc3BhY2VdO1xyXG5cdGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0Ly8gY29sb3IucmVkKClcclxuXHRcdHJldHVybiBzdmFsdWVzW2luZGV4XTtcclxuXHR9IGVsc2UgaWYgKHZhbCA9PT0gc3ZhbHVlc1tpbmRleF0pIHtcclxuXHRcdC8vIGNvbG9yLnJlZChjb2xvci5yZWQoKSlcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxuXHJcblx0Ly8gY29sb3IucmVkKDEwMClcclxuXHRzdmFsdWVzW2luZGV4XSA9IHZhbDtcclxuXHR0aGlzLnNldFZhbHVlcyhzcGFjZSwgc3ZhbHVlcyk7XHJcblxyXG5cdHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XHJcblx0d2luZG93LkNvbG9yID0gQ29sb3I7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gQ29sb3I7XHJcblxyXG59LHtcIjJcIjoyLFwiNVwiOjV9XSw0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcclxuLyogTUlUIGxpY2Vuc2UgKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gIHJnYjJoc2w6IHJnYjJoc2wsXHJcbiAgcmdiMmhzdjogcmdiMmhzdixcclxuICByZ2IyaHdiOiByZ2IyaHdiLFxyXG4gIHJnYjJjbXlrOiByZ2IyY215ayxcclxuICByZ2Iya2V5d29yZDogcmdiMmtleXdvcmQsXHJcbiAgcmdiMnh5ejogcmdiMnh5eixcclxuICByZ2IybGFiOiByZ2IybGFiLFxyXG4gIHJnYjJsY2g6IHJnYjJsY2gsXHJcblxyXG4gIGhzbDJyZ2I6IGhzbDJyZ2IsXHJcbiAgaHNsMmhzdjogaHNsMmhzdixcclxuICBoc2wyaHdiOiBoc2wyaHdiLFxyXG4gIGhzbDJjbXlrOiBoc2wyY215ayxcclxuICBoc2wya2V5d29yZDogaHNsMmtleXdvcmQsXHJcblxyXG4gIGhzdjJyZ2I6IGhzdjJyZ2IsXHJcbiAgaHN2MmhzbDogaHN2MmhzbCxcclxuICBoc3YyaHdiOiBoc3YyaHdiLFxyXG4gIGhzdjJjbXlrOiBoc3YyY215ayxcclxuICBoc3Yya2V5d29yZDogaHN2MmtleXdvcmQsXHJcblxyXG4gIGh3YjJyZ2I6IGh3YjJyZ2IsXHJcbiAgaHdiMmhzbDogaHdiMmhzbCxcclxuICBod2IyaHN2OiBod2IyaHN2LFxyXG4gIGh3YjJjbXlrOiBod2IyY215ayxcclxuICBod2Iya2V5d29yZDogaHdiMmtleXdvcmQsXHJcblxyXG4gIGNteWsycmdiOiBjbXlrMnJnYixcclxuICBjbXlrMmhzbDogY215azJoc2wsXHJcbiAgY215azJoc3Y6IGNteWsyaHN2LFxyXG4gIGNteWsyaHdiOiBjbXlrMmh3YixcclxuICBjbXlrMmtleXdvcmQ6IGNteWsya2V5d29yZCxcclxuXHJcbiAga2V5d29yZDJyZ2I6IGtleXdvcmQycmdiLFxyXG4gIGtleXdvcmQyaHNsOiBrZXl3b3JkMmhzbCxcclxuICBrZXl3b3JkMmhzdjoga2V5d29yZDJoc3YsXHJcbiAga2V5d29yZDJod2I6IGtleXdvcmQyaHdiLFxyXG4gIGtleXdvcmQyY215azoga2V5d29yZDJjbXlrLFxyXG4gIGtleXdvcmQybGFiOiBrZXl3b3JkMmxhYixcclxuICBrZXl3b3JkMnh5ejoga2V5d29yZDJ4eXosXHJcblxyXG4gIHh5ejJyZ2I6IHh5ejJyZ2IsXHJcbiAgeHl6MmxhYjogeHl6MmxhYixcclxuICB4eXoybGNoOiB4eXoybGNoLFxyXG5cclxuICBsYWIyeHl6OiBsYWIyeHl6LFxyXG4gIGxhYjJyZ2I6IGxhYjJyZ2IsXHJcbiAgbGFiMmxjaDogbGFiMmxjaCxcclxuXHJcbiAgbGNoMmxhYjogbGNoMmxhYixcclxuICBsY2gyeHl6OiBsY2gyeHl6LFxyXG4gIGxjaDJyZ2I6IGxjaDJyZ2JcclxufVxyXG5cclxuXHJcbmZ1bmN0aW9uIHJnYjJoc2wocmdiKSB7XHJcbiAgdmFyIHIgPSByZ2JbMF0vMjU1LFxyXG4gICAgICBnID0gcmdiWzFdLzI1NSxcclxuICAgICAgYiA9IHJnYlsyXS8yNTUsXHJcbiAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLFxyXG4gICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSxcclxuICAgICAgZGVsdGEgPSBtYXggLSBtaW4sXHJcbiAgICAgIGgsIHMsIGw7XHJcblxyXG4gIGlmIChtYXggPT0gbWluKVxyXG4gICAgaCA9IDA7XHJcbiAgZWxzZSBpZiAociA9PSBtYXgpXHJcbiAgICBoID0gKGcgLSBiKSAvIGRlbHRhO1xyXG4gIGVsc2UgaWYgKGcgPT0gbWF4KVxyXG4gICAgaCA9IDIgKyAoYiAtIHIpIC8gZGVsdGE7XHJcbiAgZWxzZSBpZiAoYiA9PSBtYXgpXHJcbiAgICBoID0gNCArIChyIC0gZykvIGRlbHRhO1xyXG5cclxuICBoID0gTWF0aC5taW4oaCAqIDYwLCAzNjApO1xyXG5cclxuICBpZiAoaCA8IDApXHJcbiAgICBoICs9IDM2MDtcclxuXHJcbiAgbCA9IChtaW4gKyBtYXgpIC8gMjtcclxuXHJcbiAgaWYgKG1heCA9PSBtaW4pXHJcbiAgICBzID0gMDtcclxuICBlbHNlIGlmIChsIDw9IDAuNSlcclxuICAgIHMgPSBkZWx0YSAvIChtYXggKyBtaW4pO1xyXG4gIGVsc2VcclxuICAgIHMgPSBkZWx0YSAvICgyIC0gbWF4IC0gbWluKTtcclxuXHJcbiAgcmV0dXJuIFtoLCBzICogMTAwLCBsICogMTAwXTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmdiMmhzdihyZ2IpIHtcclxuICB2YXIgciA9IHJnYlswXSxcclxuICAgICAgZyA9IHJnYlsxXSxcclxuICAgICAgYiA9IHJnYlsyXSxcclxuICAgICAgbWluID0gTWF0aC5taW4ociwgZywgYiksXHJcbiAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLFxyXG4gICAgICBkZWx0YSA9IG1heCAtIG1pbixcclxuICAgICAgaCwgcywgdjtcclxuXHJcbiAgaWYgKG1heCA9PSAwKVxyXG4gICAgcyA9IDA7XHJcbiAgZWxzZVxyXG4gICAgcyA9IChkZWx0YS9tYXggKiAxMDAwKS8xMDtcclxuXHJcbiAgaWYgKG1heCA9PSBtaW4pXHJcbiAgICBoID0gMDtcclxuICBlbHNlIGlmIChyID09IG1heClcclxuICAgIGggPSAoZyAtIGIpIC8gZGVsdGE7XHJcbiAgZWxzZSBpZiAoZyA9PSBtYXgpXHJcbiAgICBoID0gMiArIChiIC0gcikgLyBkZWx0YTtcclxuICBlbHNlIGlmIChiID09IG1heClcclxuICAgIGggPSA0ICsgKHIgLSBnKSAvIGRlbHRhO1xyXG5cclxuICBoID0gTWF0aC5taW4oaCAqIDYwLCAzNjApO1xyXG5cclxuICBpZiAoaCA8IDApXHJcbiAgICBoICs9IDM2MDtcclxuXHJcbiAgdiA9ICgobWF4IC8gMjU1KSAqIDEwMDApIC8gMTA7XHJcblxyXG4gIHJldHVybiBbaCwgcywgdl07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJnYjJod2IocmdiKSB7XHJcbiAgdmFyIHIgPSByZ2JbMF0sXHJcbiAgICAgIGcgPSByZ2JbMV0sXHJcbiAgICAgIGIgPSByZ2JbMl0sXHJcbiAgICAgIGggPSByZ2IyaHNsKHJnYilbMF0sXHJcbiAgICAgIHcgPSAxLzI1NSAqIE1hdGgubWluKHIsIE1hdGgubWluKGcsIGIpKSxcclxuICAgICAgYiA9IDEgLSAxLzI1NSAqIE1hdGgubWF4KHIsIE1hdGgubWF4KGcsIGIpKTtcclxuXHJcbiAgcmV0dXJuIFtoLCB3ICogMTAwLCBiICogMTAwXTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmdiMmNteWsocmdiKSB7XHJcbiAgdmFyIHIgPSByZ2JbMF0gLyAyNTUsXHJcbiAgICAgIGcgPSByZ2JbMV0gLyAyNTUsXHJcbiAgICAgIGIgPSByZ2JbMl0gLyAyNTUsXHJcbiAgICAgIGMsIG0sIHksIGs7XHJcblxyXG4gIGsgPSBNYXRoLm1pbigxIC0gciwgMSAtIGcsIDEgLSBiKTtcclxuICBjID0gKDEgLSByIC0gaykgLyAoMSAtIGspIHx8IDA7XHJcbiAgbSA9ICgxIC0gZyAtIGspIC8gKDEgLSBrKSB8fCAwO1xyXG4gIHkgPSAoMSAtIGIgLSBrKSAvICgxIC0gaykgfHwgMDtcclxuICByZXR1cm4gW2MgKiAxMDAsIG0gKiAxMDAsIHkgKiAxMDAsIGsgKiAxMDBdO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZ2Iya2V5d29yZChyZ2IpIHtcclxuICByZXR1cm4gcmV2ZXJzZUtleXdvcmRzW0pTT04uc3RyaW5naWZ5KHJnYildO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZ2IyeHl6KHJnYikge1xyXG4gIHZhciByID0gcmdiWzBdIC8gMjU1LFxyXG4gICAgICBnID0gcmdiWzFdIC8gMjU1LFxyXG4gICAgICBiID0gcmdiWzJdIC8gMjU1O1xyXG5cclxuICAvLyBhc3N1bWUgc1JHQlxyXG4gIHIgPSByID4gMC4wNDA0NSA/IE1hdGgucG93KCgociArIDAuMDU1KSAvIDEuMDU1KSwgMi40KSA6IChyIC8gMTIuOTIpO1xyXG4gIGcgPSBnID4gMC4wNDA0NSA/IE1hdGgucG93KCgoZyArIDAuMDU1KSAvIDEuMDU1KSwgMi40KSA6IChnIC8gMTIuOTIpO1xyXG4gIGIgPSBiID4gMC4wNDA0NSA/IE1hdGgucG93KCgoYiArIDAuMDU1KSAvIDEuMDU1KSwgMi40KSA6IChiIC8gMTIuOTIpO1xyXG5cclxuICB2YXIgeCA9IChyICogMC40MTI0KSArIChnICogMC4zNTc2KSArIChiICogMC4xODA1KTtcclxuICB2YXIgeSA9IChyICogMC4yMTI2KSArIChnICogMC43MTUyKSArIChiICogMC4wNzIyKTtcclxuICB2YXIgeiA9IChyICogMC4wMTkzKSArIChnICogMC4xMTkyKSArIChiICogMC45NTA1KTtcclxuXHJcbiAgcmV0dXJuIFt4ICogMTAwLCB5ICoxMDAsIHogKiAxMDBdO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZ2IybGFiKHJnYikge1xyXG4gIHZhciB4eXogPSByZ2IyeHl6KHJnYiksXHJcbiAgICAgICAgeCA9IHh5elswXSxcclxuICAgICAgICB5ID0geHl6WzFdLFxyXG4gICAgICAgIHogPSB4eXpbMl0sXHJcbiAgICAgICAgbCwgYSwgYjtcclxuXHJcbiAgeCAvPSA5NS4wNDc7XHJcbiAgeSAvPSAxMDA7XHJcbiAgeiAvPSAxMDguODgzO1xyXG5cclxuICB4ID0geCA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeCwgMS8zKSA6ICg3Ljc4NyAqIHgpICsgKDE2IC8gMTE2KTtcclxuICB5ID0geSA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeSwgMS8zKSA6ICg3Ljc4NyAqIHkpICsgKDE2IC8gMTE2KTtcclxuICB6ID0geiA+IDAuMDA4ODU2ID8gTWF0aC5wb3coeiwgMS8zKSA6ICg3Ljc4NyAqIHopICsgKDE2IC8gMTE2KTtcclxuXHJcbiAgbCA9ICgxMTYgKiB5KSAtIDE2O1xyXG4gIGEgPSA1MDAgKiAoeCAtIHkpO1xyXG4gIGIgPSAyMDAgKiAoeSAtIHopO1xyXG5cclxuICByZXR1cm4gW2wsIGEsIGJdO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZ2IybGNoKGFyZ3MpIHtcclxuICByZXR1cm4gbGFiMmxjaChyZ2IybGFiKGFyZ3MpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaHNsMnJnYihoc2wpIHtcclxuICB2YXIgaCA9IGhzbFswXSAvIDM2MCxcclxuICAgICAgcyA9IGhzbFsxXSAvIDEwMCxcclxuICAgICAgbCA9IGhzbFsyXSAvIDEwMCxcclxuICAgICAgdDEsIHQyLCB0MywgcmdiLCB2YWw7XHJcblxyXG4gIGlmIChzID09IDApIHtcclxuICAgIHZhbCA9IGwgKiAyNTU7XHJcbiAgICByZXR1cm4gW3ZhbCwgdmFsLCB2YWxdO1xyXG4gIH1cclxuXHJcbiAgaWYgKGwgPCAwLjUpXHJcbiAgICB0MiA9IGwgKiAoMSArIHMpO1xyXG4gIGVsc2VcclxuICAgIHQyID0gbCArIHMgLSBsICogcztcclxuICB0MSA9IDIgKiBsIC0gdDI7XHJcblxyXG4gIHJnYiA9IFswLCAwLCAwXTtcclxuICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykge1xyXG4gICAgdDMgPSBoICsgMSAvIDMgKiAtIChpIC0gMSk7XHJcbiAgICB0MyA8IDAgJiYgdDMrKztcclxuICAgIHQzID4gMSAmJiB0My0tO1xyXG5cclxuICAgIGlmICg2ICogdDMgPCAxKVxyXG4gICAgICB2YWwgPSB0MSArICh0MiAtIHQxKSAqIDYgKiB0MztcclxuICAgIGVsc2UgaWYgKDIgKiB0MyA8IDEpXHJcbiAgICAgIHZhbCA9IHQyO1xyXG4gICAgZWxzZSBpZiAoMyAqIHQzIDwgMilcclxuICAgICAgdmFsID0gdDEgKyAodDIgLSB0MSkgKiAoMiAvIDMgLSB0MykgKiA2O1xyXG4gICAgZWxzZVxyXG4gICAgICB2YWwgPSB0MTtcclxuXHJcbiAgICByZ2JbaV0gPSB2YWwgKiAyNTU7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcmdiO1xyXG59XHJcblxyXG5mdW5jdGlvbiBoc2wyaHN2KGhzbCkge1xyXG4gIHZhciBoID0gaHNsWzBdLFxyXG4gICAgICBzID0gaHNsWzFdIC8gMTAwLFxyXG4gICAgICBsID0gaHNsWzJdIC8gMTAwLFxyXG4gICAgICBzdiwgdjtcclxuXHJcbiAgaWYobCA9PT0gMCkge1xyXG4gICAgICAvLyBubyBuZWVkIHRvIGRvIGNhbGMgb24gYmxhY2tcclxuICAgICAgLy8gYWxzbyBhdm9pZHMgZGl2aWRlIGJ5IDAgZXJyb3JcclxuICAgICAgcmV0dXJuIFswLCAwLCAwXTtcclxuICB9XHJcblxyXG4gIGwgKj0gMjtcclxuICBzICo9IChsIDw9IDEpID8gbCA6IDIgLSBsO1xyXG4gIHYgPSAobCArIHMpIC8gMjtcclxuICBzdiA9ICgyICogcykgLyAobCArIHMpO1xyXG4gIHJldHVybiBbaCwgc3YgKiAxMDAsIHYgKiAxMDBdO1xyXG59XHJcblxyXG5mdW5jdGlvbiBoc2wyaHdiKGFyZ3MpIHtcclxuICByZXR1cm4gcmdiMmh3Yihoc2wycmdiKGFyZ3MpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaHNsMmNteWsoYXJncykge1xyXG4gIHJldHVybiByZ2IyY215ayhoc2wycmdiKGFyZ3MpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaHNsMmtleXdvcmQoYXJncykge1xyXG4gIHJldHVybiByZ2Iya2V5d29yZChoc2wycmdiKGFyZ3MpKTtcclxufVxyXG5cclxuXHJcbmZ1bmN0aW9uIGhzdjJyZ2IoaHN2KSB7XHJcbiAgdmFyIGggPSBoc3ZbMF0gLyA2MCxcclxuICAgICAgcyA9IGhzdlsxXSAvIDEwMCxcclxuICAgICAgdiA9IGhzdlsyXSAvIDEwMCxcclxuICAgICAgaGkgPSBNYXRoLmZsb29yKGgpICUgNjtcclxuXHJcbiAgdmFyIGYgPSBoIC0gTWF0aC5mbG9vcihoKSxcclxuICAgICAgcCA9IDI1NSAqIHYgKiAoMSAtIHMpLFxyXG4gICAgICBxID0gMjU1ICogdiAqICgxIC0gKHMgKiBmKSksXHJcbiAgICAgIHQgPSAyNTUgKiB2ICogKDEgLSAocyAqICgxIC0gZikpKSxcclxuICAgICAgdiA9IDI1NSAqIHY7XHJcblxyXG4gIHN3aXRjaChoaSkge1xyXG4gICAgY2FzZSAwOlxyXG4gICAgICByZXR1cm4gW3YsIHQsIHBdO1xyXG4gICAgY2FzZSAxOlxyXG4gICAgICByZXR1cm4gW3EsIHYsIHBdO1xyXG4gICAgY2FzZSAyOlxyXG4gICAgICByZXR1cm4gW3AsIHYsIHRdO1xyXG4gICAgY2FzZSAzOlxyXG4gICAgICByZXR1cm4gW3AsIHEsIHZdO1xyXG4gICAgY2FzZSA0OlxyXG4gICAgICByZXR1cm4gW3QsIHAsIHZdO1xyXG4gICAgY2FzZSA1OlxyXG4gICAgICByZXR1cm4gW3YsIHAsIHFdO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gaHN2MmhzbChoc3YpIHtcclxuICB2YXIgaCA9IGhzdlswXSxcclxuICAgICAgcyA9IGhzdlsxXSAvIDEwMCxcclxuICAgICAgdiA9IGhzdlsyXSAvIDEwMCxcclxuICAgICAgc2wsIGw7XHJcblxyXG4gIGwgPSAoMiAtIHMpICogdjtcclxuICBzbCA9IHMgKiB2O1xyXG4gIHNsIC89IChsIDw9IDEpID8gbCA6IDIgLSBsO1xyXG4gIHNsID0gc2wgfHwgMDtcclxuICBsIC89IDI7XHJcbiAgcmV0dXJuIFtoLCBzbCAqIDEwMCwgbCAqIDEwMF07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhzdjJod2IoYXJncykge1xyXG4gIHJldHVybiByZ2IyaHdiKGhzdjJyZ2IoYXJncykpXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhzdjJjbXlrKGFyZ3MpIHtcclxuICByZXR1cm4gcmdiMmNteWsoaHN2MnJnYihhcmdzKSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhzdjJrZXl3b3JkKGFyZ3MpIHtcclxuICByZXR1cm4gcmdiMmtleXdvcmQoaHN2MnJnYihhcmdzKSk7XHJcbn1cclxuXHJcbi8vIGh0dHA6Ly9kZXYudzMub3JnL2Nzc3dnL2Nzcy1jb2xvci8jaHdiLXRvLXJnYlxyXG5mdW5jdGlvbiBod2IycmdiKGh3Yikge1xyXG4gIHZhciBoID0gaHdiWzBdIC8gMzYwLFxyXG4gICAgICB3aCA9IGh3YlsxXSAvIDEwMCxcclxuICAgICAgYmwgPSBod2JbMl0gLyAxMDAsXHJcbiAgICAgIHJhdGlvID0gd2ggKyBibCxcclxuICAgICAgaSwgdiwgZiwgbjtcclxuXHJcbiAgLy8gd2ggKyBibCBjYW50IGJlID4gMVxyXG4gIGlmIChyYXRpbyA+IDEpIHtcclxuICAgIHdoIC89IHJhdGlvO1xyXG4gICAgYmwgLz0gcmF0aW87XHJcbiAgfVxyXG5cclxuICBpID0gTWF0aC5mbG9vcig2ICogaCk7XHJcbiAgdiA9IDEgLSBibDtcclxuICBmID0gNiAqIGggLSBpO1xyXG4gIGlmICgoaSAmIDB4MDEpICE9IDApIHtcclxuICAgIGYgPSAxIC0gZjtcclxuICB9XHJcbiAgbiA9IHdoICsgZiAqICh2IC0gd2gpOyAgLy8gbGluZWFyIGludGVycG9sYXRpb25cclxuXHJcbiAgc3dpdGNoIChpKSB7XHJcbiAgICBkZWZhdWx0OlxyXG4gICAgY2FzZSA2OlxyXG4gICAgY2FzZSAwOiByID0gdjsgZyA9IG47IGIgPSB3aDsgYnJlYWs7XHJcbiAgICBjYXNlIDE6IHIgPSBuOyBnID0gdjsgYiA9IHdoOyBicmVhaztcclxuICAgIGNhc2UgMjogciA9IHdoOyBnID0gdjsgYiA9IG47IGJyZWFrO1xyXG4gICAgY2FzZSAzOiByID0gd2g7IGcgPSBuOyBiID0gdjsgYnJlYWs7XHJcbiAgICBjYXNlIDQ6IHIgPSBuOyBnID0gd2g7IGIgPSB2OyBicmVhaztcclxuICAgIGNhc2UgNTogciA9IHY7IGcgPSB3aDsgYiA9IG47IGJyZWFrO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcclxufVxyXG5cclxuZnVuY3Rpb24gaHdiMmhzbChhcmdzKSB7XHJcbiAgcmV0dXJuIHJnYjJoc2woaHdiMnJnYihhcmdzKSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGh3YjJoc3YoYXJncykge1xyXG4gIHJldHVybiByZ2IyaHN2KGh3YjJyZ2IoYXJncykpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBod2IyY215ayhhcmdzKSB7XHJcbiAgcmV0dXJuIHJnYjJjbXlrKGh3YjJyZ2IoYXJncykpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBod2Iya2V5d29yZChhcmdzKSB7XHJcbiAgcmV0dXJuIHJnYjJrZXl3b3JkKGh3YjJyZ2IoYXJncykpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjbXlrMnJnYihjbXlrKSB7XHJcbiAgdmFyIGMgPSBjbXlrWzBdIC8gMTAwLFxyXG4gICAgICBtID0gY215a1sxXSAvIDEwMCxcclxuICAgICAgeSA9IGNteWtbMl0gLyAxMDAsXHJcbiAgICAgIGsgPSBjbXlrWzNdIC8gMTAwLFxyXG4gICAgICByLCBnLCBiO1xyXG5cclxuICByID0gMSAtIE1hdGgubWluKDEsIGMgKiAoMSAtIGspICsgayk7XHJcbiAgZyA9IDEgLSBNYXRoLm1pbigxLCBtICogKDEgLSBrKSArIGspO1xyXG4gIGIgPSAxIC0gTWF0aC5taW4oMSwgeSAqICgxIC0gaykgKyBrKTtcclxuICByZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjbXlrMmhzbChhcmdzKSB7XHJcbiAgcmV0dXJuIHJnYjJoc2woY215azJyZ2IoYXJncykpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjbXlrMmhzdihhcmdzKSB7XHJcbiAgcmV0dXJuIHJnYjJoc3YoY215azJyZ2IoYXJncykpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjbXlrMmh3YihhcmdzKSB7XHJcbiAgcmV0dXJuIHJnYjJod2IoY215azJyZ2IoYXJncykpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjbXlrMmtleXdvcmQoYXJncykge1xyXG4gIHJldHVybiByZ2Iya2V5d29yZChjbXlrMnJnYihhcmdzKSk7XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiB4eXoycmdiKHh5eikge1xyXG4gIHZhciB4ID0geHl6WzBdIC8gMTAwLFxyXG4gICAgICB5ID0geHl6WzFdIC8gMTAwLFxyXG4gICAgICB6ID0geHl6WzJdIC8gMTAwLFxyXG4gICAgICByLCBnLCBiO1xyXG5cclxuICByID0gKHggKiAzLjI0MDYpICsgKHkgKiAtMS41MzcyKSArICh6ICogLTAuNDk4Nik7XHJcbiAgZyA9ICh4ICogLTAuOTY4OSkgKyAoeSAqIDEuODc1OCkgKyAoeiAqIDAuMDQxNSk7XHJcbiAgYiA9ICh4ICogMC4wNTU3KSArICh5ICogLTAuMjA0MCkgKyAoeiAqIDEuMDU3MCk7XHJcblxyXG4gIC8vIGFzc3VtZSBzUkdCXHJcbiAgciA9IHIgPiAwLjAwMzEzMDggPyAoKDEuMDU1ICogTWF0aC5wb3cociwgMS4wIC8gMi40KSkgLSAwLjA1NSlcclxuICAgIDogciA9IChyICogMTIuOTIpO1xyXG5cclxuICBnID0gZyA+IDAuMDAzMTMwOCA/ICgoMS4wNTUgKiBNYXRoLnBvdyhnLCAxLjAgLyAyLjQpKSAtIDAuMDU1KVxyXG4gICAgOiBnID0gKGcgKiAxMi45Mik7XHJcblxyXG4gIGIgPSBiID4gMC4wMDMxMzA4ID8gKCgxLjA1NSAqIE1hdGgucG93KGIsIDEuMCAvIDIuNCkpIC0gMC4wNTUpXHJcbiAgICA6IGIgPSAoYiAqIDEyLjkyKTtcclxuXHJcbiAgciA9IE1hdGgubWluKE1hdGgubWF4KDAsIHIpLCAxKTtcclxuICBnID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgZyksIDEpO1xyXG4gIGIgPSBNYXRoLm1pbihNYXRoLm1heCgwLCBiKSwgMSk7XHJcblxyXG4gIHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHh5ejJsYWIoeHl6KSB7XHJcbiAgdmFyIHggPSB4eXpbMF0sXHJcbiAgICAgIHkgPSB4eXpbMV0sXHJcbiAgICAgIHogPSB4eXpbMl0sXHJcbiAgICAgIGwsIGEsIGI7XHJcblxyXG4gIHggLz0gOTUuMDQ3O1xyXG4gIHkgLz0gMTAwO1xyXG4gIHogLz0gMTA4Ljg4MztcclxuXHJcbiAgeCA9IHggPiAwLjAwODg1NiA/IE1hdGgucG93KHgsIDEvMykgOiAoNy43ODcgKiB4KSArICgxNiAvIDExNik7XHJcbiAgeSA9IHkgPiAwLjAwODg1NiA/IE1hdGgucG93KHksIDEvMykgOiAoNy43ODcgKiB5KSArICgxNiAvIDExNik7XHJcbiAgeiA9IHogPiAwLjAwODg1NiA/IE1hdGgucG93KHosIDEvMykgOiAoNy43ODcgKiB6KSArICgxNiAvIDExNik7XHJcblxyXG4gIGwgPSAoMTE2ICogeSkgLSAxNjtcclxuICBhID0gNTAwICogKHggLSB5KTtcclxuICBiID0gMjAwICogKHkgLSB6KTtcclxuXHJcbiAgcmV0dXJuIFtsLCBhLCBiXTtcclxufVxyXG5cclxuZnVuY3Rpb24geHl6MmxjaChhcmdzKSB7XHJcbiAgcmV0dXJuIGxhYjJsY2goeHl6MmxhYihhcmdzKSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxhYjJ4eXoobGFiKSB7XHJcbiAgdmFyIGwgPSBsYWJbMF0sXHJcbiAgICAgIGEgPSBsYWJbMV0sXHJcbiAgICAgIGIgPSBsYWJbMl0sXHJcbiAgICAgIHgsIHksIHosIHkyO1xyXG5cclxuICBpZiAobCA8PSA4KSB7XHJcbiAgICB5ID0gKGwgKiAxMDApIC8gOTAzLjM7XHJcbiAgICB5MiA9ICg3Ljc4NyAqICh5IC8gMTAwKSkgKyAoMTYgLyAxMTYpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICB5ID0gMTAwICogTWF0aC5wb3coKGwgKyAxNikgLyAxMTYsIDMpO1xyXG4gICAgeTIgPSBNYXRoLnBvdyh5IC8gMTAwLCAxLzMpO1xyXG4gIH1cclxuXHJcbiAgeCA9IHggLyA5NS4wNDcgPD0gMC4wMDg4NTYgPyB4ID0gKDk1LjA0NyAqICgoYSAvIDUwMCkgKyB5MiAtICgxNiAvIDExNikpKSAvIDcuNzg3IDogOTUuMDQ3ICogTWF0aC5wb3coKGEgLyA1MDApICsgeTIsIDMpO1xyXG5cclxuICB6ID0geiAvIDEwOC44ODMgPD0gMC4wMDg4NTkgPyB6ID0gKDEwOC44ODMgKiAoeTIgLSAoYiAvIDIwMCkgLSAoMTYgLyAxMTYpKSkgLyA3Ljc4NyA6IDEwOC44ODMgKiBNYXRoLnBvdyh5MiAtIChiIC8gMjAwKSwgMyk7XHJcblxyXG4gIHJldHVybiBbeCwgeSwgel07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxhYjJsY2gobGFiKSB7XHJcbiAgdmFyIGwgPSBsYWJbMF0sXHJcbiAgICAgIGEgPSBsYWJbMV0sXHJcbiAgICAgIGIgPSBsYWJbMl0sXHJcbiAgICAgIGhyLCBoLCBjO1xyXG5cclxuICBociA9IE1hdGguYXRhbjIoYiwgYSk7XHJcbiAgaCA9IGhyICogMzYwIC8gMiAvIE1hdGguUEk7XHJcbiAgaWYgKGggPCAwKSB7XHJcbiAgICBoICs9IDM2MDtcclxuICB9XHJcbiAgYyA9IE1hdGguc3FydChhICogYSArIGIgKiBiKTtcclxuICByZXR1cm4gW2wsIGMsIGhdO1xyXG59XHJcblxyXG5mdW5jdGlvbiBsYWIycmdiKGFyZ3MpIHtcclxuICByZXR1cm4geHl6MnJnYihsYWIyeHl6KGFyZ3MpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gbGNoMmxhYihsY2gpIHtcclxuICB2YXIgbCA9IGxjaFswXSxcclxuICAgICAgYyA9IGxjaFsxXSxcclxuICAgICAgaCA9IGxjaFsyXSxcclxuICAgICAgYSwgYiwgaHI7XHJcblxyXG4gIGhyID0gaCAvIDM2MCAqIDIgKiBNYXRoLlBJO1xyXG4gIGEgPSBjICogTWF0aC5jb3MoaHIpO1xyXG4gIGIgPSBjICogTWF0aC5zaW4oaHIpO1xyXG4gIHJldHVybiBbbCwgYSwgYl07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxjaDJ4eXooYXJncykge1xyXG4gIHJldHVybiBsYWIyeHl6KGxjaDJsYWIoYXJncykpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBsY2gycmdiKGFyZ3MpIHtcclxuICByZXR1cm4gbGFiMnJnYihsY2gybGFiKGFyZ3MpKTtcclxufVxyXG5cclxuZnVuY3Rpb24ga2V5d29yZDJyZ2Ioa2V5d29yZCkge1xyXG4gIHJldHVybiBjc3NLZXl3b3Jkc1trZXl3b3JkXTtcclxufVxyXG5cclxuZnVuY3Rpb24ga2V5d29yZDJoc2woYXJncykge1xyXG4gIHJldHVybiByZ2IyaHNsKGtleXdvcmQycmdiKGFyZ3MpKTtcclxufVxyXG5cclxuZnVuY3Rpb24ga2V5d29yZDJoc3YoYXJncykge1xyXG4gIHJldHVybiByZ2IyaHN2KGtleXdvcmQycmdiKGFyZ3MpKTtcclxufVxyXG5cclxuZnVuY3Rpb24ga2V5d29yZDJod2IoYXJncykge1xyXG4gIHJldHVybiByZ2IyaHdiKGtleXdvcmQycmdiKGFyZ3MpKTtcclxufVxyXG5cclxuZnVuY3Rpb24ga2V5d29yZDJjbXlrKGFyZ3MpIHtcclxuICByZXR1cm4gcmdiMmNteWsoa2V5d29yZDJyZ2IoYXJncykpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBrZXl3b3JkMmxhYihhcmdzKSB7XHJcbiAgcmV0dXJuIHJnYjJsYWIoa2V5d29yZDJyZ2IoYXJncykpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBrZXl3b3JkMnh5eihhcmdzKSB7XHJcbiAgcmV0dXJuIHJnYjJ4eXooa2V5d29yZDJyZ2IoYXJncykpO1xyXG59XHJcblxyXG52YXIgY3NzS2V5d29yZHMgPSB7XHJcbiAgYWxpY2VibHVlOiAgWzI0MCwyNDgsMjU1XSxcclxuICBhbnRpcXVld2hpdGU6IFsyNTAsMjM1LDIxNV0sXHJcbiAgYXF1YTogWzAsMjU1LDI1NV0sXHJcbiAgYXF1YW1hcmluZTogWzEyNywyNTUsMjEyXSxcclxuICBhenVyZTogIFsyNDAsMjU1LDI1NV0sXHJcbiAgYmVpZ2U6ICBbMjQ1LDI0NSwyMjBdLFxyXG4gIGJpc3F1ZTogWzI1NSwyMjgsMTk2XSxcclxuICBibGFjazogIFswLDAsMF0sXHJcbiAgYmxhbmNoZWRhbG1vbmQ6IFsyNTUsMjM1LDIwNV0sXHJcbiAgYmx1ZTogWzAsMCwyNTVdLFxyXG4gIGJsdWV2aW9sZXQ6IFsxMzgsNDMsMjI2XSxcclxuICBicm93bjogIFsxNjUsNDIsNDJdLFxyXG4gIGJ1cmx5d29vZDogIFsyMjIsMTg0LDEzNV0sXHJcbiAgY2FkZXRibHVlOiAgWzk1LDE1OCwxNjBdLFxyXG4gIGNoYXJ0cmV1c2U6IFsxMjcsMjU1LDBdLFxyXG4gIGNob2NvbGF0ZTogIFsyMTAsMTA1LDMwXSxcclxuICBjb3JhbDogIFsyNTUsMTI3LDgwXSxcclxuICBjb3JuZmxvd2VyYmx1ZTogWzEwMCwxNDksMjM3XSxcclxuICBjb3Juc2lsazogWzI1NSwyNDgsMjIwXSxcclxuICBjcmltc29uOiAgWzIyMCwyMCw2MF0sXHJcbiAgY3lhbjogWzAsMjU1LDI1NV0sXHJcbiAgZGFya2JsdWU6IFswLDAsMTM5XSxcclxuICBkYXJrY3lhbjogWzAsMTM5LDEzOV0sXHJcbiAgZGFya2dvbGRlbnJvZDogIFsxODQsMTM0LDExXSxcclxuICBkYXJrZ3JheTogWzE2OSwxNjksMTY5XSxcclxuICBkYXJrZ3JlZW46ICBbMCwxMDAsMF0sXHJcbiAgZGFya2dyZXk6IFsxNjksMTY5LDE2OV0sXHJcbiAgZGFya2toYWtpOiAgWzE4OSwxODMsMTA3XSxcclxuICBkYXJrbWFnZW50YTogIFsxMzksMCwxMzldLFxyXG4gIGRhcmtvbGl2ZWdyZWVuOiBbODUsMTA3LDQ3XSxcclxuICBkYXJrb3JhbmdlOiBbMjU1LDE0MCwwXSxcclxuICBkYXJrb3JjaGlkOiBbMTUzLDUwLDIwNF0sXHJcbiAgZGFya3JlZDogIFsxMzksMCwwXSxcclxuICBkYXJrc2FsbW9uOiBbMjMzLDE1MCwxMjJdLFxyXG4gIGRhcmtzZWFncmVlbjogWzE0MywxODgsMTQzXSxcclxuICBkYXJrc2xhdGVibHVlOiAgWzcyLDYxLDEzOV0sXHJcbiAgZGFya3NsYXRlZ3JheTogIFs0Nyw3OSw3OV0sXHJcbiAgZGFya3NsYXRlZ3JleTogIFs0Nyw3OSw3OV0sXHJcbiAgZGFya3R1cnF1b2lzZTogIFswLDIwNiwyMDldLFxyXG4gIGRhcmt2aW9sZXQ6IFsxNDgsMCwyMTFdLFxyXG4gIGRlZXBwaW5rOiBbMjU1LDIwLDE0N10sXHJcbiAgZGVlcHNreWJsdWU6ICBbMCwxOTEsMjU1XSxcclxuICBkaW1ncmF5OiAgWzEwNSwxMDUsMTA1XSxcclxuICBkaW1ncmV5OiAgWzEwNSwxMDUsMTA1XSxcclxuICBkb2RnZXJibHVlOiBbMzAsMTQ0LDI1NV0sXHJcbiAgZmlyZWJyaWNrOiAgWzE3OCwzNCwzNF0sXHJcbiAgZmxvcmFsd2hpdGU6ICBbMjU1LDI1MCwyNDBdLFxyXG4gIGZvcmVzdGdyZWVuOiAgWzM0LDEzOSwzNF0sXHJcbiAgZnVjaHNpYTogIFsyNTUsMCwyNTVdLFxyXG4gIGdhaW5zYm9ybzogIFsyMjAsMjIwLDIyMF0sXHJcbiAgZ2hvc3R3aGl0ZTogWzI0OCwyNDgsMjU1XSxcclxuICBnb2xkOiBbMjU1LDIxNSwwXSxcclxuICBnb2xkZW5yb2Q6ICBbMjE4LDE2NSwzMl0sXHJcbiAgZ3JheTogWzEyOCwxMjgsMTI4XSxcclxuICBncmVlbjogIFswLDEyOCwwXSxcclxuICBncmVlbnllbGxvdzogIFsxNzMsMjU1LDQ3XSxcclxuICBncmV5OiBbMTI4LDEyOCwxMjhdLFxyXG4gIGhvbmV5ZGV3OiBbMjQwLDI1NSwyNDBdLFxyXG4gIGhvdHBpbms6ICBbMjU1LDEwNSwxODBdLFxyXG4gIGluZGlhbnJlZDogIFsyMDUsOTIsOTJdLFxyXG4gIGluZGlnbzogWzc1LDAsMTMwXSxcclxuICBpdm9yeTogIFsyNTUsMjU1LDI0MF0sXHJcbiAga2hha2k6ICBbMjQwLDIzMCwxNDBdLFxyXG4gIGxhdmVuZGVyOiBbMjMwLDIzMCwyNTBdLFxyXG4gIGxhdmVuZGVyYmx1c2g6ICBbMjU1LDI0MCwyNDVdLFxyXG4gIGxhd25ncmVlbjogIFsxMjQsMjUyLDBdLFxyXG4gIGxlbW9uY2hpZmZvbjogWzI1NSwyNTAsMjA1XSxcclxuICBsaWdodGJsdWU6ICBbMTczLDIxNiwyMzBdLFxyXG4gIGxpZ2h0Y29yYWw6IFsyNDAsMTI4LDEyOF0sXHJcbiAgbGlnaHRjeWFuOiAgWzIyNCwyNTUsMjU1XSxcclxuICBsaWdodGdvbGRlbnJvZHllbGxvdzogWzI1MCwyNTAsMjEwXSxcclxuICBsaWdodGdyYXk6ICBbMjExLDIxMSwyMTFdLFxyXG4gIGxpZ2h0Z3JlZW46IFsxNDQsMjM4LDE0NF0sXHJcbiAgbGlnaHRncmV5OiAgWzIxMSwyMTEsMjExXSxcclxuICBsaWdodHBpbms6ICBbMjU1LDE4MiwxOTNdLFxyXG4gIGxpZ2h0c2FsbW9uOiAgWzI1NSwxNjAsMTIyXSxcclxuICBsaWdodHNlYWdyZWVuOiAgWzMyLDE3OCwxNzBdLFxyXG4gIGxpZ2h0c2t5Ymx1ZTogWzEzNSwyMDYsMjUwXSxcclxuICBsaWdodHNsYXRlZ3JheTogWzExOSwxMzYsMTUzXSxcclxuICBsaWdodHNsYXRlZ3JleTogWzExOSwxMzYsMTUzXSxcclxuICBsaWdodHN0ZWVsYmx1ZTogWzE3NiwxOTYsMjIyXSxcclxuICBsaWdodHllbGxvdzogIFsyNTUsMjU1LDIyNF0sXHJcbiAgbGltZTogWzAsMjU1LDBdLFxyXG4gIGxpbWVncmVlbjogIFs1MCwyMDUsNTBdLFxyXG4gIGxpbmVuOiAgWzI1MCwyNDAsMjMwXSxcclxuICBtYWdlbnRhOiAgWzI1NSwwLDI1NV0sXHJcbiAgbWFyb29uOiBbMTI4LDAsMF0sXHJcbiAgbWVkaXVtYXF1YW1hcmluZTogWzEwMiwyMDUsMTcwXSxcclxuICBtZWRpdW1ibHVlOiBbMCwwLDIwNV0sXHJcbiAgbWVkaXVtb3JjaGlkOiBbMTg2LDg1LDIxMV0sXHJcbiAgbWVkaXVtcHVycGxlOiBbMTQ3LDExMiwyMTldLFxyXG4gIG1lZGl1bXNlYWdyZWVuOiBbNjAsMTc5LDExM10sXHJcbiAgbWVkaXVtc2xhdGVibHVlOiAgWzEyMywxMDQsMjM4XSxcclxuICBtZWRpdW1zcHJpbmdncmVlbjogIFswLDI1MCwxNTRdLFxyXG4gIG1lZGl1bXR1cnF1b2lzZTogIFs3MiwyMDksMjA0XSxcclxuICBtZWRpdW12aW9sZXRyZWQ6ICBbMTk5LDIxLDEzM10sXHJcbiAgbWlkbmlnaHRibHVlOiBbMjUsMjUsMTEyXSxcclxuICBtaW50Y3JlYW06ICBbMjQ1LDI1NSwyNTBdLFxyXG4gIG1pc3R5cm9zZTogIFsyNTUsMjI4LDIyNV0sXHJcbiAgbW9jY2FzaW46IFsyNTUsMjI4LDE4MV0sXHJcbiAgbmF2YWpvd2hpdGU6ICBbMjU1LDIyMiwxNzNdLFxyXG4gIG5hdnk6IFswLDAsMTI4XSxcclxuICBvbGRsYWNlOiAgWzI1MywyNDUsMjMwXSxcclxuICBvbGl2ZTogIFsxMjgsMTI4LDBdLFxyXG4gIG9saXZlZHJhYjogIFsxMDcsMTQyLDM1XSxcclxuICBvcmFuZ2U6IFsyNTUsMTY1LDBdLFxyXG4gIG9yYW5nZXJlZDogIFsyNTUsNjksMF0sXHJcbiAgb3JjaGlkOiBbMjE4LDExMiwyMTRdLFxyXG4gIHBhbGVnb2xkZW5yb2Q6ICBbMjM4LDIzMiwxNzBdLFxyXG4gIHBhbGVncmVlbjogIFsxNTIsMjUxLDE1Ml0sXHJcbiAgcGFsZXR1cnF1b2lzZTogIFsxNzUsMjM4LDIzOF0sXHJcbiAgcGFsZXZpb2xldHJlZDogIFsyMTksMTEyLDE0N10sXHJcbiAgcGFwYXlhd2hpcDogWzI1NSwyMzksMjEzXSxcclxuICBwZWFjaHB1ZmY6ICBbMjU1LDIxOCwxODVdLFxyXG4gIHBlcnU6IFsyMDUsMTMzLDYzXSxcclxuICBwaW5rOiBbMjU1LDE5MiwyMDNdLFxyXG4gIHBsdW06IFsyMjEsMTYwLDIyMV0sXHJcbiAgcG93ZGVyYmx1ZTogWzE3NiwyMjQsMjMwXSxcclxuICBwdXJwbGU6IFsxMjgsMCwxMjhdLFxyXG4gIHJlYmVjY2FwdXJwbGU6IFsxMDIsIDUxLCAxNTNdLFxyXG4gIHJlZDogIFsyNTUsMCwwXSxcclxuICByb3N5YnJvd246ICBbMTg4LDE0MywxNDNdLFxyXG4gIHJveWFsYmx1ZTogIFs2NSwxMDUsMjI1XSxcclxuICBzYWRkbGVicm93bjogIFsxMzksNjksMTldLFxyXG4gIHNhbG1vbjogWzI1MCwxMjgsMTE0XSxcclxuICBzYW5keWJyb3duOiBbMjQ0LDE2NCw5Nl0sXHJcbiAgc2VhZ3JlZW46IFs0NiwxMzksODddLFxyXG4gIHNlYXNoZWxsOiBbMjU1LDI0NSwyMzhdLFxyXG4gIHNpZW5uYTogWzE2MCw4Miw0NV0sXHJcbiAgc2lsdmVyOiBbMTkyLDE5MiwxOTJdLFxyXG4gIHNreWJsdWU6ICBbMTM1LDIwNiwyMzVdLFxyXG4gIHNsYXRlYmx1ZTogIFsxMDYsOTAsMjA1XSxcclxuICBzbGF0ZWdyYXk6ICBbMTEyLDEyOCwxNDRdLFxyXG4gIHNsYXRlZ3JleTogIFsxMTIsMTI4LDE0NF0sXHJcbiAgc25vdzogWzI1NSwyNTAsMjUwXSxcclxuICBzcHJpbmdncmVlbjogIFswLDI1NSwxMjddLFxyXG4gIHN0ZWVsYmx1ZTogIFs3MCwxMzAsMTgwXSxcclxuICB0YW46ICBbMjEwLDE4MCwxNDBdLFxyXG4gIHRlYWw6IFswLDEyOCwxMjhdLFxyXG4gIHRoaXN0bGU6ICBbMjE2LDE5MSwyMTZdLFxyXG4gIHRvbWF0bzogWzI1NSw5OSw3MV0sXHJcbiAgdHVycXVvaXNlOiAgWzY0LDIyNCwyMDhdLFxyXG4gIHZpb2xldDogWzIzOCwxMzAsMjM4XSxcclxuICB3aGVhdDogIFsyNDUsMjIyLDE3OV0sXHJcbiAgd2hpdGU6ICBbMjU1LDI1NSwyNTVdLFxyXG4gIHdoaXRlc21va2U6IFsyNDUsMjQ1LDI0NV0sXHJcbiAgeWVsbG93OiBbMjU1LDI1NSwwXSxcclxuICB5ZWxsb3dncmVlbjogIFsxNTQsMjA1LDUwXVxyXG59O1xyXG5cclxudmFyIHJldmVyc2VLZXl3b3JkcyA9IHt9O1xyXG5mb3IgKHZhciBrZXkgaW4gY3NzS2V5d29yZHMpIHtcclxuICByZXZlcnNlS2V5d29yZHNbSlNPTi5zdHJpbmdpZnkoY3NzS2V5d29yZHNba2V5XSldID0ga2V5O1xyXG59XHJcblxyXG59LHt9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcclxudmFyIGNvbnZlcnNpb25zID0gcmVxdWlyZSg0KTtcclxuXHJcbnZhciBjb252ZXJ0ID0gZnVuY3Rpb24oKSB7XHJcbiAgIHJldHVybiBuZXcgQ29udmVydGVyKCk7XHJcbn1cclxuXHJcbmZvciAodmFyIGZ1bmMgaW4gY29udmVyc2lvbnMpIHtcclxuICAvLyBleHBvcnQgUmF3IHZlcnNpb25zXHJcbiAgY29udmVydFtmdW5jICsgXCJSYXdcIl0gPSAgKGZ1bmN0aW9uKGZ1bmMpIHtcclxuICAgIC8vIGFjY2VwdCBhcnJheSBvciBwbGFpbiBhcmdzXHJcbiAgICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgYXJnID09IFwibnVtYmVyXCIpXHJcbiAgICAgICAgYXJnID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcclxuICAgICAgcmV0dXJuIGNvbnZlcnNpb25zW2Z1bmNdKGFyZyk7XHJcbiAgICB9XHJcbiAgfSkoZnVuYyk7XHJcblxyXG4gIHZhciBwYWlyID0gLyhcXHcrKTIoXFx3KykvLmV4ZWMoZnVuYyksXHJcbiAgICAgIGZyb20gPSBwYWlyWzFdLFxyXG4gICAgICB0byA9IHBhaXJbMl07XHJcblxyXG4gIC8vIGV4cG9ydCByZ2IyaHNsIGFuZCBbXCJyZ2JcIl1bXCJoc2xcIl1cclxuICBjb252ZXJ0W2Zyb21dID0gY29udmVydFtmcm9tXSB8fCB7fTtcclxuXHJcbiAgY29udmVydFtmcm9tXVt0b10gPSBjb252ZXJ0W2Z1bmNdID0gKGZ1bmN0aW9uKGZ1bmMpIHsgXHJcbiAgICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgYXJnID09IFwibnVtYmVyXCIpXHJcbiAgICAgICAgYXJnID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcclxuICAgICAgXHJcbiAgICAgIHZhciB2YWwgPSBjb252ZXJzaW9uc1tmdW5jXShhcmcpO1xyXG4gICAgICBpZiAodHlwZW9mIHZhbCA9PSBcInN0cmluZ1wiIHx8IHZhbCA9PT0gdW5kZWZpbmVkKVxyXG4gICAgICAgIHJldHVybiB2YWw7IC8vIGtleXdvcmRcclxuXHJcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIHZhbFtpXSA9IE1hdGgucm91bmQodmFsW2ldKTtcclxuICAgICAgcmV0dXJuIHZhbDtcclxuICAgIH1cclxuICB9KShmdW5jKTtcclxufVxyXG5cclxuXHJcbi8qIENvbnZlcnRlciBkb2VzIGxhenkgY29udmVyc2lvbiBhbmQgY2FjaGluZyAqL1xyXG52YXIgQ29udmVydGVyID0gZnVuY3Rpb24oKSB7XHJcbiAgIHRoaXMuY29udnMgPSB7fTtcclxufTtcclxuXHJcbi8qIEVpdGhlciBnZXQgdGhlIHZhbHVlcyBmb3IgYSBzcGFjZSBvclxyXG4gIHNldCB0aGUgdmFsdWVzIGZvciBhIHNwYWNlLCBkZXBlbmRpbmcgb24gYXJncyAqL1xyXG5Db252ZXJ0ZXIucHJvdG90eXBlLnJvdXRlU3BhY2UgPSBmdW5jdGlvbihzcGFjZSwgYXJncykge1xyXG4gICB2YXIgdmFsdWVzID0gYXJnc1swXTtcclxuICAgaWYgKHZhbHVlcyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vIGNvbG9yLnJnYigpXHJcbiAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlcyhzcGFjZSk7XHJcbiAgIH1cclxuICAgLy8gY29sb3IucmdiKDEwLCAxMCwgMTApXHJcbiAgIGlmICh0eXBlb2YgdmFsdWVzID09IFwibnVtYmVyXCIpIHtcclxuICAgICAgdmFsdWVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncyk7ICAgICAgICBcclxuICAgfVxyXG5cclxuICAgcmV0dXJuIHRoaXMuc2V0VmFsdWVzKHNwYWNlLCB2YWx1ZXMpO1xyXG59O1xyXG4gIFxyXG4vKiBTZXQgdGhlIHZhbHVlcyBmb3IgYSBzcGFjZSwgaW52YWxpZGF0aW5nIGNhY2hlICovXHJcbkNvbnZlcnRlci5wcm90b3R5cGUuc2V0VmFsdWVzID0gZnVuY3Rpb24oc3BhY2UsIHZhbHVlcykge1xyXG4gICB0aGlzLnNwYWNlID0gc3BhY2U7XHJcbiAgIHRoaXMuY29udnMgPSB7fTtcclxuICAgdGhpcy5jb252c1tzcGFjZV0gPSB2YWx1ZXM7XHJcbiAgIHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuLyogR2V0IHRoZSB2YWx1ZXMgZm9yIGEgc3BhY2UuIElmIHRoZXJlJ3MgYWxyZWFkeVxyXG4gIGEgY29udmVyc2lvbiBmb3IgdGhlIHNwYWNlLCBmZXRjaCBpdCwgb3RoZXJ3aXNlXHJcbiAgY29tcHV0ZSBpdCAqL1xyXG5Db252ZXJ0ZXIucHJvdG90eXBlLmdldFZhbHVlcyA9IGZ1bmN0aW9uKHNwYWNlKSB7XHJcbiAgIHZhciB2YWxzID0gdGhpcy5jb252c1tzcGFjZV07XHJcbiAgIGlmICghdmFscykge1xyXG4gICAgICB2YXIgZnNwYWNlID0gdGhpcy5zcGFjZSxcclxuICAgICAgICAgIGZyb20gPSB0aGlzLmNvbnZzW2ZzcGFjZV07XHJcbiAgICAgIHZhbHMgPSBjb252ZXJ0W2ZzcGFjZV1bc3BhY2VdKGZyb20pO1xyXG5cclxuICAgICAgdGhpcy5jb252c1tzcGFjZV0gPSB2YWxzO1xyXG4gICB9XHJcbiAgcmV0dXJuIHZhbHM7XHJcbn07XHJcblxyXG5bXCJyZ2JcIiwgXCJoc2xcIiwgXCJoc3ZcIiwgXCJjbXlrXCIsIFwia2V5d29yZFwiXS5mb3JFYWNoKGZ1bmN0aW9uKHNwYWNlKSB7XHJcbiAgIENvbnZlcnRlci5wcm90b3R5cGVbc3BhY2VdID0gZnVuY3Rpb24odmFscykge1xyXG4gICAgICByZXR1cm4gdGhpcy5yb3V0ZVNwYWNlKHNwYWNlLCBhcmd1bWVudHMpO1xyXG4gICB9XHJcbn0pO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBjb252ZXJ0O1xyXG59LHtcIjRcIjo0fV0sNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbid1c2Ugc3RyaWN0J1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblx0XCJhbGljZWJsdWVcIjogWzI0MCwgMjQ4LCAyNTVdLFxyXG5cdFwiYW50aXF1ZXdoaXRlXCI6IFsyNTAsIDIzNSwgMjE1XSxcclxuXHRcImFxdWFcIjogWzAsIDI1NSwgMjU1XSxcclxuXHRcImFxdWFtYXJpbmVcIjogWzEyNywgMjU1LCAyMTJdLFxyXG5cdFwiYXp1cmVcIjogWzI0MCwgMjU1LCAyNTVdLFxyXG5cdFwiYmVpZ2VcIjogWzI0NSwgMjQ1LCAyMjBdLFxyXG5cdFwiYmlzcXVlXCI6IFsyNTUsIDIyOCwgMTk2XSxcclxuXHRcImJsYWNrXCI6IFswLCAwLCAwXSxcclxuXHRcImJsYW5jaGVkYWxtb25kXCI6IFsyNTUsIDIzNSwgMjA1XSxcclxuXHRcImJsdWVcIjogWzAsIDAsIDI1NV0sXHJcblx0XCJibHVldmlvbGV0XCI6IFsxMzgsIDQzLCAyMjZdLFxyXG5cdFwiYnJvd25cIjogWzE2NSwgNDIsIDQyXSxcclxuXHRcImJ1cmx5d29vZFwiOiBbMjIyLCAxODQsIDEzNV0sXHJcblx0XCJjYWRldGJsdWVcIjogWzk1LCAxNTgsIDE2MF0sXHJcblx0XCJjaGFydHJldXNlXCI6IFsxMjcsIDI1NSwgMF0sXHJcblx0XCJjaG9jb2xhdGVcIjogWzIxMCwgMTA1LCAzMF0sXHJcblx0XCJjb3JhbFwiOiBbMjU1LCAxMjcsIDgwXSxcclxuXHRcImNvcm5mbG93ZXJibHVlXCI6IFsxMDAsIDE0OSwgMjM3XSxcclxuXHRcImNvcm5zaWxrXCI6IFsyNTUsIDI0OCwgMjIwXSxcclxuXHRcImNyaW1zb25cIjogWzIyMCwgMjAsIDYwXSxcclxuXHRcImN5YW5cIjogWzAsIDI1NSwgMjU1XSxcclxuXHRcImRhcmtibHVlXCI6IFswLCAwLCAxMzldLFxyXG5cdFwiZGFya2N5YW5cIjogWzAsIDEzOSwgMTM5XSxcclxuXHRcImRhcmtnb2xkZW5yb2RcIjogWzE4NCwgMTM0LCAxMV0sXHJcblx0XCJkYXJrZ3JheVwiOiBbMTY5LCAxNjksIDE2OV0sXHJcblx0XCJkYXJrZ3JlZW5cIjogWzAsIDEwMCwgMF0sXHJcblx0XCJkYXJrZ3JleVwiOiBbMTY5LCAxNjksIDE2OV0sXHJcblx0XCJkYXJra2hha2lcIjogWzE4OSwgMTgzLCAxMDddLFxyXG5cdFwiZGFya21hZ2VudGFcIjogWzEzOSwgMCwgMTM5XSxcclxuXHRcImRhcmtvbGl2ZWdyZWVuXCI6IFs4NSwgMTA3LCA0N10sXHJcblx0XCJkYXJrb3JhbmdlXCI6IFsyNTUsIDE0MCwgMF0sXHJcblx0XCJkYXJrb3JjaGlkXCI6IFsxNTMsIDUwLCAyMDRdLFxyXG5cdFwiZGFya3JlZFwiOiBbMTM5LCAwLCAwXSxcclxuXHRcImRhcmtzYWxtb25cIjogWzIzMywgMTUwLCAxMjJdLFxyXG5cdFwiZGFya3NlYWdyZWVuXCI6IFsxNDMsIDE4OCwgMTQzXSxcclxuXHRcImRhcmtzbGF0ZWJsdWVcIjogWzcyLCA2MSwgMTM5XSxcclxuXHRcImRhcmtzbGF0ZWdyYXlcIjogWzQ3LCA3OSwgNzldLFxyXG5cdFwiZGFya3NsYXRlZ3JleVwiOiBbNDcsIDc5LCA3OV0sXHJcblx0XCJkYXJrdHVycXVvaXNlXCI6IFswLCAyMDYsIDIwOV0sXHJcblx0XCJkYXJrdmlvbGV0XCI6IFsxNDgsIDAsIDIxMV0sXHJcblx0XCJkZWVwcGlua1wiOiBbMjU1LCAyMCwgMTQ3XSxcclxuXHRcImRlZXBza3libHVlXCI6IFswLCAxOTEsIDI1NV0sXHJcblx0XCJkaW1ncmF5XCI6IFsxMDUsIDEwNSwgMTA1XSxcclxuXHRcImRpbWdyZXlcIjogWzEwNSwgMTA1LCAxMDVdLFxyXG5cdFwiZG9kZ2VyYmx1ZVwiOiBbMzAsIDE0NCwgMjU1XSxcclxuXHRcImZpcmVicmlja1wiOiBbMTc4LCAzNCwgMzRdLFxyXG5cdFwiZmxvcmFsd2hpdGVcIjogWzI1NSwgMjUwLCAyNDBdLFxyXG5cdFwiZm9yZXN0Z3JlZW5cIjogWzM0LCAxMzksIDM0XSxcclxuXHRcImZ1Y2hzaWFcIjogWzI1NSwgMCwgMjU1XSxcclxuXHRcImdhaW5zYm9yb1wiOiBbMjIwLCAyMjAsIDIyMF0sXHJcblx0XCJnaG9zdHdoaXRlXCI6IFsyNDgsIDI0OCwgMjU1XSxcclxuXHRcImdvbGRcIjogWzI1NSwgMjE1LCAwXSxcclxuXHRcImdvbGRlbnJvZFwiOiBbMjE4LCAxNjUsIDMyXSxcclxuXHRcImdyYXlcIjogWzEyOCwgMTI4LCAxMjhdLFxyXG5cdFwiZ3JlZW5cIjogWzAsIDEyOCwgMF0sXHJcblx0XCJncmVlbnllbGxvd1wiOiBbMTczLCAyNTUsIDQ3XSxcclxuXHRcImdyZXlcIjogWzEyOCwgMTI4LCAxMjhdLFxyXG5cdFwiaG9uZXlkZXdcIjogWzI0MCwgMjU1LCAyNDBdLFxyXG5cdFwiaG90cGlua1wiOiBbMjU1LCAxMDUsIDE4MF0sXHJcblx0XCJpbmRpYW5yZWRcIjogWzIwNSwgOTIsIDkyXSxcclxuXHRcImluZGlnb1wiOiBbNzUsIDAsIDEzMF0sXHJcblx0XCJpdm9yeVwiOiBbMjU1LCAyNTUsIDI0MF0sXHJcblx0XCJraGFraVwiOiBbMjQwLCAyMzAsIDE0MF0sXHJcblx0XCJsYXZlbmRlclwiOiBbMjMwLCAyMzAsIDI1MF0sXHJcblx0XCJsYXZlbmRlcmJsdXNoXCI6IFsyNTUsIDI0MCwgMjQ1XSxcclxuXHRcImxhd25ncmVlblwiOiBbMTI0LCAyNTIsIDBdLFxyXG5cdFwibGVtb25jaGlmZm9uXCI6IFsyNTUsIDI1MCwgMjA1XSxcclxuXHRcImxpZ2h0Ymx1ZVwiOiBbMTczLCAyMTYsIDIzMF0sXHJcblx0XCJsaWdodGNvcmFsXCI6IFsyNDAsIDEyOCwgMTI4XSxcclxuXHRcImxpZ2h0Y3lhblwiOiBbMjI0LCAyNTUsIDI1NV0sXHJcblx0XCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBbMjUwLCAyNTAsIDIxMF0sXHJcblx0XCJsaWdodGdyYXlcIjogWzIxMSwgMjExLCAyMTFdLFxyXG5cdFwibGlnaHRncmVlblwiOiBbMTQ0LCAyMzgsIDE0NF0sXHJcblx0XCJsaWdodGdyZXlcIjogWzIxMSwgMjExLCAyMTFdLFxyXG5cdFwibGlnaHRwaW5rXCI6IFsyNTUsIDE4MiwgMTkzXSxcclxuXHRcImxpZ2h0c2FsbW9uXCI6IFsyNTUsIDE2MCwgMTIyXSxcclxuXHRcImxpZ2h0c2VhZ3JlZW5cIjogWzMyLCAxNzgsIDE3MF0sXHJcblx0XCJsaWdodHNreWJsdWVcIjogWzEzNSwgMjA2LCAyNTBdLFxyXG5cdFwibGlnaHRzbGF0ZWdyYXlcIjogWzExOSwgMTM2LCAxNTNdLFxyXG5cdFwibGlnaHRzbGF0ZWdyZXlcIjogWzExOSwgMTM2LCAxNTNdLFxyXG5cdFwibGlnaHRzdGVlbGJsdWVcIjogWzE3NiwgMTk2LCAyMjJdLFxyXG5cdFwibGlnaHR5ZWxsb3dcIjogWzI1NSwgMjU1LCAyMjRdLFxyXG5cdFwibGltZVwiOiBbMCwgMjU1LCAwXSxcclxuXHRcImxpbWVncmVlblwiOiBbNTAsIDIwNSwgNTBdLFxyXG5cdFwibGluZW5cIjogWzI1MCwgMjQwLCAyMzBdLFxyXG5cdFwibWFnZW50YVwiOiBbMjU1LCAwLCAyNTVdLFxyXG5cdFwibWFyb29uXCI6IFsxMjgsIDAsIDBdLFxyXG5cdFwibWVkaXVtYXF1YW1hcmluZVwiOiBbMTAyLCAyMDUsIDE3MF0sXHJcblx0XCJtZWRpdW1ibHVlXCI6IFswLCAwLCAyMDVdLFxyXG5cdFwibWVkaXVtb3JjaGlkXCI6IFsxODYsIDg1LCAyMTFdLFxyXG5cdFwibWVkaXVtcHVycGxlXCI6IFsxNDcsIDExMiwgMjE5XSxcclxuXHRcIm1lZGl1bXNlYWdyZWVuXCI6IFs2MCwgMTc5LCAxMTNdLFxyXG5cdFwibWVkaXVtc2xhdGVibHVlXCI6IFsxMjMsIDEwNCwgMjM4XSxcclxuXHRcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFswLCAyNTAsIDE1NF0sXHJcblx0XCJtZWRpdW10dXJxdW9pc2VcIjogWzcyLCAyMDksIDIwNF0sXHJcblx0XCJtZWRpdW12aW9sZXRyZWRcIjogWzE5OSwgMjEsIDEzM10sXHJcblx0XCJtaWRuaWdodGJsdWVcIjogWzI1LCAyNSwgMTEyXSxcclxuXHRcIm1pbnRjcmVhbVwiOiBbMjQ1LCAyNTUsIDI1MF0sXHJcblx0XCJtaXN0eXJvc2VcIjogWzI1NSwgMjI4LCAyMjVdLFxyXG5cdFwibW9jY2FzaW5cIjogWzI1NSwgMjI4LCAxODFdLFxyXG5cdFwibmF2YWpvd2hpdGVcIjogWzI1NSwgMjIyLCAxNzNdLFxyXG5cdFwibmF2eVwiOiBbMCwgMCwgMTI4XSxcclxuXHRcIm9sZGxhY2VcIjogWzI1MywgMjQ1LCAyMzBdLFxyXG5cdFwib2xpdmVcIjogWzEyOCwgMTI4LCAwXSxcclxuXHRcIm9saXZlZHJhYlwiOiBbMTA3LCAxNDIsIDM1XSxcclxuXHRcIm9yYW5nZVwiOiBbMjU1LCAxNjUsIDBdLFxyXG5cdFwib3JhbmdlcmVkXCI6IFsyNTUsIDY5LCAwXSxcclxuXHRcIm9yY2hpZFwiOiBbMjE4LCAxMTIsIDIxNF0sXHJcblx0XCJwYWxlZ29sZGVucm9kXCI6IFsyMzgsIDIzMiwgMTcwXSxcclxuXHRcInBhbGVncmVlblwiOiBbMTUyLCAyNTEsIDE1Ml0sXHJcblx0XCJwYWxldHVycXVvaXNlXCI6IFsxNzUsIDIzOCwgMjM4XSxcclxuXHRcInBhbGV2aW9sZXRyZWRcIjogWzIxOSwgMTEyLCAxNDddLFxyXG5cdFwicGFwYXlhd2hpcFwiOiBbMjU1LCAyMzksIDIxM10sXHJcblx0XCJwZWFjaHB1ZmZcIjogWzI1NSwgMjE4LCAxODVdLFxyXG5cdFwicGVydVwiOiBbMjA1LCAxMzMsIDYzXSxcclxuXHRcInBpbmtcIjogWzI1NSwgMTkyLCAyMDNdLFxyXG5cdFwicGx1bVwiOiBbMjIxLCAxNjAsIDIyMV0sXHJcblx0XCJwb3dkZXJibHVlXCI6IFsxNzYsIDIyNCwgMjMwXSxcclxuXHRcInB1cnBsZVwiOiBbMTI4LCAwLCAxMjhdLFxyXG5cdFwicmViZWNjYXB1cnBsZVwiOiBbMTAyLCA1MSwgMTUzXSxcclxuXHRcInJlZFwiOiBbMjU1LCAwLCAwXSxcclxuXHRcInJvc3licm93blwiOiBbMTg4LCAxNDMsIDE0M10sXHJcblx0XCJyb3lhbGJsdWVcIjogWzY1LCAxMDUsIDIyNV0sXHJcblx0XCJzYWRkbGVicm93blwiOiBbMTM5LCA2OSwgMTldLFxyXG5cdFwic2FsbW9uXCI6IFsyNTAsIDEyOCwgMTE0XSxcclxuXHRcInNhbmR5YnJvd25cIjogWzI0NCwgMTY0LCA5Nl0sXHJcblx0XCJzZWFncmVlblwiOiBbNDYsIDEzOSwgODddLFxyXG5cdFwic2Vhc2hlbGxcIjogWzI1NSwgMjQ1LCAyMzhdLFxyXG5cdFwic2llbm5hXCI6IFsxNjAsIDgyLCA0NV0sXHJcblx0XCJzaWx2ZXJcIjogWzE5MiwgMTkyLCAxOTJdLFxyXG5cdFwic2t5Ymx1ZVwiOiBbMTM1LCAyMDYsIDIzNV0sXHJcblx0XCJzbGF0ZWJsdWVcIjogWzEwNiwgOTAsIDIwNV0sXHJcblx0XCJzbGF0ZWdyYXlcIjogWzExMiwgMTI4LCAxNDRdLFxyXG5cdFwic2xhdGVncmV5XCI6IFsxMTIsIDEyOCwgMTQ0XSxcclxuXHRcInNub3dcIjogWzI1NSwgMjUwLCAyNTBdLFxyXG5cdFwic3ByaW5nZ3JlZW5cIjogWzAsIDI1NSwgMTI3XSxcclxuXHRcInN0ZWVsYmx1ZVwiOiBbNzAsIDEzMCwgMTgwXSxcclxuXHRcInRhblwiOiBbMjEwLCAxODAsIDE0MF0sXHJcblx0XCJ0ZWFsXCI6IFswLCAxMjgsIDEyOF0sXHJcblx0XCJ0aGlzdGxlXCI6IFsyMTYsIDE5MSwgMjE2XSxcclxuXHRcInRvbWF0b1wiOiBbMjU1LCA5OSwgNzFdLFxyXG5cdFwidHVycXVvaXNlXCI6IFs2NCwgMjI0LCAyMDhdLFxyXG5cdFwidmlvbGV0XCI6IFsyMzgsIDEzMCwgMjM4XSxcclxuXHRcIndoZWF0XCI6IFsyNDUsIDIyMiwgMTc5XSxcclxuXHRcIndoaXRlXCI6IFsyNTUsIDI1NSwgMjU1XSxcclxuXHRcIndoaXRlc21va2VcIjogWzI0NSwgMjQ1LCAyNDVdLFxyXG5cdFwieWVsbG93XCI6IFsyNTUsIDI1NSwgMF0sXHJcblx0XCJ5ZWxsb3dncmVlblwiOiBbMTU0LCAyMDUsIDUwXVxyXG59O1xyXG5cclxufSx7fV0sNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbi8qKlxyXG4gKiBAbmFtZXNwYWNlIENoYXJ0XHJcbiAqL1xyXG52YXIgQ2hhcnQgPSByZXF1aXJlKDMwKSgpO1xyXG5cclxuQ2hhcnQuaGVscGVycyA9IHJlcXVpcmUoNDYpO1xyXG5cclxuLy8gQHRvZG8gZGlzcGF0Y2ggdGhlc2UgaGVscGVycyBpbnRvIGFwcHJvcHJpYXRlZCBoZWxwZXJzL2hlbHBlcnMuKiBmaWxlIGFuZCB3cml0ZSB1bml0IHRlc3RzIVxyXG5yZXF1aXJlKDI4KShDaGFydCk7XHJcblxyXG5DaGFydC5BbmltYXRpb24gPSByZXF1aXJlKDIyKTtcclxuQ2hhcnQuYW5pbWF0aW9uU2VydmljZSA9IHJlcXVpcmUoMjMpO1xyXG5DaGFydC5kZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xyXG5DaGFydC5FbGVtZW50ID0gcmVxdWlyZSgyNyk7XHJcbkNoYXJ0LmVsZW1lbnRzID0gcmVxdWlyZSg0MSk7XHJcbkNoYXJ0LkludGVyYWN0aW9uID0gcmVxdWlyZSgyOSk7XHJcbkNoYXJ0LmxheW91dHMgPSByZXF1aXJlKDMxKTtcclxuQ2hhcnQucGxhdGZvcm0gPSByZXF1aXJlKDQ5KTtcclxuQ2hhcnQucGx1Z2lucyA9IHJlcXVpcmUoMzIpO1xyXG5DaGFydC5TY2FsZSA9IHJlcXVpcmUoMzMpO1xyXG5DaGFydC5zY2FsZVNlcnZpY2UgPSByZXF1aXJlKDM0KTtcclxuQ2hhcnQuVGlja3MgPSByZXF1aXJlKDM1KTtcclxuQ2hhcnQuVG9vbHRpcCA9IHJlcXVpcmUoMzYpO1xyXG5cclxucmVxdWlyZSgyNCkoQ2hhcnQpO1xyXG5yZXF1aXJlKDI1KShDaGFydCk7XHJcblxyXG5yZXF1aXJlKDU2KShDaGFydCk7XHJcbnJlcXVpcmUoNTQpKENoYXJ0KTtcclxucmVxdWlyZSg1NSkoQ2hhcnQpO1xyXG5yZXF1aXJlKDU3KShDaGFydCk7XHJcbnJlcXVpcmUoNTgpKENoYXJ0KTtcclxucmVxdWlyZSg1OSkoQ2hhcnQpO1xyXG5cclxuLy8gQ29udHJvbGxlcnMgbXVzdCBiZSBsb2FkZWQgYWZ0ZXIgZWxlbWVudHNcclxuLy8gU2VlIENoYXJ0LmNvcmUuZGF0YXNldENvbnRyb2xsZXIuZGF0YUVsZW1lbnRUeXBlXHJcbnJlcXVpcmUoMTUpKENoYXJ0KTtcclxucmVxdWlyZSgxNikoQ2hhcnQpO1xyXG5yZXF1aXJlKDE3KShDaGFydCk7XHJcbnJlcXVpcmUoMTgpKENoYXJ0KTtcclxucmVxdWlyZSgxOSkoQ2hhcnQpO1xyXG5yZXF1aXJlKDIwKShDaGFydCk7XHJcbnJlcXVpcmUoMjEpKENoYXJ0KTtcclxuXHJcbnJlcXVpcmUoOCkoQ2hhcnQpO1xyXG5yZXF1aXJlKDkpKENoYXJ0KTtcclxucmVxdWlyZSgxMCkoQ2hhcnQpO1xyXG5yZXF1aXJlKDExKShDaGFydCk7XHJcbnJlcXVpcmUoMTIpKENoYXJ0KTtcclxucmVxdWlyZSgxMykoQ2hhcnQpO1xyXG5yZXF1aXJlKDE0KShDaGFydCk7XHJcblxyXG4vLyBMb2FkaW5nIGJ1aWx0LWluIHBsdWdpbnNcclxudmFyIHBsdWdpbnMgPSByZXF1aXJlKDUwKTtcclxuZm9yICh2YXIgayBpbiBwbHVnaW5zKSB7XHJcblx0aWYgKHBsdWdpbnMuaGFzT3duUHJvcGVydHkoaykpIHtcclxuXHRcdENoYXJ0LnBsdWdpbnMucmVnaXN0ZXIocGx1Z2luc1trXSk7XHJcblx0fVxyXG59XHJcblxyXG5DaGFydC5wbGF0Zm9ybS5pbml0aWFsaXplKCk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IENoYXJ0O1xyXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuXHR3aW5kb3cuQ2hhcnQgPSBDaGFydDtcclxufVxyXG5cclxuLy8gREVQUkVDQVRJT05TXHJcblxyXG4vKipcclxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIG5vdCBhdmFpbGFibGUgYW55bW9yZVxyXG4gKiBAbmFtZXNwYWNlIENoYXJ0LkxlZ2VuZFxyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuMS41XHJcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcclxuICogQHByaXZhdGVcclxuICovXHJcbkNoYXJ0LkxlZ2VuZCA9IHBsdWdpbnMubGVnZW5kLl9lbGVtZW50O1xyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBub3QgYXZhaWxhYmxlIGFueW1vcmVcclxuICogQG5hbWVzcGFjZSBDaGFydC5UaXRsZVxyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuMS41XHJcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcclxuICogQHByaXZhdGVcclxuICovXHJcbkNoYXJ0LlRpdGxlID0gcGx1Z2lucy50aXRsZS5fZWxlbWVudDtcclxuXHJcbi8qKlxyXG4gKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdXNlIENoYXJ0LnBsdWdpbnMgaW5zdGVhZFxyXG4gKiBAbmFtZXNwYWNlIENoYXJ0LnBsdWdpblNlcnZpY2VcclxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjEuNVxyXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5DaGFydC5wbHVnaW5TZXJ2aWNlID0gQ2hhcnQucGx1Z2lucztcclxuXHJcbi8qKlxyXG4gKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgaW5oZXJpdGluZyBmcm9tIENoYXJ0LlBsdWdpbmdCYXNlIGhhcyBub1xyXG4gKiBlZmZlY3QsIGluc3RlYWQgc2ltcGx5IGNyZWF0ZS9yZWdpc3RlciBwbHVnaW5zIHZpYSBwbGFpbiBKYXZhU2NyaXB0IG9iamVjdHMuXHJcbiAqIEBpbnRlcmZhY2UgQ2hhcnQuUGx1Z2luQmFzZVxyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNS4wXHJcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcclxuICogQHByaXZhdGVcclxuICovXHJcbkNoYXJ0LlBsdWdpbkJhc2UgPSBDaGFydC5FbGVtZW50LmV4dGVuZCh7fSk7XHJcblxyXG4vKipcclxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBDaGFydC5oZWxwZXJzLmNhbnZhcyBpbnN0ZWFkLlxyXG4gKiBAbmFtZXNwYWNlIENoYXJ0LmNhbnZhc0hlbHBlcnNcclxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjYuMFxyXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5DaGFydC5jYW52YXNIZWxwZXJzID0gQ2hhcnQuaGVscGVycy5jYW52YXM7XHJcblxyXG4vKipcclxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBDaGFydC5sYXlvdXRzIGluc3RlYWQuXHJcbiAqIEBuYW1lc3BhY2UgQ2hhcnQubGF5b3V0U2VydmljZVxyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuOC4wXHJcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcclxuICogQHByaXZhdGVcclxuICovXHJcbkNoYXJ0LmxheW91dFNlcnZpY2UgPSBDaGFydC5sYXlvdXRzO1xyXG5cclxufSx7XCIxMFwiOjEwLFwiMTFcIjoxMSxcIjEyXCI6MTIsXCIxM1wiOjEzLFwiMTRcIjoxNCxcIjE1XCI6MTUsXCIxNlwiOjE2LFwiMTdcIjoxNyxcIjE4XCI6MTgsXCIxOVwiOjE5LFwiMjBcIjoyMCxcIjIxXCI6MjEsXCIyMlwiOjIyLFwiMjNcIjoyMyxcIjI0XCI6MjQsXCIyNVwiOjI1LFwiMjZcIjoyNixcIjI3XCI6MjcsXCIyOFwiOjI4LFwiMjlcIjoyOSxcIjMwXCI6MzAsXCIzMVwiOjMxLFwiMzJcIjozMixcIjMzXCI6MzMsXCIzNFwiOjM0LFwiMzVcIjozNSxcIjM2XCI6MzYsXCI0MVwiOjQxLFwiNDZcIjo0NixcIjQ5XCI6NDksXCI1MFwiOjUwLFwiNTRcIjo1NCxcIjU1XCI6NTUsXCI1NlwiOjU2LFwiNTdcIjo1NyxcIjU4XCI6NTgsXCI1OVwiOjU5LFwiOFwiOjgsXCI5XCI6OX1dLDg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENoYXJ0KSB7XHJcblxyXG5cdENoYXJ0LkJhciA9IGZ1bmN0aW9uKGNvbnRleHQsIGNvbmZpZykge1xyXG5cdFx0Y29uZmlnLnR5cGUgPSAnYmFyJztcclxuXHJcblx0XHRyZXR1cm4gbmV3IENoYXJ0KGNvbnRleHQsIGNvbmZpZyk7XHJcblx0fTtcclxuXHJcbn07XHJcblxyXG59LHt9XSw5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDaGFydCkge1xyXG5cclxuXHRDaGFydC5CdWJibGUgPSBmdW5jdGlvbihjb250ZXh0LCBjb25maWcpIHtcclxuXHRcdGNvbmZpZy50eXBlID0gJ2J1YmJsZSc7XHJcblx0XHRyZXR1cm4gbmV3IENoYXJ0KGNvbnRleHQsIGNvbmZpZyk7XHJcblx0fTtcclxuXHJcbn07XHJcblxyXG59LHt9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcclxuXHJcblx0Q2hhcnQuRG91Z2hudXQgPSBmdW5jdGlvbihjb250ZXh0LCBjb25maWcpIHtcclxuXHRcdGNvbmZpZy50eXBlID0gJ2RvdWdobnV0JztcclxuXHJcblx0XHRyZXR1cm4gbmV3IENoYXJ0KGNvbnRleHQsIGNvbmZpZyk7XHJcblx0fTtcclxuXHJcbn07XHJcblxyXG59LHt9XSwxMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcclxuXHJcblx0Q2hhcnQuTGluZSA9IGZ1bmN0aW9uKGNvbnRleHQsIGNvbmZpZykge1xyXG5cdFx0Y29uZmlnLnR5cGUgPSAnbGluZSc7XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBDaGFydChjb250ZXh0LCBjb25maWcpO1xyXG5cdH07XHJcblxyXG59O1xyXG5cclxufSx7fV0sMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENoYXJ0KSB7XHJcblxyXG5cdENoYXJ0LlBvbGFyQXJlYSA9IGZ1bmN0aW9uKGNvbnRleHQsIGNvbmZpZykge1xyXG5cdFx0Y29uZmlnLnR5cGUgPSAncG9sYXJBcmVhJztcclxuXHJcblx0XHRyZXR1cm4gbmV3IENoYXJ0KGNvbnRleHQsIGNvbmZpZyk7XHJcblx0fTtcclxuXHJcbn07XHJcblxyXG59LHt9XSwxMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcclxuXHJcblx0Q2hhcnQuUmFkYXIgPSBmdW5jdGlvbihjb250ZXh0LCBjb25maWcpIHtcclxuXHRcdGNvbmZpZy50eXBlID0gJ3JhZGFyJztcclxuXHJcblx0XHRyZXR1cm4gbmV3IENoYXJ0KGNvbnRleHQsIGNvbmZpZyk7XHJcblx0fTtcclxuXHJcbn07XHJcblxyXG59LHt9XSwxNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcclxuXHRDaGFydC5TY2F0dGVyID0gZnVuY3Rpb24oY29udGV4dCwgY29uZmlnKSB7XHJcblx0XHRjb25maWcudHlwZSA9ICdzY2F0dGVyJztcclxuXHRcdHJldHVybiBuZXcgQ2hhcnQoY29udGV4dCwgY29uZmlnKTtcclxuXHR9O1xyXG59O1xyXG5cclxufSx7fV0sMTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcclxudmFyIGVsZW1lbnRzID0gcmVxdWlyZSg0MSk7XHJcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XHJcblxyXG5kZWZhdWx0cy5fc2V0KCdiYXInLCB7XHJcblx0aG92ZXI6IHtcclxuXHRcdG1vZGU6ICdsYWJlbCdcclxuXHR9LFxyXG5cclxuXHRzY2FsZXM6IHtcclxuXHRcdHhBeGVzOiBbe1xyXG5cdFx0XHR0eXBlOiAnY2F0ZWdvcnknLFxyXG5cclxuXHRcdFx0Ly8gU3BlY2lmaWMgdG8gQmFyIENvbnRyb2xsZXJcclxuXHRcdFx0Y2F0ZWdvcnlQZXJjZW50YWdlOiAwLjgsXHJcblx0XHRcdGJhclBlcmNlbnRhZ2U6IDAuOSxcclxuXHJcblx0XHRcdC8vIG9mZnNldCBzZXR0aW5nc1xyXG5cdFx0XHRvZmZzZXQ6IHRydWUsXHJcblxyXG5cdFx0XHQvLyBncmlkIGxpbmUgc2V0dGluZ3NcclxuXHRcdFx0Z3JpZExpbmVzOiB7XHJcblx0XHRcdFx0b2Zmc2V0R3JpZExpbmVzOiB0cnVlXHJcblx0XHRcdH1cclxuXHRcdH1dLFxyXG5cclxuXHRcdHlBeGVzOiBbe1xyXG5cdFx0XHR0eXBlOiAnbGluZWFyJ1xyXG5cdFx0fV1cclxuXHR9XHJcbn0pO1xyXG5cclxuZGVmYXVsdHMuX3NldCgnaG9yaXpvbnRhbEJhcicsIHtcclxuXHRob3Zlcjoge1xyXG5cdFx0bW9kZTogJ2luZGV4JyxcclxuXHRcdGF4aXM6ICd5J1xyXG5cdH0sXHJcblxyXG5cdHNjYWxlczoge1xyXG5cdFx0eEF4ZXM6IFt7XHJcblx0XHRcdHR5cGU6ICdsaW5lYXInLFxyXG5cdFx0XHRwb3NpdGlvbjogJ2JvdHRvbSdcclxuXHRcdH1dLFxyXG5cclxuXHRcdHlBeGVzOiBbe1xyXG5cdFx0XHRwb3NpdGlvbjogJ2xlZnQnLFxyXG5cdFx0XHR0eXBlOiAnY2F0ZWdvcnknLFxyXG5cclxuXHRcdFx0Ly8gU3BlY2lmaWMgdG8gSG9yaXpvbnRhbCBCYXIgQ29udHJvbGxlclxyXG5cdFx0XHRjYXRlZ29yeVBlcmNlbnRhZ2U6IDAuOCxcclxuXHRcdFx0YmFyUGVyY2VudGFnZTogMC45LFxyXG5cclxuXHRcdFx0Ly8gb2Zmc2V0IHNldHRpbmdzXHJcblx0XHRcdG9mZnNldDogdHJ1ZSxcclxuXHJcblx0XHRcdC8vIGdyaWQgbGluZSBzZXR0aW5nc1xyXG5cdFx0XHRncmlkTGluZXM6IHtcclxuXHRcdFx0XHRvZmZzZXRHcmlkTGluZXM6IHRydWVcclxuXHRcdFx0fVxyXG5cdFx0fV1cclxuXHR9LFxyXG5cclxuXHRlbGVtZW50czoge1xyXG5cdFx0cmVjdGFuZ2xlOiB7XHJcblx0XHRcdGJvcmRlclNraXBwZWQ6ICdsZWZ0J1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdHRvb2x0aXBzOiB7XHJcblx0XHRjYWxsYmFja3M6IHtcclxuXHRcdFx0dGl0bGU6IGZ1bmN0aW9uKGl0ZW0sIGRhdGEpIHtcclxuXHRcdFx0XHQvLyBQaWNrIGZpcnN0IHhMYWJlbCBmb3Igbm93XHJcblx0XHRcdFx0dmFyIHRpdGxlID0gJyc7XHJcblxyXG5cdFx0XHRcdGlmIChpdGVtLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdGlmIChpdGVtWzBdLnlMYWJlbCkge1xyXG5cdFx0XHRcdFx0XHR0aXRsZSA9IGl0ZW1bMF0ueUxhYmVsO1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChkYXRhLmxhYmVscy5sZW5ndGggPiAwICYmIGl0ZW1bMF0uaW5kZXggPCBkYXRhLmxhYmVscy5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0dGl0bGUgPSBkYXRhLmxhYmVsc1tpdGVtWzBdLmluZGV4XTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiB0aXRsZTtcclxuXHRcdFx0fSxcclxuXHJcblx0XHRcdGxhYmVsOiBmdW5jdGlvbihpdGVtLCBkYXRhKSB7XHJcblx0XHRcdFx0dmFyIGRhdGFzZXRMYWJlbCA9IGRhdGEuZGF0YXNldHNbaXRlbS5kYXRhc2V0SW5kZXhdLmxhYmVsIHx8ICcnO1xyXG5cdFx0XHRcdHJldHVybiBkYXRhc2V0TGFiZWwgKyAnOiAnICsgaXRlbS54TGFiZWw7XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0XHRtb2RlOiAnaW5kZXgnLFxyXG5cdFx0YXhpczogJ3knXHJcblx0fVxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBDb21wdXRlcyB0aGUgXCJvcHRpbWFsXCIgc2FtcGxlIHNpemUgdG8gbWFpbnRhaW4gYmFycyBlcXVhbGx5IHNpemVkIHdoaWxlIHByZXZlbnRpbmcgb3ZlcmxhcC5cclxuICogQHByaXZhdGVcclxuICovXHJcbmZ1bmN0aW9uIGNvbXB1dGVNaW5TYW1wbGVTaXplKHNjYWxlLCBwaXhlbHMpIHtcclxuXHR2YXIgbWluID0gc2NhbGUuaXNIb3Jpem9udGFsKCkgPyBzY2FsZS53aWR0aCA6IHNjYWxlLmhlaWdodDtcclxuXHR2YXIgdGlja3MgPSBzY2FsZS5nZXRUaWNrcygpO1xyXG5cdHZhciBwcmV2LCBjdXJyLCBpLCBpbGVuO1xyXG5cclxuXHRmb3IgKGkgPSAxLCBpbGVuID0gcGl4ZWxzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xyXG5cdFx0bWluID0gTWF0aC5taW4obWluLCBwaXhlbHNbaV0gLSBwaXhlbHNbaSAtIDFdKTtcclxuXHR9XHJcblxyXG5cdGZvciAoaSA9IDAsIGlsZW4gPSB0aWNrcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcclxuXHRcdGN1cnIgPSBzY2FsZS5nZXRQaXhlbEZvclRpY2soaSk7XHJcblx0XHRtaW4gPSBpID4gMCA/IE1hdGgubWluKG1pbiwgY3VyciAtIHByZXYpIDogbWluO1xyXG5cdFx0cHJldiA9IGN1cnI7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gbWluO1xyXG59XHJcblxyXG4vKipcclxuICogQ29tcHV0ZXMgYW4gXCJpZGVhbFwiIGNhdGVnb3J5IGJhc2VkIG9uIHRoZSBhYnNvbHV0ZSBiYXIgdGhpY2tuZXNzIG9yLCBpZiB1bmRlZmluZWQgb3IgbnVsbCxcclxuICogdXNlcyB0aGUgc21hbGxlc3QgaW50ZXJ2YWwgKHNlZSBjb21wdXRlTWluU2FtcGxlU2l6ZSkgdGhhdCBwcmV2ZW50cyBiYXIgb3ZlcmxhcHBpbmcuIFRoaXNcclxuICogbW9kZSBjdXJyZW50bHkgYWx3YXlzIGdlbmVyYXRlcyBiYXJzIGVxdWFsbHkgc2l6ZWQgKHVudGlsIHdlIGludHJvZHVjZSBzY3JpcHRhYmxlIG9wdGlvbnM/KS5cclxuICogQHByaXZhdGVcclxuICovXHJcbmZ1bmN0aW9uIGNvbXB1dGVGaXRDYXRlZ29yeVRyYWl0cyhpbmRleCwgcnVsZXIsIG9wdGlvbnMpIHtcclxuXHR2YXIgdGhpY2tuZXNzID0gb3B0aW9ucy5iYXJUaGlja25lc3M7XHJcblx0dmFyIGNvdW50ID0gcnVsZXIuc3RhY2tDb3VudDtcclxuXHR2YXIgY3VyciA9IHJ1bGVyLnBpeGVsc1tpbmRleF07XHJcblx0dmFyIHNpemUsIHJhdGlvO1xyXG5cclxuXHRpZiAoaGVscGVycy5pc051bGxPclVuZGVmKHRoaWNrbmVzcykpIHtcclxuXHRcdHNpemUgPSBydWxlci5taW4gKiBvcHRpb25zLmNhdGVnb3J5UGVyY2VudGFnZTtcclxuXHRcdHJhdGlvID0gb3B0aW9ucy5iYXJQZXJjZW50YWdlO1xyXG5cdH0gZWxzZSB7XHJcblx0XHQvLyBXaGVuIGJhciB0aGlja25lc3MgaXMgZW5mb3JjZWQsIGNhdGVnb3J5IGFuZCBiYXIgcGVyY2VudGFnZXMgYXJlIGlnbm9yZWQuXHJcblx0XHQvLyBOb3RlKFNCKTogd2UgY291bGQgYWRkIHN1cHBvcnQgZm9yIHJlbGF0aXZlIGJhciB0aGlja25lc3MgKGUuZy4gYmFyVGhpY2tuZXNzOiAnNTAlJylcclxuXHRcdC8vIGFuZCBkZXByZWNhdGUgYmFyUGVyY2VudGFnZSBzaW5jZSB0aGlzIHZhbHVlIGlzIGlnbm9yZWQgd2hlbiB0aGlja25lc3MgaXMgYWJzb2x1dGUuXHJcblx0XHRzaXplID0gdGhpY2tuZXNzICogY291bnQ7XHJcblx0XHRyYXRpbyA9IDE7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4ge1xyXG5cdFx0Y2h1bms6IHNpemUgLyBjb3VudCxcclxuXHRcdHJhdGlvOiByYXRpbyxcclxuXHRcdHN0YXJ0OiBjdXJyIC0gKHNpemUgLyAyKVxyXG5cdH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb21wdXRlcyBhbiBcIm9wdGltYWxcIiBjYXRlZ29yeSB0aGF0IGdsb2JhbGx5IGFycmFuZ2VzIGJhcnMgc2lkZSBieSBzaWRlIChubyBnYXAgd2hlblxyXG4gKiBwZXJjZW50YWdlIG9wdGlvbnMgYXJlIDEpLCBiYXNlZCBvbiB0aGUgcHJldmlvdXMgYW5kIGZvbGxvd2luZyBjYXRlZ29yaWVzLiBUaGlzIG1vZGVcclxuICogZ2VuZXJhdGVzIGJhcnMgd2l0aCBkaWZmZXJlbnQgd2lkdGhzIHdoZW4gZGF0YSBhcmUgbm90IGV2ZW5seSBzcGFjZWQuXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5mdW5jdGlvbiBjb21wdXRlRmxleENhdGVnb3J5VHJhaXRzKGluZGV4LCBydWxlciwgb3B0aW9ucykge1xyXG5cdHZhciBwaXhlbHMgPSBydWxlci5waXhlbHM7XHJcblx0dmFyIGN1cnIgPSBwaXhlbHNbaW5kZXhdO1xyXG5cdHZhciBwcmV2ID0gaW5kZXggPiAwID8gcGl4ZWxzW2luZGV4IC0gMV0gOiBudWxsO1xyXG5cdHZhciBuZXh0ID0gaW5kZXggPCBwaXhlbHMubGVuZ3RoIC0gMSA/IHBpeGVsc1tpbmRleCArIDFdIDogbnVsbDtcclxuXHR2YXIgcGVyY2VudCA9IG9wdGlvbnMuY2F0ZWdvcnlQZXJjZW50YWdlO1xyXG5cdHZhciBzdGFydCwgc2l6ZTtcclxuXHJcblx0aWYgKHByZXYgPT09IG51bGwpIHtcclxuXHRcdC8vIGZpcnN0IGRhdGE6IGl0cyBzaXplIGlzIGRvdWJsZSBiYXNlZCBvbiB0aGUgbmV4dCBwb2ludCBvcixcclxuXHRcdC8vIGlmIGl0J3MgYWxzbyB0aGUgbGFzdCBkYXRhLCB3ZSB1c2UgdGhlIHNjYWxlIGVuZCBleHRyZW1pdHkuXHJcblx0XHRwcmV2ID0gY3VyciAtIChuZXh0ID09PSBudWxsID8gcnVsZXIuZW5kIC0gY3VyciA6IG5leHQgLSBjdXJyKTtcclxuXHR9XHJcblxyXG5cdGlmIChuZXh0ID09PSBudWxsKSB7XHJcblx0XHQvLyBsYXN0IGRhdGE6IGl0cyBzaXplIGlzIGFsc28gZG91YmxlIGJhc2VkIG9uIHRoZSBwcmV2aW91cyBwb2ludC5cclxuXHRcdG5leHQgPSBjdXJyICsgY3VyciAtIHByZXY7XHJcblx0fVxyXG5cclxuXHRzdGFydCA9IGN1cnIgLSAoKGN1cnIgLSBwcmV2KSAvIDIpICogcGVyY2VudDtcclxuXHRzaXplID0gKChuZXh0IC0gcHJldikgLyAyKSAqIHBlcmNlbnQ7XHJcblxyXG5cdHJldHVybiB7XHJcblx0XHRjaHVuazogc2l6ZSAvIHJ1bGVyLnN0YWNrQ291bnQsXHJcblx0XHRyYXRpbzogb3B0aW9ucy5iYXJQZXJjZW50YWdlLFxyXG5cdFx0c3RhcnQ6IHN0YXJ0XHJcblx0fTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDaGFydCkge1xyXG5cclxuXHRDaGFydC5jb250cm9sbGVycy5iYXIgPSBDaGFydC5EYXRhc2V0Q29udHJvbGxlci5leHRlbmQoe1xyXG5cclxuXHRcdGRhdGFFbGVtZW50VHlwZTogZWxlbWVudHMuUmVjdGFuZ2xlLFxyXG5cclxuXHRcdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgbWV0YTtcclxuXHJcblx0XHRcdENoYXJ0LkRhdGFzZXRDb250cm9sbGVyLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KG1lLCBhcmd1bWVudHMpO1xyXG5cclxuXHRcdFx0bWV0YSA9IG1lLmdldE1ldGEoKTtcclxuXHRcdFx0bWV0YS5zdGFjayA9IG1lLmdldERhdGFzZXQoKS5zdGFjaztcclxuXHRcdFx0bWV0YS5iYXIgPSB0cnVlO1xyXG5cdFx0fSxcclxuXHJcblx0XHR1cGRhdGU6IGZ1bmN0aW9uKHJlc2V0KSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciByZWN0cyA9IG1lLmdldE1ldGEoKS5kYXRhO1xyXG5cdFx0XHR2YXIgaSwgaWxlbjtcclxuXHJcblx0XHRcdG1lLl9ydWxlciA9IG1lLmdldFJ1bGVyKCk7XHJcblxyXG5cdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0gcmVjdHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XHJcblx0XHRcdFx0bWUudXBkYXRlRWxlbWVudChyZWN0c1tpXSwgaSwgcmVzZXQpO1xyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cclxuXHRcdHVwZGF0ZUVsZW1lbnQ6IGZ1bmN0aW9uKHJlY3RhbmdsZSwgaW5kZXgsIHJlc2V0KSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xyXG5cdFx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcclxuXHRcdFx0dmFyIGRhdGFzZXQgPSBtZS5nZXREYXRhc2V0KCk7XHJcblx0XHRcdHZhciBjdXN0b20gPSByZWN0YW5nbGUuY3VzdG9tIHx8IHt9O1xyXG5cdFx0XHR2YXIgcmVjdGFuZ2xlT3B0aW9ucyA9IGNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMucmVjdGFuZ2xlO1xyXG5cclxuXHRcdFx0cmVjdGFuZ2xlLl94U2NhbGUgPSBtZS5nZXRTY2FsZUZvcklkKG1ldGEueEF4aXNJRCk7XHJcblx0XHRcdHJlY3RhbmdsZS5feVNjYWxlID0gbWUuZ2V0U2NhbGVGb3JJZChtZXRhLnlBeGlzSUQpO1xyXG5cdFx0XHRyZWN0YW5nbGUuX2RhdGFzZXRJbmRleCA9IG1lLmluZGV4O1xyXG5cdFx0XHRyZWN0YW5nbGUuX2luZGV4ID0gaW5kZXg7XHJcblxyXG5cdFx0XHRyZWN0YW5nbGUuX21vZGVsID0ge1xyXG5cdFx0XHRcdGRhdGFzZXRMYWJlbDogZGF0YXNldC5sYWJlbCxcclxuXHRcdFx0XHRsYWJlbDogY2hhcnQuZGF0YS5sYWJlbHNbaW5kZXhdLFxyXG5cdFx0XHRcdGJvcmRlclNraXBwZWQ6IGN1c3RvbS5ib3JkZXJTa2lwcGVkID8gY3VzdG9tLmJvcmRlclNraXBwZWQgOiByZWN0YW5nbGVPcHRpb25zLmJvcmRlclNraXBwZWQsXHJcblx0XHRcdFx0YmFja2dyb3VuZENvbG9yOiBjdXN0b20uYmFja2dyb3VuZENvbG9yID8gY3VzdG9tLmJhY2tncm91bmRDb2xvciA6IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQuYmFja2dyb3VuZENvbG9yLCBpbmRleCwgcmVjdGFuZ2xlT3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IpLFxyXG5cdFx0XHRcdGJvcmRlckNvbG9yOiBjdXN0b20uYm9yZGVyQ29sb3IgPyBjdXN0b20uYm9yZGVyQ29sb3IgOiBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LmJvcmRlckNvbG9yLCBpbmRleCwgcmVjdGFuZ2xlT3B0aW9ucy5ib3JkZXJDb2xvciksXHJcblx0XHRcdFx0Ym9yZGVyV2lkdGg6IGN1c3RvbS5ib3JkZXJXaWR0aCA/IGN1c3RvbS5ib3JkZXJXaWR0aCA6IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQuYm9yZGVyV2lkdGgsIGluZGV4LCByZWN0YW5nbGVPcHRpb25zLmJvcmRlcldpZHRoKVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0bWUudXBkYXRlRWxlbWVudEdlb21ldHJ5KHJlY3RhbmdsZSwgaW5kZXgsIHJlc2V0KTtcclxuXHJcblx0XHRcdHJlY3RhbmdsZS5waXZvdCgpO1xyXG5cdFx0fSxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHRcdHVwZGF0ZUVsZW1lbnRHZW9tZXRyeTogZnVuY3Rpb24ocmVjdGFuZ2xlLCBpbmRleCwgcmVzZXQpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIG1vZGVsID0gcmVjdGFuZ2xlLl9tb2RlbDtcclxuXHRcdFx0dmFyIHZzY2FsZSA9IG1lLmdldFZhbHVlU2NhbGUoKTtcclxuXHRcdFx0dmFyIGJhc2UgPSB2c2NhbGUuZ2V0QmFzZVBpeGVsKCk7XHJcblx0XHRcdHZhciBob3Jpem9udGFsID0gdnNjYWxlLmlzSG9yaXpvbnRhbCgpO1xyXG5cdFx0XHR2YXIgcnVsZXIgPSBtZS5fcnVsZXIgfHwgbWUuZ2V0UnVsZXIoKTtcclxuXHRcdFx0dmFyIHZwaXhlbHMgPSBtZS5jYWxjdWxhdGVCYXJWYWx1ZVBpeGVscyhtZS5pbmRleCwgaW5kZXgpO1xyXG5cdFx0XHR2YXIgaXBpeGVscyA9IG1lLmNhbGN1bGF0ZUJhckluZGV4UGl4ZWxzKG1lLmluZGV4LCBpbmRleCwgcnVsZXIpO1xyXG5cclxuXHRcdFx0bW9kZWwuaG9yaXpvbnRhbCA9IGhvcml6b250YWw7XHJcblx0XHRcdG1vZGVsLmJhc2UgPSByZXNldCA/IGJhc2UgOiB2cGl4ZWxzLmJhc2U7XHJcblx0XHRcdG1vZGVsLnggPSBob3Jpem9udGFsID8gcmVzZXQgPyBiYXNlIDogdnBpeGVscy5oZWFkIDogaXBpeGVscy5jZW50ZXI7XHJcblx0XHRcdG1vZGVsLnkgPSBob3Jpem9udGFsID8gaXBpeGVscy5jZW50ZXIgOiByZXNldCA/IGJhc2UgOiB2cGl4ZWxzLmhlYWQ7XHJcblx0XHRcdG1vZGVsLmhlaWdodCA9IGhvcml6b250YWwgPyBpcGl4ZWxzLnNpemUgOiB1bmRlZmluZWQ7XHJcblx0XHRcdG1vZGVsLndpZHRoID0gaG9yaXpvbnRhbCA/IHVuZGVmaW5lZCA6IGlwaXhlbHMuc2l6ZTtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRnZXRWYWx1ZVNjYWxlSWQ6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRNZXRhKCkueUF4aXNJRDtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRnZXRJbmRleFNjYWxlSWQ6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRNZXRhKCkueEF4aXNJRDtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRnZXRWYWx1ZVNjYWxlOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0U2NhbGVGb3JJZCh0aGlzLmdldFZhbHVlU2NhbGVJZCgpKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRnZXRJbmRleFNjYWxlOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0U2NhbGVGb3JJZCh0aGlzLmdldEluZGV4U2NhbGVJZCgpKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBSZXR1cm5zIHRoZSBzdGFja3MgYmFzZWQgb24gZ3JvdXBzIGFuZCBiYXIgdmlzaWJpbGl0eS5cclxuXHRcdCAqIEBwYXJhbSB7TnVtYmVyfSBbbGFzdF0gLSBUaGUgZGF0YXNldCBpbmRleFxyXG5cdFx0ICogQHJldHVybnMge0FycmF5fSBUaGUgc3RhY2sgbGlzdFxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cdFx0X2dldFN0YWNrczogZnVuY3Rpb24obGFzdCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgY2hhcnQgPSBtZS5jaGFydDtcclxuXHRcdFx0dmFyIHNjYWxlID0gbWUuZ2V0SW5kZXhTY2FsZSgpO1xyXG5cdFx0XHR2YXIgc3RhY2tlZCA9IHNjYWxlLm9wdGlvbnMuc3RhY2tlZDtcclxuXHRcdFx0dmFyIGlsZW4gPSBsYXN0ID09PSB1bmRlZmluZWQgPyBjaGFydC5kYXRhLmRhdGFzZXRzLmxlbmd0aCA6IGxhc3QgKyAxO1xyXG5cdFx0XHR2YXIgc3RhY2tzID0gW107XHJcblx0XHRcdHZhciBpLCBtZXRhO1xyXG5cclxuXHRcdFx0Zm9yIChpID0gMDsgaSA8IGlsZW47ICsraSkge1xyXG5cdFx0XHRcdG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShpKTtcclxuXHRcdFx0XHRpZiAobWV0YS5iYXIgJiYgY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShpKSAmJlxyXG5cdFx0XHRcdFx0KHN0YWNrZWQgPT09IGZhbHNlIHx8XHJcblx0XHRcdFx0XHQoc3RhY2tlZCA9PT0gdHJ1ZSAmJiBzdGFja3MuaW5kZXhPZihtZXRhLnN0YWNrKSA9PT0gLTEpIHx8XHJcblx0XHRcdFx0XHQoc3RhY2tlZCA9PT0gdW5kZWZpbmVkICYmIChtZXRhLnN0YWNrID09PSB1bmRlZmluZWQgfHwgc3RhY2tzLmluZGV4T2YobWV0YS5zdGFjaykgPT09IC0xKSkpKSB7XHJcblx0XHRcdFx0XHRzdGFja3MucHVzaChtZXRhLnN0YWNrKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBzdGFja3M7XHJcblx0XHR9LFxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyB0aGUgZWZmZWN0aXZlIG51bWJlciBvZiBzdGFja3MgYmFzZWQgb24gZ3JvdXBzIGFuZCBiYXIgdmlzaWJpbGl0eS5cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHRcdGdldFN0YWNrQ291bnQ6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5fZ2V0U3RhY2tzKCkubGVuZ3RoO1xyXG5cdFx0fSxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybnMgdGhlIHN0YWNrIGluZGV4IGZvciB0aGUgZ2l2ZW4gZGF0YXNldCBiYXNlZCBvbiBncm91cHMgYW5kIGJhciB2aXNpYmlsaXR5LlxyXG5cdFx0ICogQHBhcmFtIHtOdW1iZXJ9IFtkYXRhc2V0SW5kZXhdIC0gVGhlIGRhdGFzZXQgaW5kZXhcclxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBbbmFtZV0gLSBUaGUgc3RhY2sgbmFtZSB0byBmaW5kXHJcblx0XHQgKiBAcmV0dXJucyB7TnVtYmVyfSBUaGUgc3RhY2sgaW5kZXhcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHRcdGdldFN0YWNrSW5kZXg6IGZ1bmN0aW9uKGRhdGFzZXRJbmRleCwgbmFtZSkge1xyXG5cdFx0XHR2YXIgc3RhY2tzID0gdGhpcy5fZ2V0U3RhY2tzKGRhdGFzZXRJbmRleCk7XHJcblx0XHRcdHZhciBpbmRleCA9IChuYW1lICE9PSB1bmRlZmluZWQpXHJcblx0XHRcdFx0PyBzdGFja3MuaW5kZXhPZihuYW1lKVxyXG5cdFx0XHRcdDogLTE7IC8vIGluZGV4T2YgcmV0dXJucyAtMSBpZiBlbGVtZW50IGlzIG5vdCBwcmVzZW50XHJcblxyXG5cdFx0XHRyZXR1cm4gKGluZGV4ID09PSAtMSlcclxuXHRcdFx0XHQ/IHN0YWNrcy5sZW5ndGggLSAxXHJcblx0XHRcdFx0OiBpbmRleDtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRnZXRSdWxlcjogZnVuY3Rpb24oKSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciBzY2FsZSA9IG1lLmdldEluZGV4U2NhbGUoKTtcclxuXHRcdFx0dmFyIHN0YWNrQ291bnQgPSBtZS5nZXRTdGFja0NvdW50KCk7XHJcblx0XHRcdHZhciBkYXRhc2V0SW5kZXggPSBtZS5pbmRleDtcclxuXHRcdFx0dmFyIGlzSG9yaXpvbnRhbCA9IHNjYWxlLmlzSG9yaXpvbnRhbCgpO1xyXG5cdFx0XHR2YXIgc3RhcnQgPSBpc0hvcml6b250YWwgPyBzY2FsZS5sZWZ0IDogc2NhbGUudG9wO1xyXG5cdFx0XHR2YXIgZW5kID0gc3RhcnQgKyAoaXNIb3Jpem9udGFsID8gc2NhbGUud2lkdGggOiBzY2FsZS5oZWlnaHQpO1xyXG5cdFx0XHR2YXIgcGl4ZWxzID0gW107XHJcblx0XHRcdHZhciBpLCBpbGVuLCBtaW47XHJcblxyXG5cdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0gbWUuZ2V0TWV0YSgpLmRhdGEubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XHJcblx0XHRcdFx0cGl4ZWxzLnB1c2goc2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShudWxsLCBpLCBkYXRhc2V0SW5kZXgpKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bWluID0gaGVscGVycy5pc051bGxPclVuZGVmKHNjYWxlLm9wdGlvbnMuYmFyVGhpY2tuZXNzKVxyXG5cdFx0XHRcdD8gY29tcHV0ZU1pblNhbXBsZVNpemUoc2NhbGUsIHBpeGVscylcclxuXHRcdFx0XHQ6IC0xO1xyXG5cclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRtaW46IG1pbixcclxuXHRcdFx0XHRwaXhlbHM6IHBpeGVscyxcclxuXHRcdFx0XHRzdGFydDogc3RhcnQsXHJcblx0XHRcdFx0ZW5kOiBlbmQsXHJcblx0XHRcdFx0c3RhY2tDb3VudDogc3RhY2tDb3VudCxcclxuXHRcdFx0XHRzY2FsZTogc2NhbGVcclxuXHRcdFx0fTtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBOb3RlOiBwaXhlbCB2YWx1ZXMgYXJlIG5vdCBjbGFtcGVkIHRvIHRoZSBzY2FsZSBhcmVhLlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cdFx0Y2FsY3VsYXRlQmFyVmFsdWVQaXhlbHM6IGZ1bmN0aW9uKGRhdGFzZXRJbmRleCwgaW5kZXgpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XHJcblx0XHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xyXG5cdFx0XHR2YXIgc2NhbGUgPSBtZS5nZXRWYWx1ZVNjYWxlKCk7XHJcblx0XHRcdHZhciBkYXRhc2V0cyA9IGNoYXJ0LmRhdGEuZGF0YXNldHM7XHJcblx0XHRcdHZhciB2YWx1ZSA9IHNjYWxlLmdldFJpZ2h0VmFsdWUoZGF0YXNldHNbZGF0YXNldEluZGV4XS5kYXRhW2luZGV4XSk7XHJcblx0XHRcdHZhciBzdGFja2VkID0gc2NhbGUub3B0aW9ucy5zdGFja2VkO1xyXG5cdFx0XHR2YXIgc3RhY2sgPSBtZXRhLnN0YWNrO1xyXG5cdFx0XHR2YXIgc3RhcnQgPSAwO1xyXG5cdFx0XHR2YXIgaSwgaW1ldGEsIGl2YWx1ZSwgYmFzZSwgaGVhZCwgc2l6ZTtcclxuXHJcblx0XHRcdGlmIChzdGFja2VkIHx8IChzdGFja2VkID09PSB1bmRlZmluZWQgJiYgc3RhY2sgIT09IHVuZGVmaW5lZCkpIHtcclxuXHRcdFx0XHRmb3IgKGkgPSAwOyBpIDwgZGF0YXNldEluZGV4OyArK2kpIHtcclxuXHRcdFx0XHRcdGltZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoaSk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKGltZXRhLmJhciAmJlxyXG5cdFx0XHRcdFx0XHRpbWV0YS5zdGFjayA9PT0gc3RhY2sgJiZcclxuXHRcdFx0XHRcdFx0aW1ldGEuY29udHJvbGxlci5nZXRWYWx1ZVNjYWxlSWQoKSA9PT0gc2NhbGUuaWQgJiZcclxuXHRcdFx0XHRcdFx0Y2hhcnQuaXNEYXRhc2V0VmlzaWJsZShpKSkge1xyXG5cclxuXHRcdFx0XHRcdFx0aXZhbHVlID0gc2NhbGUuZ2V0UmlnaHRWYWx1ZShkYXRhc2V0c1tpXS5kYXRhW2luZGV4XSk7XHJcblx0XHRcdFx0XHRcdGlmICgodmFsdWUgPCAwICYmIGl2YWx1ZSA8IDApIHx8ICh2YWx1ZSA+PSAwICYmIGl2YWx1ZSA+IDApKSB7XHJcblx0XHRcdFx0XHRcdFx0c3RhcnQgKz0gaXZhbHVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRiYXNlID0gc2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZShzdGFydCk7XHJcblx0XHRcdGhlYWQgPSBzY2FsZS5nZXRQaXhlbEZvclZhbHVlKHN0YXJ0ICsgdmFsdWUpO1xyXG5cdFx0XHRzaXplID0gKGhlYWQgLSBiYXNlKSAvIDI7XHJcblxyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdHNpemU6IHNpemUsXHJcblx0XHRcdFx0YmFzZTogYmFzZSxcclxuXHRcdFx0XHRoZWFkOiBoZWFkLFxyXG5cdFx0XHRcdGNlbnRlcjogaGVhZCArIHNpemUgLyAyXHJcblx0XHRcdH07XHJcblx0XHR9LFxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cdFx0Y2FsY3VsYXRlQmFySW5kZXhQaXhlbHM6IGZ1bmN0aW9uKGRhdGFzZXRJbmRleCwgaW5kZXgsIHJ1bGVyKSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciBvcHRpb25zID0gcnVsZXIuc2NhbGUub3B0aW9ucztcclxuXHRcdFx0dmFyIHJhbmdlID0gb3B0aW9ucy5iYXJUaGlja25lc3MgPT09ICdmbGV4J1xyXG5cdFx0XHRcdD8gY29tcHV0ZUZsZXhDYXRlZ29yeVRyYWl0cyhpbmRleCwgcnVsZXIsIG9wdGlvbnMpXHJcblx0XHRcdFx0OiBjb21wdXRlRml0Q2F0ZWdvcnlUcmFpdHMoaW5kZXgsIHJ1bGVyLCBvcHRpb25zKTtcclxuXHJcblx0XHRcdHZhciBzdGFja0luZGV4ID0gbWUuZ2V0U3RhY2tJbmRleChkYXRhc2V0SW5kZXgsIG1lLmdldE1ldGEoKS5zdGFjayk7XHJcblx0XHRcdHZhciBjZW50ZXIgPSByYW5nZS5zdGFydCArIChyYW5nZS5jaHVuayAqIHN0YWNrSW5kZXgpICsgKHJhbmdlLmNodW5rIC8gMik7XHJcblx0XHRcdHZhciBzaXplID0gTWF0aC5taW4oXHJcblx0XHRcdFx0aGVscGVycy52YWx1ZU9yRGVmYXVsdChvcHRpb25zLm1heEJhclRoaWNrbmVzcywgSW5maW5pdHkpLFxyXG5cdFx0XHRcdHJhbmdlLmNodW5rICogcmFuZ2UucmF0aW8pO1xyXG5cclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRiYXNlOiBjZW50ZXIgLSBzaXplIC8gMixcclxuXHRcdFx0XHRoZWFkOiBjZW50ZXIgKyBzaXplIC8gMixcclxuXHRcdFx0XHRjZW50ZXI6IGNlbnRlcixcclxuXHRcdFx0XHRzaXplOiBzaXplXHJcblx0XHRcdH07XHJcblx0XHR9LFxyXG5cclxuXHRcdGRyYXc6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgY2hhcnQgPSBtZS5jaGFydDtcclxuXHRcdFx0dmFyIHNjYWxlID0gbWUuZ2V0VmFsdWVTY2FsZSgpO1xyXG5cdFx0XHR2YXIgcmVjdHMgPSBtZS5nZXRNZXRhKCkuZGF0YTtcclxuXHRcdFx0dmFyIGRhdGFzZXQgPSBtZS5nZXREYXRhc2V0KCk7XHJcblx0XHRcdHZhciBpbGVuID0gcmVjdHMubGVuZ3RoO1xyXG5cdFx0XHR2YXIgaSA9IDA7XHJcblxyXG5cdFx0XHRoZWxwZXJzLmNhbnZhcy5jbGlwQXJlYShjaGFydC5jdHgsIGNoYXJ0LmNoYXJ0QXJlYSk7XHJcblxyXG5cdFx0XHRmb3IgKDsgaSA8IGlsZW47ICsraSkge1xyXG5cdFx0XHRcdGlmICghaXNOYU4oc2NhbGUuZ2V0UmlnaHRWYWx1ZShkYXRhc2V0LmRhdGFbaV0pKSkge1xyXG5cdFx0XHRcdFx0cmVjdHNbaV0uZHJhdygpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aGVscGVycy5jYW52YXMudW5jbGlwQXJlYShjaGFydC5jdHgpO1xyXG5cdFx0fSxcclxuXHR9KTtcclxuXHJcblx0Q2hhcnQuY29udHJvbGxlcnMuaG9yaXpvbnRhbEJhciA9IENoYXJ0LmNvbnRyb2xsZXJzLmJhci5leHRlbmQoe1xyXG5cdFx0LyoqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRnZXRWYWx1ZVNjYWxlSWQ6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRNZXRhKCkueEF4aXNJRDtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRnZXRJbmRleFNjYWxlSWQ6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRNZXRhKCkueUF4aXNJRDtcclxuXHRcdH1cclxuXHR9KTtcclxufTtcclxuXHJcbn0se1wiMjZcIjoyNixcIjQxXCI6NDEsXCI0NlwiOjQ2fV0sMTY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcclxudmFyIGVsZW1lbnRzID0gcmVxdWlyZSg0MSk7XHJcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XHJcblxyXG5kZWZhdWx0cy5fc2V0KCdidWJibGUnLCB7XHJcblx0aG92ZXI6IHtcclxuXHRcdG1vZGU6ICdzaW5nbGUnXHJcblx0fSxcclxuXHJcblx0c2NhbGVzOiB7XHJcblx0XHR4QXhlczogW3tcclxuXHRcdFx0dHlwZTogJ2xpbmVhcicsIC8vIGJ1YmJsZSBzaG91bGQgcHJvYmFibHkgdXNlIGEgbGluZWFyIHNjYWxlIGJ5IGRlZmF1bHRcclxuXHRcdFx0cG9zaXRpb246ICdib3R0b20nLFxyXG5cdFx0XHRpZDogJ3gtYXhpcy0wJyAvLyBuZWVkIGFuIElEIHNvIGRhdGFzZXRzIGNhbiByZWZlcmVuY2UgdGhlIHNjYWxlXHJcblx0XHR9XSxcclxuXHRcdHlBeGVzOiBbe1xyXG5cdFx0XHR0eXBlOiAnbGluZWFyJyxcclxuXHRcdFx0cG9zaXRpb246ICdsZWZ0JyxcclxuXHRcdFx0aWQ6ICd5LWF4aXMtMCdcclxuXHRcdH1dXHJcblx0fSxcclxuXHJcblx0dG9vbHRpcHM6IHtcclxuXHRcdGNhbGxiYWNrczoge1xyXG5cdFx0XHR0aXRsZTogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0Ly8gVGl0bGUgZG9lc24ndCBtYWtlIHNlbnNlIGZvciBzY2F0dGVyIHNpbmNlIHdlIGZvcm1hdCB0aGUgZGF0YSBhcyBhIHBvaW50XHJcblx0XHRcdFx0cmV0dXJuICcnO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRsYWJlbDogZnVuY3Rpb24oaXRlbSwgZGF0YSkge1xyXG5cdFx0XHRcdHZhciBkYXRhc2V0TGFiZWwgPSBkYXRhLmRhdGFzZXRzW2l0ZW0uZGF0YXNldEluZGV4XS5sYWJlbCB8fCAnJztcclxuXHRcdFx0XHR2YXIgZGF0YVBvaW50ID0gZGF0YS5kYXRhc2V0c1tpdGVtLmRhdGFzZXRJbmRleF0uZGF0YVtpdGVtLmluZGV4XTtcclxuXHRcdFx0XHRyZXR1cm4gZGF0YXNldExhYmVsICsgJzogKCcgKyBpdGVtLnhMYWJlbCArICcsICcgKyBpdGVtLnlMYWJlbCArICcsICcgKyBkYXRhUG9pbnQuciArICcpJztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxufSk7XHJcblxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDaGFydCkge1xyXG5cclxuXHRDaGFydC5jb250cm9sbGVycy5idWJibGUgPSBDaGFydC5EYXRhc2V0Q29udHJvbGxlci5leHRlbmQoe1xyXG5cdFx0LyoqXHJcblx0XHQgKiBAcHJvdGVjdGVkXHJcblx0XHQgKi9cclxuXHRcdGRhdGFFbGVtZW50VHlwZTogZWxlbWVudHMuUG9pbnQsXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBAcHJvdGVjdGVkXHJcblx0XHQgKi9cclxuXHRcdHVwZGF0ZTogZnVuY3Rpb24ocmVzZXQpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIG1ldGEgPSBtZS5nZXRNZXRhKCk7XHJcblx0XHRcdHZhciBwb2ludHMgPSBtZXRhLmRhdGE7XHJcblxyXG5cdFx0XHQvLyBVcGRhdGUgUG9pbnRzXHJcblx0XHRcdGhlbHBlcnMuZWFjaChwb2ludHMsIGZ1bmN0aW9uKHBvaW50LCBpbmRleCkge1xyXG5cdFx0XHRcdG1lLnVwZGF0ZUVsZW1lbnQocG9pbnQsIGluZGV4LCByZXNldCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEBwcm90ZWN0ZWRcclxuXHRcdCAqL1xyXG5cdFx0dXBkYXRlRWxlbWVudDogZnVuY3Rpb24ocG9pbnQsIGluZGV4LCByZXNldCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcclxuXHRcdFx0dmFyIGN1c3RvbSA9IHBvaW50LmN1c3RvbSB8fCB7fTtcclxuXHRcdFx0dmFyIHhTY2FsZSA9IG1lLmdldFNjYWxlRm9ySWQobWV0YS54QXhpc0lEKTtcclxuXHRcdFx0dmFyIHlTY2FsZSA9IG1lLmdldFNjYWxlRm9ySWQobWV0YS55QXhpc0lEKTtcclxuXHRcdFx0dmFyIG9wdGlvbnMgPSBtZS5fcmVzb2x2ZUVsZW1lbnRPcHRpb25zKHBvaW50LCBpbmRleCk7XHJcblx0XHRcdHZhciBkYXRhID0gbWUuZ2V0RGF0YXNldCgpLmRhdGFbaW5kZXhdO1xyXG5cdFx0XHR2YXIgZHNJbmRleCA9IG1lLmluZGV4O1xyXG5cclxuXHRcdFx0dmFyIHggPSByZXNldCA/IHhTY2FsZS5nZXRQaXhlbEZvckRlY2ltYWwoMC41KSA6IHhTY2FsZS5nZXRQaXhlbEZvclZhbHVlKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiBOYU4sIGluZGV4LCBkc0luZGV4KTtcclxuXHRcdFx0dmFyIHkgPSByZXNldCA/IHlTY2FsZS5nZXRCYXNlUGl4ZWwoKSA6IHlTY2FsZS5nZXRQaXhlbEZvclZhbHVlKGRhdGEsIGluZGV4LCBkc0luZGV4KTtcclxuXHJcblx0XHRcdHBvaW50Ll94U2NhbGUgPSB4U2NhbGU7XHJcblx0XHRcdHBvaW50Ll95U2NhbGUgPSB5U2NhbGU7XHJcblx0XHRcdHBvaW50Ll9vcHRpb25zID0gb3B0aW9ucztcclxuXHRcdFx0cG9pbnQuX2RhdGFzZXRJbmRleCA9IGRzSW5kZXg7XHJcblx0XHRcdHBvaW50Ll9pbmRleCA9IGluZGV4O1xyXG5cdFx0XHRwb2ludC5fbW9kZWwgPSB7XHJcblx0XHRcdFx0YmFja2dyb3VuZENvbG9yOiBvcHRpb25zLmJhY2tncm91bmRDb2xvcixcclxuXHRcdFx0XHRib3JkZXJDb2xvcjogb3B0aW9ucy5ib3JkZXJDb2xvcixcclxuXHRcdFx0XHRib3JkZXJXaWR0aDogb3B0aW9ucy5ib3JkZXJXaWR0aCxcclxuXHRcdFx0XHRoaXRSYWRpdXM6IG9wdGlvbnMuaGl0UmFkaXVzLFxyXG5cdFx0XHRcdHBvaW50U3R5bGU6IG9wdGlvbnMucG9pbnRTdHlsZSxcclxuXHRcdFx0XHRyb3RhdGlvbjogb3B0aW9ucy5yb3RhdGlvbixcclxuXHRcdFx0XHRyYWRpdXM6IHJlc2V0ID8gMCA6IG9wdGlvbnMucmFkaXVzLFxyXG5cdFx0XHRcdHNraXA6IGN1c3RvbS5za2lwIHx8IGlzTmFOKHgpIHx8IGlzTmFOKHkpLFxyXG5cdFx0XHRcdHg6IHgsXHJcblx0XHRcdFx0eTogeSxcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdHBvaW50LnBpdm90KCk7XHJcblx0XHR9LFxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQHByb3RlY3RlZFxyXG5cdFx0ICovXHJcblx0XHRzZXRIb3ZlclN0eWxlOiBmdW5jdGlvbihwb2ludCkge1xyXG5cdFx0XHR2YXIgbW9kZWwgPSBwb2ludC5fbW9kZWw7XHJcblx0XHRcdHZhciBvcHRpb25zID0gcG9pbnQuX29wdGlvbnM7XHJcblx0XHRcdHBvaW50LiRwcmV2aW91c1N0eWxlID0ge1xyXG5cdFx0XHRcdGJhY2tncm91bmRDb2xvcjogbW9kZWwuYmFja2dyb3VuZENvbG9yLFxyXG5cdFx0XHRcdGJvcmRlckNvbG9yOiBtb2RlbC5ib3JkZXJDb2xvcixcclxuXHRcdFx0XHRib3JkZXJXaWR0aDogbW9kZWwuYm9yZGVyV2lkdGgsXHJcblx0XHRcdFx0cmFkaXVzOiBtb2RlbC5yYWRpdXNcclxuXHRcdFx0fTtcclxuXHRcdFx0bW9kZWwuYmFja2dyb3VuZENvbG9yID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdChvcHRpb25zLmhvdmVyQmFja2dyb3VuZENvbG9yLCBoZWxwZXJzLmdldEhvdmVyQ29sb3Iob3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IpKTtcclxuXHRcdFx0bW9kZWwuYm9yZGVyQ29sb3IgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KG9wdGlvbnMuaG92ZXJCb3JkZXJDb2xvciwgaGVscGVycy5nZXRIb3ZlckNvbG9yKG9wdGlvbnMuYm9yZGVyQ29sb3IpKTtcclxuXHRcdFx0bW9kZWwuYm9yZGVyV2lkdGggPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KG9wdGlvbnMuaG92ZXJCb3JkZXJXaWR0aCwgb3B0aW9ucy5ib3JkZXJXaWR0aCk7XHJcblx0XHRcdG1vZGVsLnJhZGl1cyA9IG9wdGlvbnMucmFkaXVzICsgb3B0aW9ucy5ob3ZlclJhZGl1cztcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRfcmVzb2x2ZUVsZW1lbnRPcHRpb25zOiBmdW5jdGlvbihwb2ludCwgaW5kZXgpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XHJcblx0XHRcdHZhciBkYXRhc2V0cyA9IGNoYXJ0LmRhdGEuZGF0YXNldHM7XHJcblx0XHRcdHZhciBkYXRhc2V0ID0gZGF0YXNldHNbbWUuaW5kZXhdO1xyXG5cdFx0XHR2YXIgY3VzdG9tID0gcG9pbnQuY3VzdG9tIHx8IHt9O1xyXG5cdFx0XHR2YXIgb3B0aW9ucyA9IGNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMucG9pbnQ7XHJcblx0XHRcdHZhciByZXNvbHZlID0gaGVscGVycy5vcHRpb25zLnJlc29sdmU7XHJcblx0XHRcdHZhciBkYXRhID0gZGF0YXNldC5kYXRhW2luZGV4XTtcclxuXHRcdFx0dmFyIHZhbHVlcyA9IHt9O1xyXG5cdFx0XHR2YXIgaSwgaWxlbiwga2V5O1xyXG5cclxuXHRcdFx0Ly8gU2NyaXB0YWJsZSBvcHRpb25zXHJcblx0XHRcdHZhciBjb250ZXh0ID0ge1xyXG5cdFx0XHRcdGNoYXJ0OiBjaGFydCxcclxuXHRcdFx0XHRkYXRhSW5kZXg6IGluZGV4LFxyXG5cdFx0XHRcdGRhdGFzZXQ6IGRhdGFzZXQsXHJcblx0XHRcdFx0ZGF0YXNldEluZGV4OiBtZS5pbmRleFxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0dmFyIGtleXMgPSBbXHJcblx0XHRcdFx0J2JhY2tncm91bmRDb2xvcicsXHJcblx0XHRcdFx0J2JvcmRlckNvbG9yJyxcclxuXHRcdFx0XHQnYm9yZGVyV2lkdGgnLFxyXG5cdFx0XHRcdCdob3ZlckJhY2tncm91bmRDb2xvcicsXHJcblx0XHRcdFx0J2hvdmVyQm9yZGVyQ29sb3InLFxyXG5cdFx0XHRcdCdob3ZlckJvcmRlcldpZHRoJyxcclxuXHRcdFx0XHQnaG92ZXJSYWRpdXMnLFxyXG5cdFx0XHRcdCdoaXRSYWRpdXMnLFxyXG5cdFx0XHRcdCdwb2ludFN0eWxlJyxcclxuXHRcdFx0XHQncm90YXRpb24nXHJcblx0XHRcdF07XHJcblxyXG5cdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0ga2V5cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcclxuXHRcdFx0XHRrZXkgPSBrZXlzW2ldO1xyXG5cdFx0XHRcdHZhbHVlc1trZXldID0gcmVzb2x2ZShbXHJcblx0XHRcdFx0XHRjdXN0b21ba2V5XSxcclxuXHRcdFx0XHRcdGRhdGFzZXRba2V5XSxcclxuXHRcdFx0XHRcdG9wdGlvbnNba2V5XVxyXG5cdFx0XHRcdF0sIGNvbnRleHQsIGluZGV4KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gQ3VzdG9tIHJhZGl1cyByZXNvbHV0aW9uXHJcblx0XHRcdHZhbHVlcy5yYWRpdXMgPSByZXNvbHZlKFtcclxuXHRcdFx0XHRjdXN0b20ucmFkaXVzLFxyXG5cdFx0XHRcdGRhdGEgPyBkYXRhLnIgOiB1bmRlZmluZWQsXHJcblx0XHRcdFx0ZGF0YXNldC5yYWRpdXMsXHJcblx0XHRcdFx0b3B0aW9ucy5yYWRpdXNcclxuXHRcdFx0XSwgY29udGV4dCwgaW5kZXgpO1xyXG5cdFx0XHRyZXR1cm4gdmFsdWVzO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG59O1xyXG5cclxufSx7XCIyNlwiOjI2LFwiNDFcIjo0MSxcIjQ2XCI6NDZ9XSwxNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xyXG52YXIgZWxlbWVudHMgPSByZXF1aXJlKDQxKTtcclxudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcclxuXHJcbmRlZmF1bHRzLl9zZXQoJ2RvdWdobnV0Jywge1xyXG5cdGFuaW1hdGlvbjoge1xyXG5cdFx0Ly8gQm9vbGVhbiAtIFdoZXRoZXIgd2UgYW5pbWF0ZSB0aGUgcm90YXRpb24gb2YgdGhlIERvdWdobnV0XHJcblx0XHRhbmltYXRlUm90YXRlOiB0cnVlLFxyXG5cdFx0Ly8gQm9vbGVhbiAtIFdoZXRoZXIgd2UgYW5pbWF0ZSBzY2FsaW5nIHRoZSBEb3VnaG51dCBmcm9tIHRoZSBjZW50cmVcclxuXHRcdGFuaW1hdGVTY2FsZTogZmFsc2VcclxuXHR9LFxyXG5cdGhvdmVyOiB7XHJcblx0XHRtb2RlOiAnc2luZ2xlJ1xyXG5cdH0sXHJcblx0bGVnZW5kQ2FsbGJhY2s6IGZ1bmN0aW9uKGNoYXJ0KSB7XHJcblx0XHR2YXIgdGV4dCA9IFtdO1xyXG5cdFx0dGV4dC5wdXNoKCc8dWwgY2xhc3M9XCInICsgY2hhcnQuaWQgKyAnLWxlZ2VuZFwiPicpO1xyXG5cclxuXHRcdHZhciBkYXRhID0gY2hhcnQuZGF0YTtcclxuXHRcdHZhciBkYXRhc2V0cyA9IGRhdGEuZGF0YXNldHM7XHJcblx0XHR2YXIgbGFiZWxzID0gZGF0YS5sYWJlbHM7XHJcblxyXG5cdFx0aWYgKGRhdGFzZXRzLmxlbmd0aCkge1xyXG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFzZXRzWzBdLmRhdGEubGVuZ3RoOyArK2kpIHtcclxuXHRcdFx0XHR0ZXh0LnB1c2goJzxsaT48c3BhbiBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6JyArIGRhdGFzZXRzWzBdLmJhY2tncm91bmRDb2xvcltpXSArICdcIj48L3NwYW4+Jyk7XHJcblx0XHRcdFx0aWYgKGxhYmVsc1tpXSkge1xyXG5cdFx0XHRcdFx0dGV4dC5wdXNoKGxhYmVsc1tpXSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHRleHQucHVzaCgnPC9saT4nKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHRleHQucHVzaCgnPC91bD4nKTtcclxuXHRcdHJldHVybiB0ZXh0LmpvaW4oJycpO1xyXG5cdH0sXHJcblx0bGVnZW5kOiB7XHJcblx0XHRsYWJlbHM6IHtcclxuXHRcdFx0Z2VuZXJhdGVMYWJlbHM6IGZ1bmN0aW9uKGNoYXJ0KSB7XHJcblx0XHRcdFx0dmFyIGRhdGEgPSBjaGFydC5kYXRhO1xyXG5cdFx0XHRcdGlmIChkYXRhLmxhYmVscy5sZW5ndGggJiYgZGF0YS5kYXRhc2V0cy5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdHJldHVybiBkYXRhLmxhYmVscy5tYXAoZnVuY3Rpb24obGFiZWwsIGkpIHtcclxuXHRcdFx0XHRcdFx0dmFyIG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YSgwKTtcclxuXHRcdFx0XHRcdFx0dmFyIGRzID0gZGF0YS5kYXRhc2V0c1swXTtcclxuXHRcdFx0XHRcdFx0dmFyIGFyYyA9IG1ldGEuZGF0YVtpXTtcclxuXHRcdFx0XHRcdFx0dmFyIGN1c3RvbSA9IGFyYyAmJiBhcmMuY3VzdG9tIHx8IHt9O1xyXG5cdFx0XHRcdFx0XHR2YXIgdmFsdWVBdEluZGV4T3JEZWZhdWx0ID0gaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQ7XHJcblx0XHRcdFx0XHRcdHZhciBhcmNPcHRzID0gY2hhcnQub3B0aW9ucy5lbGVtZW50cy5hcmM7XHJcblx0XHRcdFx0XHRcdHZhciBmaWxsID0gY3VzdG9tLmJhY2tncm91bmRDb2xvciA/IGN1c3RvbS5iYWNrZ3JvdW5kQ29sb3IgOiB2YWx1ZUF0SW5kZXhPckRlZmF1bHQoZHMuYmFja2dyb3VuZENvbG9yLCBpLCBhcmNPcHRzLmJhY2tncm91bmRDb2xvcik7XHJcblx0XHRcdFx0XHRcdHZhciBzdHJva2UgPSBjdXN0b20uYm9yZGVyQ29sb3IgPyBjdXN0b20uYm9yZGVyQ29sb3IgOiB2YWx1ZUF0SW5kZXhPckRlZmF1bHQoZHMuYm9yZGVyQ29sb3IsIGksIGFyY09wdHMuYm9yZGVyQ29sb3IpO1xyXG5cdFx0XHRcdFx0XHR2YXIgYncgPSBjdXN0b20uYm9yZGVyV2lkdGggPyBjdXN0b20uYm9yZGVyV2lkdGggOiB2YWx1ZUF0SW5kZXhPckRlZmF1bHQoZHMuYm9yZGVyV2lkdGgsIGksIGFyY09wdHMuYm9yZGVyV2lkdGgpO1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0XHR0ZXh0OiBsYWJlbCxcclxuXHRcdFx0XHRcdFx0XHRmaWxsU3R5bGU6IGZpbGwsXHJcblx0XHRcdFx0XHRcdFx0c3Ryb2tlU3R5bGU6IHN0cm9rZSxcclxuXHRcdFx0XHRcdFx0XHRsaW5lV2lkdGg6IGJ3LFxyXG5cdFx0XHRcdFx0XHRcdGhpZGRlbjogaXNOYU4oZHMuZGF0YVtpXSkgfHwgbWV0YS5kYXRhW2ldLmhpZGRlbixcclxuXHJcblx0XHRcdFx0XHRcdFx0Ly8gRXh0cmEgZGF0YSB1c2VkIGZvciB0b2dnbGluZyB0aGUgY29ycmVjdCBpdGVtXHJcblx0XHRcdFx0XHRcdFx0aW5kZXg6IGlcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4gW107XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblxyXG5cdFx0b25DbGljazogZnVuY3Rpb24oZSwgbGVnZW5kSXRlbSkge1xyXG5cdFx0XHR2YXIgaW5kZXggPSBsZWdlbmRJdGVtLmluZGV4O1xyXG5cdFx0XHR2YXIgY2hhcnQgPSB0aGlzLmNoYXJ0O1xyXG5cdFx0XHR2YXIgaSwgaWxlbiwgbWV0YTtcclxuXHJcblx0XHRcdGZvciAoaSA9IDAsIGlsZW4gPSAoY2hhcnQuZGF0YS5kYXRhc2V0cyB8fCBbXSkubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XHJcblx0XHRcdFx0bWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGkpO1xyXG5cdFx0XHRcdC8vIHRvZ2dsZSB2aXNpYmlsaXR5IG9mIGluZGV4IGlmIGV4aXN0c1xyXG5cdFx0XHRcdGlmIChtZXRhLmRhdGFbaW5kZXhdKSB7XHJcblx0XHRcdFx0XHRtZXRhLmRhdGFbaW5kZXhdLmhpZGRlbiA9ICFtZXRhLmRhdGFbaW5kZXhdLmhpZGRlbjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNoYXJ0LnVwZGF0ZSgpO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdC8vIFRoZSBwZXJjZW50YWdlIG9mIHRoZSBjaGFydCB0aGF0IHdlIGN1dCBvdXQgb2YgdGhlIG1pZGRsZS5cclxuXHRjdXRvdXRQZXJjZW50YWdlOiA1MCxcclxuXHJcblx0Ly8gVGhlIHJvdGF0aW9uIG9mIHRoZSBjaGFydCwgd2hlcmUgdGhlIGZpcnN0IGRhdGEgYXJjIGJlZ2lucy5cclxuXHRyb3RhdGlvbjogTWF0aC5QSSAqIC0wLjUsXHJcblxyXG5cdC8vIFRoZSB0b3RhbCBjaXJjdW1mZXJlbmNlIG9mIHRoZSBjaGFydC5cclxuXHRjaXJjdW1mZXJlbmNlOiBNYXRoLlBJICogMi4wLFxyXG5cclxuXHQvLyBOZWVkIHRvIG92ZXJyaWRlIHRoZXNlIHRvIGdpdmUgYSBuaWNlIGRlZmF1bHRcclxuXHR0b29sdGlwczoge1xyXG5cdFx0Y2FsbGJhY2tzOiB7XHJcblx0XHRcdHRpdGxlOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRyZXR1cm4gJyc7XHJcblx0XHRcdH0sXHJcblx0XHRcdGxhYmVsOiBmdW5jdGlvbih0b29sdGlwSXRlbSwgZGF0YSkge1xyXG5cdFx0XHRcdHZhciBkYXRhTGFiZWwgPSBkYXRhLmxhYmVsc1t0b29sdGlwSXRlbS5pbmRleF07XHJcblx0XHRcdFx0dmFyIHZhbHVlID0gJzogJyArIGRhdGEuZGF0YXNldHNbdG9vbHRpcEl0ZW0uZGF0YXNldEluZGV4XS5kYXRhW3Rvb2x0aXBJdGVtLmluZGV4XTtcclxuXHJcblx0XHRcdFx0aWYgKGhlbHBlcnMuaXNBcnJheShkYXRhTGFiZWwpKSB7XHJcblx0XHRcdFx0XHQvLyBzaG93IHZhbHVlIG9uIGZpcnN0IGxpbmUgb2YgbXVsdGlsaW5lIGxhYmVsXHJcblx0XHRcdFx0XHQvLyBuZWVkIHRvIGNsb25lIGJlY2F1c2Ugd2UgYXJlIGNoYW5naW5nIHRoZSB2YWx1ZVxyXG5cdFx0XHRcdFx0ZGF0YUxhYmVsID0gZGF0YUxhYmVsLnNsaWNlKCk7XHJcblx0XHRcdFx0XHRkYXRhTGFiZWxbMF0gKz0gdmFsdWU7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGRhdGFMYWJlbCArPSB2YWx1ZTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiBkYXRhTGFiZWw7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcbn0pO1xyXG5cclxuZGVmYXVsdHMuX3NldCgncGllJywgaGVscGVycy5jbG9uZShkZWZhdWx0cy5kb3VnaG51dCkpO1xyXG5kZWZhdWx0cy5fc2V0KCdwaWUnLCB7XHJcblx0Y3V0b3V0UGVyY2VudGFnZTogMFxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcclxuXHJcblx0Q2hhcnQuY29udHJvbGxlcnMuZG91Z2hudXQgPSBDaGFydC5jb250cm9sbGVycy5waWUgPSBDaGFydC5EYXRhc2V0Q29udHJvbGxlci5leHRlbmQoe1xyXG5cclxuXHRcdGRhdGFFbGVtZW50VHlwZTogZWxlbWVudHMuQXJjLFxyXG5cclxuXHRcdGxpbmtTY2FsZXM6IGhlbHBlcnMubm9vcCxcclxuXHJcblx0XHQvLyBHZXQgaW5kZXggb2YgdGhlIGRhdGFzZXQgaW4gcmVsYXRpb24gdG8gdGhlIHZpc2libGUgZGF0YXNldHMuIFRoaXMgYWxsb3dzIGRldGVybWluaW5nIHRoZSBpbm5lciBhbmQgb3V0ZXIgcmFkaXVzIGNvcnJlY3RseVxyXG5cdFx0Z2V0UmluZ0luZGV4OiBmdW5jdGlvbihkYXRhc2V0SW5kZXgpIHtcclxuXHRcdFx0dmFyIHJpbmdJbmRleCA9IDA7XHJcblxyXG5cdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IGRhdGFzZXRJbmRleDsgKytqKSB7XHJcblx0XHRcdFx0aWYgKHRoaXMuY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShqKSkge1xyXG5cdFx0XHRcdFx0KytyaW5nSW5kZXg7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gcmluZ0luZGV4O1xyXG5cdFx0fSxcclxuXHJcblx0XHR1cGRhdGU6IGZ1bmN0aW9uKHJlc2V0KSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xyXG5cdFx0XHR2YXIgY2hhcnRBcmVhID0gY2hhcnQuY2hhcnRBcmVhO1xyXG5cdFx0XHR2YXIgb3B0cyA9IGNoYXJ0Lm9wdGlvbnM7XHJcblx0XHRcdHZhciBhcmNPcHRzID0gb3B0cy5lbGVtZW50cy5hcmM7XHJcblx0XHRcdHZhciBhdmFpbGFibGVXaWR0aCA9IGNoYXJ0QXJlYS5yaWdodCAtIGNoYXJ0QXJlYS5sZWZ0IC0gYXJjT3B0cy5ib3JkZXJXaWR0aDtcclxuXHRcdFx0dmFyIGF2YWlsYWJsZUhlaWdodCA9IGNoYXJ0QXJlYS5ib3R0b20gLSBjaGFydEFyZWEudG9wIC0gYXJjT3B0cy5ib3JkZXJXaWR0aDtcclxuXHRcdFx0dmFyIG1pblNpemUgPSBNYXRoLm1pbihhdmFpbGFibGVXaWR0aCwgYXZhaWxhYmxlSGVpZ2h0KTtcclxuXHRcdFx0dmFyIG9mZnNldCA9IHt4OiAwLCB5OiAwfTtcclxuXHRcdFx0dmFyIG1ldGEgPSBtZS5nZXRNZXRhKCk7XHJcblx0XHRcdHZhciBjdXRvdXRQZXJjZW50YWdlID0gb3B0cy5jdXRvdXRQZXJjZW50YWdlO1xyXG5cdFx0XHR2YXIgY2lyY3VtZmVyZW5jZSA9IG9wdHMuY2lyY3VtZmVyZW5jZTtcclxuXHJcblx0XHRcdC8vIElmIHRoZSBjaGFydCdzIGNpcmN1bWZlcmVuY2UgaXNuJ3QgYSBmdWxsIGNpcmNsZSwgY2FsY3VsYXRlIG1pblNpemUgYXMgYSByYXRpbyBvZiB0aGUgd2lkdGgvaGVpZ2h0IG9mIHRoZSBhcmNcclxuXHRcdFx0aWYgKGNpcmN1bWZlcmVuY2UgPCBNYXRoLlBJICogMi4wKSB7XHJcblx0XHRcdFx0dmFyIHN0YXJ0QW5nbGUgPSBvcHRzLnJvdGF0aW9uICUgKE1hdGguUEkgKiAyLjApO1xyXG5cdFx0XHRcdHN0YXJ0QW5nbGUgKz0gTWF0aC5QSSAqIDIuMCAqIChzdGFydEFuZ2xlID49IE1hdGguUEkgPyAtMSA6IHN0YXJ0QW5nbGUgPCAtTWF0aC5QSSA/IDEgOiAwKTtcclxuXHRcdFx0XHR2YXIgZW5kQW5nbGUgPSBzdGFydEFuZ2xlICsgY2lyY3VtZmVyZW5jZTtcclxuXHRcdFx0XHR2YXIgc3RhcnQgPSB7eDogTWF0aC5jb3Moc3RhcnRBbmdsZSksIHk6IE1hdGguc2luKHN0YXJ0QW5nbGUpfTtcclxuXHRcdFx0XHR2YXIgZW5kID0ge3g6IE1hdGguY29zKGVuZEFuZ2xlKSwgeTogTWF0aC5zaW4oZW5kQW5nbGUpfTtcclxuXHRcdFx0XHR2YXIgY29udGFpbnMwID0gKHN0YXJ0QW5nbGUgPD0gMCAmJiBlbmRBbmdsZSA+PSAwKSB8fCAoc3RhcnRBbmdsZSA8PSBNYXRoLlBJICogMi4wICYmIE1hdGguUEkgKiAyLjAgPD0gZW5kQW5nbGUpO1xyXG5cdFx0XHRcdHZhciBjb250YWluczkwID0gKHN0YXJ0QW5nbGUgPD0gTWF0aC5QSSAqIDAuNSAmJiBNYXRoLlBJICogMC41IDw9IGVuZEFuZ2xlKSB8fCAoc3RhcnRBbmdsZSA8PSBNYXRoLlBJICogMi41ICYmIE1hdGguUEkgKiAyLjUgPD0gZW5kQW5nbGUpO1xyXG5cdFx0XHRcdHZhciBjb250YWluczE4MCA9IChzdGFydEFuZ2xlIDw9IC1NYXRoLlBJICYmIC1NYXRoLlBJIDw9IGVuZEFuZ2xlKSB8fCAoc3RhcnRBbmdsZSA8PSBNYXRoLlBJICYmIE1hdGguUEkgPD0gZW5kQW5nbGUpO1xyXG5cdFx0XHRcdHZhciBjb250YWluczI3MCA9IChzdGFydEFuZ2xlIDw9IC1NYXRoLlBJICogMC41ICYmIC1NYXRoLlBJICogMC41IDw9IGVuZEFuZ2xlKSB8fCAoc3RhcnRBbmdsZSA8PSBNYXRoLlBJICogMS41ICYmIE1hdGguUEkgKiAxLjUgPD0gZW5kQW5nbGUpO1xyXG5cdFx0XHRcdHZhciBjdXRvdXQgPSBjdXRvdXRQZXJjZW50YWdlIC8gMTAwLjA7XHJcblx0XHRcdFx0dmFyIG1pbiA9IHt4OiBjb250YWluczE4MCA/IC0xIDogTWF0aC5taW4oc3RhcnQueCAqIChzdGFydC54IDwgMCA/IDEgOiBjdXRvdXQpLCBlbmQueCAqIChlbmQueCA8IDAgPyAxIDogY3V0b3V0KSksIHk6IGNvbnRhaW5zMjcwID8gLTEgOiBNYXRoLm1pbihzdGFydC55ICogKHN0YXJ0LnkgPCAwID8gMSA6IGN1dG91dCksIGVuZC55ICogKGVuZC55IDwgMCA/IDEgOiBjdXRvdXQpKX07XHJcblx0XHRcdFx0dmFyIG1heCA9IHt4OiBjb250YWluczAgPyAxIDogTWF0aC5tYXgoc3RhcnQueCAqIChzdGFydC54ID4gMCA/IDEgOiBjdXRvdXQpLCBlbmQueCAqIChlbmQueCA+IDAgPyAxIDogY3V0b3V0KSksIHk6IGNvbnRhaW5zOTAgPyAxIDogTWF0aC5tYXgoc3RhcnQueSAqIChzdGFydC55ID4gMCA/IDEgOiBjdXRvdXQpLCBlbmQueSAqIChlbmQueSA+IDAgPyAxIDogY3V0b3V0KSl9O1xyXG5cdFx0XHRcdHZhciBzaXplID0ge3dpZHRoOiAobWF4LnggLSBtaW4ueCkgKiAwLjUsIGhlaWdodDogKG1heC55IC0gbWluLnkpICogMC41fTtcclxuXHRcdFx0XHRtaW5TaXplID0gTWF0aC5taW4oYXZhaWxhYmxlV2lkdGggLyBzaXplLndpZHRoLCBhdmFpbGFibGVIZWlnaHQgLyBzaXplLmhlaWdodCk7XHJcblx0XHRcdFx0b2Zmc2V0ID0ge3g6IChtYXgueCArIG1pbi54KSAqIC0wLjUsIHk6IChtYXgueSArIG1pbi55KSAqIC0wLjV9O1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjaGFydC5ib3JkZXJXaWR0aCA9IG1lLmdldE1heEJvcmRlcldpZHRoKG1ldGEuZGF0YSk7XHJcblx0XHRcdGNoYXJ0Lm91dGVyUmFkaXVzID0gTWF0aC5tYXgoKG1pblNpemUgLSBjaGFydC5ib3JkZXJXaWR0aCkgLyAyLCAwKTtcclxuXHRcdFx0Y2hhcnQuaW5uZXJSYWRpdXMgPSBNYXRoLm1heChjdXRvdXRQZXJjZW50YWdlID8gKGNoYXJ0Lm91dGVyUmFkaXVzIC8gMTAwKSAqIChjdXRvdXRQZXJjZW50YWdlKSA6IDAsIDApO1xyXG5cdFx0XHRjaGFydC5yYWRpdXNMZW5ndGggPSAoY2hhcnQub3V0ZXJSYWRpdXMgLSBjaGFydC5pbm5lclJhZGl1cykgLyBjaGFydC5nZXRWaXNpYmxlRGF0YXNldENvdW50KCk7XHJcblx0XHRcdGNoYXJ0Lm9mZnNldFggPSBvZmZzZXQueCAqIGNoYXJ0Lm91dGVyUmFkaXVzO1xyXG5cdFx0XHRjaGFydC5vZmZzZXRZID0gb2Zmc2V0LnkgKiBjaGFydC5vdXRlclJhZGl1cztcclxuXHJcblx0XHRcdG1ldGEudG90YWwgPSBtZS5jYWxjdWxhdGVUb3RhbCgpO1xyXG5cclxuXHRcdFx0bWUub3V0ZXJSYWRpdXMgPSBjaGFydC5vdXRlclJhZGl1cyAtIChjaGFydC5yYWRpdXNMZW5ndGggKiBtZS5nZXRSaW5nSW5kZXgobWUuaW5kZXgpKTtcclxuXHRcdFx0bWUuaW5uZXJSYWRpdXMgPSBNYXRoLm1heChtZS5vdXRlclJhZGl1cyAtIGNoYXJ0LnJhZGl1c0xlbmd0aCwgMCk7XHJcblxyXG5cdFx0XHRoZWxwZXJzLmVhY2gobWV0YS5kYXRhLCBmdW5jdGlvbihhcmMsIGluZGV4KSB7XHJcblx0XHRcdFx0bWUudXBkYXRlRWxlbWVudChhcmMsIGluZGV4LCByZXNldCk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSxcclxuXHJcblx0XHR1cGRhdGVFbGVtZW50OiBmdW5jdGlvbihhcmMsIGluZGV4LCByZXNldCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgY2hhcnQgPSBtZS5jaGFydDtcclxuXHRcdFx0dmFyIGNoYXJ0QXJlYSA9IGNoYXJ0LmNoYXJ0QXJlYTtcclxuXHRcdFx0dmFyIG9wdHMgPSBjaGFydC5vcHRpb25zO1xyXG5cdFx0XHR2YXIgYW5pbWF0aW9uT3B0cyA9IG9wdHMuYW5pbWF0aW9uO1xyXG5cdFx0XHR2YXIgY2VudGVyWCA9IChjaGFydEFyZWEubGVmdCArIGNoYXJ0QXJlYS5yaWdodCkgLyAyO1xyXG5cdFx0XHR2YXIgY2VudGVyWSA9IChjaGFydEFyZWEudG9wICsgY2hhcnRBcmVhLmJvdHRvbSkgLyAyO1xyXG5cdFx0XHR2YXIgc3RhcnRBbmdsZSA9IG9wdHMucm90YXRpb247IC8vIG5vbiByZXNldCBjYXNlIGhhbmRsZWQgbGF0ZXJcclxuXHRcdFx0dmFyIGVuZEFuZ2xlID0gb3B0cy5yb3RhdGlvbjsgLy8gbm9uIHJlc2V0IGNhc2UgaGFuZGxlZCBsYXRlclxyXG5cdFx0XHR2YXIgZGF0YXNldCA9IG1lLmdldERhdGFzZXQoKTtcclxuXHRcdFx0dmFyIGNpcmN1bWZlcmVuY2UgPSByZXNldCAmJiBhbmltYXRpb25PcHRzLmFuaW1hdGVSb3RhdGUgPyAwIDogYXJjLmhpZGRlbiA/IDAgOiBtZS5jYWxjdWxhdGVDaXJjdW1mZXJlbmNlKGRhdGFzZXQuZGF0YVtpbmRleF0pICogKG9wdHMuY2lyY3VtZmVyZW5jZSAvICgyLjAgKiBNYXRoLlBJKSk7XHJcblx0XHRcdHZhciBpbm5lclJhZGl1cyA9IHJlc2V0ICYmIGFuaW1hdGlvbk9wdHMuYW5pbWF0ZVNjYWxlID8gMCA6IG1lLmlubmVyUmFkaXVzO1xyXG5cdFx0XHR2YXIgb3V0ZXJSYWRpdXMgPSByZXNldCAmJiBhbmltYXRpb25PcHRzLmFuaW1hdGVTY2FsZSA/IDAgOiBtZS5vdXRlclJhZGl1cztcclxuXHRcdFx0dmFyIHZhbHVlQXRJbmRleE9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0O1xyXG5cclxuXHRcdFx0aGVscGVycy5leHRlbmQoYXJjLCB7XHJcblx0XHRcdFx0Ly8gVXRpbGl0eVxyXG5cdFx0XHRcdF9kYXRhc2V0SW5kZXg6IG1lLmluZGV4LFxyXG5cdFx0XHRcdF9pbmRleDogaW5kZXgsXHJcblxyXG5cdFx0XHRcdC8vIERlc2lyZWQgdmlldyBwcm9wZXJ0aWVzXHJcblx0XHRcdFx0X21vZGVsOiB7XHJcblx0XHRcdFx0XHR4OiBjZW50ZXJYICsgY2hhcnQub2Zmc2V0WCxcclxuXHRcdFx0XHRcdHk6IGNlbnRlclkgKyBjaGFydC5vZmZzZXRZLFxyXG5cdFx0XHRcdFx0c3RhcnRBbmdsZTogc3RhcnRBbmdsZSxcclxuXHRcdFx0XHRcdGVuZEFuZ2xlOiBlbmRBbmdsZSxcclxuXHRcdFx0XHRcdGNpcmN1bWZlcmVuY2U6IGNpcmN1bWZlcmVuY2UsXHJcblx0XHRcdFx0XHRvdXRlclJhZGl1czogb3V0ZXJSYWRpdXMsXHJcblx0XHRcdFx0XHRpbm5lclJhZGl1czogaW5uZXJSYWRpdXMsXHJcblx0XHRcdFx0XHRsYWJlbDogdmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQubGFiZWwsIGluZGV4LCBjaGFydC5kYXRhLmxhYmVsc1tpbmRleF0pXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdHZhciBtb2RlbCA9IGFyYy5fbW9kZWw7XHJcblxyXG5cdFx0XHQvLyBSZXNldHMgdGhlIHZpc3VhbCBzdHlsZXNcclxuXHRcdFx0dmFyIGN1c3RvbSA9IGFyYy5jdXN0b20gfHwge307XHJcblx0XHRcdHZhciB2YWx1ZU9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0O1xyXG5cdFx0XHR2YXIgZWxlbWVudE9wdHMgPSB0aGlzLmNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMuYXJjO1xyXG5cdFx0XHRtb2RlbC5iYWNrZ3JvdW5kQ29sb3IgPSBjdXN0b20uYmFja2dyb3VuZENvbG9yID8gY3VzdG9tLmJhY2tncm91bmRDb2xvciA6IHZhbHVlT3JEZWZhdWx0KGRhdGFzZXQuYmFja2dyb3VuZENvbG9yLCBpbmRleCwgZWxlbWVudE9wdHMuYmFja2dyb3VuZENvbG9yKTtcclxuXHRcdFx0bW9kZWwuYm9yZGVyQ29sb3IgPSBjdXN0b20uYm9yZGVyQ29sb3IgPyBjdXN0b20uYm9yZGVyQ29sb3IgOiB2YWx1ZU9yRGVmYXVsdChkYXRhc2V0LmJvcmRlckNvbG9yLCBpbmRleCwgZWxlbWVudE9wdHMuYm9yZGVyQ29sb3IpO1xyXG5cdFx0XHRtb2RlbC5ib3JkZXJXaWR0aCA9IGN1c3RvbS5ib3JkZXJXaWR0aCA/IGN1c3RvbS5ib3JkZXJXaWR0aCA6IHZhbHVlT3JEZWZhdWx0KGRhdGFzZXQuYm9yZGVyV2lkdGgsIGluZGV4LCBlbGVtZW50T3B0cy5ib3JkZXJXaWR0aCk7XHJcblxyXG5cdFx0XHQvLyBTZXQgY29ycmVjdCBhbmdsZXMgaWYgbm90IHJlc2V0dGluZ1xyXG5cdFx0XHRpZiAoIXJlc2V0IHx8ICFhbmltYXRpb25PcHRzLmFuaW1hdGVSb3RhdGUpIHtcclxuXHRcdFx0XHRpZiAoaW5kZXggPT09IDApIHtcclxuXHRcdFx0XHRcdG1vZGVsLnN0YXJ0QW5nbGUgPSBvcHRzLnJvdGF0aW9uO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRtb2RlbC5zdGFydEFuZ2xlID0gbWUuZ2V0TWV0YSgpLmRhdGFbaW5kZXggLSAxXS5fbW9kZWwuZW5kQW5nbGU7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRtb2RlbC5lbmRBbmdsZSA9IG1vZGVsLnN0YXJ0QW5nbGUgKyBtb2RlbC5jaXJjdW1mZXJlbmNlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRhcmMucGl2b3QoKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0Y2FsY3VsYXRlVG90YWw6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgZGF0YXNldCA9IHRoaXMuZ2V0RGF0YXNldCgpO1xyXG5cdFx0XHR2YXIgbWV0YSA9IHRoaXMuZ2V0TWV0YSgpO1xyXG5cdFx0XHR2YXIgdG90YWwgPSAwO1xyXG5cdFx0XHR2YXIgdmFsdWU7XHJcblxyXG5cdFx0XHRoZWxwZXJzLmVhY2gobWV0YS5kYXRhLCBmdW5jdGlvbihlbGVtZW50LCBpbmRleCkge1xyXG5cdFx0XHRcdHZhbHVlID0gZGF0YXNldC5kYXRhW2luZGV4XTtcclxuXHRcdFx0XHRpZiAoIWlzTmFOKHZhbHVlKSAmJiAhZWxlbWVudC5oaWRkZW4pIHtcclxuXHRcdFx0XHRcdHRvdGFsICs9IE1hdGguYWJzKHZhbHVlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0LyogaWYgKHRvdGFsID09PSAwKSB7XHJcblx0XHRcdFx0dG90YWwgPSBOYU47XHJcblx0XHRcdH0qL1xyXG5cclxuXHRcdFx0cmV0dXJuIHRvdGFsO1xyXG5cdFx0fSxcclxuXHJcblx0XHRjYWxjdWxhdGVDaXJjdW1mZXJlbmNlOiBmdW5jdGlvbih2YWx1ZSkge1xyXG5cdFx0XHR2YXIgdG90YWwgPSB0aGlzLmdldE1ldGEoKS50b3RhbDtcclxuXHRcdFx0aWYgKHRvdGFsID4gMCAmJiAhaXNOYU4odmFsdWUpKSB7XHJcblx0XHRcdFx0cmV0dXJuIChNYXRoLlBJICogMi4wKSAqIChNYXRoLmFicyh2YWx1ZSkgLyB0b3RhbCk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIDA7XHJcblx0XHR9LFxyXG5cclxuXHRcdC8vIGdldHMgdGhlIG1heCBib3JkZXIgb3IgaG92ZXIgd2lkdGggdG8gcHJvcGVybHkgc2NhbGUgcGllIGNoYXJ0c1xyXG5cdFx0Z2V0TWF4Qm9yZGVyV2lkdGg6IGZ1bmN0aW9uKGFyY3MpIHtcclxuXHRcdFx0dmFyIG1heCA9IDA7XHJcblx0XHRcdHZhciBpbmRleCA9IHRoaXMuaW5kZXg7XHJcblx0XHRcdHZhciBsZW5ndGggPSBhcmNzLmxlbmd0aDtcclxuXHRcdFx0dmFyIGJvcmRlcldpZHRoO1xyXG5cdFx0XHR2YXIgaG92ZXJXaWR0aDtcclxuXHJcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRib3JkZXJXaWR0aCA9IGFyY3NbaV0uX21vZGVsID8gYXJjc1tpXS5fbW9kZWwuYm9yZGVyV2lkdGggOiAwO1xyXG5cdFx0XHRcdGhvdmVyV2lkdGggPSBhcmNzW2ldLl9jaGFydCA/IGFyY3NbaV0uX2NoYXJ0LmNvbmZpZy5kYXRhLmRhdGFzZXRzW2luZGV4XS5ob3ZlckJvcmRlcldpZHRoIDogMDtcclxuXHJcblx0XHRcdFx0bWF4ID0gYm9yZGVyV2lkdGggPiBtYXggPyBib3JkZXJXaWR0aCA6IG1heDtcclxuXHRcdFx0XHRtYXggPSBob3ZlcldpZHRoID4gbWF4ID8gaG92ZXJXaWR0aCA6IG1heDtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gbWF4O1xyXG5cdFx0fVxyXG5cdH0pO1xyXG59O1xyXG5cclxufSx7XCIyNlwiOjI2LFwiNDFcIjo0MSxcIjQ2XCI6NDZ9XSwxODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xyXG52YXIgZWxlbWVudHMgPSByZXF1aXJlKDQxKTtcclxudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcclxuXHJcbmRlZmF1bHRzLl9zZXQoJ2xpbmUnLCB7XHJcblx0c2hvd0xpbmVzOiB0cnVlLFxyXG5cdHNwYW5HYXBzOiBmYWxzZSxcclxuXHJcblx0aG92ZXI6IHtcclxuXHRcdG1vZGU6ICdsYWJlbCdcclxuXHR9LFxyXG5cclxuXHRzY2FsZXM6IHtcclxuXHRcdHhBeGVzOiBbe1xyXG5cdFx0XHR0eXBlOiAnY2F0ZWdvcnknLFxyXG5cdFx0XHRpZDogJ3gtYXhpcy0wJ1xyXG5cdFx0fV0sXHJcblx0XHR5QXhlczogW3tcclxuXHRcdFx0dHlwZTogJ2xpbmVhcicsXHJcblx0XHRcdGlkOiAneS1heGlzLTAnXHJcblx0XHR9XVxyXG5cdH1cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENoYXJ0KSB7XHJcblxyXG5cdGZ1bmN0aW9uIGxpbmVFbmFibGVkKGRhdGFzZXQsIG9wdGlvbnMpIHtcclxuXHRcdHJldHVybiBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KGRhdGFzZXQuc2hvd0xpbmUsIG9wdGlvbnMuc2hvd0xpbmVzKTtcclxuXHR9XHJcblxyXG5cdENoYXJ0LmNvbnRyb2xsZXJzLmxpbmUgPSBDaGFydC5EYXRhc2V0Q29udHJvbGxlci5leHRlbmQoe1xyXG5cclxuXHRcdGRhdGFzZXRFbGVtZW50VHlwZTogZWxlbWVudHMuTGluZSxcclxuXHJcblx0XHRkYXRhRWxlbWVudFR5cGU6IGVsZW1lbnRzLlBvaW50LFxyXG5cclxuXHRcdHVwZGF0ZTogZnVuY3Rpb24ocmVzZXQpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIG1ldGEgPSBtZS5nZXRNZXRhKCk7XHJcblx0XHRcdHZhciBsaW5lID0gbWV0YS5kYXRhc2V0O1xyXG5cdFx0XHR2YXIgcG9pbnRzID0gbWV0YS5kYXRhIHx8IFtdO1xyXG5cdFx0XHR2YXIgb3B0aW9ucyA9IG1lLmNoYXJ0Lm9wdGlvbnM7XHJcblx0XHRcdHZhciBsaW5lRWxlbWVudE9wdGlvbnMgPSBvcHRpb25zLmVsZW1lbnRzLmxpbmU7XHJcblx0XHRcdHZhciBzY2FsZSA9IG1lLmdldFNjYWxlRm9ySWQobWV0YS55QXhpc0lEKTtcclxuXHRcdFx0dmFyIGksIGlsZW4sIGN1c3RvbTtcclxuXHRcdFx0dmFyIGRhdGFzZXQgPSBtZS5nZXREYXRhc2V0KCk7XHJcblx0XHRcdHZhciBzaG93TGluZSA9IGxpbmVFbmFibGVkKGRhdGFzZXQsIG9wdGlvbnMpO1xyXG5cclxuXHRcdFx0Ly8gVXBkYXRlIExpbmVcclxuXHRcdFx0aWYgKHNob3dMaW5lKSB7XHJcblx0XHRcdFx0Y3VzdG9tID0gbGluZS5jdXN0b20gfHwge307XHJcblxyXG5cdFx0XHRcdC8vIENvbXBhdGliaWxpdHk6IElmIHRoZSBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIHdpdGggb25seSB0aGUgb2xkIG5hbWUsIHVzZSB0aG9zZSB2YWx1ZXNcclxuXHRcdFx0XHRpZiAoKGRhdGFzZXQudGVuc2lvbiAhPT0gdW5kZWZpbmVkKSAmJiAoZGF0YXNldC5saW5lVGVuc2lvbiA9PT0gdW5kZWZpbmVkKSkge1xyXG5cdFx0XHRcdFx0ZGF0YXNldC5saW5lVGVuc2lvbiA9IGRhdGFzZXQudGVuc2lvbjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIFV0aWxpdHlcclxuXHRcdFx0XHRsaW5lLl9zY2FsZSA9IHNjYWxlO1xyXG5cdFx0XHRcdGxpbmUuX2RhdGFzZXRJbmRleCA9IG1lLmluZGV4O1xyXG5cdFx0XHRcdC8vIERhdGFcclxuXHRcdFx0XHRsaW5lLl9jaGlsZHJlbiA9IHBvaW50cztcclxuXHRcdFx0XHQvLyBNb2RlbFxyXG5cdFx0XHRcdGxpbmUuX21vZGVsID0ge1xyXG5cdFx0XHRcdFx0Ly8gQXBwZWFyYW5jZVxyXG5cdFx0XHRcdFx0Ly8gVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgbGluZXMgaXMgdG8gYnJlYWsgYXQgbnVsbCB2YWx1ZXMsIGFjY29yZGluZ1xyXG5cdFx0XHRcdFx0Ly8gdG8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzI0MzUjaXNzdWVjb21tZW50LTIxNjcxODE1OFxyXG5cdFx0XHRcdFx0Ly8gVGhpcyBvcHRpb24gZ2l2ZXMgbGluZXMgdGhlIGFiaWxpdHkgdG8gc3BhbiBnYXBzXHJcblx0XHRcdFx0XHRzcGFuR2FwczogZGF0YXNldC5zcGFuR2FwcyA/IGRhdGFzZXQuc3BhbkdhcHMgOiBvcHRpb25zLnNwYW5HYXBzLFxyXG5cdFx0XHRcdFx0dGVuc2lvbjogY3VzdG9tLnRlbnNpb24gPyBjdXN0b20udGVuc2lvbiA6IGhlbHBlcnMudmFsdWVPckRlZmF1bHQoZGF0YXNldC5saW5lVGVuc2lvbiwgbGluZUVsZW1lbnRPcHRpb25zLnRlbnNpb24pLFxyXG5cdFx0XHRcdFx0YmFja2dyb3VuZENvbG9yOiBjdXN0b20uYmFja2dyb3VuZENvbG9yID8gY3VzdG9tLmJhY2tncm91bmRDb2xvciA6IChkYXRhc2V0LmJhY2tncm91bmRDb2xvciB8fCBsaW5lRWxlbWVudE9wdGlvbnMuYmFja2dyb3VuZENvbG9yKSxcclxuXHRcdFx0XHRcdGJvcmRlcldpZHRoOiBjdXN0b20uYm9yZGVyV2lkdGggPyBjdXN0b20uYm9yZGVyV2lkdGggOiAoZGF0YXNldC5ib3JkZXJXaWR0aCB8fCBsaW5lRWxlbWVudE9wdGlvbnMuYm9yZGVyV2lkdGgpLFxyXG5cdFx0XHRcdFx0Ym9yZGVyQ29sb3I6IGN1c3RvbS5ib3JkZXJDb2xvciA/IGN1c3RvbS5ib3JkZXJDb2xvciA6IChkYXRhc2V0LmJvcmRlckNvbG9yIHx8IGxpbmVFbGVtZW50T3B0aW9ucy5ib3JkZXJDb2xvciksXHJcblx0XHRcdFx0XHRib3JkZXJDYXBTdHlsZTogY3VzdG9tLmJvcmRlckNhcFN0eWxlID8gY3VzdG9tLmJvcmRlckNhcFN0eWxlIDogKGRhdGFzZXQuYm9yZGVyQ2FwU3R5bGUgfHwgbGluZUVsZW1lbnRPcHRpb25zLmJvcmRlckNhcFN0eWxlKSxcclxuXHRcdFx0XHRcdGJvcmRlckRhc2g6IGN1c3RvbS5ib3JkZXJEYXNoID8gY3VzdG9tLmJvcmRlckRhc2ggOiAoZGF0YXNldC5ib3JkZXJEYXNoIHx8IGxpbmVFbGVtZW50T3B0aW9ucy5ib3JkZXJEYXNoKSxcclxuXHRcdFx0XHRcdGJvcmRlckRhc2hPZmZzZXQ6IGN1c3RvbS5ib3JkZXJEYXNoT2Zmc2V0ID8gY3VzdG9tLmJvcmRlckRhc2hPZmZzZXQgOiAoZGF0YXNldC5ib3JkZXJEYXNoT2Zmc2V0IHx8IGxpbmVFbGVtZW50T3B0aW9ucy5ib3JkZXJEYXNoT2Zmc2V0KSxcclxuXHRcdFx0XHRcdGJvcmRlckpvaW5TdHlsZTogY3VzdG9tLmJvcmRlckpvaW5TdHlsZSA/IGN1c3RvbS5ib3JkZXJKb2luU3R5bGUgOiAoZGF0YXNldC5ib3JkZXJKb2luU3R5bGUgfHwgbGluZUVsZW1lbnRPcHRpb25zLmJvcmRlckpvaW5TdHlsZSksXHJcblx0XHRcdFx0XHRmaWxsOiBjdXN0b20uZmlsbCA/IGN1c3RvbS5maWxsIDogKGRhdGFzZXQuZmlsbCAhPT0gdW5kZWZpbmVkID8gZGF0YXNldC5maWxsIDogbGluZUVsZW1lbnRPcHRpb25zLmZpbGwpLFxyXG5cdFx0XHRcdFx0c3RlcHBlZExpbmU6IGN1c3RvbS5zdGVwcGVkTGluZSA/IGN1c3RvbS5zdGVwcGVkTGluZSA6IGhlbHBlcnMudmFsdWVPckRlZmF1bHQoZGF0YXNldC5zdGVwcGVkTGluZSwgbGluZUVsZW1lbnRPcHRpb25zLnN0ZXBwZWQpLFxyXG5cdFx0XHRcdFx0Y3ViaWNJbnRlcnBvbGF0aW9uTW9kZTogY3VzdG9tLmN1YmljSW50ZXJwb2xhdGlvbk1vZGUgPyBjdXN0b20uY3ViaWNJbnRlcnBvbGF0aW9uTW9kZSA6IGhlbHBlcnMudmFsdWVPckRlZmF1bHQoZGF0YXNldC5jdWJpY0ludGVycG9sYXRpb25Nb2RlLCBsaW5lRWxlbWVudE9wdGlvbnMuY3ViaWNJbnRlcnBvbGF0aW9uTW9kZSksXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0bGluZS5waXZvdCgpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBVcGRhdGUgUG9pbnRzXHJcblx0XHRcdGZvciAoaSA9IDAsIGlsZW4gPSBwb2ludHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XHJcblx0XHRcdFx0bWUudXBkYXRlRWxlbWVudChwb2ludHNbaV0sIGksIHJlc2V0KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKHNob3dMaW5lICYmIGxpbmUuX21vZGVsLnRlbnNpb24gIT09IDApIHtcclxuXHRcdFx0XHRtZS51cGRhdGVCZXppZXJDb250cm9sUG9pbnRzKCk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE5vdyBwaXZvdCB0aGUgcG9pbnQgZm9yIGFuaW1hdGlvblxyXG5cdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xyXG5cdFx0XHRcdHBvaW50c1tpXS5waXZvdCgpO1xyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cclxuXHRcdGdldFBvaW50QmFja2dyb3VuZENvbG9yOiBmdW5jdGlvbihwb2ludCwgaW5kZXgpIHtcclxuXHRcdFx0dmFyIGJhY2tncm91bmRDb2xvciA9IHRoaXMuY2hhcnQub3B0aW9ucy5lbGVtZW50cy5wb2ludC5iYWNrZ3JvdW5kQ29sb3I7XHJcblx0XHRcdHZhciBkYXRhc2V0ID0gdGhpcy5nZXREYXRhc2V0KCk7XHJcblx0XHRcdHZhciBjdXN0b20gPSBwb2ludC5jdXN0b20gfHwge307XHJcblxyXG5cdFx0XHRpZiAoY3VzdG9tLmJhY2tncm91bmRDb2xvcikge1xyXG5cdFx0XHRcdGJhY2tncm91bmRDb2xvciA9IGN1c3RvbS5iYWNrZ3JvdW5kQ29sb3I7XHJcblx0XHRcdH0gZWxzZSBpZiAoZGF0YXNldC5wb2ludEJhY2tncm91bmRDb2xvcikge1xyXG5cdFx0XHRcdGJhY2tncm91bmRDb2xvciA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRCYWNrZ3JvdW5kQ29sb3IsIGluZGV4LCBiYWNrZ3JvdW5kQ29sb3IpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKGRhdGFzZXQuYmFja2dyb3VuZENvbG9yKSB7XHJcblx0XHRcdFx0YmFja2dyb3VuZENvbG9yID0gZGF0YXNldC5iYWNrZ3JvdW5kQ29sb3I7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBiYWNrZ3JvdW5kQ29sb3I7XHJcblx0XHR9LFxyXG5cclxuXHRcdGdldFBvaW50Qm9yZGVyQ29sb3I6IGZ1bmN0aW9uKHBvaW50LCBpbmRleCkge1xyXG5cdFx0XHR2YXIgYm9yZGVyQ29sb3IgPSB0aGlzLmNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMucG9pbnQuYm9yZGVyQ29sb3I7XHJcblx0XHRcdHZhciBkYXRhc2V0ID0gdGhpcy5nZXREYXRhc2V0KCk7XHJcblx0XHRcdHZhciBjdXN0b20gPSBwb2ludC5jdXN0b20gfHwge307XHJcblxyXG5cdFx0XHRpZiAoY3VzdG9tLmJvcmRlckNvbG9yKSB7XHJcblx0XHRcdFx0Ym9yZGVyQ29sb3IgPSBjdXN0b20uYm9yZGVyQ29sb3I7XHJcblx0XHRcdH0gZWxzZSBpZiAoZGF0YXNldC5wb2ludEJvcmRlckNvbG9yKSB7XHJcblx0XHRcdFx0Ym9yZGVyQ29sb3IgPSBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LnBvaW50Qm9yZGVyQ29sb3IsIGluZGV4LCBib3JkZXJDb2xvcik7XHJcblx0XHRcdH0gZWxzZSBpZiAoZGF0YXNldC5ib3JkZXJDb2xvcikge1xyXG5cdFx0XHRcdGJvcmRlckNvbG9yID0gZGF0YXNldC5ib3JkZXJDb2xvcjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGJvcmRlckNvbG9yO1xyXG5cdFx0fSxcclxuXHJcblx0XHRnZXRQb2ludEJvcmRlcldpZHRoOiBmdW5jdGlvbihwb2ludCwgaW5kZXgpIHtcclxuXHRcdFx0dmFyIGJvcmRlcldpZHRoID0gdGhpcy5jaGFydC5vcHRpb25zLmVsZW1lbnRzLnBvaW50LmJvcmRlcldpZHRoO1xyXG5cdFx0XHR2YXIgZGF0YXNldCA9IHRoaXMuZ2V0RGF0YXNldCgpO1xyXG5cdFx0XHR2YXIgY3VzdG9tID0gcG9pbnQuY3VzdG9tIHx8IHt9O1xyXG5cclxuXHRcdFx0aWYgKCFpc05hTihjdXN0b20uYm9yZGVyV2lkdGgpKSB7XHJcblx0XHRcdFx0Ym9yZGVyV2lkdGggPSBjdXN0b20uYm9yZGVyV2lkdGg7XHJcblx0XHRcdH0gZWxzZSBpZiAoIWlzTmFOKGRhdGFzZXQucG9pbnRCb3JkZXJXaWR0aCkgfHwgaGVscGVycy5pc0FycmF5KGRhdGFzZXQucG9pbnRCb3JkZXJXaWR0aCkpIHtcclxuXHRcdFx0XHRib3JkZXJXaWR0aCA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRCb3JkZXJXaWR0aCwgaW5kZXgsIGJvcmRlcldpZHRoKTtcclxuXHRcdFx0fSBlbHNlIGlmICghaXNOYU4oZGF0YXNldC5ib3JkZXJXaWR0aCkpIHtcclxuXHRcdFx0XHRib3JkZXJXaWR0aCA9IGRhdGFzZXQuYm9yZGVyV2lkdGg7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBib3JkZXJXaWR0aDtcclxuXHRcdH0sXHJcblxyXG5cdFx0Z2V0UG9pbnRSb3RhdGlvbjogZnVuY3Rpb24ocG9pbnQsIGluZGV4KSB7XHJcblx0XHRcdHZhciBwb2ludFJvdGF0aW9uID0gdGhpcy5jaGFydC5vcHRpb25zLmVsZW1lbnRzLnBvaW50LnJvdGF0aW9uO1xyXG5cdFx0XHR2YXIgZGF0YXNldCA9IHRoaXMuZ2V0RGF0YXNldCgpO1xyXG5cdFx0XHR2YXIgY3VzdG9tID0gcG9pbnQuY3VzdG9tIHx8IHt9O1xyXG5cclxuXHRcdFx0aWYgKCFpc05hTihjdXN0b20ucm90YXRpb24pKSB7XHJcblx0XHRcdFx0cG9pbnRSb3RhdGlvbiA9IGN1c3RvbS5yb3RhdGlvbjtcclxuXHRcdFx0fSBlbHNlIGlmICghaXNOYU4oZGF0YXNldC5wb2ludFJvdGF0aW9uKSB8fCBoZWxwZXJzLmlzQXJyYXkoZGF0YXNldC5wb2ludFJvdGF0aW9uKSkge1xyXG5cdFx0XHRcdHBvaW50Um90YXRpb24gPSBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LnBvaW50Um90YXRpb24sIGluZGV4LCBwb2ludFJvdGF0aW9uKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gcG9pbnRSb3RhdGlvbjtcclxuXHRcdH0sXHJcblxyXG5cdFx0dXBkYXRlRWxlbWVudDogZnVuY3Rpb24ocG9pbnQsIGluZGV4LCByZXNldCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcclxuXHRcdFx0dmFyIGN1c3RvbSA9IHBvaW50LmN1c3RvbSB8fCB7fTtcclxuXHRcdFx0dmFyIGRhdGFzZXQgPSBtZS5nZXREYXRhc2V0KCk7XHJcblx0XHRcdHZhciBkYXRhc2V0SW5kZXggPSBtZS5pbmRleDtcclxuXHRcdFx0dmFyIHZhbHVlID0gZGF0YXNldC5kYXRhW2luZGV4XTtcclxuXHRcdFx0dmFyIHlTY2FsZSA9IG1lLmdldFNjYWxlRm9ySWQobWV0YS55QXhpc0lEKTtcclxuXHRcdFx0dmFyIHhTY2FsZSA9IG1lLmdldFNjYWxlRm9ySWQobWV0YS54QXhpc0lEKTtcclxuXHRcdFx0dmFyIHBvaW50T3B0aW9ucyA9IG1lLmNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMucG9pbnQ7XHJcblx0XHRcdHZhciB4LCB5O1xyXG5cclxuXHRcdFx0Ly8gQ29tcGF0aWJpbGl0eTogSWYgdGhlIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgd2l0aCBvbmx5IHRoZSBvbGQgbmFtZSwgdXNlIHRob3NlIHZhbHVlc1xyXG5cdFx0XHRpZiAoKGRhdGFzZXQucmFkaXVzICE9PSB1bmRlZmluZWQpICYmIChkYXRhc2V0LnBvaW50UmFkaXVzID09PSB1bmRlZmluZWQpKSB7XHJcblx0XHRcdFx0ZGF0YXNldC5wb2ludFJhZGl1cyA9IGRhdGFzZXQucmFkaXVzO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICgoZGF0YXNldC5oaXRSYWRpdXMgIT09IHVuZGVmaW5lZCkgJiYgKGRhdGFzZXQucG9pbnRIaXRSYWRpdXMgPT09IHVuZGVmaW5lZCkpIHtcclxuXHRcdFx0XHRkYXRhc2V0LnBvaW50SGl0UmFkaXVzID0gZGF0YXNldC5oaXRSYWRpdXM7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHggPSB4U2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZSh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gdmFsdWUgOiBOYU4sIGluZGV4LCBkYXRhc2V0SW5kZXgpO1xyXG5cdFx0XHR5ID0gcmVzZXQgPyB5U2NhbGUuZ2V0QmFzZVBpeGVsKCkgOiBtZS5jYWxjdWxhdGVQb2ludFkodmFsdWUsIGluZGV4LCBkYXRhc2V0SW5kZXgpO1xyXG5cclxuXHRcdFx0Ly8gVXRpbGl0eVxyXG5cdFx0XHRwb2ludC5feFNjYWxlID0geFNjYWxlO1xyXG5cdFx0XHRwb2ludC5feVNjYWxlID0geVNjYWxlO1xyXG5cdFx0XHRwb2ludC5fZGF0YXNldEluZGV4ID0gZGF0YXNldEluZGV4O1xyXG5cdFx0XHRwb2ludC5faW5kZXggPSBpbmRleDtcclxuXHJcblx0XHRcdC8vIERlc2lyZWQgdmlldyBwcm9wZXJ0aWVzXHJcblx0XHRcdHBvaW50Ll9tb2RlbCA9IHtcclxuXHRcdFx0XHR4OiB4LFxyXG5cdFx0XHRcdHk6IHksXHJcblx0XHRcdFx0c2tpcDogY3VzdG9tLnNraXAgfHwgaXNOYU4oeCkgfHwgaXNOYU4oeSksXHJcblx0XHRcdFx0Ly8gQXBwZWFyYW5jZVxyXG5cdFx0XHRcdHJhZGl1czogY3VzdG9tLnJhZGl1cyB8fCBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LnBvaW50UmFkaXVzLCBpbmRleCwgcG9pbnRPcHRpb25zLnJhZGl1cyksXHJcblx0XHRcdFx0cG9pbnRTdHlsZTogY3VzdG9tLnBvaW50U3R5bGUgfHwgaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludFN0eWxlLCBpbmRleCwgcG9pbnRPcHRpb25zLnBvaW50U3R5bGUpLFxyXG5cdFx0XHRcdHJvdGF0aW9uOiBtZS5nZXRQb2ludFJvdGF0aW9uKHBvaW50LCBpbmRleCksXHJcblx0XHRcdFx0YmFja2dyb3VuZENvbG9yOiBtZS5nZXRQb2ludEJhY2tncm91bmRDb2xvcihwb2ludCwgaW5kZXgpLFxyXG5cdFx0XHRcdGJvcmRlckNvbG9yOiBtZS5nZXRQb2ludEJvcmRlckNvbG9yKHBvaW50LCBpbmRleCksXHJcblx0XHRcdFx0Ym9yZGVyV2lkdGg6IG1lLmdldFBvaW50Qm9yZGVyV2lkdGgocG9pbnQsIGluZGV4KSxcclxuXHRcdFx0XHR0ZW5zaW9uOiBtZXRhLmRhdGFzZXQuX21vZGVsID8gbWV0YS5kYXRhc2V0Ll9tb2RlbC50ZW5zaW9uIDogMCxcclxuXHRcdFx0XHRzdGVwcGVkTGluZTogbWV0YS5kYXRhc2V0Ll9tb2RlbCA/IG1ldGEuZGF0YXNldC5fbW9kZWwuc3RlcHBlZExpbmUgOiBmYWxzZSxcclxuXHRcdFx0XHQvLyBUb29sdGlwXHJcblx0XHRcdFx0aGl0UmFkaXVzOiBjdXN0b20uaGl0UmFkaXVzIHx8IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRIaXRSYWRpdXMsIGluZGV4LCBwb2ludE9wdGlvbnMuaGl0UmFkaXVzKVxyXG5cdFx0XHR9O1xyXG5cdFx0fSxcclxuXHJcblx0XHRjYWxjdWxhdGVQb2ludFk6IGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgZGF0YXNldEluZGV4KSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xyXG5cdFx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcclxuXHRcdFx0dmFyIHlTY2FsZSA9IG1lLmdldFNjYWxlRm9ySWQobWV0YS55QXhpc0lEKTtcclxuXHRcdFx0dmFyIHN1bVBvcyA9IDA7XHJcblx0XHRcdHZhciBzdW1OZWcgPSAwO1xyXG5cdFx0XHR2YXIgaSwgZHMsIGRzTWV0YTtcclxuXHJcblx0XHRcdGlmICh5U2NhbGUub3B0aW9ucy5zdGFja2VkKSB7XHJcblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGRhdGFzZXRJbmRleDsgaSsrKSB7XHJcblx0XHRcdFx0XHRkcyA9IGNoYXJ0LmRhdGEuZGF0YXNldHNbaV07XHJcblx0XHRcdFx0XHRkc01ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShpKTtcclxuXHRcdFx0XHRcdGlmIChkc01ldGEudHlwZSA9PT0gJ2xpbmUnICYmIGRzTWV0YS55QXhpc0lEID09PSB5U2NhbGUuaWQgJiYgY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShpKSkge1xyXG5cdFx0XHRcdFx0XHR2YXIgc3RhY2tlZFJpZ2h0VmFsdWUgPSBOdW1iZXIoeVNjYWxlLmdldFJpZ2h0VmFsdWUoZHMuZGF0YVtpbmRleF0pKTtcclxuXHRcdFx0XHRcdFx0aWYgKHN0YWNrZWRSaWdodFZhbHVlIDwgMCkge1xyXG5cdFx0XHRcdFx0XHRcdHN1bU5lZyArPSBzdGFja2VkUmlnaHRWYWx1ZSB8fCAwO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdHN1bVBvcyArPSBzdGFja2VkUmlnaHRWYWx1ZSB8fCAwO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR2YXIgcmlnaHRWYWx1ZSA9IE51bWJlcih5U2NhbGUuZ2V0UmlnaHRWYWx1ZSh2YWx1ZSkpO1xyXG5cdFx0XHRcdGlmIChyaWdodFZhbHVlIDwgMCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHlTY2FsZS5nZXRQaXhlbEZvclZhbHVlKHN1bU5lZyArIHJpZ2h0VmFsdWUpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRyZXR1cm4geVNjYWxlLmdldFBpeGVsRm9yVmFsdWUoc3VtUG9zICsgcmlnaHRWYWx1ZSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB5U2NhbGUuZ2V0UGl4ZWxGb3JWYWx1ZSh2YWx1ZSk7XHJcblx0XHR9LFxyXG5cclxuXHRcdHVwZGF0ZUJlemllckNvbnRyb2xQb2ludHM6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgbWV0YSA9IG1lLmdldE1ldGEoKTtcclxuXHRcdFx0dmFyIGFyZWEgPSBtZS5jaGFydC5jaGFydEFyZWE7XHJcblx0XHRcdHZhciBwb2ludHMgPSAobWV0YS5kYXRhIHx8IFtdKTtcclxuXHRcdFx0dmFyIGksIGlsZW4sIHBvaW50LCBtb2RlbCwgY29udHJvbFBvaW50cztcclxuXHJcblx0XHRcdC8vIE9ubHkgY29uc2lkZXIgcG9pbnRzIHRoYXQgYXJlIGRyYXduIGluIGNhc2UgdGhlIHNwYW5HYXBzIG9wdGlvbiBpcyB1c2VkXHJcblx0XHRcdGlmIChtZXRhLmRhdGFzZXQuX21vZGVsLnNwYW5HYXBzKSB7XHJcblx0XHRcdFx0cG9pbnRzID0gcG9pbnRzLmZpbHRlcihmdW5jdGlvbihwdCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuICFwdC5fbW9kZWwuc2tpcDtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gY2FwQ29udHJvbFBvaW50KHB0LCBtaW4sIG1heCkge1xyXG5cdFx0XHRcdHJldHVybiBNYXRoLm1heChNYXRoLm1pbihwdCwgbWF4KSwgbWluKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKG1ldGEuZGF0YXNldC5fbW9kZWwuY3ViaWNJbnRlcnBvbGF0aW9uTW9kZSA9PT0gJ21vbm90b25lJykge1xyXG5cdFx0XHRcdGhlbHBlcnMuc3BsaW5lQ3VydmVNb25vdG9uZShwb2ludHMpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGZvciAoaSA9IDAsIGlsZW4gPSBwb2ludHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XHJcblx0XHRcdFx0XHRwb2ludCA9IHBvaW50c1tpXTtcclxuXHRcdFx0XHRcdG1vZGVsID0gcG9pbnQuX21vZGVsO1xyXG5cdFx0XHRcdFx0Y29udHJvbFBvaW50cyA9IGhlbHBlcnMuc3BsaW5lQ3VydmUoXHJcblx0XHRcdFx0XHRcdGhlbHBlcnMucHJldmlvdXNJdGVtKHBvaW50cywgaSkuX21vZGVsLFxyXG5cdFx0XHRcdFx0XHRtb2RlbCxcclxuXHRcdFx0XHRcdFx0aGVscGVycy5uZXh0SXRlbShwb2ludHMsIGkpLl9tb2RlbCxcclxuXHRcdFx0XHRcdFx0bWV0YS5kYXRhc2V0Ll9tb2RlbC50ZW5zaW9uXHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0bW9kZWwuY29udHJvbFBvaW50UHJldmlvdXNYID0gY29udHJvbFBvaW50cy5wcmV2aW91cy54O1xyXG5cdFx0XHRcdFx0bW9kZWwuY29udHJvbFBvaW50UHJldmlvdXNZID0gY29udHJvbFBvaW50cy5wcmV2aW91cy55O1xyXG5cdFx0XHRcdFx0bW9kZWwuY29udHJvbFBvaW50TmV4dFggPSBjb250cm9sUG9pbnRzLm5leHQueDtcclxuXHRcdFx0XHRcdG1vZGVsLmNvbnRyb2xQb2ludE5leHRZID0gY29udHJvbFBvaW50cy5uZXh0Lnk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAobWUuY2hhcnQub3B0aW9ucy5lbGVtZW50cy5saW5lLmNhcEJlemllclBvaW50cykge1xyXG5cdFx0XHRcdGZvciAoaSA9IDAsIGlsZW4gPSBwb2ludHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XHJcblx0XHRcdFx0XHRtb2RlbCA9IHBvaW50c1tpXS5fbW9kZWw7XHJcblx0XHRcdFx0XHRtb2RlbC5jb250cm9sUG9pbnRQcmV2aW91c1ggPSBjYXBDb250cm9sUG9pbnQobW9kZWwuY29udHJvbFBvaW50UHJldmlvdXNYLCBhcmVhLmxlZnQsIGFyZWEucmlnaHQpO1xyXG5cdFx0XHRcdFx0bW9kZWwuY29udHJvbFBvaW50UHJldmlvdXNZID0gY2FwQ29udHJvbFBvaW50KG1vZGVsLmNvbnRyb2xQb2ludFByZXZpb3VzWSwgYXJlYS50b3AsIGFyZWEuYm90dG9tKTtcclxuXHRcdFx0XHRcdG1vZGVsLmNvbnRyb2xQb2ludE5leHRYID0gY2FwQ29udHJvbFBvaW50KG1vZGVsLmNvbnRyb2xQb2ludE5leHRYLCBhcmVhLmxlZnQsIGFyZWEucmlnaHQpO1xyXG5cdFx0XHRcdFx0bW9kZWwuY29udHJvbFBvaW50TmV4dFkgPSBjYXBDb250cm9sUG9pbnQobW9kZWwuY29udHJvbFBvaW50TmV4dFksIGFyZWEudG9wLCBhcmVhLmJvdHRvbSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cclxuXHRcdGRyYXc6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgY2hhcnQgPSBtZS5jaGFydDtcclxuXHRcdFx0dmFyIG1ldGEgPSBtZS5nZXRNZXRhKCk7XHJcblx0XHRcdHZhciBwb2ludHMgPSBtZXRhLmRhdGEgfHwgW107XHJcblx0XHRcdHZhciBhcmVhID0gY2hhcnQuY2hhcnRBcmVhO1xyXG5cdFx0XHR2YXIgaWxlbiA9IHBvaW50cy5sZW5ndGg7XHJcblx0XHRcdHZhciBoYWxmQm9yZGVyV2lkdGg7XHJcblx0XHRcdHZhciBpID0gMDtcclxuXHJcblx0XHRcdGlmIChsaW5lRW5hYmxlZChtZS5nZXREYXRhc2V0KCksIGNoYXJ0Lm9wdGlvbnMpKSB7XHJcblx0XHRcdFx0aGFsZkJvcmRlcldpZHRoID0gKG1ldGEuZGF0YXNldC5fbW9kZWwuYm9yZGVyV2lkdGggfHwgMCkgLyAyO1xyXG5cclxuXHRcdFx0XHRoZWxwZXJzLmNhbnZhcy5jbGlwQXJlYShjaGFydC5jdHgsIHtcclxuXHRcdFx0XHRcdGxlZnQ6IGFyZWEubGVmdCxcclxuXHRcdFx0XHRcdHJpZ2h0OiBhcmVhLnJpZ2h0LFxyXG5cdFx0XHRcdFx0dG9wOiBhcmVhLnRvcCAtIGhhbGZCb3JkZXJXaWR0aCxcclxuXHRcdFx0XHRcdGJvdHRvbTogYXJlYS5ib3R0b20gKyBoYWxmQm9yZGVyV2lkdGhcclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0bWV0YS5kYXRhc2V0LmRyYXcoKTtcclxuXHJcblx0XHRcdFx0aGVscGVycy5jYW52YXMudW5jbGlwQXJlYShjaGFydC5jdHgpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBEcmF3IHRoZSBwb2ludHNcclxuXHRcdFx0Zm9yICg7IGkgPCBpbGVuOyArK2kpIHtcclxuXHRcdFx0XHRwb2ludHNbaV0uZHJhdyhhcmVhKTtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHJcblx0XHRzZXRIb3ZlclN0eWxlOiBmdW5jdGlvbihlbGVtZW50KSB7XHJcblx0XHRcdC8vIFBvaW50XHJcblx0XHRcdHZhciBkYXRhc2V0ID0gdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzW2VsZW1lbnQuX2RhdGFzZXRJbmRleF07XHJcblx0XHRcdHZhciBpbmRleCA9IGVsZW1lbnQuX2luZGV4O1xyXG5cdFx0XHR2YXIgY3VzdG9tID0gZWxlbWVudC5jdXN0b20gfHwge307XHJcblx0XHRcdHZhciBtb2RlbCA9IGVsZW1lbnQuX21vZGVsO1xyXG5cclxuXHRcdFx0ZWxlbWVudC4kcHJldmlvdXNTdHlsZSA9IHtcclxuXHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IG1vZGVsLmJhY2tncm91bmRDb2xvcixcclxuXHRcdFx0XHRib3JkZXJDb2xvcjogbW9kZWwuYm9yZGVyQ29sb3IsXHJcblx0XHRcdFx0Ym9yZGVyV2lkdGg6IG1vZGVsLmJvcmRlcldpZHRoLFxyXG5cdFx0XHRcdHJhZGl1czogbW9kZWwucmFkaXVzXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRtb2RlbC5iYWNrZ3JvdW5kQ29sb3IgPSBjdXN0b20uaG92ZXJCYWNrZ3JvdW5kQ29sb3IgfHwgaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludEhvdmVyQmFja2dyb3VuZENvbG9yLCBpbmRleCwgaGVscGVycy5nZXRIb3ZlckNvbG9yKG1vZGVsLmJhY2tncm91bmRDb2xvcikpO1xyXG5cdFx0XHRtb2RlbC5ib3JkZXJDb2xvciA9IGN1c3RvbS5ob3ZlckJvcmRlckNvbG9yIHx8IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRIb3ZlckJvcmRlckNvbG9yLCBpbmRleCwgaGVscGVycy5nZXRIb3ZlckNvbG9yKG1vZGVsLmJvcmRlckNvbG9yKSk7XHJcblx0XHRcdG1vZGVsLmJvcmRlcldpZHRoID0gY3VzdG9tLmhvdmVyQm9yZGVyV2lkdGggfHwgaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludEhvdmVyQm9yZGVyV2lkdGgsIGluZGV4LCBtb2RlbC5ib3JkZXJXaWR0aCk7XHJcblx0XHRcdG1vZGVsLnJhZGl1cyA9IGN1c3RvbS5ob3ZlclJhZGl1cyB8fCBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LnBvaW50SG92ZXJSYWRpdXMsIGluZGV4LCB0aGlzLmNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMucG9pbnQuaG92ZXJSYWRpdXMpO1xyXG5cdFx0fSxcclxuXHR9KTtcclxufTtcclxuXHJcbn0se1wiMjZcIjoyNixcIjQxXCI6NDEsXCI0NlwiOjQ2fV0sMTk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcclxudmFyIGVsZW1lbnRzID0gcmVxdWlyZSg0MSk7XHJcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XHJcblxyXG5kZWZhdWx0cy5fc2V0KCdwb2xhckFyZWEnLCB7XHJcblx0c2NhbGU6IHtcclxuXHRcdHR5cGU6ICdyYWRpYWxMaW5lYXInLFxyXG5cdFx0YW5nbGVMaW5lczoge1xyXG5cdFx0XHRkaXNwbGF5OiBmYWxzZVxyXG5cdFx0fSxcclxuXHRcdGdyaWRMaW5lczoge1xyXG5cdFx0XHRjaXJjdWxhcjogdHJ1ZVxyXG5cdFx0fSxcclxuXHRcdHBvaW50TGFiZWxzOiB7XHJcblx0XHRcdGRpc3BsYXk6IGZhbHNlXHJcblx0XHR9LFxyXG5cdFx0dGlja3M6IHtcclxuXHRcdFx0YmVnaW5BdFplcm86IHRydWVcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHQvLyBCb29sZWFuIC0gV2hldGhlciB0byBhbmltYXRlIHRoZSByb3RhdGlvbiBvZiB0aGUgY2hhcnRcclxuXHRhbmltYXRpb246IHtcclxuXHRcdGFuaW1hdGVSb3RhdGU6IHRydWUsXHJcblx0XHRhbmltYXRlU2NhbGU6IHRydWVcclxuXHR9LFxyXG5cclxuXHRzdGFydEFuZ2xlOiAtMC41ICogTWF0aC5QSSxcclxuXHRsZWdlbmRDYWxsYmFjazogZnVuY3Rpb24oY2hhcnQpIHtcclxuXHRcdHZhciB0ZXh0ID0gW107XHJcblx0XHR0ZXh0LnB1c2goJzx1bCBjbGFzcz1cIicgKyBjaGFydC5pZCArICctbGVnZW5kXCI+Jyk7XHJcblxyXG5cdFx0dmFyIGRhdGEgPSBjaGFydC5kYXRhO1xyXG5cdFx0dmFyIGRhdGFzZXRzID0gZGF0YS5kYXRhc2V0cztcclxuXHRcdHZhciBsYWJlbHMgPSBkYXRhLmxhYmVscztcclxuXHJcblx0XHRpZiAoZGF0YXNldHMubGVuZ3RoKSB7XHJcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YXNldHNbMF0uZGF0YS5sZW5ndGg7ICsraSkge1xyXG5cdFx0XHRcdHRleHQucHVzaCgnPGxpPjxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjonICsgZGF0YXNldHNbMF0uYmFja2dyb3VuZENvbG9yW2ldICsgJ1wiPjwvc3Bhbj4nKTtcclxuXHRcdFx0XHRpZiAobGFiZWxzW2ldKSB7XHJcblx0XHRcdFx0XHR0ZXh0LnB1c2gobGFiZWxzW2ldKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dGV4dC5wdXNoKCc8L2xpPicpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0dGV4dC5wdXNoKCc8L3VsPicpO1xyXG5cdFx0cmV0dXJuIHRleHQuam9pbignJyk7XHJcblx0fSxcclxuXHRsZWdlbmQ6IHtcclxuXHRcdGxhYmVsczoge1xyXG5cdFx0XHRnZW5lcmF0ZUxhYmVsczogZnVuY3Rpb24oY2hhcnQpIHtcclxuXHRcdFx0XHR2YXIgZGF0YSA9IGNoYXJ0LmRhdGE7XHJcblx0XHRcdFx0aWYgKGRhdGEubGFiZWxzLmxlbmd0aCAmJiBkYXRhLmRhdGFzZXRzLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGRhdGEubGFiZWxzLm1hcChmdW5jdGlvbihsYWJlbCwgaSkge1xyXG5cdFx0XHRcdFx0XHR2YXIgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKDApO1xyXG5cdFx0XHRcdFx0XHR2YXIgZHMgPSBkYXRhLmRhdGFzZXRzWzBdO1xyXG5cdFx0XHRcdFx0XHR2YXIgYXJjID0gbWV0YS5kYXRhW2ldO1xyXG5cdFx0XHRcdFx0XHR2YXIgY3VzdG9tID0gYXJjLmN1c3RvbSB8fCB7fTtcclxuXHRcdFx0XHRcdFx0dmFyIHZhbHVlQXRJbmRleE9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0O1xyXG5cdFx0XHRcdFx0XHR2YXIgYXJjT3B0cyA9IGNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMuYXJjO1xyXG5cdFx0XHRcdFx0XHR2YXIgZmlsbCA9IGN1c3RvbS5iYWNrZ3JvdW5kQ29sb3IgPyBjdXN0b20uYmFja2dyb3VuZENvbG9yIDogdmFsdWVBdEluZGV4T3JEZWZhdWx0KGRzLmJhY2tncm91bmRDb2xvciwgaSwgYXJjT3B0cy5iYWNrZ3JvdW5kQ29sb3IpO1xyXG5cdFx0XHRcdFx0XHR2YXIgc3Ryb2tlID0gY3VzdG9tLmJvcmRlckNvbG9yID8gY3VzdG9tLmJvcmRlckNvbG9yIDogdmFsdWVBdEluZGV4T3JEZWZhdWx0KGRzLmJvcmRlckNvbG9yLCBpLCBhcmNPcHRzLmJvcmRlckNvbG9yKTtcclxuXHRcdFx0XHRcdFx0dmFyIGJ3ID0gY3VzdG9tLmJvcmRlcldpZHRoID8gY3VzdG9tLmJvcmRlcldpZHRoIDogdmFsdWVBdEluZGV4T3JEZWZhdWx0KGRzLmJvcmRlcldpZHRoLCBpLCBhcmNPcHRzLmJvcmRlcldpZHRoKTtcclxuXHJcblx0XHRcdFx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0XHRcdFx0dGV4dDogbGFiZWwsXHJcblx0XHRcdFx0XHRcdFx0ZmlsbFN0eWxlOiBmaWxsLFxyXG5cdFx0XHRcdFx0XHRcdHN0cm9rZVN0eWxlOiBzdHJva2UsXHJcblx0XHRcdFx0XHRcdFx0bGluZVdpZHRoOiBidyxcclxuXHRcdFx0XHRcdFx0XHRoaWRkZW46IGlzTmFOKGRzLmRhdGFbaV0pIHx8IG1ldGEuZGF0YVtpXS5oaWRkZW4sXHJcblxyXG5cdFx0XHRcdFx0XHRcdC8vIEV4dHJhIGRhdGEgdXNlZCBmb3IgdG9nZ2xpbmcgdGhlIGNvcnJlY3QgaXRlbVxyXG5cdFx0XHRcdFx0XHRcdGluZGV4OiBpXHJcblx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIFtdO1xyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cclxuXHRcdG9uQ2xpY2s6IGZ1bmN0aW9uKGUsIGxlZ2VuZEl0ZW0pIHtcclxuXHRcdFx0dmFyIGluZGV4ID0gbGVnZW5kSXRlbS5pbmRleDtcclxuXHRcdFx0dmFyIGNoYXJ0ID0gdGhpcy5jaGFydDtcclxuXHRcdFx0dmFyIGksIGlsZW4sIG1ldGE7XHJcblxyXG5cdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0gKGNoYXJ0LmRhdGEuZGF0YXNldHMgfHwgW10pLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xyXG5cdFx0XHRcdG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShpKTtcclxuXHRcdFx0XHRtZXRhLmRhdGFbaW5kZXhdLmhpZGRlbiA9ICFtZXRhLmRhdGFbaW5kZXhdLmhpZGRlbjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y2hhcnQudXBkYXRlKCk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Ly8gTmVlZCB0byBvdmVycmlkZSB0aGVzZSB0byBnaXZlIGEgbmljZSBkZWZhdWx0XHJcblx0dG9vbHRpcHM6IHtcclxuXHRcdGNhbGxiYWNrczoge1xyXG5cdFx0XHR0aXRsZTogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0cmV0dXJuICcnO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRsYWJlbDogZnVuY3Rpb24oaXRlbSwgZGF0YSkge1xyXG5cdFx0XHRcdHJldHVybiBkYXRhLmxhYmVsc1tpdGVtLmluZGV4XSArICc6ICcgKyBpdGVtLnlMYWJlbDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENoYXJ0KSB7XHJcblxyXG5cdENoYXJ0LmNvbnRyb2xsZXJzLnBvbGFyQXJlYSA9IENoYXJ0LkRhdGFzZXRDb250cm9sbGVyLmV4dGVuZCh7XHJcblxyXG5cdFx0ZGF0YUVsZW1lbnRUeXBlOiBlbGVtZW50cy5BcmMsXHJcblxyXG5cdFx0bGlua1NjYWxlczogaGVscGVycy5ub29wLFxyXG5cclxuXHRcdHVwZGF0ZTogZnVuY3Rpb24ocmVzZXQpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIGRhdGFzZXQgPSBtZS5nZXREYXRhc2V0KCk7XHJcblx0XHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xyXG5cdFx0XHR2YXIgc3RhcnQgPSBtZS5jaGFydC5vcHRpb25zLnN0YXJ0QW5nbGUgfHwgMDtcclxuXHRcdFx0dmFyIHN0YXJ0cyA9IG1lLl9zdGFydHMgPSBbXTtcclxuXHRcdFx0dmFyIGFuZ2xlcyA9IG1lLl9hbmdsZXMgPSBbXTtcclxuXHRcdFx0dmFyIGksIGlsZW4sIGFuZ2xlO1xyXG5cclxuXHRcdFx0bWUuX3VwZGF0ZVJhZGl1cygpO1xyXG5cclxuXHRcdFx0bWV0YS5jb3VudCA9IG1lLmNvdW50VmlzaWJsZUVsZW1lbnRzKCk7XHJcblxyXG5cdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0gZGF0YXNldC5kYXRhLmxlbmd0aDsgaSA8IGlsZW47IGkrKykge1xyXG5cdFx0XHRcdHN0YXJ0c1tpXSA9IHN0YXJ0O1xyXG5cdFx0XHRcdGFuZ2xlID0gbWUuX2NvbXB1dGVBbmdsZShpKTtcclxuXHRcdFx0XHRhbmdsZXNbaV0gPSBhbmdsZTtcclxuXHRcdFx0XHRzdGFydCArPSBhbmdsZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aGVscGVycy5lYWNoKG1ldGEuZGF0YSwgZnVuY3Rpb24oYXJjLCBpbmRleCkge1xyXG5cdFx0XHRcdG1lLnVwZGF0ZUVsZW1lbnQoYXJjLCBpbmRleCwgcmVzZXQpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRfdXBkYXRlUmFkaXVzOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XHJcblx0XHRcdHZhciBjaGFydEFyZWEgPSBjaGFydC5jaGFydEFyZWE7XHJcblx0XHRcdHZhciBvcHRzID0gY2hhcnQub3B0aW9ucztcclxuXHRcdFx0dmFyIGFyY09wdHMgPSBvcHRzLmVsZW1lbnRzLmFyYztcclxuXHRcdFx0dmFyIG1pblNpemUgPSBNYXRoLm1pbihjaGFydEFyZWEucmlnaHQgLSBjaGFydEFyZWEubGVmdCwgY2hhcnRBcmVhLmJvdHRvbSAtIGNoYXJ0QXJlYS50b3ApO1xyXG5cclxuXHRcdFx0Y2hhcnQub3V0ZXJSYWRpdXMgPSBNYXRoLm1heCgobWluU2l6ZSAtIGFyY09wdHMuYm9yZGVyV2lkdGggLyAyKSAvIDIsIDApO1xyXG5cdFx0XHRjaGFydC5pbm5lclJhZGl1cyA9IE1hdGgubWF4KG9wdHMuY3V0b3V0UGVyY2VudGFnZSA/IChjaGFydC5vdXRlclJhZGl1cyAvIDEwMCkgKiAob3B0cy5jdXRvdXRQZXJjZW50YWdlKSA6IDEsIDApO1xyXG5cdFx0XHRjaGFydC5yYWRpdXNMZW5ndGggPSAoY2hhcnQub3V0ZXJSYWRpdXMgLSBjaGFydC5pbm5lclJhZGl1cykgLyBjaGFydC5nZXRWaXNpYmxlRGF0YXNldENvdW50KCk7XHJcblxyXG5cdFx0XHRtZS5vdXRlclJhZGl1cyA9IGNoYXJ0Lm91dGVyUmFkaXVzIC0gKGNoYXJ0LnJhZGl1c0xlbmd0aCAqIG1lLmluZGV4KTtcclxuXHRcdFx0bWUuaW5uZXJSYWRpdXMgPSBtZS5vdXRlclJhZGl1cyAtIGNoYXJ0LnJhZGl1c0xlbmd0aDtcclxuXHRcdH0sXHJcblxyXG5cdFx0dXBkYXRlRWxlbWVudDogZnVuY3Rpb24oYXJjLCBpbmRleCwgcmVzZXQpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XHJcblx0XHRcdHZhciBkYXRhc2V0ID0gbWUuZ2V0RGF0YXNldCgpO1xyXG5cdFx0XHR2YXIgb3B0cyA9IGNoYXJ0Lm9wdGlvbnM7XHJcblx0XHRcdHZhciBhbmltYXRpb25PcHRzID0gb3B0cy5hbmltYXRpb247XHJcblx0XHRcdHZhciBzY2FsZSA9IGNoYXJ0LnNjYWxlO1xyXG5cdFx0XHR2YXIgbGFiZWxzID0gY2hhcnQuZGF0YS5sYWJlbHM7XHJcblxyXG5cdFx0XHR2YXIgY2VudGVyWCA9IHNjYWxlLnhDZW50ZXI7XHJcblx0XHRcdHZhciBjZW50ZXJZID0gc2NhbGUueUNlbnRlcjtcclxuXHJcblx0XHRcdC8vIHZhciBuZWdIYWxmUEkgPSAtMC41ICogTWF0aC5QSTtcclxuXHRcdFx0dmFyIGRhdGFzZXRTdGFydEFuZ2xlID0gb3B0cy5zdGFydEFuZ2xlO1xyXG5cdFx0XHR2YXIgZGlzdGFuY2UgPSBhcmMuaGlkZGVuID8gMCA6IHNjYWxlLmdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKGRhdGFzZXQuZGF0YVtpbmRleF0pO1xyXG5cdFx0XHR2YXIgc3RhcnRBbmdsZSA9IG1lLl9zdGFydHNbaW5kZXhdO1xyXG5cdFx0XHR2YXIgZW5kQW5nbGUgPSBzdGFydEFuZ2xlICsgKGFyYy5oaWRkZW4gPyAwIDogbWUuX2FuZ2xlc1tpbmRleF0pO1xyXG5cclxuXHRcdFx0dmFyIHJlc2V0UmFkaXVzID0gYW5pbWF0aW9uT3B0cy5hbmltYXRlU2NhbGUgPyAwIDogc2NhbGUuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUoZGF0YXNldC5kYXRhW2luZGV4XSk7XHJcblxyXG5cdFx0XHRoZWxwZXJzLmV4dGVuZChhcmMsIHtcclxuXHRcdFx0XHQvLyBVdGlsaXR5XHJcblx0XHRcdFx0X2RhdGFzZXRJbmRleDogbWUuaW5kZXgsXHJcblx0XHRcdFx0X2luZGV4OiBpbmRleCxcclxuXHRcdFx0XHRfc2NhbGU6IHNjYWxlLFxyXG5cclxuXHRcdFx0XHQvLyBEZXNpcmVkIHZpZXcgcHJvcGVydGllc1xyXG5cdFx0XHRcdF9tb2RlbDoge1xyXG5cdFx0XHRcdFx0eDogY2VudGVyWCxcclxuXHRcdFx0XHRcdHk6IGNlbnRlclksXHJcblx0XHRcdFx0XHRpbm5lclJhZGl1czogMCxcclxuXHRcdFx0XHRcdG91dGVyUmFkaXVzOiByZXNldCA/IHJlc2V0UmFkaXVzIDogZGlzdGFuY2UsXHJcblx0XHRcdFx0XHRzdGFydEFuZ2xlOiByZXNldCAmJiBhbmltYXRpb25PcHRzLmFuaW1hdGVSb3RhdGUgPyBkYXRhc2V0U3RhcnRBbmdsZSA6IHN0YXJ0QW5nbGUsXHJcblx0XHRcdFx0XHRlbmRBbmdsZTogcmVzZXQgJiYgYW5pbWF0aW9uT3B0cy5hbmltYXRlUm90YXRlID8gZGF0YXNldFN0YXJ0QW5nbGUgOiBlbmRBbmdsZSxcclxuXHRcdFx0XHRcdGxhYmVsOiBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChsYWJlbHMsIGluZGV4LCBsYWJlbHNbaW5kZXhdKVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQvLyBBcHBseSBib3JkZXIgYW5kIGZpbGwgc3R5bGVcclxuXHRcdFx0dmFyIGVsZW1lbnRPcHRzID0gdGhpcy5jaGFydC5vcHRpb25zLmVsZW1lbnRzLmFyYztcclxuXHRcdFx0dmFyIGN1c3RvbSA9IGFyYy5jdXN0b20gfHwge307XHJcblx0XHRcdHZhciB2YWx1ZU9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0O1xyXG5cdFx0XHR2YXIgbW9kZWwgPSBhcmMuX21vZGVsO1xyXG5cclxuXHRcdFx0bW9kZWwuYmFja2dyb3VuZENvbG9yID0gY3VzdG9tLmJhY2tncm91bmRDb2xvciA/IGN1c3RvbS5iYWNrZ3JvdW5kQ29sb3IgOiB2YWx1ZU9yRGVmYXVsdChkYXRhc2V0LmJhY2tncm91bmRDb2xvciwgaW5kZXgsIGVsZW1lbnRPcHRzLmJhY2tncm91bmRDb2xvcik7XHJcblx0XHRcdG1vZGVsLmJvcmRlckNvbG9yID0gY3VzdG9tLmJvcmRlckNvbG9yID8gY3VzdG9tLmJvcmRlckNvbG9yIDogdmFsdWVPckRlZmF1bHQoZGF0YXNldC5ib3JkZXJDb2xvciwgaW5kZXgsIGVsZW1lbnRPcHRzLmJvcmRlckNvbG9yKTtcclxuXHRcdFx0bW9kZWwuYm9yZGVyV2lkdGggPSBjdXN0b20uYm9yZGVyV2lkdGggPyBjdXN0b20uYm9yZGVyV2lkdGggOiB2YWx1ZU9yRGVmYXVsdChkYXRhc2V0LmJvcmRlcldpZHRoLCBpbmRleCwgZWxlbWVudE9wdHMuYm9yZGVyV2lkdGgpO1xyXG5cclxuXHRcdFx0YXJjLnBpdm90KCk7XHJcblx0XHR9LFxyXG5cclxuXHRcdGNvdW50VmlzaWJsZUVsZW1lbnRzOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIGRhdGFzZXQgPSB0aGlzLmdldERhdGFzZXQoKTtcclxuXHRcdFx0dmFyIG1ldGEgPSB0aGlzLmdldE1ldGEoKTtcclxuXHRcdFx0dmFyIGNvdW50ID0gMDtcclxuXHJcblx0XHRcdGhlbHBlcnMuZWFjaChtZXRhLmRhdGEsIGZ1bmN0aW9uKGVsZW1lbnQsIGluZGV4KSB7XHJcblx0XHRcdFx0aWYgKCFpc05hTihkYXRhc2V0LmRhdGFbaW5kZXhdKSAmJiAhZWxlbWVudC5oaWRkZW4pIHtcclxuXHRcdFx0XHRcdGNvdW50Kys7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdHJldHVybiBjb3VudDtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRfY29tcHV0ZUFuZ2xlOiBmdW5jdGlvbihpbmRleCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgY291bnQgPSB0aGlzLmdldE1ldGEoKS5jb3VudDtcclxuXHRcdFx0dmFyIGRhdGFzZXQgPSBtZS5nZXREYXRhc2V0KCk7XHJcblx0XHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xyXG5cclxuXHRcdFx0aWYgKGlzTmFOKGRhdGFzZXQuZGF0YVtpbmRleF0pIHx8IG1ldGEuZGF0YVtpbmRleF0uaGlkZGVuKSB7XHJcblx0XHRcdFx0cmV0dXJuIDA7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIFNjcmlwdGFibGUgb3B0aW9uc1xyXG5cdFx0XHR2YXIgY29udGV4dCA9IHtcclxuXHRcdFx0XHRjaGFydDogbWUuY2hhcnQsXHJcblx0XHRcdFx0ZGF0YUluZGV4OiBpbmRleCxcclxuXHRcdFx0XHRkYXRhc2V0OiBkYXRhc2V0LFxyXG5cdFx0XHRcdGRhdGFzZXRJbmRleDogbWUuaW5kZXhcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdHJldHVybiBoZWxwZXJzLm9wdGlvbnMucmVzb2x2ZShbXHJcblx0XHRcdFx0bWUuY2hhcnQub3B0aW9ucy5lbGVtZW50cy5hcmMuYW5nbGUsXHJcblx0XHRcdFx0KDIgKiBNYXRoLlBJKSAvIGNvdW50XHJcblx0XHRcdF0sIGNvbnRleHQsIGluZGV4KTtcclxuXHRcdH1cclxuXHR9KTtcclxufTtcclxuXHJcbn0se1wiMjZcIjoyNixcIjQxXCI6NDEsXCI0NlwiOjQ2fV0sMjA6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcclxudmFyIGVsZW1lbnRzID0gcmVxdWlyZSg0MSk7XHJcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XHJcblxyXG5kZWZhdWx0cy5fc2V0KCdyYWRhcicsIHtcclxuXHRzY2FsZToge1xyXG5cdFx0dHlwZTogJ3JhZGlhbExpbmVhcidcclxuXHR9LFxyXG5cdGVsZW1lbnRzOiB7XHJcblx0XHRsaW5lOiB7XHJcblx0XHRcdHRlbnNpb246IDAgLy8gbm8gYmV6aWVyIGluIHJhZGFyXHJcblx0XHR9XHJcblx0fVxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcclxuXHJcblx0Q2hhcnQuY29udHJvbGxlcnMucmFkYXIgPSBDaGFydC5EYXRhc2V0Q29udHJvbGxlci5leHRlbmQoe1xyXG5cclxuXHRcdGRhdGFzZXRFbGVtZW50VHlwZTogZWxlbWVudHMuTGluZSxcclxuXHJcblx0XHRkYXRhRWxlbWVudFR5cGU6IGVsZW1lbnRzLlBvaW50LFxyXG5cclxuXHRcdGxpbmtTY2FsZXM6IGhlbHBlcnMubm9vcCxcclxuXHJcblx0XHR1cGRhdGU6IGZ1bmN0aW9uKHJlc2V0KSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xyXG5cdFx0XHR2YXIgbGluZSA9IG1ldGEuZGF0YXNldDtcclxuXHRcdFx0dmFyIHBvaW50cyA9IG1ldGEuZGF0YTtcclxuXHRcdFx0dmFyIGN1c3RvbSA9IGxpbmUuY3VzdG9tIHx8IHt9O1xyXG5cdFx0XHR2YXIgZGF0YXNldCA9IG1lLmdldERhdGFzZXQoKTtcclxuXHRcdFx0dmFyIGxpbmVFbGVtZW50T3B0aW9ucyA9IG1lLmNoYXJ0Lm9wdGlvbnMuZWxlbWVudHMubGluZTtcclxuXHRcdFx0dmFyIHNjYWxlID0gbWUuY2hhcnQuc2NhbGU7XHJcblxyXG5cdFx0XHQvLyBDb21wYXRpYmlsaXR5OiBJZiB0aGUgcHJvcGVydGllcyBhcmUgZGVmaW5lZCB3aXRoIG9ubHkgdGhlIG9sZCBuYW1lLCB1c2UgdGhvc2UgdmFsdWVzXHJcblx0XHRcdGlmICgoZGF0YXNldC50ZW5zaW9uICE9PSB1bmRlZmluZWQpICYmIChkYXRhc2V0LmxpbmVUZW5zaW9uID09PSB1bmRlZmluZWQpKSB7XHJcblx0XHRcdFx0ZGF0YXNldC5saW5lVGVuc2lvbiA9IGRhdGFzZXQudGVuc2lvbjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aGVscGVycy5leHRlbmQobWV0YS5kYXRhc2V0LCB7XHJcblx0XHRcdFx0Ly8gVXRpbGl0eVxyXG5cdFx0XHRcdF9kYXRhc2V0SW5kZXg6IG1lLmluZGV4LFxyXG5cdFx0XHRcdF9zY2FsZTogc2NhbGUsXHJcblx0XHRcdFx0Ly8gRGF0YVxyXG5cdFx0XHRcdF9jaGlsZHJlbjogcG9pbnRzLFxyXG5cdFx0XHRcdF9sb29wOiB0cnVlLFxyXG5cdFx0XHRcdC8vIE1vZGVsXHJcblx0XHRcdFx0X21vZGVsOiB7XHJcblx0XHRcdFx0XHQvLyBBcHBlYXJhbmNlXHJcblx0XHRcdFx0XHR0ZW5zaW9uOiBjdXN0b20udGVuc2lvbiA/IGN1c3RvbS50ZW5zaW9uIDogaGVscGVycy52YWx1ZU9yRGVmYXVsdChkYXRhc2V0LmxpbmVUZW5zaW9uLCBsaW5lRWxlbWVudE9wdGlvbnMudGVuc2lvbiksXHJcblx0XHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IGN1c3RvbS5iYWNrZ3JvdW5kQ29sb3IgPyBjdXN0b20uYmFja2dyb3VuZENvbG9yIDogKGRhdGFzZXQuYmFja2dyb3VuZENvbG9yIHx8IGxpbmVFbGVtZW50T3B0aW9ucy5iYWNrZ3JvdW5kQ29sb3IpLFxyXG5cdFx0XHRcdFx0Ym9yZGVyV2lkdGg6IGN1c3RvbS5ib3JkZXJXaWR0aCA/IGN1c3RvbS5ib3JkZXJXaWR0aCA6IChkYXRhc2V0LmJvcmRlcldpZHRoIHx8IGxpbmVFbGVtZW50T3B0aW9ucy5ib3JkZXJXaWR0aCksXHJcblx0XHRcdFx0XHRib3JkZXJDb2xvcjogY3VzdG9tLmJvcmRlckNvbG9yID8gY3VzdG9tLmJvcmRlckNvbG9yIDogKGRhdGFzZXQuYm9yZGVyQ29sb3IgfHwgbGluZUVsZW1lbnRPcHRpb25zLmJvcmRlckNvbG9yKSxcclxuXHRcdFx0XHRcdGZpbGw6IGN1c3RvbS5maWxsID8gY3VzdG9tLmZpbGwgOiAoZGF0YXNldC5maWxsICE9PSB1bmRlZmluZWQgPyBkYXRhc2V0LmZpbGwgOiBsaW5lRWxlbWVudE9wdGlvbnMuZmlsbCksXHJcblx0XHRcdFx0XHRib3JkZXJDYXBTdHlsZTogY3VzdG9tLmJvcmRlckNhcFN0eWxlID8gY3VzdG9tLmJvcmRlckNhcFN0eWxlIDogKGRhdGFzZXQuYm9yZGVyQ2FwU3R5bGUgfHwgbGluZUVsZW1lbnRPcHRpb25zLmJvcmRlckNhcFN0eWxlKSxcclxuXHRcdFx0XHRcdGJvcmRlckRhc2g6IGN1c3RvbS5ib3JkZXJEYXNoID8gY3VzdG9tLmJvcmRlckRhc2ggOiAoZGF0YXNldC5ib3JkZXJEYXNoIHx8IGxpbmVFbGVtZW50T3B0aW9ucy5ib3JkZXJEYXNoKSxcclxuXHRcdFx0XHRcdGJvcmRlckRhc2hPZmZzZXQ6IGN1c3RvbS5ib3JkZXJEYXNoT2Zmc2V0ID8gY3VzdG9tLmJvcmRlckRhc2hPZmZzZXQgOiAoZGF0YXNldC5ib3JkZXJEYXNoT2Zmc2V0IHx8IGxpbmVFbGVtZW50T3B0aW9ucy5ib3JkZXJEYXNoT2Zmc2V0KSxcclxuXHRcdFx0XHRcdGJvcmRlckpvaW5TdHlsZTogY3VzdG9tLmJvcmRlckpvaW5TdHlsZSA/IGN1c3RvbS5ib3JkZXJKb2luU3R5bGUgOiAoZGF0YXNldC5ib3JkZXJKb2luU3R5bGUgfHwgbGluZUVsZW1lbnRPcHRpb25zLmJvcmRlckpvaW5TdHlsZSksXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdG1ldGEuZGF0YXNldC5waXZvdCgpO1xyXG5cclxuXHRcdFx0Ly8gVXBkYXRlIFBvaW50c1xyXG5cdFx0XHRoZWxwZXJzLmVhY2gocG9pbnRzLCBmdW5jdGlvbihwb2ludCwgaW5kZXgpIHtcclxuXHRcdFx0XHRtZS51cGRhdGVFbGVtZW50KHBvaW50LCBpbmRleCwgcmVzZXQpO1xyXG5cdFx0XHR9LCBtZSk7XHJcblxyXG5cdFx0XHQvLyBVcGRhdGUgYmV6aWVyIGNvbnRyb2wgcG9pbnRzXHJcblx0XHRcdG1lLnVwZGF0ZUJlemllckNvbnRyb2xQb2ludHMoKTtcclxuXHRcdH0sXHJcblx0XHR1cGRhdGVFbGVtZW50OiBmdW5jdGlvbihwb2ludCwgaW5kZXgsIHJlc2V0KSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciBjdXN0b20gPSBwb2ludC5jdXN0b20gfHwge307XHJcblx0XHRcdHZhciBkYXRhc2V0ID0gbWUuZ2V0RGF0YXNldCgpO1xyXG5cdFx0XHR2YXIgc2NhbGUgPSBtZS5jaGFydC5zY2FsZTtcclxuXHRcdFx0dmFyIHBvaW50RWxlbWVudE9wdGlvbnMgPSBtZS5jaGFydC5vcHRpb25zLmVsZW1lbnRzLnBvaW50O1xyXG5cdFx0XHR2YXIgcG9pbnRQb3NpdGlvbiA9IHNjYWxlLmdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZShpbmRleCwgZGF0YXNldC5kYXRhW2luZGV4XSk7XHJcblxyXG5cdFx0XHQvLyBDb21wYXRpYmlsaXR5OiBJZiB0aGUgcHJvcGVydGllcyBhcmUgZGVmaW5lZCB3aXRoIG9ubHkgdGhlIG9sZCBuYW1lLCB1c2UgdGhvc2UgdmFsdWVzXHJcblx0XHRcdGlmICgoZGF0YXNldC5yYWRpdXMgIT09IHVuZGVmaW5lZCkgJiYgKGRhdGFzZXQucG9pbnRSYWRpdXMgPT09IHVuZGVmaW5lZCkpIHtcclxuXHRcdFx0XHRkYXRhc2V0LnBvaW50UmFkaXVzID0gZGF0YXNldC5yYWRpdXM7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKChkYXRhc2V0LmhpdFJhZGl1cyAhPT0gdW5kZWZpbmVkKSAmJiAoZGF0YXNldC5wb2ludEhpdFJhZGl1cyA9PT0gdW5kZWZpbmVkKSkge1xyXG5cdFx0XHRcdGRhdGFzZXQucG9pbnRIaXRSYWRpdXMgPSBkYXRhc2V0LmhpdFJhZGl1cztcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aGVscGVycy5leHRlbmQocG9pbnQsIHtcclxuXHRcdFx0XHQvLyBVdGlsaXR5XHJcblx0XHRcdFx0X2RhdGFzZXRJbmRleDogbWUuaW5kZXgsXHJcblx0XHRcdFx0X2luZGV4OiBpbmRleCxcclxuXHRcdFx0XHRfc2NhbGU6IHNjYWxlLFxyXG5cclxuXHRcdFx0XHQvLyBEZXNpcmVkIHZpZXcgcHJvcGVydGllc1xyXG5cdFx0XHRcdF9tb2RlbDoge1xyXG5cdFx0XHRcdFx0eDogcmVzZXQgPyBzY2FsZS54Q2VudGVyIDogcG9pbnRQb3NpdGlvbi54LCAvLyB2YWx1ZSBub3QgdXNlZCBpbiBkYXRhc2V0IHNjYWxlLCBidXQgd2Ugd2FudCBhIGNvbnNpc3RlbnQgQVBJIGJldHdlZW4gc2NhbGVzXHJcblx0XHRcdFx0XHR5OiByZXNldCA/IHNjYWxlLnlDZW50ZXIgOiBwb2ludFBvc2l0aW9uLnksXHJcblxyXG5cdFx0XHRcdFx0Ly8gQXBwZWFyYW5jZVxyXG5cdFx0XHRcdFx0dGVuc2lvbjogY3VzdG9tLnRlbnNpb24gPyBjdXN0b20udGVuc2lvbiA6IGhlbHBlcnMudmFsdWVPckRlZmF1bHQoZGF0YXNldC5saW5lVGVuc2lvbiwgbWUuY2hhcnQub3B0aW9ucy5lbGVtZW50cy5saW5lLnRlbnNpb24pLFxyXG5cdFx0XHRcdFx0cmFkaXVzOiBjdXN0b20ucmFkaXVzID8gY3VzdG9tLnJhZGl1cyA6IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRSYWRpdXMsIGluZGV4LCBwb2ludEVsZW1lbnRPcHRpb25zLnJhZGl1cyksXHJcblx0XHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IGN1c3RvbS5iYWNrZ3JvdW5kQ29sb3IgPyBjdXN0b20uYmFja2dyb3VuZENvbG9yIDogaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludEJhY2tncm91bmRDb2xvciwgaW5kZXgsIHBvaW50RWxlbWVudE9wdGlvbnMuYmFja2dyb3VuZENvbG9yKSxcclxuXHRcdFx0XHRcdGJvcmRlckNvbG9yOiBjdXN0b20uYm9yZGVyQ29sb3IgPyBjdXN0b20uYm9yZGVyQ29sb3IgOiBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LnBvaW50Qm9yZGVyQ29sb3IsIGluZGV4LCBwb2ludEVsZW1lbnRPcHRpb25zLmJvcmRlckNvbG9yKSxcclxuXHRcdFx0XHRcdGJvcmRlcldpZHRoOiBjdXN0b20uYm9yZGVyV2lkdGggPyBjdXN0b20uYm9yZGVyV2lkdGggOiBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LnBvaW50Qm9yZGVyV2lkdGgsIGluZGV4LCBwb2ludEVsZW1lbnRPcHRpb25zLmJvcmRlcldpZHRoKSxcclxuXHRcdFx0XHRcdHBvaW50U3R5bGU6IGN1c3RvbS5wb2ludFN0eWxlID8gY3VzdG9tLnBvaW50U3R5bGUgOiBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LnBvaW50U3R5bGUsIGluZGV4LCBwb2ludEVsZW1lbnRPcHRpb25zLnBvaW50U3R5bGUpLFxyXG5cdFx0XHRcdFx0cm90YXRpb246IGN1c3RvbS5yb3RhdGlvbiA/IGN1c3RvbS5yb3RhdGlvbiA6IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRSb3RhdGlvbiwgaW5kZXgsIHBvaW50RWxlbWVudE9wdGlvbnMucm90YXRpb24pLFxyXG5cclxuXHRcdFx0XHRcdC8vIFRvb2x0aXBcclxuXHRcdFx0XHRcdGhpdFJhZGl1czogY3VzdG9tLmhpdFJhZGl1cyA/IGN1c3RvbS5oaXRSYWRpdXMgOiBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChkYXRhc2V0LnBvaW50SGl0UmFkaXVzLCBpbmRleCwgcG9pbnRFbGVtZW50T3B0aW9ucy5oaXRSYWRpdXMpXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdHBvaW50Ll9tb2RlbC5za2lwID0gY3VzdG9tLnNraXAgPyBjdXN0b20uc2tpcCA6IChpc05hTihwb2ludC5fbW9kZWwueCkgfHwgaXNOYU4ocG9pbnQuX21vZGVsLnkpKTtcclxuXHRcdH0sXHJcblx0XHR1cGRhdGVCZXppZXJDb250cm9sUG9pbnRzOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIGNoYXJ0QXJlYSA9IHRoaXMuY2hhcnQuY2hhcnRBcmVhO1xyXG5cdFx0XHR2YXIgbWV0YSA9IHRoaXMuZ2V0TWV0YSgpO1xyXG5cclxuXHRcdFx0aGVscGVycy5lYWNoKG1ldGEuZGF0YSwgZnVuY3Rpb24ocG9pbnQsIGluZGV4KSB7XHJcblx0XHRcdFx0dmFyIG1vZGVsID0gcG9pbnQuX21vZGVsO1xyXG5cdFx0XHRcdHZhciBjb250cm9sUG9pbnRzID0gaGVscGVycy5zcGxpbmVDdXJ2ZShcclxuXHRcdFx0XHRcdGhlbHBlcnMucHJldmlvdXNJdGVtKG1ldGEuZGF0YSwgaW5kZXgsIHRydWUpLl9tb2RlbCxcclxuXHRcdFx0XHRcdG1vZGVsLFxyXG5cdFx0XHRcdFx0aGVscGVycy5uZXh0SXRlbShtZXRhLmRhdGEsIGluZGV4LCB0cnVlKS5fbW9kZWwsXHJcblx0XHRcdFx0XHRtb2RlbC50ZW5zaW9uXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdFx0Ly8gUHJldmVudCB0aGUgYmV6aWVyIGdvaW5nIG91dHNpZGUgb2YgdGhlIGJvdW5kcyBvZiB0aGUgZ3JhcGhcclxuXHRcdFx0XHRtb2RlbC5jb250cm9sUG9pbnRQcmV2aW91c1ggPSBNYXRoLm1heChNYXRoLm1pbihjb250cm9sUG9pbnRzLnByZXZpb3VzLngsIGNoYXJ0QXJlYS5yaWdodCksIGNoYXJ0QXJlYS5sZWZ0KTtcclxuXHRcdFx0XHRtb2RlbC5jb250cm9sUG9pbnRQcmV2aW91c1kgPSBNYXRoLm1heChNYXRoLm1pbihjb250cm9sUG9pbnRzLnByZXZpb3VzLnksIGNoYXJ0QXJlYS5ib3R0b20pLCBjaGFydEFyZWEudG9wKTtcclxuXHJcblx0XHRcdFx0bW9kZWwuY29udHJvbFBvaW50TmV4dFggPSBNYXRoLm1heChNYXRoLm1pbihjb250cm9sUG9pbnRzLm5leHQueCwgY2hhcnRBcmVhLnJpZ2h0KSwgY2hhcnRBcmVhLmxlZnQpO1xyXG5cdFx0XHRcdG1vZGVsLmNvbnRyb2xQb2ludE5leHRZID0gTWF0aC5tYXgoTWF0aC5taW4oY29udHJvbFBvaW50cy5uZXh0LnksIGNoYXJ0QXJlYS5ib3R0b20pLCBjaGFydEFyZWEudG9wKTtcclxuXHJcblx0XHRcdFx0Ly8gTm93IHBpdm90IHRoZSBwb2ludCBmb3IgYW5pbWF0aW9uXHJcblx0XHRcdFx0cG9pbnQucGl2b3QoKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9LFxyXG5cclxuXHRcdHNldEhvdmVyU3R5bGU6IGZ1bmN0aW9uKHBvaW50KSB7XHJcblx0XHRcdC8vIFBvaW50XHJcblx0XHRcdHZhciBkYXRhc2V0ID0gdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzW3BvaW50Ll9kYXRhc2V0SW5kZXhdO1xyXG5cdFx0XHR2YXIgY3VzdG9tID0gcG9pbnQuY3VzdG9tIHx8IHt9O1xyXG5cdFx0XHR2YXIgaW5kZXggPSBwb2ludC5faW5kZXg7XHJcblx0XHRcdHZhciBtb2RlbCA9IHBvaW50Ll9tb2RlbDtcclxuXHJcblx0XHRcdHBvaW50LiRwcmV2aW91c1N0eWxlID0ge1xyXG5cdFx0XHRcdGJhY2tncm91bmRDb2xvcjogbW9kZWwuYmFja2dyb3VuZENvbG9yLFxyXG5cdFx0XHRcdGJvcmRlckNvbG9yOiBtb2RlbC5ib3JkZXJDb2xvcixcclxuXHRcdFx0XHRib3JkZXJXaWR0aDogbW9kZWwuYm9yZGVyV2lkdGgsXHJcblx0XHRcdFx0cmFkaXVzOiBtb2RlbC5yYWRpdXNcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdG1vZGVsLnJhZGl1cyA9IGN1c3RvbS5ob3ZlclJhZGl1cyA/IGN1c3RvbS5ob3ZlclJhZGl1cyA6IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRIb3ZlclJhZGl1cywgaW5kZXgsIHRoaXMuY2hhcnQub3B0aW9ucy5lbGVtZW50cy5wb2ludC5ob3ZlclJhZGl1cyk7XHJcblx0XHRcdG1vZGVsLmJhY2tncm91bmRDb2xvciA9IGN1c3RvbS5ob3ZlckJhY2tncm91bmRDb2xvciA/IGN1c3RvbS5ob3ZlckJhY2tncm91bmRDb2xvciA6IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGRhdGFzZXQucG9pbnRIb3ZlckJhY2tncm91bmRDb2xvciwgaW5kZXgsIGhlbHBlcnMuZ2V0SG92ZXJDb2xvcihtb2RlbC5iYWNrZ3JvdW5kQ29sb3IpKTtcclxuXHRcdFx0bW9kZWwuYm9yZGVyQ29sb3IgPSBjdXN0b20uaG92ZXJCb3JkZXJDb2xvciA/IGN1c3RvbS5ob3ZlckJvcmRlckNvbG9yIDogaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludEhvdmVyQm9yZGVyQ29sb3IsIGluZGV4LCBoZWxwZXJzLmdldEhvdmVyQ29sb3IobW9kZWwuYm9yZGVyQ29sb3IpKTtcclxuXHRcdFx0bW9kZWwuYm9yZGVyV2lkdGggPSBjdXN0b20uaG92ZXJCb3JkZXJXaWR0aCA/IGN1c3RvbS5ob3ZlckJvcmRlcldpZHRoIDogaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZGF0YXNldC5wb2ludEhvdmVyQm9yZGVyV2lkdGgsIGluZGV4LCBtb2RlbC5ib3JkZXJXaWR0aCk7XHJcblx0XHR9LFxyXG5cdH0pO1xyXG59O1xyXG5cclxufSx7XCIyNlwiOjI2LFwiNDFcIjo0MSxcIjQ2XCI6NDZ9XSwyMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xyXG5cclxuZGVmYXVsdHMuX3NldCgnc2NhdHRlcicsIHtcclxuXHRob3Zlcjoge1xyXG5cdFx0bW9kZTogJ3NpbmdsZSdcclxuXHR9LFxyXG5cclxuXHRzY2FsZXM6IHtcclxuXHRcdHhBeGVzOiBbe1xyXG5cdFx0XHRpZDogJ3gtYXhpcy0xJywgICAgLy8gbmVlZCBhbiBJRCBzbyBkYXRhc2V0cyBjYW4gcmVmZXJlbmNlIHRoZSBzY2FsZVxyXG5cdFx0XHR0eXBlOiAnbGluZWFyJywgICAgLy8gc2NhdHRlciBzaG91bGQgbm90IHVzZSBhIGNhdGVnb3J5IGF4aXNcclxuXHRcdFx0cG9zaXRpb246ICdib3R0b20nXHJcblx0XHR9XSxcclxuXHRcdHlBeGVzOiBbe1xyXG5cdFx0XHRpZDogJ3ktYXhpcy0xJyxcclxuXHRcdFx0dHlwZTogJ2xpbmVhcicsXHJcblx0XHRcdHBvc2l0aW9uOiAnbGVmdCdcclxuXHRcdH1dXHJcblx0fSxcclxuXHJcblx0c2hvd0xpbmVzOiBmYWxzZSxcclxuXHJcblx0dG9vbHRpcHM6IHtcclxuXHRcdGNhbGxiYWNrczoge1xyXG5cdFx0XHR0aXRsZTogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0cmV0dXJuICcnOyAgICAgLy8gZG9lc24ndCBtYWtlIHNlbnNlIGZvciBzY2F0dGVyIHNpbmNlIGRhdGEgYXJlIGZvcm1hdHRlZCBhcyBhIHBvaW50XHJcblx0XHRcdH0sXHJcblx0XHRcdGxhYmVsOiBmdW5jdGlvbihpdGVtKSB7XHJcblx0XHRcdFx0cmV0dXJuICcoJyArIGl0ZW0ueExhYmVsICsgJywgJyArIGl0ZW0ueUxhYmVsICsgJyknO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcclxuXHJcblx0Ly8gU2NhdHRlciBjaGFydHMgdXNlIGxpbmUgY29udHJvbGxlcnNcclxuXHRDaGFydC5jb250cm9sbGVycy5zY2F0dGVyID0gQ2hhcnQuY29udHJvbGxlcnMubGluZTtcclxuXHJcbn07XHJcblxyXG59LHtcIjI2XCI6MjZ9XSwyMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBFbGVtZW50ID0gcmVxdWlyZSgyNyk7XHJcblxyXG52YXIgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gRWxlbWVudC5leHRlbmQoe1xyXG5cdGNoYXJ0OiBudWxsLCAvLyB0aGUgYW5pbWF0aW9uIGFzc29jaWF0ZWQgY2hhcnQgaW5zdGFuY2VcclxuXHRjdXJyZW50U3RlcDogMCwgLy8gdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHN0ZXBcclxuXHRudW1TdGVwczogNjAsIC8vIGRlZmF1bHQgbnVtYmVyIG9mIHN0ZXBzXHJcblx0ZWFzaW5nOiAnJywgLy8gdGhlIGVhc2luZyB0byB1c2UgZm9yIHRoaXMgYW5pbWF0aW9uXHJcblx0cmVuZGVyOiBudWxsLCAvLyByZW5kZXIgZnVuY3Rpb24gdXNlZCBieSB0aGUgYW5pbWF0aW9uIHNlcnZpY2VcclxuXHJcblx0b25BbmltYXRpb25Qcm9ncmVzczogbnVsbCwgLy8gdXNlciBzcGVjaWZpZWQgY2FsbGJhY2sgdG8gZmlyZSBvbiBlYWNoIHN0ZXAgb2YgdGhlIGFuaW1hdGlvblxyXG5cdG9uQW5pbWF0aW9uQ29tcGxldGU6IG51bGwsIC8vIHVzZXIgc3BlY2lmaWVkIGNhbGxiYWNrIHRvIGZpcmUgd2hlbiB0aGUgYW5pbWF0aW9uIGZpbmlzaGVzXHJcbn0pO1xyXG5cclxuLy8gREVQUkVDQVRJT05TXHJcblxyXG4vKipcclxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBDaGFydC5BbmltYXRpb24gaW5zdGVhZFxyXG4gKiBAcHJvcCBDaGFydC5BbmltYXRpb24jYW5pbWF0aW9uT2JqZWN0XHJcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi42LjBcclxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xyXG4gKi9cclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMucHJvdG90eXBlLCAnYW5pbWF0aW9uT2JqZWN0Jywge1xyXG5cdGdldDogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9XHJcbn0pO1xyXG5cclxuLyoqXHJcbiAqIFByb3ZpZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB1c2UgQ2hhcnQuQW5pbWF0aW9uI2NoYXJ0IGluc3RlYWRcclxuICogQHByb3AgQ2hhcnQuQW5pbWF0aW9uI2NoYXJ0SW5zdGFuY2VcclxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjYuMFxyXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXHJcbiAqL1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cy5wcm90b3R5cGUsICdjaGFydEluc3RhbmNlJywge1xyXG5cdGdldDogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5jaGFydDtcclxuXHR9LFxyXG5cdHNldDogZnVuY3Rpb24odmFsdWUpIHtcclxuXHRcdHRoaXMuY2hhcnQgPSB2YWx1ZTtcclxuXHR9XHJcbn0pO1xyXG5cclxufSx7XCIyN1wiOjI3fV0sMjM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xyXG4vKiBnbG9iYWwgd2luZG93OiBmYWxzZSAqL1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcclxudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcclxuXHJcbmRlZmF1bHRzLl9zZXQoJ2dsb2JhbCcsIHtcclxuXHRhbmltYXRpb246IHtcclxuXHRcdGR1cmF0aW9uOiAxMDAwLFxyXG5cdFx0ZWFzaW5nOiAnZWFzZU91dFF1YXJ0JyxcclxuXHRcdG9uUHJvZ3Jlc3M6IGhlbHBlcnMubm9vcCxcclxuXHRcdG9uQ29tcGxldGU6IGhlbHBlcnMubm9vcFxyXG5cdH1cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHRmcmFtZUR1cmF0aW9uOiAxNyxcclxuXHRhbmltYXRpb25zOiBbXSxcclxuXHRkcm9wRnJhbWVzOiAwLFxyXG5cdHJlcXVlc3Q6IG51bGwsXHJcblxyXG5cdC8qKlxyXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gVGhlIGNoYXJ0IHRvIGFuaW1hdGUuXHJcblx0ICogQHBhcmFtIHtDaGFydC5BbmltYXRpb259IGFuaW1hdGlvbiAtIFRoZSBhbmltYXRpb24gdGhhdCB3ZSB3aWxsIGFuaW1hdGUuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGR1cmF0aW9uIC0gVGhlIGFuaW1hdGlvbiBkdXJhdGlvbiBpbiBtcy5cclxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IGxhenkgLSBpZiB0cnVlLCB0aGUgY2hhcnQgaXMgbm90IG1hcmtlZCBhcyBhbmltYXRpbmcgdG8gZW5hYmxlIG1vcmUgcmVzcG9uc2l2ZSBpbnRlcmFjdGlvbnNcclxuXHQgKi9cclxuXHRhZGRBbmltYXRpb246IGZ1bmN0aW9uKGNoYXJ0LCBhbmltYXRpb24sIGR1cmF0aW9uLCBsYXp5KSB7XHJcblx0XHR2YXIgYW5pbWF0aW9ucyA9IHRoaXMuYW5pbWF0aW9ucztcclxuXHRcdHZhciBpLCBpbGVuO1xyXG5cclxuXHRcdGFuaW1hdGlvbi5jaGFydCA9IGNoYXJ0O1xyXG5cclxuXHRcdGlmICghbGF6eSkge1xyXG5cdFx0XHRjaGFydC5hbmltYXRpbmcgPSB0cnVlO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoaSA9IDAsIGlsZW4gPSBhbmltYXRpb25zLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xyXG5cdFx0XHRpZiAoYW5pbWF0aW9uc1tpXS5jaGFydCA9PT0gY2hhcnQpIHtcclxuXHRcdFx0XHRhbmltYXRpb25zW2ldID0gYW5pbWF0aW9uO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGFuaW1hdGlvbnMucHVzaChhbmltYXRpb24pO1xyXG5cclxuXHRcdC8vIElmIHRoZXJlIGFyZSBubyBhbmltYXRpb25zIHF1ZXVlZCwgbWFudWFsbHkga2lja3N0YXJ0IGEgZGlnZXN0LCBmb3IgbGFjayBvZiBhIGJldHRlciB3b3JkXHJcblx0XHRpZiAoYW5pbWF0aW9ucy5sZW5ndGggPT09IDEpIHtcclxuXHRcdFx0dGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRjYW5jZWxBbmltYXRpb246IGZ1bmN0aW9uKGNoYXJ0KSB7XHJcblx0XHR2YXIgaW5kZXggPSBoZWxwZXJzLmZpbmRJbmRleCh0aGlzLmFuaW1hdGlvbnMsIGZ1bmN0aW9uKGFuaW1hdGlvbikge1xyXG5cdFx0XHRyZXR1cm4gYW5pbWF0aW9uLmNoYXJ0ID09PSBjaGFydDtcclxuXHRcdH0pO1xyXG5cclxuXHRcdGlmIChpbmRleCAhPT0gLTEpIHtcclxuXHRcdFx0dGhpcy5hbmltYXRpb25zLnNwbGljZShpbmRleCwgMSk7XHJcblx0XHRcdGNoYXJ0LmFuaW1hdGluZyA9IGZhbHNlO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdHJlcXVlc3RBbmltYXRpb25GcmFtZTogZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0aWYgKG1lLnJlcXVlc3QgPT09IG51bGwpIHtcclxuXHRcdFx0Ly8gU2tpcCBhbmltYXRpb24gZnJhbWUgcmVxdWVzdHMgdW50aWwgdGhlIGFjdGl2ZSBvbmUgaXMgZXhlY3V0ZWQuXHJcblx0XHRcdC8vIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHByb2Nlc3NpbmcgbW91c2UgZXZlbnRzLCBlLmcuICdtb3VzZW1vdmUnXHJcblx0XHRcdC8vIGFuZCAnbW91c2VvdXQnIGV2ZW50cyB3aWxsIHRyaWdnZXIgbXVsdGlwbGUgcmVuZGVycy5cclxuXHRcdFx0bWUucmVxdWVzdCA9IGhlbHBlcnMucmVxdWVzdEFuaW1GcmFtZS5jYWxsKHdpbmRvdywgZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0bWUucmVxdWVzdCA9IG51bGw7XHJcblx0XHRcdFx0bWUuc3RhcnREaWdlc3QoKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKi9cclxuXHRzdGFydERpZ2VzdDogZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0dmFyIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XHJcblx0XHR2YXIgZnJhbWVzVG9Ecm9wID0gMDtcclxuXHJcblx0XHRpZiAobWUuZHJvcEZyYW1lcyA+IDEpIHtcclxuXHRcdFx0ZnJhbWVzVG9Ecm9wID0gTWF0aC5mbG9vcihtZS5kcm9wRnJhbWVzKTtcclxuXHRcdFx0bWUuZHJvcEZyYW1lcyA9IG1lLmRyb3BGcmFtZXMgJSAxO1xyXG5cdFx0fVxyXG5cclxuXHRcdG1lLmFkdmFuY2UoMSArIGZyYW1lc1RvRHJvcCk7XHJcblxyXG5cdFx0dmFyIGVuZFRpbWUgPSBEYXRlLm5vdygpO1xyXG5cclxuXHRcdG1lLmRyb3BGcmFtZXMgKz0gKGVuZFRpbWUgLSBzdGFydFRpbWUpIC8gbWUuZnJhbWVEdXJhdGlvbjtcclxuXHJcblx0XHQvLyBEbyB3ZSBoYXZlIG1vcmUgc3R1ZmYgdG8gYW5pbWF0ZT9cclxuXHRcdGlmIChtZS5hbmltYXRpb25zLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0bWUucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKi9cclxuXHRhZHZhbmNlOiBmdW5jdGlvbihjb3VudCkge1xyXG5cdFx0dmFyIGFuaW1hdGlvbnMgPSB0aGlzLmFuaW1hdGlvbnM7XHJcblx0XHR2YXIgYW5pbWF0aW9uLCBjaGFydDtcclxuXHRcdHZhciBpID0gMDtcclxuXHJcblx0XHR3aGlsZSAoaSA8IGFuaW1hdGlvbnMubGVuZ3RoKSB7XHJcblx0XHRcdGFuaW1hdGlvbiA9IGFuaW1hdGlvbnNbaV07XHJcblx0XHRcdGNoYXJ0ID0gYW5pbWF0aW9uLmNoYXJ0O1xyXG5cclxuXHRcdFx0YW5pbWF0aW9uLmN1cnJlbnRTdGVwID0gKGFuaW1hdGlvbi5jdXJyZW50U3RlcCB8fCAwKSArIGNvdW50O1xyXG5cdFx0XHRhbmltYXRpb24uY3VycmVudFN0ZXAgPSBNYXRoLm1pbihhbmltYXRpb24uY3VycmVudFN0ZXAsIGFuaW1hdGlvbi5udW1TdGVwcyk7XHJcblxyXG5cdFx0XHRoZWxwZXJzLmNhbGxiYWNrKGFuaW1hdGlvbi5yZW5kZXIsIFtjaGFydCwgYW5pbWF0aW9uXSwgY2hhcnQpO1xyXG5cdFx0XHRoZWxwZXJzLmNhbGxiYWNrKGFuaW1hdGlvbi5vbkFuaW1hdGlvblByb2dyZXNzLCBbYW5pbWF0aW9uXSwgY2hhcnQpO1xyXG5cclxuXHRcdFx0aWYgKGFuaW1hdGlvbi5jdXJyZW50U3RlcCA+PSBhbmltYXRpb24ubnVtU3RlcHMpIHtcclxuXHRcdFx0XHRoZWxwZXJzLmNhbGxiYWNrKGFuaW1hdGlvbi5vbkFuaW1hdGlvbkNvbXBsZXRlLCBbYW5pbWF0aW9uXSwgY2hhcnQpO1xyXG5cdFx0XHRcdGNoYXJ0LmFuaW1hdGluZyA9IGZhbHNlO1xyXG5cdFx0XHRcdGFuaW1hdGlvbnMuc3BsaWNlKGksIDEpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdCsraTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxufTtcclxuXHJcbn0se1wiMjZcIjoyNixcIjQ2XCI6NDZ9XSwyNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBBbmltYXRpb24gPSByZXF1aXJlKDIyKTtcclxudmFyIGFuaW1hdGlvbnMgPSByZXF1aXJlKDIzKTtcclxudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgyNik7XHJcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XHJcbnZhciBJbnRlcmFjdGlvbiA9IHJlcXVpcmUoMjkpO1xyXG52YXIgbGF5b3V0cyA9IHJlcXVpcmUoMzEpO1xyXG52YXIgcGxhdGZvcm0gPSByZXF1aXJlKDQ5KTtcclxudmFyIHBsdWdpbnMgPSByZXF1aXJlKDMyKTtcclxudmFyIHNjYWxlU2VydmljZSA9IHJlcXVpcmUoMzQpO1xyXG52YXIgVG9vbHRpcCA9IHJlcXVpcmUoMzYpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDaGFydCkge1xyXG5cclxuXHQvLyBDcmVhdGUgYSBkaWN0aW9uYXJ5IG9mIGNoYXJ0IHR5cGVzLCB0byBhbGxvdyBmb3IgZXh0ZW5zaW9uIG9mIGV4aXN0aW5nIHR5cGVzXHJcblx0Q2hhcnQudHlwZXMgPSB7fTtcclxuXHJcblx0Ly8gU3RvcmUgYSByZWZlcmVuY2UgdG8gZWFjaCBpbnN0YW5jZSAtIGFsbG93aW5nIHVzIHRvIGdsb2JhbGx5IHJlc2l6ZSBjaGFydCBpbnN0YW5jZXMgb24gd2luZG93IHJlc2l6ZS5cclxuXHQvLyBEZXN0cm95IG1ldGhvZCBvbiB0aGUgY2hhcnQgd2lsbCByZW1vdmUgdGhlIGluc3RhbmNlIG9mIHRoZSBjaGFydCBmcm9tIHRoaXMgcmVmZXJlbmNlLlxyXG5cdENoYXJ0Lmluc3RhbmNlcyA9IHt9O1xyXG5cclxuXHQvLyBDb250cm9sbGVycyBhdmFpbGFibGUgZm9yIGRhdGFzZXQgdmlzdWFsaXphdGlvbiBlZy4gYmFyLCBsaW5lLCBzbGljZSwgZXRjLlxyXG5cdENoYXJ0LmNvbnRyb2xsZXJzID0ge307XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluaXRpYWxpemVzIHRoZSBnaXZlbiBjb25maWcgd2l0aCBnbG9iYWwgYW5kIGNoYXJ0IGRlZmF1bHQgdmFsdWVzLlxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIGluaXRDb25maWcoY29uZmlnKSB7XHJcblx0XHRjb25maWcgPSBjb25maWcgfHwge307XHJcblxyXG5cdFx0Ly8gRG8gTk9UIHVzZSBjb25maWdNZXJnZSgpIGZvciB0aGUgZGF0YSBvYmplY3QgYmVjYXVzZSB0aGlzIG1ldGhvZCBtZXJnZXMgYXJyYXlzXHJcblx0XHQvLyBhbmQgc28gd291bGQgY2hhbmdlIHJlZmVyZW5jZXMgdG8gbGFiZWxzIGFuZCBkYXRhc2V0cywgcHJldmVudGluZyBkYXRhIHVwZGF0ZXMuXHJcblx0XHR2YXIgZGF0YSA9IGNvbmZpZy5kYXRhID0gY29uZmlnLmRhdGEgfHwge307XHJcblx0XHRkYXRhLmRhdGFzZXRzID0gZGF0YS5kYXRhc2V0cyB8fCBbXTtcclxuXHRcdGRhdGEubGFiZWxzID0gZGF0YS5sYWJlbHMgfHwgW107XHJcblxyXG5cdFx0Y29uZmlnLm9wdGlvbnMgPSBoZWxwZXJzLmNvbmZpZ01lcmdlKFxyXG5cdFx0XHRkZWZhdWx0cy5nbG9iYWwsXHJcblx0XHRcdGRlZmF1bHRzW2NvbmZpZy50eXBlXSxcclxuXHRcdFx0Y29uZmlnLm9wdGlvbnMgfHwge30pO1xyXG5cclxuXHRcdHJldHVybiBjb25maWc7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBjb25maWcgb2YgdGhlIGNoYXJ0XHJcblx0ICogQHBhcmFtIGNoYXJ0IHtDaGFydH0gY2hhcnQgdG8gdXBkYXRlIHRoZSBvcHRpb25zIGZvclxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIHVwZGF0ZUNvbmZpZyhjaGFydCkge1xyXG5cdFx0dmFyIG5ld09wdGlvbnMgPSBjaGFydC5vcHRpb25zO1xyXG5cclxuXHRcdGhlbHBlcnMuZWFjaChjaGFydC5zY2FsZXMsIGZ1bmN0aW9uKHNjYWxlKSB7XHJcblx0XHRcdGxheW91dHMucmVtb3ZlQm94KGNoYXJ0LCBzY2FsZSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRuZXdPcHRpb25zID0gaGVscGVycy5jb25maWdNZXJnZShcclxuXHRcdFx0Q2hhcnQuZGVmYXVsdHMuZ2xvYmFsLFxyXG5cdFx0XHRDaGFydC5kZWZhdWx0c1tjaGFydC5jb25maWcudHlwZV0sXHJcblx0XHRcdG5ld09wdGlvbnMpO1xyXG5cclxuXHRcdGNoYXJ0Lm9wdGlvbnMgPSBjaGFydC5jb25maWcub3B0aW9ucyA9IG5ld09wdGlvbnM7XHJcblx0XHRjaGFydC5lbnN1cmVTY2FsZXNIYXZlSURzKCk7XHJcblx0XHRjaGFydC5idWlsZE9yVXBkYXRlU2NhbGVzKCk7XHJcblx0XHQvLyBUb29sdGlwXHJcblx0XHRjaGFydC50b29sdGlwLl9vcHRpb25zID0gbmV3T3B0aW9ucy50b29sdGlwcztcclxuXHRcdGNoYXJ0LnRvb2x0aXAuaW5pdGlhbGl6ZSgpO1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gcG9zaXRpb25Jc0hvcml6b250YWwocG9zaXRpb24pIHtcclxuXHRcdHJldHVybiBwb3NpdGlvbiA9PT0gJ3RvcCcgfHwgcG9zaXRpb24gPT09ICdib3R0b20nO1xyXG5cdH1cclxuXHJcblx0aGVscGVycy5leHRlbmQoQ2hhcnQucHJvdG90eXBlLCAvKiogQGxlbmRzIENoYXJ0ICovIHtcclxuXHRcdC8qKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cdFx0Y29uc3RydWN0OiBmdW5jdGlvbihpdGVtLCBjb25maWcpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHJcblx0XHRcdGNvbmZpZyA9IGluaXRDb25maWcoY29uZmlnKTtcclxuXHJcblx0XHRcdHZhciBjb250ZXh0ID0gcGxhdGZvcm0uYWNxdWlyZUNvbnRleHQoaXRlbSwgY29uZmlnKTtcclxuXHRcdFx0dmFyIGNhbnZhcyA9IGNvbnRleHQgJiYgY29udGV4dC5jYW52YXM7XHJcblx0XHRcdHZhciBoZWlnaHQgPSBjYW52YXMgJiYgY2FudmFzLmhlaWdodDtcclxuXHRcdFx0dmFyIHdpZHRoID0gY2FudmFzICYmIGNhbnZhcy53aWR0aDtcclxuXHJcblx0XHRcdG1lLmlkID0gaGVscGVycy51aWQoKTtcclxuXHRcdFx0bWUuY3R4ID0gY29udGV4dDtcclxuXHRcdFx0bWUuY2FudmFzID0gY2FudmFzO1xyXG5cdFx0XHRtZS5jb25maWcgPSBjb25maWc7XHJcblx0XHRcdG1lLndpZHRoID0gd2lkdGg7XHJcblx0XHRcdG1lLmhlaWdodCA9IGhlaWdodDtcclxuXHRcdFx0bWUuYXNwZWN0UmF0aW8gPSBoZWlnaHQgPyB3aWR0aCAvIGhlaWdodCA6IG51bGw7XHJcblx0XHRcdG1lLm9wdGlvbnMgPSBjb25maWcub3B0aW9ucztcclxuXHRcdFx0bWUuX2J1ZmZlcmVkUmVuZGVyID0gZmFsc2U7XHJcblxyXG5cdFx0XHQvKipcclxuXHRcdFx0ICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIENoYXJ0IGFuZCBDaGFydC5Db250cm9sbGVyIGhhdmUgYmVlbiBtZXJnZWQsXHJcblx0XHRcdCAqIHRoZSBcImluc3RhbmNlXCIgc3RpbGwgbmVlZCB0byBiZSBkZWZpbmVkIHNpbmNlIGl0IG1pZ2h0IGJlIGNhbGxlZCBmcm9tIHBsdWdpbnMuXHJcblx0XHRcdCAqIEBwcm9wIENoYXJ0I2NoYXJ0XHJcblx0XHRcdCAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi42LjBcclxuXHRcdFx0ICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xyXG5cdFx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0XHQgKi9cclxuXHRcdFx0bWUuY2hhcnQgPSBtZTtcclxuXHRcdFx0bWUuY29udHJvbGxlciA9IG1lOyAvLyBjaGFydC5jaGFydC5jb250cm9sbGVyICNpbmNlcHRpb25cclxuXHJcblx0XHRcdC8vIEFkZCB0aGUgY2hhcnQgaW5zdGFuY2UgdG8gdGhlIGdsb2JhbCBuYW1lc3BhY2VcclxuXHRcdFx0Q2hhcnQuaW5zdGFuY2VzW21lLmlkXSA9IG1lO1xyXG5cclxuXHRcdFx0Ly8gRGVmaW5lIGFsaWFzIHRvIHRoZSBjb25maWcgZGF0YTogYGNoYXJ0LmRhdGEgPT09IGNoYXJ0LmNvbmZpZy5kYXRhYFxyXG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobWUsICdkYXRhJywge1xyXG5cdFx0XHRcdGdldDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gbWUuY29uZmlnLmRhdGE7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XHJcblx0XHRcdFx0XHRtZS5jb25maWcuZGF0YSA9IHZhbHVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRpZiAoIWNvbnRleHQgfHwgIWNhbnZhcykge1xyXG5cdFx0XHRcdC8vIFRoZSBnaXZlbiBpdGVtIGlzIG5vdCBhIGNvbXBhdGlibGUgY29udGV4dDJkIGVsZW1lbnQsIGxldCdzIHJldHVybiBiZWZvcmUgZmluYWxpemluZ1xyXG5cdFx0XHRcdC8vIHRoZSBjaGFydCBpbml0aWFsaXphdGlvbiBidXQgYWZ0ZXIgc2V0dGluZyBiYXNpYyBjaGFydCAvIGNvbnRyb2xsZXIgcHJvcGVydGllcyB0aGF0XHJcblx0XHRcdFx0Ly8gY2FuIGhlbHAgdG8gZmlndXJlIG91dCB0aGF0IHRoZSBjaGFydCBpcyBub3QgdmFsaWQgKGUuZyBjaGFydC5jYW52YXMgIT09IG51bGwpO1xyXG5cdFx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy8yODA3XHJcblx0XHRcdFx0Y29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBjcmVhdGUgY2hhcnQ6IGNhbid0IGFjcXVpcmUgY29udGV4dCBmcm9tIHRoZSBnaXZlbiBpdGVtXCIpO1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bWUuaW5pdGlhbGl6ZSgpO1xyXG5cdFx0XHRtZS51cGRhdGUoKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHJcblx0XHRcdC8vIEJlZm9yZSBpbml0IHBsdWdpbiBub3RpZmljYXRpb25cclxuXHRcdFx0cGx1Z2lucy5ub3RpZnkobWUsICdiZWZvcmVJbml0Jyk7XHJcblxyXG5cdFx0XHRoZWxwZXJzLnJldGluYVNjYWxlKG1lLCBtZS5vcHRpb25zLmRldmljZVBpeGVsUmF0aW8pO1xyXG5cclxuXHRcdFx0bWUuYmluZEV2ZW50cygpO1xyXG5cclxuXHRcdFx0aWYgKG1lLm9wdGlvbnMucmVzcG9uc2l2ZSkge1xyXG5cdFx0XHRcdC8vIEluaXRpYWwgcmVzaXplIGJlZm9yZSBjaGFydCBkcmF3cyAobXVzdCBiZSBzaWxlbnQgdG8gcHJlc2VydmUgaW5pdGlhbCBhbmltYXRpb25zKS5cclxuXHRcdFx0XHRtZS5yZXNpemUodHJ1ZSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIE1ha2Ugc3VyZSBzY2FsZXMgaGF2ZSBJRHMgYW5kIGFyZSBidWlsdCBiZWZvcmUgd2UgYnVpbGQgYW55IGNvbnRyb2xsZXJzLlxyXG5cdFx0XHRtZS5lbnN1cmVTY2FsZXNIYXZlSURzKCk7XHJcblx0XHRcdG1lLmJ1aWxkT3JVcGRhdGVTY2FsZXMoKTtcclxuXHRcdFx0bWUuaW5pdFRvb2xUaXAoKTtcclxuXHJcblx0XHRcdC8vIEFmdGVyIGluaXQgcGx1Z2luIG5vdGlmaWNhdGlvblxyXG5cdFx0XHRwbHVnaW5zLm5vdGlmeShtZSwgJ2FmdGVySW5pdCcpO1xyXG5cclxuXHRcdFx0cmV0dXJuIG1lO1xyXG5cdFx0fSxcclxuXHJcblx0XHRjbGVhcjogZnVuY3Rpb24oKSB7XHJcblx0XHRcdGhlbHBlcnMuY2FudmFzLmNsZWFyKHRoaXMpO1xyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdH0sXHJcblxyXG5cdFx0c3RvcDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdC8vIFN0b3BzIGFueSBjdXJyZW50IGFuaW1hdGlvbiBsb29wIG9jY3VycmluZ1xyXG5cdFx0XHRhbmltYXRpb25zLmNhbmNlbEFuaW1hdGlvbih0aGlzKTtcclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblx0XHR9LFxyXG5cclxuXHRcdHJlc2l6ZTogZnVuY3Rpb24oc2lsZW50KSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciBvcHRpb25zID0gbWUub3B0aW9ucztcclxuXHRcdFx0dmFyIGNhbnZhcyA9IG1lLmNhbnZhcztcclxuXHRcdFx0dmFyIGFzcGVjdFJhdGlvID0gKG9wdGlvbnMubWFpbnRhaW5Bc3BlY3RSYXRpbyAmJiBtZS5hc3BlY3RSYXRpbykgfHwgbnVsbDtcclxuXHJcblx0XHRcdC8vIHRoZSBjYW52YXMgcmVuZGVyIHdpZHRoIGFuZCBoZWlnaHQgd2lsbCBiZSBjYXN0ZWQgdG8gaW50ZWdlcnMgc28gbWFrZSBzdXJlIHRoYXRcclxuXHRcdFx0Ly8gdGhlIGNhbnZhcyBkaXNwbGF5IHN0eWxlIHVzZXMgdGhlIHNhbWUgaW50ZWdlciB2YWx1ZXMgdG8gYXZvaWQgYmx1cnJpbmcgZWZmZWN0LlxyXG5cclxuXHRcdFx0Ly8gU2V0IHRvIDAgaW5zdGVhZCBvZiBjYW52YXMuc2l6ZSBiZWNhdXNlIHRoZSBzaXplIGRlZmF1bHRzIHRvIDMwMHgxNTAgaWYgdGhlIGVsZW1lbnQgaXMgY29sbGFwc2VkXHJcblx0XHRcdHZhciBuZXdXaWR0aCA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoaGVscGVycy5nZXRNYXhpbXVtV2lkdGgoY2FudmFzKSkpO1xyXG5cdFx0XHR2YXIgbmV3SGVpZ2h0ID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihhc3BlY3RSYXRpbyA/IG5ld1dpZHRoIC8gYXNwZWN0UmF0aW8gOiBoZWxwZXJzLmdldE1heGltdW1IZWlnaHQoY2FudmFzKSkpO1xyXG5cclxuXHRcdFx0aWYgKG1lLndpZHRoID09PSBuZXdXaWR0aCAmJiBtZS5oZWlnaHQgPT09IG5ld0hlaWdodCkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y2FudmFzLndpZHRoID0gbWUud2lkdGggPSBuZXdXaWR0aDtcclxuXHRcdFx0Y2FudmFzLmhlaWdodCA9IG1lLmhlaWdodCA9IG5ld0hlaWdodDtcclxuXHRcdFx0Y2FudmFzLnN0eWxlLndpZHRoID0gbmV3V2lkdGggKyAncHgnO1xyXG5cdFx0XHRjYW52YXMuc3R5bGUuaGVpZ2h0ID0gbmV3SGVpZ2h0ICsgJ3B4JztcclxuXHJcblx0XHRcdGhlbHBlcnMucmV0aW5hU2NhbGUobWUsIG9wdGlvbnMuZGV2aWNlUGl4ZWxSYXRpbyk7XHJcblxyXG5cdFx0XHRpZiAoIXNpbGVudCkge1xyXG5cdFx0XHRcdC8vIE5vdGlmeSBhbnkgcGx1Z2lucyBhYm91dCB0aGUgcmVzaXplXHJcblx0XHRcdFx0dmFyIG5ld1NpemUgPSB7d2lkdGg6IG5ld1dpZHRoLCBoZWlnaHQ6IG5ld0hlaWdodH07XHJcblx0XHRcdFx0cGx1Z2lucy5ub3RpZnkobWUsICdyZXNpemUnLCBbbmV3U2l6ZV0pO1xyXG5cclxuXHRcdFx0XHQvLyBOb3RpZnkgb2YgcmVzaXplXHJcblx0XHRcdFx0aWYgKG1lLm9wdGlvbnMub25SZXNpemUpIHtcclxuXHRcdFx0XHRcdG1lLm9wdGlvbnMub25SZXNpemUobWUsIG5ld1NpemUpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0bWUuc3RvcCgpO1xyXG5cdFx0XHRcdG1lLnVwZGF0ZSh7XHJcblx0XHRcdFx0XHRkdXJhdGlvbjogbWUub3B0aW9ucy5yZXNwb25zaXZlQW5pbWF0aW9uRHVyYXRpb25cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHJcblx0XHRlbnN1cmVTY2FsZXNIYXZlSURzOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XHJcblx0XHRcdHZhciBzY2FsZXNPcHRpb25zID0gb3B0aW9ucy5zY2FsZXMgfHwge307XHJcblx0XHRcdHZhciBzY2FsZU9wdGlvbnMgPSBvcHRpb25zLnNjYWxlO1xyXG5cclxuXHRcdFx0aGVscGVycy5lYWNoKHNjYWxlc09wdGlvbnMueEF4ZXMsIGZ1bmN0aW9uKHhBeGlzT3B0aW9ucywgaW5kZXgpIHtcclxuXHRcdFx0XHR4QXhpc09wdGlvbnMuaWQgPSB4QXhpc09wdGlvbnMuaWQgfHwgKCd4LWF4aXMtJyArIGluZGV4KTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRoZWxwZXJzLmVhY2goc2NhbGVzT3B0aW9ucy55QXhlcywgZnVuY3Rpb24oeUF4aXNPcHRpb25zLCBpbmRleCkge1xyXG5cdFx0XHRcdHlBeGlzT3B0aW9ucy5pZCA9IHlBeGlzT3B0aW9ucy5pZCB8fCAoJ3ktYXhpcy0nICsgaW5kZXgpO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdGlmIChzY2FsZU9wdGlvbnMpIHtcclxuXHRcdFx0XHRzY2FsZU9wdGlvbnMuaWQgPSBzY2FsZU9wdGlvbnMuaWQgfHwgJ3NjYWxlJztcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEJ1aWxkcyBhIG1hcCBvZiBzY2FsZSBJRCB0byBzY2FsZSBvYmplY3QgZm9yIGZ1dHVyZSBsb29rdXAuXHJcblx0XHQgKi9cclxuXHRcdGJ1aWxkT3JVcGRhdGVTY2FsZXM6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgb3B0aW9ucyA9IG1lLm9wdGlvbnM7XHJcblx0XHRcdHZhciBzY2FsZXMgPSBtZS5zY2FsZXMgfHwge307XHJcblx0XHRcdHZhciBpdGVtcyA9IFtdO1xyXG5cdFx0XHR2YXIgdXBkYXRlZCA9IE9iamVjdC5rZXlzKHNjYWxlcykucmVkdWNlKGZ1bmN0aW9uKG9iaiwgaWQpIHtcclxuXHRcdFx0XHRvYmpbaWRdID0gZmFsc2U7XHJcblx0XHRcdFx0cmV0dXJuIG9iajtcclxuXHRcdFx0fSwge30pO1xyXG5cclxuXHRcdFx0aWYgKG9wdGlvbnMuc2NhbGVzKSB7XHJcblx0XHRcdFx0aXRlbXMgPSBpdGVtcy5jb25jYXQoXHJcblx0XHRcdFx0XHQob3B0aW9ucy5zY2FsZXMueEF4ZXMgfHwgW10pLm1hcChmdW5jdGlvbih4QXhpc09wdGlvbnMpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHtvcHRpb25zOiB4QXhpc09wdGlvbnMsIGR0eXBlOiAnY2F0ZWdvcnknLCBkcG9zaXRpb246ICdib3R0b20nfTtcclxuXHRcdFx0XHRcdH0pLFxyXG5cdFx0XHRcdFx0KG9wdGlvbnMuc2NhbGVzLnlBeGVzIHx8IFtdKS5tYXAoZnVuY3Rpb24oeUF4aXNPcHRpb25zKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiB7b3B0aW9uczogeUF4aXNPcHRpb25zLCBkdHlwZTogJ2xpbmVhcicsIGRwb3NpdGlvbjogJ2xlZnQnfTtcclxuXHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKG9wdGlvbnMuc2NhbGUpIHtcclxuXHRcdFx0XHRpdGVtcy5wdXNoKHtcclxuXHRcdFx0XHRcdG9wdGlvbnM6IG9wdGlvbnMuc2NhbGUsXHJcblx0XHRcdFx0XHRkdHlwZTogJ3JhZGlhbExpbmVhcicsXHJcblx0XHRcdFx0XHRpc0RlZmF1bHQ6IHRydWUsXHJcblx0XHRcdFx0XHRkcG9zaXRpb246ICdjaGFydEFyZWEnXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGhlbHBlcnMuZWFjaChpdGVtcywgZnVuY3Rpb24oaXRlbSkge1xyXG5cdFx0XHRcdHZhciBzY2FsZU9wdGlvbnMgPSBpdGVtLm9wdGlvbnM7XHJcblx0XHRcdFx0dmFyIGlkID0gc2NhbGVPcHRpb25zLmlkO1xyXG5cdFx0XHRcdHZhciBzY2FsZVR5cGUgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KHNjYWxlT3B0aW9ucy50eXBlLCBpdGVtLmR0eXBlKTtcclxuXHJcblx0XHRcdFx0aWYgKHBvc2l0aW9uSXNIb3Jpem9udGFsKHNjYWxlT3B0aW9ucy5wb3NpdGlvbikgIT09IHBvc2l0aW9uSXNIb3Jpem9udGFsKGl0ZW0uZHBvc2l0aW9uKSkge1xyXG5cdFx0XHRcdFx0c2NhbGVPcHRpb25zLnBvc2l0aW9uID0gaXRlbS5kcG9zaXRpb247XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR1cGRhdGVkW2lkXSA9IHRydWU7XHJcblx0XHRcdFx0dmFyIHNjYWxlID0gbnVsbDtcclxuXHRcdFx0XHRpZiAoaWQgaW4gc2NhbGVzICYmIHNjYWxlc1tpZF0udHlwZSA9PT0gc2NhbGVUeXBlKSB7XHJcblx0XHRcdFx0XHRzY2FsZSA9IHNjYWxlc1tpZF07XHJcblx0XHRcdFx0XHRzY2FsZS5vcHRpb25zID0gc2NhbGVPcHRpb25zO1xyXG5cdFx0XHRcdFx0c2NhbGUuY3R4ID0gbWUuY3R4O1xyXG5cdFx0XHRcdFx0c2NhbGUuY2hhcnQgPSBtZTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dmFyIHNjYWxlQ2xhc3MgPSBzY2FsZVNlcnZpY2UuZ2V0U2NhbGVDb25zdHJ1Y3RvcihzY2FsZVR5cGUpO1xyXG5cdFx0XHRcdFx0aWYgKCFzY2FsZUNsYXNzKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHNjYWxlID0gbmV3IHNjYWxlQ2xhc3Moe1xyXG5cdFx0XHRcdFx0XHRpZDogaWQsXHJcblx0XHRcdFx0XHRcdHR5cGU6IHNjYWxlVHlwZSxcclxuXHRcdFx0XHRcdFx0b3B0aW9uczogc2NhbGVPcHRpb25zLFxyXG5cdFx0XHRcdFx0XHRjdHg6IG1lLmN0eCxcclxuXHRcdFx0XHRcdFx0Y2hhcnQ6IG1lXHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdHNjYWxlc1tzY2FsZS5pZF0gPSBzY2FsZTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHNjYWxlLm1lcmdlVGlja3NPcHRpb25zKCk7XHJcblxyXG5cdFx0XHRcdC8vIFRPRE8oU0IpOiBJIHRoaW5rIHdlIHNob3VsZCBiZSBhYmxlIHRvIHJlbW92ZSB0aGlzIGN1c3RvbSBjYXNlIChvcHRpb25zLnNjYWxlKVxyXG5cdFx0XHRcdC8vIGFuZCBjb25zaWRlciBpdCBhcyBhIHJlZ3VsYXIgc2NhbGUgcGFydCBvZiB0aGUgXCJzY2FsZXNcIlwiIG1hcCBvbmx5ISBUaGlzIHdvdWxkXHJcblx0XHRcdFx0Ly8gbWFrZSB0aGUgbG9naWMgZWFzaWVyIGFuZCByZW1vdmUgc29tZSB1c2VsZXNzPyBjdXN0b20gY29kZS5cclxuXHRcdFx0XHRpZiAoaXRlbS5pc0RlZmF1bHQpIHtcclxuXHRcdFx0XHRcdG1lLnNjYWxlID0gc2NhbGU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdFx0Ly8gY2xlYXIgdXAgZGlzY2FyZGVkIHNjYWxlc1xyXG5cdFx0XHRoZWxwZXJzLmVhY2godXBkYXRlZCwgZnVuY3Rpb24oaGFzVXBkYXRlZCwgaWQpIHtcclxuXHRcdFx0XHRpZiAoIWhhc1VwZGF0ZWQpIHtcclxuXHRcdFx0XHRcdGRlbGV0ZSBzY2FsZXNbaWRdO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRtZS5zY2FsZXMgPSBzY2FsZXM7XHJcblxyXG5cdFx0XHRzY2FsZVNlcnZpY2UuYWRkU2NhbGVzVG9MYXlvdXQodGhpcyk7XHJcblx0XHR9LFxyXG5cclxuXHRcdGJ1aWxkT3JVcGRhdGVDb250cm9sbGVyczogZnVuY3Rpb24oKSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciB0eXBlcyA9IFtdO1xyXG5cdFx0XHR2YXIgbmV3Q29udHJvbGxlcnMgPSBbXTtcclxuXHJcblx0XHRcdGhlbHBlcnMuZWFjaChtZS5kYXRhLmRhdGFzZXRzLCBmdW5jdGlvbihkYXRhc2V0LCBkYXRhc2V0SW5kZXgpIHtcclxuXHRcdFx0XHR2YXIgbWV0YSA9IG1lLmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XHJcblx0XHRcdFx0dmFyIHR5cGUgPSBkYXRhc2V0LnR5cGUgfHwgbWUuY29uZmlnLnR5cGU7XHJcblxyXG5cdFx0XHRcdGlmIChtZXRhLnR5cGUgJiYgbWV0YS50eXBlICE9PSB0eXBlKSB7XHJcblx0XHRcdFx0XHRtZS5kZXN0cm95RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcclxuXHRcdFx0XHRcdG1ldGEgPSBtZS5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRtZXRhLnR5cGUgPSB0eXBlO1xyXG5cclxuXHRcdFx0XHR0eXBlcy5wdXNoKG1ldGEudHlwZSk7XHJcblxyXG5cdFx0XHRcdGlmIChtZXRhLmNvbnRyb2xsZXIpIHtcclxuXHRcdFx0XHRcdG1ldGEuY29udHJvbGxlci51cGRhdGVJbmRleChkYXRhc2V0SW5kZXgpO1xyXG5cdFx0XHRcdFx0bWV0YS5jb250cm9sbGVyLmxpbmtTY2FsZXMoKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dmFyIENvbnRyb2xsZXJDbGFzcyA9IENoYXJ0LmNvbnRyb2xsZXJzW21ldGEudHlwZV07XHJcblx0XHRcdFx0XHRpZiAoQ29udHJvbGxlckNsYXNzID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdcIicgKyBtZXRhLnR5cGUgKyAnXCIgaXMgbm90IGEgY2hhcnQgdHlwZS4nKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRtZXRhLmNvbnRyb2xsZXIgPSBuZXcgQ29udHJvbGxlckNsYXNzKG1lLCBkYXRhc2V0SW5kZXgpO1xyXG5cdFx0XHRcdFx0bmV3Q29udHJvbGxlcnMucHVzaChtZXRhLmNvbnRyb2xsZXIpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSwgbWUpO1xyXG5cclxuXHRcdFx0cmV0dXJuIG5ld0NvbnRyb2xsZXJzO1xyXG5cdFx0fSxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJlc2V0IHRoZSBlbGVtZW50cyBvZiBhbGwgZGF0YXNldHNcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHRcdHJlc2V0RWxlbWVudHM6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHRoZWxwZXJzLmVhY2gobWUuZGF0YS5kYXRhc2V0cywgZnVuY3Rpb24oZGF0YXNldCwgZGF0YXNldEluZGV4KSB7XHJcblx0XHRcdFx0bWUuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KS5jb250cm9sbGVyLnJlc2V0KCk7XHJcblx0XHRcdH0sIG1lKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQqIFJlc2V0cyB0aGUgY2hhcnQgYmFjayB0byBpdCdzIHN0YXRlIGJlZm9yZSB0aGUgaW5pdGlhbCBhbmltYXRpb25cclxuXHRcdCovXHJcblx0XHRyZXNldDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdHRoaXMucmVzZXRFbGVtZW50cygpO1xyXG5cdFx0XHR0aGlzLnRvb2x0aXAuaW5pdGlhbGl6ZSgpO1xyXG5cdFx0fSxcclxuXHJcblx0XHR1cGRhdGU6IGZ1bmN0aW9uKGNvbmZpZykge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cclxuXHRcdFx0aWYgKCFjb25maWcgfHwgdHlwZW9mIGNvbmZpZyAhPT0gJ29iamVjdCcpIHtcclxuXHRcdFx0XHQvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxyXG5cdFx0XHRcdGNvbmZpZyA9IHtcclxuXHRcdFx0XHRcdGR1cmF0aW9uOiBjb25maWcsXHJcblx0XHRcdFx0XHRsYXp5OiBhcmd1bWVudHNbMV1cclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR1cGRhdGVDb25maWcobWUpO1xyXG5cclxuXHRcdFx0Ly8gcGx1Z2lucyBvcHRpb25zIHJlZmVyZW5jZXMgbWlnaHQgaGF2ZSBjaGFuZ2UsIGxldCdzIGludmFsaWRhdGUgdGhlIGNhY2hlXHJcblx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy81MTExI2lzc3VlY29tbWVudC0zNTU5MzQxNjdcclxuXHRcdFx0cGx1Z2lucy5faW52YWxpZGF0ZShtZSk7XHJcblxyXG5cdFx0XHRpZiAocGx1Z2lucy5ub3RpZnkobWUsICdiZWZvcmVVcGRhdGUnKSA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEluIGNhc2UgdGhlIGVudGlyZSBkYXRhIG9iamVjdCBjaGFuZ2VkXHJcblx0XHRcdG1lLnRvb2x0aXAuX2RhdGEgPSBtZS5kYXRhO1xyXG5cclxuXHRcdFx0Ly8gTWFrZSBzdXJlIGRhdGFzZXQgY29udHJvbGxlcnMgYXJlIHVwZGF0ZWQgYW5kIG5ldyBjb250cm9sbGVycyBhcmUgcmVzZXRcclxuXHRcdFx0dmFyIG5ld0NvbnRyb2xsZXJzID0gbWUuYnVpbGRPclVwZGF0ZUNvbnRyb2xsZXJzKCk7XHJcblxyXG5cdFx0XHQvLyBNYWtlIHN1cmUgYWxsIGRhdGFzZXQgY29udHJvbGxlcnMgaGF2ZSBjb3JyZWN0IG1ldGEgZGF0YSBjb3VudHNcclxuXHRcdFx0aGVscGVycy5lYWNoKG1lLmRhdGEuZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkge1xyXG5cdFx0XHRcdG1lLmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCkuY29udHJvbGxlci5idWlsZE9yVXBkYXRlRWxlbWVudHMoKTtcclxuXHRcdFx0fSwgbWUpO1xyXG5cclxuXHRcdFx0bWUudXBkYXRlTGF5b3V0KCk7XHJcblxyXG5cdFx0XHQvLyBDYW4gb25seSByZXNldCB0aGUgbmV3IGNvbnRyb2xsZXJzIGFmdGVyIHRoZSBzY2FsZXMgaGF2ZSBiZWVuIHVwZGF0ZWRcclxuXHRcdFx0aWYgKG1lLm9wdGlvbnMuYW5pbWF0aW9uICYmIG1lLm9wdGlvbnMuYW5pbWF0aW9uLmR1cmF0aW9uKSB7XHJcblx0XHRcdFx0aGVscGVycy5lYWNoKG5ld0NvbnRyb2xsZXJzLCBmdW5jdGlvbihjb250cm9sbGVyKSB7XHJcblx0XHRcdFx0XHRjb250cm9sbGVyLnJlc2V0KCk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG1lLnVwZGF0ZURhdGFzZXRzKCk7XHJcblxyXG5cdFx0XHQvLyBOZWVkIHRvIHJlc2V0IHRvb2x0aXAgaW4gY2FzZSBpdCBpcyBkaXNwbGF5ZWQgd2l0aCBlbGVtZW50cyB0aGF0IGFyZSByZW1vdmVkXHJcblx0XHRcdC8vIGFmdGVyIHVwZGF0ZS5cclxuXHRcdFx0bWUudG9vbHRpcC5pbml0aWFsaXplKCk7XHJcblxyXG5cdFx0XHQvLyBMYXN0IGFjdGl2ZSBjb250YWlucyBpdGVtcyB0aGF0IHdlcmUgcHJldmlvdXNseSBpbiB0aGUgdG9vbHRpcC5cclxuXHRcdFx0Ly8gV2hlbiB3ZSByZXNldCB0aGUgdG9vbHRpcCwgd2UgbmVlZCB0byBjbGVhciBpdFxyXG5cdFx0XHRtZS5sYXN0QWN0aXZlID0gW107XHJcblxyXG5cdFx0XHQvLyBEbyB0aGlzIGJlZm9yZSByZW5kZXIgc28gdGhhdCBhbnkgcGx1Z2lucyB0aGF0IG5lZWQgZmluYWwgc2NhbGUgdXBkYXRlcyBjYW4gdXNlIGl0XHJcblx0XHRcdHBsdWdpbnMubm90aWZ5KG1lLCAnYWZ0ZXJVcGRhdGUnKTtcclxuXHJcblx0XHRcdGlmIChtZS5fYnVmZmVyZWRSZW5kZXIpIHtcclxuXHRcdFx0XHRtZS5fYnVmZmVyZWRSZXF1ZXN0ID0ge1xyXG5cdFx0XHRcdFx0ZHVyYXRpb246IGNvbmZpZy5kdXJhdGlvbixcclxuXHRcdFx0XHRcdGVhc2luZzogY29uZmlnLmVhc2luZyxcclxuXHRcdFx0XHRcdGxhenk6IGNvbmZpZy5sYXp5XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRtZS5yZW5kZXIoY29uZmlnKTtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVwZGF0ZXMgdGhlIGNoYXJ0IGxheW91dCB1bmxlc3MgYSBwbHVnaW4gcmV0dXJucyBgZmFsc2VgIHRvIHRoZSBgYmVmb3JlTGF5b3V0YFxyXG5cdFx0ICogaG9vaywgaW4gd2hpY2ggY2FzZSwgcGx1Z2lucyB3aWxsIG5vdCBiZSBjYWxsZWQgb24gYGFmdGVyTGF5b3V0YC5cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHRcdHVwZGF0ZUxheW91dDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblxyXG5cdFx0XHRpZiAocGx1Z2lucy5ub3RpZnkobWUsICdiZWZvcmVMYXlvdXQnKSA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGxheW91dHMudXBkYXRlKHRoaXMsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcclxuXHJcblx0XHRcdC8qKlxyXG5cdFx0XHQgKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdXNlIGBhZnRlckxheW91dGAgaW5zdGVhZC5cclxuXHRcdFx0ICogQG1ldGhvZCBJUGx1Z2luI2FmdGVyU2NhbGVVcGRhdGVcclxuXHRcdFx0ICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjUuMFxyXG5cdFx0XHQgKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXHJcblx0XHRcdCAqIEBwcml2YXRlXHJcblx0XHRcdCAqL1xyXG5cdFx0XHRwbHVnaW5zLm5vdGlmeShtZSwgJ2FmdGVyU2NhbGVVcGRhdGUnKTtcclxuXHRcdFx0cGx1Z2lucy5ub3RpZnkobWUsICdhZnRlckxheW91dCcpO1xyXG5cdFx0fSxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFVwZGF0ZXMgYWxsIGRhdGFzZXRzIHVubGVzcyBhIHBsdWdpbiByZXR1cm5zIGBmYWxzZWAgdG8gdGhlIGBiZWZvcmVEYXRhc2V0c1VwZGF0ZWBcclxuXHRcdCAqIGhvb2ssIGluIHdoaWNoIGNhc2UsIHBsdWdpbnMgd2lsbCBub3QgYmUgY2FsbGVkIG9uIGBhZnRlckRhdGFzZXRzVXBkYXRlYC5cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHRcdHVwZGF0ZURhdGFzZXRzOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHJcblx0XHRcdGlmIChwbHVnaW5zLm5vdGlmeShtZSwgJ2JlZm9yZURhdGFzZXRzVXBkYXRlJykgPT09IGZhbHNlKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmb3IgKHZhciBpID0gMCwgaWxlbiA9IG1lLmRhdGEuZGF0YXNldHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XHJcblx0XHRcdFx0bWUudXBkYXRlRGF0YXNldChpKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cGx1Z2lucy5ub3RpZnkobWUsICdhZnRlckRhdGFzZXRzVXBkYXRlJyk7XHJcblx0XHR9LFxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogVXBkYXRlcyBkYXRhc2V0IGF0IGluZGV4IHVubGVzcyBhIHBsdWdpbiByZXR1cm5zIGBmYWxzZWAgdG8gdGhlIGBiZWZvcmVEYXRhc2V0VXBkYXRlYFxyXG5cdFx0ICogaG9vaywgaW4gd2hpY2ggY2FzZSwgcGx1Z2lucyB3aWxsIG5vdCBiZSBjYWxsZWQgb24gYGFmdGVyRGF0YXNldFVwZGF0ZWAuXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHR1cGRhdGVEYXRhc2V0OiBmdW5jdGlvbihpbmRleCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgbWV0YSA9IG1lLmdldERhdGFzZXRNZXRhKGluZGV4KTtcclxuXHRcdFx0dmFyIGFyZ3MgPSB7XHJcblx0XHRcdFx0bWV0YTogbWV0YSxcclxuXHRcdFx0XHRpbmRleDogaW5kZXhcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGlmIChwbHVnaW5zLm5vdGlmeShtZSwgJ2JlZm9yZURhdGFzZXRVcGRhdGUnLCBbYXJnc10pID09PSBmYWxzZSkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bWV0YS5jb250cm9sbGVyLnVwZGF0ZSgpO1xyXG5cclxuXHRcdFx0cGx1Z2lucy5ub3RpZnkobWUsICdhZnRlckRhdGFzZXRVcGRhdGUnLCBbYXJnc10pO1xyXG5cdFx0fSxcclxuXHJcblx0XHRyZW5kZXI6IGZ1bmN0aW9uKGNvbmZpZykge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cclxuXHRcdFx0aWYgKCFjb25maWcgfHwgdHlwZW9mIGNvbmZpZyAhPT0gJ29iamVjdCcpIHtcclxuXHRcdFx0XHQvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxyXG5cdFx0XHRcdGNvbmZpZyA9IHtcclxuXHRcdFx0XHRcdGR1cmF0aW9uOiBjb25maWcsXHJcblx0XHRcdFx0XHRsYXp5OiBhcmd1bWVudHNbMV1cclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR2YXIgZHVyYXRpb24gPSBjb25maWcuZHVyYXRpb247XHJcblx0XHRcdHZhciBsYXp5ID0gY29uZmlnLmxhenk7XHJcblxyXG5cdFx0XHRpZiAocGx1Z2lucy5ub3RpZnkobWUsICdiZWZvcmVSZW5kZXInKSA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHZhciBhbmltYXRpb25PcHRpb25zID0gbWUub3B0aW9ucy5hbmltYXRpb247XHJcblx0XHRcdHZhciBvbkNvbXBsZXRlID0gZnVuY3Rpb24oYW5pbWF0aW9uKSB7XHJcblx0XHRcdFx0cGx1Z2lucy5ub3RpZnkobWUsICdhZnRlclJlbmRlcicpO1xyXG5cdFx0XHRcdGhlbHBlcnMuY2FsbGJhY2soYW5pbWF0aW9uT3B0aW9ucyAmJiBhbmltYXRpb25PcHRpb25zLm9uQ29tcGxldGUsIFthbmltYXRpb25dLCBtZSk7XHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRpZiAoYW5pbWF0aW9uT3B0aW9ucyAmJiAoKHR5cGVvZiBkdXJhdGlvbiAhPT0gJ3VuZGVmaW5lZCcgJiYgZHVyYXRpb24gIT09IDApIHx8ICh0eXBlb2YgZHVyYXRpb24gPT09ICd1bmRlZmluZWQnICYmIGFuaW1hdGlvbk9wdGlvbnMuZHVyYXRpb24gIT09IDApKSkge1xyXG5cdFx0XHRcdHZhciBhbmltYXRpb24gPSBuZXcgQW5pbWF0aW9uKHtcclxuXHRcdFx0XHRcdG51bVN0ZXBzOiAoZHVyYXRpb24gfHwgYW5pbWF0aW9uT3B0aW9ucy5kdXJhdGlvbikgLyAxNi42NiwgLy8gNjAgZnBzXHJcblx0XHRcdFx0XHRlYXNpbmc6IGNvbmZpZy5lYXNpbmcgfHwgYW5pbWF0aW9uT3B0aW9ucy5lYXNpbmcsXHJcblxyXG5cdFx0XHRcdFx0cmVuZGVyOiBmdW5jdGlvbihjaGFydCwgYW5pbWF0aW9uT2JqZWN0KSB7XHJcblx0XHRcdFx0XHRcdHZhciBlYXNpbmdGdW5jdGlvbiA9IGhlbHBlcnMuZWFzaW5nLmVmZmVjdHNbYW5pbWF0aW9uT2JqZWN0LmVhc2luZ107XHJcblx0XHRcdFx0XHRcdHZhciBjdXJyZW50U3RlcCA9IGFuaW1hdGlvbk9iamVjdC5jdXJyZW50U3RlcDtcclxuXHRcdFx0XHRcdFx0dmFyIHN0ZXBEZWNpbWFsID0gY3VycmVudFN0ZXAgLyBhbmltYXRpb25PYmplY3QubnVtU3RlcHM7XHJcblxyXG5cdFx0XHRcdFx0XHRjaGFydC5kcmF3KGVhc2luZ0Z1bmN0aW9uKHN0ZXBEZWNpbWFsKSwgc3RlcERlY2ltYWwsIGN1cnJlbnRTdGVwKTtcclxuXHRcdFx0XHRcdH0sXHJcblxyXG5cdFx0XHRcdFx0b25BbmltYXRpb25Qcm9ncmVzczogYW5pbWF0aW9uT3B0aW9ucy5vblByb2dyZXNzLFxyXG5cdFx0XHRcdFx0b25BbmltYXRpb25Db21wbGV0ZTogb25Db21wbGV0ZVxyXG5cdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRhbmltYXRpb25zLmFkZEFuaW1hdGlvbihtZSwgYW5pbWF0aW9uLCBkdXJhdGlvbiwgbGF6eSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0bWUuZHJhdygpO1xyXG5cclxuXHRcdFx0XHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzM3ODFcclxuXHRcdFx0XHRvbkNvbXBsZXRlKG5ldyBBbmltYXRpb24oe251bVN0ZXBzOiAwLCBjaGFydDogbWV9KSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBtZTtcclxuXHRcdH0sXHJcblxyXG5cdFx0ZHJhdzogZnVuY3Rpb24oZWFzaW5nVmFsdWUpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHJcblx0XHRcdG1lLmNsZWFyKCk7XHJcblxyXG5cdFx0XHRpZiAoaGVscGVycy5pc051bGxPclVuZGVmKGVhc2luZ1ZhbHVlKSkge1xyXG5cdFx0XHRcdGVhc2luZ1ZhbHVlID0gMTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bWUudHJhbnNpdGlvbihlYXNpbmdWYWx1ZSk7XHJcblxyXG5cdFx0XHRpZiAobWUud2lkdGggPD0gMCB8fCBtZS5oZWlnaHQgPD0gMCkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKHBsdWdpbnMubm90aWZ5KG1lLCAnYmVmb3JlRHJhdycsIFtlYXNpbmdWYWx1ZV0pID09PSBmYWxzZSkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gRHJhdyBhbGwgdGhlIHNjYWxlc1xyXG5cdFx0XHRoZWxwZXJzLmVhY2gobWUuYm94ZXMsIGZ1bmN0aW9uKGJveCkge1xyXG5cdFx0XHRcdGJveC5kcmF3KG1lLmNoYXJ0QXJlYSk7XHJcblx0XHRcdH0sIG1lKTtcclxuXHJcblx0XHRcdGlmIChtZS5zY2FsZSkge1xyXG5cdFx0XHRcdG1lLnNjYWxlLmRyYXcoKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bWUuZHJhd0RhdGFzZXRzKGVhc2luZ1ZhbHVlKTtcclxuXHRcdFx0bWUuX2RyYXdUb29sdGlwKGVhc2luZ1ZhbHVlKTtcclxuXHJcblx0XHRcdHBsdWdpbnMubm90aWZ5KG1lLCAnYWZ0ZXJEcmF3JywgW2Vhc2luZ1ZhbHVlXSk7XHJcblx0XHR9LFxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cdFx0dHJhbnNpdGlvbjogZnVuY3Rpb24oZWFzaW5nVmFsdWUpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHJcblx0XHRcdGZvciAodmFyIGkgPSAwLCBpbGVuID0gKG1lLmRhdGEuZGF0YXNldHMgfHwgW10pLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xyXG5cdFx0XHRcdGlmIChtZS5pc0RhdGFzZXRWaXNpYmxlKGkpKSB7XHJcblx0XHRcdFx0XHRtZS5nZXREYXRhc2V0TWV0YShpKS5jb250cm9sbGVyLnRyYW5zaXRpb24oZWFzaW5nVmFsdWUpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bWUudG9vbHRpcC50cmFuc2l0aW9uKGVhc2luZ1ZhbHVlKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEcmF3cyBhbGwgZGF0YXNldHMgdW5sZXNzIGEgcGx1Z2luIHJldHVybnMgYGZhbHNlYCB0byB0aGUgYGJlZm9yZURhdGFzZXRzRHJhd2BcclxuXHRcdCAqIGhvb2ssIGluIHdoaWNoIGNhc2UsIHBsdWdpbnMgd2lsbCBub3QgYmUgY2FsbGVkIG9uIGBhZnRlckRhdGFzZXRzRHJhd2AuXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRkcmF3RGF0YXNldHM6IGZ1bmN0aW9uKGVhc2luZ1ZhbHVlKSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblxyXG5cdFx0XHRpZiAocGx1Z2lucy5ub3RpZnkobWUsICdiZWZvcmVEYXRhc2V0c0RyYXcnLCBbZWFzaW5nVmFsdWVdKSA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIERyYXcgZGF0YXNldHMgcmV2ZXJzZWQgdG8gc3VwcG9ydCBwcm9wZXIgbGluZSBzdGFja2luZ1xyXG5cdFx0XHRmb3IgKHZhciBpID0gKG1lLmRhdGEuZGF0YXNldHMgfHwgW10pLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XHJcblx0XHRcdFx0aWYgKG1lLmlzRGF0YXNldFZpc2libGUoaSkpIHtcclxuXHRcdFx0XHRcdG1lLmRyYXdEYXRhc2V0KGksIGVhc2luZ1ZhbHVlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHBsdWdpbnMubm90aWZ5KG1lLCAnYWZ0ZXJEYXRhc2V0c0RyYXcnLCBbZWFzaW5nVmFsdWVdKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEcmF3cyBkYXRhc2V0IGF0IGluZGV4IHVubGVzcyBhIHBsdWdpbiByZXR1cm5zIGBmYWxzZWAgdG8gdGhlIGBiZWZvcmVEYXRhc2V0RHJhd2BcclxuXHRcdCAqIGhvb2ssIGluIHdoaWNoIGNhc2UsIHBsdWdpbnMgd2lsbCBub3QgYmUgY2FsbGVkIG9uIGBhZnRlckRhdGFzZXREcmF3YC5cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHRcdGRyYXdEYXRhc2V0OiBmdW5jdGlvbihpbmRleCwgZWFzaW5nVmFsdWUpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIG1ldGEgPSBtZS5nZXREYXRhc2V0TWV0YShpbmRleCk7XHJcblx0XHRcdHZhciBhcmdzID0ge1xyXG5cdFx0XHRcdG1ldGE6IG1ldGEsXHJcblx0XHRcdFx0aW5kZXg6IGluZGV4LFxyXG5cdFx0XHRcdGVhc2luZ1ZhbHVlOiBlYXNpbmdWYWx1ZVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0aWYgKHBsdWdpbnMubm90aWZ5KG1lLCAnYmVmb3JlRGF0YXNldERyYXcnLCBbYXJnc10pID09PSBmYWxzZSkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bWV0YS5jb250cm9sbGVyLmRyYXcoZWFzaW5nVmFsdWUpO1xyXG5cclxuXHRcdFx0cGx1Z2lucy5ub3RpZnkobWUsICdhZnRlckRhdGFzZXREcmF3JywgW2FyZ3NdKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBEcmF3cyB0b29sdGlwIHVubGVzcyBhIHBsdWdpbiByZXR1cm5zIGBmYWxzZWAgdG8gdGhlIGBiZWZvcmVUb29sdGlwRHJhd2BcclxuXHRcdCAqIGhvb2ssIGluIHdoaWNoIGNhc2UsIHBsdWdpbnMgd2lsbCBub3QgYmUgY2FsbGVkIG9uIGBhZnRlclRvb2x0aXBEcmF3YC5cclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHRcdF9kcmF3VG9vbHRpcDogZnVuY3Rpb24oZWFzaW5nVmFsdWUpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIHRvb2x0aXAgPSBtZS50b29sdGlwO1xyXG5cdFx0XHR2YXIgYXJncyA9IHtcclxuXHRcdFx0XHR0b29sdGlwOiB0b29sdGlwLFxyXG5cdFx0XHRcdGVhc2luZ1ZhbHVlOiBlYXNpbmdWYWx1ZVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0aWYgKHBsdWdpbnMubm90aWZ5KG1lLCAnYmVmb3JlVG9vbHRpcERyYXcnLCBbYXJnc10pID09PSBmYWxzZSkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dG9vbHRpcC5kcmF3KCk7XHJcblxyXG5cdFx0XHRwbHVnaW5zLm5vdGlmeShtZSwgJ2FmdGVyVG9vbHRpcERyYXcnLCBbYXJnc10pO1xyXG5cdFx0fSxcclxuXHJcblx0XHQvLyBHZXQgdGhlIHNpbmdsZSBlbGVtZW50IHRoYXQgd2FzIGNsaWNrZWQgb25cclxuXHRcdC8vIEByZXR1cm4gOiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgZGF0YXNldCBpbmRleCBhbmQgZWxlbWVudCBpbmRleCBvZiB0aGUgbWF0Y2hpbmcgZWxlbWVudC4gQWxzbyBjb250YWlucyB0aGUgcmVjdGFuZ2xlIHRoYXQgd2FzIGRyYXdcclxuXHRcdGdldEVsZW1lbnRBdEV2ZW50OiBmdW5jdGlvbihlKSB7XHJcblx0XHRcdHJldHVybiBJbnRlcmFjdGlvbi5tb2Rlcy5zaW5nbGUodGhpcywgZSk7XHJcblx0XHR9LFxyXG5cclxuXHRcdGdldEVsZW1lbnRzQXRFdmVudDogZnVuY3Rpb24oZSkge1xyXG5cdFx0XHRyZXR1cm4gSW50ZXJhY3Rpb24ubW9kZXMubGFiZWwodGhpcywgZSwge2ludGVyc2VjdDogdHJ1ZX0pO1xyXG5cdFx0fSxcclxuXHJcblx0XHRnZXRFbGVtZW50c0F0WEF4aXM6IGZ1bmN0aW9uKGUpIHtcclxuXHRcdFx0cmV0dXJuIEludGVyYWN0aW9uLm1vZGVzWyd4LWF4aXMnXSh0aGlzLCBlLCB7aW50ZXJzZWN0OiB0cnVlfSk7XHJcblx0XHR9LFxyXG5cclxuXHRcdGdldEVsZW1lbnRzQXRFdmVudEZvck1vZGU6IGZ1bmN0aW9uKGUsIG1vZGUsIG9wdGlvbnMpIHtcclxuXHRcdFx0dmFyIG1ldGhvZCA9IEludGVyYWN0aW9uLm1vZGVzW21vZGVdO1xyXG5cdFx0XHRpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xyXG5cdFx0XHRcdHJldHVybiBtZXRob2QodGhpcywgZSwgb3B0aW9ucyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBbXTtcclxuXHRcdH0sXHJcblxyXG5cdFx0Z2V0RGF0YXNldEF0RXZlbnQ6IGZ1bmN0aW9uKGUpIHtcclxuXHRcdFx0cmV0dXJuIEludGVyYWN0aW9uLm1vZGVzLmRhdGFzZXQodGhpcywgZSwge2ludGVyc2VjdDogdHJ1ZX0pO1xyXG5cdFx0fSxcclxuXHJcblx0XHRnZXREYXRhc2V0TWV0YTogZnVuY3Rpb24oZGF0YXNldEluZGV4KSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciBkYXRhc2V0ID0gbWUuZGF0YS5kYXRhc2V0c1tkYXRhc2V0SW5kZXhdO1xyXG5cdFx0XHRpZiAoIWRhdGFzZXQuX21ldGEpIHtcclxuXHRcdFx0XHRkYXRhc2V0Ll9tZXRhID0ge307XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHZhciBtZXRhID0gZGF0YXNldC5fbWV0YVttZS5pZF07XHJcblx0XHRcdGlmICghbWV0YSkge1xyXG5cdFx0XHRcdG1ldGEgPSBkYXRhc2V0Ll9tZXRhW21lLmlkXSA9IHtcclxuXHRcdFx0XHRcdHR5cGU6IG51bGwsXHJcblx0XHRcdFx0XHRkYXRhOiBbXSxcclxuXHRcdFx0XHRcdGRhdGFzZXQ6IG51bGwsXHJcblx0XHRcdFx0XHRjb250cm9sbGVyOiBudWxsLFxyXG5cdFx0XHRcdFx0aGlkZGVuOiBudWxsLFx0XHRcdC8vIFNlZSBpc0RhdGFzZXRWaXNpYmxlKCkgY29tbWVudFxyXG5cdFx0XHRcdFx0eEF4aXNJRDogbnVsbCxcclxuXHRcdFx0XHRcdHlBeGlzSUQ6IG51bGxcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gbWV0YTtcclxuXHRcdH0sXHJcblxyXG5cdFx0Z2V0VmlzaWJsZURhdGFzZXRDb3VudDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdHZhciBjb3VudCA9IDA7XHJcblx0XHRcdGZvciAodmFyIGkgPSAwLCBpbGVuID0gdGhpcy5kYXRhLmRhdGFzZXRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xyXG5cdFx0XHRcdGlmICh0aGlzLmlzRGF0YXNldFZpc2libGUoaSkpIHtcclxuXHRcdFx0XHRcdGNvdW50Kys7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBjb3VudDtcclxuXHRcdH0sXHJcblxyXG5cdFx0aXNEYXRhc2V0VmlzaWJsZTogZnVuY3Rpb24oZGF0YXNldEluZGV4KSB7XHJcblx0XHRcdHZhciBtZXRhID0gdGhpcy5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpO1xyXG5cclxuXHRcdFx0Ly8gbWV0YS5oaWRkZW4gaXMgYSBwZXIgY2hhcnQgZGF0YXNldCBoaWRkZW4gZmxhZyBvdmVycmlkZSB3aXRoIDMgc3RhdGVzOiBpZiB0cnVlIG9yIGZhbHNlLFxyXG5cdFx0XHQvLyB0aGUgZGF0YXNldC5oaWRkZW4gdmFsdWUgaXMgaWdub3JlZCwgZWxzZSBpZiBudWxsLCB0aGUgZGF0YXNldCBoaWRkZW4gc3RhdGUgaXMgcmV0dXJuZWQuXHJcblx0XHRcdHJldHVybiB0eXBlb2YgbWV0YS5oaWRkZW4gPT09ICdib29sZWFuJyA/ICFtZXRhLmhpZGRlbiA6ICF0aGlzLmRhdGEuZGF0YXNldHNbZGF0YXNldEluZGV4XS5oaWRkZW47XHJcblx0XHR9LFxyXG5cclxuXHRcdGdlbmVyYXRlTGVnZW5kOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMub3B0aW9ucy5sZWdlbmRDYWxsYmFjayh0aGlzKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRkZXN0cm95RGF0YXNldE1ldGE6IGZ1bmN0aW9uKGRhdGFzZXRJbmRleCkge1xyXG5cdFx0XHR2YXIgaWQgPSB0aGlzLmlkO1xyXG5cdFx0XHR2YXIgZGF0YXNldCA9IHRoaXMuZGF0YS5kYXRhc2V0c1tkYXRhc2V0SW5kZXhdO1xyXG5cdFx0XHR2YXIgbWV0YSA9IGRhdGFzZXQuX21ldGEgJiYgZGF0YXNldC5fbWV0YVtpZF07XHJcblxyXG5cdFx0XHRpZiAobWV0YSkge1xyXG5cdFx0XHRcdG1ldGEuY29udHJvbGxlci5kZXN0cm95KCk7XHJcblx0XHRcdFx0ZGVsZXRlIGRhdGFzZXQuX21ldGFbaWRdO1xyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cclxuXHRcdGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgY2FudmFzID0gbWUuY2FudmFzO1xyXG5cdFx0XHR2YXIgaSwgaWxlbjtcclxuXHJcblx0XHRcdG1lLnN0b3AoKTtcclxuXHJcblx0XHRcdC8vIGRhdGFzZXQgY29udHJvbGxlcnMgbmVlZCB0byBjbGVhbnVwIGFzc29jaWF0ZWQgZGF0YVxyXG5cdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0gbWUuZGF0YS5kYXRhc2V0cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcclxuXHRcdFx0XHRtZS5kZXN0cm95RGF0YXNldE1ldGEoaSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmIChjYW52YXMpIHtcclxuXHRcdFx0XHRtZS51bmJpbmRFdmVudHMoKTtcclxuXHRcdFx0XHRoZWxwZXJzLmNhbnZhcy5jbGVhcihtZSk7XHJcblx0XHRcdFx0cGxhdGZvcm0ucmVsZWFzZUNvbnRleHQobWUuY3R4KTtcclxuXHRcdFx0XHRtZS5jYW52YXMgPSBudWxsO1xyXG5cdFx0XHRcdG1lLmN0eCA9IG51bGw7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHBsdWdpbnMubm90aWZ5KG1lLCAnZGVzdHJveScpO1xyXG5cclxuXHRcdFx0ZGVsZXRlIENoYXJ0Lmluc3RhbmNlc1ttZS5pZF07XHJcblx0XHR9LFxyXG5cclxuXHRcdHRvQmFzZTY0SW1hZ2U6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5jYW52YXMudG9EYXRhVVJMLmFwcGx5KHRoaXMuY2FudmFzLCBhcmd1bWVudHMpO1xyXG5cdFx0fSxcclxuXHJcblx0XHRpbml0VG9vbFRpcDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdG1lLnRvb2x0aXAgPSBuZXcgVG9vbHRpcCh7XHJcblx0XHRcdFx0X2NoYXJ0OiBtZSxcclxuXHRcdFx0XHRfY2hhcnRJbnN0YW5jZTogbWUsIC8vIGRlcHJlY2F0ZWQsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcclxuXHRcdFx0XHRfZGF0YTogbWUuZGF0YSxcclxuXHRcdFx0XHRfb3B0aW9uczogbWUub3B0aW9ucy50b29sdGlwc1xyXG5cdFx0XHR9LCBtZSk7XHJcblx0XHR9LFxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cdFx0YmluZEV2ZW50czogZnVuY3Rpb24oKSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciBsaXN0ZW5lcnMgPSBtZS5fbGlzdGVuZXJzID0ge307XHJcblx0XHRcdHZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdG1lLmV2ZW50SGFuZGxlci5hcHBseShtZSwgYXJndW1lbnRzKTtcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdGhlbHBlcnMuZWFjaChtZS5vcHRpb25zLmV2ZW50cywgZnVuY3Rpb24odHlwZSkge1xyXG5cdFx0XHRcdHBsYXRmb3JtLmFkZEV2ZW50TGlzdGVuZXIobWUsIHR5cGUsIGxpc3RlbmVyKTtcclxuXHRcdFx0XHRsaXN0ZW5lcnNbdHlwZV0gPSBsaXN0ZW5lcjtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQvLyBFbGVtZW50cyB1c2VkIHRvIGRldGVjdCBzaXplIGNoYW5nZSBzaG91bGQgbm90IGJlIGluamVjdGVkIGZvciBub24gcmVzcG9uc2l2ZSBjaGFydHMuXHJcblx0XHRcdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvMjIxMFxyXG5cdFx0XHRpZiAobWUub3B0aW9ucy5yZXNwb25zaXZlKSB7XHJcblx0XHRcdFx0bGlzdGVuZXIgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdG1lLnJlc2l6ZSgpO1xyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdHBsYXRmb3JtLmFkZEV2ZW50TGlzdGVuZXIobWUsICdyZXNpemUnLCBsaXN0ZW5lcik7XHJcblx0XHRcdFx0bGlzdGVuZXJzLnJlc2l6ZSA9IGxpc3RlbmVyO1xyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cdFx0dW5iaW5kRXZlbnRzOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIGxpc3RlbmVycyA9IG1lLl9saXN0ZW5lcnM7XHJcblx0XHRcdGlmICghbGlzdGVuZXJzKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRkZWxldGUgbWUuX2xpc3RlbmVycztcclxuXHRcdFx0aGVscGVycy5lYWNoKGxpc3RlbmVycywgZnVuY3Rpb24obGlzdGVuZXIsIHR5cGUpIHtcclxuXHRcdFx0XHRwbGF0Zm9ybS5yZW1vdmVFdmVudExpc3RlbmVyKG1lLCB0eXBlLCBsaXN0ZW5lcik7XHJcblx0XHRcdH0pO1xyXG5cdFx0fSxcclxuXHJcblx0XHR1cGRhdGVIb3ZlclN0eWxlOiBmdW5jdGlvbihlbGVtZW50cywgbW9kZSwgZW5hYmxlZCkge1xyXG5cdFx0XHR2YXIgbWV0aG9kID0gZW5hYmxlZCA/ICdzZXRIb3ZlclN0eWxlJyA6ICdyZW1vdmVIb3ZlclN0eWxlJztcclxuXHRcdFx0dmFyIGVsZW1lbnQsIGksIGlsZW47XHJcblxyXG5cdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XHJcblx0XHRcdFx0ZWxlbWVudCA9IGVsZW1lbnRzW2ldO1xyXG5cdFx0XHRcdGlmIChlbGVtZW50KSB7XHJcblx0XHRcdFx0XHR0aGlzLmdldERhdGFzZXRNZXRhKGVsZW1lbnQuX2RhdGFzZXRJbmRleCkuY29udHJvbGxlclttZXRob2RdKGVsZW1lbnQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHRcdGV2ZW50SGFuZGxlcjogZnVuY3Rpb24oZSkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgdG9vbHRpcCA9IG1lLnRvb2x0aXA7XHJcblxyXG5cdFx0XHRpZiAocGx1Z2lucy5ub3RpZnkobWUsICdiZWZvcmVFdmVudCcsIFtlXSkgPT09IGZhbHNlKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBCdWZmZXIgYW55IHVwZGF0ZSBjYWxscyBzbyB0aGF0IHJlbmRlcnMgZG8gbm90IG9jY3VyXHJcblx0XHRcdG1lLl9idWZmZXJlZFJlbmRlciA9IHRydWU7XHJcblx0XHRcdG1lLl9idWZmZXJlZFJlcXVlc3QgPSBudWxsO1xyXG5cclxuXHRcdFx0dmFyIGNoYW5nZWQgPSBtZS5oYW5kbGVFdmVudChlKTtcclxuXHRcdFx0Ly8gZm9yIHNtb290aCB0b29sdGlwIGFuaW1hdGlvbnMgaXNzdWUgIzQ5ODlcclxuXHRcdFx0Ly8gdGhlIHRvb2x0aXAgc2hvdWxkIGJlIHRoZSBzb3VyY2Ugb2YgY2hhbmdlXHJcblx0XHRcdC8vIEFuaW1hdGlvbiBjaGVjayB3b3JrYXJvdW5kOlxyXG5cdFx0XHQvLyB0b29sdGlwLl9zdGFydCB3aWxsIGJlIG51bGwgd2hlbiB0b29sdGlwIGlzbid0IGFuaW1hdGluZ1xyXG5cdFx0XHRpZiAodG9vbHRpcCkge1xyXG5cdFx0XHRcdGNoYW5nZWQgPSB0b29sdGlwLl9zdGFydFxyXG5cdFx0XHRcdFx0PyB0b29sdGlwLmhhbmRsZUV2ZW50KGUpXHJcblx0XHRcdFx0XHQ6IGNoYW5nZWQgfCB0b29sdGlwLmhhbmRsZUV2ZW50KGUpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRwbHVnaW5zLm5vdGlmeShtZSwgJ2FmdGVyRXZlbnQnLCBbZV0pO1xyXG5cclxuXHRcdFx0dmFyIGJ1ZmZlcmVkUmVxdWVzdCA9IG1lLl9idWZmZXJlZFJlcXVlc3Q7XHJcblx0XHRcdGlmIChidWZmZXJlZFJlcXVlc3QpIHtcclxuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGFuIHVwZGF0ZSB0aGF0IHdhcyB0cmlnZ2VyZWQsIHdlIG5lZWQgdG8gZG8gYSBub3JtYWwgcmVuZGVyXHJcblx0XHRcdFx0bWUucmVuZGVyKGJ1ZmZlcmVkUmVxdWVzdCk7XHJcblx0XHRcdH0gZWxzZSBpZiAoY2hhbmdlZCAmJiAhbWUuYW5pbWF0aW5nKSB7XHJcblx0XHRcdFx0Ly8gSWYgZW50ZXJpbmcsIGxlYXZpbmcsIG9yIGNoYW5naW5nIGVsZW1lbnRzLCBhbmltYXRlIHRoZSBjaGFuZ2UgdmlhIHBpdm90XHJcblx0XHRcdFx0bWUuc3RvcCgpO1xyXG5cclxuXHRcdFx0XHQvLyBXZSBvbmx5IG5lZWQgdG8gcmVuZGVyIGF0IHRoaXMgcG9pbnQuIFVwZGF0aW5nIHdpbGwgY2F1c2Ugc2NhbGVzIHRvIGJlXHJcblx0XHRcdFx0Ly8gcmVjb21wdXRlZCBnZW5lcmF0aW5nIGZsaWNrZXIgJiB1c2luZyBtb3JlIG1lbW9yeSB0aGFuIG5lY2Vzc2FyeS5cclxuXHRcdFx0XHRtZS5yZW5kZXIoe1xyXG5cdFx0XHRcdFx0ZHVyYXRpb246IG1lLm9wdGlvbnMuaG92ZXIuYW5pbWF0aW9uRHVyYXRpb24sXHJcblx0XHRcdFx0XHRsYXp5OiB0cnVlXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG1lLl9idWZmZXJlZFJlbmRlciA9IGZhbHNlO1xyXG5cdFx0XHRtZS5fYnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcclxuXHJcblx0XHRcdHJldHVybiBtZTtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBIYW5kbGUgYW4gZXZlbnRcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKiBAcGFyYW0ge0lFdmVudH0gZXZlbnQgdGhlIGV2ZW50IHRvIGhhbmRsZVxyXG5cdFx0ICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgY2hhcnQgbmVlZHMgdG8gcmUtcmVuZGVyXHJcblx0XHQgKi9cclxuXHRcdGhhbmRsZUV2ZW50OiBmdW5jdGlvbihlKSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciBvcHRpb25zID0gbWUub3B0aW9ucyB8fCB7fTtcclxuXHRcdFx0dmFyIGhvdmVyT3B0aW9ucyA9IG9wdGlvbnMuaG92ZXI7XHJcblx0XHRcdHZhciBjaGFuZ2VkID0gZmFsc2U7XHJcblxyXG5cdFx0XHRtZS5sYXN0QWN0aXZlID0gbWUubGFzdEFjdGl2ZSB8fCBbXTtcclxuXHJcblx0XHRcdC8vIEZpbmQgQWN0aXZlIEVsZW1lbnRzIGZvciBob3ZlciBhbmQgdG9vbHRpcHNcclxuXHRcdFx0aWYgKGUudHlwZSA9PT0gJ21vdXNlb3V0Jykge1xyXG5cdFx0XHRcdG1lLmFjdGl2ZSA9IFtdO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdG1lLmFjdGl2ZSA9IG1lLmdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUoZSwgaG92ZXJPcHRpb25zLm1vZGUsIGhvdmVyT3B0aW9ucyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEludm9rZSBvbkhvdmVyIGhvb2tcclxuXHRcdFx0Ly8gTmVlZCB0byBjYWxsIHdpdGggbmF0aXZlIGV2ZW50IGhlcmUgdG8gbm90IGJyZWFrIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XHJcblx0XHRcdGhlbHBlcnMuY2FsbGJhY2sob3B0aW9ucy5vbkhvdmVyIHx8IG9wdGlvbnMuaG92ZXIub25Ib3ZlciwgW2UubmF0aXZlLCBtZS5hY3RpdmVdLCBtZSk7XHJcblxyXG5cdFx0XHRpZiAoZS50eXBlID09PSAnbW91c2V1cCcgfHwgZS50eXBlID09PSAnY2xpY2snKSB7XHJcblx0XHRcdFx0aWYgKG9wdGlvbnMub25DbGljaykge1xyXG5cdFx0XHRcdFx0Ly8gVXNlIGUubmF0aXZlIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XHJcblx0XHRcdFx0XHRvcHRpb25zLm9uQ2xpY2suY2FsbChtZSwgZS5uYXRpdmUsIG1lLmFjdGl2ZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBSZW1vdmUgc3R5bGluZyBmb3IgbGFzdCBhY3RpdmUgKGV2ZW4gaWYgaXQgbWF5IHN0aWxsIGJlIGFjdGl2ZSlcclxuXHRcdFx0aWYgKG1lLmxhc3RBY3RpdmUubGVuZ3RoKSB7XHJcblx0XHRcdFx0bWUudXBkYXRlSG92ZXJTdHlsZShtZS5sYXN0QWN0aXZlLCBob3Zlck9wdGlvbnMubW9kZSwgZmFsc2UpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBCdWlsdCBpbiBob3ZlciBzdHlsaW5nXHJcblx0XHRcdGlmIChtZS5hY3RpdmUubGVuZ3RoICYmIGhvdmVyT3B0aW9ucy5tb2RlKSB7XHJcblx0XHRcdFx0bWUudXBkYXRlSG92ZXJTdHlsZShtZS5hY3RpdmUsIGhvdmVyT3B0aW9ucy5tb2RlLCB0cnVlKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y2hhbmdlZCA9ICFoZWxwZXJzLmFycmF5RXF1YWxzKG1lLmFjdGl2ZSwgbWUubGFzdEFjdGl2ZSk7XHJcblxyXG5cdFx0XHQvLyBSZW1lbWJlciBMYXN0IEFjdGl2ZXNcclxuXHRcdFx0bWUubGFzdEFjdGl2ZSA9IG1lLmFjdGl2ZTtcclxuXHJcblx0XHRcdHJldHVybiBjaGFuZ2VkO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cclxuXHQvKipcclxuXHQgKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdXNlIENoYXJ0IGluc3RlYWQuXHJcblx0ICogQGNsYXNzIENoYXJ0LkNvbnRyb2xsZXJcclxuXHQgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNi4wXHJcblx0ICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xyXG5cdCAqIEBwcml2YXRlXHJcblx0ICovXHJcblx0Q2hhcnQuQ29udHJvbGxlciA9IENoYXJ0O1xyXG59O1xyXG5cclxufSx7XCIyMlwiOjIyLFwiMjNcIjoyMyxcIjI2XCI6MjYsXCIyOVwiOjI5LFwiMzFcIjozMSxcIjMyXCI6MzIsXCIzNFwiOjM0LFwiMzZcIjozNixcIjQ2XCI6NDYsXCI0OVwiOjQ5fV0sMjU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDaGFydCkge1xyXG5cclxuXHR2YXIgYXJyYXlFdmVudHMgPSBbJ3B1c2gnLCAncG9wJywgJ3NoaWZ0JywgJ3NwbGljZScsICd1bnNoaWZ0J107XHJcblxyXG5cdC8qKlxyXG5cdCAqIEhvb2tzIHRoZSBhcnJheSBtZXRob2RzIHRoYXQgYWRkIG9yIHJlbW92ZSB2YWx1ZXMgKCdwdXNoJywgcG9wJywgJ3NoaWZ0JywgJ3NwbGljZScsXHJcblx0ICogJ3Vuc2hpZnQnKSBhbmQgbm90aWZ5IHRoZSBsaXN0ZW5lciBBRlRFUiB0aGUgYXJyYXkgaGFzIGJlZW4gYWx0ZXJlZC4gTGlzdGVuZXJzIGFyZVxyXG5cdCAqIGNhbGxlZCBvbiB0aGUgJ29uRGF0YSonIGNhbGxiYWNrcyAoZS5nLiBvbkRhdGFQdXNoLCBldGMuKSB3aXRoIHNhbWUgYXJndW1lbnRzLlxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIGxpc3RlbkFycmF5RXZlbnRzKGFycmF5LCBsaXN0ZW5lcikge1xyXG5cdFx0aWYgKGFycmF5Ll9jaGFydGpzKSB7XHJcblx0XHRcdGFycmF5Ll9jaGFydGpzLmxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcnJheSwgJ19jaGFydGpzJywge1xyXG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXHJcblx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxyXG5cdFx0XHR2YWx1ZToge1xyXG5cdFx0XHRcdGxpc3RlbmVyczogW2xpc3RlbmVyXVxyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHRhcnJheUV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xyXG5cdFx0XHR2YXIgbWV0aG9kID0gJ29uRGF0YScgKyBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSk7XHJcblx0XHRcdHZhciBiYXNlID0gYXJyYXlba2V5XTtcclxuXHJcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhcnJheSwga2V5LCB7XHJcblx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxyXG5cdFx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxyXG5cdFx0XHRcdHZhbHVlOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcclxuXHRcdFx0XHRcdHZhciByZXMgPSBiYXNlLmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG5cclxuXHRcdFx0XHRcdGhlbHBlcnMuZWFjaChhcnJheS5fY2hhcnRqcy5saXN0ZW5lcnMsIGZ1bmN0aW9uKG9iamVjdCkge1xyXG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIG9iamVjdFttZXRob2RdID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdFx0XHRcdFx0b2JqZWN0W21ldGhvZF0uYXBwbHkob2JqZWN0LCBhcmdzKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHJlcztcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmVzIHRoZSBnaXZlbiBhcnJheSBldmVudCBsaXN0ZW5lciBhbmQgY2xlYW51cCBleHRyYSBhdHRhY2hlZCBwcm9wZXJ0aWVzIChzdWNoIGFzXHJcblx0ICogdGhlIF9jaGFydGpzIHN0dWIgYW5kIG92ZXJyaWRkZW4gbWV0aG9kcykgaWYgYXJyYXkgZG9lc24ndCBoYXZlIGFueSBtb3JlIGxpc3RlbmVycy5cclxuXHQgKi9cclxuXHRmdW5jdGlvbiB1bmxpc3RlbkFycmF5RXZlbnRzKGFycmF5LCBsaXN0ZW5lcikge1xyXG5cdFx0dmFyIHN0dWIgPSBhcnJheS5fY2hhcnRqcztcclxuXHRcdGlmICghc3R1Yikge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGxpc3RlbmVycyA9IHN0dWIubGlzdGVuZXJzO1xyXG5cdFx0dmFyIGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xyXG5cdFx0aWYgKGluZGV4ICE9PSAtMSkge1xyXG5cdFx0XHRsaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAobGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGFycmF5RXZlbnRzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XHJcblx0XHRcdGRlbGV0ZSBhcnJheVtrZXldO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0ZGVsZXRlIGFycmF5Ll9jaGFydGpzO1xyXG5cdH1cclxuXHJcblx0Ly8gQmFzZSBjbGFzcyBmb3IgYWxsIGRhdGFzZXQgY29udHJvbGxlcnMgKGxpbmUsIGJhciwgZXRjKVxyXG5cdENoYXJ0LkRhdGFzZXRDb250cm9sbGVyID0gZnVuY3Rpb24oY2hhcnQsIGRhdGFzZXRJbmRleCkge1xyXG5cdFx0dGhpcy5pbml0aWFsaXplKGNoYXJ0LCBkYXRhc2V0SW5kZXgpO1xyXG5cdH07XHJcblxyXG5cdGhlbHBlcnMuZXh0ZW5kKENoYXJ0LkRhdGFzZXRDb250cm9sbGVyLnByb3RvdHlwZSwge1xyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogRWxlbWVudCB0eXBlIHVzZWQgdG8gZ2VuZXJhdGUgYSBtZXRhIGRhdGFzZXQgKGUuZy4gQ2hhcnQuZWxlbWVudC5MaW5lKS5cclxuXHRcdCAqIEB0eXBlIHtDaGFydC5jb3JlLmVsZW1lbnR9XHJcblx0XHQgKi9cclxuXHRcdGRhdGFzZXRFbGVtZW50VHlwZTogbnVsbCxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEVsZW1lbnQgdHlwZSB1c2VkIHRvIGdlbmVyYXRlIGEgbWV0YSBkYXRhIChlLmcuIENoYXJ0LmVsZW1lbnQuUG9pbnQpLlxyXG5cdFx0ICogQHR5cGUge0NoYXJ0LmNvcmUuZWxlbWVudH1cclxuXHRcdCAqL1xyXG5cdFx0ZGF0YUVsZW1lbnRUeXBlOiBudWxsLFxyXG5cclxuXHRcdGluaXRpYWxpemU6IGZ1bmN0aW9uKGNoYXJ0LCBkYXRhc2V0SW5kZXgpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0bWUuY2hhcnQgPSBjaGFydDtcclxuXHRcdFx0bWUuaW5kZXggPSBkYXRhc2V0SW5kZXg7XHJcblx0XHRcdG1lLmxpbmtTY2FsZXMoKTtcclxuXHRcdFx0bWUuYWRkRWxlbWVudHMoKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0dXBkYXRlSW5kZXg6IGZ1bmN0aW9uKGRhdGFzZXRJbmRleCkge1xyXG5cdFx0XHR0aGlzLmluZGV4ID0gZGF0YXNldEluZGV4O1xyXG5cdFx0fSxcclxuXHJcblx0XHRsaW5rU2NhbGVzOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIG1ldGEgPSBtZS5nZXRNZXRhKCk7XHJcblx0XHRcdHZhciBkYXRhc2V0ID0gbWUuZ2V0RGF0YXNldCgpO1xyXG5cclxuXHRcdFx0aWYgKG1ldGEueEF4aXNJRCA9PT0gbnVsbCB8fCAhKG1ldGEueEF4aXNJRCBpbiBtZS5jaGFydC5zY2FsZXMpKSB7XHJcblx0XHRcdFx0bWV0YS54QXhpc0lEID0gZGF0YXNldC54QXhpc0lEIHx8IG1lLmNoYXJ0Lm9wdGlvbnMuc2NhbGVzLnhBeGVzWzBdLmlkO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChtZXRhLnlBeGlzSUQgPT09IG51bGwgfHwgIShtZXRhLnlBeGlzSUQgaW4gbWUuY2hhcnQuc2NhbGVzKSkge1xyXG5cdFx0XHRcdG1ldGEueUF4aXNJRCA9IGRhdGFzZXQueUF4aXNJRCB8fCBtZS5jaGFydC5vcHRpb25zLnNjYWxlcy55QXhlc1swXS5pZDtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHJcblx0XHRnZXREYXRhc2V0OiBmdW5jdGlvbigpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuY2hhcnQuZGF0YS5kYXRhc2V0c1t0aGlzLmluZGV4XTtcclxuXHRcdH0sXHJcblxyXG5cdFx0Z2V0TWV0YTogZnVuY3Rpb24oKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmNoYXJ0LmdldERhdGFzZXRNZXRhKHRoaXMuaW5kZXgpO1xyXG5cdFx0fSxcclxuXHJcblx0XHRnZXRTY2FsZUZvcklkOiBmdW5jdGlvbihzY2FsZUlEKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmNoYXJ0LnNjYWxlc1tzY2FsZUlEXTtcclxuXHRcdH0sXHJcblxyXG5cdFx0cmVzZXQ6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR0aGlzLnVwZGF0ZSh0cnVlKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRkZXN0cm95OiBmdW5jdGlvbigpIHtcclxuXHRcdFx0aWYgKHRoaXMuX2RhdGEpIHtcclxuXHRcdFx0XHR1bmxpc3RlbkFycmF5RXZlbnRzKHRoaXMuX2RhdGEsIHRoaXMpO1xyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cclxuXHRcdGNyZWF0ZU1ldGFEYXRhc2V0OiBmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIHR5cGUgPSBtZS5kYXRhc2V0RWxlbWVudFR5cGU7XHJcblx0XHRcdHJldHVybiB0eXBlICYmIG5ldyB0eXBlKHtcclxuXHRcdFx0XHRfY2hhcnQ6IG1lLmNoYXJ0LFxyXG5cdFx0XHRcdF9kYXRhc2V0SW5kZXg6IG1lLmluZGV4XHJcblx0XHRcdH0pO1xyXG5cdFx0fSxcclxuXHJcblx0XHRjcmVhdGVNZXRhRGF0YTogZnVuY3Rpb24oaW5kZXgpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIHR5cGUgPSBtZS5kYXRhRWxlbWVudFR5cGU7XHJcblx0XHRcdHJldHVybiB0eXBlICYmIG5ldyB0eXBlKHtcclxuXHRcdFx0XHRfY2hhcnQ6IG1lLmNoYXJ0LFxyXG5cdFx0XHRcdF9kYXRhc2V0SW5kZXg6IG1lLmluZGV4LFxyXG5cdFx0XHRcdF9pbmRleDogaW5kZXhcclxuXHRcdFx0fSk7XHJcblx0XHR9LFxyXG5cclxuXHRcdGFkZEVsZW1lbnRzOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIG1ldGEgPSBtZS5nZXRNZXRhKCk7XHJcblx0XHRcdHZhciBkYXRhID0gbWUuZ2V0RGF0YXNldCgpLmRhdGEgfHwgW107XHJcblx0XHRcdHZhciBtZXRhRGF0YSA9IG1ldGEuZGF0YTtcclxuXHRcdFx0dmFyIGksIGlsZW47XHJcblxyXG5cdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0gZGF0YS5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcclxuXHRcdFx0XHRtZXRhRGF0YVtpXSA9IG1ldGFEYXRhW2ldIHx8IG1lLmNyZWF0ZU1ldGFEYXRhKGkpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRtZXRhLmRhdGFzZXQgPSBtZXRhLmRhdGFzZXQgfHwgbWUuY3JlYXRlTWV0YURhdGFzZXQoKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0YWRkRWxlbWVudEFuZFJlc2V0OiBmdW5jdGlvbihpbmRleCkge1xyXG5cdFx0XHR2YXIgZWxlbWVudCA9IHRoaXMuY3JlYXRlTWV0YURhdGEoaW5kZXgpO1xyXG5cdFx0XHR0aGlzLmdldE1ldGEoKS5kYXRhLnNwbGljZShpbmRleCwgMCwgZWxlbWVudCk7XHJcblx0XHRcdHRoaXMudXBkYXRlRWxlbWVudChlbGVtZW50LCBpbmRleCwgdHJ1ZSk7XHJcblx0XHR9LFxyXG5cclxuXHRcdGJ1aWxkT3JVcGRhdGVFbGVtZW50czogZnVuY3Rpb24oKSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciBkYXRhc2V0ID0gbWUuZ2V0RGF0YXNldCgpO1xyXG5cdFx0XHR2YXIgZGF0YSA9IGRhdGFzZXQuZGF0YSB8fCAoZGF0YXNldC5kYXRhID0gW10pO1xyXG5cclxuXHRcdFx0Ly8gSW4gb3JkZXIgdG8gY29ycmVjdGx5IGhhbmRsZSBkYXRhIGFkZGl0aW9uL2RlbGV0aW9uIGFuaW1hdGlvbiAoYW4gdGh1cyBzaW11bGF0ZVxyXG5cdFx0XHQvLyByZWFsLXRpbWUgY2hhcnRzKSwgd2UgbmVlZCB0byBtb25pdG9yIHRoZXNlIGRhdGEgbW9kaWZpY2F0aW9ucyBhbmQgc3luY2hyb25pemVcclxuXHRcdFx0Ly8gdGhlIGludGVybmFsIG1ldGEgZGF0YSBhY2NvcmRpbmdseS5cclxuXHRcdFx0aWYgKG1lLl9kYXRhICE9PSBkYXRhKSB7XHJcblx0XHRcdFx0aWYgKG1lLl9kYXRhKSB7XHJcblx0XHRcdFx0XHQvLyBUaGlzIGNhc2UgaGFwcGVucyB3aGVuIHRoZSB1c2VyIHJlcGxhY2VkIHRoZSBkYXRhIGFycmF5IGluc3RhbmNlLlxyXG5cdFx0XHRcdFx0dW5saXN0ZW5BcnJheUV2ZW50cyhtZS5fZGF0YSwgbWUpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0bGlzdGVuQXJyYXlFdmVudHMoZGF0YSwgbWUpO1xyXG5cdFx0XHRcdG1lLl9kYXRhID0gZGF0YTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gUmUtc3luYyBtZXRhIGRhdGEgaW4gY2FzZSB0aGUgdXNlciByZXBsYWNlZCB0aGUgZGF0YSBhcnJheSBvciBpZiB3ZSBtaXNzZWRcclxuXHRcdFx0Ly8gYW55IHVwZGF0ZXMgYW5kIHNvIG1ha2Ugc3VyZSB0aGF0IHdlIGhhbmRsZSBudW1iZXIgb2YgZGF0YXBvaW50cyBjaGFuZ2luZy5cclxuXHRcdFx0bWUucmVzeW5jRWxlbWVudHMoKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0dXBkYXRlOiBoZWxwZXJzLm5vb3AsXHJcblxyXG5cdFx0dHJhbnNpdGlvbjogZnVuY3Rpb24oZWFzaW5nVmFsdWUpIHtcclxuXHRcdFx0dmFyIG1ldGEgPSB0aGlzLmdldE1ldGEoKTtcclxuXHRcdFx0dmFyIGVsZW1lbnRzID0gbWV0YS5kYXRhIHx8IFtdO1xyXG5cdFx0XHR2YXIgaWxlbiA9IGVsZW1lbnRzLmxlbmd0aDtcclxuXHRcdFx0dmFyIGkgPSAwO1xyXG5cclxuXHRcdFx0Zm9yICg7IGkgPCBpbGVuOyArK2kpIHtcclxuXHRcdFx0XHRlbGVtZW50c1tpXS50cmFuc2l0aW9uKGVhc2luZ1ZhbHVlKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKG1ldGEuZGF0YXNldCkge1xyXG5cdFx0XHRcdG1ldGEuZGF0YXNldC50cmFuc2l0aW9uKGVhc2luZ1ZhbHVlKTtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHJcblx0XHRkcmF3OiBmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIG1ldGEgPSB0aGlzLmdldE1ldGEoKTtcclxuXHRcdFx0dmFyIGVsZW1lbnRzID0gbWV0YS5kYXRhIHx8IFtdO1xyXG5cdFx0XHR2YXIgaWxlbiA9IGVsZW1lbnRzLmxlbmd0aDtcclxuXHRcdFx0dmFyIGkgPSAwO1xyXG5cclxuXHRcdFx0aWYgKG1ldGEuZGF0YXNldCkge1xyXG5cdFx0XHRcdG1ldGEuZGF0YXNldC5kcmF3KCk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZvciAoOyBpIDwgaWxlbjsgKytpKSB7XHJcblx0XHRcdFx0ZWxlbWVudHNbaV0uZHJhdygpO1xyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cclxuXHRcdHJlbW92ZUhvdmVyU3R5bGU6IGZ1bmN0aW9uKGVsZW1lbnQpIHtcclxuXHRcdFx0aGVscGVycy5tZXJnZShlbGVtZW50Ll9tb2RlbCwgZWxlbWVudC4kcHJldmlvdXNTdHlsZSB8fCB7fSk7XHJcblx0XHRcdGRlbGV0ZSBlbGVtZW50LiRwcmV2aW91c1N0eWxlO1xyXG5cdFx0fSxcclxuXHJcblx0XHRzZXRIb3ZlclN0eWxlOiBmdW5jdGlvbihlbGVtZW50KSB7XHJcblx0XHRcdHZhciBkYXRhc2V0ID0gdGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzW2VsZW1lbnQuX2RhdGFzZXRJbmRleF07XHJcblx0XHRcdHZhciBpbmRleCA9IGVsZW1lbnQuX2luZGV4O1xyXG5cdFx0XHR2YXIgY3VzdG9tID0gZWxlbWVudC5jdXN0b20gfHwge307XHJcblx0XHRcdHZhciB2YWx1ZU9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0O1xyXG5cdFx0XHR2YXIgZ2V0SG92ZXJDb2xvciA9IGhlbHBlcnMuZ2V0SG92ZXJDb2xvcjtcclxuXHRcdFx0dmFyIG1vZGVsID0gZWxlbWVudC5fbW9kZWw7XHJcblxyXG5cdFx0XHRlbGVtZW50LiRwcmV2aW91c1N0eWxlID0ge1xyXG5cdFx0XHRcdGJhY2tncm91bmRDb2xvcjogbW9kZWwuYmFja2dyb3VuZENvbG9yLFxyXG5cdFx0XHRcdGJvcmRlckNvbG9yOiBtb2RlbC5ib3JkZXJDb2xvcixcclxuXHRcdFx0XHRib3JkZXJXaWR0aDogbW9kZWwuYm9yZGVyV2lkdGhcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdG1vZGVsLmJhY2tncm91bmRDb2xvciA9IGN1c3RvbS5ob3ZlckJhY2tncm91bmRDb2xvciA/IGN1c3RvbS5ob3ZlckJhY2tncm91bmRDb2xvciA6IHZhbHVlT3JEZWZhdWx0KGRhdGFzZXQuaG92ZXJCYWNrZ3JvdW5kQ29sb3IsIGluZGV4LCBnZXRIb3ZlckNvbG9yKG1vZGVsLmJhY2tncm91bmRDb2xvcikpO1xyXG5cdFx0XHRtb2RlbC5ib3JkZXJDb2xvciA9IGN1c3RvbS5ob3ZlckJvcmRlckNvbG9yID8gY3VzdG9tLmhvdmVyQm9yZGVyQ29sb3IgOiB2YWx1ZU9yRGVmYXVsdChkYXRhc2V0LmhvdmVyQm9yZGVyQ29sb3IsIGluZGV4LCBnZXRIb3ZlckNvbG9yKG1vZGVsLmJvcmRlckNvbG9yKSk7XHJcblx0XHRcdG1vZGVsLmJvcmRlcldpZHRoID0gY3VzdG9tLmhvdmVyQm9yZGVyV2lkdGggPyBjdXN0b20uaG92ZXJCb3JkZXJXaWR0aCA6IHZhbHVlT3JEZWZhdWx0KGRhdGFzZXQuaG92ZXJCb3JkZXJXaWR0aCwgaW5kZXgsIG1vZGVsLmJvcmRlcldpZHRoKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRyZXN5bmNFbGVtZW50czogZnVuY3Rpb24oKSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciBtZXRhID0gbWUuZ2V0TWV0YSgpO1xyXG5cdFx0XHR2YXIgZGF0YSA9IG1lLmdldERhdGFzZXQoKS5kYXRhO1xyXG5cdFx0XHR2YXIgbnVtTWV0YSA9IG1ldGEuZGF0YS5sZW5ndGg7XHJcblx0XHRcdHZhciBudW1EYXRhID0gZGF0YS5sZW5ndGg7XHJcblxyXG5cdFx0XHRpZiAobnVtRGF0YSA8IG51bU1ldGEpIHtcclxuXHRcdFx0XHRtZXRhLmRhdGEuc3BsaWNlKG51bURhdGEsIG51bU1ldGEgLSBudW1EYXRhKTtcclxuXHRcdFx0fSBlbHNlIGlmIChudW1EYXRhID4gbnVtTWV0YSkge1xyXG5cdFx0XHRcdG1lLmluc2VydEVsZW1lbnRzKG51bU1ldGEsIG51bURhdGEgLSBudW1NZXRhKTtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHRcdGluc2VydEVsZW1lbnRzOiBmdW5jdGlvbihzdGFydCwgY291bnQpIHtcclxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XHJcblx0XHRcdFx0dGhpcy5hZGRFbGVtZW50QW5kUmVzZXQoc3RhcnQgKyBpKTtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHRcdG9uRGF0YVB1c2g6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR0aGlzLmluc2VydEVsZW1lbnRzKHRoaXMuZ2V0RGF0YXNldCgpLmRhdGEubGVuZ3RoIC0gMSwgYXJndW1lbnRzLmxlbmd0aCk7XHJcblx0XHR9LFxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cdFx0b25EYXRhUG9wOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0dGhpcy5nZXRNZXRhKCkuZGF0YS5wb3AoKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRvbkRhdGFTaGlmdDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdHRoaXMuZ2V0TWV0YSgpLmRhdGEuc2hpZnQoKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRvbkRhdGFTcGxpY2U6IGZ1bmN0aW9uKHN0YXJ0LCBjb3VudCkge1xyXG5cdFx0XHR0aGlzLmdldE1ldGEoKS5kYXRhLnNwbGljZShzdGFydCwgY291bnQpO1xyXG5cdFx0XHR0aGlzLmluc2VydEVsZW1lbnRzKHN0YXJ0LCBhcmd1bWVudHMubGVuZ3RoIC0gMik7XHJcblx0XHR9LFxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cdFx0b25EYXRhVW5zaGlmdDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdHRoaXMuaW5zZXJ0RWxlbWVudHMoMCwgYXJndW1lbnRzLmxlbmd0aCk7XHJcblx0XHR9XHJcblx0fSk7XHJcblxyXG5cdENoYXJ0LkRhdGFzZXRDb250cm9sbGVyLmV4dGVuZCA9IGhlbHBlcnMuaW5oZXJpdHM7XHJcbn07XHJcblxyXG59LHtcIjQ2XCI6NDZ9XSwyNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHQvKipcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqL1xyXG5cdF9zZXQ6IGZ1bmN0aW9uKHNjb3BlLCB2YWx1ZXMpIHtcclxuXHRcdHJldHVybiBoZWxwZXJzLm1lcmdlKHRoaXNbc2NvcGVdIHx8ICh0aGlzW3Njb3BlXSA9IHt9KSwgdmFsdWVzKTtcclxuXHR9XHJcbn07XHJcblxyXG59LHtcIjQ2XCI6NDZ9XSwyNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBjb2xvciA9IHJlcXVpcmUoMyk7XHJcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XHJcblxyXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZShzdGFydCwgdmlldywgbW9kZWwsIGVhc2UpIHtcclxuXHR2YXIga2V5cyA9IE9iamVjdC5rZXlzKG1vZGVsKTtcclxuXHR2YXIgaSwgaWxlbiwga2V5LCBhY3R1YWwsIG9yaWdpbiwgdGFyZ2V0LCB0eXBlLCBjMCwgYzE7XHJcblxyXG5cdGZvciAoaSA9IDAsIGlsZW4gPSBrZXlzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xyXG5cdFx0a2V5ID0ga2V5c1tpXTtcclxuXHJcblx0XHR0YXJnZXQgPSBtb2RlbFtrZXldO1xyXG5cclxuXHRcdC8vIGlmIGEgdmFsdWUgaXMgYWRkZWQgdG8gdGhlIG1vZGVsIGFmdGVyIHBpdm90KCkgaGFzIGJlZW4gY2FsbGVkLCB0aGUgdmlld1xyXG5cdFx0Ly8gZG9lc24ndCBjb250YWluIGl0LCBzbyBsZXQncyBpbml0aWFsaXplIHRoZSB2aWV3IHRvIHRoZSB0YXJnZXQgdmFsdWUuXHJcblx0XHRpZiAoIXZpZXcuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG5cdFx0XHR2aWV3W2tleV0gPSB0YXJnZXQ7XHJcblx0XHR9XHJcblxyXG5cdFx0YWN0dWFsID0gdmlld1trZXldO1xyXG5cclxuXHRcdGlmIChhY3R1YWwgPT09IHRhcmdldCB8fCBrZXlbMF0gPT09ICdfJykge1xyXG5cdFx0XHRjb250aW51ZTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIXN0YXJ0Lmhhc093blByb3BlcnR5KGtleSkpIHtcclxuXHRcdFx0c3RhcnRba2V5XSA9IGFjdHVhbDtcclxuXHRcdH1cclxuXHJcblx0XHRvcmlnaW4gPSBzdGFydFtrZXldO1xyXG5cclxuXHRcdHR5cGUgPSB0eXBlb2YgdGFyZ2V0O1xyXG5cclxuXHRcdGlmICh0eXBlID09PSB0eXBlb2Ygb3JpZ2luKSB7XHJcblx0XHRcdGlmICh0eXBlID09PSAnc3RyaW5nJykge1xyXG5cdFx0XHRcdGMwID0gY29sb3Iob3JpZ2luKTtcclxuXHRcdFx0XHRpZiAoYzAudmFsaWQpIHtcclxuXHRcdFx0XHRcdGMxID0gY29sb3IodGFyZ2V0KTtcclxuXHRcdFx0XHRcdGlmIChjMS52YWxpZCkge1xyXG5cdFx0XHRcdFx0XHR2aWV3W2tleV0gPSBjMS5taXgoYzAsIGVhc2UpLnJnYlN0cmluZygpO1xyXG5cdFx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUob3JpZ2luKSAmJiBpc0Zpbml0ZSh0YXJnZXQpKSB7XHJcblx0XHRcdFx0dmlld1trZXldID0gb3JpZ2luICsgKHRhcmdldCAtIG9yaWdpbikgKiBlYXNlO1xyXG5cdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0dmlld1trZXldID0gdGFyZ2V0O1xyXG5cdH1cclxufVxyXG5cclxudmFyIEVsZW1lbnQgPSBmdW5jdGlvbihjb25maWd1cmF0aW9uKSB7XHJcblx0aGVscGVycy5leHRlbmQodGhpcywgY29uZmlndXJhdGlvbik7XHJcblx0dGhpcy5pbml0aWFsaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn07XHJcblxyXG5oZWxwZXJzLmV4dGVuZChFbGVtZW50LnByb3RvdHlwZSwge1xyXG5cclxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcclxuXHRcdHRoaXMuaGlkZGVuID0gZmFsc2U7XHJcblx0fSxcclxuXHJcblx0cGl2b3Q6IGZ1bmN0aW9uKCkge1xyXG5cdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdGlmICghbWUuX3ZpZXcpIHtcclxuXHRcdFx0bWUuX3ZpZXcgPSBoZWxwZXJzLmNsb25lKG1lLl9tb2RlbCk7XHJcblx0XHR9XHJcblx0XHRtZS5fc3RhcnQgPSB7fTtcclxuXHRcdHJldHVybiBtZTtcclxuXHR9LFxyXG5cclxuXHR0cmFuc2l0aW9uOiBmdW5jdGlvbihlYXNlKSB7XHJcblx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0dmFyIG1vZGVsID0gbWUuX21vZGVsO1xyXG5cdFx0dmFyIHN0YXJ0ID0gbWUuX3N0YXJ0O1xyXG5cdFx0dmFyIHZpZXcgPSBtZS5fdmlldztcclxuXHJcblx0XHQvLyBObyBhbmltYXRpb24gLT4gTm8gVHJhbnNpdGlvblxyXG5cdFx0aWYgKCFtb2RlbCB8fCBlYXNlID09PSAxKSB7XHJcblx0XHRcdG1lLl92aWV3ID0gbW9kZWw7XHJcblx0XHRcdG1lLl9zdGFydCA9IG51bGw7XHJcblx0XHRcdHJldHVybiBtZTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIXZpZXcpIHtcclxuXHRcdFx0dmlldyA9IG1lLl92aWV3ID0ge307XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKCFzdGFydCkge1xyXG5cdFx0XHRzdGFydCA9IG1lLl9zdGFydCA9IHt9O1xyXG5cdFx0fVxyXG5cclxuXHRcdGludGVycG9sYXRlKHN0YXJ0LCB2aWV3LCBtb2RlbCwgZWFzZSk7XHJcblxyXG5cdFx0cmV0dXJuIG1lO1xyXG5cdH0sXHJcblxyXG5cdHRvb2x0aXBQb3NpdGlvbjogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHR4OiB0aGlzLl9tb2RlbC54LFxyXG5cdFx0XHR5OiB0aGlzLl9tb2RlbC55XHJcblx0XHR9O1xyXG5cdH0sXHJcblxyXG5cdGhhc1ZhbHVlOiBmdW5jdGlvbigpIHtcclxuXHRcdHJldHVybiBoZWxwZXJzLmlzTnVtYmVyKHRoaXMuX21vZGVsLngpICYmIGhlbHBlcnMuaXNOdW1iZXIodGhpcy5fbW9kZWwueSk7XHJcblx0fVxyXG59KTtcclxuXHJcbkVsZW1lbnQuZXh0ZW5kID0gaGVscGVycy5pbmhlcml0cztcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRWxlbWVudDtcclxuXHJcbn0se1wiM1wiOjMsXCI0NlwiOjQ2fV0sMjg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xyXG4vKiBnbG9iYWwgd2luZG93OiBmYWxzZSAqL1xyXG4vKiBnbG9iYWwgZG9jdW1lbnQ6IGZhbHNlICovXHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBjb2xvciA9IHJlcXVpcmUoMyk7XHJcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xyXG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xyXG52YXIgc2NhbGVTZXJ2aWNlID0gcmVxdWlyZSgzNCk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xyXG5cclxuXHQvLyAtLSBCYXNpYyBqcyB1dGlsaXR5IG1ldGhvZHNcclxuXHJcblx0aGVscGVycy5jb25maWdNZXJnZSA9IGZ1bmN0aW9uKC8qIG9iamVjdHMgLi4uICovKSB7XHJcblx0XHRyZXR1cm4gaGVscGVycy5tZXJnZShoZWxwZXJzLmNsb25lKGFyZ3VtZW50c1swXSksIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwge1xyXG5cdFx0XHRtZXJnZXI6IGZ1bmN0aW9uKGtleSwgdGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpIHtcclxuXHRcdFx0XHR2YXIgdHZhbCA9IHRhcmdldFtrZXldIHx8IHt9O1xyXG5cdFx0XHRcdHZhciBzdmFsID0gc291cmNlW2tleV07XHJcblxyXG5cdFx0XHRcdGlmIChrZXkgPT09ICdzY2FsZXMnKSB7XHJcblx0XHRcdFx0XHQvLyBzY2FsZSBjb25maWcgbWVyZ2luZyBpcyBjb21wbGV4LiBBZGQgb3VyIG93biBmdW5jdGlvbiBoZXJlIGZvciB0aGF0XHJcblx0XHRcdFx0XHR0YXJnZXRba2V5XSA9IGhlbHBlcnMuc2NhbGVNZXJnZSh0dmFsLCBzdmFsKTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKGtleSA9PT0gJ3NjYWxlJykge1xyXG5cdFx0XHRcdFx0Ly8gdXNlZCBpbiBwb2xhciBhcmVhICYgcmFkYXIgY2hhcnRzIHNpbmNlIHRoZXJlIGlzIG9ubHkgb25lIHNjYWxlXHJcblx0XHRcdFx0XHR0YXJnZXRba2V5XSA9IGhlbHBlcnMubWVyZ2UodHZhbCwgW3NjYWxlU2VydmljZS5nZXRTY2FsZURlZmF1bHRzKHN2YWwudHlwZSksIHN2YWxdKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0aGVscGVycy5fbWVyZ2VyKGtleSwgdGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fTtcclxuXHJcblx0aGVscGVycy5zY2FsZU1lcmdlID0gZnVuY3Rpb24oLyogb2JqZWN0cyAuLi4gKi8pIHtcclxuXHRcdHJldHVybiBoZWxwZXJzLm1lcmdlKGhlbHBlcnMuY2xvbmUoYXJndW1lbnRzWzBdKSwgW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLCB7XHJcblx0XHRcdG1lcmdlcjogZnVuY3Rpb24oa2V5LCB0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xyXG5cdFx0XHRcdGlmIChrZXkgPT09ICd4QXhlcycgfHwga2V5ID09PSAneUF4ZXMnKSB7XHJcblx0XHRcdFx0XHR2YXIgc2xlbiA9IHNvdXJjZVtrZXldLmxlbmd0aDtcclxuXHRcdFx0XHRcdHZhciBpLCB0eXBlLCBzY2FsZTtcclxuXHJcblx0XHRcdFx0XHRpZiAoIXRhcmdldFtrZXldKSB7XHJcblx0XHRcdFx0XHRcdHRhcmdldFtrZXldID0gW107XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IHNsZW47ICsraSkge1xyXG5cdFx0XHRcdFx0XHRzY2FsZSA9IHNvdXJjZVtrZXldW2ldO1xyXG5cdFx0XHRcdFx0XHR0eXBlID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdChzY2FsZS50eXBlLCBrZXkgPT09ICd4QXhlcycgPyAnY2F0ZWdvcnknIDogJ2xpbmVhcicpO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKGkgPj0gdGFyZ2V0W2tleV0ubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0dGFyZ2V0W2tleV0ucHVzaCh7fSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmICghdGFyZ2V0W2tleV1baV0udHlwZSB8fCAoc2NhbGUudHlwZSAmJiBzY2FsZS50eXBlICE9PSB0YXJnZXRba2V5XVtpXS50eXBlKSkge1xyXG5cdFx0XHRcdFx0XHRcdC8vIG5ldy91bnR5cGVkIHNjYWxlIG9yIHR5cGUgY2hhbmdlZDogbGV0J3MgYXBwbHkgdGhlIG5ldyBkZWZhdWx0c1xyXG5cdFx0XHRcdFx0XHRcdC8vIHRoZW4gbWVyZ2Ugc291cmNlIHNjYWxlIHRvIGNvcnJlY3RseSBvdmVyd3JpdGUgdGhlIGRlZmF1bHRzLlxyXG5cdFx0XHRcdFx0XHRcdGhlbHBlcnMubWVyZ2UodGFyZ2V0W2tleV1baV0sIFtzY2FsZVNlcnZpY2UuZ2V0U2NhbGVEZWZhdWx0cyh0eXBlKSwgc2NhbGVdKTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHQvLyBzY2FsZXMgdHlwZSBhcmUgdGhlIHNhbWVcclxuXHRcdFx0XHRcdFx0XHRoZWxwZXJzLm1lcmdlKHRhcmdldFtrZXldW2ldLCBzY2FsZSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0aGVscGVycy5fbWVyZ2VyKGtleSwgdGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fTtcclxuXHJcblx0aGVscGVycy53aGVyZSA9IGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGZpbHRlckNhbGxiYWNrKSB7XHJcblx0XHRpZiAoaGVscGVycy5pc0FycmF5KGNvbGxlY3Rpb24pICYmIEFycmF5LnByb3RvdHlwZS5maWx0ZXIpIHtcclxuXHRcdFx0cmV0dXJuIGNvbGxlY3Rpb24uZmlsdGVyKGZpbHRlckNhbGxiYWNrKTtcclxuXHRcdH1cclxuXHRcdHZhciBmaWx0ZXJlZCA9IFtdO1xyXG5cclxuXHRcdGhlbHBlcnMuZWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbihpdGVtKSB7XHJcblx0XHRcdGlmIChmaWx0ZXJDYWxsYmFjayhpdGVtKSkge1xyXG5cdFx0XHRcdGZpbHRlcmVkLnB1c2goaXRlbSk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdHJldHVybiBmaWx0ZXJlZDtcclxuXHR9O1xyXG5cdGhlbHBlcnMuZmluZEluZGV4ID0gQXJyYXkucHJvdG90eXBlLmZpbmRJbmRleCA/XHJcblx0XHRmdW5jdGlvbihhcnJheSwgY2FsbGJhY2ssIHNjb3BlKSB7XHJcblx0XHRcdHJldHVybiBhcnJheS5maW5kSW5kZXgoY2FsbGJhY2ssIHNjb3BlKTtcclxuXHRcdH0gOlxyXG5cdFx0ZnVuY3Rpb24oYXJyYXksIGNhbGxiYWNrLCBzY29wZSkge1xyXG5cdFx0XHRzY29wZSA9IHNjb3BlID09PSB1bmRlZmluZWQgPyBhcnJheSA6IHNjb3BlO1xyXG5cdFx0XHRmb3IgKHZhciBpID0gMCwgaWxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xyXG5cdFx0XHRcdGlmIChjYWxsYmFjay5jYWxsKHNjb3BlLCBhcnJheVtpXSwgaSwgYXJyYXkpKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gaTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIC0xO1xyXG5cdFx0fTtcclxuXHRoZWxwZXJzLmZpbmROZXh0V2hlcmUgPSBmdW5jdGlvbihhcnJheVRvU2VhcmNoLCBmaWx0ZXJDYWxsYmFjaywgc3RhcnRJbmRleCkge1xyXG5cdFx0Ly8gRGVmYXVsdCB0byBzdGFydCBvZiB0aGUgYXJyYXlcclxuXHRcdGlmIChoZWxwZXJzLmlzTnVsbE9yVW5kZWYoc3RhcnRJbmRleCkpIHtcclxuXHRcdFx0c3RhcnRJbmRleCA9IC0xO1xyXG5cdFx0fVxyXG5cdFx0Zm9yICh2YXIgaSA9IHN0YXJ0SW5kZXggKyAxOyBpIDwgYXJyYXlUb1NlYXJjaC5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR2YXIgY3VycmVudEl0ZW0gPSBhcnJheVRvU2VhcmNoW2ldO1xyXG5cdFx0XHRpZiAoZmlsdGVyQ2FsbGJhY2soY3VycmVudEl0ZW0pKSB7XHJcblx0XHRcdFx0cmV0dXJuIGN1cnJlbnRJdGVtO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fTtcclxuXHRoZWxwZXJzLmZpbmRQcmV2aW91c1doZXJlID0gZnVuY3Rpb24oYXJyYXlUb1NlYXJjaCwgZmlsdGVyQ2FsbGJhY2ssIHN0YXJ0SW5kZXgpIHtcclxuXHRcdC8vIERlZmF1bHQgdG8gZW5kIG9mIHRoZSBhcnJheVxyXG5cdFx0aWYgKGhlbHBlcnMuaXNOdWxsT3JVbmRlZihzdGFydEluZGV4KSkge1xyXG5cdFx0XHRzdGFydEluZGV4ID0gYXJyYXlUb1NlYXJjaC5sZW5ndGg7XHJcblx0XHR9XHJcblx0XHRmb3IgKHZhciBpID0gc3RhcnRJbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcblx0XHRcdHZhciBjdXJyZW50SXRlbSA9IGFycmF5VG9TZWFyY2hbaV07XHJcblx0XHRcdGlmIChmaWx0ZXJDYWxsYmFjayhjdXJyZW50SXRlbSkpIHtcclxuXHRcdFx0XHRyZXR1cm4gY3VycmVudEl0ZW07XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9O1xyXG5cclxuXHQvLyAtLSBNYXRoIG1ldGhvZHNcclxuXHRoZWxwZXJzLmlzTnVtYmVyID0gZnVuY3Rpb24obikge1xyXG5cdFx0cmV0dXJuICFpc05hTihwYXJzZUZsb2F0KG4pKSAmJiBpc0Zpbml0ZShuKTtcclxuXHR9O1xyXG5cdGhlbHBlcnMuYWxtb3N0RXF1YWxzID0gZnVuY3Rpb24oeCwgeSwgZXBzaWxvbikge1xyXG5cdFx0cmV0dXJuIE1hdGguYWJzKHggLSB5KSA8IGVwc2lsb247XHJcblx0fTtcclxuXHRoZWxwZXJzLmFsbW9zdFdob2xlID0gZnVuY3Rpb24oeCwgZXBzaWxvbikge1xyXG5cdFx0dmFyIHJvdW5kZWQgPSBNYXRoLnJvdW5kKHgpO1xyXG5cdFx0cmV0dXJuICgoKHJvdW5kZWQgLSBlcHNpbG9uKSA8IHgpICYmICgocm91bmRlZCArIGVwc2lsb24pID4geCkpO1xyXG5cdH07XHJcblx0aGVscGVycy5tYXggPSBmdW5jdGlvbihhcnJheSkge1xyXG5cdFx0cmV0dXJuIGFycmF5LnJlZHVjZShmdW5jdGlvbihtYXgsIHZhbHVlKSB7XHJcblx0XHRcdGlmICghaXNOYU4odmFsdWUpKSB7XHJcblx0XHRcdFx0cmV0dXJuIE1hdGgubWF4KG1heCwgdmFsdWUpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBtYXg7XHJcblx0XHR9LCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpO1xyXG5cdH07XHJcblx0aGVscGVycy5taW4gPSBmdW5jdGlvbihhcnJheSkge1xyXG5cdFx0cmV0dXJuIGFycmF5LnJlZHVjZShmdW5jdGlvbihtaW4sIHZhbHVlKSB7XHJcblx0XHRcdGlmICghaXNOYU4odmFsdWUpKSB7XHJcblx0XHRcdFx0cmV0dXJuIE1hdGgubWluKG1pbiwgdmFsdWUpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBtaW47XHJcblx0XHR9LCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xyXG5cdH07XHJcblx0aGVscGVycy5zaWduID0gTWF0aC5zaWduID9cclxuXHRcdGZ1bmN0aW9uKHgpIHtcclxuXHRcdFx0cmV0dXJuIE1hdGguc2lnbih4KTtcclxuXHRcdH0gOlxyXG5cdFx0ZnVuY3Rpb24oeCkge1xyXG5cdFx0XHR4ID0gK3g7IC8vIGNvbnZlcnQgdG8gYSBudW1iZXJcclxuXHRcdFx0aWYgKHggPT09IDAgfHwgaXNOYU4oeCkpIHtcclxuXHRcdFx0XHRyZXR1cm4geDtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4geCA+IDAgPyAxIDogLTE7XHJcblx0XHR9O1xyXG5cdGhlbHBlcnMubG9nMTAgPSBNYXRoLmxvZzEwID9cclxuXHRcdGZ1bmN0aW9uKHgpIHtcclxuXHRcdFx0cmV0dXJuIE1hdGgubG9nMTAoeCk7XHJcblx0XHR9IDpcclxuXHRcdGZ1bmN0aW9uKHgpIHtcclxuXHRcdFx0dmFyIGV4cG9uZW50ID0gTWF0aC5sb2coeCkgKiBNYXRoLkxPRzEwRTsgLy8gTWF0aC5MT0cxMEUgPSAxIC8gTWF0aC5MTjEwLlxyXG5cdFx0XHQvLyBDaGVjayBmb3Igd2hvbGUgcG93ZXJzIG9mIDEwLFxyXG5cdFx0XHQvLyB3aGljaCBkdWUgdG8gZmxvYXRpbmcgcG9pbnQgcm91bmRpbmcgZXJyb3Igc2hvdWxkIGJlIGNvcnJlY3RlZC5cclxuXHRcdFx0dmFyIHBvd2VyT2YxMCA9IE1hdGgucm91bmQoZXhwb25lbnQpO1xyXG5cdFx0XHR2YXIgaXNQb3dlck9mMTAgPSB4ID09PSBNYXRoLnBvdygxMCwgcG93ZXJPZjEwKTtcclxuXHJcblx0XHRcdHJldHVybiBpc1Bvd2VyT2YxMCA/IHBvd2VyT2YxMCA6IGV4cG9uZW50O1xyXG5cdFx0fTtcclxuXHRoZWxwZXJzLnRvUmFkaWFucyA9IGZ1bmN0aW9uKGRlZ3JlZXMpIHtcclxuXHRcdHJldHVybiBkZWdyZWVzICogKE1hdGguUEkgLyAxODApO1xyXG5cdH07XHJcblx0aGVscGVycy50b0RlZ3JlZXMgPSBmdW5jdGlvbihyYWRpYW5zKSB7XHJcblx0XHRyZXR1cm4gcmFkaWFucyAqICgxODAgLyBNYXRoLlBJKTtcclxuXHR9O1xyXG5cdC8vIEdldHMgdGhlIGFuZ2xlIGZyb20gdmVydGljYWwgdXByaWdodCB0byB0aGUgcG9pbnQgYWJvdXQgYSBjZW50cmUuXHJcblx0aGVscGVycy5nZXRBbmdsZUZyb21Qb2ludCA9IGZ1bmN0aW9uKGNlbnRyZVBvaW50LCBhbmdsZVBvaW50KSB7XHJcblx0XHR2YXIgZGlzdGFuY2VGcm9tWENlbnRlciA9IGFuZ2xlUG9pbnQueCAtIGNlbnRyZVBvaW50Lng7XHJcblx0XHR2YXIgZGlzdGFuY2VGcm9tWUNlbnRlciA9IGFuZ2xlUG9pbnQueSAtIGNlbnRyZVBvaW50Lnk7XHJcblx0XHR2YXIgcmFkaWFsRGlzdGFuY2VGcm9tQ2VudGVyID0gTWF0aC5zcXJ0KGRpc3RhbmNlRnJvbVhDZW50ZXIgKiBkaXN0YW5jZUZyb21YQ2VudGVyICsgZGlzdGFuY2VGcm9tWUNlbnRlciAqIGRpc3RhbmNlRnJvbVlDZW50ZXIpO1xyXG5cclxuXHRcdHZhciBhbmdsZSA9IE1hdGguYXRhbjIoZGlzdGFuY2VGcm9tWUNlbnRlciwgZGlzdGFuY2VGcm9tWENlbnRlcik7XHJcblxyXG5cdFx0aWYgKGFuZ2xlIDwgKC0wLjUgKiBNYXRoLlBJKSkge1xyXG5cdFx0XHRhbmdsZSArPSAyLjAgKiBNYXRoLlBJOyAvLyBtYWtlIHN1cmUgdGhlIHJldHVybmVkIGFuZ2xlIGlzIGluIHRoZSByYW5nZSBvZiAoLVBJLzIsIDNQSS8yXVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB7XHJcblx0XHRcdGFuZ2xlOiBhbmdsZSxcclxuXHRcdFx0ZGlzdGFuY2U6IHJhZGlhbERpc3RhbmNlRnJvbUNlbnRlclxyXG5cdFx0fTtcclxuXHR9O1xyXG5cdGhlbHBlcnMuZGlzdGFuY2VCZXR3ZWVuUG9pbnRzID0gZnVuY3Rpb24ocHQxLCBwdDIpIHtcclxuXHRcdHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3cocHQyLnggLSBwdDEueCwgMikgKyBNYXRoLnBvdyhwdDIueSAtIHB0MS55LCAyKSk7XHJcblx0fTtcclxuXHRoZWxwZXJzLmFsaWFzUGl4ZWwgPSBmdW5jdGlvbihwaXhlbFdpZHRoKSB7XHJcblx0XHRyZXR1cm4gKHBpeGVsV2lkdGggJSAyID09PSAwKSA/IDAgOiAwLjU7XHJcblx0fTtcclxuXHRoZWxwZXJzLnNwbGluZUN1cnZlID0gZnVuY3Rpb24oZmlyc3RQb2ludCwgbWlkZGxlUG9pbnQsIGFmdGVyUG9pbnQsIHQpIHtcclxuXHRcdC8vIFByb3BzIHRvIFJvYiBTcGVuY2VyIGF0IHNjYWxlZCBpbm5vdmF0aW9uIGZvciBoaXMgcG9zdCBvbiBzcGxpbmluZyBiZXR3ZWVuIHBvaW50c1xyXG5cdFx0Ly8gaHR0cDovL3NjYWxlZGlubm92YXRpb24uY29tL2FuYWx5dGljcy9zcGxpbmVzL2Fib3V0U3BsaW5lcy5odG1sXHJcblxyXG5cdFx0Ly8gVGhpcyBmdW5jdGlvbiBtdXN0IGFsc28gcmVzcGVjdCBcInNraXBwZWRcIiBwb2ludHNcclxuXHJcblx0XHR2YXIgcHJldmlvdXMgPSBmaXJzdFBvaW50LnNraXAgPyBtaWRkbGVQb2ludCA6IGZpcnN0UG9pbnQ7XHJcblx0XHR2YXIgY3VycmVudCA9IG1pZGRsZVBvaW50O1xyXG5cdFx0dmFyIG5leHQgPSBhZnRlclBvaW50LnNraXAgPyBtaWRkbGVQb2ludCA6IGFmdGVyUG9pbnQ7XHJcblxyXG5cdFx0dmFyIGQwMSA9IE1hdGguc3FydChNYXRoLnBvdyhjdXJyZW50LnggLSBwcmV2aW91cy54LCAyKSArIE1hdGgucG93KGN1cnJlbnQueSAtIHByZXZpb3VzLnksIDIpKTtcclxuXHRcdHZhciBkMTIgPSBNYXRoLnNxcnQoTWF0aC5wb3cobmV4dC54IC0gY3VycmVudC54LCAyKSArIE1hdGgucG93KG5leHQueSAtIGN1cnJlbnQueSwgMikpO1xyXG5cclxuXHRcdHZhciBzMDEgPSBkMDEgLyAoZDAxICsgZDEyKTtcclxuXHRcdHZhciBzMTIgPSBkMTIgLyAoZDAxICsgZDEyKTtcclxuXHJcblx0XHQvLyBJZiBhbGwgcG9pbnRzIGFyZSB0aGUgc2FtZSwgczAxICYgczAyIHdpbGwgYmUgaW5mXHJcblx0XHRzMDEgPSBpc05hTihzMDEpID8gMCA6IHMwMTtcclxuXHRcdHMxMiA9IGlzTmFOKHMxMikgPyAwIDogczEyO1xyXG5cclxuXHRcdHZhciBmYSA9IHQgKiBzMDE7IC8vIHNjYWxpbmcgZmFjdG9yIGZvciB0cmlhbmdsZSBUYVxyXG5cdFx0dmFyIGZiID0gdCAqIHMxMjtcclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRwcmV2aW91czoge1xyXG5cdFx0XHRcdHg6IGN1cnJlbnQueCAtIGZhICogKG5leHQueCAtIHByZXZpb3VzLngpLFxyXG5cdFx0XHRcdHk6IGN1cnJlbnQueSAtIGZhICogKG5leHQueSAtIHByZXZpb3VzLnkpXHJcblx0XHRcdH0sXHJcblx0XHRcdG5leHQ6IHtcclxuXHRcdFx0XHR4OiBjdXJyZW50LnggKyBmYiAqIChuZXh0LnggLSBwcmV2aW91cy54KSxcclxuXHRcdFx0XHR5OiBjdXJyZW50LnkgKyBmYiAqIChuZXh0LnkgLSBwcmV2aW91cy55KVxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cdH07XHJcblx0aGVscGVycy5FUFNJTE9OID0gTnVtYmVyLkVQU0lMT04gfHwgMWUtMTQ7XHJcblx0aGVscGVycy5zcGxpbmVDdXJ2ZU1vbm90b25lID0gZnVuY3Rpb24ocG9pbnRzKSB7XHJcblx0XHQvLyBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgQsOpemllciBjb250cm9sIHBvaW50cyBpbiBhIHNpbWlsYXIgd2F5IHRoYW4gfHNwbGluZUN1cnZlfCxcclxuXHRcdC8vIGJ1dCBwcmVzZXJ2ZXMgbW9ub3RvbmljaXR5IG9mIHRoZSBwcm92aWRlZCBkYXRhIGFuZCBlbnN1cmVzIG5vIGxvY2FsIGV4dHJlbXVtcyBhcmUgYWRkZWRcclxuXHRcdC8vIGJldHdlZW4gdGhlIGRhdGFzZXQgZGlzY3JldGUgcG9pbnRzIGR1ZSB0byB0aGUgaW50ZXJwb2xhdGlvbi5cclxuXHRcdC8vIFNlZSA6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01vbm90b25lX2N1YmljX2ludGVycG9sYXRpb25cclxuXHJcblx0XHR2YXIgcG9pbnRzV2l0aFRhbmdlbnRzID0gKHBvaW50cyB8fCBbXSkubWFwKGZ1bmN0aW9uKHBvaW50KSB7XHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0bW9kZWw6IHBvaW50Ll9tb2RlbCxcclxuXHRcdFx0XHRkZWx0YUs6IDAsXHJcblx0XHRcdFx0bUs6IDBcclxuXHRcdFx0fTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIENhbGN1bGF0ZSBzbG9wZXMgKGRlbHRhSykgYW5kIGluaXRpYWxpemUgdGFuZ2VudHMgKG1LKVxyXG5cdFx0dmFyIHBvaW50c0xlbiA9IHBvaW50c1dpdGhUYW5nZW50cy5sZW5ndGg7XHJcblx0XHR2YXIgaSwgcG9pbnRCZWZvcmUsIHBvaW50Q3VycmVudCwgcG9pbnRBZnRlcjtcclxuXHRcdGZvciAoaSA9IDA7IGkgPCBwb2ludHNMZW47ICsraSkge1xyXG5cdFx0XHRwb2ludEN1cnJlbnQgPSBwb2ludHNXaXRoVGFuZ2VudHNbaV07XHJcblx0XHRcdGlmIChwb2ludEN1cnJlbnQubW9kZWwuc2tpcCkge1xyXG5cdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRwb2ludEJlZm9yZSA9IGkgPiAwID8gcG9pbnRzV2l0aFRhbmdlbnRzW2kgLSAxXSA6IG51bGw7XHJcblx0XHRcdHBvaW50QWZ0ZXIgPSBpIDwgcG9pbnRzTGVuIC0gMSA/IHBvaW50c1dpdGhUYW5nZW50c1tpICsgMV0gOiBudWxsO1xyXG5cdFx0XHRpZiAocG9pbnRBZnRlciAmJiAhcG9pbnRBZnRlci5tb2RlbC5za2lwKSB7XHJcblx0XHRcdFx0dmFyIHNsb3BlRGVsdGFYID0gKHBvaW50QWZ0ZXIubW9kZWwueCAtIHBvaW50Q3VycmVudC5tb2RlbC54KTtcclxuXHJcblx0XHRcdFx0Ly8gSW4gdGhlIGNhc2Ugb2YgdHdvIHBvaW50cyB0aGF0IGFwcGVhciBhdCB0aGUgc2FtZSB4IHBpeGVsLCBzbG9wZURlbHRhWCBpcyAwXHJcblx0XHRcdFx0cG9pbnRDdXJyZW50LmRlbHRhSyA9IHNsb3BlRGVsdGFYICE9PSAwID8gKHBvaW50QWZ0ZXIubW9kZWwueSAtIHBvaW50Q3VycmVudC5tb2RlbC55KSAvIHNsb3BlRGVsdGFYIDogMDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKCFwb2ludEJlZm9yZSB8fCBwb2ludEJlZm9yZS5tb2RlbC5za2lwKSB7XHJcblx0XHRcdFx0cG9pbnRDdXJyZW50Lm1LID0gcG9pbnRDdXJyZW50LmRlbHRhSztcclxuXHRcdFx0fSBlbHNlIGlmICghcG9pbnRBZnRlciB8fCBwb2ludEFmdGVyLm1vZGVsLnNraXApIHtcclxuXHRcdFx0XHRwb2ludEN1cnJlbnQubUsgPSBwb2ludEJlZm9yZS5kZWx0YUs7XHJcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5zaWduKHBvaW50QmVmb3JlLmRlbHRhSykgIT09IHRoaXMuc2lnbihwb2ludEN1cnJlbnQuZGVsdGFLKSkge1xyXG5cdFx0XHRcdHBvaW50Q3VycmVudC5tSyA9IDA7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cG9pbnRDdXJyZW50Lm1LID0gKHBvaW50QmVmb3JlLmRlbHRhSyArIHBvaW50Q3VycmVudC5kZWx0YUspIC8gMjtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEFkanVzdCB0YW5nZW50cyB0byBlbnN1cmUgbW9ub3RvbmljIHByb3BlcnRpZXNcclxuXHRcdHZhciBhbHBoYUssIGJldGFLLCB0YXVLLCBzcXVhcmVkTWFnbml0dWRlO1xyXG5cdFx0Zm9yIChpID0gMDsgaSA8IHBvaW50c0xlbiAtIDE7ICsraSkge1xyXG5cdFx0XHRwb2ludEN1cnJlbnQgPSBwb2ludHNXaXRoVGFuZ2VudHNbaV07XHJcblx0XHRcdHBvaW50QWZ0ZXIgPSBwb2ludHNXaXRoVGFuZ2VudHNbaSArIDFdO1xyXG5cdFx0XHRpZiAocG9pbnRDdXJyZW50Lm1vZGVsLnNraXAgfHwgcG9pbnRBZnRlci5tb2RlbC5za2lwKSB7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmIChoZWxwZXJzLmFsbW9zdEVxdWFscyhwb2ludEN1cnJlbnQuZGVsdGFLLCAwLCB0aGlzLkVQU0lMT04pKSB7XHJcblx0XHRcdFx0cG9pbnRDdXJyZW50Lm1LID0gcG9pbnRBZnRlci5tSyA9IDA7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGFscGhhSyA9IHBvaW50Q3VycmVudC5tSyAvIHBvaW50Q3VycmVudC5kZWx0YUs7XHJcblx0XHRcdGJldGFLID0gcG9pbnRBZnRlci5tSyAvIHBvaW50Q3VycmVudC5kZWx0YUs7XHJcblx0XHRcdHNxdWFyZWRNYWduaXR1ZGUgPSBNYXRoLnBvdyhhbHBoYUssIDIpICsgTWF0aC5wb3coYmV0YUssIDIpO1xyXG5cdFx0XHRpZiAoc3F1YXJlZE1hZ25pdHVkZSA8PSA5KSB7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRhdUsgPSAzIC8gTWF0aC5zcXJ0KHNxdWFyZWRNYWduaXR1ZGUpO1xyXG5cdFx0XHRwb2ludEN1cnJlbnQubUsgPSBhbHBoYUsgKiB0YXVLICogcG9pbnRDdXJyZW50LmRlbHRhSztcclxuXHRcdFx0cG9pbnRBZnRlci5tSyA9IGJldGFLICogdGF1SyAqIHBvaW50Q3VycmVudC5kZWx0YUs7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ29tcHV0ZSBjb250cm9sIHBvaW50c1xyXG5cdFx0dmFyIGRlbHRhWDtcclxuXHRcdGZvciAoaSA9IDA7IGkgPCBwb2ludHNMZW47ICsraSkge1xyXG5cdFx0XHRwb2ludEN1cnJlbnQgPSBwb2ludHNXaXRoVGFuZ2VudHNbaV07XHJcblx0XHRcdGlmIChwb2ludEN1cnJlbnQubW9kZWwuc2tpcCkge1xyXG5cdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRwb2ludEJlZm9yZSA9IGkgPiAwID8gcG9pbnRzV2l0aFRhbmdlbnRzW2kgLSAxXSA6IG51bGw7XHJcblx0XHRcdHBvaW50QWZ0ZXIgPSBpIDwgcG9pbnRzTGVuIC0gMSA/IHBvaW50c1dpdGhUYW5nZW50c1tpICsgMV0gOiBudWxsO1xyXG5cdFx0XHRpZiAocG9pbnRCZWZvcmUgJiYgIXBvaW50QmVmb3JlLm1vZGVsLnNraXApIHtcclxuXHRcdFx0XHRkZWx0YVggPSAocG9pbnRDdXJyZW50Lm1vZGVsLnggLSBwb2ludEJlZm9yZS5tb2RlbC54KSAvIDM7XHJcblx0XHRcdFx0cG9pbnRDdXJyZW50Lm1vZGVsLmNvbnRyb2xQb2ludFByZXZpb3VzWCA9IHBvaW50Q3VycmVudC5tb2RlbC54IC0gZGVsdGFYO1xyXG5cdFx0XHRcdHBvaW50Q3VycmVudC5tb2RlbC5jb250cm9sUG9pbnRQcmV2aW91c1kgPSBwb2ludEN1cnJlbnQubW9kZWwueSAtIGRlbHRhWCAqIHBvaW50Q3VycmVudC5tSztcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAocG9pbnRBZnRlciAmJiAhcG9pbnRBZnRlci5tb2RlbC5za2lwKSB7XHJcblx0XHRcdFx0ZGVsdGFYID0gKHBvaW50QWZ0ZXIubW9kZWwueCAtIHBvaW50Q3VycmVudC5tb2RlbC54KSAvIDM7XHJcblx0XHRcdFx0cG9pbnRDdXJyZW50Lm1vZGVsLmNvbnRyb2xQb2ludE5leHRYID0gcG9pbnRDdXJyZW50Lm1vZGVsLnggKyBkZWx0YVg7XHJcblx0XHRcdFx0cG9pbnRDdXJyZW50Lm1vZGVsLmNvbnRyb2xQb2ludE5leHRZID0gcG9pbnRDdXJyZW50Lm1vZGVsLnkgKyBkZWx0YVggKiBwb2ludEN1cnJlbnQubUs7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9O1xyXG5cdGhlbHBlcnMubmV4dEl0ZW0gPSBmdW5jdGlvbihjb2xsZWN0aW9uLCBpbmRleCwgbG9vcCkge1xyXG5cdFx0aWYgKGxvb3ApIHtcclxuXHRcdFx0cmV0dXJuIGluZGV4ID49IGNvbGxlY3Rpb24ubGVuZ3RoIC0gMSA/IGNvbGxlY3Rpb25bMF0gOiBjb2xsZWN0aW9uW2luZGV4ICsgMV07XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gaW5kZXggPj0gY29sbGVjdGlvbi5sZW5ndGggLSAxID8gY29sbGVjdGlvbltjb2xsZWN0aW9uLmxlbmd0aCAtIDFdIDogY29sbGVjdGlvbltpbmRleCArIDFdO1xyXG5cdH07XHJcblx0aGVscGVycy5wcmV2aW91c0l0ZW0gPSBmdW5jdGlvbihjb2xsZWN0aW9uLCBpbmRleCwgbG9vcCkge1xyXG5cdFx0aWYgKGxvb3ApIHtcclxuXHRcdFx0cmV0dXJuIGluZGV4IDw9IDAgPyBjb2xsZWN0aW9uW2NvbGxlY3Rpb24ubGVuZ3RoIC0gMV0gOiBjb2xsZWN0aW9uW2luZGV4IC0gMV07XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gaW5kZXggPD0gMCA/IGNvbGxlY3Rpb25bMF0gOiBjb2xsZWN0aW9uW2luZGV4IC0gMV07XHJcblx0fTtcclxuXHQvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgbmljZSBudW1iZXIgYWxnb3JpdGhtIHVzZWQgaW4gZGV0ZXJtaW5pbmcgd2hlcmUgYXhpcyBsYWJlbHMgd2lsbCBnb1xyXG5cdGhlbHBlcnMubmljZU51bSA9IGZ1bmN0aW9uKHJhbmdlLCByb3VuZCkge1xyXG5cdFx0dmFyIGV4cG9uZW50ID0gTWF0aC5mbG9vcihoZWxwZXJzLmxvZzEwKHJhbmdlKSk7XHJcblx0XHR2YXIgZnJhY3Rpb24gPSByYW5nZSAvIE1hdGgucG93KDEwLCBleHBvbmVudCk7XHJcblx0XHR2YXIgbmljZUZyYWN0aW9uO1xyXG5cclxuXHRcdGlmIChyb3VuZCkge1xyXG5cdFx0XHRpZiAoZnJhY3Rpb24gPCAxLjUpIHtcclxuXHRcdFx0XHRuaWNlRnJhY3Rpb24gPSAxO1xyXG5cdFx0XHR9IGVsc2UgaWYgKGZyYWN0aW9uIDwgMykge1xyXG5cdFx0XHRcdG5pY2VGcmFjdGlvbiA9IDI7XHJcblx0XHRcdH0gZWxzZSBpZiAoZnJhY3Rpb24gPCA3KSB7XHJcblx0XHRcdFx0bmljZUZyYWN0aW9uID0gNTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRuaWNlRnJhY3Rpb24gPSAxMDtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmIChmcmFjdGlvbiA8PSAxLjApIHtcclxuXHRcdFx0bmljZUZyYWN0aW9uID0gMTtcclxuXHRcdH0gZWxzZSBpZiAoZnJhY3Rpb24gPD0gMikge1xyXG5cdFx0XHRuaWNlRnJhY3Rpb24gPSAyO1xyXG5cdFx0fSBlbHNlIGlmIChmcmFjdGlvbiA8PSA1KSB7XHJcblx0XHRcdG5pY2VGcmFjdGlvbiA9IDU7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRuaWNlRnJhY3Rpb24gPSAxMDtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gbmljZUZyYWN0aW9uICogTWF0aC5wb3coMTAsIGV4cG9uZW50KTtcclxuXHR9O1xyXG5cdC8vIFJlcXVlc3QgYW5pbWF0aW9uIHBvbHlmaWxsIC0gaHR0cDovL3d3dy5wYXVsaXJpc2guY29tLzIwMTEvcmVxdWVzdGFuaW1hdGlvbmZyYW1lLWZvci1zbWFydC1hbmltYXRpbmcvXHJcblx0aGVscGVycy5yZXF1ZXN0QW5pbUZyYW1lID0gKGZ1bmN0aW9uKCkge1xyXG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XHJcblx0XHRcdHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykge1xyXG5cdFx0XHRcdGNhbGxiYWNrKCk7XHJcblx0XHRcdH07XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxyXG5cdFx0XHR3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XHJcblx0XHRcdHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcclxuXHRcdFx0d2luZG93Lm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcclxuXHRcdFx0d2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XHJcblx0XHRcdGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcblx0XHRcdFx0cmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGNhbGxiYWNrLCAxMDAwIC8gNjApO1xyXG5cdFx0XHR9O1xyXG5cdH0oKSk7XHJcblx0Ly8gLS0gRE9NIG1ldGhvZHNcclxuXHRoZWxwZXJzLmdldFJlbGF0aXZlUG9zaXRpb24gPSBmdW5jdGlvbihldnQsIGNoYXJ0KSB7XHJcblx0XHR2YXIgbW91c2VYLCBtb3VzZVk7XHJcblx0XHR2YXIgZSA9IGV2dC5vcmlnaW5hbEV2ZW50IHx8IGV2dDtcclxuXHRcdHZhciBjYW52YXMgPSBldnQudGFyZ2V0IHx8IGV2dC5zcmNFbGVtZW50O1xyXG5cdFx0dmFyIGJvdW5kaW5nUmVjdCA9IGNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcblx0XHR2YXIgdG91Y2hlcyA9IGUudG91Y2hlcztcclxuXHRcdGlmICh0b3VjaGVzICYmIHRvdWNoZXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRtb3VzZVggPSB0b3VjaGVzWzBdLmNsaWVudFg7XHJcblx0XHRcdG1vdXNlWSA9IHRvdWNoZXNbMF0uY2xpZW50WTtcclxuXHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRtb3VzZVggPSBlLmNsaWVudFg7XHJcblx0XHRcdG1vdXNlWSA9IGUuY2xpZW50WTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBTY2FsZSBtb3VzZSBjb29yZGluYXRlcyBpbnRvIGNhbnZhcyBjb29yZGluYXRlc1xyXG5cdFx0Ly8gYnkgZm9sbG93aW5nIHRoZSBwYXR0ZXJuIGxhaWQgb3V0IGJ5ICdqZXJyeWonIGluIHRoZSBjb21tZW50cyBvZlxyXG5cdFx0Ly8gaHR0cDovL3d3dy5odG1sNWNhbnZhc3R1dG9yaWFscy5jb20vYWR2YW5jZWQvaHRtbDUtY2FudmFzLW1vdXNlLWNvb3JkaW5hdGVzL1xyXG5cdFx0dmFyIHBhZGRpbmdMZWZ0ID0gcGFyc2VGbG9hdChoZWxwZXJzLmdldFN0eWxlKGNhbnZhcywgJ3BhZGRpbmctbGVmdCcpKTtcclxuXHRcdHZhciBwYWRkaW5nVG9wID0gcGFyc2VGbG9hdChoZWxwZXJzLmdldFN0eWxlKGNhbnZhcywgJ3BhZGRpbmctdG9wJykpO1xyXG5cdFx0dmFyIHBhZGRpbmdSaWdodCA9IHBhcnNlRmxvYXQoaGVscGVycy5nZXRTdHlsZShjYW52YXMsICdwYWRkaW5nLXJpZ2h0JykpO1xyXG5cdFx0dmFyIHBhZGRpbmdCb3R0b20gPSBwYXJzZUZsb2F0KGhlbHBlcnMuZ2V0U3R5bGUoY2FudmFzLCAncGFkZGluZy1ib3R0b20nKSk7XHJcblx0XHR2YXIgd2lkdGggPSBib3VuZGluZ1JlY3QucmlnaHQgLSBib3VuZGluZ1JlY3QubGVmdCAtIHBhZGRpbmdMZWZ0IC0gcGFkZGluZ1JpZ2h0O1xyXG5cdFx0dmFyIGhlaWdodCA9IGJvdW5kaW5nUmVjdC5ib3R0b20gLSBib3VuZGluZ1JlY3QudG9wIC0gcGFkZGluZ1RvcCAtIHBhZGRpbmdCb3R0b207XHJcblxyXG5cdFx0Ly8gV2UgZGl2aWRlIGJ5IHRoZSBjdXJyZW50IGRldmljZSBwaXhlbCByYXRpbywgYmVjYXVzZSB0aGUgY2FudmFzIGlzIHNjYWxlZCB1cCBieSB0aGF0IGFtb3VudCBpbiBlYWNoIGRpcmVjdGlvbi4gSG93ZXZlclxyXG5cdFx0Ly8gdGhlIGJhY2tlbmQgbW9kZWwgaXMgaW4gdW5zY2FsZWQgY29vcmRpbmF0ZXMuIFNpbmNlIHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGggb3VyIG1vZGVsIGNvb3JkaW5hdGVzLCB3ZSBnbyBiYWNrIGhlcmVcclxuXHRcdG1vdXNlWCA9IE1hdGgucm91bmQoKG1vdXNlWCAtIGJvdW5kaW5nUmVjdC5sZWZ0IC0gcGFkZGluZ0xlZnQpIC8gKHdpZHRoKSAqIGNhbnZhcy53aWR0aCAvIGNoYXJ0LmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvKTtcclxuXHRcdG1vdXNlWSA9IE1hdGgucm91bmQoKG1vdXNlWSAtIGJvdW5kaW5nUmVjdC50b3AgLSBwYWRkaW5nVG9wKSAvIChoZWlnaHQpICogY2FudmFzLmhlaWdodCAvIGNoYXJ0LmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvKTtcclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHR4OiBtb3VzZVgsXHJcblx0XHRcdHk6IG1vdXNlWVxyXG5cdFx0fTtcclxuXHJcblx0fTtcclxuXHJcblx0Ly8gUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gdG8gY29udmVydCBtYXgtd2lkdGgvbWF4LWhlaWdodCB2YWx1ZXMgdGhhdCBtYXkgYmUgcGVyY2VudGFnZXMgaW50byBhIG51bWJlclxyXG5cdGZ1bmN0aW9uIHBhcnNlTWF4U3R5bGUoc3R5bGVWYWx1ZSwgbm9kZSwgcGFyZW50UHJvcGVydHkpIHtcclxuXHRcdHZhciB2YWx1ZUluUGl4ZWxzO1xyXG5cdFx0aWYgKHR5cGVvZiBzdHlsZVZhbHVlID09PSAnc3RyaW5nJykge1xyXG5cdFx0XHR2YWx1ZUluUGl4ZWxzID0gcGFyc2VJbnQoc3R5bGVWYWx1ZSwgMTApO1xyXG5cclxuXHRcdFx0aWYgKHN0eWxlVmFsdWUuaW5kZXhPZignJScpICE9PSAtMSkge1xyXG5cdFx0XHRcdC8vIHBlcmNlbnRhZ2UgKiBzaXplIGluIGRpbWVuc2lvblxyXG5cdFx0XHRcdHZhbHVlSW5QaXhlbHMgPSB2YWx1ZUluUGl4ZWxzIC8gMTAwICogbm9kZS5wYXJlbnROb2RlW3BhcmVudFByb3BlcnR5XTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dmFsdWVJblBpeGVscyA9IHN0eWxlVmFsdWU7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHZhbHVlSW5QaXhlbHM7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGlmIHRoZSBnaXZlbiB2YWx1ZSBjb250YWlucyBhbiBlZmZlY3RpdmUgY29uc3RyYWludC5cclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqL1xyXG5cdGZ1bmN0aW9uIGlzQ29uc3RyYWluZWRWYWx1ZSh2YWx1ZSkge1xyXG5cdFx0cmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09ICdub25lJztcclxuXHR9XHJcblxyXG5cdC8vIFByaXZhdGUgaGVscGVyIHRvIGdldCBhIGNvbnN0cmFpbnQgZGltZW5zaW9uXHJcblx0Ly8gQHBhcmFtIGRvbU5vZGUgOiB0aGUgbm9kZSB0byBjaGVjayB0aGUgY29uc3RyYWludCBvblxyXG5cdC8vIEBwYXJhbSBtYXhTdHlsZSA6IHRoZSBzdHlsZSB0aGF0IGRlZmluZXMgdGhlIG1heGltdW0gZm9yIHRoZSBkaXJlY3Rpb24gd2UgYXJlIHVzaW5nIChtYXhXaWR0aCAvIG1heEhlaWdodClcclxuXHQvLyBAcGFyYW0gcGVyY2VudGFnZVByb3BlcnR5IDogcHJvcGVydHkgb2YgcGFyZW50IHRvIHVzZSB3aGVuIGNhbGN1bGF0aW5nIHdpZHRoIGFzIGEgcGVyY2VudGFnZVxyXG5cdC8vIEBzZWUgaHR0cDovL3d3dy5uYXRoYW5hZWxqb25lcy5jb20vYmxvZy8yMDEzL3JlYWRpbmctbWF4LXdpZHRoLWNyb3NzLWJyb3dzZXJcclxuXHRmdW5jdGlvbiBnZXRDb25zdHJhaW50RGltZW5zaW9uKGRvbU5vZGUsIG1heFN0eWxlLCBwZXJjZW50YWdlUHJvcGVydHkpIHtcclxuXHRcdHZhciB2aWV3ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXc7XHJcblx0XHR2YXIgcGFyZW50Tm9kZSA9IGhlbHBlcnMuX2dldFBhcmVudE5vZGUoZG9tTm9kZSk7XHJcblx0XHR2YXIgY29uc3RyYWluZWROb2RlID0gdmlldy5nZXRDb21wdXRlZFN0eWxlKGRvbU5vZGUpW21heFN0eWxlXTtcclxuXHRcdHZhciBjb25zdHJhaW5lZENvbnRhaW5lciA9IHZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnROb2RlKVttYXhTdHlsZV07XHJcblx0XHR2YXIgaGFzQ05vZGUgPSBpc0NvbnN0cmFpbmVkVmFsdWUoY29uc3RyYWluZWROb2RlKTtcclxuXHRcdHZhciBoYXNDQ29udGFpbmVyID0gaXNDb25zdHJhaW5lZFZhbHVlKGNvbnN0cmFpbmVkQ29udGFpbmVyKTtcclxuXHRcdHZhciBpbmZpbml0eSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcclxuXHJcblx0XHRpZiAoaGFzQ05vZGUgfHwgaGFzQ0NvbnRhaW5lcikge1xyXG5cdFx0XHRyZXR1cm4gTWF0aC5taW4oXHJcblx0XHRcdFx0aGFzQ05vZGUgPyBwYXJzZU1heFN0eWxlKGNvbnN0cmFpbmVkTm9kZSwgZG9tTm9kZSwgcGVyY2VudGFnZVByb3BlcnR5KSA6IGluZmluaXR5LFxyXG5cdFx0XHRcdGhhc0NDb250YWluZXIgPyBwYXJzZU1heFN0eWxlKGNvbnN0cmFpbmVkQ29udGFpbmVyLCBwYXJlbnROb2RlLCBwZXJjZW50YWdlUHJvcGVydHkpIDogaW5maW5pdHkpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiAnbm9uZSc7XHJcblx0fVxyXG5cdC8vIHJldHVybnMgTnVtYmVyIG9yIHVuZGVmaW5lZCBpZiBubyBjb25zdHJhaW50XHJcblx0aGVscGVycy5nZXRDb25zdHJhaW50V2lkdGggPSBmdW5jdGlvbihkb21Ob2RlKSB7XHJcblx0XHRyZXR1cm4gZ2V0Q29uc3RyYWludERpbWVuc2lvbihkb21Ob2RlLCAnbWF4LXdpZHRoJywgJ2NsaWVudFdpZHRoJyk7XHJcblx0fTtcclxuXHQvLyByZXR1cm5zIE51bWJlciBvciB1bmRlZmluZWQgaWYgbm8gY29uc3RyYWludFxyXG5cdGhlbHBlcnMuZ2V0Q29uc3RyYWludEhlaWdodCA9IGZ1bmN0aW9uKGRvbU5vZGUpIHtcclxuXHRcdHJldHVybiBnZXRDb25zdHJhaW50RGltZW5zaW9uKGRvbU5vZGUsICdtYXgtaGVpZ2h0JywgJ2NsaWVudEhlaWdodCcpO1xyXG5cdH07XHJcblx0LyoqXHJcblx0ICogQHByaXZhdGVcclxuIFx0ICovXHJcblx0aGVscGVycy5fY2FsY3VsYXRlUGFkZGluZyA9IGZ1bmN0aW9uKGNvbnRhaW5lciwgcGFkZGluZywgcGFyZW50RGltZW5zaW9uKSB7XHJcblx0XHRwYWRkaW5nID0gaGVscGVycy5nZXRTdHlsZShjb250YWluZXIsIHBhZGRpbmcpO1xyXG5cclxuXHRcdHJldHVybiBwYWRkaW5nLmluZGV4T2YoJyUnKSA+IC0xID8gcGFyZW50RGltZW5zaW9uIC8gcGFyc2VJbnQocGFkZGluZywgMTApIDogcGFyc2VJbnQocGFkZGluZywgMTApO1xyXG5cdH07XHJcblx0LyoqXHJcblx0ICogQHByaXZhdGVcclxuXHQgKi9cclxuXHRoZWxwZXJzLl9nZXRQYXJlbnROb2RlID0gZnVuY3Rpb24oZG9tTm9kZSkge1xyXG5cdFx0dmFyIHBhcmVudCA9IGRvbU5vZGUucGFyZW50Tm9kZTtcclxuXHRcdGlmIChwYXJlbnQgJiYgcGFyZW50Lmhvc3QpIHtcclxuXHRcdFx0cGFyZW50ID0gcGFyZW50Lmhvc3Q7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcGFyZW50O1xyXG5cdH07XHJcblx0aGVscGVycy5nZXRNYXhpbXVtV2lkdGggPSBmdW5jdGlvbihkb21Ob2RlKSB7XHJcblx0XHR2YXIgY29udGFpbmVyID0gaGVscGVycy5fZ2V0UGFyZW50Tm9kZShkb21Ob2RlKTtcclxuXHRcdGlmICghY29udGFpbmVyKSB7XHJcblx0XHRcdHJldHVybiBkb21Ob2RlLmNsaWVudFdpZHRoO1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBjbGllbnRXaWR0aCA9IGNvbnRhaW5lci5jbGllbnRXaWR0aDtcclxuXHRcdHZhciBwYWRkaW5nTGVmdCA9IGhlbHBlcnMuX2NhbGN1bGF0ZVBhZGRpbmcoY29udGFpbmVyLCAncGFkZGluZy1sZWZ0JywgY2xpZW50V2lkdGgpO1xyXG5cdFx0dmFyIHBhZGRpbmdSaWdodCA9IGhlbHBlcnMuX2NhbGN1bGF0ZVBhZGRpbmcoY29udGFpbmVyLCAncGFkZGluZy1yaWdodCcsIGNsaWVudFdpZHRoKTtcclxuXHJcblx0XHR2YXIgdyA9IGNsaWVudFdpZHRoIC0gcGFkZGluZ0xlZnQgLSBwYWRkaW5nUmlnaHQ7XHJcblx0XHR2YXIgY3cgPSBoZWxwZXJzLmdldENvbnN0cmFpbnRXaWR0aChkb21Ob2RlKTtcclxuXHRcdHJldHVybiBpc05hTihjdykgPyB3IDogTWF0aC5taW4odywgY3cpO1xyXG5cdH07XHJcblx0aGVscGVycy5nZXRNYXhpbXVtSGVpZ2h0ID0gZnVuY3Rpb24oZG9tTm9kZSkge1xyXG5cdFx0dmFyIGNvbnRhaW5lciA9IGhlbHBlcnMuX2dldFBhcmVudE5vZGUoZG9tTm9kZSk7XHJcblx0XHRpZiAoIWNvbnRhaW5lcikge1xyXG5cdFx0XHRyZXR1cm4gZG9tTm9kZS5jbGllbnRIZWlnaHQ7XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGNsaWVudEhlaWdodCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XHJcblx0XHR2YXIgcGFkZGluZ1RvcCA9IGhlbHBlcnMuX2NhbGN1bGF0ZVBhZGRpbmcoY29udGFpbmVyLCAncGFkZGluZy10b3AnLCBjbGllbnRIZWlnaHQpO1xyXG5cdFx0dmFyIHBhZGRpbmdCb3R0b20gPSBoZWxwZXJzLl9jYWxjdWxhdGVQYWRkaW5nKGNvbnRhaW5lciwgJ3BhZGRpbmctYm90dG9tJywgY2xpZW50SGVpZ2h0KTtcclxuXHJcblx0XHR2YXIgaCA9IGNsaWVudEhlaWdodCAtIHBhZGRpbmdUb3AgLSBwYWRkaW5nQm90dG9tO1xyXG5cdFx0dmFyIGNoID0gaGVscGVycy5nZXRDb25zdHJhaW50SGVpZ2h0KGRvbU5vZGUpO1xyXG5cdFx0cmV0dXJuIGlzTmFOKGNoKSA/IGggOiBNYXRoLm1pbihoLCBjaCk7XHJcblx0fTtcclxuXHRoZWxwZXJzLmdldFN0eWxlID0gZnVuY3Rpb24oZWwsIHByb3BlcnR5KSB7XHJcblx0XHRyZXR1cm4gZWwuY3VycmVudFN0eWxlID9cclxuXHRcdFx0ZWwuY3VycmVudFN0eWxlW3Byb3BlcnR5XSA6XHJcblx0XHRcdGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWwsIG51bGwpLmdldFByb3BlcnR5VmFsdWUocHJvcGVydHkpO1xyXG5cdH07XHJcblx0aGVscGVycy5yZXRpbmFTY2FsZSA9IGZ1bmN0aW9uKGNoYXJ0LCBmb3JjZVJhdGlvKSB7XHJcblx0XHR2YXIgcGl4ZWxSYXRpbyA9IGNoYXJ0LmN1cnJlbnREZXZpY2VQaXhlbFJhdGlvID0gZm9yY2VSYXRpbyB8fCAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRldmljZVBpeGVsUmF0aW8pIHx8IDE7XHJcblx0XHRpZiAocGl4ZWxSYXRpbyA9PT0gMSkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGNhbnZhcyA9IGNoYXJ0LmNhbnZhcztcclxuXHRcdHZhciBoZWlnaHQgPSBjaGFydC5oZWlnaHQ7XHJcblx0XHR2YXIgd2lkdGggPSBjaGFydC53aWR0aDtcclxuXHJcblx0XHRjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogcGl4ZWxSYXRpbztcclxuXHRcdGNhbnZhcy53aWR0aCA9IHdpZHRoICogcGl4ZWxSYXRpbztcclxuXHRcdGNoYXJ0LmN0eC5zY2FsZShwaXhlbFJhdGlvLCBwaXhlbFJhdGlvKTtcclxuXHJcblx0XHQvLyBJZiBubyBzdHlsZSBoYXMgYmVlbiBzZXQgb24gdGhlIGNhbnZhcywgdGhlIHJlbmRlciBzaXplIGlzIHVzZWQgYXMgZGlzcGxheSBzaXplLFxyXG5cdFx0Ly8gbWFraW5nIHRoZSBjaGFydCB2aXN1YWxseSBiaWdnZXIsIHNvIGxldCdzIGVuZm9yY2UgaXQgdG8gdGhlIFwiY29ycmVjdFwiIHZhbHVlcy5cclxuXHRcdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvMzU3NVxyXG5cdFx0aWYgKCFjYW52YXMuc3R5bGUuaGVpZ2h0ICYmICFjYW52YXMuc3R5bGUud2lkdGgpIHtcclxuXHRcdFx0Y2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XHJcblx0XHRcdGNhbnZhcy5zdHlsZS53aWR0aCA9IHdpZHRoICsgJ3B4JztcclxuXHRcdH1cclxuXHR9O1xyXG5cdC8vIC0tIENhbnZhcyBtZXRob2RzXHJcblx0aGVscGVycy5mb250U3RyaW5nID0gZnVuY3Rpb24ocGl4ZWxTaXplLCBmb250U3R5bGUsIGZvbnRGYW1pbHkpIHtcclxuXHRcdHJldHVybiBmb250U3R5bGUgKyAnICcgKyBwaXhlbFNpemUgKyAncHggJyArIGZvbnRGYW1pbHk7XHJcblx0fTtcclxuXHRoZWxwZXJzLmxvbmdlc3RUZXh0ID0gZnVuY3Rpb24oY3R4LCBmb250LCBhcnJheU9mVGhpbmdzLCBjYWNoZSkge1xyXG5cdFx0Y2FjaGUgPSBjYWNoZSB8fCB7fTtcclxuXHRcdHZhciBkYXRhID0gY2FjaGUuZGF0YSA9IGNhY2hlLmRhdGEgfHwge307XHJcblx0XHR2YXIgZ2MgPSBjYWNoZS5nYXJiYWdlQ29sbGVjdCA9IGNhY2hlLmdhcmJhZ2VDb2xsZWN0IHx8IFtdO1xyXG5cclxuXHRcdGlmIChjYWNoZS5mb250ICE9PSBmb250KSB7XHJcblx0XHRcdGRhdGEgPSBjYWNoZS5kYXRhID0ge307XHJcblx0XHRcdGdjID0gY2FjaGUuZ2FyYmFnZUNvbGxlY3QgPSBbXTtcclxuXHRcdFx0Y2FjaGUuZm9udCA9IGZvbnQ7XHJcblx0XHR9XHJcblxyXG5cdFx0Y3R4LmZvbnQgPSBmb250O1xyXG5cdFx0dmFyIGxvbmdlc3QgPSAwO1xyXG5cdFx0aGVscGVycy5lYWNoKGFycmF5T2ZUaGluZ3MsIGZ1bmN0aW9uKHRoaW5nKSB7XHJcblx0XHRcdC8vIFVuZGVmaW5lZCBzdHJpbmdzIGFuZCBhcnJheXMgc2hvdWxkIG5vdCBiZSBtZWFzdXJlZFxyXG5cdFx0XHRpZiAodGhpbmcgIT09IHVuZGVmaW5lZCAmJiB0aGluZyAhPT0gbnVsbCAmJiBoZWxwZXJzLmlzQXJyYXkodGhpbmcpICE9PSB0cnVlKSB7XHJcblx0XHRcdFx0bG9uZ2VzdCA9IGhlbHBlcnMubWVhc3VyZVRleHQoY3R4LCBkYXRhLCBnYywgbG9uZ2VzdCwgdGhpbmcpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKGhlbHBlcnMuaXNBcnJheSh0aGluZykpIHtcclxuXHRcdFx0XHQvLyBpZiBpdCBpcyBhbiBhcnJheSBsZXRzIG1lYXN1cmUgZWFjaCBlbGVtZW50XHJcblx0XHRcdFx0Ly8gdG8gZG8gbWF5YmUgc2ltcGxpZnkgdGhpcyBmdW5jdGlvbiBhIGJpdCBzbyB3ZSBjYW4gZG8gdGhpcyBtb3JlIHJlY3Vyc2l2ZWx5P1xyXG5cdFx0XHRcdGhlbHBlcnMuZWFjaCh0aGluZywgZnVuY3Rpb24obmVzdGVkVGhpbmcpIHtcclxuXHRcdFx0XHRcdC8vIFVuZGVmaW5lZCBzdHJpbmdzIGFuZCBhcnJheXMgc2hvdWxkIG5vdCBiZSBtZWFzdXJlZFxyXG5cdFx0XHRcdFx0aWYgKG5lc3RlZFRoaW5nICE9PSB1bmRlZmluZWQgJiYgbmVzdGVkVGhpbmcgIT09IG51bGwgJiYgIWhlbHBlcnMuaXNBcnJheShuZXN0ZWRUaGluZykpIHtcclxuXHRcdFx0XHRcdFx0bG9uZ2VzdCA9IGhlbHBlcnMubWVhc3VyZVRleHQoY3R4LCBkYXRhLCBnYywgbG9uZ2VzdCwgbmVzdGVkVGhpbmcpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHR2YXIgZ2NMZW4gPSBnYy5sZW5ndGggLyAyO1xyXG5cdFx0aWYgKGdjTGVuID4gYXJyYXlPZlRoaW5ncy5sZW5ndGgpIHtcclxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBnY0xlbjsgaSsrKSB7XHJcblx0XHRcdFx0ZGVsZXRlIGRhdGFbZ2NbaV1dO1xyXG5cdFx0XHR9XHJcblx0XHRcdGdjLnNwbGljZSgwLCBnY0xlbik7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gbG9uZ2VzdDtcclxuXHR9O1xyXG5cdGhlbHBlcnMubWVhc3VyZVRleHQgPSBmdW5jdGlvbihjdHgsIGRhdGEsIGdjLCBsb25nZXN0LCBzdHJpbmcpIHtcclxuXHRcdHZhciB0ZXh0V2lkdGggPSBkYXRhW3N0cmluZ107XHJcblx0XHRpZiAoIXRleHRXaWR0aCkge1xyXG5cdFx0XHR0ZXh0V2lkdGggPSBkYXRhW3N0cmluZ10gPSBjdHgubWVhc3VyZVRleHQoc3RyaW5nKS53aWR0aDtcclxuXHRcdFx0Z2MucHVzaChzdHJpbmcpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHRleHRXaWR0aCA+IGxvbmdlc3QpIHtcclxuXHRcdFx0bG9uZ2VzdCA9IHRleHRXaWR0aDtcclxuXHRcdH1cclxuXHRcdHJldHVybiBsb25nZXN0O1xyXG5cdH07XHJcblx0aGVscGVycy5udW1iZXJPZkxhYmVsTGluZXMgPSBmdW5jdGlvbihhcnJheU9mVGhpbmdzKSB7XHJcblx0XHR2YXIgbnVtYmVyT2ZMaW5lcyA9IDE7XHJcblx0XHRoZWxwZXJzLmVhY2goYXJyYXlPZlRoaW5ncywgZnVuY3Rpb24odGhpbmcpIHtcclxuXHRcdFx0aWYgKGhlbHBlcnMuaXNBcnJheSh0aGluZykpIHtcclxuXHRcdFx0XHRpZiAodGhpbmcubGVuZ3RoID4gbnVtYmVyT2ZMaW5lcykge1xyXG5cdFx0XHRcdFx0bnVtYmVyT2ZMaW5lcyA9IHRoaW5nLmxlbmd0aDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIG51bWJlck9mTGluZXM7XHJcblx0fTtcclxuXHJcblx0aGVscGVycy5jb2xvciA9ICFjb2xvciA/XHJcblx0XHRmdW5jdGlvbih2YWx1ZSkge1xyXG5cdFx0XHRjb25zb2xlLmVycm9yKCdDb2xvci5qcyBub3QgZm91bmQhJyk7XHJcblx0XHRcdHJldHVybiB2YWx1ZTtcclxuXHRcdH0gOlxyXG5cdFx0ZnVuY3Rpb24odmFsdWUpIHtcclxuXHRcdFx0LyogZ2xvYmFsIENhbnZhc0dyYWRpZW50ICovXHJcblx0XHRcdGlmICh2YWx1ZSBpbnN0YW5jZW9mIENhbnZhc0dyYWRpZW50KSB7XHJcblx0XHRcdFx0dmFsdWUgPSBkZWZhdWx0cy5nbG9iYWwuZGVmYXVsdENvbG9yO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gY29sb3IodmFsdWUpO1xyXG5cdFx0fTtcclxuXHJcblx0aGVscGVycy5nZXRIb3ZlckNvbG9yID0gZnVuY3Rpb24oY29sb3JWYWx1ZSkge1xyXG5cdFx0LyogZ2xvYmFsIENhbnZhc1BhdHRlcm4gKi9cclxuXHRcdHJldHVybiAoY29sb3JWYWx1ZSBpbnN0YW5jZW9mIENhbnZhc1BhdHRlcm4pID9cclxuXHRcdFx0Y29sb3JWYWx1ZSA6XHJcblx0XHRcdGhlbHBlcnMuY29sb3IoY29sb3JWYWx1ZSkuc2F0dXJhdGUoMC41KS5kYXJrZW4oMC4xKS5yZ2JTdHJpbmcoKTtcclxuXHR9O1xyXG59O1xyXG5cclxufSx7XCIyNlwiOjI2LFwiM1wiOjMsXCIzNFwiOjM0LFwiNDZcIjo0Nn1dLDI5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcclxuXHJcbi8qKlxyXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHJlbGF0aXZlIHBvc2l0aW9uIGZvciBhbiBldmVudFxyXG4gKiBAcGFyYW0ge0V2ZW50fElFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgdG8gZ2V0IHRoZSBwb3NpdGlvbiBmb3JcclxuICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSBUaGUgY2hhcnRcclxuICogQHJldHVybnMge1BvaW50fSB0aGUgZXZlbnQgcG9zaXRpb25cclxuICovXHJcbmZ1bmN0aW9uIGdldFJlbGF0aXZlUG9zaXRpb24oZSwgY2hhcnQpIHtcclxuXHRpZiAoZS5uYXRpdmUpIHtcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdHg6IGUueCxcclxuXHRcdFx0eTogZS55XHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIGhlbHBlcnMuZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gdHJhdmVyc2UgYWxsIG9mIHRoZSB2aXNpYmxlIGVsZW1lbnRzIGluIHRoZSBjaGFydFxyXG4gKiBAcGFyYW0gY2hhcnQge2NoYXJ0fSB0aGUgY2hhcnRcclxuICogQHBhcmFtIGhhbmRsZXIge0Z1bmN0aW9ufSB0aGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSBmb3IgZWFjaCB2aXNpYmxlIGl0ZW1cclxuICovXHJcbmZ1bmN0aW9uIHBhcnNlVmlzaWJsZUl0ZW1zKGNoYXJ0LCBoYW5kbGVyKSB7XHJcblx0dmFyIGRhdGFzZXRzID0gY2hhcnQuZGF0YS5kYXRhc2V0cztcclxuXHR2YXIgbWV0YSwgaSwgaiwgaWxlbiwgamxlbjtcclxuXHJcblx0Zm9yIChpID0gMCwgaWxlbiA9IGRhdGFzZXRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xyXG5cdFx0aWYgKCFjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGkpKSB7XHJcblx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0fVxyXG5cclxuXHRcdG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShpKTtcclxuXHRcdGZvciAoaiA9IDAsIGpsZW4gPSBtZXRhLmRhdGEubGVuZ3RoOyBqIDwgamxlbjsgKytqKSB7XHJcblx0XHRcdHZhciBlbGVtZW50ID0gbWV0YS5kYXRhW2pdO1xyXG5cdFx0XHRpZiAoIWVsZW1lbnQuX3ZpZXcuc2tpcCkge1xyXG5cdFx0XHRcdGhhbmRsZXIoZWxlbWVudCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBpdGVtcyB0aGF0IGludGVyc2VjdCB0aGUgZXZlbnQgcG9zaXRpb25cclxuICogQHBhcmFtIGl0ZW1zIHtDaGFydEVsZW1lbnRbXX0gZWxlbWVudHMgdG8gZmlsdGVyXHJcbiAqIEBwYXJhbSBwb3NpdGlvbiB7UG9pbnR9IHRoZSBwb2ludCB0byBiZSBuZWFyZXN0IHRvXHJcbiAqIEByZXR1cm4ge0NoYXJ0RWxlbWVudFtdfSB0aGUgbmVhcmVzdCBpdGVtc1xyXG4gKi9cclxuZnVuY3Rpb24gZ2V0SW50ZXJzZWN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uKSB7XHJcblx0dmFyIGVsZW1lbnRzID0gW107XHJcblxyXG5cdHBhcnNlVmlzaWJsZUl0ZW1zKGNoYXJ0LCBmdW5jdGlvbihlbGVtZW50KSB7XHJcblx0XHRpZiAoZWxlbWVudC5pblJhbmdlKHBvc2l0aW9uLngsIHBvc2l0aW9uLnkpKSB7XHJcblx0XHRcdGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XHJcblx0XHR9XHJcblx0fSk7XHJcblxyXG5cdHJldHVybiBlbGVtZW50cztcclxufVxyXG5cclxuLyoqXHJcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIGl0ZW1zIG5lYXJlc3QgdG8gdGhlIGV2ZW50IHBvc2l0aW9uIGNvbnNpZGVyaW5nIGFsbCB2aXNpYmxlIGl0ZW1zIGluIHRlaCBjaGFydFxyXG4gKiBAcGFyYW0gY2hhcnQge0NoYXJ0fSB0aGUgY2hhcnQgdG8gbG9vayBhdCBlbGVtZW50cyBmcm9tXHJcbiAqIEBwYXJhbSBwb3NpdGlvbiB7UG9pbnR9IHRoZSBwb2ludCB0byBiZSBuZWFyZXN0IHRvXHJcbiAqIEBwYXJhbSBpbnRlcnNlY3Qge0Jvb2xlYW59IGlmIHRydWUsIG9ubHkgY29uc2lkZXIgaXRlbXMgdGhhdCBpbnRlcnNlY3QgdGhlIHBvc2l0aW9uXHJcbiAqIEBwYXJhbSBkaXN0YW5jZU1ldHJpYyB7RnVuY3Rpb259IGZ1bmN0aW9uIHRvIHByb3ZpZGUgdGhlIGRpc3RhbmNlIGJldHdlZW4gcG9pbnRzXHJcbiAqIEByZXR1cm4ge0NoYXJ0RWxlbWVudFtdfSB0aGUgbmVhcmVzdCBpdGVtc1xyXG4gKi9cclxuZnVuY3Rpb24gZ2V0TmVhcmVzdEl0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgaW50ZXJzZWN0LCBkaXN0YW5jZU1ldHJpYykge1xyXG5cdHZhciBtaW5EaXN0YW5jZSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcclxuXHR2YXIgbmVhcmVzdEl0ZW1zID0gW107XHJcblxyXG5cdHBhcnNlVmlzaWJsZUl0ZW1zKGNoYXJ0LCBmdW5jdGlvbihlbGVtZW50KSB7XHJcblx0XHRpZiAoaW50ZXJzZWN0ICYmICFlbGVtZW50LmluUmFuZ2UocG9zaXRpb24ueCwgcG9zaXRpb24ueSkpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBjZW50ZXIgPSBlbGVtZW50LmdldENlbnRlclBvaW50KCk7XHJcblx0XHR2YXIgZGlzdGFuY2UgPSBkaXN0YW5jZU1ldHJpYyhwb3NpdGlvbiwgY2VudGVyKTtcclxuXHJcblx0XHRpZiAoZGlzdGFuY2UgPCBtaW5EaXN0YW5jZSkge1xyXG5cdFx0XHRuZWFyZXN0SXRlbXMgPSBbZWxlbWVudF07XHJcblx0XHRcdG1pbkRpc3RhbmNlID0gZGlzdGFuY2U7XHJcblx0XHR9IGVsc2UgaWYgKGRpc3RhbmNlID09PSBtaW5EaXN0YW5jZSkge1xyXG5cdFx0XHQvLyBDYW4gaGF2ZSBtdWx0aXBsZSBpdGVtcyBhdCB0aGUgc2FtZSBkaXN0YW5jZSBpbiB3aGljaCBjYXNlIHdlIHNvcnQgYnkgc2l6ZVxyXG5cdFx0XHRuZWFyZXN0SXRlbXMucHVzaChlbGVtZW50KTtcclxuXHRcdH1cclxuXHR9KTtcclxuXHJcblx0cmV0dXJuIG5lYXJlc3RJdGVtcztcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldCBhIGRpc3RhbmNlIG1ldHJpYyBmdW5jdGlvbiBmb3IgdHdvIHBvaW50cyBiYXNlZCBvbiB0aGVcclxuICogYXhpcyBtb2RlIHNldHRpbmdcclxuICogQHBhcmFtIHtTdHJpbmd9IGF4aXMgdGhlIGF4aXMgbW9kZS4geHx5fHh5XHJcbiAqL1xyXG5mdW5jdGlvbiBnZXREaXN0YW5jZU1ldHJpY0ZvckF4aXMoYXhpcykge1xyXG5cdHZhciB1c2VYID0gYXhpcy5pbmRleE9mKCd4JykgIT09IC0xO1xyXG5cdHZhciB1c2VZID0gYXhpcy5pbmRleE9mKCd5JykgIT09IC0xO1xyXG5cclxuXHRyZXR1cm4gZnVuY3Rpb24ocHQxLCBwdDIpIHtcclxuXHRcdHZhciBkZWx0YVggPSB1c2VYID8gTWF0aC5hYnMocHQxLnggLSBwdDIueCkgOiAwO1xyXG5cdFx0dmFyIGRlbHRhWSA9IHVzZVkgPyBNYXRoLmFicyhwdDEueSAtIHB0Mi55KSA6IDA7XHJcblx0XHRyZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KGRlbHRhWCwgMikgKyBNYXRoLnBvdyhkZWx0YVksIDIpKTtcclxuXHR9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBpbmRleE1vZGUoY2hhcnQsIGUsIG9wdGlvbnMpIHtcclxuXHR2YXIgcG9zaXRpb24gPSBnZXRSZWxhdGl2ZVBvc2l0aW9uKGUsIGNoYXJ0KTtcclxuXHQvLyBEZWZhdWx0IGF4aXMgZm9yIGluZGV4IG1vZGUgaXMgJ3gnIHRvIG1hdGNoIG9sZCBiZWhhdmlvdXJcclxuXHRvcHRpb25zLmF4aXMgPSBvcHRpb25zLmF4aXMgfHwgJ3gnO1xyXG5cdHZhciBkaXN0YW5jZU1ldHJpYyA9IGdldERpc3RhbmNlTWV0cmljRm9yQXhpcyhvcHRpb25zLmF4aXMpO1xyXG5cdHZhciBpdGVtcyA9IG9wdGlvbnMuaW50ZXJzZWN0ID8gZ2V0SW50ZXJzZWN0SXRlbXMoY2hhcnQsIHBvc2l0aW9uKSA6IGdldE5lYXJlc3RJdGVtcyhjaGFydCwgcG9zaXRpb24sIGZhbHNlLCBkaXN0YW5jZU1ldHJpYyk7XHJcblx0dmFyIGVsZW1lbnRzID0gW107XHJcblxyXG5cdGlmICghaXRlbXMubGVuZ3RoKSB7XHJcblx0XHRyZXR1cm4gW107XHJcblx0fVxyXG5cclxuXHRjaGFydC5kYXRhLmRhdGFzZXRzLmZvckVhY2goZnVuY3Rpb24oZGF0YXNldCwgZGF0YXNldEluZGV4KSB7XHJcblx0XHRpZiAoY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShkYXRhc2V0SW5kZXgpKSB7XHJcblx0XHRcdHZhciBtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcclxuXHRcdFx0dmFyIGVsZW1lbnQgPSBtZXRhLmRhdGFbaXRlbXNbMF0uX2luZGV4XTtcclxuXHJcblx0XHRcdC8vIGRvbid0IGNvdW50IGl0ZW1zIHRoYXQgYXJlIHNraXBwZWQgKG51bGwgZGF0YSlcclxuXHRcdFx0aWYgKGVsZW1lbnQgJiYgIWVsZW1lbnQuX3ZpZXcuc2tpcCkge1xyXG5cdFx0XHRcdGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9KTtcclxuXHJcblx0cmV0dXJuIGVsZW1lbnRzO1xyXG59XHJcblxyXG4vKipcclxuICogQGludGVyZmFjZSBJSW50ZXJhY3Rpb25PcHRpb25zXHJcbiAqL1xyXG4vKipcclxuICogSWYgdHJ1ZSwgb25seSBjb25zaWRlciBpdGVtcyB0aGF0IGludGVyc2VjdCB0aGUgcG9pbnRcclxuICogQG5hbWUgSUludGVyZmFjZU9wdGlvbnMjYm9vbGVhblxyXG4gKiBAdHlwZSBCb29sZWFuXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIENvbnRhaW5zIGludGVyYWN0aW9uIHJlbGF0ZWQgZnVuY3Rpb25zXHJcbiAqIEBuYW1lc3BhY2UgQ2hhcnQuSW50ZXJhY3Rpb25cclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cdC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgZGlmZmVyZW50IG1vZGVzXHJcblx0bW9kZXM6IHtcclxuXHRcdHNpbmdsZTogZnVuY3Rpb24oY2hhcnQsIGUpIHtcclxuXHRcdFx0dmFyIHBvc2l0aW9uID0gZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCk7XHJcblx0XHRcdHZhciBlbGVtZW50cyA9IFtdO1xyXG5cclxuXHRcdFx0cGFyc2VWaXNpYmxlSXRlbXMoY2hhcnQsIGZ1bmN0aW9uKGVsZW1lbnQpIHtcclxuXHRcdFx0XHRpZiAoZWxlbWVudC5pblJhbmdlKHBvc2l0aW9uLngsIHBvc2l0aW9uLnkpKSB7XHJcblx0XHRcdFx0XHRlbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xyXG5cdFx0XHRcdFx0cmV0dXJuIGVsZW1lbnRzO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRyZXR1cm4gZWxlbWVudHMuc2xpY2UoMCwgMSk7XHJcblx0XHR9LFxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQGZ1bmN0aW9uIENoYXJ0LkludGVyYWN0aW9uLm1vZGVzLmxhYmVsXHJcblx0XHQgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNC4wXHJcblx0XHQgKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRsYWJlbDogaW5kZXhNb2RlLFxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyBpdGVtcyBhdCB0aGUgc2FtZSBpbmRleC4gSWYgdGhlIG9wdGlvbnMuaW50ZXJzZWN0IHBhcmFtZXRlciBpcyB0cnVlLCB3ZSBvbmx5IHJldHVybiBpdGVtcyBpZiB3ZSBpbnRlcnNlY3Qgc29tZXRoaW5nXHJcblx0XHQgKiBJZiB0aGUgb3B0aW9ucy5pbnRlcnNlY3QgbW9kZSBpcyBmYWxzZSwgd2UgZmluZCB0aGUgbmVhcmVzdCBpdGVtIGFuZCByZXR1cm4gdGhlIGl0ZW1zIGF0IHRoZSBzYW1lIGluZGV4IGFzIHRoYXQgaXRlbVxyXG5cdFx0ICogQGZ1bmN0aW9uIENoYXJ0LkludGVyYWN0aW9uLm1vZGVzLmluZGV4XHJcblx0XHQgKiBAc2luY2UgdjIuNC4wXHJcblx0XHQgKiBAcGFyYW0gY2hhcnQge2NoYXJ0fSB0aGUgY2hhcnQgd2UgYXJlIHJldHVybmluZyBpdGVtcyBmcm9tXHJcblx0XHQgKiBAcGFyYW0gZSB7RXZlbnR9IHRoZSBldmVudCB3ZSBhcmUgZmluZCB0aGluZ3MgYXRcclxuXHRcdCAqIEBwYXJhbSBvcHRpb25zIHtJSW50ZXJhY3Rpb25PcHRpb25zfSBvcHRpb25zIHRvIHVzZSBkdXJpbmcgaW50ZXJhY3Rpb25cclxuXHRcdCAqIEByZXR1cm4ge0NoYXJ0LkVsZW1lbnRbXX0gQXJyYXkgb2YgZWxlbWVudHMgdGhhdCBhcmUgdW5kZXIgdGhlIHBvaW50LiBJZiBub25lIGFyZSBmb3VuZCwgYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWRcclxuXHRcdCAqL1xyXG5cdFx0aW5kZXg6IGluZGV4TW9kZSxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFJldHVybnMgaXRlbXMgaW4gdGhlIHNhbWUgZGF0YXNldC4gSWYgdGhlIG9wdGlvbnMuaW50ZXJzZWN0IHBhcmFtZXRlciBpcyB0cnVlLCB3ZSBvbmx5IHJldHVybiBpdGVtcyBpZiB3ZSBpbnRlcnNlY3Qgc29tZXRoaW5nXHJcblx0XHQgKiBJZiB0aGUgb3B0aW9ucy5pbnRlcnNlY3QgaXMgZmFsc2UsIHdlIGZpbmQgdGhlIG5lYXJlc3QgaXRlbSBhbmQgcmV0dXJuIHRoZSBpdGVtcyBpbiB0aGF0IGRhdGFzZXRcclxuXHRcdCAqIEBmdW5jdGlvbiBDaGFydC5JbnRlcmFjdGlvbi5tb2Rlcy5kYXRhc2V0XHJcblx0XHQgKiBAcGFyYW0gY2hhcnQge2NoYXJ0fSB0aGUgY2hhcnQgd2UgYXJlIHJldHVybmluZyBpdGVtcyBmcm9tXHJcblx0XHQgKiBAcGFyYW0gZSB7RXZlbnR9IHRoZSBldmVudCB3ZSBhcmUgZmluZCB0aGluZ3MgYXRcclxuXHRcdCAqIEBwYXJhbSBvcHRpb25zIHtJSW50ZXJhY3Rpb25PcHRpb25zfSBvcHRpb25zIHRvIHVzZSBkdXJpbmcgaW50ZXJhY3Rpb25cclxuXHRcdCAqIEByZXR1cm4ge0NoYXJ0LkVsZW1lbnRbXX0gQXJyYXkgb2YgZWxlbWVudHMgdGhhdCBhcmUgdW5kZXIgdGhlIHBvaW50LiBJZiBub25lIGFyZSBmb3VuZCwgYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWRcclxuXHRcdCAqL1xyXG5cdFx0ZGF0YXNldDogZnVuY3Rpb24oY2hhcnQsIGUsIG9wdGlvbnMpIHtcclxuXHRcdFx0dmFyIHBvc2l0aW9uID0gZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCk7XHJcblx0XHRcdG9wdGlvbnMuYXhpcyA9IG9wdGlvbnMuYXhpcyB8fCAneHknO1xyXG5cdFx0XHR2YXIgZGlzdGFuY2VNZXRyaWMgPSBnZXREaXN0YW5jZU1ldHJpY0ZvckF4aXMob3B0aW9ucy5heGlzKTtcclxuXHRcdFx0dmFyIGl0ZW1zID0gb3B0aW9ucy5pbnRlcnNlY3QgPyBnZXRJbnRlcnNlY3RJdGVtcyhjaGFydCwgcG9zaXRpb24pIDogZ2V0TmVhcmVzdEl0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgZmFsc2UsIGRpc3RhbmNlTWV0cmljKTtcclxuXHJcblx0XHRcdGlmIChpdGVtcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0aXRlbXMgPSBjaGFydC5nZXREYXRhc2V0TWV0YShpdGVtc1swXS5fZGF0YXNldEluZGV4KS5kYXRhO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gaXRlbXM7XHJcblx0XHR9LFxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQGZ1bmN0aW9uIENoYXJ0LkludGVyYWN0aW9uLm1vZGVzLngtYXhpc1xyXG5cdFx0ICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjQuMC4gVXNlIGluZGV4IG1vZGUgYW5kIGludGVyc2VjdCA9PSB0cnVlXHJcblx0XHQgKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHQneC1heGlzJzogZnVuY3Rpb24oY2hhcnQsIGUpIHtcclxuXHRcdFx0cmV0dXJuIGluZGV4TW9kZShjaGFydCwgZSwge2ludGVyc2VjdDogZmFsc2V9KTtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBQb2ludCBtb2RlIHJldHVybnMgYWxsIGVsZW1lbnRzIHRoYXQgaGl0IHRlc3QgYmFzZWQgb24gdGhlIGV2ZW50IHBvc2l0aW9uXHJcblx0XHQgKiBvZiB0aGUgZXZlbnRcclxuXHRcdCAqIEBmdW5jdGlvbiBDaGFydC5JbnRlcmFjdGlvbi5tb2Rlcy5pbnRlcnNlY3RcclxuXHRcdCAqIEBwYXJhbSBjaGFydCB7Y2hhcnR9IHRoZSBjaGFydCB3ZSBhcmUgcmV0dXJuaW5nIGl0ZW1zIGZyb21cclxuXHRcdCAqIEBwYXJhbSBlIHtFdmVudH0gdGhlIGV2ZW50IHdlIGFyZSBmaW5kIHRoaW5ncyBhdFxyXG5cdFx0ICogQHJldHVybiB7Q2hhcnQuRWxlbWVudFtdfSBBcnJheSBvZiBlbGVtZW50cyB0aGF0IGFyZSB1bmRlciB0aGUgcG9pbnQuIElmIG5vbmUgYXJlIGZvdW5kLCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZFxyXG5cdFx0ICovXHJcblx0XHRwb2ludDogZnVuY3Rpb24oY2hhcnQsIGUpIHtcclxuXHRcdFx0dmFyIHBvc2l0aW9uID0gZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCk7XHJcblx0XHRcdHJldHVybiBnZXRJbnRlcnNlY3RJdGVtcyhjaGFydCwgcG9zaXRpb24pO1xyXG5cdFx0fSxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIG5lYXJlc3QgbW9kZSByZXR1cm5zIHRoZSBlbGVtZW50IGNsb3Nlc3QgdG8gdGhlIHBvaW50XHJcblx0XHQgKiBAZnVuY3Rpb24gQ2hhcnQuSW50ZXJhY3Rpb24ubW9kZXMuaW50ZXJzZWN0XHJcblx0XHQgKiBAcGFyYW0gY2hhcnQge2NoYXJ0fSB0aGUgY2hhcnQgd2UgYXJlIHJldHVybmluZyBpdGVtcyBmcm9tXHJcblx0XHQgKiBAcGFyYW0gZSB7RXZlbnR9IHRoZSBldmVudCB3ZSBhcmUgZmluZCB0aGluZ3MgYXRcclxuXHRcdCAqIEBwYXJhbSBvcHRpb25zIHtJSW50ZXJhY3Rpb25PcHRpb25zfSBvcHRpb25zIHRvIHVzZVxyXG5cdFx0ICogQHJldHVybiB7Q2hhcnQuRWxlbWVudFtdfSBBcnJheSBvZiBlbGVtZW50cyB0aGF0IGFyZSB1bmRlciB0aGUgcG9pbnQuIElmIG5vbmUgYXJlIGZvdW5kLCBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZFxyXG5cdFx0ICovXHJcblx0XHRuZWFyZXN0OiBmdW5jdGlvbihjaGFydCwgZSwgb3B0aW9ucykge1xyXG5cdFx0XHR2YXIgcG9zaXRpb24gPSBnZXRSZWxhdGl2ZVBvc2l0aW9uKGUsIGNoYXJ0KTtcclxuXHRcdFx0b3B0aW9ucy5heGlzID0gb3B0aW9ucy5heGlzIHx8ICd4eSc7XHJcblx0XHRcdHZhciBkaXN0YW5jZU1ldHJpYyA9IGdldERpc3RhbmNlTWV0cmljRm9yQXhpcyhvcHRpb25zLmF4aXMpO1xyXG5cdFx0XHR2YXIgbmVhcmVzdEl0ZW1zID0gZ2V0TmVhcmVzdEl0ZW1zKGNoYXJ0LCBwb3NpdGlvbiwgb3B0aW9ucy5pbnRlcnNlY3QsIGRpc3RhbmNlTWV0cmljKTtcclxuXHJcblx0XHRcdC8vIFdlIGhhdmUgbXVsdGlwbGUgaXRlbXMgYXQgdGhlIHNhbWUgZGlzdGFuY2UgZnJvbSB0aGUgZXZlbnQuIE5vdyBzb3J0IGJ5IHNtYWxsZXN0XHJcblx0XHRcdGlmIChuZWFyZXN0SXRlbXMubGVuZ3RoID4gMSkge1xyXG5cdFx0XHRcdG5lYXJlc3RJdGVtcy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcclxuXHRcdFx0XHRcdHZhciBzaXplQSA9IGEuZ2V0QXJlYSgpO1xyXG5cdFx0XHRcdFx0dmFyIHNpemVCID0gYi5nZXRBcmVhKCk7XHJcblx0XHRcdFx0XHR2YXIgcmV0ID0gc2l6ZUEgLSBzaXplQjtcclxuXHJcblx0XHRcdFx0XHRpZiAocmV0ID09PSAwKSB7XHJcblx0XHRcdFx0XHRcdC8vIGlmIGVxdWFsIHNvcnQgYnkgZGF0YXNldCBpbmRleFxyXG5cdFx0XHRcdFx0XHRyZXQgPSBhLl9kYXRhc2V0SW5kZXggLSBiLl9kYXRhc2V0SW5kZXg7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHJldDtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gUmV0dXJuIG9ubHkgMSBpdGVtXHJcblx0XHRcdHJldHVybiBuZWFyZXN0SXRlbXMuc2xpY2UoMCwgMSk7XHJcblx0XHR9LFxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogeCBtb2RlIHJldHVybnMgdGhlIGVsZW1lbnRzIHRoYXQgaGl0LXRlc3QgYXQgdGhlIGN1cnJlbnQgeCBjb29yZGluYXRlXHJcblx0XHQgKiBAZnVuY3Rpb24gQ2hhcnQuSW50ZXJhY3Rpb24ubW9kZXMueFxyXG5cdFx0ICogQHBhcmFtIGNoYXJ0IHtjaGFydH0gdGhlIGNoYXJ0IHdlIGFyZSByZXR1cm5pbmcgaXRlbXMgZnJvbVxyXG5cdFx0ICogQHBhcmFtIGUge0V2ZW50fSB0aGUgZXZlbnQgd2UgYXJlIGZpbmQgdGhpbmdzIGF0XHJcblx0XHQgKiBAcGFyYW0gb3B0aW9ucyB7SUludGVyYWN0aW9uT3B0aW9uc30gb3B0aW9ucyB0byB1c2VcclxuXHRcdCAqIEByZXR1cm4ge0NoYXJ0LkVsZW1lbnRbXX0gQXJyYXkgb2YgZWxlbWVudHMgdGhhdCBhcmUgdW5kZXIgdGhlIHBvaW50LiBJZiBub25lIGFyZSBmb3VuZCwgYW4gZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWRcclxuXHRcdCAqL1xyXG5cdFx0eDogZnVuY3Rpb24oY2hhcnQsIGUsIG9wdGlvbnMpIHtcclxuXHRcdFx0dmFyIHBvc2l0aW9uID0gZ2V0UmVsYXRpdmVQb3NpdGlvbihlLCBjaGFydCk7XHJcblx0XHRcdHZhciBpdGVtcyA9IFtdO1xyXG5cdFx0XHR2YXIgaW50ZXJzZWN0c0l0ZW0gPSBmYWxzZTtcclxuXHJcblx0XHRcdHBhcnNlVmlzaWJsZUl0ZW1zKGNoYXJ0LCBmdW5jdGlvbihlbGVtZW50KSB7XHJcblx0XHRcdFx0aWYgKGVsZW1lbnQuaW5YUmFuZ2UocG9zaXRpb24ueCkpIHtcclxuXHRcdFx0XHRcdGl0ZW1zLnB1c2goZWxlbWVudCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAoZWxlbWVudC5pblJhbmdlKHBvc2l0aW9uLngsIHBvc2l0aW9uLnkpKSB7XHJcblx0XHRcdFx0XHRpbnRlcnNlY3RzSXRlbSA9IHRydWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdC8vIElmIHdlIHdhbnQgdG8gdHJpZ2dlciBvbiBhbiBpbnRlcnNlY3QgYW5kIHdlIGRvbid0IGhhdmUgYW55IGl0ZW1zXHJcblx0XHRcdC8vIHRoYXQgaW50ZXJzZWN0IHRoZSBwb3NpdGlvbiwgcmV0dXJuIG5vdGhpbmdcclxuXHRcdFx0aWYgKG9wdGlvbnMuaW50ZXJzZWN0ICYmICFpbnRlcnNlY3RzSXRlbSkge1xyXG5cdFx0XHRcdGl0ZW1zID0gW107XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGl0ZW1zO1xyXG5cdFx0fSxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIHkgbW9kZSByZXR1cm5zIHRoZSBlbGVtZW50cyB0aGF0IGhpdC10ZXN0IGF0IHRoZSBjdXJyZW50IHkgY29vcmRpbmF0ZVxyXG5cdFx0ICogQGZ1bmN0aW9uIENoYXJ0LkludGVyYWN0aW9uLm1vZGVzLnlcclxuXHRcdCAqIEBwYXJhbSBjaGFydCB7Y2hhcnR9IHRoZSBjaGFydCB3ZSBhcmUgcmV0dXJuaW5nIGl0ZW1zIGZyb21cclxuXHRcdCAqIEBwYXJhbSBlIHtFdmVudH0gdGhlIGV2ZW50IHdlIGFyZSBmaW5kIHRoaW5ncyBhdFxyXG5cdFx0ICogQHBhcmFtIG9wdGlvbnMge0lJbnRlcmFjdGlvbk9wdGlvbnN9IG9wdGlvbnMgdG8gdXNlXHJcblx0XHQgKiBAcmV0dXJuIHtDaGFydC5FbGVtZW50W119IEFycmF5IG9mIGVsZW1lbnRzIHRoYXQgYXJlIHVuZGVyIHRoZSBwb2ludC4gSWYgbm9uZSBhcmUgZm91bmQsIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkXHJcblx0XHQgKi9cclxuXHRcdHk6IGZ1bmN0aW9uKGNoYXJ0LCBlLCBvcHRpb25zKSB7XHJcblx0XHRcdHZhciBwb3NpdGlvbiA9IGdldFJlbGF0aXZlUG9zaXRpb24oZSwgY2hhcnQpO1xyXG5cdFx0XHR2YXIgaXRlbXMgPSBbXTtcclxuXHRcdFx0dmFyIGludGVyc2VjdHNJdGVtID0gZmFsc2U7XHJcblxyXG5cdFx0XHRwYXJzZVZpc2libGVJdGVtcyhjaGFydCwgZnVuY3Rpb24oZWxlbWVudCkge1xyXG5cdFx0XHRcdGlmIChlbGVtZW50LmluWVJhbmdlKHBvc2l0aW9uLnkpKSB7XHJcblx0XHRcdFx0XHRpdGVtcy5wdXNoKGVsZW1lbnQpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKGVsZW1lbnQuaW5SYW5nZShwb3NpdGlvbi54LCBwb3NpdGlvbi55KSkge1xyXG5cdFx0XHRcdFx0aW50ZXJzZWN0c0l0ZW0gPSB0cnVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQvLyBJZiB3ZSB3YW50IHRvIHRyaWdnZXIgb24gYW4gaW50ZXJzZWN0IGFuZCB3ZSBkb24ndCBoYXZlIGFueSBpdGVtc1xyXG5cdFx0XHQvLyB0aGF0IGludGVyc2VjdCB0aGUgcG9zaXRpb24sIHJldHVybiBub3RoaW5nXHJcblx0XHRcdGlmIChvcHRpb25zLmludGVyc2VjdCAmJiAhaW50ZXJzZWN0c0l0ZW0pIHtcclxuXHRcdFx0XHRpdGVtcyA9IFtdO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBpdGVtcztcclxuXHRcdH1cclxuXHR9XHJcbn07XHJcblxyXG59LHtcIjQ2XCI6NDZ9XSwzMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xyXG5cclxuZGVmYXVsdHMuX3NldCgnZ2xvYmFsJywge1xyXG5cdHJlc3BvbnNpdmU6IHRydWUsXHJcblx0cmVzcG9uc2l2ZUFuaW1hdGlvbkR1cmF0aW9uOiAwLFxyXG5cdG1haW50YWluQXNwZWN0UmF0aW86IHRydWUsXHJcblx0ZXZlbnRzOiBbJ21vdXNlbW92ZScsICdtb3VzZW91dCcsICdjbGljaycsICd0b3VjaHN0YXJ0JywgJ3RvdWNobW92ZSddLFxyXG5cdGhvdmVyOiB7XHJcblx0XHRvbkhvdmVyOiBudWxsLFxyXG5cdFx0bW9kZTogJ25lYXJlc3QnLFxyXG5cdFx0aW50ZXJzZWN0OiB0cnVlLFxyXG5cdFx0YW5pbWF0aW9uRHVyYXRpb246IDQwMFxyXG5cdH0sXHJcblx0b25DbGljazogbnVsbCxcclxuXHRkZWZhdWx0Q29sb3I6ICdyZ2JhKDAsMCwwLDAuMSknLFxyXG5cdGRlZmF1bHRGb250Q29sb3I6ICcjNjY2JyxcclxuXHRkZWZhdWx0Rm9udEZhbWlseTogXCInSGVsdmV0aWNhIE5ldWUnLCAnSGVsdmV0aWNhJywgJ0FyaWFsJywgc2Fucy1zZXJpZlwiLFxyXG5cdGRlZmF1bHRGb250U2l6ZTogMTIsXHJcblx0ZGVmYXVsdEZvbnRTdHlsZTogJ25vcm1hbCcsXHJcblx0c2hvd0xpbmVzOiB0cnVlLFxyXG5cclxuXHQvLyBFbGVtZW50IGRlZmF1bHRzIGRlZmluZWQgaW4gZWxlbWVudCBleHRlbnNpb25zXHJcblx0ZWxlbWVudHM6IHt9LFxyXG5cclxuXHQvLyBMYXlvdXQgb3B0aW9ucyBzdWNoIGFzIHBhZGRpbmdcclxuXHRsYXlvdXQ6IHtcclxuXHRcdHBhZGRpbmc6IHtcclxuXHRcdFx0dG9wOiAwLFxyXG5cdFx0XHRyaWdodDogMCxcclxuXHRcdFx0Ym90dG9tOiAwLFxyXG5cdFx0XHRsZWZ0OiAwXHJcblx0XHR9XHJcblx0fVxyXG59KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XHJcblxyXG5cdC8vIE9jY3VweSB0aGUgZ2xvYmFsIHZhcmlhYmxlIG9mIENoYXJ0LCBhbmQgY3JlYXRlIGEgc2ltcGxlIGJhc2UgY2xhc3NcclxuXHR2YXIgQ2hhcnQgPSBmdW5jdGlvbihpdGVtLCBjb25maWcpIHtcclxuXHRcdHRoaXMuY29uc3RydWN0KGl0ZW0sIGNvbmZpZyk7XHJcblx0XHRyZXR1cm4gdGhpcztcclxuXHR9O1xyXG5cclxuXHRDaGFydC5DaGFydCA9IENoYXJ0O1xyXG5cclxuXHRyZXR1cm4gQ2hhcnQ7XHJcbn07XHJcblxyXG59LHtcIjI2XCI6MjZ9XSwzMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XHJcblxyXG5mdW5jdGlvbiBmaWx0ZXJCeVBvc2l0aW9uKGFycmF5LCBwb3NpdGlvbikge1xyXG5cdHJldHVybiBoZWxwZXJzLndoZXJlKGFycmF5LCBmdW5jdGlvbih2KSB7XHJcblx0XHRyZXR1cm4gdi5wb3NpdGlvbiA9PT0gcG9zaXRpb247XHJcblx0fSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNvcnRCeVdlaWdodChhcnJheSwgcmV2ZXJzZSkge1xyXG5cdGFycmF5LmZvckVhY2goZnVuY3Rpb24odiwgaSkge1xyXG5cdFx0di5fdG1wSW5kZXhfID0gaTtcclxuXHRcdHJldHVybiB2O1xyXG5cdH0pO1xyXG5cdGFycmF5LnNvcnQoZnVuY3Rpb24oYSwgYikge1xyXG5cdFx0dmFyIHYwID0gcmV2ZXJzZSA/IGIgOiBhO1xyXG5cdFx0dmFyIHYxID0gcmV2ZXJzZSA/IGEgOiBiO1xyXG5cdFx0cmV0dXJuIHYwLndlaWdodCA9PT0gdjEud2VpZ2h0ID9cclxuXHRcdFx0djAuX3RtcEluZGV4XyAtIHYxLl90bXBJbmRleF8gOlxyXG5cdFx0XHR2MC53ZWlnaHQgLSB2MS53ZWlnaHQ7XHJcblx0fSk7XHJcblx0YXJyYXkuZm9yRWFjaChmdW5jdGlvbih2KSB7XHJcblx0XHRkZWxldGUgdi5fdG1wSW5kZXhfO1xyXG5cdH0pO1xyXG59XHJcblxyXG4vKipcclxuICogQGludGVyZmFjZSBJTGF5b3V0SXRlbVxyXG4gKiBAcHJvcCB7U3RyaW5nfSBwb3NpdGlvbiAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbSBpbiB0aGUgY2hhcnQgbGF5b3V0LiBQb3NzaWJsZSB2YWx1ZXMgYXJlXHJcbiAqICdsZWZ0JywgJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCBhbmQgJ2NoYXJ0QXJlYSdcclxuICogQHByb3Age051bWJlcn0gd2VpZ2h0IC0gVGhlIHdlaWdodCB1c2VkIHRvIHNvcnQgdGhlIGl0ZW0uIEhpZ2hlciB3ZWlnaHRzIGFyZSBmdXJ0aGVyIGF3YXkgZnJvbSB0aGUgY2hhcnQgYXJlYVxyXG4gKiBAcHJvcCB7Qm9vbGVhbn0gZnVsbFdpZHRoIC0gaWYgdHJ1ZSwgYW5kIHRoZSBpdGVtIGlzIGhvcml6b250YWwsIHRoZW4gcHVzaCB2ZXJ0aWNhbCBib3hlcyBkb3duXHJcbiAqIEBwcm9wIHtGdW5jdGlvbn0gaXNIb3Jpem9udGFsIC0gcmV0dXJucyB0cnVlIGlmIHRoZSBsYXlvdXQgaXRlbSBpcyBob3Jpem9udGFsIChpZS4gdG9wIG9yIGJvdHRvbSlcclxuICogQHByb3Age0Z1bmN0aW9ufSB1cGRhdGUgLSBUYWtlcyB0d28gcGFyYW1ldGVyczogd2lkdGggYW5kIGhlaWdodC4gUmV0dXJucyBzaXplIG9mIGl0ZW1cclxuICogQHByb3Age0Z1bmN0aW9ufSBnZXRQYWRkaW5nIC0gIFJldHVybnMgYW4gb2JqZWN0IHdpdGggcGFkZGluZyBvbiB0aGUgZWRnZXNcclxuICogQHByb3Age051bWJlcn0gd2lkdGggLSBXaWR0aCBvZiBpdGVtLiBNdXN0IGJlIHZhbGlkIGFmdGVyIHVwZGF0ZSgpXHJcbiAqIEBwcm9wIHtOdW1iZXJ9IGhlaWdodCAtIEhlaWdodCBvZiBpdGVtLiBNdXN0IGJlIHZhbGlkIGFmdGVyIHVwZGF0ZSgpXHJcbiAqIEBwcm9wIHtOdW1iZXJ9IGxlZnQgLSBMZWZ0IGVkZ2Ugb2YgdGhlIGl0ZW0uIFNldCBieSBsYXlvdXQgc3lzdGVtIGFuZCBjYW5ub3QgYmUgdXNlZCBpbiB1cGRhdGVcclxuICogQHByb3Age051bWJlcn0gdG9wIC0gVG9wIGVkZ2Ugb2YgdGhlIGl0ZW0uIFNldCBieSBsYXlvdXQgc3lzdGVtIGFuZCBjYW5ub3QgYmUgdXNlZCBpbiB1cGRhdGVcclxuICogQHByb3Age051bWJlcn0gcmlnaHQgLSBSaWdodCBlZGdlIG9mIHRoZSBpdGVtLiBTZXQgYnkgbGF5b3V0IHN5c3RlbSBhbmQgY2Fubm90IGJlIHVzZWQgaW4gdXBkYXRlXHJcbiAqIEBwcm9wIHtOdW1iZXJ9IGJvdHRvbSAtIEJvdHRvbSBlZGdlIG9mIHRoZSBpdGVtLiBTZXQgYnkgbGF5b3V0IHN5c3RlbSBhbmQgY2Fubm90IGJlIHVzZWQgaW4gdXBkYXRlXHJcbiAqL1xyXG5cclxuLy8gVGhlIGxheW91dCBzZXJ2aWNlIGlzIHZlcnkgc2VsZiBleHBsYW5hdG9yeS4gIEl0J3MgcmVzcG9uc2libGUgZm9yIHRoZSBsYXlvdXQgd2l0aGluIGEgY2hhcnQuXHJcbi8vIFNjYWxlcywgTGVnZW5kcyBhbmQgUGx1Z2lucyBhbGwgcmVseSBvbiB0aGUgbGF5b3V0IHNlcnZpY2UgYW5kIGNhbiBlYXNpbHkgcmVnaXN0ZXIgdG8gYmUgcGxhY2VkIGFueXdoZXJlIHRoZXkgbmVlZFxyXG4vLyBJdCBpcyB0aGlzIHNlcnZpY2UncyByZXNwb25zaWJpbGl0eSBvZiBjYXJyeWluZyBvdXQgdGhhdCBsYXlvdXQuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cdGRlZmF1bHRzOiB7fSxcclxuXHJcblx0LyoqXHJcblx0ICogUmVnaXN0ZXIgYSBib3ggdG8gYSBjaGFydC5cclxuXHQgKiBBIGJveCBpcyBzaW1wbHkgYSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IHRoYXQgcmVxdWlyZXMgbGF5b3V0LiBlZy4gU2NhbGVzLCBMZWdlbmQsIFRpdGxlLlxyXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gdGhlIGNoYXJ0IHRvIHVzZVxyXG5cdCAqIEBwYXJhbSB7SUxheW91dEl0ZW19IGl0ZW0gLSB0aGUgaXRlbSB0byBhZGQgdG8gYmUgbGF5ZWQgb3V0XHJcblx0ICovXHJcblx0YWRkQm94OiBmdW5jdGlvbihjaGFydCwgaXRlbSkge1xyXG5cdFx0aWYgKCFjaGFydC5ib3hlcykge1xyXG5cdFx0XHRjaGFydC5ib3hlcyA9IFtdO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGluaXRpYWxpemUgaXRlbSB3aXRoIGRlZmF1bHQgdmFsdWVzXHJcblx0XHRpdGVtLmZ1bGxXaWR0aCA9IGl0ZW0uZnVsbFdpZHRoIHx8IGZhbHNlO1xyXG5cdFx0aXRlbS5wb3NpdGlvbiA9IGl0ZW0ucG9zaXRpb24gfHwgJ3RvcCc7XHJcblx0XHRpdGVtLndlaWdodCA9IGl0ZW0ud2VpZ2h0IHx8IDA7XHJcblxyXG5cdFx0Y2hhcnQuYm94ZXMucHVzaChpdGVtKTtcclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBSZW1vdmUgYSBsYXlvdXRJdGVtIGZyb20gYSBjaGFydFxyXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gdGhlIGNoYXJ0IHRvIHJlbW92ZSB0aGUgYm94IGZyb21cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gbGF5b3V0SXRlbSAtIHRoZSBpdGVtIHRvIHJlbW92ZSBmcm9tIHRoZSBsYXlvdXRcclxuXHQgKi9cclxuXHRyZW1vdmVCb3g6IGZ1bmN0aW9uKGNoYXJ0LCBsYXlvdXRJdGVtKSB7XHJcblx0XHR2YXIgaW5kZXggPSBjaGFydC5ib3hlcyA/IGNoYXJ0LmJveGVzLmluZGV4T2YobGF5b3V0SXRlbSkgOiAtMTtcclxuXHRcdGlmIChpbmRleCAhPT0gLTEpIHtcclxuXHRcdFx0Y2hhcnQuYm94ZXMuc3BsaWNlKGluZGV4LCAxKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIChvciB1cGRhdGVzKSBvcHRpb25zIG9uIHRoZSBnaXZlbiBgaXRlbWAuXHJcblx0ICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSB0aGUgY2hhcnQgaW4gd2hpY2ggdGhlIGl0ZW0gbGl2ZXMgKG9yIHdpbGwgYmUgYWRkZWQgdG8pXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gLSB0aGUgaXRlbSB0byBjb25maWd1cmUgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9uc1xyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gdGhlIG5ldyBpdGVtIG9wdGlvbnMuXHJcblx0ICovXHJcblx0Y29uZmlndXJlOiBmdW5jdGlvbihjaGFydCwgaXRlbSwgb3B0aW9ucykge1xyXG5cdFx0dmFyIHByb3BzID0gWydmdWxsV2lkdGgnLCAncG9zaXRpb24nLCAnd2VpZ2h0J107XHJcblx0XHR2YXIgaWxlbiA9IHByb3BzLmxlbmd0aDtcclxuXHRcdHZhciBpID0gMDtcclxuXHRcdHZhciBwcm9wO1xyXG5cclxuXHRcdGZvciAoOyBpIDwgaWxlbjsgKytpKSB7XHJcblx0XHRcdHByb3AgPSBwcm9wc1tpXTtcclxuXHRcdFx0aWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkocHJvcCkpIHtcclxuXHRcdFx0XHRpdGVtW3Byb3BdID0gb3B0aW9uc1twcm9wXTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdC8qKlxyXG5cdCAqIEZpdHMgYm94ZXMgb2YgdGhlIGdpdmVuIGNoYXJ0IGludG8gdGhlIGdpdmVuIHNpemUgYnkgaGF2aW5nIGVhY2ggYm94IG1lYXN1cmUgaXRzZWxmXHJcblx0ICogdGhlbiBydW5uaW5nIGEgZml0dGluZyBhbGdvcml0aG1cclxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIHRoZSBjaGFydFxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIHRoZSB3aWR0aCB0byBmaXQgaW50b1xyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSB0aGUgaGVpZ2h0IHRvIGZpdCBpbnRvXHJcblx0ICovXHJcblx0dXBkYXRlOiBmdW5jdGlvbihjaGFydCwgd2lkdGgsIGhlaWdodCkge1xyXG5cdFx0aWYgKCFjaGFydCkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGxheW91dE9wdGlvbnMgPSBjaGFydC5vcHRpb25zLmxheW91dCB8fCB7fTtcclxuXHRcdHZhciBwYWRkaW5nID0gaGVscGVycy5vcHRpb25zLnRvUGFkZGluZyhsYXlvdXRPcHRpb25zLnBhZGRpbmcpO1xyXG5cdFx0dmFyIGxlZnRQYWRkaW5nID0gcGFkZGluZy5sZWZ0O1xyXG5cdFx0dmFyIHJpZ2h0UGFkZGluZyA9IHBhZGRpbmcucmlnaHQ7XHJcblx0XHR2YXIgdG9wUGFkZGluZyA9IHBhZGRpbmcudG9wO1xyXG5cdFx0dmFyIGJvdHRvbVBhZGRpbmcgPSBwYWRkaW5nLmJvdHRvbTtcclxuXHJcblx0XHR2YXIgbGVmdEJveGVzID0gZmlsdGVyQnlQb3NpdGlvbihjaGFydC5ib3hlcywgJ2xlZnQnKTtcclxuXHRcdHZhciByaWdodEJveGVzID0gZmlsdGVyQnlQb3NpdGlvbihjaGFydC5ib3hlcywgJ3JpZ2h0Jyk7XHJcblx0XHR2YXIgdG9wQm94ZXMgPSBmaWx0ZXJCeVBvc2l0aW9uKGNoYXJ0LmJveGVzLCAndG9wJyk7XHJcblx0XHR2YXIgYm90dG9tQm94ZXMgPSBmaWx0ZXJCeVBvc2l0aW9uKGNoYXJ0LmJveGVzLCAnYm90dG9tJyk7XHJcblx0XHR2YXIgY2hhcnRBcmVhQm94ZXMgPSBmaWx0ZXJCeVBvc2l0aW9uKGNoYXJ0LmJveGVzLCAnY2hhcnRBcmVhJyk7XHJcblxyXG5cdFx0Ly8gU29ydCBib3hlcyBieSB3ZWlnaHQuIEEgaGlnaGVyIHdlaWdodCBpcyBmdXJ0aGVyIGF3YXkgZnJvbSB0aGUgY2hhcnQgYXJlYVxyXG5cdFx0c29ydEJ5V2VpZ2h0KGxlZnRCb3hlcywgdHJ1ZSk7XHJcblx0XHRzb3J0QnlXZWlnaHQocmlnaHRCb3hlcywgZmFsc2UpO1xyXG5cdFx0c29ydEJ5V2VpZ2h0KHRvcEJveGVzLCB0cnVlKTtcclxuXHRcdHNvcnRCeVdlaWdodChib3R0b21Cb3hlcywgZmFsc2UpO1xyXG5cclxuXHRcdC8vIEVzc2VudGlhbGx5IHdlIG5vdyBoYXZlIGFueSBudW1iZXIgb2YgYm94ZXMgb24gZWFjaCBvZiB0aGUgNCBzaWRlcy5cclxuXHRcdC8vIE91ciBjYW52YXMgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nLlxyXG5cdFx0Ly8gVGhlIGFyZWFzIEwxIGFuZCBMMiBhcmUgdGhlIGxlZnQgYXhlcy4gUjEgaXMgdGhlIHJpZ2h0IGF4aXMsIFQxIGlzIHRoZSB0b3AgYXhpcyBhbmRcclxuXHRcdC8vIEIxIGlzIHRoZSBib3R0b20gYXhpc1xyXG5cdFx0Ly8gVGhlcmUgYXJlIGFsc28gNCBxdWFkcmFudC1saWtlIGxvY2F0aW9ucyAobGVmdCB0byByaWdodCBpbnN0ZWFkIG9mIGNsb2Nrd2lzZSkgcmVzZXJ2ZWQgZm9yIGNoYXJ0IG92ZXJsYXlzXHJcblx0XHQvLyBUaGVzZSBsb2NhdGlvbnMgYXJlIHNpbmdsZS1ib3ggbG9jYXRpb25zIG9ubHksIHdoZW4gdHJ5aW5nIHRvIHJlZ2lzdGVyIGEgY2hhcnRBcmVhIGxvY2F0aW9uIHRoYXQgaXMgYWxyZWFkeSB0YWtlbixcclxuXHRcdC8vIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLlxyXG5cdFx0Ly9cclxuXHRcdC8vIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxyXG5cdFx0Ly8gfCAgICAgICAgICAgICAgICAgIFQxIChGdWxsIFdpZHRoKSAgICAgICAgICAgICAgICAgICB8XHJcblx0XHQvLyB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcclxuXHRcdC8vIHwgICAgfCAgICB8ICAgICAgICAgICAgICAgICBUMiAgICAgICAgICAgICAgICAgIHwgICAgfFxyXG5cdFx0Ly8gfCAgICB8LS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS18XHJcblx0XHQvLyB8ICAgIHwgICAgfCBDMSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDMiB8ICAgIHxcclxuXHRcdC8vIHwgICAgfCAgICB8LS0tLXwgICAgICAgICAgICAgICAgICAgICAgICAgICB8LS0tLXwgICAgfFxyXG5cdFx0Ly8gfCAgICB8ICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICB8XHJcblx0XHQvLyB8IEwxIHwgTDIgfCAgICAgICAgICAgQ2hhcnRBcmVhIChDMCkgICAgICAgICAgICB8IFIxIHxcclxuXHRcdC8vIHwgICAgfCAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgfFxyXG5cdFx0Ly8gfCAgICB8ICAgIHwtLS0tfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLS0tfCAgICB8XHJcblx0XHQvLyB8ICAgIHwgICAgfCBDMyB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDNCB8ICAgIHxcclxuXHRcdC8vIHwgICAgfC0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tfFxyXG5cdFx0Ly8gfCAgICB8ICAgIHwgICAgICAgICAgICAgICAgIEIxICAgICAgICAgICAgICAgICAgfCAgICB8XHJcblx0XHQvLyB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcclxuXHRcdC8vIHwgICAgICAgICAgICAgICAgICBCMiAoRnVsbCBXaWR0aCkgICAgICAgICAgICAgICAgICAgfFxyXG5cdFx0Ly8gfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XHJcblx0XHQvL1xyXG5cdFx0Ly8gV2hhdCB3ZSBkbyB0byBmaW5kIHRoZSBiZXN0IHNpemluZywgd2UgZG8gdGhlIGZvbGxvd2luZ1xyXG5cdFx0Ly8gMS4gRGV0ZXJtaW5lIHRoZSBtaW5pbXVtIHNpemUgb2YgdGhlIGNoYXJ0IGFyZWEuXHJcblx0XHQvLyAyLiBTcGxpdCB0aGUgcmVtYWluaW5nIHdpZHRoIGVxdWFsbHkgYmV0d2VlbiBlYWNoIHZlcnRpY2FsIGF4aXNcclxuXHRcdC8vIDMuIFNwbGl0IHRoZSByZW1haW5pbmcgaGVpZ2h0IGVxdWFsbHkgYmV0d2VlbiBlYWNoIGhvcml6b250YWwgYXhpc1xyXG5cdFx0Ly8gNC4gR2l2ZSBlYWNoIGxheW91dCB0aGUgbWF4aW11bSBzaXplIGl0IGNhbiBiZS4gVGhlIGxheW91dCB3aWxsIHJldHVybiBpdCdzIG1pbmltdW0gc2l6ZVxyXG5cdFx0Ly8gNS4gQWRqdXN0IHRoZSBzaXplcyBvZiBlYWNoIGF4aXMgYmFzZWQgb24gaXQncyBtaW5pbXVtIHJlcG9ydGVkIHNpemUuXHJcblx0XHQvLyA2LiBSZWZpdCBlYWNoIGF4aXNcclxuXHRcdC8vIDcuIFBvc2l0aW9uIGVhY2ggYXhpcyBpbiB0aGUgZmluYWwgbG9jYXRpb25cclxuXHRcdC8vIDguIFRlbGwgdGhlIGNoYXJ0IHRoZSBmaW5hbCBsb2NhdGlvbiBvZiB0aGUgY2hhcnQgYXJlYVxyXG5cdFx0Ly8gOS4gVGVsbCBhbnkgYXhlcyB0aGF0IG92ZXJsYXkgdGhlIGNoYXJ0IGFyZWEgdGhlIHBvc2l0aW9ucyBvZiB0aGUgY2hhcnQgYXJlYVxyXG5cclxuXHRcdC8vIFN0ZXAgMVxyXG5cdFx0dmFyIGNoYXJ0V2lkdGggPSB3aWR0aCAtIGxlZnRQYWRkaW5nIC0gcmlnaHRQYWRkaW5nO1xyXG5cdFx0dmFyIGNoYXJ0SGVpZ2h0ID0gaGVpZ2h0IC0gdG9wUGFkZGluZyAtIGJvdHRvbVBhZGRpbmc7XHJcblx0XHR2YXIgY2hhcnRBcmVhV2lkdGggPSBjaGFydFdpZHRoIC8gMjsgLy8gbWluIDUwJVxyXG5cdFx0dmFyIGNoYXJ0QXJlYUhlaWdodCA9IGNoYXJ0SGVpZ2h0IC8gMjsgLy8gbWluIDUwJVxyXG5cclxuXHRcdC8vIFN0ZXAgMlxyXG5cdFx0dmFyIHZlcnRpY2FsQm94V2lkdGggPSAod2lkdGggLSBjaGFydEFyZWFXaWR0aCkgLyAobGVmdEJveGVzLmxlbmd0aCArIHJpZ2h0Qm94ZXMubGVuZ3RoKTtcclxuXHJcblx0XHQvLyBTdGVwIDNcclxuXHRcdHZhciBob3Jpem9udGFsQm94SGVpZ2h0ID0gKGhlaWdodCAtIGNoYXJ0QXJlYUhlaWdodCkgLyAodG9wQm94ZXMubGVuZ3RoICsgYm90dG9tQm94ZXMubGVuZ3RoKTtcclxuXHJcblx0XHQvLyBTdGVwIDRcclxuXHRcdHZhciBtYXhDaGFydEFyZWFXaWR0aCA9IGNoYXJ0V2lkdGg7XHJcblx0XHR2YXIgbWF4Q2hhcnRBcmVhSGVpZ2h0ID0gY2hhcnRIZWlnaHQ7XHJcblx0XHR2YXIgbWluQm94U2l6ZXMgPSBbXTtcclxuXHJcblx0XHRmdW5jdGlvbiBnZXRNaW5pbXVtQm94U2l6ZShib3gpIHtcclxuXHRcdFx0dmFyIG1pblNpemU7XHJcblx0XHRcdHZhciBpc0hvcml6b250YWwgPSBib3guaXNIb3Jpem9udGFsKCk7XHJcblxyXG5cdFx0XHRpZiAoaXNIb3Jpem9udGFsKSB7XHJcblx0XHRcdFx0bWluU2l6ZSA9IGJveC51cGRhdGUoYm94LmZ1bGxXaWR0aCA/IGNoYXJ0V2lkdGggOiBtYXhDaGFydEFyZWFXaWR0aCwgaG9yaXpvbnRhbEJveEhlaWdodCk7XHJcblx0XHRcdFx0bWF4Q2hhcnRBcmVhSGVpZ2h0IC09IG1pblNpemUuaGVpZ2h0O1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdG1pblNpemUgPSBib3gudXBkYXRlKHZlcnRpY2FsQm94V2lkdGgsIG1heENoYXJ0QXJlYUhlaWdodCk7XHJcblx0XHRcdFx0bWF4Q2hhcnRBcmVhV2lkdGggLT0gbWluU2l6ZS53aWR0aDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bWluQm94U2l6ZXMucHVzaCh7XHJcblx0XHRcdFx0aG9yaXpvbnRhbDogaXNIb3Jpem9udGFsLFxyXG5cdFx0XHRcdG1pblNpemU6IG1pblNpemUsXHJcblx0XHRcdFx0Ym94OiBib3gsXHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGhlbHBlcnMuZWFjaChsZWZ0Qm94ZXMuY29uY2F0KHJpZ2h0Qm94ZXMsIHRvcEJveGVzLCBib3R0b21Cb3hlcyksIGdldE1pbmltdW1Cb3hTaXplKTtcclxuXHJcblx0XHQvLyBJZiBhIGhvcml6b250YWwgYm94IGhhcyBwYWRkaW5nLCB3ZSBtb3ZlIHRoZSBsZWZ0IGJveGVzIG92ZXIgdG8gYXZvaWQgdWdseSBjaGFydHMgKHNlZSBpc3N1ZSAjMjQ3OClcclxuXHRcdHZhciBtYXhIb3Jpem9udGFsTGVmdFBhZGRpbmcgPSAwO1xyXG5cdFx0dmFyIG1heEhvcml6b250YWxSaWdodFBhZGRpbmcgPSAwO1xyXG5cdFx0dmFyIG1heFZlcnRpY2FsVG9wUGFkZGluZyA9IDA7XHJcblx0XHR2YXIgbWF4VmVydGljYWxCb3R0b21QYWRkaW5nID0gMDtcclxuXHJcblx0XHRoZWxwZXJzLmVhY2godG9wQm94ZXMuY29uY2F0KGJvdHRvbUJveGVzKSwgZnVuY3Rpb24oaG9yaXpvbnRhbEJveCkge1xyXG5cdFx0XHRpZiAoaG9yaXpvbnRhbEJveC5nZXRQYWRkaW5nKSB7XHJcblx0XHRcdFx0dmFyIGJveFBhZGRpbmcgPSBob3Jpem9udGFsQm94LmdldFBhZGRpbmcoKTtcclxuXHRcdFx0XHRtYXhIb3Jpem9udGFsTGVmdFBhZGRpbmcgPSBNYXRoLm1heChtYXhIb3Jpem9udGFsTGVmdFBhZGRpbmcsIGJveFBhZGRpbmcubGVmdCk7XHJcblx0XHRcdFx0bWF4SG9yaXpvbnRhbFJpZ2h0UGFkZGluZyA9IE1hdGgubWF4KG1heEhvcml6b250YWxSaWdodFBhZGRpbmcsIGJveFBhZGRpbmcucmlnaHQpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHRoZWxwZXJzLmVhY2gobGVmdEJveGVzLmNvbmNhdChyaWdodEJveGVzKSwgZnVuY3Rpb24odmVydGljYWxCb3gpIHtcclxuXHRcdFx0aWYgKHZlcnRpY2FsQm94LmdldFBhZGRpbmcpIHtcclxuXHRcdFx0XHR2YXIgYm94UGFkZGluZyA9IHZlcnRpY2FsQm94LmdldFBhZGRpbmcoKTtcclxuXHRcdFx0XHRtYXhWZXJ0aWNhbFRvcFBhZGRpbmcgPSBNYXRoLm1heChtYXhWZXJ0aWNhbFRvcFBhZGRpbmcsIGJveFBhZGRpbmcudG9wKTtcclxuXHRcdFx0XHRtYXhWZXJ0aWNhbEJvdHRvbVBhZGRpbmcgPSBNYXRoLm1heChtYXhWZXJ0aWNhbEJvdHRvbVBhZGRpbmcsIGJveFBhZGRpbmcuYm90dG9tKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gQXQgdGhpcyBwb2ludCwgbWF4Q2hhcnRBcmVhSGVpZ2h0IGFuZCBtYXhDaGFydEFyZWFXaWR0aCBhcmUgdGhlIHNpemUgdGhlIGNoYXJ0IGFyZWEgY291bGRcclxuXHRcdC8vIGJlIGlmIHRoZSBheGVzIGFyZSBkcmF3biBhdCB0aGVpciBtaW5pbXVtIHNpemVzLlxyXG5cdFx0Ly8gU3RlcHMgNSAmIDZcclxuXHRcdHZhciB0b3RhbExlZnRCb3hlc1dpZHRoID0gbGVmdFBhZGRpbmc7XHJcblx0XHR2YXIgdG90YWxSaWdodEJveGVzV2lkdGggPSByaWdodFBhZGRpbmc7XHJcblx0XHR2YXIgdG90YWxUb3BCb3hlc0hlaWdodCA9IHRvcFBhZGRpbmc7XHJcblx0XHR2YXIgdG90YWxCb3R0b21Cb3hlc0hlaWdodCA9IGJvdHRvbVBhZGRpbmc7XHJcblxyXG5cdFx0Ly8gRnVuY3Rpb24gdG8gZml0IGEgYm94XHJcblx0XHRmdW5jdGlvbiBmaXRCb3goYm94KSB7XHJcblx0XHRcdHZhciBtaW5Cb3hTaXplID0gaGVscGVycy5maW5kTmV4dFdoZXJlKG1pbkJveFNpemVzLCBmdW5jdGlvbihtaW5Cb3gpIHtcclxuXHRcdFx0XHRyZXR1cm4gbWluQm94LmJveCA9PT0gYm94O1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdGlmIChtaW5Cb3hTaXplKSB7XHJcblx0XHRcdFx0aWYgKGJveC5pc0hvcml6b250YWwoKSkge1xyXG5cdFx0XHRcdFx0dmFyIHNjYWxlTWFyZ2luID0ge1xyXG5cdFx0XHRcdFx0XHRsZWZ0OiBNYXRoLm1heCh0b3RhbExlZnRCb3hlc1dpZHRoLCBtYXhIb3Jpem9udGFsTGVmdFBhZGRpbmcpLFxyXG5cdFx0XHRcdFx0XHRyaWdodDogTWF0aC5tYXgodG90YWxSaWdodEJveGVzV2lkdGgsIG1heEhvcml6b250YWxSaWdodFBhZGRpbmcpLFxyXG5cdFx0XHRcdFx0XHR0b3A6IDAsXHJcblx0XHRcdFx0XHRcdGJvdHRvbTogMFxyXG5cdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHQvLyBEb24ndCB1c2UgbWluIHNpemUgaGVyZSBiZWNhdXNlIG9mIGxhYmVsIHJvdGF0aW9uLiBXaGVuIHRoZSBsYWJlbHMgYXJlIHJvdGF0ZWQsIHRoZWlyIHJvdGF0aW9uIGhpZ2hseSBkZXBlbmRzXHJcblx0XHRcdFx0XHQvLyBvbiB0aGUgbWFyZ2luLiBTb21ldGltZXMgdGhleSBuZWVkIHRvIGluY3JlYXNlIGluIHNpemUgc2xpZ2h0bHlcclxuXHRcdFx0XHRcdGJveC51cGRhdGUoYm94LmZ1bGxXaWR0aCA/IGNoYXJ0V2lkdGggOiBtYXhDaGFydEFyZWFXaWR0aCwgY2hhcnRIZWlnaHQgLyAyLCBzY2FsZU1hcmdpbik7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGJveC51cGRhdGUobWluQm94U2l6ZS5taW5TaXplLndpZHRoLCBtYXhDaGFydEFyZWFIZWlnaHQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFVwZGF0ZSwgYW5kIGNhbGN1bGF0ZSB0aGUgbGVmdCBhbmQgcmlnaHQgbWFyZ2lucyBmb3IgdGhlIGhvcml6b250YWwgYm94ZXNcclxuXHRcdGhlbHBlcnMuZWFjaChsZWZ0Qm94ZXMuY29uY2F0KHJpZ2h0Qm94ZXMpLCBmaXRCb3gpO1xyXG5cclxuXHRcdGhlbHBlcnMuZWFjaChsZWZ0Qm94ZXMsIGZ1bmN0aW9uKGJveCkge1xyXG5cdFx0XHR0b3RhbExlZnRCb3hlc1dpZHRoICs9IGJveC53aWR0aDtcclxuXHRcdH0pO1xyXG5cclxuXHRcdGhlbHBlcnMuZWFjaChyaWdodEJveGVzLCBmdW5jdGlvbihib3gpIHtcclxuXHRcdFx0dG90YWxSaWdodEJveGVzV2lkdGggKz0gYm94LndpZHRoO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gU2V0IHRoZSBMZWZ0IGFuZCBSaWdodCBtYXJnaW5zIGZvciB0aGUgaG9yaXpvbnRhbCBib3hlc1xyXG5cdFx0aGVscGVycy5lYWNoKHRvcEJveGVzLmNvbmNhdChib3R0b21Cb3hlcyksIGZpdEJveCk7XHJcblxyXG5cdFx0Ly8gRmlndXJlIG91dCBob3cgbXVjaCBtYXJnaW4gaXMgb24gdGhlIHRvcCBhbmQgYm90dG9tIG9mIHRoZSB2ZXJ0aWNhbCBib3hlc1xyXG5cdFx0aGVscGVycy5lYWNoKHRvcEJveGVzLCBmdW5jdGlvbihib3gpIHtcclxuXHRcdFx0dG90YWxUb3BCb3hlc0hlaWdodCArPSBib3guaGVpZ2h0O1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0aGVscGVycy5lYWNoKGJvdHRvbUJveGVzLCBmdW5jdGlvbihib3gpIHtcclxuXHRcdFx0dG90YWxCb3R0b21Cb3hlc0hlaWdodCArPSBib3guaGVpZ2h0O1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0ZnVuY3Rpb24gZmluYWxGaXRWZXJ0aWNhbEJveChib3gpIHtcclxuXHRcdFx0dmFyIG1pbkJveFNpemUgPSBoZWxwZXJzLmZpbmROZXh0V2hlcmUobWluQm94U2l6ZXMsIGZ1bmN0aW9uKG1pblNpemUpIHtcclxuXHRcdFx0XHRyZXR1cm4gbWluU2l6ZS5ib3ggPT09IGJveDtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHR2YXIgc2NhbGVNYXJnaW4gPSB7XHJcblx0XHRcdFx0bGVmdDogMCxcclxuXHRcdFx0XHRyaWdodDogMCxcclxuXHRcdFx0XHR0b3A6IHRvdGFsVG9wQm94ZXNIZWlnaHQsXHJcblx0XHRcdFx0Ym90dG9tOiB0b3RhbEJvdHRvbUJveGVzSGVpZ2h0XHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRpZiAobWluQm94U2l6ZSkge1xyXG5cdFx0XHRcdGJveC51cGRhdGUobWluQm94U2l6ZS5taW5TaXplLndpZHRoLCBtYXhDaGFydEFyZWFIZWlnaHQsIHNjYWxlTWFyZ2luKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIExldCB0aGUgbGVmdCBsYXlvdXQga25vdyB0aGUgZmluYWwgbWFyZ2luXHJcblx0XHRoZWxwZXJzLmVhY2gobGVmdEJveGVzLmNvbmNhdChyaWdodEJveGVzKSwgZmluYWxGaXRWZXJ0aWNhbEJveCk7XHJcblxyXG5cdFx0Ly8gUmVjYWxjdWxhdGUgYmVjYXVzZSB0aGUgc2l6ZSBvZiBlYWNoIGxheW91dCBtaWdodCBoYXZlIGNoYW5nZWQgc2xpZ2h0bHkgZHVlIHRvIHRoZSBtYXJnaW5zIChsYWJlbCByb3RhdGlvbiBmb3IgaW5zdGFuY2UpXHJcblx0XHR0b3RhbExlZnRCb3hlc1dpZHRoID0gbGVmdFBhZGRpbmc7XHJcblx0XHR0b3RhbFJpZ2h0Qm94ZXNXaWR0aCA9IHJpZ2h0UGFkZGluZztcclxuXHRcdHRvdGFsVG9wQm94ZXNIZWlnaHQgPSB0b3BQYWRkaW5nO1xyXG5cdFx0dG90YWxCb3R0b21Cb3hlc0hlaWdodCA9IGJvdHRvbVBhZGRpbmc7XHJcblxyXG5cdFx0aGVscGVycy5lYWNoKGxlZnRCb3hlcywgZnVuY3Rpb24oYm94KSB7XHJcblx0XHRcdHRvdGFsTGVmdEJveGVzV2lkdGggKz0gYm94LndpZHRoO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0aGVscGVycy5lYWNoKHJpZ2h0Qm94ZXMsIGZ1bmN0aW9uKGJveCkge1xyXG5cdFx0XHR0b3RhbFJpZ2h0Qm94ZXNXaWR0aCArPSBib3gud2lkdGg7XHJcblx0XHR9KTtcclxuXHJcblx0XHRoZWxwZXJzLmVhY2godG9wQm94ZXMsIGZ1bmN0aW9uKGJveCkge1xyXG5cdFx0XHR0b3RhbFRvcEJveGVzSGVpZ2h0ICs9IGJveC5oZWlnaHQ7XHJcblx0XHR9KTtcclxuXHRcdGhlbHBlcnMuZWFjaChib3R0b21Cb3hlcywgZnVuY3Rpb24oYm94KSB7XHJcblx0XHRcdHRvdGFsQm90dG9tQm94ZXNIZWlnaHQgKz0gYm94LmhlaWdodDtcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIFdlIG1heSBiZSBhZGRpbmcgc29tZSBwYWRkaW5nIHRvIGFjY291bnQgZm9yIHJvdGF0ZWQgeCBheGlzIGxhYmVsc1xyXG5cdFx0dmFyIGxlZnRQYWRkaW5nQWRkaXRpb24gPSBNYXRoLm1heChtYXhIb3Jpem9udGFsTGVmdFBhZGRpbmcgLSB0b3RhbExlZnRCb3hlc1dpZHRoLCAwKTtcclxuXHRcdHRvdGFsTGVmdEJveGVzV2lkdGggKz0gbGVmdFBhZGRpbmdBZGRpdGlvbjtcclxuXHRcdHRvdGFsUmlnaHRCb3hlc1dpZHRoICs9IE1hdGgubWF4KG1heEhvcml6b250YWxSaWdodFBhZGRpbmcgLSB0b3RhbFJpZ2h0Qm94ZXNXaWR0aCwgMCk7XHJcblxyXG5cdFx0dmFyIHRvcFBhZGRpbmdBZGRpdGlvbiA9IE1hdGgubWF4KG1heFZlcnRpY2FsVG9wUGFkZGluZyAtIHRvdGFsVG9wQm94ZXNIZWlnaHQsIDApO1xyXG5cdFx0dG90YWxUb3BCb3hlc0hlaWdodCArPSB0b3BQYWRkaW5nQWRkaXRpb247XHJcblx0XHR0b3RhbEJvdHRvbUJveGVzSGVpZ2h0ICs9IE1hdGgubWF4KG1heFZlcnRpY2FsQm90dG9tUGFkZGluZyAtIHRvdGFsQm90dG9tQm94ZXNIZWlnaHQsIDApO1xyXG5cclxuXHRcdC8vIEZpZ3VyZSBvdXQgaWYgb3VyIGNoYXJ0IGFyZWEgY2hhbmdlZC4gVGhpcyB3b3VsZCBvY2N1ciBpZiB0aGUgZGF0YXNldCBsYXlvdXQgbGFiZWwgcm90YXRpb25cclxuXHRcdC8vIGNoYW5nZWQgZHVlIHRvIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgbWFyZ2lucyBpbiBzdGVwIDYuIFNpbmNlIHdlIGNhbiBvbmx5IGdldCBiaWdnZXIsIHRoaXMgaXMgc2FmZSB0byBkb1xyXG5cdFx0Ly8gd2l0aG91dCBjYWxsaW5nIGBmaXRgIGFnYWluXHJcblx0XHR2YXIgbmV3TWF4Q2hhcnRBcmVhSGVpZ2h0ID0gaGVpZ2h0IC0gdG90YWxUb3BCb3hlc0hlaWdodCAtIHRvdGFsQm90dG9tQm94ZXNIZWlnaHQ7XHJcblx0XHR2YXIgbmV3TWF4Q2hhcnRBcmVhV2lkdGggPSB3aWR0aCAtIHRvdGFsTGVmdEJveGVzV2lkdGggLSB0b3RhbFJpZ2h0Qm94ZXNXaWR0aDtcclxuXHJcblx0XHRpZiAobmV3TWF4Q2hhcnRBcmVhV2lkdGggIT09IG1heENoYXJ0QXJlYVdpZHRoIHx8IG5ld01heENoYXJ0QXJlYUhlaWdodCAhPT0gbWF4Q2hhcnRBcmVhSGVpZ2h0KSB7XHJcblx0XHRcdGhlbHBlcnMuZWFjaChsZWZ0Qm94ZXMsIGZ1bmN0aW9uKGJveCkge1xyXG5cdFx0XHRcdGJveC5oZWlnaHQgPSBuZXdNYXhDaGFydEFyZWFIZWlnaHQ7XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0aGVscGVycy5lYWNoKHJpZ2h0Qm94ZXMsIGZ1bmN0aW9uKGJveCkge1xyXG5cdFx0XHRcdGJveC5oZWlnaHQgPSBuZXdNYXhDaGFydEFyZWFIZWlnaHQ7XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0aGVscGVycy5lYWNoKHRvcEJveGVzLCBmdW5jdGlvbihib3gpIHtcclxuXHRcdFx0XHRpZiAoIWJveC5mdWxsV2lkdGgpIHtcclxuXHRcdFx0XHRcdGJveC53aWR0aCA9IG5ld01heENoYXJ0QXJlYVdpZHRoO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRoZWxwZXJzLmVhY2goYm90dG9tQm94ZXMsIGZ1bmN0aW9uKGJveCkge1xyXG5cdFx0XHRcdGlmICghYm94LmZ1bGxXaWR0aCkge1xyXG5cdFx0XHRcdFx0Ym94LndpZHRoID0gbmV3TWF4Q2hhcnRBcmVhV2lkdGg7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdG1heENoYXJ0QXJlYUhlaWdodCA9IG5ld01heENoYXJ0QXJlYUhlaWdodDtcclxuXHRcdFx0bWF4Q2hhcnRBcmVhV2lkdGggPSBuZXdNYXhDaGFydEFyZWFXaWR0aDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBTdGVwIDcgLSBQb3NpdGlvbiB0aGUgYm94ZXNcclxuXHRcdHZhciBsZWZ0ID0gbGVmdFBhZGRpbmcgKyBsZWZ0UGFkZGluZ0FkZGl0aW9uO1xyXG5cdFx0dmFyIHRvcCA9IHRvcFBhZGRpbmcgKyB0b3BQYWRkaW5nQWRkaXRpb247XHJcblxyXG5cdFx0ZnVuY3Rpb24gcGxhY2VCb3goYm94KSB7XHJcblx0XHRcdGlmIChib3guaXNIb3Jpem9udGFsKCkpIHtcclxuXHRcdFx0XHRib3gubGVmdCA9IGJveC5mdWxsV2lkdGggPyBsZWZ0UGFkZGluZyA6IHRvdGFsTGVmdEJveGVzV2lkdGg7XHJcblx0XHRcdFx0Ym94LnJpZ2h0ID0gYm94LmZ1bGxXaWR0aCA/IHdpZHRoIC0gcmlnaHRQYWRkaW5nIDogdG90YWxMZWZ0Qm94ZXNXaWR0aCArIG1heENoYXJ0QXJlYVdpZHRoO1xyXG5cdFx0XHRcdGJveC50b3AgPSB0b3A7XHJcblx0XHRcdFx0Ym94LmJvdHRvbSA9IHRvcCArIGJveC5oZWlnaHQ7XHJcblxyXG5cdFx0XHRcdC8vIE1vdmUgdG8gbmV4dCBwb2ludFxyXG5cdFx0XHRcdHRvcCA9IGJveC5ib3R0b207XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cclxuXHRcdFx0XHRib3gubGVmdCA9IGxlZnQ7XHJcblx0XHRcdFx0Ym94LnJpZ2h0ID0gbGVmdCArIGJveC53aWR0aDtcclxuXHRcdFx0XHRib3gudG9wID0gdG90YWxUb3BCb3hlc0hlaWdodDtcclxuXHRcdFx0XHRib3guYm90dG9tID0gdG90YWxUb3BCb3hlc0hlaWdodCArIG1heENoYXJ0QXJlYUhlaWdodDtcclxuXHJcblx0XHRcdFx0Ly8gTW92ZSB0byBuZXh0IHBvaW50XHJcblx0XHRcdFx0bGVmdCA9IGJveC5yaWdodDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdGhlbHBlcnMuZWFjaChsZWZ0Qm94ZXMuY29uY2F0KHRvcEJveGVzKSwgcGxhY2VCb3gpO1xyXG5cclxuXHRcdC8vIEFjY291bnQgZm9yIGNoYXJ0IHdpZHRoIGFuZCBoZWlnaHRcclxuXHRcdGxlZnQgKz0gbWF4Q2hhcnRBcmVhV2lkdGg7XHJcblx0XHR0b3AgKz0gbWF4Q2hhcnRBcmVhSGVpZ2h0O1xyXG5cclxuXHRcdGhlbHBlcnMuZWFjaChyaWdodEJveGVzLCBwbGFjZUJveCk7XHJcblx0XHRoZWxwZXJzLmVhY2goYm90dG9tQm94ZXMsIHBsYWNlQm94KTtcclxuXHJcblx0XHQvLyBTdGVwIDhcclxuXHRcdGNoYXJ0LmNoYXJ0QXJlYSA9IHtcclxuXHRcdFx0bGVmdDogdG90YWxMZWZ0Qm94ZXNXaWR0aCxcclxuXHRcdFx0dG9wOiB0b3RhbFRvcEJveGVzSGVpZ2h0LFxyXG5cdFx0XHRyaWdodDogdG90YWxMZWZ0Qm94ZXNXaWR0aCArIG1heENoYXJ0QXJlYVdpZHRoLFxyXG5cdFx0XHRib3R0b206IHRvdGFsVG9wQm94ZXNIZWlnaHQgKyBtYXhDaGFydEFyZWFIZWlnaHRcclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gU3RlcCA5XHJcblx0XHRoZWxwZXJzLmVhY2goY2hhcnRBcmVhQm94ZXMsIGZ1bmN0aW9uKGJveCkge1xyXG5cdFx0XHRib3gubGVmdCA9IGNoYXJ0LmNoYXJ0QXJlYS5sZWZ0O1xyXG5cdFx0XHRib3gudG9wID0gY2hhcnQuY2hhcnRBcmVhLnRvcDtcclxuXHRcdFx0Ym94LnJpZ2h0ID0gY2hhcnQuY2hhcnRBcmVhLnJpZ2h0O1xyXG5cdFx0XHRib3guYm90dG9tID0gY2hhcnQuY2hhcnRBcmVhLmJvdHRvbTtcclxuXHJcblx0XHRcdGJveC51cGRhdGUobWF4Q2hhcnRBcmVhV2lkdGgsIG1heENoYXJ0QXJlYUhlaWdodCk7XHJcblx0XHR9KTtcclxuXHR9XHJcbn07XHJcblxyXG59LHtcIjQ2XCI6NDZ9XSwzMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xyXG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xyXG5cclxuZGVmYXVsdHMuX3NldCgnZ2xvYmFsJywge1xyXG5cdHBsdWdpbnM6IHt9XHJcbn0pO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBwbHVnaW4gc2VydmljZSBzaW5nbGV0b25cclxuICogQG5hbWVzcGFjZSBDaGFydC5wbHVnaW5zXHJcbiAqIEBzaW5jZSAyLjEuMFxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblx0LyoqXHJcblx0ICogR2xvYmFsbHkgcmVnaXN0ZXJlZCBwbHVnaW5zLlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICovXHJcblx0X3BsdWdpbnM6IFtdLFxyXG5cclxuXHQvKipcclxuXHQgKiBUaGlzIGlkZW50aWZpZXIgaXMgdXNlZCB0byBpbnZhbGlkYXRlIHRoZSBkZXNjcmlwdG9ycyBjYWNoZSBhdHRhY2hlZCB0byBlYWNoIGNoYXJ0XHJcblx0ICogd2hlbiBhIGdsb2JhbCBwbHVnaW4gaXMgcmVnaXN0ZXJlZCBvciB1bnJlZ2lzdGVyZWQuIEluIHRoaXMgY2FzZSwgdGhlIGNhY2hlIElEIGlzXHJcblx0ICogaW5jcmVtZW50ZWQgYW5kIGRlc2NyaXB0b3JzIGFyZSByZWdlbmVyYXRlZCBkdXJpbmcgZm9sbG93aW5nIEFQSSBjYWxscy5cclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqL1xyXG5cdF9jYWNoZUlkOiAwLFxyXG5cclxuXHQvKipcclxuXHQgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIHBsdWdpbihzKSBpZiBub3QgYWxyZWFkeSByZWdpc3RlcmVkLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBwbHVnaW5zIHBsdWdpbiBpbnN0YW5jZShzKS5cclxuXHQgKi9cclxuXHRyZWdpc3RlcjogZnVuY3Rpb24ocGx1Z2lucykge1xyXG5cdFx0dmFyIHAgPSB0aGlzLl9wbHVnaW5zO1xyXG5cdFx0KFtdKS5jb25jYXQocGx1Z2lucykuZm9yRWFjaChmdW5jdGlvbihwbHVnaW4pIHtcclxuXHRcdFx0aWYgKHAuaW5kZXhPZihwbHVnaW4pID09PSAtMSkge1xyXG5cdFx0XHRcdHAucHVzaChwbHVnaW4pO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLl9jYWNoZUlkKys7XHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICogVW5yZWdpc3RlcnMgdGhlIGdpdmVuIHBsdWdpbihzKSBvbmx5IGlmIHJlZ2lzdGVyZWQuXHJcblx0ICogQHBhcmFtIHtBcnJheXxPYmplY3R9IHBsdWdpbnMgcGx1Z2luIGluc3RhbmNlKHMpLlxyXG5cdCAqL1xyXG5cdHVucmVnaXN0ZXI6IGZ1bmN0aW9uKHBsdWdpbnMpIHtcclxuXHRcdHZhciBwID0gdGhpcy5fcGx1Z2lucztcclxuXHRcdChbXSkuY29uY2F0KHBsdWdpbnMpLmZvckVhY2goZnVuY3Rpb24ocGx1Z2luKSB7XHJcblx0XHRcdHZhciBpZHggPSBwLmluZGV4T2YocGx1Z2luKTtcclxuXHRcdFx0aWYgKGlkeCAhPT0gLTEpIHtcclxuXHRcdFx0XHRwLnNwbGljZShpZHgsIDEpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHR0aGlzLl9jYWNoZUlkKys7XHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlIGFsbCByZWdpc3RlcmVkIHBsdWdpbnMuXHJcblx0ICogQHNpbmNlIDIuMS41XHJcblx0ICovXHJcblx0Y2xlYXI6IGZ1bmN0aW9uKCkge1xyXG5cdFx0dGhpcy5fcGx1Z2lucyA9IFtdO1xyXG5cdFx0dGhpcy5fY2FjaGVJZCsrO1xyXG5cdH0sXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIG51bWJlciBvZiByZWdpc3RlcmVkIHBsdWdpbnM/XHJcblx0ICogQHJldHVybnMge051bWJlcn1cclxuXHQgKiBAc2luY2UgMi4xLjVcclxuXHQgKi9cclxuXHRjb3VudDogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fcGx1Z2lucy5sZW5ndGg7XHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyBhbGwgcmVnaXN0ZXJlZCBwbHVnaW4gaW5zdGFuY2VzLlxyXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gYXJyYXkgb2YgcGx1Z2luIG9iamVjdHMuXHJcblx0ICogQHNpbmNlIDIuMS41XHJcblx0ICovXHJcblx0Z2V0QWxsOiBmdW5jdGlvbigpIHtcclxuXHRcdHJldHVybiB0aGlzLl9wbHVnaW5zO1xyXG5cdH0sXHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGxzIGVuYWJsZWQgcGx1Z2lucyBmb3IgYGNoYXJ0YCBvbiB0aGUgc3BlY2lmaWVkIGhvb2sgYW5kIHdpdGggdGhlIGdpdmVuIGFyZ3MuXHJcblx0ICogVGhpcyBtZXRob2QgaW1tZWRpYXRlbHkgcmV0dXJucyBhcyBzb29uIGFzIGEgcGx1Z2luIGV4cGxpY2l0bHkgcmV0dXJucyBmYWxzZS4gVGhlXHJcblx0ICogcmV0dXJuZWQgdmFsdWUgY2FuIGJlIHVzZWQsIGZvciBpbnN0YW5jZSwgdG8gaW50ZXJydXB0IHRoZSBjdXJyZW50IGFjdGlvbi5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UgZm9yIHdoaWNoIHBsdWdpbnMgc2hvdWxkIGJlIGNhbGxlZC5cclxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaG9vayAtIFRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gbWV0aG9kIHRvIGNhbGwgKGUuZy4gJ2JlZm9yZVVwZGF0ZScpLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXl9IFthcmdzXSAtIEV4dHJhIGFyZ3VtZW50cyB0byBhcHBseSB0byB0aGUgaG9vayBjYWxsLlxyXG5cdCAqIEByZXR1cm5zIHtCb29sZWFufSBmYWxzZSBpZiBhbnkgb2YgdGhlIHBsdWdpbnMgcmV0dXJuIGZhbHNlLCBlbHNlIHJldHVybnMgdHJ1ZS5cclxuXHQgKi9cclxuXHRub3RpZnk6IGZ1bmN0aW9uKGNoYXJ0LCBob29rLCBhcmdzKSB7XHJcblx0XHR2YXIgZGVzY3JpcHRvcnMgPSB0aGlzLmRlc2NyaXB0b3JzKGNoYXJ0KTtcclxuXHRcdHZhciBpbGVuID0gZGVzY3JpcHRvcnMubGVuZ3RoO1xyXG5cdFx0dmFyIGksIGRlc2NyaXB0b3IsIHBsdWdpbiwgcGFyYW1zLCBtZXRob2Q7XHJcblxyXG5cdFx0Zm9yIChpID0gMDsgaSA8IGlsZW47ICsraSkge1xyXG5cdFx0XHRkZXNjcmlwdG9yID0gZGVzY3JpcHRvcnNbaV07XHJcblx0XHRcdHBsdWdpbiA9IGRlc2NyaXB0b3IucGx1Z2luO1xyXG5cdFx0XHRtZXRob2QgPSBwbHVnaW5baG9va107XHJcblx0XHRcdGlmICh0eXBlb2YgbWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdFx0cGFyYW1zID0gW2NoYXJ0XS5jb25jYXQoYXJncyB8fCBbXSk7XHJcblx0XHRcdFx0cGFyYW1zLnB1c2goZGVzY3JpcHRvci5vcHRpb25zKTtcclxuXHRcdFx0XHRpZiAobWV0aG9kLmFwcGx5KHBsdWdpbiwgcGFyYW1zKSA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGRlc2NyaXB0b3JzIG9mIGVuYWJsZWQgcGx1Z2lucyBmb3IgdGhlIGdpdmVuIGNoYXJ0LlxyXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gW3sgcGx1Z2luLCBvcHRpb25zIH1dXHJcblx0ICogQHByaXZhdGVcclxuXHQgKi9cclxuXHRkZXNjcmlwdG9yczogZnVuY3Rpb24oY2hhcnQpIHtcclxuXHRcdHZhciBjYWNoZSA9IGNoYXJ0LiRwbHVnaW5zIHx8IChjaGFydC4kcGx1Z2lucyA9IHt9KTtcclxuXHRcdGlmIChjYWNoZS5pZCA9PT0gdGhpcy5fY2FjaGVJZCkge1xyXG5cdFx0XHRyZXR1cm4gY2FjaGUuZGVzY3JpcHRvcnM7XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIHBsdWdpbnMgPSBbXTtcclxuXHRcdHZhciBkZXNjcmlwdG9ycyA9IFtdO1xyXG5cdFx0dmFyIGNvbmZpZyA9IChjaGFydCAmJiBjaGFydC5jb25maWcpIHx8IHt9O1xyXG5cdFx0dmFyIG9wdGlvbnMgPSAoY29uZmlnLm9wdGlvbnMgJiYgY29uZmlnLm9wdGlvbnMucGx1Z2lucykgfHwge307XHJcblxyXG5cdFx0dGhpcy5fcGx1Z2lucy5jb25jYXQoY29uZmlnLnBsdWdpbnMgfHwgW10pLmZvckVhY2goZnVuY3Rpb24ocGx1Z2luKSB7XHJcblx0XHRcdHZhciBpZHggPSBwbHVnaW5zLmluZGV4T2YocGx1Z2luKTtcclxuXHRcdFx0aWYgKGlkeCAhPT0gLTEpIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHZhciBpZCA9IHBsdWdpbi5pZDtcclxuXHRcdFx0dmFyIG9wdHMgPSBvcHRpb25zW2lkXTtcclxuXHRcdFx0aWYgKG9wdHMgPT09IGZhbHNlKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAob3B0cyA9PT0gdHJ1ZSkge1xyXG5cdFx0XHRcdG9wdHMgPSBoZWxwZXJzLmNsb25lKGRlZmF1bHRzLmdsb2JhbC5wbHVnaW5zW2lkXSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHBsdWdpbnMucHVzaChwbHVnaW4pO1xyXG5cdFx0XHRkZXNjcmlwdG9ycy5wdXNoKHtcclxuXHRcdFx0XHRwbHVnaW46IHBsdWdpbixcclxuXHRcdFx0XHRvcHRpb25zOiBvcHRzIHx8IHt9XHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Y2FjaGUuZGVzY3JpcHRvcnMgPSBkZXNjcmlwdG9ycztcclxuXHRcdGNhY2hlLmlkID0gdGhpcy5fY2FjaGVJZDtcclxuXHRcdHJldHVybiBkZXNjcmlwdG9ycztcclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBJbnZhbGlkYXRlcyBjYWNoZSBmb3IgdGhlIGdpdmVuIGNoYXJ0OiBkZXNjcmlwdG9ycyBob2xkIGEgcmVmZXJlbmNlIG9uIHBsdWdpbiBvcHRpb24sXHJcblx0ICogYnV0IGluIHNvbWUgY2FzZXMsIHRoaXMgcmVmZXJlbmNlIGNhbiBiZSBjaGFuZ2VkIGJ5IHRoZSB1c2VyIHdoZW4gdXBkYXRpbmcgb3B0aW9ucy5cclxuXHQgKiBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvNTExMSNpc3N1ZWNvbW1lbnQtMzU1OTM0MTY3XHJcblx0ICogQHByaXZhdGVcclxuXHQgKi9cclxuXHRfaW52YWxpZGF0ZTogZnVuY3Rpb24oY2hhcnQpIHtcclxuXHRcdGRlbGV0ZSBjaGFydC4kcGx1Z2lucztcclxuXHR9XHJcbn07XHJcblxyXG4vKipcclxuICogUGx1Z2luIGV4dGVuc2lvbiBob29rcy5cclxuICogQGludGVyZmFjZSBJUGx1Z2luXHJcbiAqIEBzaW5jZSAyLjEuMFxyXG4gKi9cclxuLyoqXHJcbiAqIEBtZXRob2QgSVBsdWdpbiNiZWZvcmVJbml0XHJcbiAqIEBkZXNjIENhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGBjaGFydGAuXHJcbiAqIEBwYXJhbSB7Q2hhcnQuQ29udHJvbGxlcn0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxyXG4gKi9cclxuLyoqXHJcbiAqIEBtZXRob2QgSVBsdWdpbiNhZnRlckluaXRcclxuICogQGRlc2MgQ2FsbGVkIGFmdGVyIGBjaGFydGAgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYW5kIGJlZm9yZSB0aGUgZmlyc3QgdXBkYXRlLlxyXG4gKiBAcGFyYW0ge0NoYXJ0LkNvbnRyb2xsZXJ9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBwbHVnaW4gb3B0aW9ucy5cclxuICovXHJcbi8qKlxyXG4gKiBAbWV0aG9kIElQbHVnaW4jYmVmb3JlVXBkYXRlXHJcbiAqIEBkZXNjIENhbGxlZCBiZWZvcmUgdXBkYXRpbmcgYGNoYXJ0YC4gSWYgYW55IHBsdWdpbiByZXR1cm5zIGBmYWxzZWAsIHRoZSB1cGRhdGVcclxuICogaXMgY2FuY2VsbGVkIChhbmQgdGh1cyBzdWJzZXF1ZW50IHJlbmRlcihzKSkgdW50aWwgYW5vdGhlciBgdXBkYXRlYCBpcyB0cmlnZ2VyZWQuXHJcbiAqIEBwYXJhbSB7Q2hhcnQuQ29udHJvbGxlcn0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYGZhbHNlYCB0byBjYW5jZWwgdGhlIGNoYXJ0IHVwZGF0ZS5cclxuICovXHJcbi8qKlxyXG4gKiBAbWV0aG9kIElQbHVnaW4jYWZ0ZXJVcGRhdGVcclxuICogQGRlc2MgQ2FsbGVkIGFmdGVyIGBjaGFydGAgaGFzIGJlZW4gdXBkYXRlZCBhbmQgYmVmb3JlIHJlbmRlcmluZy4gTm90ZSB0aGF0IHRoaXNcclxuICogaG9vayB3aWxsIG5vdCBiZSBjYWxsZWQgaWYgdGhlIGNoYXJ0IHVwZGF0ZSBoYXMgYmVlbiBwcmV2aW91c2x5IGNhbmNlbGxlZC5cclxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXHJcbiAqL1xyXG4vKipcclxuICogQG1ldGhvZCBJUGx1Z2luI2JlZm9yZURhdGFzZXRzVXBkYXRlXHJcbiAqIEBkZXNjIENhbGxlZCBiZWZvcmUgdXBkYXRpbmcgdGhlIGBjaGFydGAgZGF0YXNldHMuIElmIGFueSBwbHVnaW4gcmV0dXJucyBgZmFsc2VgLFxyXG4gKiB0aGUgZGF0YXNldHMgdXBkYXRlIGlzIGNhbmNlbGxlZCB1bnRpbCBhbm90aGVyIGB1cGRhdGVgIGlzIHRyaWdnZXJlZC5cclxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBmYWxzZSB0byBjYW5jZWwgdGhlIGRhdGFzZXRzIHVwZGF0ZS5cclxuICogQHNpbmNlIHZlcnNpb24gMi4xLjVcclxuKi9cclxuLyoqXHJcbiAqIEBtZXRob2QgSVBsdWdpbiNhZnRlckRhdGFzZXRzVXBkYXRlXHJcbiAqIEBkZXNjIENhbGxlZCBhZnRlciB0aGUgYGNoYXJ0YCBkYXRhc2V0cyBoYXZlIGJlZW4gdXBkYXRlZC4gTm90ZSB0aGF0IHRoaXMgaG9va1xyXG4gKiB3aWxsIG5vdCBiZSBjYWxsZWQgaWYgdGhlIGRhdGFzZXRzIHVwZGF0ZSBoYXMgYmVlbiBwcmV2aW91c2x5IGNhbmNlbGxlZC5cclxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXHJcbiAqIEBzaW5jZSB2ZXJzaW9uIDIuMS41XHJcbiAqL1xyXG4vKipcclxuICogQG1ldGhvZCBJUGx1Z2luI2JlZm9yZURhdGFzZXRVcGRhdGVcclxuICogQGRlc2MgQ2FsbGVkIGJlZm9yZSB1cGRhdGluZyB0aGUgYGNoYXJ0YCBkYXRhc2V0IGF0IHRoZSBnaXZlbiBgYXJncy5pbmRleGAuIElmIGFueSBwbHVnaW5cclxuICogcmV0dXJucyBgZmFsc2VgLCB0aGUgZGF0YXNldHMgdXBkYXRlIGlzIGNhbmNlbGxlZCB1bnRpbCBhbm90aGVyIGB1cGRhdGVgIGlzIHRyaWdnZXJlZC5cclxuICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzIC0gVGhlIGNhbGwgYXJndW1lbnRzLlxyXG4gKiBAcGFyYW0ge051bWJlcn0gYXJncy5pbmRleCAtIFRoZSBkYXRhc2V0IGluZGV4LlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncy5tZXRhIC0gVGhlIGRhdGFzZXQgbWV0YWRhdGEuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYGZhbHNlYCB0byBjYW5jZWwgdGhlIGNoYXJ0IGRhdGFzZXRzIGRyYXdpbmcuXHJcbiAqL1xyXG4vKipcclxuICogQG1ldGhvZCBJUGx1Z2luI2FmdGVyRGF0YXNldFVwZGF0ZVxyXG4gKiBAZGVzYyBDYWxsZWQgYWZ0ZXIgdGhlIGBjaGFydGAgZGF0YXNldHMgYXQgdGhlIGdpdmVuIGBhcmdzLmluZGV4YCBoYXMgYmVlbiB1cGRhdGVkLiBOb3RlXHJcbiAqIHRoYXQgdGhpcyBob29rIHdpbGwgbm90IGJlIGNhbGxlZCBpZiB0aGUgZGF0YXNldHMgdXBkYXRlIGhhcyBiZWVuIHByZXZpb3VzbHkgY2FuY2VsbGVkLlxyXG4gKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cclxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MgLSBUaGUgY2FsbCBhcmd1bWVudHMuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhcmdzLmluZGV4IC0gVGhlIGRhdGFzZXQgaW5kZXguXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzLm1ldGEgLSBUaGUgZGF0YXNldCBtZXRhZGF0YS5cclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXHJcbiAqL1xyXG4vKipcclxuICogQG1ldGhvZCBJUGx1Z2luI2JlZm9yZUxheW91dFxyXG4gKiBAZGVzYyBDYWxsZWQgYmVmb3JlIGxheWluZyBvdXQgYGNoYXJ0YC4gSWYgYW55IHBsdWdpbiByZXR1cm5zIGBmYWxzZWAsXHJcbiAqIHRoZSBsYXlvdXQgdXBkYXRlIGlzIGNhbmNlbGxlZCB1bnRpbCBhbm90aGVyIGB1cGRhdGVgIGlzIHRyaWdnZXJlZC5cclxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBgZmFsc2VgIHRvIGNhbmNlbCB0aGUgY2hhcnQgbGF5b3V0LlxyXG4gKi9cclxuLyoqXHJcbiAqIEBtZXRob2QgSVBsdWdpbiNhZnRlckxheW91dFxyXG4gKiBAZGVzYyBDYWxsZWQgYWZ0ZXIgdGhlIGBjaGFydGAgaGFzIGJlZW4gbGF5ZWQgb3V0LiBOb3RlIHRoYXQgdGhpcyBob29rIHdpbGwgbm90XHJcbiAqIGJlIGNhbGxlZCBpZiB0aGUgbGF5b3V0IHVwZGF0ZSBoYXMgYmVlbiBwcmV2aW91c2x5IGNhbmNlbGxlZC5cclxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXHJcbiAqL1xyXG4vKipcclxuICogQG1ldGhvZCBJUGx1Z2luI2JlZm9yZVJlbmRlclxyXG4gKiBAZGVzYyBDYWxsZWQgYmVmb3JlIHJlbmRlcmluZyBgY2hhcnRgLiBJZiBhbnkgcGx1Z2luIHJldHVybnMgYGZhbHNlYCxcclxuICogdGhlIHJlbmRlcmluZyBpcyBjYW5jZWxsZWQgdW50aWwgYW5vdGhlciBgcmVuZGVyYCBpcyB0cmlnZ2VyZWQuXHJcbiAqIEBwYXJhbSB7Q2hhcnQuQ29udHJvbGxlcn0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxyXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYGZhbHNlYCB0byBjYW5jZWwgdGhlIGNoYXJ0IHJlbmRlcmluZy5cclxuICovXHJcbi8qKlxyXG4gKiBAbWV0aG9kIElQbHVnaW4jYWZ0ZXJSZW5kZXJcclxuICogQGRlc2MgQ2FsbGVkIGFmdGVyIHRoZSBgY2hhcnRgIGhhcyBiZWVuIGZ1bGx5IHJlbmRlcmVkIChhbmQgYW5pbWF0aW9uIGNvbXBsZXRlZCkuIE5vdGVcclxuICogdGhhdCB0aGlzIGhvb2sgd2lsbCBub3QgYmUgY2FsbGVkIGlmIHRoZSByZW5kZXJpbmcgaGFzIGJlZW4gcHJldmlvdXNseSBjYW5jZWxsZWQuXHJcbiAqIEBwYXJhbSB7Q2hhcnQuQ29udHJvbGxlcn0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxyXG4gKi9cclxuLyoqXHJcbiAqIEBtZXRob2QgSVBsdWdpbiNiZWZvcmVEcmF3XHJcbiAqIEBkZXNjIENhbGxlZCBiZWZvcmUgZHJhd2luZyBgY2hhcnRgIGF0IGV2ZXJ5IGFuaW1hdGlvbiBmcmFtZSBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuXHJcbiAqIGVhc2luZyB2YWx1ZS4gSWYgYW55IHBsdWdpbiByZXR1cm5zIGBmYWxzZWAsIHRoZSBmcmFtZSBkcmF3aW5nIGlzIGNhbmNlbGxlZCB1bnRpbFxyXG4gKiBhbm90aGVyIGByZW5kZXJgIGlzIHRyaWdnZXJlZC5cclxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cclxuICogQHBhcmFtIHtOdW1iZXJ9IGVhc2luZ1ZhbHVlIC0gVGhlIGN1cnJlbnQgYW5pbWF0aW9uIHZhbHVlLCBiZXR3ZWVuIDAuMCBhbmQgMS4wLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBwbHVnaW4gb3B0aW9ucy5cclxuICogQHJldHVybnMge0Jvb2xlYW59IGBmYWxzZWAgdG8gY2FuY2VsIHRoZSBjaGFydCBkcmF3aW5nLlxyXG4gKi9cclxuLyoqXHJcbiAqIEBtZXRob2QgSVBsdWdpbiNhZnRlckRyYXdcclxuICogQGRlc2MgQ2FsbGVkIGFmdGVyIHRoZSBgY2hhcnRgIGhhcyBiZWVuIGRyYXduIGZvciB0aGUgc3BlY2lmaWMgZWFzaW5nIHZhbHVlLiBOb3RlXHJcbiAqIHRoYXQgdGhpcyBob29rIHdpbGwgbm90IGJlIGNhbGxlZCBpZiB0aGUgZHJhd2luZyBoYXMgYmVlbiBwcmV2aW91c2x5IGNhbmNlbGxlZC5cclxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cclxuICogQHBhcmFtIHtOdW1iZXJ9IGVhc2luZ1ZhbHVlIC0gVGhlIGN1cnJlbnQgYW5pbWF0aW9uIHZhbHVlLCBiZXR3ZWVuIDAuMCBhbmQgMS4wLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBwbHVnaW4gb3B0aW9ucy5cclxuICovXHJcbi8qKlxyXG4gKiBAbWV0aG9kIElQbHVnaW4jYmVmb3JlRGF0YXNldHNEcmF3XHJcbiAqIEBkZXNjIENhbGxlZCBiZWZvcmUgZHJhd2luZyB0aGUgYGNoYXJ0YCBkYXRhc2V0cy4gSWYgYW55IHBsdWdpbiByZXR1cm5zIGBmYWxzZWAsXHJcbiAqIHRoZSBkYXRhc2V0cyBkcmF3aW5nIGlzIGNhbmNlbGxlZCB1bnRpbCBhbm90aGVyIGByZW5kZXJgIGlzIHRyaWdnZXJlZC5cclxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cclxuICogQHBhcmFtIHtOdW1iZXJ9IGVhc2luZ1ZhbHVlIC0gVGhlIGN1cnJlbnQgYW5pbWF0aW9uIHZhbHVlLCBiZXR3ZWVuIDAuMCBhbmQgMS4wLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBwbHVnaW4gb3B0aW9ucy5cclxuICogQHJldHVybnMge0Jvb2xlYW59IGBmYWxzZWAgdG8gY2FuY2VsIHRoZSBjaGFydCBkYXRhc2V0cyBkcmF3aW5nLlxyXG4gKi9cclxuLyoqXHJcbiAqIEBtZXRob2QgSVBsdWdpbiNhZnRlckRhdGFzZXRzRHJhd1xyXG4gKiBAZGVzYyBDYWxsZWQgYWZ0ZXIgdGhlIGBjaGFydGAgZGF0YXNldHMgaGF2ZSBiZWVuIGRyYXduLiBOb3RlIHRoYXQgdGhpcyBob29rXHJcbiAqIHdpbGwgbm90IGJlIGNhbGxlZCBpZiB0aGUgZGF0YXNldHMgZHJhd2luZyBoYXMgYmVlbiBwcmV2aW91c2x5IGNhbmNlbGxlZC5cclxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cclxuICogQHBhcmFtIHtOdW1iZXJ9IGVhc2luZ1ZhbHVlIC0gVGhlIGN1cnJlbnQgYW5pbWF0aW9uIHZhbHVlLCBiZXR3ZWVuIDAuMCBhbmQgMS4wLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBwbHVnaW4gb3B0aW9ucy5cclxuICovXHJcbi8qKlxyXG4gKiBAbWV0aG9kIElQbHVnaW4jYmVmb3JlRGF0YXNldERyYXdcclxuICogQGRlc2MgQ2FsbGVkIGJlZm9yZSBkcmF3aW5nIHRoZSBgY2hhcnRgIGRhdGFzZXQgYXQgdGhlIGdpdmVuIGBhcmdzLmluZGV4YCAoZGF0YXNldHNcclxuICogYXJlIGRyYXduIGluIHRoZSByZXZlcnNlIG9yZGVyKS4gSWYgYW55IHBsdWdpbiByZXR1cm5zIGBmYWxzZWAsIHRoZSBkYXRhc2V0cyBkcmF3aW5nXHJcbiAqIGlzIGNhbmNlbGxlZCB1bnRpbCBhbm90aGVyIGByZW5kZXJgIGlzIHRyaWdnZXJlZC5cclxuICogQHBhcmFtIHtDaGFydH0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzIC0gVGhlIGNhbGwgYXJndW1lbnRzLlxyXG4gKiBAcGFyYW0ge051bWJlcn0gYXJncy5pbmRleCAtIFRoZSBkYXRhc2V0IGluZGV4LlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncy5tZXRhIC0gVGhlIGRhdGFzZXQgbWV0YWRhdGEuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBhcmdzLmVhc2luZ1ZhbHVlIC0gVGhlIGN1cnJlbnQgYW5pbWF0aW9uIHZhbHVlLCBiZXR3ZWVuIDAuMCBhbmQgMS4wLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIFRoZSBwbHVnaW4gb3B0aW9ucy5cclxuICogQHJldHVybnMge0Jvb2xlYW59IGBmYWxzZWAgdG8gY2FuY2VsIHRoZSBjaGFydCBkYXRhc2V0cyBkcmF3aW5nLlxyXG4gKi9cclxuLyoqXHJcbiAqIEBtZXRob2QgSVBsdWdpbiNhZnRlckRhdGFzZXREcmF3XHJcbiAqIEBkZXNjIENhbGxlZCBhZnRlciB0aGUgYGNoYXJ0YCBkYXRhc2V0cyBhdCB0aGUgZ2l2ZW4gYGFyZ3MuaW5kZXhgIGhhdmUgYmVlbiBkcmF3blxyXG4gKiAoZGF0YXNldHMgYXJlIGRyYXduIGluIHRoZSByZXZlcnNlIG9yZGVyKS4gTm90ZSB0aGF0IHRoaXMgaG9vayB3aWxsIG5vdCBiZSBjYWxsZWRcclxuICogaWYgdGhlIGRhdGFzZXRzIGRyYXdpbmcgaGFzIGJlZW4gcHJldmlvdXNseSBjYW5jZWxsZWQuXHJcbiAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncyAtIFRoZSBjYWxsIGFyZ3VtZW50cy5cclxuICogQHBhcmFtIHtOdW1iZXJ9IGFyZ3MuaW5kZXggLSBUaGUgZGF0YXNldCBpbmRleC5cclxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MubWV0YSAtIFRoZSBkYXRhc2V0IG1ldGFkYXRhLlxyXG4gKiBAcGFyYW0ge051bWJlcn0gYXJncy5lYXNpbmdWYWx1ZSAtIFRoZSBjdXJyZW50IGFuaW1hdGlvbiB2YWx1ZSwgYmV0d2VlbiAwLjAgYW5kIDEuMC5cclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXHJcbiAqL1xyXG4vKipcclxuICogQG1ldGhvZCBJUGx1Z2luI2JlZm9yZVRvb2x0aXBEcmF3XHJcbiAqIEBkZXNjIENhbGxlZCBiZWZvcmUgZHJhd2luZyB0aGUgYHRvb2x0aXBgLiBJZiBhbnkgcGx1Z2luIHJldHVybnMgYGZhbHNlYCxcclxuICogdGhlIHRvb2x0aXAgZHJhd2luZyBpcyBjYW5jZWxsZWQgdW50aWwgYW5vdGhlciBgcmVuZGVyYCBpcyB0cmlnZ2VyZWQuXHJcbiAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncyAtIFRoZSBjYWxsIGFyZ3VtZW50cy5cclxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MudG9vbHRpcCAtIFRoZSB0b29sdGlwLlxyXG4gKiBAcGFyYW0ge051bWJlcn0gYXJncy5lYXNpbmdWYWx1ZSAtIFRoZSBjdXJyZW50IGFuaW1hdGlvbiB2YWx1ZSwgYmV0d2VlbiAwLjAgYW5kIDEuMC5cclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXHJcbiAqIEByZXR1cm5zIHtCb29sZWFufSBgZmFsc2VgIHRvIGNhbmNlbCB0aGUgY2hhcnQgdG9vbHRpcCBkcmF3aW5nLlxyXG4gKi9cclxuLyoqXHJcbiAqIEBtZXRob2QgSVBsdWdpbiNhZnRlclRvb2x0aXBEcmF3XHJcbiAqIEBkZXNjIENhbGxlZCBhZnRlciBkcmF3aW5nIHRoZSBgdG9vbHRpcGAuIE5vdGUgdGhhdCB0aGlzIGhvb2sgd2lsbCBub3RcclxuICogYmUgY2FsbGVkIGlmIHRoZSB0b29sdGlwIGRyYXdpbmcgaGFzIGJlZW4gcHJldmlvdXNseSBjYW5jZWxsZWQuXHJcbiAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gVGhlIGNoYXJ0IGluc3RhbmNlLlxyXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncyAtIFRoZSBjYWxsIGFyZ3VtZW50cy5cclxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MudG9vbHRpcCAtIFRoZSB0b29sdGlwLlxyXG4gKiBAcGFyYW0ge051bWJlcn0gYXJncy5lYXNpbmdWYWx1ZSAtIFRoZSBjdXJyZW50IGFuaW1hdGlvbiB2YWx1ZSwgYmV0d2VlbiAwLjAgYW5kIDEuMC5cclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXHJcbiAqL1xyXG4vKipcclxuICogQG1ldGhvZCBJUGx1Z2luI2JlZm9yZUV2ZW50XHJcbiAqIEBkZXNjIENhbGxlZCBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgc3BlY2lmaWVkIGBldmVudGAuIElmIGFueSBwbHVnaW4gcmV0dXJucyBgZmFsc2VgLFxyXG4gKiB0aGUgZXZlbnQgd2lsbCBiZSBkaXNjYXJkZWQuXHJcbiAqIEBwYXJhbSB7Q2hhcnQuQ29udHJvbGxlcn0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSB7SUV2ZW50fSBldmVudCAtIFRoZSBldmVudCBvYmplY3QuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxyXG4gKi9cclxuLyoqXHJcbiAqIEBtZXRob2QgSVBsdWdpbiNhZnRlckV2ZW50XHJcbiAqIEBkZXNjIENhbGxlZCBhZnRlciB0aGUgYGV2ZW50YCBoYXMgYmVlbiBjb25zdW1lZC4gTm90ZSB0aGF0IHRoaXMgaG9va1xyXG4gKiB3aWxsIG5vdCBiZSBjYWxsZWQgaWYgdGhlIGBldmVudGAgaGFzIGJlZW4gcHJldmlvdXNseSBkaXNjYXJkZWQuXHJcbiAqIEBwYXJhbSB7Q2hhcnQuQ29udHJvbGxlcn0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSB7SUV2ZW50fSBldmVudCAtIFRoZSBldmVudCBvYmplY3QuXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIHBsdWdpbiBvcHRpb25zLlxyXG4gKi9cclxuLyoqXHJcbiAqIEBtZXRob2QgSVBsdWdpbiNyZXNpemVcclxuICogQGRlc2MgQ2FsbGVkIGFmdGVyIHRoZSBjaGFydCBhcyBiZWVuIHJlc2l6ZWQuXHJcbiAqIEBwYXJhbSB7Q2hhcnQuQ29udHJvbGxlcn0gY2hhcnQgLSBUaGUgY2hhcnQgaW5zdGFuY2UuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBzaXplIC0gVGhlIG5ldyBjYW52YXMgZGlzcGxheSBzaXplIChlcS4gY2FudmFzLnN0eWxlIHdpZHRoICYgaGVpZ2h0KS5cclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXHJcbiAqL1xyXG4vKipcclxuICogQG1ldGhvZCBJUGx1Z2luI2Rlc3Ryb3lcclxuICogQGRlc2MgQ2FsbGVkIGFmdGVyIHRoZSBjaGFydCBhcyBiZWVuIGRlc3Ryb3llZC5cclxuICogQHBhcmFtIHtDaGFydC5Db250cm9sbGVyfSBjaGFydCAtIFRoZSBjaGFydCBpbnN0YW5jZS5cclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgcGx1Z2luIG9wdGlvbnMuXHJcbiAqL1xyXG5cclxufSx7XCIyNlwiOjI2LFwiNDZcIjo0Nn1dLDMzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgyNik7XHJcbnZhciBFbGVtZW50ID0gcmVxdWlyZSgyNyk7XHJcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XHJcbnZhciBUaWNrcyA9IHJlcXVpcmUoMzUpO1xyXG5cclxuZGVmYXVsdHMuX3NldCgnc2NhbGUnLCB7XHJcblx0ZGlzcGxheTogdHJ1ZSxcclxuXHRwb3NpdGlvbjogJ2xlZnQnLFxyXG5cdG9mZnNldDogZmFsc2UsXHJcblxyXG5cdC8vIGdyaWQgbGluZSBzZXR0aW5nc1xyXG5cdGdyaWRMaW5lczoge1xyXG5cdFx0ZGlzcGxheTogdHJ1ZSxcclxuXHRcdGNvbG9yOiAncmdiYSgwLCAwLCAwLCAwLjEpJyxcclxuXHRcdGxpbmVXaWR0aDogMSxcclxuXHRcdGRyYXdCb3JkZXI6IHRydWUsXHJcblx0XHRkcmF3T25DaGFydEFyZWE6IHRydWUsXHJcblx0XHRkcmF3VGlja3M6IHRydWUsXHJcblx0XHR0aWNrTWFya0xlbmd0aDogMTAsXHJcblx0XHR6ZXJvTGluZVdpZHRoOiAxLFxyXG5cdFx0emVyb0xpbmVDb2xvcjogJ3JnYmEoMCwwLDAsMC4yNSknLFxyXG5cdFx0emVyb0xpbmVCb3JkZXJEYXNoOiBbXSxcclxuXHRcdHplcm9MaW5lQm9yZGVyRGFzaE9mZnNldDogMC4wLFxyXG5cdFx0b2Zmc2V0R3JpZExpbmVzOiBmYWxzZSxcclxuXHRcdGJvcmRlckRhc2g6IFtdLFxyXG5cdFx0Ym9yZGVyRGFzaE9mZnNldDogMC4wXHJcblx0fSxcclxuXHJcblx0Ly8gc2NhbGUgbGFiZWxcclxuXHRzY2FsZUxhYmVsOiB7XHJcblx0XHQvLyBkaXNwbGF5IHByb3BlcnR5XHJcblx0XHRkaXNwbGF5OiBmYWxzZSxcclxuXHJcblx0XHQvLyBhY3R1YWwgbGFiZWxcclxuXHRcdGxhYmVsU3RyaW5nOiAnJyxcclxuXHJcblx0XHQvLyBsaW5lIGhlaWdodFxyXG5cdFx0bGluZUhlaWdodDogMS4yLFxyXG5cclxuXHRcdC8vIHRvcC9ib3R0b20gcGFkZGluZ1xyXG5cdFx0cGFkZGluZzoge1xyXG5cdFx0XHR0b3A6IDQsXHJcblx0XHRcdGJvdHRvbTogNFxyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdC8vIGxhYmVsIHNldHRpbmdzXHJcblx0dGlja3M6IHtcclxuXHRcdGJlZ2luQXRaZXJvOiBmYWxzZSxcclxuXHRcdG1pblJvdGF0aW9uOiAwLFxyXG5cdFx0bWF4Um90YXRpb246IDUwLFxyXG5cdFx0bWlycm9yOiBmYWxzZSxcclxuXHRcdHBhZGRpbmc6IDAsXHJcblx0XHRyZXZlcnNlOiBmYWxzZSxcclxuXHRcdGRpc3BsYXk6IHRydWUsXHJcblx0XHRhdXRvU2tpcDogdHJ1ZSxcclxuXHRcdGF1dG9Ta2lwUGFkZGluZzogMCxcclxuXHRcdGxhYmVsT2Zmc2V0OiAwLFxyXG5cdFx0Ly8gV2UgcGFzcyB0aHJvdWdoIGFycmF5cyB0byBiZSByZW5kZXJlZCBhcyBtdWx0aWxpbmUgbGFiZWxzLCB3ZSBjb252ZXJ0IE90aGVycyB0byBzdHJpbmdzIGhlcmUuXHJcblx0XHRjYWxsYmFjazogVGlja3MuZm9ybWF0dGVycy52YWx1ZXMsXHJcblx0XHRtaW5vcjoge30sXHJcblx0XHRtYWpvcjoge31cclxuXHR9XHJcbn0pO1xyXG5cclxuZnVuY3Rpb24gbGFiZWxzRnJvbVRpY2tzKHRpY2tzKSB7XHJcblx0dmFyIGxhYmVscyA9IFtdO1xyXG5cdHZhciBpLCBpbGVuO1xyXG5cclxuXHRmb3IgKGkgPSAwLCBpbGVuID0gdGlja3MubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XHJcblx0XHRsYWJlbHMucHVzaCh0aWNrc1tpXS5sYWJlbCk7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gbGFiZWxzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRMaW5lVmFsdWUoc2NhbGUsIGluZGV4LCBvZmZzZXRHcmlkTGluZXMpIHtcclxuXHR2YXIgbGluZVZhbHVlID0gc2NhbGUuZ2V0UGl4ZWxGb3JUaWNrKGluZGV4KTtcclxuXHJcblx0aWYgKG9mZnNldEdyaWRMaW5lcykge1xyXG5cdFx0aWYgKGluZGV4ID09PSAwKSB7XHJcblx0XHRcdGxpbmVWYWx1ZSAtPSAoc2NhbGUuZ2V0UGl4ZWxGb3JUaWNrKDEpIC0gbGluZVZhbHVlKSAvIDI7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRsaW5lVmFsdWUgLT0gKGxpbmVWYWx1ZSAtIHNjYWxlLmdldFBpeGVsRm9yVGljayhpbmRleCAtIDEpKSAvIDI7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiBsaW5lVmFsdWU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvbXB1dGVUZXh0U2l6ZShjb250ZXh0LCB0aWNrLCBmb250KSB7XHJcblx0cmV0dXJuIGhlbHBlcnMuaXNBcnJheSh0aWNrKSA/XHJcblx0XHRoZWxwZXJzLmxvbmdlc3RUZXh0KGNvbnRleHQsIGZvbnQsIHRpY2spIDpcclxuXHRcdGNvbnRleHQubWVhc3VyZVRleHQodGljaykud2lkdGg7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlRm9udE9wdGlvbnMob3B0aW9ucykge1xyXG5cdHZhciB2YWx1ZU9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQ7XHJcblx0dmFyIGdsb2JhbERlZmF1bHRzID0gZGVmYXVsdHMuZ2xvYmFsO1xyXG5cdHZhciBzaXplID0gdmFsdWVPckRlZmF1bHQob3B0aW9ucy5mb250U2l6ZSwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRTaXplKTtcclxuXHR2YXIgc3R5bGUgPSB2YWx1ZU9yRGVmYXVsdChvcHRpb25zLmZvbnRTdHlsZSwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRTdHlsZSk7XHJcblx0dmFyIGZhbWlseSA9IHZhbHVlT3JEZWZhdWx0KG9wdGlvbnMuZm9udEZhbWlseSwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRGYW1pbHkpO1xyXG5cclxuXHRyZXR1cm4ge1xyXG5cdFx0c2l6ZTogc2l6ZSxcclxuXHRcdHN0eWxlOiBzdHlsZSxcclxuXHRcdGZhbWlseTogZmFtaWx5LFxyXG5cdFx0Zm9udDogaGVscGVycy5mb250U3RyaW5nKHNpemUsIHN0eWxlLCBmYW1pbHkpXHJcblx0fTtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VMaW5lSGVpZ2h0KG9wdGlvbnMpIHtcclxuXHRyZXR1cm4gaGVscGVycy5vcHRpb25zLnRvTGluZUhlaWdodChcclxuXHRcdGhlbHBlcnMudmFsdWVPckRlZmF1bHQob3B0aW9ucy5saW5lSGVpZ2h0LCAxLjIpLFxyXG5cdFx0aGVscGVycy52YWx1ZU9yRGVmYXVsdChvcHRpb25zLmZvbnRTaXplLCBkZWZhdWx0cy5nbG9iYWwuZGVmYXVsdEZvbnRTaXplKSk7XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRWxlbWVudC5leHRlbmQoe1xyXG5cdC8qKlxyXG5cdCAqIEdldCB0aGUgcGFkZGluZyBuZWVkZWQgZm9yIHRoZSBzY2FsZVxyXG5cdCAqIEBtZXRob2QgZ2V0UGFkZGluZ1xyXG5cdCAqIEBwcml2YXRlXHJcblx0ICogQHJldHVybnMge1BhZGRpbmd9IHRoZSBuZWNlc3NhcnkgcGFkZGluZ1xyXG5cdCAqL1xyXG5cdGdldFBhZGRpbmc6IGZ1bmN0aW9uKCkge1xyXG5cdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdHJldHVybiB7XHJcblx0XHRcdGxlZnQ6IG1lLnBhZGRpbmdMZWZ0IHx8IDAsXHJcblx0XHRcdHRvcDogbWUucGFkZGluZ1RvcCB8fCAwLFxyXG5cdFx0XHRyaWdodDogbWUucGFkZGluZ1JpZ2h0IHx8IDAsXHJcblx0XHRcdGJvdHRvbTogbWUucGFkZGluZ0JvdHRvbSB8fCAwXHJcblx0XHR9O1xyXG5cdH0sXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIHNjYWxlIHRpY2sgb2JqZWN0cyAoe2xhYmVsLCBtYWpvcn0pXHJcblx0ICogQHNpbmNlIDIuN1xyXG5cdCAqL1xyXG5cdGdldFRpY2tzOiBmdW5jdGlvbigpIHtcclxuXHRcdHJldHVybiB0aGlzLl90aWNrcztcclxuXHR9LFxyXG5cclxuXHQvLyBUaGVzZSBtZXRob2RzIGFyZSBvcmRlcmVkIGJ5IGxpZmVjeWxlLiBVdGlsaXRpZXMgdGhlbiBmb2xsb3cuXHJcblx0Ly8gQW55IGZ1bmN0aW9uIGRlZmluZWQgaGVyZSBpcyBpbmhlcml0ZWQgYnkgYWxsIHNjYWxlIHR5cGVzLlxyXG5cdC8vIEFueSBmdW5jdGlvbiBjYW4gYmUgZXh0ZW5kZWQgYnkgdGhlIHNjYWxlIHR5cGVcclxuXHJcblx0bWVyZ2VUaWNrc09wdGlvbnM6IGZ1bmN0aW9uKCkge1xyXG5cdFx0dmFyIHRpY2tzID0gdGhpcy5vcHRpb25zLnRpY2tzO1xyXG5cdFx0aWYgKHRpY2tzLm1pbm9yID09PSBmYWxzZSkge1xyXG5cdFx0XHR0aWNrcy5taW5vciA9IHtcclxuXHRcdFx0XHRkaXNwbGF5OiBmYWxzZVxyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cdFx0aWYgKHRpY2tzLm1ham9yID09PSBmYWxzZSkge1xyXG5cdFx0XHR0aWNrcy5tYWpvciA9IHtcclxuXHRcdFx0XHRkaXNwbGF5OiBmYWxzZVxyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cdFx0Zm9yICh2YXIga2V5IGluIHRpY2tzKSB7XHJcblx0XHRcdGlmIChrZXkgIT09ICdtYWpvcicgJiYga2V5ICE9PSAnbWlub3InKSB7XHJcblx0XHRcdFx0aWYgKHR5cGVvZiB0aWNrcy5taW5vcltrZXldID09PSAndW5kZWZpbmVkJykge1xyXG5cdFx0XHRcdFx0dGlja3MubWlub3Jba2V5XSA9IHRpY2tzW2tleV07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmICh0eXBlb2YgdGlja3MubWFqb3Jba2V5XSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuXHRcdFx0XHRcdHRpY2tzLm1ham9yW2tleV0gPSB0aWNrc1trZXldO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH0sXHJcblx0YmVmb3JlVXBkYXRlOiBmdW5jdGlvbigpIHtcclxuXHRcdGhlbHBlcnMuY2FsbGJhY2sodGhpcy5vcHRpb25zLmJlZm9yZVVwZGF0ZSwgW3RoaXNdKTtcclxuXHR9LFxyXG5cclxuXHR1cGRhdGU6IGZ1bmN0aW9uKG1heFdpZHRoLCBtYXhIZWlnaHQsIG1hcmdpbnMpIHtcclxuXHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHR2YXIgaSwgaWxlbiwgbGFiZWxzLCBsYWJlbCwgdGlja3MsIHRpY2s7XHJcblxyXG5cdFx0Ly8gVXBkYXRlIExpZmVjeWNsZSAtIFByb2JhYmx5IGRvbid0IHdhbnQgdG8gZXZlciBleHRlbmQgb3Igb3ZlcndyaXRlIHRoaXMgZnVuY3Rpb24gOylcclxuXHRcdG1lLmJlZm9yZVVwZGF0ZSgpO1xyXG5cclxuXHRcdC8vIEFic29yYiB0aGUgbWFzdGVyIG1lYXN1cmVtZW50c1xyXG5cdFx0bWUubWF4V2lkdGggPSBtYXhXaWR0aDtcclxuXHRcdG1lLm1heEhlaWdodCA9IG1heEhlaWdodDtcclxuXHRcdG1lLm1hcmdpbnMgPSBoZWxwZXJzLmV4dGVuZCh7XHJcblx0XHRcdGxlZnQ6IDAsXHJcblx0XHRcdHJpZ2h0OiAwLFxyXG5cdFx0XHR0b3A6IDAsXHJcblx0XHRcdGJvdHRvbTogMFxyXG5cdFx0fSwgbWFyZ2lucyk7XHJcblx0XHRtZS5sb25nZXN0VGV4dENhY2hlID0gbWUubG9uZ2VzdFRleHRDYWNoZSB8fCB7fTtcclxuXHJcblx0XHQvLyBEaW1lbnNpb25zXHJcblx0XHRtZS5iZWZvcmVTZXREaW1lbnNpb25zKCk7XHJcblx0XHRtZS5zZXREaW1lbnNpb25zKCk7XHJcblx0XHRtZS5hZnRlclNldERpbWVuc2lvbnMoKTtcclxuXHJcblx0XHQvLyBEYXRhIG1pbi9tYXhcclxuXHRcdG1lLmJlZm9yZURhdGFMaW1pdHMoKTtcclxuXHRcdG1lLmRldGVybWluZURhdGFMaW1pdHMoKTtcclxuXHRcdG1lLmFmdGVyRGF0YUxpbWl0cygpO1xyXG5cclxuXHRcdC8vIFRpY2tzIC0gYHRoaXMudGlja3NgIGlzIG5vdyBERVBSRUNBVEVEIVxyXG5cdFx0Ly8gSW50ZXJuYWwgdGlja3MgYXJlIG5vdyBzdG9yZWQgYXMgb2JqZWN0cyBpbiB0aGUgUFJJVkFURSBgdGhpcy5fdGlja3NgIG1lbWJlclxyXG5cdFx0Ly8gYW5kIG11c3Qgbm90IGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gb3V0c2lkZSB0aGlzIGNsYXNzLiBgdGhpcy50aWNrc2AgYmVpbmdcclxuXHRcdC8vIGFyb3VuZCBmb3IgbG9uZyB0aW1lIGFuZCBub3QgbWFya2VkIGFzIHByaXZhdGUsIHdlIGNhbid0IGNoYW5nZSBpdHMgc3RydWN0dXJlXHJcblx0XHQvLyB3aXRob3V0IHVuZXhwZWN0ZWQgYnJlYWtpbmcgY2hhbmdlcy4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzY2FsZSB0aWNrcyxcclxuXHRcdC8vIHVzZSBzY2FsZS5nZXRUaWNrcygpIGluc3RlYWQuXHJcblxyXG5cdFx0bWUuYmVmb3JlQnVpbGRUaWNrcygpO1xyXG5cclxuXHRcdC8vIE5ldyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHJldHVybiBhbiBhcnJheSBvZiBvYmplY3RzIGJ1dCBmb3IgQkFDS1dBUkQgQ09NUEFULFxyXG5cdFx0Ly8gd2Ugc3RpbGwgc3VwcG9ydCBubyByZXR1cm4gKGB0aGlzLnRpY2tzYCBpbnRlcm5hbGx5IHNldCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kKS5cclxuXHRcdHRpY2tzID0gbWUuYnVpbGRUaWNrcygpIHx8IFtdO1xyXG5cclxuXHRcdG1lLmFmdGVyQnVpbGRUaWNrcygpO1xyXG5cclxuXHRcdG1lLmJlZm9yZVRpY2tUb0xhYmVsQ29udmVyc2lvbigpO1xyXG5cclxuXHRcdC8vIE5ldyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHJldHVybiB0aGUgZm9ybWF0dGVkIHRpY2sgbGFiZWxzIGJ1dCBmb3IgQkFDS1dBUkRcclxuXHRcdC8vIENPTVBBVCwgd2Ugc3RpbGwgc3VwcG9ydCBubyByZXR1cm4gKGB0aGlzLnRpY2tzYCBpbnRlcm5hbGx5IGNoYW5nZWQgYnkgY2FsbGluZ1xyXG5cdFx0Ly8gdGhpcyBtZXRob2QgYW5kIHN1cHBvc2VkIHRvIGNvbnRhaW4gb25seSBzdHJpbmcgdmFsdWVzKS5cclxuXHRcdGxhYmVscyA9IG1lLmNvbnZlcnRUaWNrc1RvTGFiZWxzKHRpY2tzKSB8fCBtZS50aWNrcztcclxuXHJcblx0XHRtZS5hZnRlclRpY2tUb0xhYmVsQ29udmVyc2lvbigpO1xyXG5cclxuXHRcdG1lLnRpY2tzID0gbGFiZWxzOyAgIC8vIEJBQ0tXQVJEIENPTVBBVElCSUxJVFlcclxuXHJcblx0XHQvLyBJTVBPUlRBTlQ6IGZyb20gdGhpcyBwb2ludCwgd2UgY29uc2lkZXIgdGhhdCBgdGhpcy50aWNrc2Agd2lsbCBORVZFUiBjaGFuZ2UhXHJcblxyXG5cdFx0Ly8gQkFDS1dBUkQgQ09NUEFUOiBzeW5jaHJvbml6ZSBgX3RpY2tzYCB3aXRoIGxhYmVscyAoc28gcG90ZW50aWFsbHkgYHRoaXMudGlja3NgKVxyXG5cdFx0Zm9yIChpID0gMCwgaWxlbiA9IGxhYmVscy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcclxuXHRcdFx0bGFiZWwgPSBsYWJlbHNbaV07XHJcblx0XHRcdHRpY2sgPSB0aWNrc1tpXTtcclxuXHRcdFx0aWYgKCF0aWNrKSB7XHJcblx0XHRcdFx0dGlja3MucHVzaCh0aWNrID0ge1xyXG5cdFx0XHRcdFx0bGFiZWw6IGxhYmVsLFxyXG5cdFx0XHRcdFx0bWFqb3I6IGZhbHNlXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGljay5sYWJlbCA9IGxhYmVsO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0bWUuX3RpY2tzID0gdGlja3M7XHJcblxyXG5cdFx0Ly8gVGljayBSb3RhdGlvblxyXG5cdFx0bWUuYmVmb3JlQ2FsY3VsYXRlVGlja1JvdGF0aW9uKCk7XHJcblx0XHRtZS5jYWxjdWxhdGVUaWNrUm90YXRpb24oKTtcclxuXHRcdG1lLmFmdGVyQ2FsY3VsYXRlVGlja1JvdGF0aW9uKCk7XHJcblx0XHQvLyBGaXRcclxuXHRcdG1lLmJlZm9yZUZpdCgpO1xyXG5cdFx0bWUuZml0KCk7XHJcblx0XHRtZS5hZnRlckZpdCgpO1xyXG5cdFx0Ly9cclxuXHRcdG1lLmFmdGVyVXBkYXRlKCk7XHJcblxyXG5cdFx0cmV0dXJuIG1lLm1pblNpemU7XHJcblxyXG5cdH0sXHJcblx0YWZ0ZXJVcGRhdGU6IGZ1bmN0aW9uKCkge1xyXG5cdFx0aGVscGVycy5jYWxsYmFjayh0aGlzLm9wdGlvbnMuYWZ0ZXJVcGRhdGUsIFt0aGlzXSk7XHJcblx0fSxcclxuXHJcblx0Ly9cclxuXHJcblx0YmVmb3JlU2V0RGltZW5zaW9uczogZnVuY3Rpb24oKSB7XHJcblx0XHRoZWxwZXJzLmNhbGxiYWNrKHRoaXMub3B0aW9ucy5iZWZvcmVTZXREaW1lbnNpb25zLCBbdGhpc10pO1xyXG5cdH0sXHJcblx0c2V0RGltZW5zaW9uczogZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0Ly8gU2V0IHRoZSB1bmNvbnN0cmFpbmVkIGRpbWVuc2lvbiBiZWZvcmUgbGFiZWwgcm90YXRpb25cclxuXHRcdGlmIChtZS5pc0hvcml6b250YWwoKSkge1xyXG5cdFx0XHQvLyBSZXNldCBwb3NpdGlvbiBiZWZvcmUgY2FsY3VsYXRpbmcgcm90YXRpb25cclxuXHRcdFx0bWUud2lkdGggPSBtZS5tYXhXaWR0aDtcclxuXHRcdFx0bWUubGVmdCA9IDA7XHJcblx0XHRcdG1lLnJpZ2h0ID0gbWUud2lkdGg7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRtZS5oZWlnaHQgPSBtZS5tYXhIZWlnaHQ7XHJcblxyXG5cdFx0XHQvLyBSZXNldCBwb3NpdGlvbiBiZWZvcmUgY2FsY3VsYXRpbmcgcm90YXRpb25cclxuXHRcdFx0bWUudG9wID0gMDtcclxuXHRcdFx0bWUuYm90dG9tID0gbWUuaGVpZ2h0O1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFJlc2V0IHBhZGRpbmdcclxuXHRcdG1lLnBhZGRpbmdMZWZ0ID0gMDtcclxuXHRcdG1lLnBhZGRpbmdUb3AgPSAwO1xyXG5cdFx0bWUucGFkZGluZ1JpZ2h0ID0gMDtcclxuXHRcdG1lLnBhZGRpbmdCb3R0b20gPSAwO1xyXG5cdH0sXHJcblx0YWZ0ZXJTZXREaW1lbnNpb25zOiBmdW5jdGlvbigpIHtcclxuXHRcdGhlbHBlcnMuY2FsbGJhY2sodGhpcy5vcHRpb25zLmFmdGVyU2V0RGltZW5zaW9ucywgW3RoaXNdKTtcclxuXHR9LFxyXG5cclxuXHQvLyBEYXRhIGxpbWl0c1xyXG5cdGJlZm9yZURhdGFMaW1pdHM6IGZ1bmN0aW9uKCkge1xyXG5cdFx0aGVscGVycy5jYWxsYmFjayh0aGlzLm9wdGlvbnMuYmVmb3JlRGF0YUxpbWl0cywgW3RoaXNdKTtcclxuXHR9LFxyXG5cdGRldGVybWluZURhdGFMaW1pdHM6IGhlbHBlcnMubm9vcCxcclxuXHRhZnRlckRhdGFMaW1pdHM6IGZ1bmN0aW9uKCkge1xyXG5cdFx0aGVscGVycy5jYWxsYmFjayh0aGlzLm9wdGlvbnMuYWZ0ZXJEYXRhTGltaXRzLCBbdGhpc10pO1xyXG5cdH0sXHJcblxyXG5cdC8vXHJcblx0YmVmb3JlQnVpbGRUaWNrczogZnVuY3Rpb24oKSB7XHJcblx0XHRoZWxwZXJzLmNhbGxiYWNrKHRoaXMub3B0aW9ucy5iZWZvcmVCdWlsZFRpY2tzLCBbdGhpc10pO1xyXG5cdH0sXHJcblx0YnVpbGRUaWNrczogaGVscGVycy5ub29wLFxyXG5cdGFmdGVyQnVpbGRUaWNrczogZnVuY3Rpb24oKSB7XHJcblx0XHRoZWxwZXJzLmNhbGxiYWNrKHRoaXMub3B0aW9ucy5hZnRlckJ1aWxkVGlja3MsIFt0aGlzXSk7XHJcblx0fSxcclxuXHJcblx0YmVmb3JlVGlja1RvTGFiZWxDb252ZXJzaW9uOiBmdW5jdGlvbigpIHtcclxuXHRcdGhlbHBlcnMuY2FsbGJhY2sodGhpcy5vcHRpb25zLmJlZm9yZVRpY2tUb0xhYmVsQ29udmVyc2lvbiwgW3RoaXNdKTtcclxuXHR9LFxyXG5cdGNvbnZlcnRUaWNrc1RvTGFiZWxzOiBmdW5jdGlvbigpIHtcclxuXHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHQvLyBDb252ZXJ0IHRpY2tzIHRvIHN0cmluZ3NcclxuXHRcdHZhciB0aWNrT3B0cyA9IG1lLm9wdGlvbnMudGlja3M7XHJcblx0XHRtZS50aWNrcyA9IG1lLnRpY2tzLm1hcCh0aWNrT3B0cy51c2VyQ2FsbGJhY2sgfHwgdGlja09wdHMuY2FsbGJhY2ssIHRoaXMpO1xyXG5cdH0sXHJcblx0YWZ0ZXJUaWNrVG9MYWJlbENvbnZlcnNpb246IGZ1bmN0aW9uKCkge1xyXG5cdFx0aGVscGVycy5jYWxsYmFjayh0aGlzLm9wdGlvbnMuYWZ0ZXJUaWNrVG9MYWJlbENvbnZlcnNpb24sIFt0aGlzXSk7XHJcblx0fSxcclxuXHJcblx0Ly9cclxuXHJcblx0YmVmb3JlQ2FsY3VsYXRlVGlja1JvdGF0aW9uOiBmdW5jdGlvbigpIHtcclxuXHRcdGhlbHBlcnMuY2FsbGJhY2sodGhpcy5vcHRpb25zLmJlZm9yZUNhbGN1bGF0ZVRpY2tSb3RhdGlvbiwgW3RoaXNdKTtcclxuXHR9LFxyXG5cdGNhbGN1bGF0ZVRpY2tSb3RhdGlvbjogZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0dmFyIGNvbnRleHQgPSBtZS5jdHg7XHJcblx0XHR2YXIgdGlja09wdHMgPSBtZS5vcHRpb25zLnRpY2tzO1xyXG5cdFx0dmFyIGxhYmVscyA9IGxhYmVsc0Zyb21UaWNrcyhtZS5fdGlja3MpO1xyXG5cclxuXHRcdC8vIEdldCB0aGUgd2lkdGggb2YgZWFjaCBncmlkIGJ5IGNhbGN1bGF0aW5nIHRoZSBkaWZmZXJlbmNlXHJcblx0XHQvLyBiZXR3ZWVuIHggb2Zmc2V0cyBiZXR3ZWVuIDAgYW5kIDEuXHJcblx0XHR2YXIgdGlja0ZvbnQgPSBwYXJzZUZvbnRPcHRpb25zKHRpY2tPcHRzKTtcclxuXHRcdGNvbnRleHQuZm9udCA9IHRpY2tGb250LmZvbnQ7XHJcblxyXG5cdFx0dmFyIGxhYmVsUm90YXRpb24gPSB0aWNrT3B0cy5taW5Sb3RhdGlvbiB8fCAwO1xyXG5cclxuXHRcdGlmIChsYWJlbHMubGVuZ3RoICYmIG1lLm9wdGlvbnMuZGlzcGxheSAmJiBtZS5pc0hvcml6b250YWwoKSkge1xyXG5cdFx0XHR2YXIgb3JpZ2luYWxMYWJlbFdpZHRoID0gaGVscGVycy5sb25nZXN0VGV4dChjb250ZXh0LCB0aWNrRm9udC5mb250LCBsYWJlbHMsIG1lLmxvbmdlc3RUZXh0Q2FjaGUpO1xyXG5cdFx0XHR2YXIgbGFiZWxXaWR0aCA9IG9yaWdpbmFsTGFiZWxXaWR0aDtcclxuXHRcdFx0dmFyIGNvc1JvdGF0aW9uLCBzaW5Sb3RhdGlvbjtcclxuXHJcblx0XHRcdC8vIEFsbG93IDMgcGl4ZWxzIHgyIHBhZGRpbmcgZWl0aGVyIHNpZGUgZm9yIGxhYmVsIHJlYWRhYmlsaXR5XHJcblx0XHRcdHZhciB0aWNrV2lkdGggPSBtZS5nZXRQaXhlbEZvclRpY2soMSkgLSBtZS5nZXRQaXhlbEZvclRpY2soMCkgLSA2O1xyXG5cclxuXHRcdFx0Ly8gTWF4IGxhYmVsIHJvdGF0aW9uIGNhbiBiZSBzZXQgb3IgZGVmYXVsdCB0byA5MCAtIGFsc28gYWN0IGFzIGEgbG9vcCBjb3VudGVyXHJcblx0XHRcdHdoaWxlIChsYWJlbFdpZHRoID4gdGlja1dpZHRoICYmIGxhYmVsUm90YXRpb24gPCB0aWNrT3B0cy5tYXhSb3RhdGlvbikge1xyXG5cdFx0XHRcdHZhciBhbmdsZVJhZGlhbnMgPSBoZWxwZXJzLnRvUmFkaWFucyhsYWJlbFJvdGF0aW9uKTtcclxuXHRcdFx0XHRjb3NSb3RhdGlvbiA9IE1hdGguY29zKGFuZ2xlUmFkaWFucyk7XHJcblx0XHRcdFx0c2luUm90YXRpb24gPSBNYXRoLnNpbihhbmdsZVJhZGlhbnMpO1xyXG5cclxuXHRcdFx0XHRpZiAoc2luUm90YXRpb24gKiBvcmlnaW5hbExhYmVsV2lkdGggPiBtZS5tYXhIZWlnaHQpIHtcclxuXHRcdFx0XHRcdC8vIGdvIGJhY2sgb25lIHN0ZXBcclxuXHRcdFx0XHRcdGxhYmVsUm90YXRpb24tLTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0bGFiZWxSb3RhdGlvbisrO1xyXG5cdFx0XHRcdGxhYmVsV2lkdGggPSBjb3NSb3RhdGlvbiAqIG9yaWdpbmFsTGFiZWxXaWR0aDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdG1lLmxhYmVsUm90YXRpb24gPSBsYWJlbFJvdGF0aW9uO1xyXG5cdH0sXHJcblx0YWZ0ZXJDYWxjdWxhdGVUaWNrUm90YXRpb246IGZ1bmN0aW9uKCkge1xyXG5cdFx0aGVscGVycy5jYWxsYmFjayh0aGlzLm9wdGlvbnMuYWZ0ZXJDYWxjdWxhdGVUaWNrUm90YXRpb24sIFt0aGlzXSk7XHJcblx0fSxcclxuXHJcblx0Ly9cclxuXHJcblx0YmVmb3JlRml0OiBmdW5jdGlvbigpIHtcclxuXHRcdGhlbHBlcnMuY2FsbGJhY2sodGhpcy5vcHRpb25zLmJlZm9yZUZpdCwgW3RoaXNdKTtcclxuXHR9LFxyXG5cdGZpdDogZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0Ly8gUmVzZXRcclxuXHRcdHZhciBtaW5TaXplID0gbWUubWluU2l6ZSA9IHtcclxuXHRcdFx0d2lkdGg6IDAsXHJcblx0XHRcdGhlaWdodDogMFxyXG5cdFx0fTtcclxuXHJcblx0XHR2YXIgbGFiZWxzID0gbGFiZWxzRnJvbVRpY2tzKG1lLl90aWNrcyk7XHJcblxyXG5cdFx0dmFyIG9wdHMgPSBtZS5vcHRpb25zO1xyXG5cdFx0dmFyIHRpY2tPcHRzID0gb3B0cy50aWNrcztcclxuXHRcdHZhciBzY2FsZUxhYmVsT3B0cyA9IG9wdHMuc2NhbGVMYWJlbDtcclxuXHRcdHZhciBncmlkTGluZU9wdHMgPSBvcHRzLmdyaWRMaW5lcztcclxuXHRcdHZhciBkaXNwbGF5ID0gb3B0cy5kaXNwbGF5O1xyXG5cdFx0dmFyIGlzSG9yaXpvbnRhbCA9IG1lLmlzSG9yaXpvbnRhbCgpO1xyXG5cclxuXHRcdHZhciB0aWNrRm9udCA9IHBhcnNlRm9udE9wdGlvbnModGlja09wdHMpO1xyXG5cdFx0dmFyIHRpY2tNYXJrTGVuZ3RoID0gb3B0cy5ncmlkTGluZXMudGlja01hcmtMZW5ndGg7XHJcblxyXG5cdFx0Ly8gV2lkdGhcclxuXHRcdGlmIChpc0hvcml6b250YWwpIHtcclxuXHRcdFx0Ly8gc3VidHJhY3QgdGhlIG1hcmdpbnMgdG8gbGluZSB1cCB3aXRoIHRoZSBjaGFydEFyZWEgaWYgd2UgYXJlIGEgZnVsbCB3aWR0aCBzY2FsZVxyXG5cdFx0XHRtaW5TaXplLndpZHRoID0gbWUuaXNGdWxsV2lkdGgoKSA/IG1lLm1heFdpZHRoIC0gbWUubWFyZ2lucy5sZWZ0IC0gbWUubWFyZ2lucy5yaWdodCA6IG1lLm1heFdpZHRoO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0bWluU2l6ZS53aWR0aCA9IGRpc3BsYXkgJiYgZ3JpZExpbmVPcHRzLmRyYXdUaWNrcyA/IHRpY2tNYXJrTGVuZ3RoIDogMDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBoZWlnaHRcclxuXHRcdGlmIChpc0hvcml6b250YWwpIHtcclxuXHRcdFx0bWluU2l6ZS5oZWlnaHQgPSBkaXNwbGF5ICYmIGdyaWRMaW5lT3B0cy5kcmF3VGlja3MgPyB0aWNrTWFya0xlbmd0aCA6IDA7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRtaW5TaXplLmhlaWdodCA9IG1lLm1heEhlaWdodDsgLy8gZmlsbCBhbGwgdGhlIGhlaWdodFxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEFyZSB3ZSBzaG93aW5nIGEgdGl0bGUgZm9yIHRoZSBzY2FsZT9cclxuXHRcdGlmIChzY2FsZUxhYmVsT3B0cy5kaXNwbGF5ICYmIGRpc3BsYXkpIHtcclxuXHRcdFx0dmFyIHNjYWxlTGFiZWxMaW5lSGVpZ2h0ID0gcGFyc2VMaW5lSGVpZ2h0KHNjYWxlTGFiZWxPcHRzKTtcclxuXHRcdFx0dmFyIHNjYWxlTGFiZWxQYWRkaW5nID0gaGVscGVycy5vcHRpb25zLnRvUGFkZGluZyhzY2FsZUxhYmVsT3B0cy5wYWRkaW5nKTtcclxuXHRcdFx0dmFyIGRlbHRhSGVpZ2h0ID0gc2NhbGVMYWJlbExpbmVIZWlnaHQgKyBzY2FsZUxhYmVsUGFkZGluZy5oZWlnaHQ7XHJcblxyXG5cdFx0XHRpZiAoaXNIb3Jpem9udGFsKSB7XHJcblx0XHRcdFx0bWluU2l6ZS5oZWlnaHQgKz0gZGVsdGFIZWlnaHQ7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0bWluU2l6ZS53aWR0aCArPSBkZWx0YUhlaWdodDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIERvbid0IGJvdGhlciBmaXR0aW5nIHRoZSB0aWNrcyBpZiB3ZSBhcmUgbm90IHNob3dpbmcgdGhlbVxyXG5cdFx0aWYgKHRpY2tPcHRzLmRpc3BsYXkgJiYgZGlzcGxheSkge1xyXG5cdFx0XHR2YXIgbGFyZ2VzdFRleHRXaWR0aCA9IGhlbHBlcnMubG9uZ2VzdFRleHQobWUuY3R4LCB0aWNrRm9udC5mb250LCBsYWJlbHMsIG1lLmxvbmdlc3RUZXh0Q2FjaGUpO1xyXG5cdFx0XHR2YXIgdGFsbGVzdExhYmVsSGVpZ2h0SW5MaW5lcyA9IGhlbHBlcnMubnVtYmVyT2ZMYWJlbExpbmVzKGxhYmVscyk7XHJcblx0XHRcdHZhciBsaW5lU3BhY2UgPSB0aWNrRm9udC5zaXplICogMC41O1xyXG5cdFx0XHR2YXIgdGlja1BhZGRpbmcgPSBtZS5vcHRpb25zLnRpY2tzLnBhZGRpbmc7XHJcblxyXG5cdFx0XHRpZiAoaXNIb3Jpem9udGFsKSB7XHJcblx0XHRcdFx0Ly8gQSBob3Jpem9udGFsIGF4aXMgaXMgbW9yZSBjb25zdHJhaW5lZCBieSB0aGUgaGVpZ2h0LlxyXG5cdFx0XHRcdG1lLmxvbmdlc3RMYWJlbFdpZHRoID0gbGFyZ2VzdFRleHRXaWR0aDtcclxuXHJcblx0XHRcdFx0dmFyIGFuZ2xlUmFkaWFucyA9IGhlbHBlcnMudG9SYWRpYW5zKG1lLmxhYmVsUm90YXRpb24pO1xyXG5cdFx0XHRcdHZhciBjb3NSb3RhdGlvbiA9IE1hdGguY29zKGFuZ2xlUmFkaWFucyk7XHJcblx0XHRcdFx0dmFyIHNpblJvdGF0aW9uID0gTWF0aC5zaW4oYW5nbGVSYWRpYW5zKTtcclxuXHJcblx0XHRcdFx0Ly8gVE9ETyAtIGltcHJvdmUgdGhpcyBjYWxjdWxhdGlvblxyXG5cdFx0XHRcdHZhciBsYWJlbEhlaWdodCA9IChzaW5Sb3RhdGlvbiAqIGxhcmdlc3RUZXh0V2lkdGgpXHJcblx0XHRcdFx0XHQrICh0aWNrRm9udC5zaXplICogdGFsbGVzdExhYmVsSGVpZ2h0SW5MaW5lcylcclxuXHRcdFx0XHRcdCsgKGxpbmVTcGFjZSAqICh0YWxsZXN0TGFiZWxIZWlnaHRJbkxpbmVzIC0gMSkpXHJcblx0XHRcdFx0XHQrIGxpbmVTcGFjZTsgLy8gcGFkZGluZ1xyXG5cclxuXHRcdFx0XHRtaW5TaXplLmhlaWdodCA9IE1hdGgubWluKG1lLm1heEhlaWdodCwgbWluU2l6ZS5oZWlnaHQgKyBsYWJlbEhlaWdodCArIHRpY2tQYWRkaW5nKTtcclxuXHJcblx0XHRcdFx0bWUuY3R4LmZvbnQgPSB0aWNrRm9udC5mb250O1xyXG5cdFx0XHRcdHZhciBmaXJzdExhYmVsV2lkdGggPSBjb21wdXRlVGV4dFNpemUobWUuY3R4LCBsYWJlbHNbMF0sIHRpY2tGb250LmZvbnQpO1xyXG5cdFx0XHRcdHZhciBsYXN0TGFiZWxXaWR0aCA9IGNvbXB1dGVUZXh0U2l6ZShtZS5jdHgsIGxhYmVsc1tsYWJlbHMubGVuZ3RoIC0gMV0sIHRpY2tGb250LmZvbnQpO1xyXG5cclxuXHRcdFx0XHQvLyBFbnN1cmUgdGhhdCBvdXIgdGlja3MgYXJlIGFsd2F5cyBpbnNpZGUgdGhlIGNhbnZhcy4gV2hlbiByb3RhdGVkLCB0aWNrcyBhcmUgcmlnaHQgYWxpZ25lZFxyXG5cdFx0XHRcdC8vIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHJpZ2h0IHBhZGRpbmcgaXMgZG9taW5hdGVkIGJ5IHRoZSBmb250IGhlaWdodFxyXG5cdFx0XHRcdGlmIChtZS5sYWJlbFJvdGF0aW9uICE9PSAwKSB7XHJcblx0XHRcdFx0XHRtZS5wYWRkaW5nTGVmdCA9IG9wdHMucG9zaXRpb24gPT09ICdib3R0b20nID8gKGNvc1JvdGF0aW9uICogZmlyc3RMYWJlbFdpZHRoKSArIDMgOiAoY29zUm90YXRpb24gKiBsaW5lU3BhY2UpICsgMzsgLy8gYWRkIDMgcHggdG8gbW92ZSBhd2F5IGZyb20gY2FudmFzIGVkZ2VzXHJcblx0XHRcdFx0XHRtZS5wYWRkaW5nUmlnaHQgPSBvcHRzLnBvc2l0aW9uID09PSAnYm90dG9tJyA/IChjb3NSb3RhdGlvbiAqIGxpbmVTcGFjZSkgKyAzIDogKGNvc1JvdGF0aW9uICogbGFzdExhYmVsV2lkdGgpICsgMztcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0bWUucGFkZGluZ0xlZnQgPSBmaXJzdExhYmVsV2lkdGggLyAyICsgMzsgLy8gYWRkIDMgcHggdG8gbW92ZSBhd2F5IGZyb20gY2FudmFzIGVkZ2VzXHJcblx0XHRcdFx0XHRtZS5wYWRkaW5nUmlnaHQgPSBsYXN0TGFiZWxXaWR0aCAvIDIgKyAzO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvLyBBIHZlcnRpY2FsIGF4aXMgaXMgbW9yZSBjb25zdHJhaW5lZCBieSB0aGUgd2lkdGguIExhYmVscyBhcmUgdGhlXHJcblx0XHRcdFx0Ly8gZG9taW5hbnQgZmFjdG9yIGhlcmUsIHNvIGdldCB0aGF0IGxlbmd0aCBmaXJzdCBhbmQgYWNjb3VudCBmb3IgcGFkZGluZ1xyXG5cdFx0XHRcdGlmICh0aWNrT3B0cy5taXJyb3IpIHtcclxuXHRcdFx0XHRcdGxhcmdlc3RUZXh0V2lkdGggPSAwO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvLyB1c2UgbGluZVNwYWNlIGZvciBjb25zaXN0ZW5jeSB3aXRoIGhvcml6b250YWwgYXhpc1xyXG5cdFx0XHRcdFx0Ly8gdGlja1BhZGRpbmcgaXMgbm90IGltcGxlbWVudGVkIGZvciBob3Jpem9udGFsXHJcblx0XHRcdFx0XHRsYXJnZXN0VGV4dFdpZHRoICs9IHRpY2tQYWRkaW5nICsgbGluZVNwYWNlO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0bWluU2l6ZS53aWR0aCA9IE1hdGgubWluKG1lLm1heFdpZHRoLCBtaW5TaXplLndpZHRoICsgbGFyZ2VzdFRleHRXaWR0aCk7XHJcblxyXG5cdFx0XHRcdG1lLnBhZGRpbmdUb3AgPSB0aWNrRm9udC5zaXplIC8gMjtcclxuXHRcdFx0XHRtZS5wYWRkaW5nQm90dG9tID0gdGlja0ZvbnQuc2l6ZSAvIDI7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRtZS5oYW5kbGVNYXJnaW5zKCk7XHJcblxyXG5cdFx0bWUud2lkdGggPSBtaW5TaXplLndpZHRoO1xyXG5cdFx0bWUuaGVpZ2h0ID0gbWluU2l6ZS5oZWlnaHQ7XHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICogSGFuZGxlIG1hcmdpbnMgYW5kIHBhZGRpbmcgaW50ZXJhY3Rpb25zXHJcblx0ICogQHByaXZhdGVcclxuXHQgKi9cclxuXHRoYW5kbGVNYXJnaW5zOiBmdW5jdGlvbigpIHtcclxuXHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRpZiAobWUubWFyZ2lucykge1xyXG5cdFx0XHRtZS5wYWRkaW5nTGVmdCA9IE1hdGgubWF4KG1lLnBhZGRpbmdMZWZ0IC0gbWUubWFyZ2lucy5sZWZ0LCAwKTtcclxuXHRcdFx0bWUucGFkZGluZ1RvcCA9IE1hdGgubWF4KG1lLnBhZGRpbmdUb3AgLSBtZS5tYXJnaW5zLnRvcCwgMCk7XHJcblx0XHRcdG1lLnBhZGRpbmdSaWdodCA9IE1hdGgubWF4KG1lLnBhZGRpbmdSaWdodCAtIG1lLm1hcmdpbnMucmlnaHQsIDApO1xyXG5cdFx0XHRtZS5wYWRkaW5nQm90dG9tID0gTWF0aC5tYXgobWUucGFkZGluZ0JvdHRvbSAtIG1lLm1hcmdpbnMuYm90dG9tLCAwKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRhZnRlckZpdDogZnVuY3Rpb24oKSB7XHJcblx0XHRoZWxwZXJzLmNhbGxiYWNrKHRoaXMub3B0aW9ucy5hZnRlckZpdCwgW3RoaXNdKTtcclxuXHR9LFxyXG5cclxuXHQvLyBTaGFyZWQgTWV0aG9kc1xyXG5cdGlzSG9yaXpvbnRhbDogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5vcHRpb25zLnBvc2l0aW9uID09PSAndG9wJyB8fCB0aGlzLm9wdGlvbnMucG9zaXRpb24gPT09ICdib3R0b20nO1xyXG5cdH0sXHJcblx0aXNGdWxsV2lkdGg6IGZ1bmN0aW9uKCkge1xyXG5cdFx0cmV0dXJuICh0aGlzLm9wdGlvbnMuZnVsbFdpZHRoKTtcclxuXHR9LFxyXG5cclxuXHQvLyBHZXQgdGhlIGNvcnJlY3QgdmFsdWUuIE5hTiBiYWQgaW5wdXRzLCBJZiB0aGUgdmFsdWUgdHlwZSBpcyBvYmplY3QgZ2V0IHRoZSB4IG9yIHkgYmFzZWQgb24gd2hldGhlciB3ZSBhcmUgaG9yaXpvbnRhbCBvciBub3RcclxuXHRnZXRSaWdodFZhbHVlOiBmdW5jdGlvbihyYXdWYWx1ZSkge1xyXG5cdFx0Ly8gTnVsbCBhbmQgdW5kZWZpbmVkIHZhbHVlcyBmaXJzdFxyXG5cdFx0aWYgKGhlbHBlcnMuaXNOdWxsT3JVbmRlZihyYXdWYWx1ZSkpIHtcclxuXHRcdFx0cmV0dXJuIE5hTjtcclxuXHRcdH1cclxuXHRcdC8vIGlzTmFOKG9iamVjdCkgcmV0dXJucyB0cnVlLCBzbyBtYWtlIHN1cmUgTmFOIGlzIGNoZWNraW5nIGZvciBhIG51bWJlcjsgRGlzY2FyZCBJbmZpbml0ZSB2YWx1ZXNcclxuXHRcdGlmICh0eXBlb2YgcmF3VmFsdWUgPT09ICdudW1iZXInICYmICFpc0Zpbml0ZShyYXdWYWx1ZSkpIHtcclxuXHRcdFx0cmV0dXJuIE5hTjtcclxuXHRcdH1cclxuXHRcdC8vIElmIGl0IGlzIGluIGZhY3QgYW4gb2JqZWN0LCBkaXZlIGluIG9uZSBtb3JlIGxldmVsXHJcblx0XHRpZiAocmF3VmFsdWUpIHtcclxuXHRcdFx0aWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHtcclxuXHRcdFx0XHRpZiAocmF3VmFsdWUueCAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRSaWdodFZhbHVlKHJhd1ZhbHVlLngpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIGlmIChyYXdWYWx1ZS55ICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRSaWdodFZhbHVlKHJhd1ZhbHVlLnkpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gVmFsdWUgaXMgZ29vZCwgcmV0dXJuIGl0XHJcblx0XHRyZXR1cm4gcmF3VmFsdWU7XHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICogVXNlZCB0byBnZXQgdGhlIHZhbHVlIHRvIGRpc3BsYXkgaW4gdGhlIHRvb2x0aXAgZm9yIHRoZSBkYXRhIGF0IHRoZSBnaXZlbiBpbmRleFxyXG5cdCAqIEBwYXJhbSBpbmRleFxyXG5cdCAqIEBwYXJhbSBkYXRhc2V0SW5kZXhcclxuXHQgKi9cclxuXHRnZXRMYWJlbEZvckluZGV4OiBoZWxwZXJzLm5vb3AsXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBnaXZlbiBkYXRhIHBvaW50LiBWYWx1ZSBjYW4gZWl0aGVyIGJlIGFuIGluZGV4IG9yIGEgbnVtZXJpY2FsIHZhbHVlXHJcblx0ICogVGhlIGNvb3JkaW5hdGUgKDAsIDApIGlzIGF0IHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgY2FudmFzXHJcblx0ICogQHBhcmFtIHZhbHVlXHJcblx0ICogQHBhcmFtIGluZGV4XHJcblx0ICogQHBhcmFtIGRhdGFzZXRJbmRleFxyXG5cdCAqL1xyXG5cdGdldFBpeGVsRm9yVmFsdWU6IGhlbHBlcnMubm9vcCxcclxuXHJcblx0LyoqXHJcblx0ICogVXNlZCB0byBnZXQgdGhlIGRhdGEgdmFsdWUgZnJvbSBhIGdpdmVuIHBpeGVsLiBUaGlzIGlzIHRoZSBpbnZlcnNlIG9mIGdldFBpeGVsRm9yVmFsdWVcclxuXHQgKiBUaGUgY29vcmRpbmF0ZSAoMCwgMCkgaXMgYXQgdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSBjYW52YXNcclxuXHQgKiBAcGFyYW0gcGl4ZWxcclxuXHQgKi9cclxuXHRnZXRWYWx1ZUZvclBpeGVsOiBoZWxwZXJzLm5vb3AsXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSB0aWNrIGF0IHRoZSBnaXZlbiBpbmRleFxyXG5cdCAqIFRoZSBjb29yZGluYXRlICgwLCAwKSBpcyBhdCB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2YgdGhlIGNhbnZhc1xyXG5cdCAqL1xyXG5cdGdldFBpeGVsRm9yVGljazogZnVuY3Rpb24oaW5kZXgpIHtcclxuXHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHR2YXIgb2Zmc2V0ID0gbWUub3B0aW9ucy5vZmZzZXQ7XHJcblx0XHRpZiAobWUuaXNIb3Jpem9udGFsKCkpIHtcclxuXHRcdFx0dmFyIGlubmVyV2lkdGggPSBtZS53aWR0aCAtIChtZS5wYWRkaW5nTGVmdCArIG1lLnBhZGRpbmdSaWdodCk7XHJcblx0XHRcdHZhciB0aWNrV2lkdGggPSBpbm5lcldpZHRoIC8gTWF0aC5tYXgoKG1lLl90aWNrcy5sZW5ndGggLSAob2Zmc2V0ID8gMCA6IDEpKSwgMSk7XHJcblx0XHRcdHZhciBwaXhlbCA9ICh0aWNrV2lkdGggKiBpbmRleCkgKyBtZS5wYWRkaW5nTGVmdDtcclxuXHJcblx0XHRcdGlmIChvZmZzZXQpIHtcclxuXHRcdFx0XHRwaXhlbCArPSB0aWNrV2lkdGggLyAyO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR2YXIgZmluYWxWYWwgPSBtZS5sZWZ0ICsgTWF0aC5yb3VuZChwaXhlbCk7XHJcblx0XHRcdGZpbmFsVmFsICs9IG1lLmlzRnVsbFdpZHRoKCkgPyBtZS5tYXJnaW5zLmxlZnQgOiAwO1xyXG5cdFx0XHRyZXR1cm4gZmluYWxWYWw7XHJcblx0XHR9XHJcblx0XHR2YXIgaW5uZXJIZWlnaHQgPSBtZS5oZWlnaHQgLSAobWUucGFkZGluZ1RvcCArIG1lLnBhZGRpbmdCb3R0b20pO1xyXG5cdFx0cmV0dXJuIG1lLnRvcCArIChpbmRleCAqIChpbm5lckhlaWdodCAvIChtZS5fdGlja3MubGVuZ3RoIC0gMSkpKTtcclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBVdGlsaXR5IGZvciBnZXR0aW5nIHRoZSBwaXhlbCBsb2NhdGlvbiBvZiBhIHBlcmNlbnRhZ2Ugb2Ygc2NhbGVcclxuXHQgKiBUaGUgY29vcmRpbmF0ZSAoMCwgMCkgaXMgYXQgdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSBjYW52YXNcclxuXHQgKi9cclxuXHRnZXRQaXhlbEZvckRlY2ltYWw6IGZ1bmN0aW9uKGRlY2ltYWwpIHtcclxuXHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRpZiAobWUuaXNIb3Jpem9udGFsKCkpIHtcclxuXHRcdFx0dmFyIGlubmVyV2lkdGggPSBtZS53aWR0aCAtIChtZS5wYWRkaW5nTGVmdCArIG1lLnBhZGRpbmdSaWdodCk7XHJcblx0XHRcdHZhciB2YWx1ZU9mZnNldCA9IChpbm5lcldpZHRoICogZGVjaW1hbCkgKyBtZS5wYWRkaW5nTGVmdDtcclxuXHJcblx0XHRcdHZhciBmaW5hbFZhbCA9IG1lLmxlZnQgKyBNYXRoLnJvdW5kKHZhbHVlT2Zmc2V0KTtcclxuXHRcdFx0ZmluYWxWYWwgKz0gbWUuaXNGdWxsV2lkdGgoKSA/IG1lLm1hcmdpbnMubGVmdCA6IDA7XHJcblx0XHRcdHJldHVybiBmaW5hbFZhbDtcclxuXHRcdH1cclxuXHRcdHJldHVybiBtZS50b3AgKyAoZGVjaW1hbCAqIG1lLmhlaWdodCk7XHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgcGl4ZWwgZm9yIHRoZSBtaW5pbXVtIGNoYXJ0IHZhbHVlXHJcblx0ICogVGhlIGNvb3JkaW5hdGUgKDAsIDApIGlzIGF0IHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgY2FudmFzXHJcblx0ICovXHJcblx0Z2V0QmFzZVBpeGVsOiBmdW5jdGlvbigpIHtcclxuXHRcdHJldHVybiB0aGlzLmdldFBpeGVsRm9yVmFsdWUodGhpcy5nZXRCYXNlVmFsdWUoKSk7XHJcblx0fSxcclxuXHJcblx0Z2V0QmFzZVZhbHVlOiBmdW5jdGlvbigpIHtcclxuXHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHR2YXIgbWluID0gbWUubWluO1xyXG5cdFx0dmFyIG1heCA9IG1lLm1heDtcclxuXHJcblx0XHRyZXR1cm4gbWUuYmVnaW5BdFplcm8gPyAwIDpcclxuXHRcdFx0bWluIDwgMCAmJiBtYXggPCAwID8gbWF4IDpcclxuXHRcdFx0bWluID4gMCAmJiBtYXggPiAwID8gbWluIDpcclxuXHRcdFx0MDtcclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgc3Vic2V0IG9mIHRpY2tzIHRvIGJlIHBsb3R0ZWQgdG8gYXZvaWQgb3ZlcmxhcHBpbmcgbGFiZWxzLlxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICovXHJcblx0X2F1dG9Ta2lwOiBmdW5jdGlvbih0aWNrcykge1xyXG5cdFx0dmFyIHNraXBSYXRpbztcclxuXHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHR2YXIgaXNIb3Jpem9udGFsID0gbWUuaXNIb3Jpem9udGFsKCk7XHJcblx0XHR2YXIgb3B0aW9uVGlja3MgPSBtZS5vcHRpb25zLnRpY2tzLm1pbm9yO1xyXG5cdFx0dmFyIHRpY2tDb3VudCA9IHRpY2tzLmxlbmd0aDtcclxuXHRcdHZhciBsYWJlbFJvdGF0aW9uUmFkaWFucyA9IGhlbHBlcnMudG9SYWRpYW5zKG1lLmxhYmVsUm90YXRpb24pO1xyXG5cdFx0dmFyIGNvc1JvdGF0aW9uID0gTWF0aC5jb3MobGFiZWxSb3RhdGlvblJhZGlhbnMpO1xyXG5cdFx0dmFyIGxvbmdlc3RSb3RhdGVkTGFiZWwgPSBtZS5sb25nZXN0TGFiZWxXaWR0aCAqIGNvc1JvdGF0aW9uO1xyXG5cdFx0dmFyIHJlc3VsdCA9IFtdO1xyXG5cdFx0dmFyIGksIHRpY2ssIHNob3VsZFNraXA7XHJcblxyXG5cdFx0Ly8gZmlndXJlIG91dCB0aGUgbWF4aW11bSBudW1iZXIgb2YgZ3JpZGxpbmVzIHRvIHNob3dcclxuXHRcdHZhciBtYXhUaWNrcztcclxuXHRcdGlmIChvcHRpb25UaWNrcy5tYXhUaWNrc0xpbWl0KSB7XHJcblx0XHRcdG1heFRpY2tzID0gb3B0aW9uVGlja3MubWF4VGlja3NMaW1pdDtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoaXNIb3Jpem9udGFsKSB7XHJcblx0XHRcdHNraXBSYXRpbyA9IGZhbHNlO1xyXG5cclxuXHRcdFx0aWYgKChsb25nZXN0Um90YXRlZExhYmVsICsgb3B0aW9uVGlja3MuYXV0b1NraXBQYWRkaW5nKSAqIHRpY2tDb3VudCA+IChtZS53aWR0aCAtIChtZS5wYWRkaW5nTGVmdCArIG1lLnBhZGRpbmdSaWdodCkpKSB7XHJcblx0XHRcdFx0c2tpcFJhdGlvID0gMSArIE1hdGguZmxvb3IoKChsb25nZXN0Um90YXRlZExhYmVsICsgb3B0aW9uVGlja3MuYXV0b1NraXBQYWRkaW5nKSAqIHRpY2tDb3VudCkgLyAobWUud2lkdGggLSAobWUucGFkZGluZ0xlZnQgKyBtZS5wYWRkaW5nUmlnaHQpKSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIGlmIHRoZXkgZGVmaW5lZCBhIG1heCBudW1iZXIgb2Ygb3B0aW9uVGlja3MsXHJcblx0XHRcdC8vIGluY3JlYXNlIHNraXBSYXRpbyB1bnRpbCB0aGF0IG51bWJlciBpcyBtZXRcclxuXHRcdFx0aWYgKG1heFRpY2tzICYmIHRpY2tDb3VudCA+IG1heFRpY2tzKSB7XHJcblx0XHRcdFx0c2tpcFJhdGlvID0gTWF0aC5tYXgoc2tpcFJhdGlvLCBNYXRoLmZsb29yKHRpY2tDb3VudCAvIG1heFRpY2tzKSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKGkgPSAwOyBpIDwgdGlja0NvdW50OyBpKyspIHtcclxuXHRcdFx0dGljayA9IHRpY2tzW2ldO1xyXG5cclxuXHRcdFx0Ly8gU2luY2Ugd2UgYWx3YXlzIHNob3cgdGhlIGxhc3QgdGljayx3ZSBuZWVkIG1heSBuZWVkIHRvIGhpZGUgdGhlIGxhc3Qgc2hvd24gb25lIGJlZm9yZVxyXG5cdFx0XHRzaG91bGRTa2lwID0gKHNraXBSYXRpbyA+IDEgJiYgaSAlIHNraXBSYXRpbyA+IDApIHx8IChpICUgc2tpcFJhdGlvID09PSAwICYmIGkgKyBza2lwUmF0aW8gPj0gdGlja0NvdW50KTtcclxuXHRcdFx0aWYgKHNob3VsZFNraXAgJiYgaSAhPT0gdGlja0NvdW50IC0gMSkge1xyXG5cdFx0XHRcdC8vIGxlYXZlIHRpY2sgaW4gcGxhY2UgYnV0IG1ha2Ugc3VyZSBpdCdzIG5vdCBkaXNwbGF5ZWQgKCM0NjM1KVxyXG5cdFx0XHRcdGRlbGV0ZSB0aWNrLmxhYmVsO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJlc3VsdC5wdXNoKHRpY2spO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHJlc3VsdDtcclxuXHR9LFxyXG5cclxuXHQvLyBBY3R1YWxseSBkcmF3IHRoZSBzY2FsZSBvbiB0aGUgY2FudmFzXHJcblx0Ly8gQHBhcmFtIHtyZWN0YW5nbGV9IGNoYXJ0QXJlYSA6IHRoZSBhcmVhIG9mIHRoZSBjaGFydCB0byBkcmF3IGZ1bGwgZ3JpZCBsaW5lcyBvblxyXG5cdGRyYXc6IGZ1bmN0aW9uKGNoYXJ0QXJlYSkge1xyXG5cdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdHZhciBvcHRpb25zID0gbWUub3B0aW9ucztcclxuXHRcdGlmICghb3B0aW9ucy5kaXNwbGF5KSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgY29udGV4dCA9IG1lLmN0eDtcclxuXHRcdHZhciBnbG9iYWxEZWZhdWx0cyA9IGRlZmF1bHRzLmdsb2JhbDtcclxuXHRcdHZhciBvcHRpb25UaWNrcyA9IG9wdGlvbnMudGlja3MubWlub3I7XHJcblx0XHR2YXIgb3B0aW9uTWFqb3JUaWNrcyA9IG9wdGlvbnMudGlja3MubWFqb3IgfHwgb3B0aW9uVGlja3M7XHJcblx0XHR2YXIgZ3JpZExpbmVzID0gb3B0aW9ucy5ncmlkTGluZXM7XHJcblx0XHR2YXIgc2NhbGVMYWJlbCA9IG9wdGlvbnMuc2NhbGVMYWJlbDtcclxuXHJcblx0XHR2YXIgaXNSb3RhdGVkID0gbWUubGFiZWxSb3RhdGlvbiAhPT0gMDtcclxuXHRcdHZhciBpc0hvcml6b250YWwgPSBtZS5pc0hvcml6b250YWwoKTtcclxuXHJcblx0XHR2YXIgdGlja3MgPSBvcHRpb25UaWNrcy5hdXRvU2tpcCA/IG1lLl9hdXRvU2tpcChtZS5nZXRUaWNrcygpKSA6IG1lLmdldFRpY2tzKCk7XHJcblx0XHR2YXIgdGlja0ZvbnRDb2xvciA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQob3B0aW9uVGlja3MuZm9udENvbG9yLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udENvbG9yKTtcclxuXHRcdHZhciB0aWNrRm9udCA9IHBhcnNlRm9udE9wdGlvbnMob3B0aW9uVGlja3MpO1xyXG5cdFx0dmFyIG1ham9yVGlja0ZvbnRDb2xvciA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQob3B0aW9uTWFqb3JUaWNrcy5mb250Q29sb3IsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250Q29sb3IpO1xyXG5cdFx0dmFyIG1ham9yVGlja0ZvbnQgPSBwYXJzZUZvbnRPcHRpb25zKG9wdGlvbk1ham9yVGlja3MpO1xyXG5cclxuXHRcdHZhciB0bCA9IGdyaWRMaW5lcy5kcmF3VGlja3MgPyBncmlkTGluZXMudGlja01hcmtMZW5ndGggOiAwO1xyXG5cclxuXHRcdHZhciBzY2FsZUxhYmVsRm9udENvbG9yID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdChzY2FsZUxhYmVsLmZvbnRDb2xvciwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRDb2xvcik7XHJcblx0XHR2YXIgc2NhbGVMYWJlbEZvbnQgPSBwYXJzZUZvbnRPcHRpb25zKHNjYWxlTGFiZWwpO1xyXG5cdFx0dmFyIHNjYWxlTGFiZWxQYWRkaW5nID0gaGVscGVycy5vcHRpb25zLnRvUGFkZGluZyhzY2FsZUxhYmVsLnBhZGRpbmcpO1xyXG5cdFx0dmFyIGxhYmVsUm90YXRpb25SYWRpYW5zID0gaGVscGVycy50b1JhZGlhbnMobWUubGFiZWxSb3RhdGlvbik7XHJcblxyXG5cdFx0dmFyIGl0ZW1zVG9EcmF3ID0gW107XHJcblxyXG5cdFx0dmFyIGF4aXNXaWR0aCA9IG1lLm9wdGlvbnMuZ3JpZExpbmVzLmxpbmVXaWR0aDtcclxuXHRcdHZhciB4VGlja1N0YXJ0ID0gb3B0aW9ucy5wb3NpdGlvbiA9PT0gJ3JpZ2h0JyA/IG1lLmxlZnQgOiBtZS5yaWdodCAtIGF4aXNXaWR0aCAtIHRsO1xyXG5cdFx0dmFyIHhUaWNrRW5kID0gb3B0aW9ucy5wb3NpdGlvbiA9PT0gJ3JpZ2h0JyA/IG1lLmxlZnQgKyB0bCA6IG1lLnJpZ2h0O1xyXG5cdFx0dmFyIHlUaWNrU3RhcnQgPSBvcHRpb25zLnBvc2l0aW9uID09PSAnYm90dG9tJyA/IG1lLnRvcCArIGF4aXNXaWR0aCA6IG1lLmJvdHRvbSAtIHRsIC0gYXhpc1dpZHRoO1xyXG5cdFx0dmFyIHlUaWNrRW5kID0gb3B0aW9ucy5wb3NpdGlvbiA9PT0gJ2JvdHRvbScgPyBtZS50b3AgKyBheGlzV2lkdGggKyB0bCA6IG1lLmJvdHRvbSArIGF4aXNXaWR0aDtcclxuXHJcblx0XHRoZWxwZXJzLmVhY2godGlja3MsIGZ1bmN0aW9uKHRpY2ssIGluZGV4KSB7XHJcblx0XHRcdC8vIGF1dG9za2lwcGVyIHNraXBwZWQgdGhpcyB0aWNrICgjNDYzNSlcclxuXHRcdFx0aWYgKGhlbHBlcnMuaXNOdWxsT3JVbmRlZih0aWNrLmxhYmVsKSkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dmFyIGxhYmVsID0gdGljay5sYWJlbDtcclxuXHRcdFx0dmFyIGxpbmVXaWR0aCwgbGluZUNvbG9yLCBib3JkZXJEYXNoLCBib3JkZXJEYXNoT2Zmc2V0O1xyXG5cdFx0XHRpZiAoaW5kZXggPT09IG1lLnplcm9MaW5lSW5kZXggJiYgb3B0aW9ucy5vZmZzZXQgPT09IGdyaWRMaW5lcy5vZmZzZXRHcmlkTGluZXMpIHtcclxuXHRcdFx0XHQvLyBEcmF3IHRoZSBmaXJzdCBpbmRleCBzcGVjaWFsbHlcclxuXHRcdFx0XHRsaW5lV2lkdGggPSBncmlkTGluZXMuemVyb0xpbmVXaWR0aDtcclxuXHRcdFx0XHRsaW5lQ29sb3IgPSBncmlkTGluZXMuemVyb0xpbmVDb2xvcjtcclxuXHRcdFx0XHRib3JkZXJEYXNoID0gZ3JpZExpbmVzLnplcm9MaW5lQm9yZGVyRGFzaDtcclxuXHRcdFx0XHRib3JkZXJEYXNoT2Zmc2V0ID0gZ3JpZExpbmVzLnplcm9MaW5lQm9yZGVyRGFzaE9mZnNldDtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRsaW5lV2lkdGggPSBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChncmlkTGluZXMubGluZVdpZHRoLCBpbmRleCk7XHJcblx0XHRcdFx0bGluZUNvbG9yID0gaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZ3JpZExpbmVzLmNvbG9yLCBpbmRleCk7XHJcblx0XHRcdFx0Ym9yZGVyRGFzaCA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQoZ3JpZExpbmVzLmJvcmRlckRhc2gsIGdsb2JhbERlZmF1bHRzLmJvcmRlckRhc2gpO1xyXG5cdFx0XHRcdGJvcmRlckRhc2hPZmZzZXQgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KGdyaWRMaW5lcy5ib3JkZXJEYXNoT2Zmc2V0LCBnbG9iYWxEZWZhdWx0cy5ib3JkZXJEYXNoT2Zmc2V0KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gQ29tbW9uIHByb3BlcnRpZXNcclxuXHRcdFx0dmFyIHR4MSwgdHkxLCB0eDIsIHR5MiwgeDEsIHkxLCB4MiwgeTIsIGxhYmVsWCwgbGFiZWxZO1xyXG5cdFx0XHR2YXIgdGV4dEFsaWduID0gJ21pZGRsZSc7XHJcblx0XHRcdHZhciB0ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcclxuXHRcdFx0dmFyIHRpY2tQYWRkaW5nID0gb3B0aW9uVGlja3MucGFkZGluZztcclxuXHJcblx0XHRcdGlmIChpc0hvcml6b250YWwpIHtcclxuXHRcdFx0XHR2YXIgbGFiZWxZT2Zmc2V0ID0gdGwgKyB0aWNrUGFkZGluZztcclxuXHJcblx0XHRcdFx0aWYgKG9wdGlvbnMucG9zaXRpb24gPT09ICdib3R0b20nKSB7XHJcblx0XHRcdFx0XHQvLyBib3R0b21cclxuXHRcdFx0XHRcdHRleHRCYXNlbGluZSA9ICFpc1JvdGF0ZWQgPyAndG9wJyA6ICdtaWRkbGUnO1xyXG5cdFx0XHRcdFx0dGV4dEFsaWduID0gIWlzUm90YXRlZCA/ICdjZW50ZXInIDogJ3JpZ2h0JztcclxuXHRcdFx0XHRcdGxhYmVsWSA9IG1lLnRvcCArIGxhYmVsWU9mZnNldDtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0Ly8gdG9wXHJcblx0XHRcdFx0XHR0ZXh0QmFzZWxpbmUgPSAhaXNSb3RhdGVkID8gJ2JvdHRvbScgOiAnbWlkZGxlJztcclxuXHRcdFx0XHRcdHRleHRBbGlnbiA9ICFpc1JvdGF0ZWQgPyAnY2VudGVyJyA6ICdsZWZ0JztcclxuXHRcdFx0XHRcdGxhYmVsWSA9IG1lLmJvdHRvbSAtIGxhYmVsWU9mZnNldDtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHZhciB4TGluZVZhbHVlID0gZ2V0TGluZVZhbHVlKG1lLCBpbmRleCwgZ3JpZExpbmVzLm9mZnNldEdyaWRMaW5lcyAmJiB0aWNrcy5sZW5ndGggPiAxKTtcclxuXHRcdFx0XHRpZiAoeExpbmVWYWx1ZSA8IG1lLmxlZnQpIHtcclxuXHRcdFx0XHRcdGxpbmVDb2xvciA9ICdyZ2JhKDAsMCwwLDApJztcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0eExpbmVWYWx1ZSArPSBoZWxwZXJzLmFsaWFzUGl4ZWwobGluZVdpZHRoKTtcclxuXHJcblx0XHRcdFx0bGFiZWxYID0gbWUuZ2V0UGl4ZWxGb3JUaWNrKGluZGV4KSArIG9wdGlvblRpY2tzLmxhYmVsT2Zmc2V0OyAvLyB4IHZhbHVlcyBmb3Igb3B0aW9uVGlja3MgKG5lZWQgdG8gY29uc2lkZXIgb2Zmc2V0TGFiZWwgb3B0aW9uKVxyXG5cclxuXHRcdFx0XHR0eDEgPSB0eDIgPSB4MSA9IHgyID0geExpbmVWYWx1ZTtcclxuXHRcdFx0XHR0eTEgPSB5VGlja1N0YXJ0O1xyXG5cdFx0XHRcdHR5MiA9IHlUaWNrRW5kO1xyXG5cdFx0XHRcdHkxID0gY2hhcnRBcmVhLnRvcDtcclxuXHRcdFx0XHR5MiA9IGNoYXJ0QXJlYS5ib3R0b20gKyBheGlzV2lkdGg7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dmFyIGlzTGVmdCA9IG9wdGlvbnMucG9zaXRpb24gPT09ICdsZWZ0JztcclxuXHRcdFx0XHR2YXIgbGFiZWxYT2Zmc2V0O1xyXG5cclxuXHRcdFx0XHRpZiAob3B0aW9uVGlja3MubWlycm9yKSB7XHJcblx0XHRcdFx0XHR0ZXh0QWxpZ24gPSBpc0xlZnQgPyAnbGVmdCcgOiAncmlnaHQnO1xyXG5cdFx0XHRcdFx0bGFiZWxYT2Zmc2V0ID0gdGlja1BhZGRpbmc7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHRleHRBbGlnbiA9IGlzTGVmdCA/ICdyaWdodCcgOiAnbGVmdCc7XHJcblx0XHRcdFx0XHRsYWJlbFhPZmZzZXQgPSB0bCArIHRpY2tQYWRkaW5nO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0bGFiZWxYID0gaXNMZWZ0ID8gbWUucmlnaHQgLSBsYWJlbFhPZmZzZXQgOiBtZS5sZWZ0ICsgbGFiZWxYT2Zmc2V0O1xyXG5cclxuXHRcdFx0XHR2YXIgeUxpbmVWYWx1ZSA9IGdldExpbmVWYWx1ZShtZSwgaW5kZXgsIGdyaWRMaW5lcy5vZmZzZXRHcmlkTGluZXMgJiYgdGlja3MubGVuZ3RoID4gMSk7XHJcblx0XHRcdFx0aWYgKHlMaW5lVmFsdWUgPCBtZS50b3ApIHtcclxuXHRcdFx0XHRcdGxpbmVDb2xvciA9ICdyZ2JhKDAsMCwwLDApJztcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0eUxpbmVWYWx1ZSArPSBoZWxwZXJzLmFsaWFzUGl4ZWwobGluZVdpZHRoKTtcclxuXHJcblx0XHRcdFx0bGFiZWxZID0gbWUuZ2V0UGl4ZWxGb3JUaWNrKGluZGV4KSArIG9wdGlvblRpY2tzLmxhYmVsT2Zmc2V0O1xyXG5cclxuXHRcdFx0XHR0eDEgPSB4VGlja1N0YXJ0O1xyXG5cdFx0XHRcdHR4MiA9IHhUaWNrRW5kO1xyXG5cdFx0XHRcdHgxID0gY2hhcnRBcmVhLmxlZnQ7XHJcblx0XHRcdFx0eDIgPSBjaGFydEFyZWEucmlnaHQgKyBheGlzV2lkdGg7XHJcblx0XHRcdFx0dHkxID0gdHkyID0geTEgPSB5MiA9IHlMaW5lVmFsdWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGl0ZW1zVG9EcmF3LnB1c2goe1xyXG5cdFx0XHRcdHR4MTogdHgxLFxyXG5cdFx0XHRcdHR5MTogdHkxLFxyXG5cdFx0XHRcdHR4MjogdHgyLFxyXG5cdFx0XHRcdHR5MjogdHkyLFxyXG5cdFx0XHRcdHgxOiB4MSxcclxuXHRcdFx0XHR5MTogeTEsXHJcblx0XHRcdFx0eDI6IHgyLFxyXG5cdFx0XHRcdHkyOiB5MixcclxuXHRcdFx0XHRsYWJlbFg6IGxhYmVsWCxcclxuXHRcdFx0XHRsYWJlbFk6IGxhYmVsWSxcclxuXHRcdFx0XHRnbFdpZHRoOiBsaW5lV2lkdGgsXHJcblx0XHRcdFx0Z2xDb2xvcjogbGluZUNvbG9yLFxyXG5cdFx0XHRcdGdsQm9yZGVyRGFzaDogYm9yZGVyRGFzaCxcclxuXHRcdFx0XHRnbEJvcmRlckRhc2hPZmZzZXQ6IGJvcmRlckRhc2hPZmZzZXQsXHJcblx0XHRcdFx0cm90YXRpb246IC0xICogbGFiZWxSb3RhdGlvblJhZGlhbnMsXHJcblx0XHRcdFx0bGFiZWw6IGxhYmVsLFxyXG5cdFx0XHRcdG1ham9yOiB0aWNrLm1ham9yLFxyXG5cdFx0XHRcdHRleHRCYXNlbGluZTogdGV4dEJhc2VsaW5lLFxyXG5cdFx0XHRcdHRleHRBbGlnbjogdGV4dEFsaWduXHJcblx0XHRcdH0pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gRHJhdyBhbGwgb2YgdGhlIHRpY2sgbGFiZWxzLCB0aWNrIG1hcmtzLCBhbmQgZ3JpZCBsaW5lcyBhdCB0aGUgY29ycmVjdCBwbGFjZXNcclxuXHRcdGhlbHBlcnMuZWFjaChpdGVtc1RvRHJhdywgZnVuY3Rpb24oaXRlbVRvRHJhdykge1xyXG5cdFx0XHRpZiAoZ3JpZExpbmVzLmRpc3BsYXkpIHtcclxuXHRcdFx0XHRjb250ZXh0LnNhdmUoKTtcclxuXHRcdFx0XHRjb250ZXh0LmxpbmVXaWR0aCA9IGl0ZW1Ub0RyYXcuZ2xXaWR0aDtcclxuXHRcdFx0XHRjb250ZXh0LnN0cm9rZVN0eWxlID0gaXRlbVRvRHJhdy5nbENvbG9yO1xyXG5cdFx0XHRcdGlmIChjb250ZXh0LnNldExpbmVEYXNoKSB7XHJcblx0XHRcdFx0XHRjb250ZXh0LnNldExpbmVEYXNoKGl0ZW1Ub0RyYXcuZ2xCb3JkZXJEYXNoKTtcclxuXHRcdFx0XHRcdGNvbnRleHQubGluZURhc2hPZmZzZXQgPSBpdGVtVG9EcmF3LmdsQm9yZGVyRGFzaE9mZnNldDtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNvbnRleHQuYmVnaW5QYXRoKCk7XHJcblxyXG5cdFx0XHRcdGlmIChncmlkTGluZXMuZHJhd1RpY2tzKSB7XHJcblx0XHRcdFx0XHRjb250ZXh0Lm1vdmVUbyhpdGVtVG9EcmF3LnR4MSwgaXRlbVRvRHJhdy50eTEpO1xyXG5cdFx0XHRcdFx0Y29udGV4dC5saW5lVG8oaXRlbVRvRHJhdy50eDIsIGl0ZW1Ub0RyYXcudHkyKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmIChncmlkTGluZXMuZHJhd09uQ2hhcnRBcmVhKSB7XHJcblx0XHRcdFx0XHRjb250ZXh0Lm1vdmVUbyhpdGVtVG9EcmF3LngxLCBpdGVtVG9EcmF3LnkxKTtcclxuXHRcdFx0XHRcdGNvbnRleHQubGluZVRvKGl0ZW1Ub0RyYXcueDIsIGl0ZW1Ub0RyYXcueTIpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29udGV4dC5zdHJva2UoKTtcclxuXHRcdFx0XHRjb250ZXh0LnJlc3RvcmUoKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKG9wdGlvblRpY2tzLmRpc3BsYXkpIHtcclxuXHRcdFx0XHQvLyBNYWtlIHN1cmUgd2UgZHJhdyB0ZXh0IGluIHRoZSBjb3JyZWN0IGNvbG9yIGFuZCBmb250XHJcblx0XHRcdFx0Y29udGV4dC5zYXZlKCk7XHJcblx0XHRcdFx0Y29udGV4dC50cmFuc2xhdGUoaXRlbVRvRHJhdy5sYWJlbFgsIGl0ZW1Ub0RyYXcubGFiZWxZKTtcclxuXHRcdFx0XHRjb250ZXh0LnJvdGF0ZShpdGVtVG9EcmF3LnJvdGF0aW9uKTtcclxuXHRcdFx0XHRjb250ZXh0LmZvbnQgPSBpdGVtVG9EcmF3Lm1ham9yID8gbWFqb3JUaWNrRm9udC5mb250IDogdGlja0ZvbnQuZm9udDtcclxuXHRcdFx0XHRjb250ZXh0LmZpbGxTdHlsZSA9IGl0ZW1Ub0RyYXcubWFqb3IgPyBtYWpvclRpY2tGb250Q29sb3IgOiB0aWNrRm9udENvbG9yO1xyXG5cdFx0XHRcdGNvbnRleHQudGV4dEJhc2VsaW5lID0gaXRlbVRvRHJhdy50ZXh0QmFzZWxpbmU7XHJcblx0XHRcdFx0Y29udGV4dC50ZXh0QWxpZ24gPSBpdGVtVG9EcmF3LnRleHRBbGlnbjtcclxuXHJcblx0XHRcdFx0dmFyIGxhYmVsID0gaXRlbVRvRHJhdy5sYWJlbDtcclxuXHRcdFx0XHRpZiAoaGVscGVycy5pc0FycmF5KGxhYmVsKSkge1xyXG5cdFx0XHRcdFx0dmFyIGxpbmVDb3VudCA9IGxhYmVsLmxlbmd0aDtcclxuXHRcdFx0XHRcdHZhciBsaW5lSGVpZ2h0ID0gdGlja0ZvbnQuc2l6ZSAqIDEuNTtcclxuXHRcdFx0XHRcdHZhciB5ID0gbWUuaXNIb3Jpem9udGFsKCkgPyAwIDogLWxpbmVIZWlnaHQgKiAobGluZUNvdW50IC0gMSkgLyAyO1xyXG5cclxuXHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbGluZUNvdW50OyArK2kpIHtcclxuXHRcdFx0XHRcdFx0Ly8gV2UganVzdCBtYWtlIHN1cmUgdGhlIG11bHRpbGluZSBlbGVtZW50IGlzIGEgc3RyaW5nIGhlcmUuLlxyXG5cdFx0XHRcdFx0XHRjb250ZXh0LmZpbGxUZXh0KCcnICsgbGFiZWxbaV0sIDAsIHkpO1xyXG5cdFx0XHRcdFx0XHQvLyBhcHBseSBzYW1lIGxpbmVTcGFjaW5nIGFzIGNhbGN1bGF0ZWQgQCBMIzMyMFxyXG5cdFx0XHRcdFx0XHR5ICs9IGxpbmVIZWlnaHQ7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGNvbnRleHQuZmlsbFRleHQobGFiZWwsIDAsIDApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRjb250ZXh0LnJlc3RvcmUoKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0aWYgKHNjYWxlTGFiZWwuZGlzcGxheSkge1xyXG5cdFx0XHQvLyBEcmF3IHRoZSBzY2FsZSBsYWJlbFxyXG5cdFx0XHR2YXIgc2NhbGVMYWJlbFg7XHJcblx0XHRcdHZhciBzY2FsZUxhYmVsWTtcclxuXHRcdFx0dmFyIHJvdGF0aW9uID0gMDtcclxuXHRcdFx0dmFyIGhhbGZMaW5lSGVpZ2h0ID0gcGFyc2VMaW5lSGVpZ2h0KHNjYWxlTGFiZWwpIC8gMjtcclxuXHJcblx0XHRcdGlmIChpc0hvcml6b250YWwpIHtcclxuXHRcdFx0XHRzY2FsZUxhYmVsWCA9IG1lLmxlZnQgKyAoKG1lLnJpZ2h0IC0gbWUubGVmdCkgLyAyKTsgLy8gbWlkcG9pbnQgb2YgdGhlIHdpZHRoXHJcblx0XHRcdFx0c2NhbGVMYWJlbFkgPSBvcHRpb25zLnBvc2l0aW9uID09PSAnYm90dG9tJ1xyXG5cdFx0XHRcdFx0PyBtZS5ib3R0b20gLSBoYWxmTGluZUhlaWdodCAtIHNjYWxlTGFiZWxQYWRkaW5nLmJvdHRvbVxyXG5cdFx0XHRcdFx0OiBtZS50b3AgKyBoYWxmTGluZUhlaWdodCArIHNjYWxlTGFiZWxQYWRkaW5nLnRvcDtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR2YXIgaXNMZWZ0ID0gb3B0aW9ucy5wb3NpdGlvbiA9PT0gJ2xlZnQnO1xyXG5cdFx0XHRcdHNjYWxlTGFiZWxYID0gaXNMZWZ0XHJcblx0XHRcdFx0XHQ/IG1lLmxlZnQgKyBoYWxmTGluZUhlaWdodCArIHNjYWxlTGFiZWxQYWRkaW5nLnRvcFxyXG5cdFx0XHRcdFx0OiBtZS5yaWdodCAtIGhhbGZMaW5lSGVpZ2h0IC0gc2NhbGVMYWJlbFBhZGRpbmcudG9wO1xyXG5cdFx0XHRcdHNjYWxlTGFiZWxZID0gbWUudG9wICsgKChtZS5ib3R0b20gLSBtZS50b3ApIC8gMik7XHJcblx0XHRcdFx0cm90YXRpb24gPSBpc0xlZnQgPyAtMC41ICogTWF0aC5QSSA6IDAuNSAqIE1hdGguUEk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGNvbnRleHQuc2F2ZSgpO1xyXG5cdFx0XHRjb250ZXh0LnRyYW5zbGF0ZShzY2FsZUxhYmVsWCwgc2NhbGVMYWJlbFkpO1xyXG5cdFx0XHRjb250ZXh0LnJvdGF0ZShyb3RhdGlvbik7XHJcblx0XHRcdGNvbnRleHQudGV4dEFsaWduID0gJ2NlbnRlcic7XHJcblx0XHRcdGNvbnRleHQudGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7XHJcblx0XHRcdGNvbnRleHQuZmlsbFN0eWxlID0gc2NhbGVMYWJlbEZvbnRDb2xvcjsgLy8gcmVuZGVyIGluIGNvcnJlY3QgY29sb3VyXHJcblx0XHRcdGNvbnRleHQuZm9udCA9IHNjYWxlTGFiZWxGb250LmZvbnQ7XHJcblx0XHRcdGNvbnRleHQuZmlsbFRleHQoc2NhbGVMYWJlbC5sYWJlbFN0cmluZywgMCwgMCk7XHJcblx0XHRcdGNvbnRleHQucmVzdG9yZSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChncmlkTGluZXMuZHJhd0JvcmRlcikge1xyXG5cdFx0XHQvLyBEcmF3IHRoZSBsaW5lIGF0IHRoZSBlZGdlIG9mIHRoZSBheGlzXHJcblx0XHRcdGNvbnRleHQubGluZVdpZHRoID0gaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZ3JpZExpbmVzLmxpbmVXaWR0aCwgMCk7XHJcblx0XHRcdGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBoZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdChncmlkTGluZXMuY29sb3IsIDApO1xyXG5cdFx0XHR2YXIgeDEgPSBtZS5sZWZ0O1xyXG5cdFx0XHR2YXIgeDIgPSBtZS5yaWdodCArIGF4aXNXaWR0aDtcclxuXHRcdFx0dmFyIHkxID0gbWUudG9wO1xyXG5cdFx0XHR2YXIgeTIgPSBtZS5ib3R0b20gKyBheGlzV2lkdGg7XHJcblxyXG5cdFx0XHR2YXIgYWxpYXNQaXhlbCA9IGhlbHBlcnMuYWxpYXNQaXhlbChjb250ZXh0LmxpbmVXaWR0aCk7XHJcblx0XHRcdGlmIChpc0hvcml6b250YWwpIHtcclxuXHRcdFx0XHR5MSA9IHkyID0gb3B0aW9ucy5wb3NpdGlvbiA9PT0gJ3RvcCcgPyBtZS5ib3R0b20gOiBtZS50b3A7XHJcblx0XHRcdFx0eTEgKz0gYWxpYXNQaXhlbDtcclxuXHRcdFx0XHR5MiArPSBhbGlhc1BpeGVsO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHgxID0geDIgPSBvcHRpb25zLnBvc2l0aW9uID09PSAnbGVmdCcgPyBtZS5yaWdodCA6IG1lLmxlZnQ7XHJcblx0XHRcdFx0eDEgKz0gYWxpYXNQaXhlbDtcclxuXHRcdFx0XHR4MiArPSBhbGlhc1BpeGVsO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb250ZXh0LmJlZ2luUGF0aCgpO1xyXG5cdFx0XHRjb250ZXh0Lm1vdmVUbyh4MSwgeTEpO1xyXG5cdFx0XHRjb250ZXh0LmxpbmVUbyh4MiwgeTIpO1xyXG5cdFx0XHRjb250ZXh0LnN0cm9rZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxufSk7XHJcblxyXG59LHtcIjI2XCI6MjYsXCIyN1wiOjI3LFwiMzVcIjozNSxcIjQ2XCI6NDZ9XSwzNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xyXG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xyXG52YXIgbGF5b3V0cyA9IHJlcXVpcmUoMzEpO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblx0Ly8gU2NhbGUgcmVnaXN0cmF0aW9uIG9iamVjdC4gRXh0ZW5zaW9ucyBjYW4gcmVnaXN0ZXIgbmV3IHNjYWxlIHR5cGVzIChzdWNoIGFzIGxvZyBvciBEQiBzY2FsZXMpIGFuZCB0aGVuXHJcblx0Ly8gdXNlIHRoZSBuZXcgY2hhcnQgb3B0aW9ucyB0byBncmFiIHRoZSBjb3JyZWN0IHNjYWxlXHJcblx0Y29uc3RydWN0b3JzOiB7fSxcclxuXHQvLyBVc2UgYSByZWdpc3RyYXRpb24gZnVuY3Rpb24gc28gdGhhdCB3ZSBjYW4gbW92ZSB0byBhbiBFUzYgbWFwIHdoZW4gd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gc3VwcG9ydFxyXG5cdC8vIG9sZCBicm93c2Vyc1xyXG5cclxuXHQvLyBTY2FsZSBjb25maWcgZGVmYXVsdHNcclxuXHRkZWZhdWx0czoge30sXHJcblx0cmVnaXN0ZXJTY2FsZVR5cGU6IGZ1bmN0aW9uKHR5cGUsIHNjYWxlQ29uc3RydWN0b3IsIHNjYWxlRGVmYXVsdHMpIHtcclxuXHRcdHRoaXMuY29uc3RydWN0b3JzW3R5cGVdID0gc2NhbGVDb25zdHJ1Y3RvcjtcclxuXHRcdHRoaXMuZGVmYXVsdHNbdHlwZV0gPSBoZWxwZXJzLmNsb25lKHNjYWxlRGVmYXVsdHMpO1xyXG5cdH0sXHJcblx0Z2V0U2NhbGVDb25zdHJ1Y3RvcjogZnVuY3Rpb24odHlwZSkge1xyXG5cdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0b3JzLmhhc093blByb3BlcnR5KHR5cGUpID8gdGhpcy5jb25zdHJ1Y3RvcnNbdHlwZV0gOiB1bmRlZmluZWQ7XHJcblx0fSxcclxuXHRnZXRTY2FsZURlZmF1bHRzOiBmdW5jdGlvbih0eXBlKSB7XHJcblx0XHQvLyBSZXR1cm4gdGhlIHNjYWxlIGRlZmF1bHRzIG1lcmdlZCB3aXRoIHRoZSBnbG9iYWwgc2V0dGluZ3Mgc28gdGhhdCB3ZSBhbHdheXMgdXNlIHRoZSBsYXRlc3Qgb25lc1xyXG5cdFx0cmV0dXJuIHRoaXMuZGVmYXVsdHMuaGFzT3duUHJvcGVydHkodHlwZSkgPyBoZWxwZXJzLm1lcmdlKHt9LCBbZGVmYXVsdHMuc2NhbGUsIHRoaXMuZGVmYXVsdHNbdHlwZV1dKSA6IHt9O1xyXG5cdH0sXHJcblx0dXBkYXRlU2NhbGVEZWZhdWx0czogZnVuY3Rpb24odHlwZSwgYWRkaXRpb25zKSB7XHJcblx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0aWYgKG1lLmRlZmF1bHRzLmhhc093blByb3BlcnR5KHR5cGUpKSB7XHJcblx0XHRcdG1lLmRlZmF1bHRzW3R5cGVdID0gaGVscGVycy5leHRlbmQobWUuZGVmYXVsdHNbdHlwZV0sIGFkZGl0aW9ucyk7XHJcblx0XHR9XHJcblx0fSxcclxuXHRhZGRTY2FsZXNUb0xheW91dDogZnVuY3Rpb24oY2hhcnQpIHtcclxuXHRcdC8vIEFkZHMgZWFjaCBzY2FsZSB0byB0aGUgY2hhcnQuYm94ZXMgYXJyYXkgdG8gYmUgc2l6ZWQgYWNjb3JkaW5nbHlcclxuXHRcdGhlbHBlcnMuZWFjaChjaGFydC5zY2FsZXMsIGZ1bmN0aW9uKHNjYWxlKSB7XHJcblx0XHRcdC8vIFNldCBJTGF5b3V0SXRlbSBwYXJhbWV0ZXJzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxyXG5cdFx0XHRzY2FsZS5mdWxsV2lkdGggPSBzY2FsZS5vcHRpb25zLmZ1bGxXaWR0aDtcclxuXHRcdFx0c2NhbGUucG9zaXRpb24gPSBzY2FsZS5vcHRpb25zLnBvc2l0aW9uO1xyXG5cdFx0XHRzY2FsZS53ZWlnaHQgPSBzY2FsZS5vcHRpb25zLndlaWdodDtcclxuXHRcdFx0bGF5b3V0cy5hZGRCb3goY2hhcnQsIHNjYWxlKTtcclxuXHRcdH0pO1xyXG5cdH1cclxufTtcclxuXHJcbn0se1wiMjZcIjoyNixcIjMxXCI6MzEsXCI0NlwiOjQ2fV0sMzU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xyXG5cclxuLyoqXHJcbiAqIE5hbWVzcGFjZSB0byBob2xkIHN0YXRpYyB0aWNrIGdlbmVyYXRpb24gZnVuY3Rpb25zXHJcbiAqIEBuYW1lc3BhY2UgQ2hhcnQuVGlja3NcclxuICovXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cdC8qKlxyXG5cdCAqIE5hbWVzcGFjZSB0byBob2xkIGZvcm1hdHRlcnMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiB0aWNrc1xyXG5cdCAqIEBuYW1lc3BhY2UgQ2hhcnQuVGlja3MuZm9ybWF0dGVyc1xyXG5cdCAqL1xyXG5cdGZvcm1hdHRlcnM6IHtcclxuXHRcdC8qKlxyXG5cdFx0ICogRm9ybWF0dGVyIGZvciB2YWx1ZSBsYWJlbHNcclxuXHRcdCAqIEBtZXRob2QgQ2hhcnQuVGlja3MuZm9ybWF0dGVycy52YWx1ZXNcclxuXHRcdCAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gZGlzcGxheVxyXG5cdFx0ICogQHJldHVybiB7U3RyaW5nfEFycmF5fSB0aGUgbGFiZWwgdG8gZGlzcGxheVxyXG5cdFx0ICovXHJcblx0XHR2YWx1ZXM6IGZ1bmN0aW9uKHZhbHVlKSB7XHJcblx0XHRcdHJldHVybiBoZWxwZXJzLmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiAnJyArIHZhbHVlO1xyXG5cdFx0fSxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEZvcm1hdHRlciBmb3IgbGluZWFyIG51bWVyaWMgdGlja3NcclxuXHRcdCAqIEBtZXRob2QgQ2hhcnQuVGlja3MuZm9ybWF0dGVycy5saW5lYXJcclxuXHRcdCAqIEBwYXJhbSB0aWNrVmFsdWUge051bWJlcn0gdGhlIHZhbHVlIHRvIGJlIGZvcm1hdHRlZFxyXG5cdFx0ICogQHBhcmFtIGluZGV4IHtOdW1iZXJ9IHRoZSBwb3NpdGlvbiBvZiB0aGUgdGlja1ZhbHVlIHBhcmFtZXRlciBpbiB0aGUgdGlja3MgYXJyYXlcclxuXHRcdCAqIEBwYXJhbSB0aWNrcyB7QXJyYXk8TnVtYmVyPn0gdGhlIGxpc3Qgb2YgdGlja3MgYmVpbmcgY29udmVydGVkXHJcblx0XHQgKiBAcmV0dXJuIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGlja1ZhbHVlIHBhcmFtZXRlclxyXG5cdFx0ICovXHJcblx0XHRsaW5lYXI6IGZ1bmN0aW9uKHRpY2tWYWx1ZSwgaW5kZXgsIHRpY2tzKSB7XHJcblx0XHRcdC8vIElmIHdlIGhhdmUgbG90cyBvZiB0aWNrcywgZG9uJ3QgdXNlIHRoZSBvbmVzXHJcblx0XHRcdHZhciBkZWx0YSA9IHRpY2tzLmxlbmd0aCA+IDMgPyB0aWNrc1syXSAtIHRpY2tzWzFdIDogdGlja3NbMV0gLSB0aWNrc1swXTtcclxuXHJcblx0XHRcdC8vIElmIHdlIGhhdmUgYSBudW1iZXIgbGlrZSAyLjUgYXMgdGhlIGRlbHRhLCBmaWd1cmUgb3V0IGhvdyBtYW55IGRlY2ltYWwgcGxhY2VzIHdlIG5lZWRcclxuXHRcdFx0aWYgKE1hdGguYWJzKGRlbHRhKSA+IDEpIHtcclxuXHRcdFx0XHRpZiAodGlja1ZhbHVlICE9PSBNYXRoLmZsb29yKHRpY2tWYWx1ZSkpIHtcclxuXHRcdFx0XHRcdC8vIG5vdCBhbiBpbnRlZ2VyXHJcblx0XHRcdFx0XHRkZWx0YSA9IHRpY2tWYWx1ZSAtIE1hdGguZmxvb3IodGlja1ZhbHVlKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHZhciBsb2dEZWx0YSA9IGhlbHBlcnMubG9nMTAoTWF0aC5hYnMoZGVsdGEpKTtcclxuXHRcdFx0dmFyIHRpY2tTdHJpbmcgPSAnJztcclxuXHJcblx0XHRcdGlmICh0aWNrVmFsdWUgIT09IDApIHtcclxuXHRcdFx0XHR2YXIgbWF4VGljayA9IE1hdGgubWF4KE1hdGguYWJzKHRpY2tzWzBdKSwgTWF0aC5hYnModGlja3NbdGlja3MubGVuZ3RoIC0gMV0pKTtcclxuXHRcdFx0XHRpZiAobWF4VGljayA8IDFlLTQpIHsgLy8gYWxsIHRpY2tzIGFyZSBzbWFsbCBudW1iZXJzOyB1c2Ugc2NpZW50aWZpYyBub3RhdGlvblxyXG5cdFx0XHRcdFx0dmFyIGxvZ1RpY2sgPSBoZWxwZXJzLmxvZzEwKE1hdGguYWJzKHRpY2tWYWx1ZSkpO1xyXG5cdFx0XHRcdFx0dGlja1N0cmluZyA9IHRpY2tWYWx1ZS50b0V4cG9uZW50aWFsKE1hdGguZmxvb3IobG9nVGljaykgLSBNYXRoLmZsb29yKGxvZ0RlbHRhKSk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHZhciBudW1EZWNpbWFsID0gLTEgKiBNYXRoLmZsb29yKGxvZ0RlbHRhKTtcclxuXHRcdFx0XHRcdG51bURlY2ltYWwgPSBNYXRoLm1heChNYXRoLm1pbihudW1EZWNpbWFsLCAyMCksIDApOyAvLyB0b0ZpeGVkIGhhcyBhIG1heCBvZiAyMCBkZWNpbWFsIHBsYWNlc1xyXG5cdFx0XHRcdFx0dGlja1N0cmluZyA9IHRpY2tWYWx1ZS50b0ZpeGVkKG51bURlY2ltYWwpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aWNrU3RyaW5nID0gJzAnOyAvLyBuZXZlciBzaG93IGRlY2ltYWwgcGxhY2VzIGZvciAwXHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB0aWNrU3RyaW5nO1xyXG5cdFx0fSxcclxuXHJcblx0XHRsb2dhcml0aG1pYzogZnVuY3Rpb24odGlja1ZhbHVlLCBpbmRleCwgdGlja3MpIHtcclxuXHRcdFx0dmFyIHJlbWFpbiA9IHRpY2tWYWx1ZSAvIChNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihoZWxwZXJzLmxvZzEwKHRpY2tWYWx1ZSkpKSk7XHJcblxyXG5cdFx0XHRpZiAodGlja1ZhbHVlID09PSAwKSB7XHJcblx0XHRcdFx0cmV0dXJuICcwJztcclxuXHRcdFx0fSBlbHNlIGlmIChyZW1haW4gPT09IDEgfHwgcmVtYWluID09PSAyIHx8IHJlbWFpbiA9PT0gNSB8fCBpbmRleCA9PT0gMCB8fCBpbmRleCA9PT0gdGlja3MubGVuZ3RoIC0gMSkge1xyXG5cdFx0XHRcdHJldHVybiB0aWNrVmFsdWUudG9FeHBvbmVudGlhbCgpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiAnJztcclxuXHRcdH1cclxuXHR9XHJcbn07XHJcblxyXG59LHtcIjQ2XCI6NDZ9XSwzNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xyXG52YXIgRWxlbWVudCA9IHJlcXVpcmUoMjcpO1xyXG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xyXG5cclxuZGVmYXVsdHMuX3NldCgnZ2xvYmFsJywge1xyXG5cdHRvb2x0aXBzOiB7XHJcblx0XHRlbmFibGVkOiB0cnVlLFxyXG5cdFx0Y3VzdG9tOiBudWxsLFxyXG5cdFx0bW9kZTogJ25lYXJlc3QnLFxyXG5cdFx0cG9zaXRpb246ICdhdmVyYWdlJyxcclxuXHRcdGludGVyc2VjdDogdHJ1ZSxcclxuXHRcdGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMCwwLDAsMC44KScsXHJcblx0XHR0aXRsZUZvbnRTdHlsZTogJ2JvbGQnLFxyXG5cdFx0dGl0bGVTcGFjaW5nOiAyLFxyXG5cdFx0dGl0bGVNYXJnaW5Cb3R0b206IDYsXHJcblx0XHR0aXRsZUZvbnRDb2xvcjogJyNmZmYnLFxyXG5cdFx0dGl0bGVBbGlnbjogJ2xlZnQnLFxyXG5cdFx0Ym9keVNwYWNpbmc6IDIsXHJcblx0XHRib2R5Rm9udENvbG9yOiAnI2ZmZicsXHJcblx0XHRib2R5QWxpZ246ICdsZWZ0JyxcclxuXHRcdGZvb3RlckZvbnRTdHlsZTogJ2JvbGQnLFxyXG5cdFx0Zm9vdGVyU3BhY2luZzogMixcclxuXHRcdGZvb3Rlck1hcmdpblRvcDogNixcclxuXHRcdGZvb3RlckZvbnRDb2xvcjogJyNmZmYnLFxyXG5cdFx0Zm9vdGVyQWxpZ246ICdsZWZ0JyxcclxuXHRcdHlQYWRkaW5nOiA2LFxyXG5cdFx0eFBhZGRpbmc6IDYsXHJcblx0XHRjYXJldFBhZGRpbmc6IDIsXHJcblx0XHRjYXJldFNpemU6IDUsXHJcblx0XHRjb3JuZXJSYWRpdXM6IDYsXHJcblx0XHRtdWx0aUtleUJhY2tncm91bmQ6ICcjZmZmJyxcclxuXHRcdGRpc3BsYXlDb2xvcnM6IHRydWUsXHJcblx0XHRib3JkZXJDb2xvcjogJ3JnYmEoMCwwLDAsMCknLFxyXG5cdFx0Ym9yZGVyV2lkdGg6IDAsXHJcblx0XHRjYWxsYmFja3M6IHtcclxuXHRcdFx0Ly8gQXJncyBhcmU6ICh0b29sdGlwSXRlbXMsIGRhdGEpXHJcblx0XHRcdGJlZm9yZVRpdGxlOiBoZWxwZXJzLm5vb3AsXHJcblx0XHRcdHRpdGxlOiBmdW5jdGlvbih0b29sdGlwSXRlbXMsIGRhdGEpIHtcclxuXHRcdFx0XHQvLyBQaWNrIGZpcnN0IHhMYWJlbCBmb3Igbm93XHJcblx0XHRcdFx0dmFyIHRpdGxlID0gJyc7XHJcblx0XHRcdFx0dmFyIGxhYmVscyA9IGRhdGEubGFiZWxzO1xyXG5cdFx0XHRcdHZhciBsYWJlbENvdW50ID0gbGFiZWxzID8gbGFiZWxzLmxlbmd0aCA6IDA7XHJcblxyXG5cdFx0XHRcdGlmICh0b29sdGlwSXRlbXMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdFx0dmFyIGl0ZW0gPSB0b29sdGlwSXRlbXNbMF07XHJcblxyXG5cdFx0XHRcdFx0aWYgKGl0ZW0ueExhYmVsKSB7XHJcblx0XHRcdFx0XHRcdHRpdGxlID0gaXRlbS54TGFiZWw7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGxhYmVsQ291bnQgPiAwICYmIGl0ZW0uaW5kZXggPCBsYWJlbENvdW50KSB7XHJcblx0XHRcdFx0XHRcdHRpdGxlID0gbGFiZWxzW2l0ZW0uaW5kZXhdO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIHRpdGxlO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRhZnRlclRpdGxlOiBoZWxwZXJzLm5vb3AsXHJcblxyXG5cdFx0XHQvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtcywgZGF0YSlcclxuXHRcdFx0YmVmb3JlQm9keTogaGVscGVycy5ub29wLFxyXG5cclxuXHRcdFx0Ly8gQXJncyBhcmU6ICh0b29sdGlwSXRlbSwgZGF0YSlcclxuXHRcdFx0YmVmb3JlTGFiZWw6IGhlbHBlcnMubm9vcCxcclxuXHRcdFx0bGFiZWw6IGZ1bmN0aW9uKHRvb2x0aXBJdGVtLCBkYXRhKSB7XHJcblx0XHRcdFx0dmFyIGxhYmVsID0gZGF0YS5kYXRhc2V0c1t0b29sdGlwSXRlbS5kYXRhc2V0SW5kZXhdLmxhYmVsIHx8ICcnO1xyXG5cclxuXHRcdFx0XHRpZiAobGFiZWwpIHtcclxuXHRcdFx0XHRcdGxhYmVsICs9ICc6ICc7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGxhYmVsICs9IHRvb2x0aXBJdGVtLnlMYWJlbDtcclxuXHRcdFx0XHRyZXR1cm4gbGFiZWw7XHJcblx0XHRcdH0sXHJcblx0XHRcdGxhYmVsQ29sb3I6IGZ1bmN0aW9uKHRvb2x0aXBJdGVtLCBjaGFydCkge1xyXG5cdFx0XHRcdHZhciBtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEodG9vbHRpcEl0ZW0uZGF0YXNldEluZGV4KTtcclxuXHRcdFx0XHR2YXIgYWN0aXZlRWxlbWVudCA9IG1ldGEuZGF0YVt0b29sdGlwSXRlbS5pbmRleF07XHJcblx0XHRcdFx0dmFyIHZpZXcgPSBhY3RpdmVFbGVtZW50Ll92aWV3O1xyXG5cdFx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0XHRib3JkZXJDb2xvcjogdmlldy5ib3JkZXJDb2xvcixcclxuXHRcdFx0XHRcdGJhY2tncm91bmRDb2xvcjogdmlldy5iYWNrZ3JvdW5kQ29sb3JcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRsYWJlbFRleHRDb2xvcjogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0cmV0dXJuIHRoaXMuX29wdGlvbnMuYm9keUZvbnRDb2xvcjtcclxuXHRcdFx0fSxcclxuXHRcdFx0YWZ0ZXJMYWJlbDogaGVscGVycy5ub29wLFxyXG5cclxuXHRcdFx0Ly8gQXJncyBhcmU6ICh0b29sdGlwSXRlbXMsIGRhdGEpXHJcblx0XHRcdGFmdGVyQm9keTogaGVscGVycy5ub29wLFxyXG5cclxuXHRcdFx0Ly8gQXJncyBhcmU6ICh0b29sdGlwSXRlbXMsIGRhdGEpXHJcblx0XHRcdGJlZm9yZUZvb3RlcjogaGVscGVycy5ub29wLFxyXG5cdFx0XHRmb290ZXI6IGhlbHBlcnMubm9vcCxcclxuXHRcdFx0YWZ0ZXJGb290ZXI6IGhlbHBlcnMubm9vcFxyXG5cdFx0fVxyXG5cdH1cclxufSk7XHJcblxyXG52YXIgcG9zaXRpb25lcnMgPSB7XHJcblx0LyoqXHJcblx0ICogQXZlcmFnZSBtb2RlIHBsYWNlcyB0aGUgdG9vbHRpcCBhdCB0aGUgYXZlcmFnZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudHMgc2hvd25cclxuXHQgKiBAZnVuY3Rpb24gQ2hhcnQuVG9vbHRpcC5wb3NpdGlvbmVycy5hdmVyYWdlXHJcblx0ICogQHBhcmFtIGVsZW1lbnRzIHtDaGFydEVsZW1lbnRbXX0gdGhlIGVsZW1lbnRzIGJlaW5nIGRpc3BsYXllZCBpbiB0aGUgdG9vbHRpcFxyXG5cdCAqIEByZXR1cm5zIHtQb2ludH0gdG9vbHRpcCBwb3NpdGlvblxyXG5cdCAqL1xyXG5cdGF2ZXJhZ2U6IGZ1bmN0aW9uKGVsZW1lbnRzKSB7XHJcblx0XHRpZiAoIWVsZW1lbnRzLmxlbmd0aCkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGksIGxlbjtcclxuXHRcdHZhciB4ID0gMDtcclxuXHRcdHZhciB5ID0gMDtcclxuXHRcdHZhciBjb3VudCA9IDA7XHJcblxyXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcclxuXHRcdFx0dmFyIGVsID0gZWxlbWVudHNbaV07XHJcblx0XHRcdGlmIChlbCAmJiBlbC5oYXNWYWx1ZSgpKSB7XHJcblx0XHRcdFx0dmFyIHBvcyA9IGVsLnRvb2x0aXBQb3NpdGlvbigpO1xyXG5cdFx0XHRcdHggKz0gcG9zLng7XHJcblx0XHRcdFx0eSArPSBwb3MueTtcclxuXHRcdFx0XHQrK2NvdW50O1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0eDogTWF0aC5yb3VuZCh4IC8gY291bnQpLFxyXG5cdFx0XHR5OiBNYXRoLnJvdW5kKHkgLyBjb3VudClcclxuXHRcdH07XHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyB0aGUgdG9vbHRpcCBwb3NpdGlvbiBuZWFyZXN0IG9mIHRoZSBpdGVtIG5lYXJlc3QgdG8gdGhlIGV2ZW50IHBvc2l0aW9uXHJcblx0ICogQGZ1bmN0aW9uIENoYXJ0LlRvb2x0aXAucG9zaXRpb25lcnMubmVhcmVzdFxyXG5cdCAqIEBwYXJhbSBlbGVtZW50cyB7Q2hhcnQuRWxlbWVudFtdfSB0aGUgdG9vbHRpcCBlbGVtZW50c1xyXG5cdCAqIEBwYXJhbSBldmVudFBvc2l0aW9uIHtQb2ludH0gdGhlIHBvc2l0aW9uIG9mIHRoZSBldmVudCBpbiBjYW52YXMgY29vcmRpbmF0ZXNcclxuXHQgKiBAcmV0dXJucyB7UG9pbnR9IHRoZSB0b29sdGlwIHBvc2l0aW9uXHJcblx0ICovXHJcblx0bmVhcmVzdDogZnVuY3Rpb24oZWxlbWVudHMsIGV2ZW50UG9zaXRpb24pIHtcclxuXHRcdHZhciB4ID0gZXZlbnRQb3NpdGlvbi54O1xyXG5cdFx0dmFyIHkgPSBldmVudFBvc2l0aW9uLnk7XHJcblx0XHR2YXIgbWluRGlzdGFuY2UgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XHJcblx0XHR2YXIgaSwgbGVuLCBuZWFyZXN0RWxlbWVudDtcclxuXHJcblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xyXG5cdFx0XHR2YXIgZWwgPSBlbGVtZW50c1tpXTtcclxuXHRcdFx0aWYgKGVsICYmIGVsLmhhc1ZhbHVlKCkpIHtcclxuXHRcdFx0XHR2YXIgY2VudGVyID0gZWwuZ2V0Q2VudGVyUG9pbnQoKTtcclxuXHRcdFx0XHR2YXIgZCA9IGhlbHBlcnMuZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKGV2ZW50UG9zaXRpb24sIGNlbnRlcik7XHJcblxyXG5cdFx0XHRcdGlmIChkIDwgbWluRGlzdGFuY2UpIHtcclxuXHRcdFx0XHRcdG1pbkRpc3RhbmNlID0gZDtcclxuXHRcdFx0XHRcdG5lYXJlc3RFbGVtZW50ID0gZWw7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKG5lYXJlc3RFbGVtZW50KSB7XHJcblx0XHRcdHZhciB0cCA9IG5lYXJlc3RFbGVtZW50LnRvb2x0aXBQb3NpdGlvbigpO1xyXG5cdFx0XHR4ID0gdHAueDtcclxuXHRcdFx0eSA9IHRwLnk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0eDogeCxcclxuXHRcdFx0eTogeVxyXG5cdFx0fTtcclxuXHR9XHJcbn07XHJcblxyXG4vKipcclxuICogSGVscGVyIG1ldGhvZCB0byBtZXJnZSB0aGUgb3BhY2l0eSBpbnRvIGEgY29sb3JcclxuICovXHJcbmZ1bmN0aW9uIG1lcmdlT3BhY2l0eShjb2xvclN0cmluZywgb3BhY2l0eSkge1xyXG5cdHZhciBjb2xvciA9IGhlbHBlcnMuY29sb3IoY29sb3JTdHJpbmcpO1xyXG5cdHJldHVybiBjb2xvci5hbHBoYShvcGFjaXR5ICogY29sb3IuYWxwaGEoKSkucmdiYVN0cmluZygpO1xyXG59XHJcblxyXG4vLyBIZWxwZXIgdG8gcHVzaCBvciBjb25jYXQgYmFzZWQgb24gaWYgdGhlIDJuZCBwYXJhbWV0ZXIgaXMgYW4gYXJyYXkgb3Igbm90XHJcbmZ1bmN0aW9uIHB1c2hPckNvbmNhdChiYXNlLCB0b1B1c2gpIHtcclxuXHRpZiAodG9QdXNoKSB7XHJcblx0XHRpZiAoaGVscGVycy5pc0FycmF5KHRvUHVzaCkpIHtcclxuXHRcdFx0Ly8gYmFzZSA9IGJhc2UuY29uY2F0KHRvUHVzaCk7XHJcblx0XHRcdEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGJhc2UsIHRvUHVzaCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRiYXNlLnB1c2godG9QdXNoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHJldHVybiBiYXNlO1xyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhcnJheSBvZiBzdHJpbmdzIHNwbGl0IGJ5IG5ld2xpbmVcclxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNwbGl0IGJ5IG5ld2xpbmUuXHJcbiAqIEByZXR1cm5zIHtBcnJheX0gdmFsdWUgaWYgbmV3bGluZSBwcmVzZW50IC0gUmV0dXJuZWQgZnJvbSBTdHJpbmcgc3BsaXQoKSBtZXRob2RcclxuICogQGZ1bmN0aW9uXHJcbiAqL1xyXG5mdW5jdGlvbiBzcGxpdE5ld2xpbmVzKHN0cikge1xyXG5cdGlmICgodHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgfHwgc3RyIGluc3RhbmNlb2YgU3RyaW5nKSAmJiBzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xyXG5cdFx0cmV0dXJuIHN0ci5zcGxpdCgnXFxuJyk7XHJcblx0fVxyXG5cdHJldHVybiBzdHI7XHJcbn1cclxuXHJcblxyXG4vLyBQcml2YXRlIGhlbHBlciB0byBjcmVhdGUgYSB0b29sdGlwIGl0ZW0gbW9kZWxcclxuLy8gQHBhcmFtIGVsZW1lbnQgOiB0aGUgY2hhcnQgZWxlbWVudCAocG9pbnQsIGFyYywgYmFyKSB0byBjcmVhdGUgdGhlIHRvb2x0aXAgaXRlbSBmb3JcclxuLy8gQHJldHVybiA6IG5ldyB0b29sdGlwIGl0ZW1cclxuZnVuY3Rpb24gY3JlYXRlVG9vbHRpcEl0ZW0oZWxlbWVudCkge1xyXG5cdHZhciB4U2NhbGUgPSBlbGVtZW50Ll94U2NhbGU7XHJcblx0dmFyIHlTY2FsZSA9IGVsZW1lbnQuX3lTY2FsZSB8fCBlbGVtZW50Ll9zY2FsZTsgLy8gaGFuZGxlIHJhZGFyIHx8IHBvbGFyQXJlYSBjaGFydHNcclxuXHR2YXIgaW5kZXggPSBlbGVtZW50Ll9pbmRleDtcclxuXHR2YXIgZGF0YXNldEluZGV4ID0gZWxlbWVudC5fZGF0YXNldEluZGV4O1xyXG5cclxuXHRyZXR1cm4ge1xyXG5cdFx0eExhYmVsOiB4U2NhbGUgPyB4U2NhbGUuZ2V0TGFiZWxGb3JJbmRleChpbmRleCwgZGF0YXNldEluZGV4KSA6ICcnLFxyXG5cdFx0eUxhYmVsOiB5U2NhbGUgPyB5U2NhbGUuZ2V0TGFiZWxGb3JJbmRleChpbmRleCwgZGF0YXNldEluZGV4KSA6ICcnLFxyXG5cdFx0aW5kZXg6IGluZGV4LFxyXG5cdFx0ZGF0YXNldEluZGV4OiBkYXRhc2V0SW5kZXgsXHJcblx0XHR4OiBlbGVtZW50Ll9tb2RlbC54LFxyXG5cdFx0eTogZWxlbWVudC5fbW9kZWwueVxyXG5cdH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBIZWxwZXIgdG8gZ2V0IHRoZSByZXNldCBtb2RlbCBmb3IgdGhlIHRvb2x0aXBcclxuICogQHBhcmFtIHRvb2x0aXBPcHRzIHtPYmplY3R9IHRoZSB0b29sdGlwIG9wdGlvbnNcclxuICovXHJcbmZ1bmN0aW9uIGdldEJhc2VNb2RlbCh0b29sdGlwT3B0cykge1xyXG5cdHZhciBnbG9iYWxEZWZhdWx0cyA9IGRlZmF1bHRzLmdsb2JhbDtcclxuXHR2YXIgdmFsdWVPckRlZmF1bHQgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0O1xyXG5cclxuXHRyZXR1cm4ge1xyXG5cdFx0Ly8gUG9zaXRpb25pbmdcclxuXHRcdHhQYWRkaW5nOiB0b29sdGlwT3B0cy54UGFkZGluZyxcclxuXHRcdHlQYWRkaW5nOiB0b29sdGlwT3B0cy55UGFkZGluZyxcclxuXHRcdHhBbGlnbjogdG9vbHRpcE9wdHMueEFsaWduLFxyXG5cdFx0eUFsaWduOiB0b29sdGlwT3B0cy55QWxpZ24sXHJcblxyXG5cdFx0Ly8gQm9keVxyXG5cdFx0Ym9keUZvbnRDb2xvcjogdG9vbHRpcE9wdHMuYm9keUZvbnRDb2xvcixcclxuXHRcdF9ib2R5Rm9udEZhbWlseTogdmFsdWVPckRlZmF1bHQodG9vbHRpcE9wdHMuYm9keUZvbnRGYW1pbHksIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250RmFtaWx5KSxcclxuXHRcdF9ib2R5Rm9udFN0eWxlOiB2YWx1ZU9yRGVmYXVsdCh0b29sdGlwT3B0cy5ib2R5Rm9udFN0eWxlLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFN0eWxlKSxcclxuXHRcdF9ib2R5QWxpZ246IHRvb2x0aXBPcHRzLmJvZHlBbGlnbixcclxuXHRcdGJvZHlGb250U2l6ZTogdmFsdWVPckRlZmF1bHQodG9vbHRpcE9wdHMuYm9keUZvbnRTaXplLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFNpemUpLFxyXG5cdFx0Ym9keVNwYWNpbmc6IHRvb2x0aXBPcHRzLmJvZHlTcGFjaW5nLFxyXG5cclxuXHRcdC8vIFRpdGxlXHJcblx0XHR0aXRsZUZvbnRDb2xvcjogdG9vbHRpcE9wdHMudGl0bGVGb250Q29sb3IsXHJcblx0XHRfdGl0bGVGb250RmFtaWx5OiB2YWx1ZU9yRGVmYXVsdCh0b29sdGlwT3B0cy50aXRsZUZvbnRGYW1pbHksIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250RmFtaWx5KSxcclxuXHRcdF90aXRsZUZvbnRTdHlsZTogdmFsdWVPckRlZmF1bHQodG9vbHRpcE9wdHMudGl0bGVGb250U3R5bGUsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250U3R5bGUpLFxyXG5cdFx0dGl0bGVGb250U2l6ZTogdmFsdWVPckRlZmF1bHQodG9vbHRpcE9wdHMudGl0bGVGb250U2l6ZSwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRTaXplKSxcclxuXHRcdF90aXRsZUFsaWduOiB0b29sdGlwT3B0cy50aXRsZUFsaWduLFxyXG5cdFx0dGl0bGVTcGFjaW5nOiB0b29sdGlwT3B0cy50aXRsZVNwYWNpbmcsXHJcblx0XHR0aXRsZU1hcmdpbkJvdHRvbTogdG9vbHRpcE9wdHMudGl0bGVNYXJnaW5Cb3R0b20sXHJcblxyXG5cdFx0Ly8gRm9vdGVyXHJcblx0XHRmb290ZXJGb250Q29sb3I6IHRvb2x0aXBPcHRzLmZvb3RlckZvbnRDb2xvcixcclxuXHRcdF9mb290ZXJGb250RmFtaWx5OiB2YWx1ZU9yRGVmYXVsdCh0b29sdGlwT3B0cy5mb290ZXJGb250RmFtaWx5LCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udEZhbWlseSksXHJcblx0XHRfZm9vdGVyRm9udFN0eWxlOiB2YWx1ZU9yRGVmYXVsdCh0b29sdGlwT3B0cy5mb290ZXJGb250U3R5bGUsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250U3R5bGUpLFxyXG5cdFx0Zm9vdGVyRm9udFNpemU6IHZhbHVlT3JEZWZhdWx0KHRvb2x0aXBPcHRzLmZvb3RlckZvbnRTaXplLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFNpemUpLFxyXG5cdFx0X2Zvb3RlckFsaWduOiB0b29sdGlwT3B0cy5mb290ZXJBbGlnbixcclxuXHRcdGZvb3RlclNwYWNpbmc6IHRvb2x0aXBPcHRzLmZvb3RlclNwYWNpbmcsXHJcblx0XHRmb290ZXJNYXJnaW5Ub3A6IHRvb2x0aXBPcHRzLmZvb3Rlck1hcmdpblRvcCxcclxuXHJcblx0XHQvLyBBcHBlYXJhbmNlXHJcblx0XHRjYXJldFNpemU6IHRvb2x0aXBPcHRzLmNhcmV0U2l6ZSxcclxuXHRcdGNvcm5lclJhZGl1czogdG9vbHRpcE9wdHMuY29ybmVyUmFkaXVzLFxyXG5cdFx0YmFja2dyb3VuZENvbG9yOiB0b29sdGlwT3B0cy5iYWNrZ3JvdW5kQ29sb3IsXHJcblx0XHRvcGFjaXR5OiAwLFxyXG5cdFx0bGVnZW5kQ29sb3JCYWNrZ3JvdW5kOiB0b29sdGlwT3B0cy5tdWx0aUtleUJhY2tncm91bmQsXHJcblx0XHRkaXNwbGF5Q29sb3JzOiB0b29sdGlwT3B0cy5kaXNwbGF5Q29sb3JzLFxyXG5cdFx0Ym9yZGVyQ29sb3I6IHRvb2x0aXBPcHRzLmJvcmRlckNvbG9yLFxyXG5cdFx0Ym9yZGVyV2lkdGg6IHRvb2x0aXBPcHRzLmJvcmRlcldpZHRoXHJcblx0fTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgdG9vbHRpcFxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0VG9vbHRpcFNpemUodG9vbHRpcCwgbW9kZWwpIHtcclxuXHR2YXIgY3R4ID0gdG9vbHRpcC5fY2hhcnQuY3R4O1xyXG5cclxuXHR2YXIgaGVpZ2h0ID0gbW9kZWwueVBhZGRpbmcgKiAyOyAvLyBUb29sdGlwIFBhZGRpbmdcclxuXHR2YXIgd2lkdGggPSAwO1xyXG5cclxuXHQvLyBDb3VudCBvZiBhbGwgbGluZXMgaW4gdGhlIGJvZHlcclxuXHR2YXIgYm9keSA9IG1vZGVsLmJvZHk7XHJcblx0dmFyIGNvbWJpbmVkQm9keUxlbmd0aCA9IGJvZHkucmVkdWNlKGZ1bmN0aW9uKGNvdW50LCBib2R5SXRlbSkge1xyXG5cdFx0cmV0dXJuIGNvdW50ICsgYm9keUl0ZW0uYmVmb3JlLmxlbmd0aCArIGJvZHlJdGVtLmxpbmVzLmxlbmd0aCArIGJvZHlJdGVtLmFmdGVyLmxlbmd0aDtcclxuXHR9LCAwKTtcclxuXHRjb21iaW5lZEJvZHlMZW5ndGggKz0gbW9kZWwuYmVmb3JlQm9keS5sZW5ndGggKyBtb2RlbC5hZnRlckJvZHkubGVuZ3RoO1xyXG5cclxuXHR2YXIgdGl0bGVMaW5lQ291bnQgPSBtb2RlbC50aXRsZS5sZW5ndGg7XHJcblx0dmFyIGZvb3RlckxpbmVDb3VudCA9IG1vZGVsLmZvb3Rlci5sZW5ndGg7XHJcblx0dmFyIHRpdGxlRm9udFNpemUgPSBtb2RlbC50aXRsZUZvbnRTaXplO1xyXG5cdHZhciBib2R5Rm9udFNpemUgPSBtb2RlbC5ib2R5Rm9udFNpemU7XHJcblx0dmFyIGZvb3RlckZvbnRTaXplID0gbW9kZWwuZm9vdGVyRm9udFNpemU7XHJcblxyXG5cdGhlaWdodCArPSB0aXRsZUxpbmVDb3VudCAqIHRpdGxlRm9udFNpemU7IC8vIFRpdGxlIExpbmVzXHJcblx0aGVpZ2h0ICs9IHRpdGxlTGluZUNvdW50ID8gKHRpdGxlTGluZUNvdW50IC0gMSkgKiBtb2RlbC50aXRsZVNwYWNpbmcgOiAwOyAvLyBUaXRsZSBMaW5lIFNwYWNpbmdcclxuXHRoZWlnaHQgKz0gdGl0bGVMaW5lQ291bnQgPyBtb2RlbC50aXRsZU1hcmdpbkJvdHRvbSA6IDA7IC8vIFRpdGxlJ3MgYm90dG9tIE1hcmdpblxyXG5cdGhlaWdodCArPSBjb21iaW5lZEJvZHlMZW5ndGggKiBib2R5Rm9udFNpemU7IC8vIEJvZHkgTGluZXNcclxuXHRoZWlnaHQgKz0gY29tYmluZWRCb2R5TGVuZ3RoID8gKGNvbWJpbmVkQm9keUxlbmd0aCAtIDEpICogbW9kZWwuYm9keVNwYWNpbmcgOiAwOyAvLyBCb2R5IExpbmUgU3BhY2luZ1xyXG5cdGhlaWdodCArPSBmb290ZXJMaW5lQ291bnQgPyBtb2RlbC5mb290ZXJNYXJnaW5Ub3AgOiAwOyAvLyBGb290ZXIgTWFyZ2luXHJcblx0aGVpZ2h0ICs9IGZvb3RlckxpbmVDb3VudCAqIChmb290ZXJGb250U2l6ZSk7IC8vIEZvb3RlciBMaW5lc1xyXG5cdGhlaWdodCArPSBmb290ZXJMaW5lQ291bnQgPyAoZm9vdGVyTGluZUNvdW50IC0gMSkgKiBtb2RlbC5mb290ZXJTcGFjaW5nIDogMDsgLy8gRm9vdGVyIExpbmUgU3BhY2luZ1xyXG5cclxuXHQvLyBUaXRsZSB3aWR0aFxyXG5cdHZhciB3aWR0aFBhZGRpbmcgPSAwO1xyXG5cdHZhciBtYXhMaW5lV2lkdGggPSBmdW5jdGlvbihsaW5lKSB7XHJcblx0XHR3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjdHgubWVhc3VyZVRleHQobGluZSkud2lkdGggKyB3aWR0aFBhZGRpbmcpO1xyXG5cdH07XHJcblxyXG5cdGN0eC5mb250ID0gaGVscGVycy5mb250U3RyaW5nKHRpdGxlRm9udFNpemUsIG1vZGVsLl90aXRsZUZvbnRTdHlsZSwgbW9kZWwuX3RpdGxlRm9udEZhbWlseSk7XHJcblx0aGVscGVycy5lYWNoKG1vZGVsLnRpdGxlLCBtYXhMaW5lV2lkdGgpO1xyXG5cclxuXHQvLyBCb2R5IHdpZHRoXHJcblx0Y3R4LmZvbnQgPSBoZWxwZXJzLmZvbnRTdHJpbmcoYm9keUZvbnRTaXplLCBtb2RlbC5fYm9keUZvbnRTdHlsZSwgbW9kZWwuX2JvZHlGb250RmFtaWx5KTtcclxuXHRoZWxwZXJzLmVhY2gobW9kZWwuYmVmb3JlQm9keS5jb25jYXQobW9kZWwuYWZ0ZXJCb2R5KSwgbWF4TGluZVdpZHRoKTtcclxuXHJcblx0Ly8gQm9keSBsaW5lcyBtYXkgaW5jbHVkZSBzb21lIGV4dHJhIHdpZHRoIGR1ZSB0byB0aGUgY29sb3IgYm94XHJcblx0d2lkdGhQYWRkaW5nID0gbW9kZWwuZGlzcGxheUNvbG9ycyA/IChib2R5Rm9udFNpemUgKyAyKSA6IDA7XHJcblx0aGVscGVycy5lYWNoKGJvZHksIGZ1bmN0aW9uKGJvZHlJdGVtKSB7XHJcblx0XHRoZWxwZXJzLmVhY2goYm9keUl0ZW0uYmVmb3JlLCBtYXhMaW5lV2lkdGgpO1xyXG5cdFx0aGVscGVycy5lYWNoKGJvZHlJdGVtLmxpbmVzLCBtYXhMaW5lV2lkdGgpO1xyXG5cdFx0aGVscGVycy5lYWNoKGJvZHlJdGVtLmFmdGVyLCBtYXhMaW5lV2lkdGgpO1xyXG5cdH0pO1xyXG5cclxuXHQvLyBSZXNldCBiYWNrIHRvIDBcclxuXHR3aWR0aFBhZGRpbmcgPSAwO1xyXG5cclxuXHQvLyBGb290ZXIgd2lkdGhcclxuXHRjdHguZm9udCA9IGhlbHBlcnMuZm9udFN0cmluZyhmb290ZXJGb250U2l6ZSwgbW9kZWwuX2Zvb3RlckZvbnRTdHlsZSwgbW9kZWwuX2Zvb3RlckZvbnRGYW1pbHkpO1xyXG5cdGhlbHBlcnMuZWFjaChtb2RlbC5mb290ZXIsIG1heExpbmVXaWR0aCk7XHJcblxyXG5cdC8vIEFkZCBwYWRkaW5nXHJcblx0d2lkdGggKz0gMiAqIG1vZGVsLnhQYWRkaW5nO1xyXG5cclxuXHRyZXR1cm4ge1xyXG5cdFx0d2lkdGg6IHdpZHRoLFxyXG5cdFx0aGVpZ2h0OiBoZWlnaHRcclxuXHR9O1xyXG59XHJcblxyXG4vKipcclxuICogSGVscGVyIHRvIGdldCB0aGUgYWxpZ25tZW50IG9mIGEgdG9vbHRpcCBnaXZlbiB0aGUgc2l6ZVxyXG4gKi9cclxuZnVuY3Rpb24gZGV0ZXJtaW5lQWxpZ25tZW50KHRvb2x0aXAsIHNpemUpIHtcclxuXHR2YXIgbW9kZWwgPSB0b29sdGlwLl9tb2RlbDtcclxuXHR2YXIgY2hhcnQgPSB0b29sdGlwLl9jaGFydDtcclxuXHR2YXIgY2hhcnRBcmVhID0gdG9vbHRpcC5fY2hhcnQuY2hhcnRBcmVhO1xyXG5cdHZhciB4QWxpZ24gPSAnY2VudGVyJztcclxuXHR2YXIgeUFsaWduID0gJ2NlbnRlcic7XHJcblxyXG5cdGlmIChtb2RlbC55IDwgc2l6ZS5oZWlnaHQpIHtcclxuXHRcdHlBbGlnbiA9ICd0b3AnO1xyXG5cdH0gZWxzZSBpZiAobW9kZWwueSA+IChjaGFydC5oZWlnaHQgLSBzaXplLmhlaWdodCkpIHtcclxuXHRcdHlBbGlnbiA9ICdib3R0b20nO1xyXG5cdH1cclxuXHJcblx0dmFyIGxmLCByZjsgLy8gZnVuY3Rpb25zIHRvIGRldGVybWluZSBsZWZ0LCByaWdodCBhbGlnbm1lbnRcclxuXHR2YXIgb2xmLCBvcmY7IC8vIGZ1bmN0aW9ucyB0byBkZXRlcm1pbmUgaWYgbGVmdC9yaWdodCBhbGlnbm1lbnQgY2F1c2VzIHRvb2x0aXAgdG8gZ28gb3V0c2lkZSBjaGFydFxyXG5cdHZhciB5ZjsgLy8gZnVuY3Rpb24gdG8gZ2V0IHRoZSB5IGFsaWdubWVudCBpZiB0aGUgdG9vbHRpcCBnb2VzIG91dHNpZGUgb2YgdGhlIGxlZnQgb3IgcmlnaHQgZWRnZXNcclxuXHR2YXIgbWlkWCA9IChjaGFydEFyZWEubGVmdCArIGNoYXJ0QXJlYS5yaWdodCkgLyAyO1xyXG5cdHZhciBtaWRZID0gKGNoYXJ0QXJlYS50b3AgKyBjaGFydEFyZWEuYm90dG9tKSAvIDI7XHJcblxyXG5cdGlmICh5QWxpZ24gPT09ICdjZW50ZXInKSB7XHJcblx0XHRsZiA9IGZ1bmN0aW9uKHgpIHtcclxuXHRcdFx0cmV0dXJuIHggPD0gbWlkWDtcclxuXHRcdH07XHJcblx0XHRyZiA9IGZ1bmN0aW9uKHgpIHtcclxuXHRcdFx0cmV0dXJuIHggPiBtaWRYO1xyXG5cdFx0fTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0bGYgPSBmdW5jdGlvbih4KSB7XHJcblx0XHRcdHJldHVybiB4IDw9IChzaXplLndpZHRoIC8gMik7XHJcblx0XHR9O1xyXG5cdFx0cmYgPSBmdW5jdGlvbih4KSB7XHJcblx0XHRcdHJldHVybiB4ID49IChjaGFydC53aWR0aCAtIChzaXplLndpZHRoIC8gMikpO1xyXG5cdFx0fTtcclxuXHR9XHJcblxyXG5cdG9sZiA9IGZ1bmN0aW9uKHgpIHtcclxuXHRcdHJldHVybiB4ICsgc2l6ZS53aWR0aCArIG1vZGVsLmNhcmV0U2l6ZSArIG1vZGVsLmNhcmV0UGFkZGluZyA+IGNoYXJ0LndpZHRoO1xyXG5cdH07XHJcblx0b3JmID0gZnVuY3Rpb24oeCkge1xyXG5cdFx0cmV0dXJuIHggLSBzaXplLndpZHRoIC0gbW9kZWwuY2FyZXRTaXplIC0gbW9kZWwuY2FyZXRQYWRkaW5nIDwgMDtcclxuXHR9O1xyXG5cdHlmID0gZnVuY3Rpb24oeSkge1xyXG5cdFx0cmV0dXJuIHkgPD0gbWlkWSA/ICd0b3AnIDogJ2JvdHRvbSc7XHJcblx0fTtcclxuXHJcblx0aWYgKGxmKG1vZGVsLngpKSB7XHJcblx0XHR4QWxpZ24gPSAnbGVmdCc7XHJcblxyXG5cdFx0Ly8gSXMgdG9vbHRpcCB0b28gd2lkZSBhbmQgZ29lcyBvdmVyIHRoZSByaWdodCBzaWRlIG9mIHRoZSBjaGFydC4/XHJcblx0XHRpZiAob2xmKG1vZGVsLngpKSB7XHJcblx0XHRcdHhBbGlnbiA9ICdjZW50ZXInO1xyXG5cdFx0XHR5QWxpZ24gPSB5Zihtb2RlbC55KTtcclxuXHRcdH1cclxuXHR9IGVsc2UgaWYgKHJmKG1vZGVsLngpKSB7XHJcblx0XHR4QWxpZ24gPSAncmlnaHQnO1xyXG5cclxuXHRcdC8vIElzIHRvb2x0aXAgdG9vIHdpZGUgYW5kIGdvZXMgb3V0c2lkZSBsZWZ0IGVkZ2Ugb2YgY2FudmFzP1xyXG5cdFx0aWYgKG9yZihtb2RlbC54KSkge1xyXG5cdFx0XHR4QWxpZ24gPSAnY2VudGVyJztcclxuXHRcdFx0eUFsaWduID0geWYobW9kZWwueSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHR2YXIgb3B0cyA9IHRvb2x0aXAuX29wdGlvbnM7XHJcblx0cmV0dXJuIHtcclxuXHRcdHhBbGlnbjogb3B0cy54QWxpZ24gPyBvcHRzLnhBbGlnbiA6IHhBbGlnbixcclxuXHRcdHlBbGlnbjogb3B0cy55QWxpZ24gPyBvcHRzLnlBbGlnbiA6IHlBbGlnblxyXG5cdH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBIZWxwZXIgdG8gZ2V0IHRoZSBsb2NhdGlvbiBhIHRvb2x0aXAgbmVlZHMgdG8gYmUgcGxhY2VkIGF0IGdpdmVuIHRoZSBpbml0aWFsIHBvc2l0aW9uICh2aWEgdGhlIHZtKSBhbmQgdGhlIHNpemUgYW5kIGFsaWdubWVudFxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0QmFja2dyb3VuZFBvaW50KHZtLCBzaXplLCBhbGlnbm1lbnQsIGNoYXJ0KSB7XHJcblx0Ly8gQmFja2dyb3VuZCBQb3NpdGlvblxyXG5cdHZhciB4ID0gdm0ueDtcclxuXHR2YXIgeSA9IHZtLnk7XHJcblxyXG5cdHZhciBjYXJldFNpemUgPSB2bS5jYXJldFNpemU7XHJcblx0dmFyIGNhcmV0UGFkZGluZyA9IHZtLmNhcmV0UGFkZGluZztcclxuXHR2YXIgY29ybmVyUmFkaXVzID0gdm0uY29ybmVyUmFkaXVzO1xyXG5cdHZhciB4QWxpZ24gPSBhbGlnbm1lbnQueEFsaWduO1xyXG5cdHZhciB5QWxpZ24gPSBhbGlnbm1lbnQueUFsaWduO1xyXG5cdHZhciBwYWRkaW5nQW5kU2l6ZSA9IGNhcmV0U2l6ZSArIGNhcmV0UGFkZGluZztcclxuXHR2YXIgcmFkaXVzQW5kUGFkZGluZyA9IGNvcm5lclJhZGl1cyArIGNhcmV0UGFkZGluZztcclxuXHJcblx0aWYgKHhBbGlnbiA9PT0gJ3JpZ2h0Jykge1xyXG5cdFx0eCAtPSBzaXplLndpZHRoO1xyXG5cdH0gZWxzZSBpZiAoeEFsaWduID09PSAnY2VudGVyJykge1xyXG5cdFx0eCAtPSAoc2l6ZS53aWR0aCAvIDIpO1xyXG5cdFx0aWYgKHggKyBzaXplLndpZHRoID4gY2hhcnQud2lkdGgpIHtcclxuXHRcdFx0eCA9IGNoYXJ0LndpZHRoIC0gc2l6ZS53aWR0aDtcclxuXHRcdH1cclxuXHRcdGlmICh4IDwgMCkge1xyXG5cdFx0XHR4ID0gMDtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGlmICh5QWxpZ24gPT09ICd0b3AnKSB7XHJcblx0XHR5ICs9IHBhZGRpbmdBbmRTaXplO1xyXG5cdH0gZWxzZSBpZiAoeUFsaWduID09PSAnYm90dG9tJykge1xyXG5cdFx0eSAtPSBzaXplLmhlaWdodCArIHBhZGRpbmdBbmRTaXplO1xyXG5cdH0gZWxzZSB7XHJcblx0XHR5IC09IChzaXplLmhlaWdodCAvIDIpO1xyXG5cdH1cclxuXHJcblx0aWYgKHlBbGlnbiA9PT0gJ2NlbnRlcicpIHtcclxuXHRcdGlmICh4QWxpZ24gPT09ICdsZWZ0Jykge1xyXG5cdFx0XHR4ICs9IHBhZGRpbmdBbmRTaXplO1xyXG5cdFx0fSBlbHNlIGlmICh4QWxpZ24gPT09ICdyaWdodCcpIHtcclxuXHRcdFx0eCAtPSBwYWRkaW5nQW5kU2l6ZTtcclxuXHRcdH1cclxuXHR9IGVsc2UgaWYgKHhBbGlnbiA9PT0gJ2xlZnQnKSB7XHJcblx0XHR4IC09IHJhZGl1c0FuZFBhZGRpbmc7XHJcblx0fSBlbHNlIGlmICh4QWxpZ24gPT09ICdyaWdodCcpIHtcclxuXHRcdHggKz0gcmFkaXVzQW5kUGFkZGluZztcclxuXHR9XHJcblxyXG5cdHJldHVybiB7XHJcblx0XHR4OiB4LFxyXG5cdFx0eTogeVxyXG5cdH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBIZWxwZXIgdG8gYnVpbGQgYmVmb3JlIGFuZCBhZnRlciBib2R5IGxpbmVzXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRCZWZvcmVBZnRlckJvZHlMaW5lcyhjYWxsYmFjaykge1xyXG5cdHJldHVybiBwdXNoT3JDb25jYXQoW10sIHNwbGl0TmV3bGluZXMoY2FsbGJhY2spKTtcclxufVxyXG5cclxudmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IEVsZW1lbnQuZXh0ZW5kKHtcclxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcclxuXHRcdHRoaXMuX21vZGVsID0gZ2V0QmFzZU1vZGVsKHRoaXMuX29wdGlvbnMpO1xyXG5cdFx0dGhpcy5fbGFzdEFjdGl2ZSA9IFtdO1xyXG5cdH0sXHJcblxyXG5cdC8vIEdldCB0aGUgdGl0bGVcclxuXHQvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtLCBkYXRhKVxyXG5cdGdldFRpdGxlOiBmdW5jdGlvbigpIHtcclxuXHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHR2YXIgb3B0cyA9IG1lLl9vcHRpb25zO1xyXG5cdFx0dmFyIGNhbGxiYWNrcyA9IG9wdHMuY2FsbGJhY2tzO1xyXG5cclxuXHRcdHZhciBiZWZvcmVUaXRsZSA9IGNhbGxiYWNrcy5iZWZvcmVUaXRsZS5hcHBseShtZSwgYXJndW1lbnRzKTtcclxuXHRcdHZhciB0aXRsZSA9IGNhbGxiYWNrcy50aXRsZS5hcHBseShtZSwgYXJndW1lbnRzKTtcclxuXHRcdHZhciBhZnRlclRpdGxlID0gY2FsbGJhY2tzLmFmdGVyVGl0bGUuYXBwbHkobWUsIGFyZ3VtZW50cyk7XHJcblxyXG5cdFx0dmFyIGxpbmVzID0gW107XHJcblx0XHRsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyhiZWZvcmVUaXRsZSkpO1xyXG5cdFx0bGluZXMgPSBwdXNoT3JDb25jYXQobGluZXMsIHNwbGl0TmV3bGluZXModGl0bGUpKTtcclxuXHRcdGxpbmVzID0gcHVzaE9yQ29uY2F0KGxpbmVzLCBzcGxpdE5ld2xpbmVzKGFmdGVyVGl0bGUpKTtcclxuXHJcblx0XHRyZXR1cm4gbGluZXM7XHJcblx0fSxcclxuXHJcblx0Ly8gQXJncyBhcmU6ICh0b29sdGlwSXRlbSwgZGF0YSlcclxuXHRnZXRCZWZvcmVCb2R5OiBmdW5jdGlvbigpIHtcclxuXHRcdHJldHVybiBnZXRCZWZvcmVBZnRlckJvZHlMaW5lcyh0aGlzLl9vcHRpb25zLmNhbGxiYWNrcy5iZWZvcmVCb2R5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xyXG5cdH0sXHJcblxyXG5cdC8vIEFyZ3MgYXJlOiAodG9vbHRpcEl0ZW0sIGRhdGEpXHJcblx0Z2V0Qm9keTogZnVuY3Rpb24odG9vbHRpcEl0ZW1zLCBkYXRhKSB7XHJcblx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0dmFyIGNhbGxiYWNrcyA9IG1lLl9vcHRpb25zLmNhbGxiYWNrcztcclxuXHRcdHZhciBib2R5SXRlbXMgPSBbXTtcclxuXHJcblx0XHRoZWxwZXJzLmVhY2godG9vbHRpcEl0ZW1zLCBmdW5jdGlvbih0b29sdGlwSXRlbSkge1xyXG5cdFx0XHR2YXIgYm9keUl0ZW0gPSB7XHJcblx0XHRcdFx0YmVmb3JlOiBbXSxcclxuXHRcdFx0XHRsaW5lczogW10sXHJcblx0XHRcdFx0YWZ0ZXI6IFtdXHJcblx0XHRcdH07XHJcblx0XHRcdHB1c2hPckNvbmNhdChib2R5SXRlbS5iZWZvcmUsIHNwbGl0TmV3bGluZXMoY2FsbGJhY2tzLmJlZm9yZUxhYmVsLmNhbGwobWUsIHRvb2x0aXBJdGVtLCBkYXRhKSkpO1xyXG5cdFx0XHRwdXNoT3JDb25jYXQoYm9keUl0ZW0ubGluZXMsIGNhbGxiYWNrcy5sYWJlbC5jYWxsKG1lLCB0b29sdGlwSXRlbSwgZGF0YSkpO1xyXG5cdFx0XHRwdXNoT3JDb25jYXQoYm9keUl0ZW0uYWZ0ZXIsIHNwbGl0TmV3bGluZXMoY2FsbGJhY2tzLmFmdGVyTGFiZWwuY2FsbChtZSwgdG9vbHRpcEl0ZW0sIGRhdGEpKSk7XHJcblxyXG5cdFx0XHRib2R5SXRlbXMucHVzaChib2R5SXRlbSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRyZXR1cm4gYm9keUl0ZW1zO1xyXG5cdH0sXHJcblxyXG5cdC8vIEFyZ3MgYXJlOiAodG9vbHRpcEl0ZW0sIGRhdGEpXHJcblx0Z2V0QWZ0ZXJCb2R5OiBmdW5jdGlvbigpIHtcclxuXHRcdHJldHVybiBnZXRCZWZvcmVBZnRlckJvZHlMaW5lcyh0aGlzLl9vcHRpb25zLmNhbGxiYWNrcy5hZnRlckJvZHkuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XHJcblx0fSxcclxuXHJcblx0Ly8gR2V0IHRoZSBmb290ZXIgYW5kIGJlZm9yZUZvb3RlciBhbmQgYWZ0ZXJGb290ZXIgbGluZXNcclxuXHQvLyBBcmdzIGFyZTogKHRvb2x0aXBJdGVtLCBkYXRhKVxyXG5cdGdldEZvb3RlcjogZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0dmFyIGNhbGxiYWNrcyA9IG1lLl9vcHRpb25zLmNhbGxiYWNrcztcclxuXHJcblx0XHR2YXIgYmVmb3JlRm9vdGVyID0gY2FsbGJhY2tzLmJlZm9yZUZvb3Rlci5hcHBseShtZSwgYXJndW1lbnRzKTtcclxuXHRcdHZhciBmb290ZXIgPSBjYWxsYmFja3MuZm9vdGVyLmFwcGx5KG1lLCBhcmd1bWVudHMpO1xyXG5cdFx0dmFyIGFmdGVyRm9vdGVyID0gY2FsbGJhY2tzLmFmdGVyRm9vdGVyLmFwcGx5KG1lLCBhcmd1bWVudHMpO1xyXG5cclxuXHRcdHZhciBsaW5lcyA9IFtdO1xyXG5cdFx0bGluZXMgPSBwdXNoT3JDb25jYXQobGluZXMsIHNwbGl0TmV3bGluZXMoYmVmb3JlRm9vdGVyKSk7XHJcblx0XHRsaW5lcyA9IHB1c2hPckNvbmNhdChsaW5lcywgc3BsaXROZXdsaW5lcyhmb290ZXIpKTtcclxuXHRcdGxpbmVzID0gcHVzaE9yQ29uY2F0KGxpbmVzLCBzcGxpdE5ld2xpbmVzKGFmdGVyRm9vdGVyKSk7XHJcblxyXG5cdFx0cmV0dXJuIGxpbmVzO1xyXG5cdH0sXHJcblxyXG5cdHVwZGF0ZTogZnVuY3Rpb24oY2hhbmdlZCkge1xyXG5cdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdHZhciBvcHRzID0gbWUuX29wdGlvbnM7XHJcblxyXG5cdFx0Ly8gTmVlZCB0byByZWdlbmVyYXRlIHRoZSBtb2RlbCBiZWNhdXNlIGl0cyBmYXN0ZXIgdGhhbiB1c2luZyBleHRlbmQgYW5kIGl0IGlzIG5lY2Vzc2FyeSBkdWUgdG8gdGhlIG9wdGltaXphdGlvbiBpbiBDaGFydC5FbGVtZW50LnRyYW5zaXRpb25cclxuXHRcdC8vIHRoYXQgZG9lcyBfdmlldyA9IF9tb2RlbCBpZiBlYXNlID09PSAxLiBUaGlzIGNhdXNlcyB0aGUgMm5kIHRvb2x0aXAgdXBkYXRlIHRvIHNldCBwcm9wZXJ0aWVzIGluIGJvdGggdGhlIHZpZXcgYW5kIG1vZGVsIGF0IHRoZSBzYW1lIHRpbWVcclxuXHRcdC8vIHdoaWNoIGJyZWFrcyBhbnkgYW5pbWF0aW9ucy5cclxuXHRcdHZhciBleGlzdGluZ01vZGVsID0gbWUuX21vZGVsO1xyXG5cdFx0dmFyIG1vZGVsID0gbWUuX21vZGVsID0gZ2V0QmFzZU1vZGVsKG9wdHMpO1xyXG5cdFx0dmFyIGFjdGl2ZSA9IG1lLl9hY3RpdmU7XHJcblxyXG5cdFx0dmFyIGRhdGEgPSBtZS5fZGF0YTtcclxuXHJcblx0XHQvLyBJbiB0aGUgY2FzZSB3aGVyZSBhY3RpdmUubGVuZ3RoID09PSAwIHdlIG5lZWQgdG8ga2VlcCB0aGVzZSBhdCBleGlzdGluZyB2YWx1ZXMgZm9yIGdvb2QgYW5pbWF0aW9uc1xyXG5cdFx0dmFyIGFsaWdubWVudCA9IHtcclxuXHRcdFx0eEFsaWduOiBleGlzdGluZ01vZGVsLnhBbGlnbixcclxuXHRcdFx0eUFsaWduOiBleGlzdGluZ01vZGVsLnlBbGlnblxyXG5cdFx0fTtcclxuXHRcdHZhciBiYWNrZ3JvdW5kUG9pbnQgPSB7XHJcblx0XHRcdHg6IGV4aXN0aW5nTW9kZWwueCxcclxuXHRcdFx0eTogZXhpc3RpbmdNb2RlbC55XHJcblx0XHR9O1xyXG5cdFx0dmFyIHRvb2x0aXBTaXplID0ge1xyXG5cdFx0XHR3aWR0aDogZXhpc3RpbmdNb2RlbC53aWR0aCxcclxuXHRcdFx0aGVpZ2h0OiBleGlzdGluZ01vZGVsLmhlaWdodFxyXG5cdFx0fTtcclxuXHRcdHZhciB0b29sdGlwUG9zaXRpb24gPSB7XHJcblx0XHRcdHg6IGV4aXN0aW5nTW9kZWwuY2FyZXRYLFxyXG5cdFx0XHR5OiBleGlzdGluZ01vZGVsLmNhcmV0WVxyXG5cdFx0fTtcclxuXHJcblx0XHR2YXIgaSwgbGVuO1xyXG5cclxuXHRcdGlmIChhY3RpdmUubGVuZ3RoKSB7XHJcblx0XHRcdG1vZGVsLm9wYWNpdHkgPSAxO1xyXG5cclxuXHRcdFx0dmFyIGxhYmVsQ29sb3JzID0gW107XHJcblx0XHRcdHZhciBsYWJlbFRleHRDb2xvcnMgPSBbXTtcclxuXHRcdFx0dG9vbHRpcFBvc2l0aW9uID0gcG9zaXRpb25lcnNbb3B0cy5wb3NpdGlvbl0uY2FsbChtZSwgYWN0aXZlLCBtZS5fZXZlbnRQb3NpdGlvbik7XHJcblxyXG5cdFx0XHR2YXIgdG9vbHRpcEl0ZW1zID0gW107XHJcblx0XHRcdGZvciAoaSA9IDAsIGxlbiA9IGFjdGl2ZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xyXG5cdFx0XHRcdHRvb2x0aXBJdGVtcy5wdXNoKGNyZWF0ZVRvb2x0aXBJdGVtKGFjdGl2ZVtpXSkpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBJZiB0aGUgdXNlciBwcm92aWRlZCBhIGZpbHRlciBmdW5jdGlvbiwgdXNlIGl0IHRvIG1vZGlmeSB0aGUgdG9vbHRpcCBpdGVtc1xyXG5cdFx0XHRpZiAob3B0cy5maWx0ZXIpIHtcclxuXHRcdFx0XHR0b29sdGlwSXRlbXMgPSB0b29sdGlwSXRlbXMuZmlsdGVyKGZ1bmN0aW9uKGEpIHtcclxuXHRcdFx0XHRcdHJldHVybiBvcHRzLmZpbHRlcihhLCBkYXRhKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gSWYgdGhlIHVzZXIgcHJvdmlkZWQgYSBzb3J0aW5nIGZ1bmN0aW9uLCB1c2UgaXQgdG8gbW9kaWZ5IHRoZSB0b29sdGlwIGl0ZW1zXHJcblx0XHRcdGlmIChvcHRzLml0ZW1Tb3J0KSB7XHJcblx0XHRcdFx0dG9vbHRpcEl0ZW1zID0gdG9vbHRpcEl0ZW1zLnNvcnQoZnVuY3Rpb24oYSwgYikge1xyXG5cdFx0XHRcdFx0cmV0dXJuIG9wdHMuaXRlbVNvcnQoYSwgYiwgZGF0YSk7XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIERldGVybWluZSBjb2xvcnMgZm9yIGJveGVzXHJcblx0XHRcdGhlbHBlcnMuZWFjaCh0b29sdGlwSXRlbXMsIGZ1bmN0aW9uKHRvb2x0aXBJdGVtKSB7XHJcblx0XHRcdFx0bGFiZWxDb2xvcnMucHVzaChvcHRzLmNhbGxiYWNrcy5sYWJlbENvbG9yLmNhbGwobWUsIHRvb2x0aXBJdGVtLCBtZS5fY2hhcnQpKTtcclxuXHRcdFx0XHRsYWJlbFRleHRDb2xvcnMucHVzaChvcHRzLmNhbGxiYWNrcy5sYWJlbFRleHRDb2xvci5jYWxsKG1lLCB0b29sdGlwSXRlbSwgbWUuX2NoYXJ0KSk7XHJcblx0XHRcdH0pO1xyXG5cclxuXHJcblx0XHRcdC8vIEJ1aWxkIHRoZSBUZXh0IExpbmVzXHJcblx0XHRcdG1vZGVsLnRpdGxlID0gbWUuZ2V0VGl0bGUodG9vbHRpcEl0ZW1zLCBkYXRhKTtcclxuXHRcdFx0bW9kZWwuYmVmb3JlQm9keSA9IG1lLmdldEJlZm9yZUJvZHkodG9vbHRpcEl0ZW1zLCBkYXRhKTtcclxuXHRcdFx0bW9kZWwuYm9keSA9IG1lLmdldEJvZHkodG9vbHRpcEl0ZW1zLCBkYXRhKTtcclxuXHRcdFx0bW9kZWwuYWZ0ZXJCb2R5ID0gbWUuZ2V0QWZ0ZXJCb2R5KHRvb2x0aXBJdGVtcywgZGF0YSk7XHJcblx0XHRcdG1vZGVsLmZvb3RlciA9IG1lLmdldEZvb3Rlcih0b29sdGlwSXRlbXMsIGRhdGEpO1xyXG5cclxuXHRcdFx0Ly8gSW5pdGlhbCBwb3NpdGlvbmluZyBhbmQgY29sb3JzXHJcblx0XHRcdG1vZGVsLnggPSBNYXRoLnJvdW5kKHRvb2x0aXBQb3NpdGlvbi54KTtcclxuXHRcdFx0bW9kZWwueSA9IE1hdGgucm91bmQodG9vbHRpcFBvc2l0aW9uLnkpO1xyXG5cdFx0XHRtb2RlbC5jYXJldFBhZGRpbmcgPSBvcHRzLmNhcmV0UGFkZGluZztcclxuXHRcdFx0bW9kZWwubGFiZWxDb2xvcnMgPSBsYWJlbENvbG9ycztcclxuXHRcdFx0bW9kZWwubGFiZWxUZXh0Q29sb3JzID0gbGFiZWxUZXh0Q29sb3JzO1xyXG5cclxuXHRcdFx0Ly8gZGF0YSBwb2ludHNcclxuXHRcdFx0bW9kZWwuZGF0YVBvaW50cyA9IHRvb2x0aXBJdGVtcztcclxuXHJcblx0XHRcdC8vIFdlIG5lZWQgdG8gZGV0ZXJtaW5lIGFsaWdubWVudCBvZiB0aGUgdG9vbHRpcFxyXG5cdFx0XHR0b29sdGlwU2l6ZSA9IGdldFRvb2x0aXBTaXplKHRoaXMsIG1vZGVsKTtcclxuXHRcdFx0YWxpZ25tZW50ID0gZGV0ZXJtaW5lQWxpZ25tZW50KHRoaXMsIHRvb2x0aXBTaXplKTtcclxuXHRcdFx0Ly8gRmluYWwgU2l6ZSBhbmQgUG9zaXRpb25cclxuXHRcdFx0YmFja2dyb3VuZFBvaW50ID0gZ2V0QmFja2dyb3VuZFBvaW50KG1vZGVsLCB0b29sdGlwU2l6ZSwgYWxpZ25tZW50LCBtZS5fY2hhcnQpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0bW9kZWwub3BhY2l0eSA9IDA7XHJcblx0XHR9XHJcblxyXG5cdFx0bW9kZWwueEFsaWduID0gYWxpZ25tZW50LnhBbGlnbjtcclxuXHRcdG1vZGVsLnlBbGlnbiA9IGFsaWdubWVudC55QWxpZ247XHJcblx0XHRtb2RlbC54ID0gYmFja2dyb3VuZFBvaW50Lng7XHJcblx0XHRtb2RlbC55ID0gYmFja2dyb3VuZFBvaW50Lnk7XHJcblx0XHRtb2RlbC53aWR0aCA9IHRvb2x0aXBTaXplLndpZHRoO1xyXG5cdFx0bW9kZWwuaGVpZ2h0ID0gdG9vbHRpcFNpemUuaGVpZ2h0O1xyXG5cclxuXHRcdC8vIFBvaW50IHdoZXJlIHRoZSBjYXJldCBvbiB0aGUgdG9vbHRpcCBwb2ludHMgdG9cclxuXHRcdG1vZGVsLmNhcmV0WCA9IHRvb2x0aXBQb3NpdGlvbi54O1xyXG5cdFx0bW9kZWwuY2FyZXRZID0gdG9vbHRpcFBvc2l0aW9uLnk7XHJcblxyXG5cdFx0bWUuX21vZGVsID0gbW9kZWw7XHJcblxyXG5cdFx0aWYgKGNoYW5nZWQgJiYgb3B0cy5jdXN0b20pIHtcclxuXHRcdFx0b3B0cy5jdXN0b20uY2FsbChtZSwgbW9kZWwpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBtZTtcclxuXHR9LFxyXG5cclxuXHRkcmF3Q2FyZXQ6IGZ1bmN0aW9uKHRvb2x0aXBQb2ludCwgc2l6ZSkge1xyXG5cdFx0dmFyIGN0eCA9IHRoaXMuX2NoYXJ0LmN0eDtcclxuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XHJcblx0XHR2YXIgY2FyZXRQb3NpdGlvbiA9IHRoaXMuZ2V0Q2FyZXRQb3NpdGlvbih0b29sdGlwUG9pbnQsIHNpemUsIHZtKTtcclxuXHJcblx0XHRjdHgubGluZVRvKGNhcmV0UG9zaXRpb24ueDEsIGNhcmV0UG9zaXRpb24ueTEpO1xyXG5cdFx0Y3R4LmxpbmVUbyhjYXJldFBvc2l0aW9uLngyLCBjYXJldFBvc2l0aW9uLnkyKTtcclxuXHRcdGN0eC5saW5lVG8oY2FyZXRQb3NpdGlvbi54MywgY2FyZXRQb3NpdGlvbi55Myk7XHJcblx0fSxcclxuXHRnZXRDYXJldFBvc2l0aW9uOiBmdW5jdGlvbih0b29sdGlwUG9pbnQsIHNpemUsIHZtKSB7XHJcblx0XHR2YXIgeDEsIHgyLCB4MywgeTEsIHkyLCB5MztcclxuXHRcdHZhciBjYXJldFNpemUgPSB2bS5jYXJldFNpemU7XHJcblx0XHR2YXIgY29ybmVyUmFkaXVzID0gdm0uY29ybmVyUmFkaXVzO1xyXG5cdFx0dmFyIHhBbGlnbiA9IHZtLnhBbGlnbjtcclxuXHRcdHZhciB5QWxpZ24gPSB2bS55QWxpZ247XHJcblx0XHR2YXIgcHRYID0gdG9vbHRpcFBvaW50Lng7XHJcblx0XHR2YXIgcHRZID0gdG9vbHRpcFBvaW50Lnk7XHJcblx0XHR2YXIgd2lkdGggPSBzaXplLndpZHRoO1xyXG5cdFx0dmFyIGhlaWdodCA9IHNpemUuaGVpZ2h0O1xyXG5cclxuXHRcdGlmICh5QWxpZ24gPT09ICdjZW50ZXInKSB7XHJcblx0XHRcdHkyID0gcHRZICsgKGhlaWdodCAvIDIpO1xyXG5cclxuXHRcdFx0aWYgKHhBbGlnbiA9PT0gJ2xlZnQnKSB7XHJcblx0XHRcdFx0eDEgPSBwdFg7XHJcblx0XHRcdFx0eDIgPSB4MSAtIGNhcmV0U2l6ZTtcclxuXHRcdFx0XHR4MyA9IHgxO1xyXG5cclxuXHRcdFx0XHR5MSA9IHkyICsgY2FyZXRTaXplO1xyXG5cdFx0XHRcdHkzID0geTIgLSBjYXJldFNpemU7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0eDEgPSBwdFggKyB3aWR0aDtcclxuXHRcdFx0XHR4MiA9IHgxICsgY2FyZXRTaXplO1xyXG5cdFx0XHRcdHgzID0geDE7XHJcblxyXG5cdFx0XHRcdHkxID0geTIgLSBjYXJldFNpemU7XHJcblx0XHRcdFx0eTMgPSB5MiArIGNhcmV0U2l6ZTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0aWYgKHhBbGlnbiA9PT0gJ2xlZnQnKSB7XHJcblx0XHRcdFx0eDIgPSBwdFggKyBjb3JuZXJSYWRpdXMgKyAoY2FyZXRTaXplKTtcclxuXHRcdFx0XHR4MSA9IHgyIC0gY2FyZXRTaXplO1xyXG5cdFx0XHRcdHgzID0geDIgKyBjYXJldFNpemU7XHJcblx0XHRcdH0gZWxzZSBpZiAoeEFsaWduID09PSAncmlnaHQnKSB7XHJcblx0XHRcdFx0eDIgPSBwdFggKyB3aWR0aCAtIGNvcm5lclJhZGl1cyAtIGNhcmV0U2l6ZTtcclxuXHRcdFx0XHR4MSA9IHgyIC0gY2FyZXRTaXplO1xyXG5cdFx0XHRcdHgzID0geDIgKyBjYXJldFNpemU7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0eDIgPSB2bS5jYXJldFg7XHJcblx0XHRcdFx0eDEgPSB4MiAtIGNhcmV0U2l6ZTtcclxuXHRcdFx0XHR4MyA9IHgyICsgY2FyZXRTaXplO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh5QWxpZ24gPT09ICd0b3AnKSB7XHJcblx0XHRcdFx0eTEgPSBwdFk7XHJcblx0XHRcdFx0eTIgPSB5MSAtIGNhcmV0U2l6ZTtcclxuXHRcdFx0XHR5MyA9IHkxO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHkxID0gcHRZICsgaGVpZ2h0O1xyXG5cdFx0XHRcdHkyID0geTEgKyBjYXJldFNpemU7XHJcblx0XHRcdFx0eTMgPSB5MTtcclxuXHRcdFx0XHQvLyBpbnZlcnQgZHJhd2luZyBvcmRlclxyXG5cdFx0XHRcdHZhciB0bXAgPSB4MztcclxuXHRcdFx0XHR4MyA9IHgxO1xyXG5cdFx0XHRcdHgxID0gdG1wO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4ge3gxOiB4MSwgeDI6IHgyLCB4MzogeDMsIHkxOiB5MSwgeTI6IHkyLCB5MzogeTN9O1xyXG5cdH0sXHJcblxyXG5cdGRyYXdUaXRsZTogZnVuY3Rpb24ocHQsIHZtLCBjdHgsIG9wYWNpdHkpIHtcclxuXHRcdHZhciB0aXRsZSA9IHZtLnRpdGxlO1xyXG5cclxuXHRcdGlmICh0aXRsZS5sZW5ndGgpIHtcclxuXHRcdFx0Y3R4LnRleHRBbGlnbiA9IHZtLl90aXRsZUFsaWduO1xyXG5cdFx0XHRjdHgudGV4dEJhc2VsaW5lID0gJ3RvcCc7XHJcblxyXG5cdFx0XHR2YXIgdGl0bGVGb250U2l6ZSA9IHZtLnRpdGxlRm9udFNpemU7XHJcblx0XHRcdHZhciB0aXRsZVNwYWNpbmcgPSB2bS50aXRsZVNwYWNpbmc7XHJcblxyXG5cdFx0XHRjdHguZmlsbFN0eWxlID0gbWVyZ2VPcGFjaXR5KHZtLnRpdGxlRm9udENvbG9yLCBvcGFjaXR5KTtcclxuXHRcdFx0Y3R4LmZvbnQgPSBoZWxwZXJzLmZvbnRTdHJpbmcodGl0bGVGb250U2l6ZSwgdm0uX3RpdGxlRm9udFN0eWxlLCB2bS5fdGl0bGVGb250RmFtaWx5KTtcclxuXHJcblx0XHRcdHZhciBpLCBsZW47XHJcblx0XHRcdGZvciAoaSA9IDAsIGxlbiA9IHRpdGxlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XHJcblx0XHRcdFx0Y3R4LmZpbGxUZXh0KHRpdGxlW2ldLCBwdC54LCBwdC55KTtcclxuXHRcdFx0XHRwdC55ICs9IHRpdGxlRm9udFNpemUgKyB0aXRsZVNwYWNpbmc7IC8vIExpbmUgSGVpZ2h0IGFuZCBzcGFjaW5nXHJcblxyXG5cdFx0XHRcdGlmIChpICsgMSA9PT0gdGl0bGUubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRwdC55ICs9IHZtLnRpdGxlTWFyZ2luQm90dG9tIC0gdGl0bGVTcGFjaW5nOyAvLyBJZiBMYXN0LCBhZGQgbWFyZ2luLCByZW1vdmUgc3BhY2luZ1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdGRyYXdCb2R5OiBmdW5jdGlvbihwdCwgdm0sIGN0eCwgb3BhY2l0eSkge1xyXG5cdFx0dmFyIGJvZHlGb250U2l6ZSA9IHZtLmJvZHlGb250U2l6ZTtcclxuXHRcdHZhciBib2R5U3BhY2luZyA9IHZtLmJvZHlTcGFjaW5nO1xyXG5cdFx0dmFyIGJvZHkgPSB2bS5ib2R5O1xyXG5cclxuXHRcdGN0eC50ZXh0QWxpZ24gPSB2bS5fYm9keUFsaWduO1xyXG5cdFx0Y3R4LnRleHRCYXNlbGluZSA9ICd0b3AnO1xyXG5cdFx0Y3R4LmZvbnQgPSBoZWxwZXJzLmZvbnRTdHJpbmcoYm9keUZvbnRTaXplLCB2bS5fYm9keUZvbnRTdHlsZSwgdm0uX2JvZHlGb250RmFtaWx5KTtcclxuXHJcblx0XHQvLyBCZWZvcmUgQm9keVxyXG5cdFx0dmFyIHhMaW5lUGFkZGluZyA9IDA7XHJcblx0XHR2YXIgZmlsbExpbmVPZlRleHQgPSBmdW5jdGlvbihsaW5lKSB7XHJcblx0XHRcdGN0eC5maWxsVGV4dChsaW5lLCBwdC54ICsgeExpbmVQYWRkaW5nLCBwdC55KTtcclxuXHRcdFx0cHQueSArPSBib2R5Rm9udFNpemUgKyBib2R5U3BhY2luZztcclxuXHRcdH07XHJcblxyXG5cdFx0Ly8gQmVmb3JlIGJvZHkgbGluZXNcclxuXHRcdGN0eC5maWxsU3R5bGUgPSBtZXJnZU9wYWNpdHkodm0uYm9keUZvbnRDb2xvciwgb3BhY2l0eSk7XHJcblx0XHRoZWxwZXJzLmVhY2godm0uYmVmb3JlQm9keSwgZmlsbExpbmVPZlRleHQpO1xyXG5cclxuXHRcdHZhciBkcmF3Q29sb3JCb3hlcyA9IHZtLmRpc3BsYXlDb2xvcnM7XHJcblx0XHR4TGluZVBhZGRpbmcgPSBkcmF3Q29sb3JCb3hlcyA/IChib2R5Rm9udFNpemUgKyAyKSA6IDA7XHJcblxyXG5cdFx0Ly8gRHJhdyBib2R5IGxpbmVzIG5vd1xyXG5cdFx0aGVscGVycy5lYWNoKGJvZHksIGZ1bmN0aW9uKGJvZHlJdGVtLCBpKSB7XHJcblx0XHRcdHZhciB0ZXh0Q29sb3IgPSBtZXJnZU9wYWNpdHkodm0ubGFiZWxUZXh0Q29sb3JzW2ldLCBvcGFjaXR5KTtcclxuXHRcdFx0Y3R4LmZpbGxTdHlsZSA9IHRleHRDb2xvcjtcclxuXHRcdFx0aGVscGVycy5lYWNoKGJvZHlJdGVtLmJlZm9yZSwgZmlsbExpbmVPZlRleHQpO1xyXG5cclxuXHRcdFx0aGVscGVycy5lYWNoKGJvZHlJdGVtLmxpbmVzLCBmdW5jdGlvbihsaW5lKSB7XHJcblx0XHRcdFx0Ly8gRHJhdyBMZWdlbmQtbGlrZSBib3hlcyBpZiBuZWVkZWRcclxuXHRcdFx0XHRpZiAoZHJhd0NvbG9yQm94ZXMpIHtcclxuXHRcdFx0XHRcdC8vIEZpbGwgYSB3aGl0ZSByZWN0IHNvIHRoYXQgY29sb3VycyBtZXJnZSBuaWNlbHkgaWYgdGhlIG9wYWNpdHkgaXMgPCAxXHJcblx0XHRcdFx0XHRjdHguZmlsbFN0eWxlID0gbWVyZ2VPcGFjaXR5KHZtLmxlZ2VuZENvbG9yQmFja2dyb3VuZCwgb3BhY2l0eSk7XHJcblx0XHRcdFx0XHRjdHguZmlsbFJlY3QocHQueCwgcHQueSwgYm9keUZvbnRTaXplLCBib2R5Rm9udFNpemUpO1xyXG5cclxuXHRcdFx0XHRcdC8vIEJvcmRlclxyXG5cdFx0XHRcdFx0Y3R4LmxpbmVXaWR0aCA9IDE7XHJcblx0XHRcdFx0XHRjdHguc3Ryb2tlU3R5bGUgPSBtZXJnZU9wYWNpdHkodm0ubGFiZWxDb2xvcnNbaV0uYm9yZGVyQ29sb3IsIG9wYWNpdHkpO1xyXG5cdFx0XHRcdFx0Y3R4LnN0cm9rZVJlY3QocHQueCwgcHQueSwgYm9keUZvbnRTaXplLCBib2R5Rm9udFNpemUpO1xyXG5cclxuXHRcdFx0XHRcdC8vIElubmVyIHNxdWFyZVxyXG5cdFx0XHRcdFx0Y3R4LmZpbGxTdHlsZSA9IG1lcmdlT3BhY2l0eSh2bS5sYWJlbENvbG9yc1tpXS5iYWNrZ3JvdW5kQ29sb3IsIG9wYWNpdHkpO1xyXG5cdFx0XHRcdFx0Y3R4LmZpbGxSZWN0KHB0LnggKyAxLCBwdC55ICsgMSwgYm9keUZvbnRTaXplIC0gMiwgYm9keUZvbnRTaXplIC0gMik7XHJcblx0XHRcdFx0XHRjdHguZmlsbFN0eWxlID0gdGV4dENvbG9yO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0ZmlsbExpbmVPZlRleHQobGluZSk7XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0aGVscGVycy5lYWNoKGJvZHlJdGVtLmFmdGVyLCBmaWxsTGluZU9mVGV4dCk7XHJcblx0XHR9KTtcclxuXHJcblx0XHQvLyBSZXNldCBiYWNrIHRvIDAgZm9yIGFmdGVyIGJvZHlcclxuXHRcdHhMaW5lUGFkZGluZyA9IDA7XHJcblxyXG5cdFx0Ly8gQWZ0ZXIgYm9keSBsaW5lc1xyXG5cdFx0aGVscGVycy5lYWNoKHZtLmFmdGVyQm9keSwgZmlsbExpbmVPZlRleHQpO1xyXG5cdFx0cHQueSAtPSBib2R5U3BhY2luZzsgLy8gUmVtb3ZlIGxhc3QgYm9keSBzcGFjaW5nXHJcblx0fSxcclxuXHJcblx0ZHJhd0Zvb3RlcjogZnVuY3Rpb24ocHQsIHZtLCBjdHgsIG9wYWNpdHkpIHtcclxuXHRcdHZhciBmb290ZXIgPSB2bS5mb290ZXI7XHJcblxyXG5cdFx0aWYgKGZvb3Rlci5sZW5ndGgpIHtcclxuXHRcdFx0cHQueSArPSB2bS5mb290ZXJNYXJnaW5Ub3A7XHJcblxyXG5cdFx0XHRjdHgudGV4dEFsaWduID0gdm0uX2Zvb3RlckFsaWduO1xyXG5cdFx0XHRjdHgudGV4dEJhc2VsaW5lID0gJ3RvcCc7XHJcblxyXG5cdFx0XHRjdHguZmlsbFN0eWxlID0gbWVyZ2VPcGFjaXR5KHZtLmZvb3RlckZvbnRDb2xvciwgb3BhY2l0eSk7XHJcblx0XHRcdGN0eC5mb250ID0gaGVscGVycy5mb250U3RyaW5nKHZtLmZvb3RlckZvbnRTaXplLCB2bS5fZm9vdGVyRm9udFN0eWxlLCB2bS5fZm9vdGVyRm9udEZhbWlseSk7XHJcblxyXG5cdFx0XHRoZWxwZXJzLmVhY2goZm9vdGVyLCBmdW5jdGlvbihsaW5lKSB7XHJcblx0XHRcdFx0Y3R4LmZpbGxUZXh0KGxpbmUsIHB0LngsIHB0LnkpO1xyXG5cdFx0XHRcdHB0LnkgKz0gdm0uZm9vdGVyRm9udFNpemUgKyB2bS5mb290ZXJTcGFjaW5nO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRkcmF3QmFja2dyb3VuZDogZnVuY3Rpb24ocHQsIHZtLCBjdHgsIHRvb2x0aXBTaXplLCBvcGFjaXR5KSB7XHJcblx0XHRjdHguZmlsbFN0eWxlID0gbWVyZ2VPcGFjaXR5KHZtLmJhY2tncm91bmRDb2xvciwgb3BhY2l0eSk7XHJcblx0XHRjdHguc3Ryb2tlU3R5bGUgPSBtZXJnZU9wYWNpdHkodm0uYm9yZGVyQ29sb3IsIG9wYWNpdHkpO1xyXG5cdFx0Y3R4LmxpbmVXaWR0aCA9IHZtLmJvcmRlcldpZHRoO1xyXG5cdFx0dmFyIHhBbGlnbiA9IHZtLnhBbGlnbjtcclxuXHRcdHZhciB5QWxpZ24gPSB2bS55QWxpZ247XHJcblx0XHR2YXIgeCA9IHB0Lng7XHJcblx0XHR2YXIgeSA9IHB0Lnk7XHJcblx0XHR2YXIgd2lkdGggPSB0b29sdGlwU2l6ZS53aWR0aDtcclxuXHRcdHZhciBoZWlnaHQgPSB0b29sdGlwU2l6ZS5oZWlnaHQ7XHJcblx0XHR2YXIgcmFkaXVzID0gdm0uY29ybmVyUmFkaXVzO1xyXG5cclxuXHRcdGN0eC5iZWdpblBhdGgoKTtcclxuXHRcdGN0eC5tb3ZlVG8oeCArIHJhZGl1cywgeSk7XHJcblx0XHRpZiAoeUFsaWduID09PSAndG9wJykge1xyXG5cdFx0XHR0aGlzLmRyYXdDYXJldChwdCwgdG9vbHRpcFNpemUpO1xyXG5cdFx0fVxyXG5cdFx0Y3R4LmxpbmVUbyh4ICsgd2lkdGggLSByYWRpdXMsIHkpO1xyXG5cdFx0Y3R4LnF1YWRyYXRpY0N1cnZlVG8oeCArIHdpZHRoLCB5LCB4ICsgd2lkdGgsIHkgKyByYWRpdXMpO1xyXG5cdFx0aWYgKHlBbGlnbiA9PT0gJ2NlbnRlcicgJiYgeEFsaWduID09PSAncmlnaHQnKSB7XHJcblx0XHRcdHRoaXMuZHJhd0NhcmV0KHB0LCB0b29sdGlwU2l6ZSk7XHJcblx0XHR9XHJcblx0XHRjdHgubGluZVRvKHggKyB3aWR0aCwgeSArIGhlaWdodCAtIHJhZGl1cyk7XHJcblx0XHRjdHgucXVhZHJhdGljQ3VydmVUbyh4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIHggKyB3aWR0aCAtIHJhZGl1cywgeSArIGhlaWdodCk7XHJcblx0XHRpZiAoeUFsaWduID09PSAnYm90dG9tJykge1xyXG5cdFx0XHR0aGlzLmRyYXdDYXJldChwdCwgdG9vbHRpcFNpemUpO1xyXG5cdFx0fVxyXG5cdFx0Y3R4LmxpbmVUbyh4ICsgcmFkaXVzLCB5ICsgaGVpZ2h0KTtcclxuXHRcdGN0eC5xdWFkcmF0aWNDdXJ2ZVRvKHgsIHkgKyBoZWlnaHQsIHgsIHkgKyBoZWlnaHQgLSByYWRpdXMpO1xyXG5cdFx0aWYgKHlBbGlnbiA9PT0gJ2NlbnRlcicgJiYgeEFsaWduID09PSAnbGVmdCcpIHtcclxuXHRcdFx0dGhpcy5kcmF3Q2FyZXQocHQsIHRvb2x0aXBTaXplKTtcclxuXHRcdH1cclxuXHRcdGN0eC5saW5lVG8oeCwgeSArIHJhZGl1cyk7XHJcblx0XHRjdHgucXVhZHJhdGljQ3VydmVUbyh4LCB5LCB4ICsgcmFkaXVzLCB5KTtcclxuXHRcdGN0eC5jbG9zZVBhdGgoKTtcclxuXHJcblx0XHRjdHguZmlsbCgpO1xyXG5cclxuXHRcdGlmICh2bS5ib3JkZXJXaWR0aCA+IDApIHtcclxuXHRcdFx0Y3R4LnN0cm9rZSgpO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdGRyYXc6IGZ1bmN0aW9uKCkge1xyXG5cdFx0dmFyIGN0eCA9IHRoaXMuX2NoYXJ0LmN0eDtcclxuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XHJcblxyXG5cdFx0aWYgKHZtLm9wYWNpdHkgPT09IDApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciB0b29sdGlwU2l6ZSA9IHtcclxuXHRcdFx0d2lkdGg6IHZtLndpZHRoLFxyXG5cdFx0XHRoZWlnaHQ6IHZtLmhlaWdodFxyXG5cdFx0fTtcclxuXHRcdHZhciBwdCA9IHtcclxuXHRcdFx0eDogdm0ueCxcclxuXHRcdFx0eTogdm0ueVxyXG5cdFx0fTtcclxuXHJcblx0XHQvLyBJRTExL0VkZ2UgZG9lcyBub3QgbGlrZSB2ZXJ5IHNtYWxsIG9wYWNpdGllcywgc28gc25hcCB0byAwXHJcblx0XHR2YXIgb3BhY2l0eSA9IE1hdGguYWJzKHZtLm9wYWNpdHkgPCAxZS0zKSA/IDAgOiB2bS5vcGFjaXR5O1xyXG5cclxuXHRcdC8vIFRydXRoeS9mYWxzZXkgdmFsdWUgZm9yIGVtcHR5IHRvb2x0aXBcclxuXHRcdHZhciBoYXNUb29sdGlwQ29udGVudCA9IHZtLnRpdGxlLmxlbmd0aCB8fCB2bS5iZWZvcmVCb2R5Lmxlbmd0aCB8fCB2bS5ib2R5Lmxlbmd0aCB8fCB2bS5hZnRlckJvZHkubGVuZ3RoIHx8IHZtLmZvb3Rlci5sZW5ndGg7XHJcblxyXG5cdFx0aWYgKHRoaXMuX29wdGlvbnMuZW5hYmxlZCAmJiBoYXNUb29sdGlwQ29udGVudCkge1xyXG5cdFx0XHQvLyBEcmF3IEJhY2tncm91bmRcclxuXHRcdFx0dGhpcy5kcmF3QmFja2dyb3VuZChwdCwgdm0sIGN0eCwgdG9vbHRpcFNpemUsIG9wYWNpdHkpO1xyXG5cclxuXHRcdFx0Ly8gRHJhdyBUaXRsZSwgQm9keSwgYW5kIEZvb3RlclxyXG5cdFx0XHRwdC54ICs9IHZtLnhQYWRkaW5nO1xyXG5cdFx0XHRwdC55ICs9IHZtLnlQYWRkaW5nO1xyXG5cclxuXHRcdFx0Ly8gVGl0bGVzXHJcblx0XHRcdHRoaXMuZHJhd1RpdGxlKHB0LCB2bSwgY3R4LCBvcGFjaXR5KTtcclxuXHJcblx0XHRcdC8vIEJvZHlcclxuXHRcdFx0dGhpcy5kcmF3Qm9keShwdCwgdm0sIGN0eCwgb3BhY2l0eSk7XHJcblxyXG5cdFx0XHQvLyBGb290ZXJcclxuXHRcdFx0dGhpcy5kcmF3Rm9vdGVyKHB0LCB2bSwgY3R4LCBvcGFjaXR5KTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBIYW5kbGUgYW4gZXZlbnRcclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqIEBwYXJhbSB7SUV2ZW50fSBldmVudCAtIFRoZSBldmVudCB0byBoYW5kbGVcclxuXHQgKiBAcmV0dXJucyB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgdG9vbHRpcCBjaGFuZ2VkXHJcblx0ICovXHJcblx0aGFuZGxlRXZlbnQ6IGZ1bmN0aW9uKGUpIHtcclxuXHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHR2YXIgb3B0aW9ucyA9IG1lLl9vcHRpb25zO1xyXG5cdFx0dmFyIGNoYW5nZWQgPSBmYWxzZTtcclxuXHJcblx0XHRtZS5fbGFzdEFjdGl2ZSA9IG1lLl9sYXN0QWN0aXZlIHx8IFtdO1xyXG5cclxuXHRcdC8vIEZpbmQgQWN0aXZlIEVsZW1lbnRzIGZvciB0b29sdGlwc1xyXG5cdFx0aWYgKGUudHlwZSA9PT0gJ21vdXNlb3V0Jykge1xyXG5cdFx0XHRtZS5fYWN0aXZlID0gW107XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRtZS5fYWN0aXZlID0gbWUuX2NoYXJ0LmdldEVsZW1lbnRzQXRFdmVudEZvck1vZGUoZSwgb3B0aW9ucy5tb2RlLCBvcHRpb25zKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBSZW1lbWJlciBMYXN0IEFjdGl2ZXNcclxuXHRcdGNoYW5nZWQgPSAhaGVscGVycy5hcnJheUVxdWFscyhtZS5fYWN0aXZlLCBtZS5fbGFzdEFjdGl2ZSk7XHJcblxyXG5cdFx0Ly8gT25seSBoYW5kbGUgdGFyZ2V0IGV2ZW50IG9uIHRvb2x0aXAgY2hhbmdlXHJcblx0XHRpZiAoY2hhbmdlZCkge1xyXG5cdFx0XHRtZS5fbGFzdEFjdGl2ZSA9IG1lLl9hY3RpdmU7XHJcblxyXG5cdFx0XHRpZiAob3B0aW9ucy5lbmFibGVkIHx8IG9wdGlvbnMuY3VzdG9tKSB7XHJcblx0XHRcdFx0bWUuX2V2ZW50UG9zaXRpb24gPSB7XHJcblx0XHRcdFx0XHR4OiBlLngsXHJcblx0XHRcdFx0XHR5OiBlLnlcclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRtZS51cGRhdGUodHJ1ZSk7XHJcblx0XHRcdFx0bWUucGl2b3QoKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBjaGFuZ2VkO1xyXG5cdH1cclxufSk7XHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBDaGFydC5Ub29sdGlwLnBvc2l0aW9uZXJzXHJcbiAqL1xyXG5leHBvcnRzLnBvc2l0aW9uZXJzID0gcG9zaXRpb25lcnM7XHJcblxyXG5cclxufSx7XCIyNlwiOjI2LFwiMjdcIjoyNyxcIjQ2XCI6NDZ9XSwzNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xyXG52YXIgRWxlbWVudCA9IHJlcXVpcmUoMjcpO1xyXG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xyXG5cclxuZGVmYXVsdHMuX3NldCgnZ2xvYmFsJywge1xyXG5cdGVsZW1lbnRzOiB7XHJcblx0XHRhcmM6IHtcclxuXHRcdFx0YmFja2dyb3VuZENvbG9yOiBkZWZhdWx0cy5nbG9iYWwuZGVmYXVsdENvbG9yLFxyXG5cdFx0XHRib3JkZXJDb2xvcjogJyNmZmYnLFxyXG5cdFx0XHRib3JkZXJXaWR0aDogMlxyXG5cdFx0fVxyXG5cdH1cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEVsZW1lbnQuZXh0ZW5kKHtcclxuXHRpbkxhYmVsUmFuZ2U6IGZ1bmN0aW9uKG1vdXNlWCkge1xyXG5cdFx0dmFyIHZtID0gdGhpcy5fdmlldztcclxuXHJcblx0XHRpZiAodm0pIHtcclxuXHRcdFx0cmV0dXJuIChNYXRoLnBvdyhtb3VzZVggLSB2bS54LCAyKSA8IE1hdGgucG93KHZtLnJhZGl1cyArIHZtLmhvdmVyUmFkaXVzLCAyKSk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fSxcclxuXHJcblx0aW5SYW5nZTogZnVuY3Rpb24oY2hhcnRYLCBjaGFydFkpIHtcclxuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XHJcblxyXG5cdFx0aWYgKHZtKSB7XHJcblx0XHRcdHZhciBwb2ludFJlbGF0aXZlUG9zaXRpb24gPSBoZWxwZXJzLmdldEFuZ2xlRnJvbVBvaW50KHZtLCB7eDogY2hhcnRYLCB5OiBjaGFydFl9KTtcclxuXHRcdFx0dmFyXHRhbmdsZSA9IHBvaW50UmVsYXRpdmVQb3NpdGlvbi5hbmdsZTtcclxuXHRcdFx0dmFyIGRpc3RhbmNlID0gcG9pbnRSZWxhdGl2ZVBvc2l0aW9uLmRpc3RhbmNlO1xyXG5cclxuXHRcdFx0Ly8gU2FuaXRpc2UgYW5nbGUgcmFuZ2VcclxuXHRcdFx0dmFyIHN0YXJ0QW5nbGUgPSB2bS5zdGFydEFuZ2xlO1xyXG5cdFx0XHR2YXIgZW5kQW5nbGUgPSB2bS5lbmRBbmdsZTtcclxuXHRcdFx0d2hpbGUgKGVuZEFuZ2xlIDwgc3RhcnRBbmdsZSkge1xyXG5cdFx0XHRcdGVuZEFuZ2xlICs9IDIuMCAqIE1hdGguUEk7XHJcblx0XHRcdH1cclxuXHRcdFx0d2hpbGUgKGFuZ2xlID4gZW5kQW5nbGUpIHtcclxuXHRcdFx0XHRhbmdsZSAtPSAyLjAgKiBNYXRoLlBJO1xyXG5cdFx0XHR9XHJcblx0XHRcdHdoaWxlIChhbmdsZSA8IHN0YXJ0QW5nbGUpIHtcclxuXHRcdFx0XHRhbmdsZSArPSAyLjAgKiBNYXRoLlBJO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBDaGVjayBpZiB3aXRoaW4gdGhlIHJhbmdlIG9mIHRoZSBvcGVuL2Nsb3NlIGFuZ2xlXHJcblx0XHRcdHZhciBiZXR3ZWVuQW5nbGVzID0gKGFuZ2xlID49IHN0YXJ0QW5nbGUgJiYgYW5nbGUgPD0gZW5kQW5nbGUpO1xyXG5cdFx0XHR2YXIgd2l0aGluUmFkaXVzID0gKGRpc3RhbmNlID49IHZtLmlubmVyUmFkaXVzICYmIGRpc3RhbmNlIDw9IHZtLm91dGVyUmFkaXVzKTtcclxuXHJcblx0XHRcdHJldHVybiAoYmV0d2VlbkFuZ2xlcyAmJiB3aXRoaW5SYWRpdXMpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH0sXHJcblxyXG5cdGdldENlbnRlclBvaW50OiBmdW5jdGlvbigpIHtcclxuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XHJcblx0XHR2YXIgaGFsZkFuZ2xlID0gKHZtLnN0YXJ0QW5nbGUgKyB2bS5lbmRBbmdsZSkgLyAyO1xyXG5cdFx0dmFyIGhhbGZSYWRpdXMgPSAodm0uaW5uZXJSYWRpdXMgKyB2bS5vdXRlclJhZGl1cykgLyAyO1xyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0eDogdm0ueCArIE1hdGguY29zKGhhbGZBbmdsZSkgKiBoYWxmUmFkaXVzLFxyXG5cdFx0XHR5OiB2bS55ICsgTWF0aC5zaW4oaGFsZkFuZ2xlKSAqIGhhbGZSYWRpdXNcclxuXHRcdH07XHJcblx0fSxcclxuXHJcblx0Z2V0QXJlYTogZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xyXG5cdFx0cmV0dXJuIE1hdGguUEkgKiAoKHZtLmVuZEFuZ2xlIC0gdm0uc3RhcnRBbmdsZSkgLyAoMiAqIE1hdGguUEkpKSAqIChNYXRoLnBvdyh2bS5vdXRlclJhZGl1cywgMikgLSBNYXRoLnBvdyh2bS5pbm5lclJhZGl1cywgMikpO1xyXG5cdH0sXHJcblxyXG5cdHRvb2x0aXBQb3NpdGlvbjogZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xyXG5cdFx0dmFyIGNlbnRyZUFuZ2xlID0gdm0uc3RhcnRBbmdsZSArICgodm0uZW5kQW5nbGUgLSB2bS5zdGFydEFuZ2xlKSAvIDIpO1xyXG5cdFx0dmFyIHJhbmdlRnJvbUNlbnRyZSA9ICh2bS5vdXRlclJhZGl1cyAtIHZtLmlubmVyUmFkaXVzKSAvIDIgKyB2bS5pbm5lclJhZGl1cztcclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHR4OiB2bS54ICsgKE1hdGguY29zKGNlbnRyZUFuZ2xlKSAqIHJhbmdlRnJvbUNlbnRyZSksXHJcblx0XHRcdHk6IHZtLnkgKyAoTWF0aC5zaW4oY2VudHJlQW5nbGUpICogcmFuZ2VGcm9tQ2VudHJlKVxyXG5cdFx0fTtcclxuXHR9LFxyXG5cclxuXHRkcmF3OiBmdW5jdGlvbigpIHtcclxuXHRcdHZhciBjdHggPSB0aGlzLl9jaGFydC5jdHg7XHJcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xyXG5cdFx0dmFyIHNBID0gdm0uc3RhcnRBbmdsZTtcclxuXHRcdHZhciBlQSA9IHZtLmVuZEFuZ2xlO1xyXG5cclxuXHRcdGN0eC5iZWdpblBhdGgoKTtcclxuXHJcblx0XHRjdHguYXJjKHZtLngsIHZtLnksIHZtLm91dGVyUmFkaXVzLCBzQSwgZUEpO1xyXG5cdFx0Y3R4LmFyYyh2bS54LCB2bS55LCB2bS5pbm5lclJhZGl1cywgZUEsIHNBLCB0cnVlKTtcclxuXHJcblx0XHRjdHguY2xvc2VQYXRoKCk7XHJcblx0XHRjdHguc3Ryb2tlU3R5bGUgPSB2bS5ib3JkZXJDb2xvcjtcclxuXHRcdGN0eC5saW5lV2lkdGggPSB2bS5ib3JkZXJXaWR0aDtcclxuXHJcblx0XHRjdHguZmlsbFN0eWxlID0gdm0uYmFja2dyb3VuZENvbG9yO1xyXG5cclxuXHRcdGN0eC5maWxsKCk7XHJcblx0XHRjdHgubGluZUpvaW4gPSAnYmV2ZWwnO1xyXG5cclxuXHRcdGlmICh2bS5ib3JkZXJXaWR0aCkge1xyXG5cdFx0XHRjdHguc3Ryb2tlKCk7XHJcblx0XHR9XHJcblx0fVxyXG59KTtcclxuXHJcbn0se1wiMjZcIjoyNixcIjI3XCI6MjcsXCI0NlwiOjQ2fV0sMzg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcclxudmFyIEVsZW1lbnQgPSByZXF1aXJlKDI3KTtcclxudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcclxuXHJcbnZhciBnbG9iYWxEZWZhdWx0cyA9IGRlZmF1bHRzLmdsb2JhbDtcclxuXHJcbmRlZmF1bHRzLl9zZXQoJ2dsb2JhbCcsIHtcclxuXHRlbGVtZW50czoge1xyXG5cdFx0bGluZToge1xyXG5cdFx0XHR0ZW5zaW9uOiAwLjQsXHJcblx0XHRcdGJhY2tncm91bmRDb2xvcjogZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdENvbG9yLFxyXG5cdFx0XHRib3JkZXJXaWR0aDogMyxcclxuXHRcdFx0Ym9yZGVyQ29sb3I6IGdsb2JhbERlZmF1bHRzLmRlZmF1bHRDb2xvcixcclxuXHRcdFx0Ym9yZGVyQ2FwU3R5bGU6ICdidXR0JyxcclxuXHRcdFx0Ym9yZGVyRGFzaDogW10sXHJcblx0XHRcdGJvcmRlckRhc2hPZmZzZXQ6IDAuMCxcclxuXHRcdFx0Ym9yZGVySm9pblN0eWxlOiAnbWl0ZXInLFxyXG5cdFx0XHRjYXBCZXppZXJQb2ludHM6IHRydWUsXHJcblx0XHRcdGZpbGw6IHRydWUsIC8vIGRvIHdlIGZpbGwgaW4gdGhlIGFyZWEgYmV0d2VlbiB0aGUgbGluZSBhbmQgaXRzIGJhc2UgYXhpc1xyXG5cdFx0fVxyXG5cdH1cclxufSk7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEVsZW1lbnQuZXh0ZW5kKHtcclxuXHRkcmF3OiBmdW5jdGlvbigpIHtcclxuXHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHR2YXIgdm0gPSBtZS5fdmlldztcclxuXHRcdHZhciBjdHggPSBtZS5fY2hhcnQuY3R4O1xyXG5cdFx0dmFyIHNwYW5HYXBzID0gdm0uc3BhbkdhcHM7XHJcblx0XHR2YXIgcG9pbnRzID0gbWUuX2NoaWxkcmVuLnNsaWNlKCk7IC8vIGNsb25lIGFycmF5XHJcblx0XHR2YXIgZ2xvYmFsT3B0aW9uTGluZUVsZW1lbnRzID0gZ2xvYmFsRGVmYXVsdHMuZWxlbWVudHMubGluZTtcclxuXHRcdHZhciBsYXN0RHJhd25JbmRleCA9IC0xO1xyXG5cdFx0dmFyIGluZGV4LCBjdXJyZW50LCBwcmV2aW91cywgY3VycmVudFZNO1xyXG5cclxuXHRcdC8vIElmIHdlIGFyZSBsb29waW5nLCBhZGRpbmcgdGhlIGZpcnN0IHBvaW50IGFnYWluXHJcblx0XHRpZiAobWUuX2xvb3AgJiYgcG9pbnRzLmxlbmd0aCkge1xyXG5cdFx0XHRwb2ludHMucHVzaChwb2ludHNbMF0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGN0eC5zYXZlKCk7XHJcblxyXG5cdFx0Ly8gU3Ryb2tlIExpbmUgT3B0aW9uc1xyXG5cdFx0Y3R4LmxpbmVDYXAgPSB2bS5ib3JkZXJDYXBTdHlsZSB8fCBnbG9iYWxPcHRpb25MaW5lRWxlbWVudHMuYm9yZGVyQ2FwU3R5bGU7XHJcblxyXG5cdFx0Ly8gSUUgOSBhbmQgMTAgZG8gbm90IHN1cHBvcnQgbGluZSBkYXNoXHJcblx0XHRpZiAoY3R4LnNldExpbmVEYXNoKSB7XHJcblx0XHRcdGN0eC5zZXRMaW5lRGFzaCh2bS5ib3JkZXJEYXNoIHx8IGdsb2JhbE9wdGlvbkxpbmVFbGVtZW50cy5ib3JkZXJEYXNoKTtcclxuXHRcdH1cclxuXHJcblx0XHRjdHgubGluZURhc2hPZmZzZXQgPSB2bS5ib3JkZXJEYXNoT2Zmc2V0IHx8IGdsb2JhbE9wdGlvbkxpbmVFbGVtZW50cy5ib3JkZXJEYXNoT2Zmc2V0O1xyXG5cdFx0Y3R4LmxpbmVKb2luID0gdm0uYm9yZGVySm9pblN0eWxlIHx8IGdsb2JhbE9wdGlvbkxpbmVFbGVtZW50cy5ib3JkZXJKb2luU3R5bGU7XHJcblx0XHRjdHgubGluZVdpZHRoID0gdm0uYm9yZGVyV2lkdGggfHwgZ2xvYmFsT3B0aW9uTGluZUVsZW1lbnRzLmJvcmRlcldpZHRoO1xyXG5cdFx0Y3R4LnN0cm9rZVN0eWxlID0gdm0uYm9yZGVyQ29sb3IgfHwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdENvbG9yO1xyXG5cclxuXHRcdC8vIFN0cm9rZSBMaW5lXHJcblx0XHRjdHguYmVnaW5QYXRoKCk7XHJcblx0XHRsYXN0RHJhd25JbmRleCA9IC0xO1xyXG5cclxuXHRcdGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBvaW50cy5sZW5ndGg7ICsraW5kZXgpIHtcclxuXHRcdFx0Y3VycmVudCA9IHBvaW50c1tpbmRleF07XHJcblx0XHRcdHByZXZpb3VzID0gaGVscGVycy5wcmV2aW91c0l0ZW0ocG9pbnRzLCBpbmRleCk7XHJcblx0XHRcdGN1cnJlbnRWTSA9IGN1cnJlbnQuX3ZpZXc7XHJcblxyXG5cdFx0XHQvLyBGaXJzdCBwb2ludCBtb3ZlcyB0byBpdCdzIHN0YXJ0aW5nIHBvc2l0aW9uIG5vIG1hdHRlciB3aGF0XHJcblx0XHRcdGlmIChpbmRleCA9PT0gMCkge1xyXG5cdFx0XHRcdGlmICghY3VycmVudFZNLnNraXApIHtcclxuXHRcdFx0XHRcdGN0eC5tb3ZlVG8oY3VycmVudFZNLngsIGN1cnJlbnRWTS55KTtcclxuXHRcdFx0XHRcdGxhc3REcmF3bkluZGV4ID0gaW5kZXg7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHByZXZpb3VzID0gbGFzdERyYXduSW5kZXggPT09IC0xID8gcHJldmlvdXMgOiBwb2ludHNbbGFzdERyYXduSW5kZXhdO1xyXG5cclxuXHRcdFx0XHRpZiAoIWN1cnJlbnRWTS5za2lwKSB7XHJcblx0XHRcdFx0XHRpZiAoKGxhc3REcmF3bkluZGV4ICE9PSAoaW5kZXggLSAxKSAmJiAhc3BhbkdhcHMpIHx8IGxhc3REcmF3bkluZGV4ID09PSAtMSkge1xyXG5cdFx0XHRcdFx0XHQvLyBUaGVyZSB3YXMgYSBnYXAgYW5kIHRoaXMgaXMgdGhlIGZpcnN0IHBvaW50IGFmdGVyIHRoZSBnYXBcclxuXHRcdFx0XHRcdFx0Y3R4Lm1vdmVUbyhjdXJyZW50Vk0ueCwgY3VycmVudFZNLnkpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0Ly8gTGluZSB0byBuZXh0IHBvaW50XHJcblx0XHRcdFx0XHRcdGhlbHBlcnMuY2FudmFzLmxpbmVUbyhjdHgsIHByZXZpb3VzLl92aWV3LCBjdXJyZW50Ll92aWV3KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxhc3REcmF3bkluZGV4ID0gaW5kZXg7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0Y3R4LnN0cm9rZSgpO1xyXG5cdFx0Y3R4LnJlc3RvcmUoKTtcclxuXHR9XHJcbn0pO1xyXG5cclxufSx7XCIyNlwiOjI2LFwiMjdcIjoyNyxcIjQ2XCI6NDZ9XSwzOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xyXG52YXIgRWxlbWVudCA9IHJlcXVpcmUoMjcpO1xyXG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xyXG5cclxudmFyIGRlZmF1bHRDb2xvciA9IGRlZmF1bHRzLmdsb2JhbC5kZWZhdWx0Q29sb3I7XHJcblxyXG5kZWZhdWx0cy5fc2V0KCdnbG9iYWwnLCB7XHJcblx0ZWxlbWVudHM6IHtcclxuXHRcdHBvaW50OiB7XHJcblx0XHRcdHJhZGl1czogMyxcclxuXHRcdFx0cG9pbnRTdHlsZTogJ2NpcmNsZScsXHJcblx0XHRcdGJhY2tncm91bmRDb2xvcjogZGVmYXVsdENvbG9yLFxyXG5cdFx0XHRib3JkZXJDb2xvcjogZGVmYXVsdENvbG9yLFxyXG5cdFx0XHRib3JkZXJXaWR0aDogMSxcclxuXHRcdFx0Ly8gSG92ZXJcclxuXHRcdFx0aGl0UmFkaXVzOiAxLFxyXG5cdFx0XHRob3ZlclJhZGl1czogNCxcclxuXHRcdFx0aG92ZXJCb3JkZXJXaWR0aDogMVxyXG5cdFx0fVxyXG5cdH1cclxufSk7XHJcblxyXG5mdW5jdGlvbiB4UmFuZ2UobW91c2VYKSB7XHJcblx0dmFyIHZtID0gdGhpcy5fdmlldztcclxuXHRyZXR1cm4gdm0gPyAoTWF0aC5hYnMobW91c2VYIC0gdm0ueCkgPCB2bS5yYWRpdXMgKyB2bS5oaXRSYWRpdXMpIDogZmFsc2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHlSYW5nZShtb3VzZVkpIHtcclxuXHR2YXIgdm0gPSB0aGlzLl92aWV3O1xyXG5cdHJldHVybiB2bSA/IChNYXRoLmFicyhtb3VzZVkgLSB2bS55KSA8IHZtLnJhZGl1cyArIHZtLmhpdFJhZGl1cykgOiBmYWxzZTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBFbGVtZW50LmV4dGVuZCh7XHJcblx0aW5SYW5nZTogZnVuY3Rpb24obW91c2VYLCBtb3VzZVkpIHtcclxuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XHJcblx0XHRyZXR1cm4gdm0gPyAoKE1hdGgucG93KG1vdXNlWCAtIHZtLngsIDIpICsgTWF0aC5wb3cobW91c2VZIC0gdm0ueSwgMikpIDwgTWF0aC5wb3codm0uaGl0UmFkaXVzICsgdm0ucmFkaXVzLCAyKSkgOiBmYWxzZTtcclxuXHR9LFxyXG5cclxuXHRpbkxhYmVsUmFuZ2U6IHhSYW5nZSxcclxuXHRpblhSYW5nZTogeFJhbmdlLFxyXG5cdGluWVJhbmdlOiB5UmFuZ2UsXHJcblxyXG5cdGdldENlbnRlclBvaW50OiBmdW5jdGlvbigpIHtcclxuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHR4OiB2bS54LFxyXG5cdFx0XHR5OiB2bS55XHJcblx0XHR9O1xyXG5cdH0sXHJcblxyXG5cdGdldEFyZWE6IGZ1bmN0aW9uKCkge1xyXG5cdFx0cmV0dXJuIE1hdGguUEkgKiBNYXRoLnBvdyh0aGlzLl92aWV3LnJhZGl1cywgMik7XHJcblx0fSxcclxuXHJcblx0dG9vbHRpcFBvc2l0aW9uOiBmdW5jdGlvbigpIHtcclxuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHR4OiB2bS54LFxyXG5cdFx0XHR5OiB2bS55LFxyXG5cdFx0XHRwYWRkaW5nOiB2bS5yYWRpdXMgKyB2bS5ib3JkZXJXaWR0aFxyXG5cdFx0fTtcclxuXHR9LFxyXG5cclxuXHRkcmF3OiBmdW5jdGlvbihjaGFydEFyZWEpIHtcclxuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XHJcblx0XHR2YXIgbW9kZWwgPSB0aGlzLl9tb2RlbDtcclxuXHRcdHZhciBjdHggPSB0aGlzLl9jaGFydC5jdHg7XHJcblx0XHR2YXIgcG9pbnRTdHlsZSA9IHZtLnBvaW50U3R5bGU7XHJcblx0XHR2YXIgcm90YXRpb24gPSB2bS5yb3RhdGlvbjtcclxuXHRcdHZhciByYWRpdXMgPSB2bS5yYWRpdXM7XHJcblx0XHR2YXIgeCA9IHZtLng7XHJcblx0XHR2YXIgeSA9IHZtLnk7XHJcblx0XHR2YXIgZXJyTWFyZ2luID0gMS4wMTsgLy8gMS4wMSBpcyBtYXJnaW4gZm9yIEFjY3VtdWxhdGVkIGVycm9yLiAoRXNwZWNpYWxseSBFZGdlLCBJRS4pXHJcblxyXG5cdFx0aWYgKHZtLnNraXApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIENsaXBwaW5nIGZvciBQb2ludHMuXHJcblx0XHRpZiAoY2hhcnRBcmVhID09PSB1bmRlZmluZWQgfHwgKG1vZGVsLnggPj0gY2hhcnRBcmVhLmxlZnQgJiYgY2hhcnRBcmVhLnJpZ2h0ICogZXJyTWFyZ2luID49IG1vZGVsLnggJiYgbW9kZWwueSA+PSBjaGFydEFyZWEudG9wICYmIGNoYXJ0QXJlYS5ib3R0b20gKiBlcnJNYXJnaW4gPj0gbW9kZWwueSkpIHtcclxuXHRcdFx0Y3R4LnN0cm9rZVN0eWxlID0gdm0uYm9yZGVyQ29sb3IgfHwgZGVmYXVsdENvbG9yO1xyXG5cdFx0XHRjdHgubGluZVdpZHRoID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdCh2bS5ib3JkZXJXaWR0aCwgZGVmYXVsdHMuZ2xvYmFsLmVsZW1lbnRzLnBvaW50LmJvcmRlcldpZHRoKTtcclxuXHRcdFx0Y3R4LmZpbGxTdHlsZSA9IHZtLmJhY2tncm91bmRDb2xvciB8fCBkZWZhdWx0Q29sb3I7XHJcblx0XHRcdGhlbHBlcnMuY2FudmFzLmRyYXdQb2ludChjdHgsIHBvaW50U3R5bGUsIHJhZGl1cywgeCwgeSwgcm90YXRpb24pO1xyXG5cdFx0fVxyXG5cdH1cclxufSk7XHJcblxyXG59LHtcIjI2XCI6MjYsXCIyN1wiOjI3LFwiNDZcIjo0Nn1dLDQwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgyNik7XHJcbnZhciBFbGVtZW50ID0gcmVxdWlyZSgyNyk7XHJcblxyXG5kZWZhdWx0cy5fc2V0KCdnbG9iYWwnLCB7XHJcblx0ZWxlbWVudHM6IHtcclxuXHRcdHJlY3RhbmdsZToge1xyXG5cdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IGRlZmF1bHRzLmdsb2JhbC5kZWZhdWx0Q29sb3IsXHJcblx0XHRcdGJvcmRlckNvbG9yOiBkZWZhdWx0cy5nbG9iYWwuZGVmYXVsdENvbG9yLFxyXG5cdFx0XHRib3JkZXJTa2lwcGVkOiAnYm90dG9tJyxcclxuXHRcdFx0Ym9yZGVyV2lkdGg6IDBcclxuXHRcdH1cclxuXHR9XHJcbn0pO1xyXG5cclxuZnVuY3Rpb24gaXNWZXJ0aWNhbChiYXIpIHtcclxuXHRyZXR1cm4gYmFyLl92aWV3LndpZHRoICE9PSB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBib3VuZHMgb2YgdGhlIGJhciByZWdhcmRsZXNzIG9mIHRoZSBvcmllbnRhdGlvblxyXG4gKiBAcGFyYW0gYmFyIHtDaGFydC5FbGVtZW50LlJlY3RhbmdsZX0gdGhlIGJhclxyXG4gKiBAcmV0dXJuIHtCb3VuZHN9IGJvdW5kcyBvZiB0aGUgYmFyXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRCYXJCb3VuZHMoYmFyKSB7XHJcblx0dmFyIHZtID0gYmFyLl92aWV3O1xyXG5cdHZhciB4MSwgeDIsIHkxLCB5MjtcclxuXHJcblx0aWYgKGlzVmVydGljYWwoYmFyKSkge1xyXG5cdFx0Ly8gdmVydGljYWxcclxuXHRcdHZhciBoYWxmV2lkdGggPSB2bS53aWR0aCAvIDI7XHJcblx0XHR4MSA9IHZtLnggLSBoYWxmV2lkdGg7XHJcblx0XHR4MiA9IHZtLnggKyBoYWxmV2lkdGg7XHJcblx0XHR5MSA9IE1hdGgubWluKHZtLnksIHZtLmJhc2UpO1xyXG5cdFx0eTIgPSBNYXRoLm1heCh2bS55LCB2bS5iYXNlKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0Ly8gaG9yaXpvbnRhbCBiYXJcclxuXHRcdHZhciBoYWxmSGVpZ2h0ID0gdm0uaGVpZ2h0IC8gMjtcclxuXHRcdHgxID0gTWF0aC5taW4odm0ueCwgdm0uYmFzZSk7XHJcblx0XHR4MiA9IE1hdGgubWF4KHZtLngsIHZtLmJhc2UpO1xyXG5cdFx0eTEgPSB2bS55IC0gaGFsZkhlaWdodDtcclxuXHRcdHkyID0gdm0ueSArIGhhbGZIZWlnaHQ7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4ge1xyXG5cdFx0bGVmdDogeDEsXHJcblx0XHR0b3A6IHkxLFxyXG5cdFx0cmlnaHQ6IHgyLFxyXG5cdFx0Ym90dG9tOiB5MlxyXG5cdH07XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRWxlbWVudC5leHRlbmQoe1xyXG5cdGRyYXc6IGZ1bmN0aW9uKCkge1xyXG5cdFx0dmFyIGN0eCA9IHRoaXMuX2NoYXJ0LmN0eDtcclxuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XHJcblx0XHR2YXIgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBzaWduWCwgc2lnblksIGJvcmRlclNraXBwZWQ7XHJcblx0XHR2YXIgYm9yZGVyV2lkdGggPSB2bS5ib3JkZXJXaWR0aDtcclxuXHJcblx0XHRpZiAoIXZtLmhvcml6b250YWwpIHtcclxuXHRcdFx0Ly8gYmFyXHJcblx0XHRcdGxlZnQgPSB2bS54IC0gdm0ud2lkdGggLyAyO1xyXG5cdFx0XHRyaWdodCA9IHZtLnggKyB2bS53aWR0aCAvIDI7XHJcblx0XHRcdHRvcCA9IHZtLnk7XHJcblx0XHRcdGJvdHRvbSA9IHZtLmJhc2U7XHJcblx0XHRcdHNpZ25YID0gMTtcclxuXHRcdFx0c2lnblkgPSBib3R0b20gPiB0b3AgPyAxIDogLTE7XHJcblx0XHRcdGJvcmRlclNraXBwZWQgPSB2bS5ib3JkZXJTa2lwcGVkIHx8ICdib3R0b20nO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8gaG9yaXpvbnRhbCBiYXJcclxuXHRcdFx0bGVmdCA9IHZtLmJhc2U7XHJcblx0XHRcdHJpZ2h0ID0gdm0ueDtcclxuXHRcdFx0dG9wID0gdm0ueSAtIHZtLmhlaWdodCAvIDI7XHJcblx0XHRcdGJvdHRvbSA9IHZtLnkgKyB2bS5oZWlnaHQgLyAyO1xyXG5cdFx0XHRzaWduWCA9IHJpZ2h0ID4gbGVmdCA/IDEgOiAtMTtcclxuXHRcdFx0c2lnblkgPSAxO1xyXG5cdFx0XHRib3JkZXJTa2lwcGVkID0gdm0uYm9yZGVyU2tpcHBlZCB8fCAnbGVmdCc7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gQ2FudmFzIGRvZXNuJ3QgYWxsb3cgdXMgdG8gc3Ryb2tlIGluc2lkZSB0aGUgd2lkdGggc28gd2UgY2FuXHJcblx0XHQvLyBhZGp1c3QgdGhlIHNpemVzIHRvIGZpdCBpZiB3ZSdyZSBzZXR0aW5nIGEgc3Ryb2tlIG9uIHRoZSBsaW5lXHJcblx0XHRpZiAoYm9yZGVyV2lkdGgpIHtcclxuXHRcdFx0Ly8gYm9yZGVyV2lkdGggc2hvbGQgYmUgbGVzcyB0aGFuIGJhciB3aWR0aCBhbmQgYmFyIGhlaWdodC5cclxuXHRcdFx0dmFyIGJhclNpemUgPSBNYXRoLm1pbihNYXRoLmFicyhsZWZ0IC0gcmlnaHQpLCBNYXRoLmFicyh0b3AgLSBib3R0b20pKTtcclxuXHRcdFx0Ym9yZGVyV2lkdGggPSBib3JkZXJXaWR0aCA+IGJhclNpemUgPyBiYXJTaXplIDogYm9yZGVyV2lkdGg7XHJcblx0XHRcdHZhciBoYWxmU3Ryb2tlID0gYm9yZGVyV2lkdGggLyAyO1xyXG5cdFx0XHQvLyBBZGp1c3QgYm9yZGVyV2lkdGggd2hlbiBiYXIgdG9wIHBvc2l0aW9uIGlzIG5lYXIgdm0uYmFzZSh6ZXJvKS5cclxuXHRcdFx0dmFyIGJvcmRlckxlZnQgPSBsZWZ0ICsgKGJvcmRlclNraXBwZWQgIT09ICdsZWZ0JyA/IGhhbGZTdHJva2UgKiBzaWduWCA6IDApO1xyXG5cdFx0XHR2YXIgYm9yZGVyUmlnaHQgPSByaWdodCArIChib3JkZXJTa2lwcGVkICE9PSAncmlnaHQnID8gLWhhbGZTdHJva2UgKiBzaWduWCA6IDApO1xyXG5cdFx0XHR2YXIgYm9yZGVyVG9wID0gdG9wICsgKGJvcmRlclNraXBwZWQgIT09ICd0b3AnID8gaGFsZlN0cm9rZSAqIHNpZ25ZIDogMCk7XHJcblx0XHRcdHZhciBib3JkZXJCb3R0b20gPSBib3R0b20gKyAoYm9yZGVyU2tpcHBlZCAhPT0gJ2JvdHRvbScgPyAtaGFsZlN0cm9rZSAqIHNpZ25ZIDogMCk7XHJcblx0XHRcdC8vIG5vdCBiZWNvbWUgYSB2ZXJ0aWNhbCBsaW5lP1xyXG5cdFx0XHRpZiAoYm9yZGVyTGVmdCAhPT0gYm9yZGVyUmlnaHQpIHtcclxuXHRcdFx0XHR0b3AgPSBib3JkZXJUb3A7XHJcblx0XHRcdFx0Ym90dG9tID0gYm9yZGVyQm90dG9tO1xyXG5cdFx0XHR9XHJcblx0XHRcdC8vIG5vdCBiZWNvbWUgYSBob3Jpem9udGFsIGxpbmU/XHJcblx0XHRcdGlmIChib3JkZXJUb3AgIT09IGJvcmRlckJvdHRvbSkge1xyXG5cdFx0XHRcdGxlZnQgPSBib3JkZXJMZWZ0O1xyXG5cdFx0XHRcdHJpZ2h0ID0gYm9yZGVyUmlnaHQ7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRjdHguYmVnaW5QYXRoKCk7XHJcblx0XHRjdHguZmlsbFN0eWxlID0gdm0uYmFja2dyb3VuZENvbG9yO1xyXG5cdFx0Y3R4LnN0cm9rZVN0eWxlID0gdm0uYm9yZGVyQ29sb3I7XHJcblx0XHRjdHgubGluZVdpZHRoID0gYm9yZGVyV2lkdGg7XHJcblxyXG5cdFx0Ly8gQ29ybmVyIHBvaW50cywgZnJvbSBib3R0b20tbGVmdCB0byBib3R0b20tcmlnaHQgY2xvY2t3aXNlXHJcblx0XHQvLyB8IDEgMiB8XHJcblx0XHQvLyB8IDAgMyB8XHJcblx0XHR2YXIgY29ybmVycyA9IFtcclxuXHRcdFx0W2xlZnQsIGJvdHRvbV0sXHJcblx0XHRcdFtsZWZ0LCB0b3BdLFxyXG5cdFx0XHRbcmlnaHQsIHRvcF0sXHJcblx0XHRcdFtyaWdodCwgYm90dG9tXVxyXG5cdFx0XTtcclxuXHJcblx0XHQvLyBGaW5kIGZpcnN0IChzdGFydGluZykgY29ybmVyIHdpdGggZmFsbGJhY2sgdG8gJ2JvdHRvbSdcclxuXHRcdHZhciBib3JkZXJzID0gWydib3R0b20nLCAnbGVmdCcsICd0b3AnLCAncmlnaHQnXTtcclxuXHRcdHZhciBzdGFydENvcm5lciA9IGJvcmRlcnMuaW5kZXhPZihib3JkZXJTa2lwcGVkLCAwKTtcclxuXHRcdGlmIChzdGFydENvcm5lciA9PT0gLTEpIHtcclxuXHRcdFx0c3RhcnRDb3JuZXIgPSAwO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZ1bmN0aW9uIGNvcm5lckF0KGluZGV4KSB7XHJcblx0XHRcdHJldHVybiBjb3JuZXJzWyhzdGFydENvcm5lciArIGluZGV4KSAlIDRdO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIERyYXcgcmVjdGFuZ2xlIGZyb20gJ3N0YXJ0Q29ybmVyJ1xyXG5cdFx0dmFyIGNvcm5lciA9IGNvcm5lckF0KDApO1xyXG5cdFx0Y3R4Lm1vdmVUbyhjb3JuZXJbMF0sIGNvcm5lclsxXSk7XHJcblxyXG5cdFx0Zm9yICh2YXIgaSA9IDE7IGkgPCA0OyBpKyspIHtcclxuXHRcdFx0Y29ybmVyID0gY29ybmVyQXQoaSk7XHJcblx0XHRcdGN0eC5saW5lVG8oY29ybmVyWzBdLCBjb3JuZXJbMV0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGN0eC5maWxsKCk7XHJcblx0XHRpZiAoYm9yZGVyV2lkdGgpIHtcclxuXHRcdFx0Y3R4LnN0cm9rZSgpO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdGhlaWdodDogZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xyXG5cdFx0cmV0dXJuIHZtLmJhc2UgLSB2bS55O1xyXG5cdH0sXHJcblxyXG5cdGluUmFuZ2U6IGZ1bmN0aW9uKG1vdXNlWCwgbW91c2VZKSB7XHJcblx0XHR2YXIgaW5SYW5nZSA9IGZhbHNlO1xyXG5cclxuXHRcdGlmICh0aGlzLl92aWV3KSB7XHJcblx0XHRcdHZhciBib3VuZHMgPSBnZXRCYXJCb3VuZHModGhpcyk7XHJcblx0XHRcdGluUmFuZ2UgPSBtb3VzZVggPj0gYm91bmRzLmxlZnQgJiYgbW91c2VYIDw9IGJvdW5kcy5yaWdodCAmJiBtb3VzZVkgPj0gYm91bmRzLnRvcCAmJiBtb3VzZVkgPD0gYm91bmRzLmJvdHRvbTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gaW5SYW5nZTtcclxuXHR9LFxyXG5cclxuXHRpbkxhYmVsUmFuZ2U6IGZ1bmN0aW9uKG1vdXNlWCwgbW91c2VZKSB7XHJcblx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0aWYgKCFtZS5fdmlldykge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGluUmFuZ2UgPSBmYWxzZTtcclxuXHRcdHZhciBib3VuZHMgPSBnZXRCYXJCb3VuZHMobWUpO1xyXG5cclxuXHRcdGlmIChpc1ZlcnRpY2FsKG1lKSkge1xyXG5cdFx0XHRpblJhbmdlID0gbW91c2VYID49IGJvdW5kcy5sZWZ0ICYmIG1vdXNlWCA8PSBib3VuZHMucmlnaHQ7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpblJhbmdlID0gbW91c2VZID49IGJvdW5kcy50b3AgJiYgbW91c2VZIDw9IGJvdW5kcy5ib3R0b207XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGluUmFuZ2U7XHJcblx0fSxcclxuXHJcblx0aW5YUmFuZ2U6IGZ1bmN0aW9uKG1vdXNlWCkge1xyXG5cdFx0dmFyIGJvdW5kcyA9IGdldEJhckJvdW5kcyh0aGlzKTtcclxuXHRcdHJldHVybiBtb3VzZVggPj0gYm91bmRzLmxlZnQgJiYgbW91c2VYIDw9IGJvdW5kcy5yaWdodDtcclxuXHR9LFxyXG5cclxuXHRpbllSYW5nZTogZnVuY3Rpb24obW91c2VZKSB7XHJcblx0XHR2YXIgYm91bmRzID0gZ2V0QmFyQm91bmRzKHRoaXMpO1xyXG5cdFx0cmV0dXJuIG1vdXNlWSA+PSBib3VuZHMudG9wICYmIG1vdXNlWSA8PSBib3VuZHMuYm90dG9tO1xyXG5cdH0sXHJcblxyXG5cdGdldENlbnRlclBvaW50OiBmdW5jdGlvbigpIHtcclxuXHRcdHZhciB2bSA9IHRoaXMuX3ZpZXc7XHJcblx0XHR2YXIgeCwgeTtcclxuXHRcdGlmIChpc1ZlcnRpY2FsKHRoaXMpKSB7XHJcblx0XHRcdHggPSB2bS54O1xyXG5cdFx0XHR5ID0gKHZtLnkgKyB2bS5iYXNlKSAvIDI7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR4ID0gKHZtLnggKyB2bS5iYXNlKSAvIDI7XHJcblx0XHRcdHkgPSB2bS55O1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB7eDogeCwgeTogeX07XHJcblx0fSxcclxuXHJcblx0Z2V0QXJlYTogZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xyXG5cdFx0cmV0dXJuIHZtLndpZHRoICogTWF0aC5hYnModm0ueSAtIHZtLmJhc2UpO1xyXG5cdH0sXHJcblxyXG5cdHRvb2x0aXBQb3NpdGlvbjogZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgdm0gPSB0aGlzLl92aWV3O1xyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0eDogdm0ueCxcclxuXHRcdFx0eTogdm0ueVxyXG5cdFx0fTtcclxuXHR9XHJcbn0pO1xyXG5cclxufSx7XCIyNlwiOjI2LFwiMjdcIjoyN31dLDQxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7fTtcclxubW9kdWxlLmV4cG9ydHMuQXJjID0gcmVxdWlyZSgzNyk7XHJcbm1vZHVsZS5leHBvcnRzLkxpbmUgPSByZXF1aXJlKDM4KTtcclxubW9kdWxlLmV4cG9ydHMuUG9pbnQgPSByZXF1aXJlKDM5KTtcclxubW9kdWxlLmV4cG9ydHMuUmVjdGFuZ2xlID0gcmVxdWlyZSg0MCk7XHJcblxyXG59LHtcIjM3XCI6MzcsXCIzOFwiOjM4LFwiMzlcIjozOSxcIjQwXCI6NDB9XSw0MjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Myk7XHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBDaGFydC5oZWxwZXJzLmNhbnZhc1xyXG4gKi9cclxudmFyIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHtcclxuXHQvKipcclxuXHQgKiBDbGVhcnMgdGhlIGVudGlyZSBjYW52YXMgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gYGNoYXJ0YC5cclxuXHQgKiBAcGFyYW0ge0NoYXJ0fSBjaGFydCAtIFRoZSBjaGFydCBmb3Igd2hpY2ggdG8gY2xlYXIgdGhlIGNhbnZhcy5cclxuXHQgKi9cclxuXHRjbGVhcjogZnVuY3Rpb24oY2hhcnQpIHtcclxuXHRcdGNoYXJ0LmN0eC5jbGVhclJlY3QoMCwgMCwgY2hhcnQud2lkdGgsIGNoYXJ0LmhlaWdodCk7XHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIFwicGF0aFwiIGZvciBhIHJlY3RhbmdsZSB3aXRoIHJvdW5kZWQgY29ybmVycyBhdCBwb3NpdGlvbiAoeCwgeSkgd2l0aCBhXHJcblx0ICogZ2l2ZW4gc2l6ZSAod2lkdGgsIGhlaWdodCkgYW5kIHRoZSBzYW1lIGByYWRpdXNgIGZvciBhbGwgY29ybmVycy5cclxuXHQgKiBAcGFyYW0ge0NhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY3R4IC0gVGhlIGNhbnZhcyAyRCBDb250ZXh0LlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB4IC0gVGhlIHggYXhpcyBvZiB0aGUgY29vcmRpbmF0ZSBmb3IgdGhlIHJlY3RhbmdsZSBzdGFydGluZyBwb2ludC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0geSAtIFRoZSB5IGF4aXMgb2YgdGhlIGNvb3JkaW5hdGUgZm9yIHRoZSByZWN0YW5nbGUgc3RhcnRpbmcgcG9pbnQuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHJlY3RhbmdsZSdzIHdpZHRoLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgcmVjdGFuZ2xlJ3MgaGVpZ2h0LlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSByYWRpdXMgLSBUaGUgcm91bmRlZCBhbW91bnQgKGluIHBpeGVscykgZm9yIHRoZSBmb3VyIGNvcm5lcnMuXHJcblx0ICogQHRvZG8gaGFuZGxlIGByYWRpdXNgIGFzIHRvcC1sZWZ0LCB0b3AtcmlnaHQsIGJvdHRvbS1yaWdodCwgYm90dG9tLWxlZnQgYXJyYXkvb2JqZWN0P1xyXG5cdCAqL1xyXG5cdHJvdW5kZWRSZWN0OiBmdW5jdGlvbihjdHgsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHJhZGl1cykge1xyXG5cdFx0aWYgKHJhZGl1cykge1xyXG5cdFx0XHQvLyBOT1RFKFNCKSBgZXBzaWxvbmAgaGVscHMgdG8gcHJldmVudCBtaW5vciBhcnRpZmFjdHMgYXBwZWFyaW5nXHJcblx0XHRcdC8vIG9uIENocm9tZSB3aGVuIGByYCBpcyBleGFjdGx5IGhhbGYgdGhlIGhlaWdodCBvciB0aGUgd2lkdGguXHJcblx0XHRcdHZhciBlcHNpbG9uID0gMC4wMDAwMDAxO1xyXG5cdFx0XHR2YXIgciA9IE1hdGgubWluKHJhZGl1cywgKGhlaWdodCAvIDIpIC0gZXBzaWxvbiwgKHdpZHRoIC8gMikgLSBlcHNpbG9uKTtcclxuXHJcblx0XHRcdGN0eC5tb3ZlVG8oeCArIHIsIHkpO1xyXG5cdFx0XHRjdHgubGluZVRvKHggKyB3aWR0aCAtIHIsIHkpO1xyXG5cdFx0XHRjdHguYXJjVG8oeCArIHdpZHRoLCB5LCB4ICsgd2lkdGgsIHkgKyByLCByKTtcclxuXHRcdFx0Y3R4LmxpbmVUbyh4ICsgd2lkdGgsIHkgKyBoZWlnaHQgLSByKTtcclxuXHRcdFx0Y3R4LmFyY1RvKHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCArIHdpZHRoIC0gciwgeSArIGhlaWdodCwgcik7XHJcblx0XHRcdGN0eC5saW5lVG8oeCArIHIsIHkgKyBoZWlnaHQpO1xyXG5cdFx0XHRjdHguYXJjVG8oeCwgeSArIGhlaWdodCwgeCwgeSArIGhlaWdodCAtIHIsIHIpO1xyXG5cdFx0XHRjdHgubGluZVRvKHgsIHkgKyByKTtcclxuXHRcdFx0Y3R4LmFyY1RvKHgsIHksIHggKyByLCB5LCByKTtcclxuXHRcdFx0Y3R4LmNsb3NlUGF0aCgpO1xyXG5cdFx0XHRjdHgubW92ZVRvKHgsIHkpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y3R4LnJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0ZHJhd1BvaW50OiBmdW5jdGlvbihjdHgsIHN0eWxlLCByYWRpdXMsIHgsIHksIHJvdGF0aW9uKSB7XHJcblx0XHR2YXIgdHlwZSwgZWRnZUxlbmd0aCwgeE9mZnNldCwgeU9mZnNldCwgaGVpZ2h0LCBzaXplO1xyXG5cdFx0cm90YXRpb24gPSByb3RhdGlvbiB8fCAwO1xyXG5cclxuXHRcdGlmIChzdHlsZSAmJiB0eXBlb2Ygc3R5bGUgPT09ICdvYmplY3QnKSB7XHJcblx0XHRcdHR5cGUgPSBzdHlsZS50b1N0cmluZygpO1xyXG5cdFx0XHRpZiAodHlwZSA9PT0gJ1tvYmplY3QgSFRNTEltYWdlRWxlbWVudF0nIHx8IHR5cGUgPT09ICdbb2JqZWN0IEhUTUxDYW52YXNFbGVtZW50XScpIHtcclxuXHRcdFx0XHRjdHguZHJhd0ltYWdlKHN0eWxlLCB4IC0gc3R5bGUud2lkdGggLyAyLCB5IC0gc3R5bGUuaGVpZ2h0IC8gMiwgc3R5bGUud2lkdGgsIHN0eWxlLmhlaWdodCk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGlzTmFOKHJhZGl1cykgfHwgcmFkaXVzIDw9IDApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGN0eC5zYXZlKCk7XHJcblx0XHRjdHgudHJhbnNsYXRlKHgsIHkpO1xyXG5cdFx0Y3R4LnJvdGF0ZShyb3RhdGlvbiAqIE1hdGguUEkgLyAxODApO1xyXG5cdFx0Y3R4LmJlZ2luUGF0aCgpO1xyXG5cclxuXHRcdHN3aXRjaCAoc3R5bGUpIHtcclxuXHRcdC8vIERlZmF1bHQgaW5jbHVkZXMgY2lyY2xlXHJcblx0XHRkZWZhdWx0OlxyXG5cdFx0XHRjdHguYXJjKDAsIDAsIHJhZGl1cywgMCwgTWF0aC5QSSAqIDIpO1xyXG5cdFx0XHRjdHguY2xvc2VQYXRoKCk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0Y2FzZSAndHJpYW5nbGUnOlxyXG5cdFx0XHRlZGdlTGVuZ3RoID0gMyAqIHJhZGl1cyAvIE1hdGguc3FydCgzKTtcclxuXHRcdFx0aGVpZ2h0ID0gZWRnZUxlbmd0aCAqIE1hdGguc3FydCgzKSAvIDI7XHJcblx0XHRcdGN0eC5tb3ZlVG8oLWVkZ2VMZW5ndGggLyAyLCBoZWlnaHQgLyAzKTtcclxuXHRcdFx0Y3R4LmxpbmVUbyhlZGdlTGVuZ3RoIC8gMiwgaGVpZ2h0IC8gMyk7XHJcblx0XHRcdGN0eC5saW5lVG8oMCwgLTIgKiBoZWlnaHQgLyAzKTtcclxuXHRcdFx0Y3R4LmNsb3NlUGF0aCgpO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgJ3JlY3QnOlxyXG5cdFx0XHRzaXplID0gMSAvIE1hdGguU1FSVDIgKiByYWRpdXM7XHJcblx0XHRcdGN0eC5yZWN0KC1zaXplLCAtc2l6ZSwgMiAqIHNpemUsIDIgKiBzaXplKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlICdyZWN0Um91bmRlZCc6XHJcblx0XHRcdHZhciBvZmZzZXQgPSByYWRpdXMgLyBNYXRoLlNRUlQyO1xyXG5cdFx0XHR2YXIgbGVmdFggPSAtb2Zmc2V0O1xyXG5cdFx0XHR2YXIgdG9wWSA9IC1vZmZzZXQ7XHJcblx0XHRcdHZhciBzaWRlU2l6ZSA9IE1hdGguU1FSVDIgKiByYWRpdXM7XHJcblxyXG5cdFx0XHQvLyBOT1RFKFNCKSB0aGUgcm91bmRlZCByZWN0IGltcGxlbWVudGF0aW9uIGNoYW5nZWQgdG8gdXNlIGBhcmNUb2BcclxuXHRcdFx0Ly8gaW5zdGVhZCBvZiBgcXVhZHJhdGljQ3VydmVUb2Agc2luY2UgaXQgZ2VuZXJhdGVzIGJldHRlciByZXN1bHRzXHJcblx0XHRcdC8vIHdoZW4gcmVjdCBpcyBhbG1vc3QgYSBjaXJjbGUuIDAuNDI1IChpbnN0ZWFkIG9mIDAuNSkgcHJvZHVjZXNcclxuXHRcdFx0Ly8gcmVzdWx0cyB2aXN1YWxseSBjbG9zZXIgdG8gdGhlIHByZXZpb3VzIGltcGwuXHJcblx0XHRcdHRoaXMucm91bmRlZFJlY3QoY3R4LCBsZWZ0WCwgdG9wWSwgc2lkZVNpemUsIHNpZGVTaXplLCByYWRpdXMgKiAwLjQyNSk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0Y2FzZSAncmVjdFJvdCc6XHJcblx0XHRcdHNpemUgPSAxIC8gTWF0aC5TUVJUMiAqIHJhZGl1cztcclxuXHRcdFx0Y3R4Lm1vdmVUbygtc2l6ZSwgMCk7XHJcblx0XHRcdGN0eC5saW5lVG8oMCwgc2l6ZSk7XHJcblx0XHRcdGN0eC5saW5lVG8oc2l6ZSwgMCk7XHJcblx0XHRcdGN0eC5saW5lVG8oMCwgLXNpemUpO1xyXG5cdFx0XHRjdHguY2xvc2VQYXRoKCk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0Y2FzZSAnY3Jvc3MnOlxyXG5cdFx0XHRjdHgubW92ZVRvKDAsIHJhZGl1cyk7XHJcblx0XHRcdGN0eC5saW5lVG8oMCwgLXJhZGl1cyk7XHJcblx0XHRcdGN0eC5tb3ZlVG8oLXJhZGl1cywgMCk7XHJcblx0XHRcdGN0eC5saW5lVG8ocmFkaXVzLCAwKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlICdjcm9zc1JvdCc6XHJcblx0XHRcdHhPZmZzZXQgPSBNYXRoLmNvcyhNYXRoLlBJIC8gNCkgKiByYWRpdXM7XHJcblx0XHRcdHlPZmZzZXQgPSBNYXRoLnNpbihNYXRoLlBJIC8gNCkgKiByYWRpdXM7XHJcblx0XHRcdGN0eC5tb3ZlVG8oLXhPZmZzZXQsIC15T2Zmc2V0KTtcclxuXHRcdFx0Y3R4LmxpbmVUbyh4T2Zmc2V0LCB5T2Zmc2V0KTtcclxuXHRcdFx0Y3R4Lm1vdmVUbygteE9mZnNldCwgeU9mZnNldCk7XHJcblx0XHRcdGN0eC5saW5lVG8oeE9mZnNldCwgLXlPZmZzZXQpO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgJ3N0YXInOlxyXG5cdFx0XHRjdHgubW92ZVRvKDAsIHJhZGl1cyk7XHJcblx0XHRcdGN0eC5saW5lVG8oMCwgLXJhZGl1cyk7XHJcblx0XHRcdGN0eC5tb3ZlVG8oLXJhZGl1cywgMCk7XHJcblx0XHRcdGN0eC5saW5lVG8ocmFkaXVzLCAwKTtcclxuXHRcdFx0eE9mZnNldCA9IE1hdGguY29zKE1hdGguUEkgLyA0KSAqIHJhZGl1cztcclxuXHRcdFx0eU9mZnNldCA9IE1hdGguc2luKE1hdGguUEkgLyA0KSAqIHJhZGl1cztcclxuXHRcdFx0Y3R4Lm1vdmVUbygteE9mZnNldCwgLXlPZmZzZXQpO1xyXG5cdFx0XHRjdHgubGluZVRvKHhPZmZzZXQsIHlPZmZzZXQpO1xyXG5cdFx0XHRjdHgubW92ZVRvKC14T2Zmc2V0LCB5T2Zmc2V0KTtcclxuXHRcdFx0Y3R4LmxpbmVUbyh4T2Zmc2V0LCAteU9mZnNldCk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0Y2FzZSAnbGluZSc6XHJcblx0XHRcdGN0eC5tb3ZlVG8oLXJhZGl1cywgMCk7XHJcblx0XHRcdGN0eC5saW5lVG8ocmFkaXVzLCAwKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlICdkYXNoJzpcclxuXHRcdFx0Y3R4Lm1vdmVUbygwLCAwKTtcclxuXHRcdFx0Y3R4LmxpbmVUbyhyYWRpdXMsIDApO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdH1cclxuXHJcblx0XHRjdHguZmlsbCgpO1xyXG5cdFx0Y3R4LnN0cm9rZSgpO1xyXG5cdFx0Y3R4LnJlc3RvcmUoKTtcclxuXHR9LFxyXG5cclxuXHRjbGlwQXJlYTogZnVuY3Rpb24oY3R4LCBhcmVhKSB7XHJcblx0XHRjdHguc2F2ZSgpO1xyXG5cdFx0Y3R4LmJlZ2luUGF0aCgpO1xyXG5cdFx0Y3R4LnJlY3QoYXJlYS5sZWZ0LCBhcmVhLnRvcCwgYXJlYS5yaWdodCAtIGFyZWEubGVmdCwgYXJlYS5ib3R0b20gLSBhcmVhLnRvcCk7XHJcblx0XHRjdHguY2xpcCgpO1xyXG5cdH0sXHJcblxyXG5cdHVuY2xpcEFyZWE6IGZ1bmN0aW9uKGN0eCkge1xyXG5cdFx0Y3R4LnJlc3RvcmUoKTtcclxuXHR9LFxyXG5cclxuXHRsaW5lVG86IGZ1bmN0aW9uKGN0eCwgcHJldmlvdXMsIHRhcmdldCwgZmxpcCkge1xyXG5cdFx0aWYgKHRhcmdldC5zdGVwcGVkTGluZSkge1xyXG5cdFx0XHRpZiAoKHRhcmdldC5zdGVwcGVkTGluZSA9PT0gJ2FmdGVyJyAmJiAhZmxpcCkgfHwgKHRhcmdldC5zdGVwcGVkTGluZSAhPT0gJ2FmdGVyJyAmJiBmbGlwKSkge1xyXG5cdFx0XHRcdGN0eC5saW5lVG8ocHJldmlvdXMueCwgdGFyZ2V0LnkpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGN0eC5saW5lVG8odGFyZ2V0LngsIHByZXZpb3VzLnkpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGN0eC5saW5lVG8odGFyZ2V0LngsIHRhcmdldC55KTtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICghdGFyZ2V0LnRlbnNpb24pIHtcclxuXHRcdFx0Y3R4LmxpbmVUbyh0YXJnZXQueCwgdGFyZ2V0LnkpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Y3R4LmJlemllckN1cnZlVG8oXHJcblx0XHRcdGZsaXAgPyBwcmV2aW91cy5jb250cm9sUG9pbnRQcmV2aW91c1ggOiBwcmV2aW91cy5jb250cm9sUG9pbnROZXh0WCxcclxuXHRcdFx0ZmxpcCA/IHByZXZpb3VzLmNvbnRyb2xQb2ludFByZXZpb3VzWSA6IHByZXZpb3VzLmNvbnRyb2xQb2ludE5leHRZLFxyXG5cdFx0XHRmbGlwID8gdGFyZ2V0LmNvbnRyb2xQb2ludE5leHRYIDogdGFyZ2V0LmNvbnRyb2xQb2ludFByZXZpb3VzWCxcclxuXHRcdFx0ZmxpcCA/IHRhcmdldC5jb250cm9sUG9pbnROZXh0WSA6IHRhcmdldC5jb250cm9sUG9pbnRQcmV2aW91c1ksXHJcblx0XHRcdHRhcmdldC54LFxyXG5cdFx0XHR0YXJnZXQueSk7XHJcblx0fVxyXG59O1xyXG5cclxuLy8gREVQUkVDQVRJT05TXHJcblxyXG4vKipcclxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBDaGFydC5oZWxwZXJzLmNhbnZhcy5jbGVhciBpbnN0ZWFkLlxyXG4gKiBAbmFtZXNwYWNlIENoYXJ0LmhlbHBlcnMuY2xlYXJcclxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjcuMFxyXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5oZWxwZXJzLmNsZWFyID0gZXhwb3J0cy5jbGVhcjtcclxuXHJcbi8qKlxyXG4gKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdXNlIENoYXJ0LmhlbHBlcnMuY2FudmFzLnJvdW5kZWRSZWN0IGluc3RlYWQuXHJcbiAqIEBuYW1lc3BhY2UgQ2hhcnQuaGVscGVycy5kcmF3Um91bmRlZFJlY3RhbmdsZVxyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNy4wXHJcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcclxuICogQHByaXZhdGVcclxuICovXHJcbmhlbHBlcnMuZHJhd1JvdW5kZWRSZWN0YW5nbGUgPSBmdW5jdGlvbihjdHgpIHtcclxuXHRjdHguYmVnaW5QYXRoKCk7XHJcblx0ZXhwb3J0cy5yb3VuZGVkUmVjdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xyXG59O1xyXG5cclxufSx7XCI0M1wiOjQzfV0sNDM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBDaGFydC5oZWxwZXJzXHJcbiAqL1xyXG52YXIgaGVscGVycyA9IHtcclxuXHQvKipcclxuXHQgKiBBbiBlbXB0eSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgZm9yIG9wdGlvbmFsIGNhbGxiYWNrLlxyXG5cdCAqL1xyXG5cdG5vb3A6IGZ1bmN0aW9uKCkge30sXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgYSB1bmlxdWUgaWQsIHNlcXVlbnRpYWxseSBnZW5lcmF0ZWQgZnJvbSBhIGdsb2JhbCB2YXJpYWJsZS5cclxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfVxyXG5cdCAqIEBmdW5jdGlvblxyXG5cdCAqL1xyXG5cdHVpZDogKGZ1bmN0aW9uKCkge1xyXG5cdFx0dmFyIGlkID0gMDtcclxuXHRcdHJldHVybiBmdW5jdGlvbigpIHtcclxuXHRcdFx0cmV0dXJuIGlkKys7XHJcblx0XHR9O1xyXG5cdH0oKSksXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIG5laXRoZXIgbnVsbCBub3IgdW5kZWZpbmVkLCBlbHNlIHJldHVybnMgZmFsc2UuXHJcblx0ICogQHBhcmFtIHsqfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB0ZXN0LlxyXG5cdCAqIEByZXR1cm5zIHtCb29sZWFufVxyXG5cdCAqIEBzaW5jZSAyLjcuMFxyXG5cdCAqL1xyXG5cdGlzTnVsbE9yVW5kZWY6IGZ1bmN0aW9uKHZhbHVlKSB7XHJcblx0XHRyZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJztcclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSByZXR1cm5zIGZhbHNlLlxyXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuXHQgKiBAZnVuY3Rpb25cclxuXHQgKi9cclxuXHRpc0FycmF5OiBBcnJheS5pc0FycmF5ID8gQXJyYXkuaXNBcnJheSA6IGZ1bmN0aW9uKHZhbHVlKSB7XHJcblx0XHRyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QgKGV4Y2x1ZGluZyBudWxsKSwgZWxzZSByZXR1cm5zIGZhbHNlLlxyXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdGVzdC5cclxuXHQgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuXHQgKiBAc2luY2UgMi43LjBcclxuXHQgKi9cclxuXHRpc09iamVjdDogZnVuY3Rpb24odmFsdWUpIHtcclxuXHRcdHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJztcclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGB2YWx1ZWAgaWYgZGVmaW5lZCwgZWxzZSByZXR1cm5zIGBkZWZhdWx0VmFsdWVgLlxyXG5cdCAqIEBwYXJhbSB7Kn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gcmV0dXJuIGlmIGRlZmluZWQuXHJcblx0ICogQHBhcmFtIHsqfSBkZWZhdWx0VmFsdWUgLSBUaGUgdmFsdWUgdG8gcmV0dXJuIGlmIGB2YWx1ZWAgaXMgdW5kZWZpbmVkLlxyXG5cdCAqIEByZXR1cm5zIHsqfVxyXG5cdCAqL1xyXG5cdHZhbHVlT3JEZWZhdWx0OiBmdW5jdGlvbih2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XHJcblx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRWYWx1ZSA6IHZhbHVlO1xyXG5cdH0sXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybnMgdmFsdWUgYXQgdGhlIGdpdmVuIGBpbmRleGAgaW4gYXJyYXkgaWYgZGVmaW5lZCwgZWxzZSByZXR1cm5zIGBkZWZhdWx0VmFsdWVgLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlIC0gVGhlIGFycmF5IHRvIGxvb2t1cCBmb3IgdmFsdWUgYXQgYGluZGV4YC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggaW4gYHZhbHVlYCB0byBsb29rdXAgZm9yIHZhbHVlLlxyXG5cdCAqIEBwYXJhbSB7Kn0gZGVmYXVsdFZhbHVlIC0gVGhlIHZhbHVlIHRvIHJldHVybiBpZiBgdmFsdWVbaW5kZXhdYCBpcyB1bmRlZmluZWQuXHJcblx0ICogQHJldHVybnMgeyp9XHJcblx0ICovXHJcblx0dmFsdWVBdEluZGV4T3JEZWZhdWx0OiBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGRlZmF1bHRWYWx1ZSkge1xyXG5cdFx0cmV0dXJuIGhlbHBlcnMudmFsdWVPckRlZmF1bHQoaGVscGVycy5pc0FycmF5KHZhbHVlKSA/IHZhbHVlW2luZGV4XSA6IHZhbHVlLCBkZWZhdWx0VmFsdWUpO1xyXG5cdH0sXHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGxzIGBmbmAgd2l0aCB0aGUgZ2l2ZW4gYGFyZ3NgIGluIHRoZSBzY29wZSBkZWZpbmVkIGJ5IGB0aGlzQXJnYCBhbmQgcmV0dXJucyB0aGVcclxuXHQgKiB2YWx1ZSByZXR1cm5lZCBieSBgZm5gLiBJZiBgZm5gIGlzIG5vdCBhIGZ1bmN0aW9uLCB0aGlzIG1ldGhvZCByZXR1cm5zIHVuZGVmaW5lZC5cclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIFRoZSBmdW5jdGlvbiB0byBjYWxsLlxyXG5cdCAqIEBwYXJhbSB7QXJyYXl8dW5kZWZpbmVkfG51bGx9IGFyZ3MgLSBUaGUgYXJndW1lbnRzIHdpdGggd2hpY2ggYGZuYCBzaG91bGQgYmUgY2FsbGVkLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbdGhpc0FyZ10gLSBUaGUgdmFsdWUgb2YgYHRoaXNgIHByb3ZpZGVkIGZvciB0aGUgY2FsbCB0byBgZm5gLlxyXG5cdCAqIEByZXR1cm5zIHsqfVxyXG5cdCAqL1xyXG5cdGNhbGxiYWNrOiBmdW5jdGlvbihmbiwgYXJncywgdGhpc0FyZykge1xyXG5cdFx0aWYgKGZuICYmIHR5cGVvZiBmbi5jYWxsID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdHJldHVybiBmbi5hcHBseSh0aGlzQXJnLCBhcmdzKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBOb3RlKFNCKSBmb3IgcGVyZm9ybWFuY2Ugc2FrZSwgdGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIGxvb3BhYmxlIHR5cGVcclxuXHQgKiBpcyB1bmtub3duIG9yIGluIG5vbmUgaW50ZW5zaXZlIGNvZGUgKG5vdCBjYWxsZWQgb2Z0ZW4gYW5kIHNtYWxsIGxvb3BhYmxlKS4gRWxzZVxyXG5cdCAqIGl0J3MgcHJlZmVyYWJsZSB0byB1c2UgYSByZWd1bGFyIGZvcigpIGxvb3AgYW5kIHNhdmUgZXh0cmEgZnVuY3Rpb24gY2FsbHMuXHJcblx0ICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IGxvb3BhYmxlIC0gVGhlIG9iamVjdCBvciBhcnJheSB0byBiZSBpdGVyYXRlZC5cclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIFRoZSBmdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIGl0ZW0uXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFt0aGlzQXJnXSAtIFRoZSB2YWx1ZSBvZiBgdGhpc2AgcHJvdmlkZWQgZm9yIHRoZSBjYWxsIHRvIGBmbmAuXHJcblx0ICogQHBhcmFtIHtCb29sZWFufSBbcmV2ZXJzZV0gLSBJZiB0cnVlLCBpdGVyYXRlcyBiYWNrd2FyZCBvbiB0aGUgbG9vcGFibGUuXHJcblx0ICovXHJcblx0ZWFjaDogZnVuY3Rpb24obG9vcGFibGUsIGZuLCB0aGlzQXJnLCByZXZlcnNlKSB7XHJcblx0XHR2YXIgaSwgbGVuLCBrZXlzO1xyXG5cdFx0aWYgKGhlbHBlcnMuaXNBcnJheShsb29wYWJsZSkpIHtcclxuXHRcdFx0bGVuID0gbG9vcGFibGUubGVuZ3RoO1xyXG5cdFx0XHRpZiAocmV2ZXJzZSkge1xyXG5cdFx0XHRcdGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcblx0XHRcdFx0XHRmbi5jYWxsKHRoaXNBcmcsIGxvb3BhYmxlW2ldLCBpKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcblx0XHRcdFx0XHRmbi5jYWxsKHRoaXNBcmcsIGxvb3BhYmxlW2ldLCBpKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSBpZiAoaGVscGVycy5pc09iamVjdChsb29wYWJsZSkpIHtcclxuXHRcdFx0a2V5cyA9IE9iamVjdC5rZXlzKGxvb3BhYmxlKTtcclxuXHRcdFx0bGVuID0ga2V5cy5sZW5ndGg7XHJcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG5cdFx0XHRcdGZuLmNhbGwodGhpc0FyZywgbG9vcGFibGVba2V5c1tpXV0sIGtleXNbaV0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0cnVlIGlmIHRoZSBgYTBgIGFuZCBgYTFgIGFycmF5cyBoYXZlIHRoZSBzYW1lIGNvbnRlbnQsIGVsc2UgcmV0dXJucyBmYWxzZS5cclxuXHQgKiBAc2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE0ODUzOTc0XHJcblx0ICogQHBhcmFtIHtBcnJheX0gYTAgLSBUaGUgYXJyYXkgdG8gY29tcGFyZVxyXG5cdCAqIEBwYXJhbSB7QXJyYXl9IGExIC0gVGhlIGFycmF5IHRvIGNvbXBhcmVcclxuXHQgKiBAcmV0dXJucyB7Qm9vbGVhbn1cclxuXHQgKi9cclxuXHRhcnJheUVxdWFsczogZnVuY3Rpb24oYTAsIGExKSB7XHJcblx0XHR2YXIgaSwgaWxlbiwgdjAsIHYxO1xyXG5cclxuXHRcdGlmICghYTAgfHwgIWExIHx8IGEwLmxlbmd0aCAhPT0gYTEubGVuZ3RoKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKGkgPSAwLCBpbGVuID0gYTAubGVuZ3RoOyBpIDwgaWxlbjsgKytpKSB7XHJcblx0XHRcdHYwID0gYTBbaV07XHJcblx0XHRcdHYxID0gYTFbaV07XHJcblxyXG5cdFx0XHRpZiAodjAgaW5zdGFuY2VvZiBBcnJheSAmJiB2MSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcblx0XHRcdFx0aWYgKCFoZWxwZXJzLmFycmF5RXF1YWxzKHYwLCB2MSkpIHtcclxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSBpZiAodjAgIT09IHYxKSB7XHJcblx0XHRcdFx0Ly8gTk9URTogdHdvIGRpZmZlcmVudCBvYmplY3QgaW5zdGFuY2VzIHdpbGwgbmV2ZXIgYmUgZXF1YWw6IHt4OjIwfSAhPSB7eDoyMH1cclxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgZGVlcCBjb3B5IG9mIGBzb3VyY2VgIHdpdGhvdXQga2VlcGluZyByZWZlcmVuY2VzIG9uIG9iamVjdHMgYW5kIGFycmF5cy5cclxuXHQgKiBAcGFyYW0geyp9IHNvdXJjZSAtIFRoZSB2YWx1ZSB0byBjbG9uZS5cclxuXHQgKiBAcmV0dXJucyB7Kn1cclxuXHQgKi9cclxuXHRjbG9uZTogZnVuY3Rpb24oc291cmNlKSB7XHJcblx0XHRpZiAoaGVscGVycy5pc0FycmF5KHNvdXJjZSkpIHtcclxuXHRcdFx0cmV0dXJuIHNvdXJjZS5tYXAoaGVscGVycy5jbG9uZSk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGhlbHBlcnMuaXNPYmplY3Qoc291cmNlKSkge1xyXG5cdFx0XHR2YXIgdGFyZ2V0ID0ge307XHJcblx0XHRcdHZhciBrZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcclxuXHRcdFx0dmFyIGtsZW4gPSBrZXlzLmxlbmd0aDtcclxuXHRcdFx0dmFyIGsgPSAwO1xyXG5cclxuXHRcdFx0Zm9yICg7IGsgPCBrbGVuOyArK2spIHtcclxuXHRcdFx0XHR0YXJnZXRba2V5c1trXV0gPSBoZWxwZXJzLmNsb25lKHNvdXJjZVtrZXlzW2tdXSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB0YXJnZXQ7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHNvdXJjZTtcclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgZGVmYXVsdCBtZXJnZXIgd2hlbiBDaGFydC5oZWxwZXJzLm1lcmdlIGlzIGNhbGxlZCB3aXRob3V0IG1lcmdlciBvcHRpb24uXHJcblx0ICogTm90ZShTQik6IHRoaXMgbWV0aG9kIGlzIGFsc28gdXNlZCBieSBjb25maWdNZXJnZSBhbmQgc2NhbGVNZXJnZSBhcyBmYWxsYmFjay5cclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqL1xyXG5cdF9tZXJnZXI6IGZ1bmN0aW9uKGtleSwgdGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpIHtcclxuXHRcdHZhciB0dmFsID0gdGFyZ2V0W2tleV07XHJcblx0XHR2YXIgc3ZhbCA9IHNvdXJjZVtrZXldO1xyXG5cclxuXHRcdGlmIChoZWxwZXJzLmlzT2JqZWN0KHR2YWwpICYmIGhlbHBlcnMuaXNPYmplY3Qoc3ZhbCkpIHtcclxuXHRcdFx0aGVscGVycy5tZXJnZSh0dmFsLCBzdmFsLCBvcHRpb25zKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRhcmdldFtrZXldID0gaGVscGVycy5jbG9uZShzdmFsKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBNZXJnZXMgc291cmNlW2tleV0gaW4gdGFyZ2V0W2tleV0gb25seSBpZiB0YXJnZXRba2V5XSBpcyB1bmRlZmluZWQuXHJcblx0ICogQHByaXZhdGVcclxuXHQgKi9cclxuXHRfbWVyZ2VySWY6IGZ1bmN0aW9uKGtleSwgdGFyZ2V0LCBzb3VyY2UpIHtcclxuXHRcdHZhciB0dmFsID0gdGFyZ2V0W2tleV07XHJcblx0XHR2YXIgc3ZhbCA9IHNvdXJjZVtrZXldO1xyXG5cclxuXHRcdGlmIChoZWxwZXJzLmlzT2JqZWN0KHR2YWwpICYmIGhlbHBlcnMuaXNPYmplY3Qoc3ZhbCkpIHtcclxuXHRcdFx0aGVscGVycy5tZXJnZUlmKHR2YWwsIHN2YWwpO1xyXG5cdFx0fSBlbHNlIGlmICghdGFyZ2V0Lmhhc093blByb3BlcnR5KGtleSkpIHtcclxuXHRcdFx0dGFyZ2V0W2tleV0gPSBoZWxwZXJzLmNsb25lKHN2YWwpO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlY3Vyc2l2ZWx5IGRlZXAgY29waWVzIGBzb3VyY2VgIHByb3BlcnRpZXMgaW50byBgdGFyZ2V0YCB3aXRoIHRoZSBnaXZlbiBgb3B0aW9uc2AuXHJcblx0ICogSU1QT1JUQU5UOiBgdGFyZ2V0YCBpcyBub3QgY2xvbmVkIGFuZCB3aWxsIGJlIHVwZGF0ZWQgd2l0aCBgc291cmNlYCBwcm9wZXJ0aWVzLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCBpbiB3aGljaCBhbGwgc291cmNlcyBhcmUgbWVyZ2VkIGludG8uXHJcblx0ICogQHBhcmFtIHtPYmplY3R8QXJyYXkoT2JqZWN0KX0gc291cmNlIC0gT2JqZWN0KHMpIHRvIG1lcmdlIGludG8gYHRhcmdldGAuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIE1lcmdpbmcgb3B0aW9uczpcclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0aW9ucy5tZXJnZXJdIC0gVGhlIG1lcmdlIG1ldGhvZCAoa2V5LCB0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucylcclxuXHQgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgYHRhcmdldGAgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdG1lcmdlOiBmdW5jdGlvbih0YXJnZXQsIHNvdXJjZSwgb3B0aW9ucykge1xyXG5cdFx0dmFyIHNvdXJjZXMgPSBoZWxwZXJzLmlzQXJyYXkoc291cmNlKSA/IHNvdXJjZSA6IFtzb3VyY2VdO1xyXG5cdFx0dmFyIGlsZW4gPSBzb3VyY2VzLmxlbmd0aDtcclxuXHRcdHZhciBtZXJnZSwgaSwga2V5cywga2xlbiwgaztcclxuXHJcblx0XHRpZiAoIWhlbHBlcnMuaXNPYmplY3QodGFyZ2V0KSkge1xyXG5cdFx0XHRyZXR1cm4gdGFyZ2V0O1xyXG5cdFx0fVxyXG5cclxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xyXG5cdFx0bWVyZ2UgPSBvcHRpb25zLm1lcmdlciB8fCBoZWxwZXJzLl9tZXJnZXI7XHJcblxyXG5cdFx0Zm9yIChpID0gMDsgaSA8IGlsZW47ICsraSkge1xyXG5cdFx0XHRzb3VyY2UgPSBzb3VyY2VzW2ldO1xyXG5cdFx0XHRpZiAoIWhlbHBlcnMuaXNPYmplY3Qoc291cmNlKSkge1xyXG5cdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRrZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcclxuXHRcdFx0Zm9yIChrID0gMCwga2xlbiA9IGtleXMubGVuZ3RoOyBrIDwga2xlbjsgKytrKSB7XHJcblx0XHRcdFx0bWVyZ2Uoa2V5c1trXSwgdGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnMpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBSZWN1cnNpdmVseSBkZWVwIGNvcGllcyBgc291cmNlYCBwcm9wZXJ0aWVzIGludG8gYHRhcmdldGAgKm9ubHkqIGlmIG5vdCBkZWZpbmVkIGluIHRhcmdldC5cclxuXHQgKiBJTVBPUlRBTlQ6IGB0YXJnZXRgIGlzIG5vdCBjbG9uZWQgYW5kIHdpbGwgYmUgdXBkYXRlZCB3aXRoIGBzb3VyY2VgIHByb3BlcnRpZXMuXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IGluIHdoaWNoIGFsbCBzb3VyY2VzIGFyZSBtZXJnZWQgaW50by5cclxuXHQgKiBAcGFyYW0ge09iamVjdHxBcnJheShPYmplY3QpfSBzb3VyY2UgLSBPYmplY3QocykgdG8gbWVyZ2UgaW50byBgdGFyZ2V0YC5cclxuXHQgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgYHRhcmdldGAgb2JqZWN0LlxyXG5cdCAqL1xyXG5cdG1lcmdlSWY6IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7XHJcblx0XHRyZXR1cm4gaGVscGVycy5tZXJnZSh0YXJnZXQsIHNvdXJjZSwge21lcmdlcjogaGVscGVycy5fbWVyZ2VySWZ9KTtcclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBBcHBsaWVzIHRoZSBjb250ZW50cyBvZiB0d28gb3IgbW9yZSBvYmplY3RzIHRvZ2V0aGVyIGludG8gdGhlIGZpcnN0IG9iamVjdC5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0IC0gVGhlIHRhcmdldCBvYmplY3QgaW4gd2hpY2ggYWxsIG9iamVjdHMgYXJlIG1lcmdlZCBpbnRvLlxyXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBhcmcxIC0gT2JqZWN0IGNvbnRhaW5pbmcgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIG1lcmdlIGluIHRhcmdldC5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gYXJnTiAtIEFkZGl0aW9uYWwgb2JqZWN0cyBjb250YWluaW5nIHByb3BlcnRpZXMgdG8gbWVyZ2UgaW4gdGFyZ2V0LlxyXG5cdCAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBgdGFyZ2V0YCBvYmplY3QuXHJcblx0ICovXHJcblx0ZXh0ZW5kOiBmdW5jdGlvbih0YXJnZXQpIHtcclxuXHRcdHZhciBzZXRGbiA9IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcclxuXHRcdFx0dGFyZ2V0W2tleV0gPSB2YWx1ZTtcclxuXHRcdH07XHJcblx0XHRmb3IgKHZhciBpID0gMSwgaWxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcclxuXHRcdFx0aGVscGVycy5lYWNoKGFyZ3VtZW50c1tpXSwgc2V0Rm4pO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIHRhcmdldDtcclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBCYXNpYyBqYXZhc2NyaXB0IGluaGVyaXRhbmNlIGJhc2VkIG9uIHRoZSBtb2RlbCBjcmVhdGVkIGluIEJhY2tib25lLmpzXHJcblx0ICovXHJcblx0aW5oZXJpdHM6IGZ1bmN0aW9uKGV4dGVuc2lvbnMpIHtcclxuXHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHR2YXIgQ2hhcnRFbGVtZW50ID0gKGV4dGVuc2lvbnMgJiYgZXh0ZW5zaW9ucy5oYXNPd25Qcm9wZXJ0eSgnY29uc3RydWN0b3InKSkgPyBleHRlbnNpb25zLmNvbnN0cnVjdG9yIDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdHJldHVybiBtZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG5cdFx0fTtcclxuXHJcblx0XHR2YXIgU3Vycm9nYXRlID0gZnVuY3Rpb24oKSB7XHJcblx0XHRcdHRoaXMuY29uc3RydWN0b3IgPSBDaGFydEVsZW1lbnQ7XHJcblx0XHR9O1xyXG5cclxuXHRcdFN1cnJvZ2F0ZS5wcm90b3R5cGUgPSBtZS5wcm90b3R5cGU7XHJcblx0XHRDaGFydEVsZW1lbnQucHJvdG90eXBlID0gbmV3IFN1cnJvZ2F0ZSgpO1xyXG5cdFx0Q2hhcnRFbGVtZW50LmV4dGVuZCA9IGhlbHBlcnMuaW5oZXJpdHM7XHJcblxyXG5cdFx0aWYgKGV4dGVuc2lvbnMpIHtcclxuXHRcdFx0aGVscGVycy5leHRlbmQoQ2hhcnRFbGVtZW50LnByb3RvdHlwZSwgZXh0ZW5zaW9ucyk7XHJcblx0XHR9XHJcblxyXG5cdFx0Q2hhcnRFbGVtZW50Ll9fc3VwZXJfXyA9IG1lLnByb3RvdHlwZTtcclxuXHRcdHJldHVybiBDaGFydEVsZW1lbnQ7XHJcblx0fVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBoZWxwZXJzO1xyXG5cclxuLy8gREVQUkVDQVRJT05TXHJcblxyXG4vKipcclxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBDaGFydC5oZWxwZXJzLmNhbGxiYWNrIGluc3RlYWQuXHJcbiAqIEBmdW5jdGlvbiBDaGFydC5oZWxwZXJzLmNhbGxDYWxsYmFja1xyXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuNi4wXHJcbiAqIEB0b2RvIHJlbW92ZSBhdCB2ZXJzaW9uIDNcclxuICogQHByaXZhdGVcclxuICovXHJcbmhlbHBlcnMuY2FsbENhbGxiYWNrID0gaGVscGVycy5jYWxsYmFjaztcclxuXHJcbi8qKlxyXG4gKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdXNlIEFycmF5LnByb3RvdHlwZS5pbmRleE9mIGluc3RlYWQuXHJcbiAqIEFycmF5LnByb3RvdHlwZS5pbmRleE9mIGNvbXBhdGliaWxpdHk6IENocm9tZSwgT3BlcmEsIFNhZmFyaSwgRkYxLjUrLCBJRTkrXHJcbiAqIEBmdW5jdGlvbiBDaGFydC5oZWxwZXJzLmluZGV4T2ZcclxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjcuMFxyXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5oZWxwZXJzLmluZGV4T2YgPSBmdW5jdGlvbihhcnJheSwgaXRlbSwgZnJvbUluZGV4KSB7XHJcblx0cmV0dXJuIEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYXJyYXksIGl0ZW0sIGZyb21JbmRleCk7XHJcbn07XHJcblxyXG4vKipcclxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBDaGFydC5oZWxwZXJzLnZhbHVlT3JEZWZhdWx0IGluc3RlYWQuXHJcbiAqIEBmdW5jdGlvbiBDaGFydC5oZWxwZXJzLmdldFZhbHVlT3JEZWZhdWx0XHJcbiAqIEBkZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi43LjBcclxuICogQHRvZG8gcmVtb3ZlIGF0IHZlcnNpb24gM1xyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuaGVscGVycy5nZXRWYWx1ZU9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQ7XHJcblxyXG4vKipcclxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBDaGFydC5oZWxwZXJzLnZhbHVlQXRJbmRleE9yRGVmYXVsdCBpbnN0ZWFkLlxyXG4gKiBAZnVuY3Rpb24gQ2hhcnQuaGVscGVycy5nZXRWYWx1ZUF0SW5kZXhPckRlZmF1bHRcclxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjcuMFxyXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5oZWxwZXJzLmdldFZhbHVlQXRJbmRleE9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0O1xyXG5cclxufSx7fV0sNDQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDMpO1xyXG5cclxuLyoqXHJcbiAqIEVhc2luZyBmdW5jdGlvbnMgYWRhcHRlZCBmcm9tIFJvYmVydCBQZW5uZXIncyBlYXNpbmcgZXF1YXRpb25zLlxyXG4gKiBAbmFtZXNwYWNlIENoYXJ0LmhlbHBlcnMuZWFzaW5nRWZmZWN0c1xyXG4gKiBAc2VlIGh0dHA6Ly93d3cucm9iZXJ0cGVubmVyLmNvbS9lYXNpbmcvXHJcbiAqL1xyXG52YXIgZWZmZWN0cyA9IHtcclxuXHRsaW5lYXI6IGZ1bmN0aW9uKHQpIHtcclxuXHRcdHJldHVybiB0O1xyXG5cdH0sXHJcblxyXG5cdGVhc2VJblF1YWQ6IGZ1bmN0aW9uKHQpIHtcclxuXHRcdHJldHVybiB0ICogdDtcclxuXHR9LFxyXG5cclxuXHRlYXNlT3V0UXVhZDogZnVuY3Rpb24odCkge1xyXG5cdFx0cmV0dXJuIC10ICogKHQgLSAyKTtcclxuXHR9LFxyXG5cclxuXHRlYXNlSW5PdXRRdWFkOiBmdW5jdGlvbih0KSB7XHJcblx0XHRpZiAoKHQgLz0gMC41KSA8IDEpIHtcclxuXHRcdFx0cmV0dXJuIDAuNSAqIHQgKiB0O1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIC0wLjUgKiAoKC0tdCkgKiAodCAtIDIpIC0gMSk7XHJcblx0fSxcclxuXHJcblx0ZWFzZUluQ3ViaWM6IGZ1bmN0aW9uKHQpIHtcclxuXHRcdHJldHVybiB0ICogdCAqIHQ7XHJcblx0fSxcclxuXHJcblx0ZWFzZU91dEN1YmljOiBmdW5jdGlvbih0KSB7XHJcblx0XHRyZXR1cm4gKHQgPSB0IC0gMSkgKiB0ICogdCArIDE7XHJcblx0fSxcclxuXHJcblx0ZWFzZUluT3V0Q3ViaWM6IGZ1bmN0aW9uKHQpIHtcclxuXHRcdGlmICgodCAvPSAwLjUpIDwgMSkge1xyXG5cdFx0XHRyZXR1cm4gMC41ICogdCAqIHQgKiB0O1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIDAuNSAqICgodCAtPSAyKSAqIHQgKiB0ICsgMik7XHJcblx0fSxcclxuXHJcblx0ZWFzZUluUXVhcnQ6IGZ1bmN0aW9uKHQpIHtcclxuXHRcdHJldHVybiB0ICogdCAqIHQgKiB0O1xyXG5cdH0sXHJcblxyXG5cdGVhc2VPdXRRdWFydDogZnVuY3Rpb24odCkge1xyXG5cdFx0cmV0dXJuIC0oKHQgPSB0IC0gMSkgKiB0ICogdCAqIHQgLSAxKTtcclxuXHR9LFxyXG5cclxuXHRlYXNlSW5PdXRRdWFydDogZnVuY3Rpb24odCkge1xyXG5cdFx0aWYgKCh0IC89IDAuNSkgPCAxKSB7XHJcblx0XHRcdHJldHVybiAwLjUgKiB0ICogdCAqIHQgKiB0O1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIC0wLjUgKiAoKHQgLT0gMikgKiB0ICogdCAqIHQgLSAyKTtcclxuXHR9LFxyXG5cclxuXHRlYXNlSW5RdWludDogZnVuY3Rpb24odCkge1xyXG5cdFx0cmV0dXJuIHQgKiB0ICogdCAqIHQgKiB0O1xyXG5cdH0sXHJcblxyXG5cdGVhc2VPdXRRdWludDogZnVuY3Rpb24odCkge1xyXG5cdFx0cmV0dXJuICh0ID0gdCAtIDEpICogdCAqIHQgKiB0ICogdCArIDE7XHJcblx0fSxcclxuXHJcblx0ZWFzZUluT3V0UXVpbnQ6IGZ1bmN0aW9uKHQpIHtcclxuXHRcdGlmICgodCAvPSAwLjUpIDwgMSkge1xyXG5cdFx0XHRyZXR1cm4gMC41ICogdCAqIHQgKiB0ICogdCAqIHQ7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gMC41ICogKCh0IC09IDIpICogdCAqIHQgKiB0ICogdCArIDIpO1xyXG5cdH0sXHJcblxyXG5cdGVhc2VJblNpbmU6IGZ1bmN0aW9uKHQpIHtcclxuXHRcdHJldHVybiAtTWF0aC5jb3ModCAqIChNYXRoLlBJIC8gMikpICsgMTtcclxuXHR9LFxyXG5cclxuXHRlYXNlT3V0U2luZTogZnVuY3Rpb24odCkge1xyXG5cdFx0cmV0dXJuIE1hdGguc2luKHQgKiAoTWF0aC5QSSAvIDIpKTtcclxuXHR9LFxyXG5cclxuXHRlYXNlSW5PdXRTaW5lOiBmdW5jdGlvbih0KSB7XHJcblx0XHRyZXR1cm4gLTAuNSAqIChNYXRoLmNvcyhNYXRoLlBJICogdCkgLSAxKTtcclxuXHR9LFxyXG5cclxuXHRlYXNlSW5FeHBvOiBmdW5jdGlvbih0KSB7XHJcblx0XHRyZXR1cm4gKHQgPT09IDApID8gMCA6IE1hdGgucG93KDIsIDEwICogKHQgLSAxKSk7XHJcblx0fSxcclxuXHJcblx0ZWFzZU91dEV4cG86IGZ1bmN0aW9uKHQpIHtcclxuXHRcdHJldHVybiAodCA9PT0gMSkgPyAxIDogLU1hdGgucG93KDIsIC0xMCAqIHQpICsgMTtcclxuXHR9LFxyXG5cclxuXHRlYXNlSW5PdXRFeHBvOiBmdW5jdGlvbih0KSB7XHJcblx0XHRpZiAodCA9PT0gMCkge1xyXG5cdFx0XHRyZXR1cm4gMDtcclxuXHRcdH1cclxuXHRcdGlmICh0ID09PSAxKSB7XHJcblx0XHRcdHJldHVybiAxO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCh0IC89IDAuNSkgPCAxKSB7XHJcblx0XHRcdHJldHVybiAwLjUgKiBNYXRoLnBvdygyLCAxMCAqICh0IC0gMSkpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIDAuNSAqICgtTWF0aC5wb3coMiwgLTEwICogLS10KSArIDIpO1xyXG5cdH0sXHJcblxyXG5cdGVhc2VJbkNpcmM6IGZ1bmN0aW9uKHQpIHtcclxuXHRcdGlmICh0ID49IDEpIHtcclxuXHRcdFx0cmV0dXJuIHQ7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gLShNYXRoLnNxcnQoMSAtIHQgKiB0KSAtIDEpO1xyXG5cdH0sXHJcblxyXG5cdGVhc2VPdXRDaXJjOiBmdW5jdGlvbih0KSB7XHJcblx0XHRyZXR1cm4gTWF0aC5zcXJ0KDEgLSAodCA9IHQgLSAxKSAqIHQpO1xyXG5cdH0sXHJcblxyXG5cdGVhc2VJbk91dENpcmM6IGZ1bmN0aW9uKHQpIHtcclxuXHRcdGlmICgodCAvPSAwLjUpIDwgMSkge1xyXG5cdFx0XHRyZXR1cm4gLTAuNSAqIChNYXRoLnNxcnQoMSAtIHQgKiB0KSAtIDEpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIDAuNSAqIChNYXRoLnNxcnQoMSAtICh0IC09IDIpICogdCkgKyAxKTtcclxuXHR9LFxyXG5cclxuXHRlYXNlSW5FbGFzdGljOiBmdW5jdGlvbih0KSB7XHJcblx0XHR2YXIgcyA9IDEuNzAxNTg7XHJcblx0XHR2YXIgcCA9IDA7XHJcblx0XHR2YXIgYSA9IDE7XHJcblx0XHRpZiAodCA9PT0gMCkge1xyXG5cdFx0XHRyZXR1cm4gMDtcclxuXHRcdH1cclxuXHRcdGlmICh0ID09PSAxKSB7XHJcblx0XHRcdHJldHVybiAxO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCFwKSB7XHJcblx0XHRcdHAgPSAwLjM7XHJcblx0XHR9XHJcblx0XHRpZiAoYSA8IDEpIHtcclxuXHRcdFx0YSA9IDE7XHJcblx0XHRcdHMgPSBwIC8gNDtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHMgPSBwIC8gKDIgKiBNYXRoLlBJKSAqIE1hdGguYXNpbigxIC8gYSk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gLShhICogTWF0aC5wb3coMiwgMTAgKiAodCAtPSAxKSkgKiBNYXRoLnNpbigodCAtIHMpICogKDIgKiBNYXRoLlBJKSAvIHApKTtcclxuXHR9LFxyXG5cclxuXHRlYXNlT3V0RWxhc3RpYzogZnVuY3Rpb24odCkge1xyXG5cdFx0dmFyIHMgPSAxLjcwMTU4O1xyXG5cdFx0dmFyIHAgPSAwO1xyXG5cdFx0dmFyIGEgPSAxO1xyXG5cdFx0aWYgKHQgPT09IDApIHtcclxuXHRcdFx0cmV0dXJuIDA7XHJcblx0XHR9XHJcblx0XHRpZiAodCA9PT0gMSkge1xyXG5cdFx0XHRyZXR1cm4gMTtcclxuXHRcdH1cclxuXHRcdGlmICghcCkge1xyXG5cdFx0XHRwID0gMC4zO1xyXG5cdFx0fVxyXG5cdFx0aWYgKGEgPCAxKSB7XHJcblx0XHRcdGEgPSAxO1xyXG5cdFx0XHRzID0gcCAvIDQ7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRzID0gcCAvICgyICogTWF0aC5QSSkgKiBNYXRoLmFzaW4oMSAvIGEpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGEgKiBNYXRoLnBvdygyLCAtMTAgKiB0KSAqIE1hdGguc2luKCh0IC0gcykgKiAoMiAqIE1hdGguUEkpIC8gcCkgKyAxO1xyXG5cdH0sXHJcblxyXG5cdGVhc2VJbk91dEVsYXN0aWM6IGZ1bmN0aW9uKHQpIHtcclxuXHRcdHZhciBzID0gMS43MDE1ODtcclxuXHRcdHZhciBwID0gMDtcclxuXHRcdHZhciBhID0gMTtcclxuXHRcdGlmICh0ID09PSAwKSB7XHJcblx0XHRcdHJldHVybiAwO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCh0IC89IDAuNSkgPT09IDIpIHtcclxuXHRcdFx0cmV0dXJuIDE7XHJcblx0XHR9XHJcblx0XHRpZiAoIXApIHtcclxuXHRcdFx0cCA9IDAuNDU7XHJcblx0XHR9XHJcblx0XHRpZiAoYSA8IDEpIHtcclxuXHRcdFx0YSA9IDE7XHJcblx0XHRcdHMgPSBwIC8gNDtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHMgPSBwIC8gKDIgKiBNYXRoLlBJKSAqIE1hdGguYXNpbigxIC8gYSk7XHJcblx0XHR9XHJcblx0XHRpZiAodCA8IDEpIHtcclxuXHRcdFx0cmV0dXJuIC0wLjUgKiAoYSAqIE1hdGgucG93KDIsIDEwICogKHQgLT0gMSkpICogTWF0aC5zaW4oKHQgLSBzKSAqICgyICogTWF0aC5QSSkgLyBwKSk7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gYSAqIE1hdGgucG93KDIsIC0xMCAqICh0IC09IDEpKSAqIE1hdGguc2luKCh0IC0gcykgKiAoMiAqIE1hdGguUEkpIC8gcCkgKiAwLjUgKyAxO1xyXG5cdH0sXHJcblx0ZWFzZUluQmFjazogZnVuY3Rpb24odCkge1xyXG5cdFx0dmFyIHMgPSAxLjcwMTU4O1xyXG5cdFx0cmV0dXJuIHQgKiB0ICogKChzICsgMSkgKiB0IC0gcyk7XHJcblx0fSxcclxuXHJcblx0ZWFzZU91dEJhY2s6IGZ1bmN0aW9uKHQpIHtcclxuXHRcdHZhciBzID0gMS43MDE1ODtcclxuXHRcdHJldHVybiAodCA9IHQgLSAxKSAqIHQgKiAoKHMgKyAxKSAqIHQgKyBzKSArIDE7XHJcblx0fSxcclxuXHJcblx0ZWFzZUluT3V0QmFjazogZnVuY3Rpb24odCkge1xyXG5cdFx0dmFyIHMgPSAxLjcwMTU4O1xyXG5cdFx0aWYgKCh0IC89IDAuNSkgPCAxKSB7XHJcblx0XHRcdHJldHVybiAwLjUgKiAodCAqIHQgKiAoKChzICo9ICgxLjUyNSkpICsgMSkgKiB0IC0gcykpO1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIDAuNSAqICgodCAtPSAyKSAqIHQgKiAoKChzICo9ICgxLjUyNSkpICsgMSkgKiB0ICsgcykgKyAyKTtcclxuXHR9LFxyXG5cclxuXHRlYXNlSW5Cb3VuY2U6IGZ1bmN0aW9uKHQpIHtcclxuXHRcdHJldHVybiAxIC0gZWZmZWN0cy5lYXNlT3V0Qm91bmNlKDEgLSB0KTtcclxuXHR9LFxyXG5cclxuXHRlYXNlT3V0Qm91bmNlOiBmdW5jdGlvbih0KSB7XHJcblx0XHRpZiAodCA8ICgxIC8gMi43NSkpIHtcclxuXHRcdFx0cmV0dXJuIDcuNTYyNSAqIHQgKiB0O1xyXG5cdFx0fVxyXG5cdFx0aWYgKHQgPCAoMiAvIDIuNzUpKSB7XHJcblx0XHRcdHJldHVybiA3LjU2MjUgKiAodCAtPSAoMS41IC8gMi43NSkpICogdCArIDAuNzU7XHJcblx0XHR9XHJcblx0XHRpZiAodCA8ICgyLjUgLyAyLjc1KSkge1xyXG5cdFx0XHRyZXR1cm4gNy41NjI1ICogKHQgLT0gKDIuMjUgLyAyLjc1KSkgKiB0ICsgMC45Mzc1O1xyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIDcuNTYyNSAqICh0IC09ICgyLjYyNSAvIDIuNzUpKSAqIHQgKyAwLjk4NDM3NTtcclxuXHR9LFxyXG5cclxuXHRlYXNlSW5PdXRCb3VuY2U6IGZ1bmN0aW9uKHQpIHtcclxuXHRcdGlmICh0IDwgMC41KSB7XHJcblx0XHRcdHJldHVybiBlZmZlY3RzLmVhc2VJbkJvdW5jZSh0ICogMikgKiAwLjU7XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gZWZmZWN0cy5lYXNlT3V0Qm91bmNlKHQgKiAyIC0gMSkgKiAwLjUgKyAwLjU7XHJcblx0fVxyXG59O1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblx0ZWZmZWN0czogZWZmZWN0c1xyXG59O1xyXG5cclxuLy8gREVQUkVDQVRJT05TXHJcblxyXG4vKipcclxuICogUHJvdmlkZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHVzZSBDaGFydC5oZWxwZXJzLmVhc2luZy5lZmZlY3RzIGluc3RlYWQuXHJcbiAqIEBmdW5jdGlvbiBDaGFydC5oZWxwZXJzLmVhc2luZ0VmZmVjdHNcclxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjcuMFxyXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5oZWxwZXJzLmVhc2luZ0VmZmVjdHMgPSBlZmZlY3RzO1xyXG5cclxufSx7XCI0M1wiOjQzfV0sNDU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDMpO1xyXG5cclxuLyoqXHJcbiAqIEBhbGlhcyBDaGFydC5oZWxwZXJzLm9wdGlvbnNcclxuICogQG5hbWVzcGFjZVxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblx0LyoqXHJcblx0ICogQ29udmVydHMgdGhlIGdpdmVuIGxpbmUgaGVpZ2h0IGB2YWx1ZWAgaW4gcGl4ZWxzIGZvciBhIHNwZWNpZmljIGZvbnQgYHNpemVgLlxyXG5cdCAqIEBwYXJhbSB7TnVtYmVyfFN0cmluZ30gdmFsdWUgLSBUaGUgbGluZUhlaWdodCB0byBwYXJzZSAoZWcuIDEuNiwgJzE0cHgnLCAnNzUlJywgJzEuNmVtJykuXHJcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHNpemUgLSBUaGUgZm9udCBzaXplIChpbiBwaXhlbHMpIHVzZWQgdG8gcmVzb2x2ZSByZWxhdGl2ZSBgdmFsdWVgLlxyXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBlZmZlY3RpdmUgbGluZSBoZWlnaHQgaW4gcGl4ZWxzIChzaXplICogMS4yIGlmIHZhbHVlIGlzIGludmFsaWQpLlxyXG5cdCAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2xpbmUtaGVpZ2h0XHJcblx0ICogQHNpbmNlIDIuNy4wXHJcblx0ICovXHJcblx0dG9MaW5lSGVpZ2h0OiBmdW5jdGlvbih2YWx1ZSwgc2l6ZSkge1xyXG5cdFx0dmFyIG1hdGNoZXMgPSAoJycgKyB2YWx1ZSkubWF0Y2goL14obm9ybWFsfChcXGQrKD86XFwuXFxkKyk/KShweHxlbXwlKT8pJC8pO1xyXG5cdFx0aWYgKCFtYXRjaGVzIHx8IG1hdGNoZXNbMV0gPT09ICdub3JtYWwnKSB7XHJcblx0XHRcdHJldHVybiBzaXplICogMS4yO1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhbHVlID0gK21hdGNoZXNbMl07XHJcblxyXG5cdFx0c3dpdGNoIChtYXRjaGVzWzNdKSB7XHJcblx0XHRjYXNlICdweCc6XHJcblx0XHRcdHJldHVybiB2YWx1ZTtcclxuXHRcdGNhc2UgJyUnOlxyXG5cdFx0XHR2YWx1ZSAvPSAxMDA7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0ZGVmYXVsdDpcclxuXHRcdFx0YnJlYWs7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHNpemUgKiB2YWx1ZTtcclxuXHR9LFxyXG5cclxuXHQvKipcclxuXHQgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdmFsdWUgaW50byBhIHBhZGRpbmcgb2JqZWN0IHdpdGggcHJlLWNvbXB1dGVkIHdpZHRoL2hlaWdodC5cclxuXHQgKiBAcGFyYW0ge051bWJlcnxPYmplY3R9IHZhbHVlIC0gSWYgYSBudW1iZXIsIHNldCB0aGUgdmFsdWUgdG8gYWxsIFRSQkwgY29tcG9uZW50LFxyXG5cdCAqICBlbHNlLCBpZiBhbmQgb2JqZWN0LCB1c2UgZGVmaW5lZCBwcm9wZXJ0aWVzIGFuZCBzZXRzIHVuZGVmaW5lZCBvbmVzIHRvIDAuXHJcblx0ICogQHJldHVybnMge09iamVjdH0gVGhlIHBhZGRpbmcgdmFsdWVzICh0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQsIHdpZHRoLCBoZWlnaHQpXHJcblx0ICogQHNpbmNlIDIuNy4wXHJcblx0ICovXHJcblx0dG9QYWRkaW5nOiBmdW5jdGlvbih2YWx1ZSkge1xyXG5cdFx0dmFyIHQsIHIsIGIsIGw7XHJcblxyXG5cdFx0aWYgKGhlbHBlcnMuaXNPYmplY3QodmFsdWUpKSB7XHJcblx0XHRcdHQgPSArdmFsdWUudG9wIHx8IDA7XHJcblx0XHRcdHIgPSArdmFsdWUucmlnaHQgfHwgMDtcclxuXHRcdFx0YiA9ICt2YWx1ZS5ib3R0b20gfHwgMDtcclxuXHRcdFx0bCA9ICt2YWx1ZS5sZWZ0IHx8IDA7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0ID0gciA9IGIgPSBsID0gK3ZhbHVlIHx8IDA7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0dG9wOiB0LFxyXG5cdFx0XHRyaWdodDogcixcclxuXHRcdFx0Ym90dG9tOiBiLFxyXG5cdFx0XHRsZWZ0OiBsLFxyXG5cdFx0XHRoZWlnaHQ6IHQgKyBiLFxyXG5cdFx0XHR3aWR0aDogbCArIHJcclxuXHRcdH07XHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICogRXZhbHVhdGVzIHRoZSBnaXZlbiBgaW5wdXRzYCBzZXF1ZW50aWFsbHkgYW5kIHJldHVybnMgdGhlIGZpcnN0IGRlZmluZWQgdmFsdWUuXHJcblx0ICogQHBhcmFtIHtBcnJheVtdfSBpbnB1dHMgLSBBbiBhcnJheSBvZiB2YWx1ZXMsIGZhbGxpbmcgYmFjayB0byB0aGUgbGFzdCB2YWx1ZS5cclxuXHQgKiBAcGFyYW0ge09iamVjdH0gW2NvbnRleHRdIC0gSWYgZGVmaW5lZCBhbmQgdGhlIGN1cnJlbnQgdmFsdWUgaXMgYSBmdW5jdGlvbiwgdGhlIHZhbHVlXHJcblx0ICogaXMgY2FsbGVkIHdpdGggYGNvbnRleHRgIGFzIGZpcnN0IGFyZ3VtZW50IGFuZCB0aGUgcmVzdWx0IGJlY29tZXMgdGhlIG5ldyBpbnB1dC5cclxuXHQgKiBAcGFyYW0ge051bWJlcn0gW2luZGV4XSAtIElmIGRlZmluZWQgYW5kIHRoZSBjdXJyZW50IHZhbHVlIGlzIGFuIGFycmF5LCB0aGUgdmFsdWVcclxuXHQgKiBhdCBgaW5kZXhgIGJlY29tZSB0aGUgbmV3IGlucHV0LlxyXG5cdCAqIEBzaW5jZSAyLjcuMFxyXG5cdCAqL1xyXG5cdHJlc29sdmU6IGZ1bmN0aW9uKGlucHV0cywgY29udGV4dCwgaW5kZXgpIHtcclxuXHRcdHZhciBpLCBpbGVuLCB2YWx1ZTtcclxuXHJcblx0XHRmb3IgKGkgPSAwLCBpbGVuID0gaW5wdXRzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xyXG5cdFx0XHR2YWx1ZSA9IGlucHV0c1tpXTtcclxuXHRcdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoY29udGV4dCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG5cdFx0XHRcdHZhbHVlID0gdmFsdWUoY29udGV4dCk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKGluZGV4ICE9PSB1bmRlZmluZWQgJiYgaGVscGVycy5pc0FycmF5KHZhbHVlKSkge1xyXG5cdFx0XHRcdHZhbHVlID0gdmFsdWVbaW5kZXhdO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG59O1xyXG5cclxufSx7XCI0M1wiOjQzfV0sNDY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoNDMpO1xyXG5tb2R1bGUuZXhwb3J0cy5lYXNpbmcgPSByZXF1aXJlKDQ0KTtcclxubW9kdWxlLmV4cG9ydHMuY2FudmFzID0gcmVxdWlyZSg0Mik7XHJcbm1vZHVsZS5leHBvcnRzLm9wdGlvbnMgPSByZXF1aXJlKDQ1KTtcclxuXHJcbn0se1wiNDJcIjo0MixcIjQzXCI6NDMsXCI0NFwiOjQ0LFwiNDVcIjo0NX1dLDQ3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcclxuLyoqXHJcbiAqIFBsYXRmb3JtIGZhbGxiYWNrIGltcGxlbWVudGF0aW9uIChtaW5pbWFsKS5cclxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9wdWxsLzQ1OTEjaXNzdWVjb21tZW50LTMxOTU3NTkzOVxyXG4gKi9cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cdGFjcXVpcmVDb250ZXh0OiBmdW5jdGlvbihpdGVtKSB7XHJcblx0XHRpZiAoaXRlbSAmJiBpdGVtLmNhbnZhcykge1xyXG5cdFx0XHQvLyBTdXBwb3J0IGZvciBhbnkgb2JqZWN0IGFzc29jaWF0ZWQgdG8gYSBjYW52YXMgKGluY2x1ZGluZyBhIGNvbnRleHQyZClcclxuXHRcdFx0aXRlbSA9IGl0ZW0uY2FudmFzO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBpdGVtICYmIGl0ZW0uZ2V0Q29udGV4dCgnMmQnKSB8fCBudWxsO1xyXG5cdH1cclxufTtcclxuXHJcbn0se31dLDQ4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcclxuLyoqXHJcbiAqIENoYXJ0LlBsYXRmb3JtIGltcGxlbWVudGF0aW9uIGZvciB0YXJnZXRpbmcgYSB3ZWIgYnJvd3NlclxyXG4gKi9cclxuXHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XHJcblxyXG52YXIgRVhQQU5ET19LRVkgPSAnJGNoYXJ0anMnO1xyXG52YXIgQ1NTX1BSRUZJWCA9ICdjaGFydGpzLSc7XHJcbnZhciBDU1NfUkVOREVSX01PTklUT1IgPSBDU1NfUFJFRklYICsgJ3JlbmRlci1tb25pdG9yJztcclxudmFyIENTU19SRU5ERVJfQU5JTUFUSU9OID0gQ1NTX1BSRUZJWCArICdyZW5kZXItYW5pbWF0aW9uJztcclxudmFyIEFOSU1BVElPTl9TVEFSVF9FVkVOVFMgPSBbJ2FuaW1hdGlvbnN0YXJ0JywgJ3dlYmtpdEFuaW1hdGlvblN0YXJ0J107XHJcblxyXG4vKipcclxuICogRE9NIGV2ZW50IHR5cGVzIC0+IENoYXJ0LmpzIGV2ZW50IHR5cGVzLlxyXG4gKiBOb3RlOiBvbmx5IGV2ZW50cyB3aXRoIGRpZmZlcmVudCB0eXBlcyBhcmUgbWFwcGVkLlxyXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0V2ZW50c1xyXG4gKi9cclxudmFyIEVWRU5UX1RZUEVTID0ge1xyXG5cdHRvdWNoc3RhcnQ6ICdtb3VzZWRvd24nLFxyXG5cdHRvdWNobW92ZTogJ21vdXNlbW92ZScsXHJcblx0dG91Y2hlbmQ6ICdtb3VzZXVwJyxcclxuXHRwb2ludGVyZW50ZXI6ICdtb3VzZWVudGVyJyxcclxuXHRwb2ludGVyZG93bjogJ21vdXNlZG93bicsXHJcblx0cG9pbnRlcm1vdmU6ICdtb3VzZW1vdmUnLFxyXG5cdHBvaW50ZXJ1cDogJ21vdXNldXAnLFxyXG5cdHBvaW50ZXJsZWF2ZTogJ21vdXNlb3V0JyxcclxuXHRwb2ludGVyb3V0OiAnbW91c2VvdXQnXHJcbn07XHJcblxyXG4vKipcclxuICogVGhlIFwidXNlZFwiIHNpemUgaXMgdGhlIGZpbmFsIHZhbHVlIG9mIGEgZGltZW5zaW9uIHByb3BlcnR5IGFmdGVyIGFsbCBjYWxjdWxhdGlvbnMgaGF2ZVxyXG4gKiBiZWVuIHBlcmZvcm1lZC4gVGhpcyBtZXRob2QgdXNlcyB0aGUgY29tcHV0ZWQgc3R5bGUgb2YgYGVsZW1lbnRgIGJ1dCByZXR1cm5zIHVuZGVmaW5lZFxyXG4gKiBpZiB0aGUgY29tcHV0ZWQgc3R5bGUgaXMgbm90IGV4cHJlc3NlZCBpbiBwaXhlbHMuIFRoYXQgY2FuIGhhcHBlbiBpbiBzb21lIGNhc2VzIHdoZXJlXHJcbiAqIGBlbGVtZW50YCBoYXMgYSBzaXplIHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQgYW5kIHRoaXMgbGFzdCBvbmUgaXMgbm90IHlldCBkaXNwbGF5ZWQsXHJcbiAqIGZvciBleGFtcGxlIGJlY2F1c2Ugb2YgYGRpc3BsYXk6IG5vbmVgIG9uIGEgcGFyZW50IG5vZGUuXHJcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3VzZWRfdmFsdWVcclxuICogQHJldHVybnMge051bWJlcn0gU2l6ZSBpbiBwaXhlbHMgb3IgdW5kZWZpbmVkIGlmIHVua25vd24uXHJcbiAqL1xyXG5mdW5jdGlvbiByZWFkVXNlZFNpemUoZWxlbWVudCwgcHJvcGVydHkpIHtcclxuXHR2YXIgdmFsdWUgPSBoZWxwZXJzLmdldFN0eWxlKGVsZW1lbnQsIHByb3BlcnR5KTtcclxuXHR2YXIgbWF0Y2hlcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKC9eKFxcZCspKFxcLlxcZCspP3B4JC8pO1xyXG5cdHJldHVybiBtYXRjaGVzID8gTnVtYmVyKG1hdGNoZXNbMV0pIDogdW5kZWZpbmVkO1xyXG59XHJcblxyXG4vKipcclxuICogSW5pdGlhbGl6ZXMgdGhlIGNhbnZhcyBzdHlsZSBhbmQgcmVuZGVyIHNpemUgd2l0aG91dCBtb2RpZnlpbmcgdGhlIGNhbnZhcyBkaXNwbGF5IHNpemUsXHJcbiAqIHNpbmNlIHJlc3BvbnNpdmVuZXNzIGlzIGhhbmRsZWQgYnkgdGhlIGNvbnRyb2xsZXIucmVzaXplKCkgbWV0aG9kLiBUaGUgY29uZmlnIGlzIHVzZWRcclxuICogdG8gZGV0ZXJtaW5lIHRoZSBhc3BlY3QgcmF0aW8gdG8gYXBwbHkgaW4gY2FzZSBubyBleHBsaWNpdCBoZWlnaHQgaGFzIGJlZW4gc3BlY2lmaWVkLlxyXG4gKi9cclxuZnVuY3Rpb24gaW5pdENhbnZhcyhjYW52YXMsIGNvbmZpZykge1xyXG5cdHZhciBzdHlsZSA9IGNhbnZhcy5zdHlsZTtcclxuXHJcblx0Ly8gTk9URShTQikgY2FudmFzLmdldEF0dHJpYnV0ZSgnd2lkdGgnKSAhPT0gY2FudmFzLndpZHRoOiBpbiB0aGUgZmlyc3QgY2FzZSBpdFxyXG5cdC8vIHJldHVybnMgbnVsbCBvciAnJyBpZiBubyBleHBsaWNpdCB2YWx1ZSBoYXMgYmVlbiBzZXQgdG8gdGhlIGNhbnZhcyBhdHRyaWJ1dGUuXHJcblx0dmFyIHJlbmRlckhlaWdodCA9IGNhbnZhcy5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpO1xyXG5cdHZhciByZW5kZXJXaWR0aCA9IGNhbnZhcy5nZXRBdHRyaWJ1dGUoJ3dpZHRoJyk7XHJcblxyXG5cdC8vIENoYXJ0LmpzIG1vZGlmaWVzIHNvbWUgY2FudmFzIHZhbHVlcyB0aGF0IHdlIHdhbnQgdG8gcmVzdG9yZSBvbiBkZXN0cm95XHJcblx0Y2FudmFzW0VYUEFORE9fS0VZXSA9IHtcclxuXHRcdGluaXRpYWw6IHtcclxuXHRcdFx0aGVpZ2h0OiByZW5kZXJIZWlnaHQsXHJcblx0XHRcdHdpZHRoOiByZW5kZXJXaWR0aCxcclxuXHRcdFx0c3R5bGU6IHtcclxuXHRcdFx0XHRkaXNwbGF5OiBzdHlsZS5kaXNwbGF5LFxyXG5cdFx0XHRcdGhlaWdodDogc3R5bGUuaGVpZ2h0LFxyXG5cdFx0XHRcdHdpZHRoOiBzdHlsZS53aWR0aFxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0Ly8gRm9yY2UgY2FudmFzIHRvIGRpc3BsYXkgYXMgYmxvY2sgdG8gYXZvaWQgZXh0cmEgc3BhY2UgY2F1c2VkIGJ5IGlubGluZVxyXG5cdC8vIGVsZW1lbnRzLCB3aGljaCB3b3VsZCBpbnRlcmZlcmUgd2l0aCB0aGUgcmVzcG9uc2l2ZSByZXNpemUgcHJvY2Vzcy5cclxuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvMjUzOFxyXG5cdHN0eWxlLmRpc3BsYXkgPSBzdHlsZS5kaXNwbGF5IHx8ICdibG9jayc7XHJcblxyXG5cdGlmIChyZW5kZXJXaWR0aCA9PT0gbnVsbCB8fCByZW5kZXJXaWR0aCA9PT0gJycpIHtcclxuXHRcdHZhciBkaXNwbGF5V2lkdGggPSByZWFkVXNlZFNpemUoY2FudmFzLCAnd2lkdGgnKTtcclxuXHRcdGlmIChkaXNwbGF5V2lkdGggIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRjYW52YXMud2lkdGggPSBkaXNwbGF5V2lkdGg7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRpZiAocmVuZGVySGVpZ2h0ID09PSBudWxsIHx8IHJlbmRlckhlaWdodCA9PT0gJycpIHtcclxuXHRcdGlmIChjYW52YXMuc3R5bGUuaGVpZ2h0ID09PSAnJykge1xyXG5cdFx0XHQvLyBJZiBubyBleHBsaWNpdCByZW5kZXIgaGVpZ2h0IGFuZCBzdHlsZSBoZWlnaHQsIGxldCdzIGFwcGx5IHRoZSBhc3BlY3QgcmF0aW8sXHJcblx0XHRcdC8vIHdoaWNoIG9uZSBjYW4gYmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIGJ1dCBhbHNvIGJ5IGNoYXJ0cyBhcyBkZWZhdWx0IG9wdGlvblxyXG5cdFx0XHQvLyAoaS5lLiBvcHRpb25zLmFzcGVjdFJhdGlvKS4gSWYgbm90IHNwZWNpZmllZCwgdXNlIGNhbnZhcyBhc3BlY3QgcmF0aW8gb2YgMi5cclxuXHRcdFx0Y2FudmFzLmhlaWdodCA9IGNhbnZhcy53aWR0aCAvIChjb25maWcub3B0aW9ucy5hc3BlY3RSYXRpbyB8fCAyKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHZhciBkaXNwbGF5SGVpZ2h0ID0gcmVhZFVzZWRTaXplKGNhbnZhcywgJ2hlaWdodCcpO1xyXG5cdFx0XHRpZiAoZGlzcGxheVdpZHRoICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRjYW52YXMuaGVpZ2h0ID0gZGlzcGxheUhlaWdodDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGNhbnZhcztcclxufVxyXG5cclxuLyoqXHJcbiAqIERldGVjdHMgc3VwcG9ydCBmb3Igb3B0aW9ucyBvYmplY3QgYXJndW1lbnQgaW4gYWRkRXZlbnRMaXN0ZW5lci5cclxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0V2ZW50VGFyZ2V0L2FkZEV2ZW50TGlzdGVuZXIjU2FmZWx5X2RldGVjdGluZ19vcHRpb25fc3VwcG9ydFxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxudmFyIHN1cHBvcnRzRXZlbnRMaXN0ZW5lck9wdGlvbnMgPSAoZnVuY3Rpb24oKSB7XHJcblx0dmFyIHN1cHBvcnRzID0gZmFsc2U7XHJcblx0dHJ5IHtcclxuXHRcdHZhciBvcHRpb25zID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAncGFzc2l2ZScsIHtcclxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRzdXBwb3J0cyA9IHRydWU7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2UnLCBudWxsLCBvcHRpb25zKTtcclxuXHR9IGNhdGNoIChlKSB7XHJcblx0XHQvLyBjb250aW51ZSByZWdhcmRsZXNzIG9mIGVycm9yXHJcblx0fVxyXG5cdHJldHVybiBzdXBwb3J0cztcclxufSgpKTtcclxuXHJcbi8vIERlZmF1bHQgcGFzc2l2ZSB0byB0cnVlIGFzIGV4cGVjdGVkIGJ5IENocm9tZSBmb3IgJ3RvdWNoc3RhcnQnIGFuZCAndG91Y2hlbmQnIGV2ZW50cy5cclxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzQyODdcclxudmFyIGV2ZW50TGlzdGVuZXJPcHRpb25zID0gc3VwcG9ydHNFdmVudExpc3RlbmVyT3B0aW9ucyA/IHtwYXNzaXZlOiB0cnVlfSA6IGZhbHNlO1xyXG5cclxuZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihub2RlLCB0eXBlLCBsaXN0ZW5lcikge1xyXG5cdG5vZGUuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgZXZlbnRMaXN0ZW5lck9wdGlvbnMpO1xyXG59XHJcblxyXG5mdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVyKG5vZGUsIHR5cGUsIGxpc3RlbmVyKSB7XHJcblx0bm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBldmVudExpc3RlbmVyT3B0aW9ucyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUV2ZW50KHR5cGUsIGNoYXJ0LCB4LCB5LCBuYXRpdmVFdmVudCkge1xyXG5cdHJldHVybiB7XHJcblx0XHR0eXBlOiB0eXBlLFxyXG5cdFx0Y2hhcnQ6IGNoYXJ0LFxyXG5cdFx0bmF0aXZlOiBuYXRpdmVFdmVudCB8fCBudWxsLFxyXG5cdFx0eDogeCAhPT0gdW5kZWZpbmVkID8geCA6IG51bGwsXHJcblx0XHR5OiB5ICE9PSB1bmRlZmluZWQgPyB5IDogbnVsbCxcclxuXHR9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBmcm9tTmF0aXZlRXZlbnQoZXZlbnQsIGNoYXJ0KSB7XHJcblx0dmFyIHR5cGUgPSBFVkVOVF9UWVBFU1tldmVudC50eXBlXSB8fCBldmVudC50eXBlO1xyXG5cdHZhciBwb3MgPSBoZWxwZXJzLmdldFJlbGF0aXZlUG9zaXRpb24oZXZlbnQsIGNoYXJ0KTtcclxuXHRyZXR1cm4gY3JlYXRlRXZlbnQodHlwZSwgY2hhcnQsIHBvcy54LCBwb3MueSwgZXZlbnQpO1xyXG59XHJcblxyXG5mdW5jdGlvbiB0aHJvdHRsZWQoZm4sIHRoaXNBcmcpIHtcclxuXHR2YXIgdGlja2luZyA9IGZhbHNlO1xyXG5cdHZhciBhcmdzID0gW107XHJcblxyXG5cdHJldHVybiBmdW5jdGlvbigpIHtcclxuXHRcdGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xyXG5cdFx0dGhpc0FyZyA9IHRoaXNBcmcgfHwgdGhpcztcclxuXHJcblx0XHRpZiAoIXRpY2tpbmcpIHtcclxuXHRcdFx0dGlja2luZyA9IHRydWU7XHJcblx0XHRcdGhlbHBlcnMucmVxdWVzdEFuaW1GcmFtZS5jYWxsKHdpbmRvdywgZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0dGlja2luZyA9IGZhbHNlO1xyXG5cdFx0XHRcdGZuLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9O1xyXG59XHJcblxyXG4vLyBJbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vbWFyY2ovY3NzLWVsZW1lbnQtcXVlcmllc1xyXG5mdW5jdGlvbiBjcmVhdGVSZXNpemVyKGhhbmRsZXIpIHtcclxuXHR2YXIgcmVzaXplciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG5cdHZhciBjbHMgPSBDU1NfUFJFRklYICsgJ3NpemUtbW9uaXRvcic7XHJcblx0dmFyIG1heFNpemUgPSAxMDAwMDAwO1xyXG5cdHZhciBzdHlsZSA9XHJcblx0XHQncG9zaXRpb246YWJzb2x1dGU7JyArXHJcblx0XHQnbGVmdDowOycgK1xyXG5cdFx0J3RvcDowOycgK1xyXG5cdFx0J3JpZ2h0OjA7JyArXHJcblx0XHQnYm90dG9tOjA7JyArXHJcblx0XHQnb3ZlcmZsb3c6aGlkZGVuOycgK1xyXG5cdFx0J3BvaW50ZXItZXZlbnRzOm5vbmU7JyArXHJcblx0XHQndmlzaWJpbGl0eTpoaWRkZW47JyArXHJcblx0XHQnei1pbmRleDotMTsnO1xyXG5cclxuXHRyZXNpemVyLnN0eWxlLmNzc1RleHQgPSBzdHlsZTtcclxuXHRyZXNpemVyLmNsYXNzTmFtZSA9IGNscztcclxuXHRyZXNpemVyLmlubmVySFRNTCA9XHJcblx0XHQnPGRpdiBjbGFzcz1cIicgKyBjbHMgKyAnLWV4cGFuZFwiIHN0eWxlPVwiJyArIHN0eWxlICsgJ1wiPicgK1xyXG5cdFx0XHQnPGRpdiBzdHlsZT1cIicgK1xyXG5cdFx0XHRcdCdwb3NpdGlvbjphYnNvbHV0ZTsnICtcclxuXHRcdFx0XHQnd2lkdGg6JyArIG1heFNpemUgKyAncHg7JyArXHJcblx0XHRcdFx0J2hlaWdodDonICsgbWF4U2l6ZSArICdweDsnICtcclxuXHRcdFx0XHQnbGVmdDowOycgK1xyXG5cdFx0XHRcdCd0b3A6MFwiPicgK1xyXG5cdFx0XHQnPC9kaXY+JyArXHJcblx0XHQnPC9kaXY+JyArXHJcblx0XHQnPGRpdiBjbGFzcz1cIicgKyBjbHMgKyAnLXNocmlua1wiIHN0eWxlPVwiJyArIHN0eWxlICsgJ1wiPicgK1xyXG5cdFx0XHQnPGRpdiBzdHlsZT1cIicgK1xyXG5cdFx0XHRcdCdwb3NpdGlvbjphYnNvbHV0ZTsnICtcclxuXHRcdFx0XHQnd2lkdGg6MjAwJTsnICtcclxuXHRcdFx0XHQnaGVpZ2h0OjIwMCU7JyArXHJcblx0XHRcdFx0J2xlZnQ6MDsgJyArXHJcblx0XHRcdFx0J3RvcDowXCI+JyArXHJcblx0XHRcdCc8L2Rpdj4nICtcclxuXHRcdCc8L2Rpdj4nO1xyXG5cclxuXHR2YXIgZXhwYW5kID0gcmVzaXplci5jaGlsZE5vZGVzWzBdO1xyXG5cdHZhciBzaHJpbmsgPSByZXNpemVyLmNoaWxkTm9kZXNbMV07XHJcblxyXG5cdHJlc2l6ZXIuX3Jlc2V0ID0gZnVuY3Rpb24oKSB7XHJcblx0XHRleHBhbmQuc2Nyb2xsTGVmdCA9IG1heFNpemU7XHJcblx0XHRleHBhbmQuc2Nyb2xsVG9wID0gbWF4U2l6ZTtcclxuXHRcdHNocmluay5zY3JvbGxMZWZ0ID0gbWF4U2l6ZTtcclxuXHRcdHNocmluay5zY3JvbGxUb3AgPSBtYXhTaXplO1xyXG5cdH07XHJcblx0dmFyIG9uU2Nyb2xsID0gZnVuY3Rpb24oKSB7XHJcblx0XHRyZXNpemVyLl9yZXNldCgpO1xyXG5cdFx0aGFuZGxlcigpO1xyXG5cdH07XHJcblxyXG5cdGFkZEV2ZW50TGlzdGVuZXIoZXhwYW5kLCAnc2Nyb2xsJywgb25TY3JvbGwuYmluZChleHBhbmQsICdleHBhbmQnKSk7XHJcblx0YWRkRXZlbnRMaXN0ZW5lcihzaHJpbmssICdzY3JvbGwnLCBvblNjcm9sbC5iaW5kKHNocmluaywgJ3NocmluaycpKTtcclxuXHJcblx0cmV0dXJuIHJlc2l6ZXI7XHJcbn1cclxuXHJcbi8vIGh0dHBzOi8vZGF2aWR3YWxzaC5uYW1lL2RldGVjdC1ub2RlLWluc2VydGlvblxyXG5mdW5jdGlvbiB3YXRjaEZvclJlbmRlcihub2RlLCBoYW5kbGVyKSB7XHJcblx0dmFyIGV4cGFuZG8gPSBub2RlW0VYUEFORE9fS0VZXSB8fCAobm9kZVtFWFBBTkRPX0tFWV0gPSB7fSk7XHJcblx0dmFyIHByb3h5ID0gZXhwYW5kby5yZW5kZXJQcm94eSA9IGZ1bmN0aW9uKGUpIHtcclxuXHRcdGlmIChlLmFuaW1hdGlvbk5hbWUgPT09IENTU19SRU5ERVJfQU5JTUFUSU9OKSB7XHJcblx0XHRcdGhhbmRsZXIoKTtcclxuXHRcdH1cclxuXHR9O1xyXG5cclxuXHRoZWxwZXJzLmVhY2goQU5JTUFUSU9OX1NUQVJUX0VWRU5UUywgZnVuY3Rpb24odHlwZSkge1xyXG5cdFx0YWRkRXZlbnRMaXN0ZW5lcihub2RlLCB0eXBlLCBwcm94eSk7XHJcblx0fSk7XHJcblxyXG5cdC8vICM0NzM3OiBDaHJvbWUgbWlnaHQgc2tpcCB0aGUgQ1NTIGFuaW1hdGlvbiB3aGVuIHRoZSBDU1NfUkVOREVSX01PTklUT1IgY2xhc3NcclxuXHQvLyBpcyByZW1vdmVkIHRoZW4gYWRkZWQgYmFjayBpbW1lZGlhdGVseSAoc2FtZSBhbmltYXRpb24gZnJhbWU/KS4gQWNjZXNzaW5nIHRoZVxyXG5cdC8vIGBvZmZzZXRQYXJlbnRgIHByb3BlcnR5IHdpbGwgZm9yY2UgYSByZWZsb3cgYW5kIHJlLWV2YWx1YXRlIHRoZSBDU1MgYW5pbWF0aW9uLlxyXG5cdC8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3BhdWxpcmlzaC81ZDUyZmIwODFiMzU3MGM4MWUzYSNib3gtbWV0cmljc1xyXG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy80NzM3XHJcblx0ZXhwYW5kby5yZWZsb3cgPSAhIW5vZGUub2Zmc2V0UGFyZW50O1xyXG5cclxuXHRub2RlLmNsYXNzTGlzdC5hZGQoQ1NTX1JFTkRFUl9NT05JVE9SKTtcclxufVxyXG5cclxuZnVuY3Rpb24gdW53YXRjaEZvclJlbmRlcihub2RlKSB7XHJcblx0dmFyIGV4cGFuZG8gPSBub2RlW0VYUEFORE9fS0VZXSB8fCB7fTtcclxuXHR2YXIgcHJveHkgPSBleHBhbmRvLnJlbmRlclByb3h5O1xyXG5cclxuXHRpZiAocHJveHkpIHtcclxuXHRcdGhlbHBlcnMuZWFjaChBTklNQVRJT05fU1RBUlRfRVZFTlRTLCBmdW5jdGlvbih0eXBlKSB7XHJcblx0XHRcdHJlbW92ZUV2ZW50TGlzdGVuZXIobm9kZSwgdHlwZSwgcHJveHkpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0ZGVsZXRlIGV4cGFuZG8ucmVuZGVyUHJveHk7XHJcblx0fVxyXG5cclxuXHRub2RlLmNsYXNzTGlzdC5yZW1vdmUoQ1NTX1JFTkRFUl9NT05JVE9SKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYWRkUmVzaXplTGlzdGVuZXIobm9kZSwgbGlzdGVuZXIsIGNoYXJ0KSB7XHJcblx0dmFyIGV4cGFuZG8gPSBub2RlW0VYUEFORE9fS0VZXSB8fCAobm9kZVtFWFBBTkRPX0tFWV0gPSB7fSk7XHJcblxyXG5cdC8vIExldCdzIGtlZXAgdHJhY2sgb2YgdGhpcyBhZGRlZCByZXNpemVyIGFuZCB0aHVzIGF2b2lkIERPTSBxdWVyeSB3aGVuIHJlbW92aW5nIGl0LlxyXG5cdHZhciByZXNpemVyID0gZXhwYW5kby5yZXNpemVyID0gY3JlYXRlUmVzaXplcih0aHJvdHRsZWQoZnVuY3Rpb24oKSB7XHJcblx0XHRpZiAoZXhwYW5kby5yZXNpemVyKSB7XHJcblx0XHRcdHJldHVybiBsaXN0ZW5lcihjcmVhdGVFdmVudCgncmVzaXplJywgY2hhcnQpKTtcclxuXHRcdH1cclxuXHR9KSk7XHJcblxyXG5cdC8vIFRoZSByZXNpemVyIG5lZWRzIHRvIGJlIGF0dGFjaGVkIHRvIHRoZSBub2RlIHBhcmVudCwgc28gd2UgZmlyc3QgbmVlZCB0byBiZVxyXG5cdC8vIHN1cmUgdGhhdCBgbm9kZWAgaXMgYXR0YWNoZWQgdG8gdGhlIERPTSBiZWZvcmUgaW5qZWN0aW5nIHRoZSByZXNpemVyIGVsZW1lbnQuXHJcblx0d2F0Y2hGb3JSZW5kZXIobm9kZSwgZnVuY3Rpb24oKSB7XHJcblx0XHRpZiAoZXhwYW5kby5yZXNpemVyKSB7XHJcblx0XHRcdHZhciBjb250YWluZXIgPSBub2RlLnBhcmVudE5vZGU7XHJcblx0XHRcdGlmIChjb250YWluZXIgJiYgY29udGFpbmVyICE9PSByZXNpemVyLnBhcmVudE5vZGUpIHtcclxuXHRcdFx0XHRjb250YWluZXIuaW5zZXJ0QmVmb3JlKHJlc2l6ZXIsIGNvbnRhaW5lci5maXJzdENoaWxkKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gVGhlIGNvbnRhaW5lciBzaXplIG1pZ2h0IGhhdmUgY2hhbmdlZCwgbGV0J3MgcmVzZXQgdGhlIHJlc2l6ZXIgc3RhdGUuXHJcblx0XHRcdHJlc2l6ZXIuX3Jlc2V0KCk7XHJcblx0XHR9XHJcblx0fSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlbW92ZVJlc2l6ZUxpc3RlbmVyKG5vZGUpIHtcclxuXHR2YXIgZXhwYW5kbyA9IG5vZGVbRVhQQU5ET19LRVldIHx8IHt9O1xyXG5cdHZhciByZXNpemVyID0gZXhwYW5kby5yZXNpemVyO1xyXG5cclxuXHRkZWxldGUgZXhwYW5kby5yZXNpemVyO1xyXG5cdHVud2F0Y2hGb3JSZW5kZXIobm9kZSk7XHJcblxyXG5cdGlmIChyZXNpemVyICYmIHJlc2l6ZXIucGFyZW50Tm9kZSkge1xyXG5cdFx0cmVzaXplci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHJlc2l6ZXIpO1xyXG5cdH1cclxufVxyXG5cclxuZnVuY3Rpb24gaW5qZWN0Q1NTKHBsYXRmb3JtLCBjc3MpIHtcclxuXHQvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8zOTIyMTM5XHJcblx0dmFyIHN0eWxlID0gcGxhdGZvcm0uX3N0eWxlIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XHJcblx0aWYgKCFwbGF0Zm9ybS5fc3R5bGUpIHtcclxuXHRcdHBsYXRmb3JtLl9zdHlsZSA9IHN0eWxlO1xyXG5cdFx0Y3NzID0gJy8qIENoYXJ0LmpzICovXFxuJyArIGNzcztcclxuXHRcdHN0eWxlLnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2NzcycpO1xyXG5cdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXS5hcHBlbmRDaGlsZChzdHlsZSk7XHJcblx0fVxyXG5cclxuXHRzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblx0LyoqXHJcblx0ICogVGhpcyBwcm9wZXJ0eSBob2xkcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0gaXMgZW5hYmxlZCBmb3IgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuXHJcblx0ICogQ3VycmVudGx5IHVzZWQgYnkgcGxhdGZvcm0uanMgdG8gc2VsZWN0IHRoZSBwcm9wZXIgaW1wbGVtZW50YXRpb24uXHJcblx0ICogQHByaXZhdGVcclxuXHQgKi9cclxuXHRfZW5hYmxlZDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyxcclxuXHJcblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIga2V5ZnJhbWVzID0gJ2Zyb217b3BhY2l0eTowLjk5fXRve29wYWNpdHk6MX0nO1xyXG5cclxuXHRcdGluamVjdENTUyh0aGlzLFxyXG5cdFx0XHQvLyBET00gcmVuZGVyaW5nIGRldGVjdGlvblxyXG5cdFx0XHQvLyBodHRwczovL2Rhdmlkd2Fsc2gubmFtZS9kZXRlY3Qtbm9kZS1pbnNlcnRpb25cclxuXHRcdFx0J0Atd2Via2l0LWtleWZyYW1lcyAnICsgQ1NTX1JFTkRFUl9BTklNQVRJT04gKyAneycgKyBrZXlmcmFtZXMgKyAnfScgK1xyXG5cdFx0XHQnQGtleWZyYW1lcyAnICsgQ1NTX1JFTkRFUl9BTklNQVRJT04gKyAneycgKyBrZXlmcmFtZXMgKyAnfScgK1xyXG5cdFx0XHQnLicgKyBDU1NfUkVOREVSX01PTklUT1IgKyAneycgK1xyXG5cdFx0XHRcdCctd2Via2l0LWFuaW1hdGlvbjonICsgQ1NTX1JFTkRFUl9BTklNQVRJT04gKyAnIDAuMDAxczsnICtcclxuXHRcdFx0XHQnYW5pbWF0aW9uOicgKyBDU1NfUkVOREVSX0FOSU1BVElPTiArICcgMC4wMDFzOycgK1xyXG5cdFx0XHQnfSdcclxuXHRcdCk7XHJcblx0fSxcclxuXHJcblx0YWNxdWlyZUNvbnRleHQ6IGZ1bmN0aW9uKGl0ZW0sIGNvbmZpZykge1xyXG5cdFx0aWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xyXG5cdFx0XHRpdGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaXRlbSk7XHJcblx0XHR9IGVsc2UgaWYgKGl0ZW0ubGVuZ3RoKSB7XHJcblx0XHRcdC8vIFN1cHBvcnQgZm9yIGFycmF5IGJhc2VkIHF1ZXJpZXMgKHN1Y2ggYXMgalF1ZXJ5KVxyXG5cdFx0XHRpdGVtID0gaXRlbVswXTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoaXRlbSAmJiBpdGVtLmNhbnZhcykge1xyXG5cdFx0XHQvLyBTdXBwb3J0IGZvciBhbnkgb2JqZWN0IGFzc29jaWF0ZWQgdG8gYSBjYW52YXMgKGluY2x1ZGluZyBhIGNvbnRleHQyZClcclxuXHRcdFx0aXRlbSA9IGl0ZW0uY2FudmFzO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFRvIHByZXZlbnQgY2FudmFzIGZpbmdlcnByaW50aW5nLCBzb21lIGFkZC1vbnMgdW5kZWZpbmUgdGhlIGdldENvbnRleHRcclxuXHRcdC8vIG1ldGhvZCwgZm9yIGV4YW1wbGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9ra2Fwc25lci9DYW52YXNCbG9ja2VyXHJcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvMjgwN1xyXG5cdFx0dmFyIGNvbnRleHQgPSBpdGVtICYmIGl0ZW0uZ2V0Q29udGV4dCAmJiBpdGVtLmdldENvbnRleHQoJzJkJyk7XHJcblxyXG5cdFx0Ly8gYGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQvQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEYCBmYWlscyB3aGVuIHRoZSBpdGVtIGlzXHJcblx0XHQvLyBpbnNpZGUgYW4gaWZyYW1lIG9yIHdoZW4gcnVubmluZyBpbiBhIHByb3RlY3RlZCBlbnZpcm9ubWVudC4gV2UgY291bGQgZ3Vlc3MgdGhlXHJcblx0XHQvLyB0eXBlcyBmcm9tIHRoZWlyIHRvU3RyaW5nKCkgdmFsdWUgYnV0IGxldCdzIGtlZXAgdGhpbmdzIGZsZXhpYmxlIGFuZCBhc3N1bWUgaXQnc1xyXG5cdFx0Ly8gYSBzdWZmaWNpZW50IGNvbmRpdGlvbiBpZiB0aGUgaXRlbSBoYXMgYSBjb250ZXh0MkQgd2hpY2ggaGFzIGl0ZW0gYXMgYGNhbnZhc2AuXHJcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvMzg4N1xyXG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzQxMDJcclxuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL2lzc3Vlcy80MTUyXHJcblx0XHRpZiAoY29udGV4dCAmJiBjb250ZXh0LmNhbnZhcyA9PT0gaXRlbSkge1xyXG5cdFx0XHRpbml0Q2FudmFzKGl0ZW0sIGNvbmZpZyk7XHJcblx0XHRcdHJldHVybiBjb250ZXh0O1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH0sXHJcblxyXG5cdHJlbGVhc2VDb250ZXh0OiBmdW5jdGlvbihjb250ZXh0KSB7XHJcblx0XHR2YXIgY2FudmFzID0gY29udGV4dC5jYW52YXM7XHJcblx0XHRpZiAoIWNhbnZhc1tFWFBBTkRPX0tFWV0pIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBpbml0aWFsID0gY2FudmFzW0VYUEFORE9fS0VZXS5pbml0aWFsO1xyXG5cdFx0WydoZWlnaHQnLCAnd2lkdGgnXS5mb3JFYWNoKGZ1bmN0aW9uKHByb3ApIHtcclxuXHRcdFx0dmFyIHZhbHVlID0gaW5pdGlhbFtwcm9wXTtcclxuXHRcdFx0aWYgKGhlbHBlcnMuaXNOdWxsT3JVbmRlZih2YWx1ZSkpIHtcclxuXHRcdFx0XHRjYW52YXMucmVtb3ZlQXR0cmlidXRlKHByb3ApO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGNhbnZhcy5zZXRBdHRyaWJ1dGUocHJvcCwgdmFsdWUpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHJcblx0XHRoZWxwZXJzLmVhY2goaW5pdGlhbC5zdHlsZSB8fCB7fSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xyXG5cdFx0XHRjYW52YXMuc3R5bGVba2V5XSA9IHZhbHVlO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0Ly8gVGhlIGNhbnZhcyByZW5kZXIgc2l6ZSBtaWdodCBoYXZlIGJlZW4gY2hhbmdlZCAoYW5kIHRodXMgdGhlIHN0YXRlIHN0YWNrIGRpc2NhcmRlZCksXHJcblx0XHQvLyB3ZSBjYW4ndCB1c2Ugc2F2ZSgpIGFuZCByZXN0b3JlKCkgdG8gcmVzdG9yZSB0aGUgaW5pdGlhbCBzdGF0ZS4gU28gbWFrZSBzdXJlIHRoYXQgYXRcclxuXHRcdC8vIGxlYXN0IHRoZSBjYW52YXMgY29udGV4dCBpcyByZXNldCB0byB0aGUgZGVmYXVsdCBzdGF0ZSBieSBzZXR0aW5nIHRoZSBjYW52YXMgd2lkdGguXHJcblx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMS9XRC1odG1sNS0yMDExMDUyNS90aGUtY2FudmFzLWVsZW1lbnQuaHRtbFxyXG5cdFx0Y2FudmFzLndpZHRoID0gY2FudmFzLndpZHRoO1xyXG5cclxuXHRcdGRlbGV0ZSBjYW52YXNbRVhQQU5ET19LRVldO1xyXG5cdH0sXHJcblxyXG5cdGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uKGNoYXJ0LCB0eXBlLCBsaXN0ZW5lcikge1xyXG5cdFx0dmFyIGNhbnZhcyA9IGNoYXJ0LmNhbnZhcztcclxuXHRcdGlmICh0eXBlID09PSAncmVzaXplJykge1xyXG5cdFx0XHQvLyBOb3RlOiB0aGUgcmVzaXplIGV2ZW50IGlzIG5vdCBzdXBwb3J0ZWQgb24gYWxsIGJyb3dzZXJzLlxyXG5cdFx0XHRhZGRSZXNpemVMaXN0ZW5lcihjYW52YXMsIGxpc3RlbmVyLCBjaGFydCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgZXhwYW5kbyA9IGxpc3RlbmVyW0VYUEFORE9fS0VZXSB8fCAobGlzdGVuZXJbRVhQQU5ET19LRVldID0ge30pO1xyXG5cdFx0dmFyIHByb3hpZXMgPSBleHBhbmRvLnByb3hpZXMgfHwgKGV4cGFuZG8ucHJveGllcyA9IHt9KTtcclxuXHRcdHZhciBwcm94eSA9IHByb3hpZXNbY2hhcnQuaWQgKyAnXycgKyB0eXBlXSA9IGZ1bmN0aW9uKGV2ZW50KSB7XHJcblx0XHRcdGxpc3RlbmVyKGZyb21OYXRpdmVFdmVudChldmVudCwgY2hhcnQpKTtcclxuXHRcdH07XHJcblxyXG5cdFx0YWRkRXZlbnRMaXN0ZW5lcihjYW52YXMsIHR5cGUsIHByb3h5KTtcclxuXHR9LFxyXG5cclxuXHRyZW1vdmVFdmVudExpc3RlbmVyOiBmdW5jdGlvbihjaGFydCwgdHlwZSwgbGlzdGVuZXIpIHtcclxuXHRcdHZhciBjYW52YXMgPSBjaGFydC5jYW52YXM7XHJcblx0XHRpZiAodHlwZSA9PT0gJ3Jlc2l6ZScpIHtcclxuXHRcdFx0Ly8gTm90ZTogdGhlIHJlc2l6ZSBldmVudCBpcyBub3Qgc3VwcG9ydGVkIG9uIGFsbCBicm93c2Vycy5cclxuXHRcdFx0cmVtb3ZlUmVzaXplTGlzdGVuZXIoY2FudmFzLCBsaXN0ZW5lcik7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgZXhwYW5kbyA9IGxpc3RlbmVyW0VYUEFORE9fS0VZXSB8fCB7fTtcclxuXHRcdHZhciBwcm94aWVzID0gZXhwYW5kby5wcm94aWVzIHx8IHt9O1xyXG5cdFx0dmFyIHByb3h5ID0gcHJveGllc1tjaGFydC5pZCArICdfJyArIHR5cGVdO1xyXG5cdFx0aWYgKCFwcm94eSkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0cmVtb3ZlRXZlbnRMaXN0ZW5lcihjYW52YXMsIHR5cGUsIHByb3h5KTtcclxuXHR9XHJcbn07XHJcblxyXG4vLyBERVBSRUNBVElPTlNcclxuXHJcbi8qKlxyXG4gKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdXNlIEV2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIgaW5zdGVhZC5cclxuICogRXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lciBjb21wYXRpYmlsaXR5OiBDaHJvbWUsIE9wZXJhIDcsIFNhZmFyaSwgRkYxLjUrLCBJRTkrXHJcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0V2ZW50VGFyZ2V0L2FkZEV2ZW50TGlzdGVuZXJcclxuICogQGZ1bmN0aW9uIENoYXJ0LmhlbHBlcnMuYWRkRXZlbnRcclxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjcuMFxyXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5oZWxwZXJzLmFkZEV2ZW50ID0gYWRkRXZlbnRMaXN0ZW5lcjtcclxuXHJcbi8qKlxyXG4gKiBQcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdXNlIEV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIgaW5zdGVhZC5cclxuICogRXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lciBjb21wYXRpYmlsaXR5OiBDaHJvbWUsIE9wZXJhIDcsIFNhZmFyaSwgRkYxLjUrLCBJRTkrXHJcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0V2ZW50VGFyZ2V0L3JlbW92ZUV2ZW50TGlzdGVuZXJcclxuICogQGZ1bmN0aW9uIENoYXJ0LmhlbHBlcnMucmVtb3ZlRXZlbnRcclxuICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjcuMFxyXG4gKiBAdG9kbyByZW1vdmUgYXQgdmVyc2lvbiAzXHJcbiAqIEBwcml2YXRlXHJcbiAqL1xyXG5oZWxwZXJzLnJlbW92ZUV2ZW50ID0gcmVtb3ZlRXZlbnRMaXN0ZW5lcjtcclxuXHJcbn0se1wiNDZcIjo0Nn1dLDQ5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcclxudmFyIGJhc2ljID0gcmVxdWlyZSg0Nyk7XHJcbnZhciBkb20gPSByZXF1aXJlKDQ4KTtcclxuXHJcbi8vIEBUT0RPIE1ha2UgcG9zc2libGUgdG8gc2VsZWN0IGFub3RoZXIgcGxhdGZvcm0gYXQgYnVpbGQgdGltZS5cclxudmFyIGltcGxlbWVudGF0aW9uID0gZG9tLl9lbmFibGVkID8gZG9tIDogYmFzaWM7XHJcblxyXG4vKipcclxuICogQG5hbWVzcGFjZSBDaGFydC5wbGF0Zm9ybVxyXG4gKiBAc2VlIGh0dHBzOi8vY2hhcnRqcy5naXRib29rcy5pby9wcm9wb3NhbHMvY29udGVudC9QbGF0Zm9ybS5odG1sXHJcbiAqIEBzaW5jZSAyLjQuMFxyXG4gKi9cclxubW9kdWxlLmV4cG9ydHMgPSBoZWxwZXJzLmV4dGVuZCh7XHJcblx0LyoqXHJcblx0ICogQHNpbmNlIDIuNy4wXHJcblx0ICovXHJcblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7fSxcclxuXHJcblx0LyoqXHJcblx0ICogQ2FsbGVkIGF0IGNoYXJ0IGNvbnN0cnVjdGlvbiB0aW1lLCByZXR1cm5zIGEgY29udGV4dDJkIGluc3RhbmNlIGltcGxlbWVudGluZ1xyXG5cdCAqIHRoZSBbVzNDIENhbnZhcyAyRCBDb250ZXh0IEFQSSBzdGFuZGFyZF17QGxpbmsgaHR0cHM6Ly93d3cudzMub3JnL1RSLzJkY29udGV4dC99LlxyXG5cdCAqIEBwYXJhbSB7Kn0gaXRlbSAtIFRoZSBuYXRpdmUgaXRlbSBmcm9tIHdoaWNoIHRvIGFjcXVpcmUgY29udGV4dCAocGxhdGZvcm0gc3BlY2lmaWMpXHJcblx0ICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgY2hhcnQgb3B0aW9uc1xyXG5cdCAqIEByZXR1cm5zIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGNvbnRleHQyZCBpbnN0YW5jZVxyXG5cdCAqL1xyXG5cdGFjcXVpcmVDb250ZXh0OiBmdW5jdGlvbigpIHt9LFxyXG5cclxuXHQvKipcclxuXHQgKiBDYWxsZWQgYXQgY2hhcnQgZGVzdHJ1Y3Rpb24gdGltZSwgcmVsZWFzZXMgYW55IHJlc291cmNlcyBhc3NvY2lhdGVkIHRvIHRoZSBjb250ZXh0XHJcblx0ICogcHJldmlvdXNseSByZXR1cm5lZCBieSB0aGUgYWNxdWlyZUNvbnRleHQoKSBtZXRob2QuXHJcblx0ICogQHBhcmFtIHtDYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGNvbnRleHQgLSBUaGUgY29udGV4dDJkIGluc3RhbmNlXHJcblx0ICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdGhlIG1ldGhvZCBzdWNjZWVkZWQsIGVsc2UgZmFsc2VcclxuXHQgKi9cclxuXHRyZWxlYXNlQ29udGV4dDogZnVuY3Rpb24oKSB7fSxcclxuXHJcblx0LyoqXHJcblx0ICogUmVnaXN0ZXJzIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgb24gdGhlIGdpdmVuIGNoYXJ0LlxyXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC0gQ2hhcnQgZnJvbSB3aGljaCB0byBsaXN0ZW4gZm9yIGV2ZW50XHJcblx0ICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBUaGUgKHtAbGluayBJRXZlbnR9KSB0eXBlIHRvIGxpc3RlbiBmb3JcclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciAtIFJlY2VpdmVzIGEgbm90aWZpY2F0aW9uIChhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzXHJcblx0ICogdGhlIHtAbGluayBJRXZlbnR9IGludGVyZmFjZSkgd2hlbiBhbiBldmVudCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgb2NjdXJzLlxyXG5cdCAqL1xyXG5cdGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uKCkge30sXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgd2l0aCBhZGRFdmVudExpc3RlbmVyLlxyXG5cdCAqIEBwYXJhbSB7Q2hhcnR9IGNoYXJ0IC1DaGFydCBmcm9tIHdoaWNoIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXJcclxuXHQgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSAtIFRoZSAoe0BsaW5rIElFdmVudH0pIHR5cGUgdG8gcmVtb3ZlXHJcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgLSBUaGUgbGlzdGVuZXIgZnVuY3Rpb24gdG8gcmVtb3ZlIGZyb20gdGhlIGV2ZW50IHRhcmdldC5cclxuXHQgKi9cclxuXHRyZW1vdmVFdmVudExpc3RlbmVyOiBmdW5jdGlvbigpIHt9XHJcblxyXG59LCBpbXBsZW1lbnRhdGlvbik7XHJcblxyXG4vKipcclxuICogQGludGVyZmFjZSBJUGxhdGZvcm1cclxuICogQWxsb3dzIGFic3RyYWN0aW5nIHBsYXRmb3JtIGRlcGVuZGVuY2llcyBhd2F5IGZyb20gdGhlIGNoYXJ0XHJcbiAqIEBib3Jyb3dzIENoYXJ0LnBsYXRmb3JtLmFjcXVpcmVDb250ZXh0IGFzIGFjcXVpcmVDb250ZXh0XHJcbiAqIEBib3Jyb3dzIENoYXJ0LnBsYXRmb3JtLnJlbGVhc2VDb250ZXh0IGFzIHJlbGVhc2VDb250ZXh0XHJcbiAqIEBib3Jyb3dzIENoYXJ0LnBsYXRmb3JtLmFkZEV2ZW50TGlzdGVuZXIgYXMgYWRkRXZlbnRMaXN0ZW5lclxyXG4gKiBAYm9ycm93cyBDaGFydC5wbGF0Zm9ybS5yZW1vdmVFdmVudExpc3RlbmVyIGFzIHJlbW92ZUV2ZW50TGlzdGVuZXJcclxuICovXHJcblxyXG4vKipcclxuICogQGludGVyZmFjZSBJRXZlbnRcclxuICogQHByb3Age1N0cmluZ30gdHlwZSAtIFRoZSBldmVudCB0eXBlIG5hbWUsIHBvc3NpYmxlIHZhbHVlcyBhcmU6XHJcbiAqICdjb250ZXh0bWVudScsICdtb3VzZWVudGVyJywgJ21vdXNlZG93bicsICdtb3VzZW1vdmUnLCAnbW91c2V1cCcsICdtb3VzZW91dCcsXHJcbiAqICdjbGljaycsICdkYmxjbGljaycsICdrZXlkb3duJywgJ2tleXByZXNzJywgJ2tleXVwJyBhbmQgJ3Jlc2l6ZSdcclxuICogQHByb3Ageyp9IG5hdGl2ZSAtIFRoZSBvcmlnaW5hbCBuYXRpdmUgZXZlbnQgKG51bGwgZm9yIGVtdWxhdGVkIGV2ZW50cywgZS5nLiAncmVzaXplJylcclxuICogQHByb3Age051bWJlcn0geCAtIFRoZSBtb3VzZSB4IHBvc2l0aW9uLCByZWxhdGl2ZSB0byB0aGUgY2FudmFzIChudWxsIGZvciBpbmNvbXBhdGlibGUgZXZlbnRzKVxyXG4gKiBAcHJvcCB7TnVtYmVyfSB5IC0gVGhlIG1vdXNlIHkgcG9zaXRpb24sIHJlbGF0aXZlIHRvIHRoZSBjYW52YXMgKG51bGwgZm9yIGluY29tcGF0aWJsZSBldmVudHMpXHJcbiAqL1xyXG5cclxufSx7XCI0NlwiOjQ2LFwiNDdcIjo0NyxcIjQ4XCI6NDh9XSw1MDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge307XHJcbm1vZHVsZS5leHBvcnRzLmZpbGxlciA9IHJlcXVpcmUoNTEpO1xyXG5tb2R1bGUuZXhwb3J0cy5sZWdlbmQgPSByZXF1aXJlKDUyKTtcclxubW9kdWxlLmV4cG9ydHMudGl0bGUgPSByZXF1aXJlKDUzKTtcclxuXHJcbn0se1wiNTFcIjo1MSxcIjUyXCI6NTIsXCI1M1wiOjUzfV0sNTE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xyXG4vKipcclxuICogUGx1Z2luIGJhc2VkIG9uIGRpc2N1c3Npb24gZnJvbSB0aGUgZm9sbG93aW5nIENoYXJ0LmpzIGlzc3VlczpcclxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9pc3N1ZXMvMjM4MCNpc3N1ZWNvbW1lbnQtMjc5OTYxNTY5XHJcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2NoYXJ0anMvQ2hhcnQuanMvaXNzdWVzLzI0NDAjaXNzdWVjb21tZW50LTI1NjQ2MTg5N1xyXG4gKi9cclxuXHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xyXG52YXIgZWxlbWVudHMgPSByZXF1aXJlKDQxKTtcclxudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcclxuXHJcbmRlZmF1bHRzLl9zZXQoJ2dsb2JhbCcsIHtcclxuXHRwbHVnaW5zOiB7XHJcblx0XHRmaWxsZXI6IHtcclxuXHRcdFx0cHJvcGFnYXRlOiB0cnVlXHJcblx0XHR9XHJcblx0fVxyXG59KTtcclxuXHJcbnZhciBtYXBwZXJzID0ge1xyXG5cdGRhdGFzZXQ6IGZ1bmN0aW9uKHNvdXJjZSkge1xyXG5cdFx0dmFyIGluZGV4ID0gc291cmNlLmZpbGw7XHJcblx0XHR2YXIgY2hhcnQgPSBzb3VyY2UuY2hhcnQ7XHJcblx0XHR2YXIgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGluZGV4KTtcclxuXHRcdHZhciB2aXNpYmxlID0gbWV0YSAmJiBjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGluZGV4KTtcclxuXHRcdHZhciBwb2ludHMgPSAodmlzaWJsZSAmJiBtZXRhLmRhdGFzZXQuX2NoaWxkcmVuKSB8fCBbXTtcclxuXHRcdHZhciBsZW5ndGggPSBwb2ludHMubGVuZ3RoIHx8IDA7XHJcblxyXG5cdFx0cmV0dXJuICFsZW5ndGggPyBudWxsIDogZnVuY3Rpb24ocG9pbnQsIGkpIHtcclxuXHRcdFx0cmV0dXJuIChpIDwgbGVuZ3RoICYmIHBvaW50c1tpXS5fdmlldykgfHwgbnVsbDtcclxuXHRcdH07XHJcblx0fSxcclxuXHJcblx0Ym91bmRhcnk6IGZ1bmN0aW9uKHNvdXJjZSkge1xyXG5cdFx0dmFyIGJvdW5kYXJ5ID0gc291cmNlLmJvdW5kYXJ5O1xyXG5cdFx0dmFyIHggPSBib3VuZGFyeSA/IGJvdW5kYXJ5LnggOiBudWxsO1xyXG5cdFx0dmFyIHkgPSBib3VuZGFyeSA/IGJvdW5kYXJ5LnkgOiBudWxsO1xyXG5cclxuXHRcdHJldHVybiBmdW5jdGlvbihwb2ludCkge1xyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdHg6IHggPT09IG51bGwgPyBwb2ludC54IDogeCxcclxuXHRcdFx0XHR5OiB5ID09PSBudWxsID8gcG9pbnQueSA6IHksXHJcblx0XHRcdH07XHJcblx0XHR9O1xyXG5cdH1cclxufTtcclxuXHJcbi8vIEB0b2RvIGlmIChmaWxsWzBdID09PSAnIycpXHJcbmZ1bmN0aW9uIGRlY29kZUZpbGwoZWwsIGluZGV4LCBjb3VudCkge1xyXG5cdHZhciBtb2RlbCA9IGVsLl9tb2RlbCB8fCB7fTtcclxuXHR2YXIgZmlsbCA9IG1vZGVsLmZpbGw7XHJcblx0dmFyIHRhcmdldDtcclxuXHJcblx0aWYgKGZpbGwgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0ZmlsbCA9ICEhbW9kZWwuYmFja2dyb3VuZENvbG9yO1xyXG5cdH1cclxuXHJcblx0aWYgKGZpbGwgPT09IGZhbHNlIHx8IGZpbGwgPT09IG51bGwpIHtcclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHR9XHJcblxyXG5cdGlmIChmaWxsID09PSB0cnVlKSB7XHJcblx0XHRyZXR1cm4gJ29yaWdpbic7XHJcblx0fVxyXG5cclxuXHR0YXJnZXQgPSBwYXJzZUZsb2F0KGZpbGwsIDEwKTtcclxuXHRpZiAoaXNGaW5pdGUodGFyZ2V0KSAmJiBNYXRoLmZsb29yKHRhcmdldCkgPT09IHRhcmdldCkge1xyXG5cdFx0aWYgKGZpbGxbMF0gPT09ICctJyB8fCBmaWxsWzBdID09PSAnKycpIHtcclxuXHRcdFx0dGFyZ2V0ID0gaW5kZXggKyB0YXJnZXQ7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRhcmdldCA9PT0gaW5kZXggfHwgdGFyZ2V0IDwgMCB8fCB0YXJnZXQgPj0gY291bnQpIHtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0YXJnZXQ7XHJcblx0fVxyXG5cclxuXHRzd2l0Y2ggKGZpbGwpIHtcclxuXHQvLyBjb21wYXRpYmlsaXR5XHJcblx0Y2FzZSAnYm90dG9tJzpcclxuXHRcdHJldHVybiAnc3RhcnQnO1xyXG5cdGNhc2UgJ3RvcCc6XHJcblx0XHRyZXR1cm4gJ2VuZCc7XHJcblx0Y2FzZSAnemVybyc6XHJcblx0XHRyZXR1cm4gJ29yaWdpbic7XHJcblx0Ly8gc3VwcG9ydGVkIGJvdW5kYXJpZXNcclxuXHRjYXNlICdvcmlnaW4nOlxyXG5cdGNhc2UgJ3N0YXJ0JzpcclxuXHRjYXNlICdlbmQnOlxyXG5cdFx0cmV0dXJuIGZpbGw7XHJcblx0Ly8gaW52YWxpZCBmaWxsIHZhbHVlc1xyXG5cdGRlZmF1bHQ6XHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG59XHJcblxyXG5mdW5jdGlvbiBjb21wdXRlQm91bmRhcnkoc291cmNlKSB7XHJcblx0dmFyIG1vZGVsID0gc291cmNlLmVsLl9tb2RlbCB8fCB7fTtcclxuXHR2YXIgc2NhbGUgPSBzb3VyY2UuZWwuX3NjYWxlIHx8IHt9O1xyXG5cdHZhciBmaWxsID0gc291cmNlLmZpbGw7XHJcblx0dmFyIHRhcmdldCA9IG51bGw7XHJcblx0dmFyIGhvcml6b250YWw7XHJcblxyXG5cdGlmIChpc0Zpbml0ZShmaWxsKSkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cclxuXHQvLyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5OiB1bnRpbCB2Mywgd2Ugc3RpbGwgbmVlZCB0byBzdXBwb3J0IGJvdW5kYXJ5IHZhbHVlcyBzZXQgb25cclxuXHQvLyB0aGUgbW9kZWwgKHNjYWxlVG9wLCBzY2FsZUJvdHRvbSBhbmQgc2NhbGVaZXJvKSBiZWNhdXNlIHNvbWUgZXh0ZXJuYWwgcGx1Z2lucyBhbmRcclxuXHQvLyBjb250cm9sbGVycyBtaWdodCBzdGlsbCB1c2UgaXQgKGUuZy4gdGhlIFNtaXRoIGNoYXJ0KS5cclxuXHJcblx0aWYgKGZpbGwgPT09ICdzdGFydCcpIHtcclxuXHRcdHRhcmdldCA9IG1vZGVsLnNjYWxlQm90dG9tID09PSB1bmRlZmluZWQgPyBzY2FsZS5ib3R0b20gOiBtb2RlbC5zY2FsZUJvdHRvbTtcclxuXHR9IGVsc2UgaWYgKGZpbGwgPT09ICdlbmQnKSB7XHJcblx0XHR0YXJnZXQgPSBtb2RlbC5zY2FsZVRvcCA9PT0gdW5kZWZpbmVkID8gc2NhbGUudG9wIDogbW9kZWwuc2NhbGVUb3A7XHJcblx0fSBlbHNlIGlmIChtb2RlbC5zY2FsZVplcm8gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0dGFyZ2V0ID0gbW9kZWwuc2NhbGVaZXJvO1xyXG5cdH0gZWxzZSBpZiAoc2NhbGUuZ2V0QmFzZVBvc2l0aW9uKSB7XHJcblx0XHR0YXJnZXQgPSBzY2FsZS5nZXRCYXNlUG9zaXRpb24oKTtcclxuXHR9IGVsc2UgaWYgKHNjYWxlLmdldEJhc2VQaXhlbCkge1xyXG5cdFx0dGFyZ2V0ID0gc2NhbGUuZ2V0QmFzZVBpeGVsKCk7XHJcblx0fVxyXG5cclxuXHRpZiAodGFyZ2V0ICE9PSB1bmRlZmluZWQgJiYgdGFyZ2V0ICE9PSBudWxsKSB7XHJcblx0XHRpZiAodGFyZ2V0LnggIT09IHVuZGVmaW5lZCAmJiB0YXJnZXQueSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHJldHVybiB0YXJnZXQ7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHR5cGVvZiB0YXJnZXQgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHRhcmdldCkpIHtcclxuXHRcdFx0aG9yaXpvbnRhbCA9IHNjYWxlLmlzSG9yaXpvbnRhbCgpO1xyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdHg6IGhvcml6b250YWwgPyB0YXJnZXQgOiBudWxsLFxyXG5cdFx0XHRcdHk6IGhvcml6b250YWwgPyBudWxsIDogdGFyZ2V0XHJcblx0XHRcdH07XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gbnVsbDtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVzb2x2ZVRhcmdldChzb3VyY2VzLCBpbmRleCwgcHJvcGFnYXRlKSB7XHJcblx0dmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdO1xyXG5cdHZhciBmaWxsID0gc291cmNlLmZpbGw7XHJcblx0dmFyIHZpc2l0ZWQgPSBbaW5kZXhdO1xyXG5cdHZhciB0YXJnZXQ7XHJcblxyXG5cdGlmICghcHJvcGFnYXRlKSB7XHJcblx0XHRyZXR1cm4gZmlsbDtcclxuXHR9XHJcblxyXG5cdHdoaWxlIChmaWxsICE9PSBmYWxzZSAmJiB2aXNpdGVkLmluZGV4T2YoZmlsbCkgPT09IC0xKSB7XHJcblx0XHRpZiAoIWlzRmluaXRlKGZpbGwpKSB7XHJcblx0XHRcdHJldHVybiBmaWxsO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRhcmdldCA9IHNvdXJjZXNbZmlsbF07XHJcblx0XHRpZiAoIXRhcmdldCkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRhcmdldC52aXNpYmxlKSB7XHJcblx0XHRcdHJldHVybiBmaWxsO1xyXG5cdFx0fVxyXG5cclxuXHRcdHZpc2l0ZWQucHVzaChmaWxsKTtcclxuXHRcdGZpbGwgPSB0YXJnZXQuZmlsbDtcclxuXHR9XHJcblxyXG5cdHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlTWFwcGVyKHNvdXJjZSkge1xyXG5cdHZhciBmaWxsID0gc291cmNlLmZpbGw7XHJcblx0dmFyIHR5cGUgPSAnZGF0YXNldCc7XHJcblxyXG5cdGlmIChmaWxsID09PSBmYWxzZSkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cclxuXHRpZiAoIWlzRmluaXRlKGZpbGwpKSB7XHJcblx0XHR0eXBlID0gJ2JvdW5kYXJ5JztcclxuXHR9XHJcblxyXG5cdHJldHVybiBtYXBwZXJzW3R5cGVdKHNvdXJjZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzRHJhd2FibGUocG9pbnQpIHtcclxuXHRyZXR1cm4gcG9pbnQgJiYgIXBvaW50LnNraXA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRyYXdBcmVhKGN0eCwgY3VydmUwLCBjdXJ2ZTEsIGxlbjAsIGxlbjEpIHtcclxuXHR2YXIgaTtcclxuXHJcblx0aWYgKCFsZW4wIHx8ICFsZW4xKSB7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuXHQvLyBidWlsZGluZyBmaXJzdCBhcmVhIGN1cnZlIChub3JtYWwpXHJcblx0Y3R4Lm1vdmVUbyhjdXJ2ZTBbMF0ueCwgY3VydmUwWzBdLnkpO1xyXG5cdGZvciAoaSA9IDE7IGkgPCBsZW4wOyArK2kpIHtcclxuXHRcdGhlbHBlcnMuY2FudmFzLmxpbmVUbyhjdHgsIGN1cnZlMFtpIC0gMV0sIGN1cnZlMFtpXSk7XHJcblx0fVxyXG5cclxuXHQvLyBqb2luaW5nIHRoZSB0d28gYXJlYSBjdXJ2ZXNcclxuXHRjdHgubGluZVRvKGN1cnZlMVtsZW4xIC0gMV0ueCwgY3VydmUxW2xlbjEgLSAxXS55KTtcclxuXHJcblx0Ly8gYnVpbGRpbmcgb3Bwb3NpdGUgYXJlYSBjdXJ2ZSAocmV2ZXJzZSlcclxuXHRmb3IgKGkgPSBsZW4xIC0gMTsgaSA+IDA7IC0taSkge1xyXG5cdFx0aGVscGVycy5jYW52YXMubGluZVRvKGN0eCwgY3VydmUxW2ldLCBjdXJ2ZTFbaSAtIDFdLCB0cnVlKTtcclxuXHR9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGRvRmlsbChjdHgsIHBvaW50cywgbWFwcGVyLCB2aWV3LCBjb2xvciwgbG9vcCkge1xyXG5cdHZhciBjb3VudCA9IHBvaW50cy5sZW5ndGg7XHJcblx0dmFyIHNwYW4gPSB2aWV3LnNwYW5HYXBzO1xyXG5cdHZhciBjdXJ2ZTAgPSBbXTtcclxuXHR2YXIgY3VydmUxID0gW107XHJcblx0dmFyIGxlbjAgPSAwO1xyXG5cdHZhciBsZW4xID0gMDtcclxuXHR2YXIgaSwgaWxlbiwgaW5kZXgsIHAwLCBwMSwgZDAsIGQxO1xyXG5cclxuXHRjdHguYmVnaW5QYXRoKCk7XHJcblxyXG5cdGZvciAoaSA9IDAsIGlsZW4gPSAoY291bnQgKyAhIWxvb3ApOyBpIDwgaWxlbjsgKytpKSB7XHJcblx0XHRpbmRleCA9IGkgJSBjb3VudDtcclxuXHRcdHAwID0gcG9pbnRzW2luZGV4XS5fdmlldztcclxuXHRcdHAxID0gbWFwcGVyKHAwLCBpbmRleCwgdmlldyk7XHJcblx0XHRkMCA9IGlzRHJhd2FibGUocDApO1xyXG5cdFx0ZDEgPSBpc0RyYXdhYmxlKHAxKTtcclxuXHJcblx0XHRpZiAoZDAgJiYgZDEpIHtcclxuXHRcdFx0bGVuMCA9IGN1cnZlMC5wdXNoKHAwKTtcclxuXHRcdFx0bGVuMSA9IGN1cnZlMS5wdXNoKHAxKTtcclxuXHRcdH0gZWxzZSBpZiAobGVuMCAmJiBsZW4xKSB7XHJcblx0XHRcdGlmICghc3Bhbikge1xyXG5cdFx0XHRcdGRyYXdBcmVhKGN0eCwgY3VydmUwLCBjdXJ2ZTEsIGxlbjAsIGxlbjEpO1xyXG5cdFx0XHRcdGxlbjAgPSBsZW4xID0gMDtcclxuXHRcdFx0XHRjdXJ2ZTAgPSBbXTtcclxuXHRcdFx0XHRjdXJ2ZTEgPSBbXTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRpZiAoZDApIHtcclxuXHRcdFx0XHRcdGN1cnZlMC5wdXNoKHAwKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKGQxKSB7XHJcblx0XHRcdFx0XHRjdXJ2ZTEucHVzaChwMSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRkcmF3QXJlYShjdHgsIGN1cnZlMCwgY3VydmUxLCBsZW4wLCBsZW4xKTtcclxuXHJcblx0Y3R4LmNsb3NlUGF0aCgpO1xyXG5cdGN0eC5maWxsU3R5bGUgPSBjb2xvcjtcclxuXHRjdHguZmlsbCgpO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHRpZDogJ2ZpbGxlcicsXHJcblxyXG5cdGFmdGVyRGF0YXNldHNVcGRhdGU6IGZ1bmN0aW9uKGNoYXJ0LCBvcHRpb25zKSB7XHJcblx0XHR2YXIgY291bnQgPSAoY2hhcnQuZGF0YS5kYXRhc2V0cyB8fCBbXSkubGVuZ3RoO1xyXG5cdFx0dmFyIHByb3BhZ2F0ZSA9IG9wdGlvbnMucHJvcGFnYXRlO1xyXG5cdFx0dmFyIHNvdXJjZXMgPSBbXTtcclxuXHRcdHZhciBtZXRhLCBpLCBlbCwgc291cmNlO1xyXG5cclxuXHRcdGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XHJcblx0XHRcdG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShpKTtcclxuXHRcdFx0ZWwgPSBtZXRhLmRhdGFzZXQ7XHJcblx0XHRcdHNvdXJjZSA9IG51bGw7XHJcblxyXG5cdFx0XHRpZiAoZWwgJiYgZWwuX21vZGVsICYmIGVsIGluc3RhbmNlb2YgZWxlbWVudHMuTGluZSkge1xyXG5cdFx0XHRcdHNvdXJjZSA9IHtcclxuXHRcdFx0XHRcdHZpc2libGU6IGNoYXJ0LmlzRGF0YXNldFZpc2libGUoaSksXHJcblx0XHRcdFx0XHRmaWxsOiBkZWNvZGVGaWxsKGVsLCBpLCBjb3VudCksXHJcblx0XHRcdFx0XHRjaGFydDogY2hhcnQsXHJcblx0XHRcdFx0XHRlbDogZWxcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRtZXRhLiRmaWxsZXIgPSBzb3VyY2U7XHJcblx0XHRcdHNvdXJjZXMucHVzaChzb3VyY2UpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7XHJcblx0XHRcdHNvdXJjZSA9IHNvdXJjZXNbaV07XHJcblx0XHRcdGlmICghc291cmNlKSB7XHJcblx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHNvdXJjZS5maWxsID0gcmVzb2x2ZVRhcmdldChzb3VyY2VzLCBpLCBwcm9wYWdhdGUpO1xyXG5cdFx0XHRzb3VyY2UuYm91bmRhcnkgPSBjb21wdXRlQm91bmRhcnkoc291cmNlKTtcclxuXHRcdFx0c291cmNlLm1hcHBlciA9IGNyZWF0ZU1hcHBlcihzb3VyY2UpO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdGJlZm9yZURhdGFzZXREcmF3OiBmdW5jdGlvbihjaGFydCwgYXJncykge1xyXG5cdFx0dmFyIG1ldGEgPSBhcmdzLm1ldGEuJGZpbGxlcjtcclxuXHRcdGlmICghbWV0YSkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIGN0eCA9IGNoYXJ0LmN0eDtcclxuXHRcdHZhciBlbCA9IG1ldGEuZWw7XHJcblx0XHR2YXIgdmlldyA9IGVsLl92aWV3O1xyXG5cdFx0dmFyIHBvaW50cyA9IGVsLl9jaGlsZHJlbiB8fCBbXTtcclxuXHRcdHZhciBtYXBwZXIgPSBtZXRhLm1hcHBlcjtcclxuXHRcdHZhciBjb2xvciA9IHZpZXcuYmFja2dyb3VuZENvbG9yIHx8IGRlZmF1bHRzLmdsb2JhbC5kZWZhdWx0Q29sb3I7XHJcblxyXG5cdFx0aWYgKG1hcHBlciAmJiBjb2xvciAmJiBwb2ludHMubGVuZ3RoKSB7XHJcblx0XHRcdGhlbHBlcnMuY2FudmFzLmNsaXBBcmVhKGN0eCwgY2hhcnQuY2hhcnRBcmVhKTtcclxuXHRcdFx0ZG9GaWxsKGN0eCwgcG9pbnRzLCBtYXBwZXIsIHZpZXcsIGNvbG9yLCBlbC5fbG9vcCk7XHJcblx0XHRcdGhlbHBlcnMuY2FudmFzLnVuY2xpcEFyZWEoY3R4KTtcclxuXHRcdH1cclxuXHR9XHJcbn07XHJcblxyXG59LHtcIjI2XCI6MjYsXCI0MVwiOjQxLFwiNDZcIjo0Nn1dLDUyOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgyNik7XHJcbnZhciBFbGVtZW50ID0gcmVxdWlyZSgyNyk7XHJcbnZhciBoZWxwZXJzID0gcmVxdWlyZSg0Nik7XHJcbnZhciBsYXlvdXRzID0gcmVxdWlyZSgzMSk7XHJcblxyXG52YXIgbm9vcCA9IGhlbHBlcnMubm9vcDtcclxuXHJcbmRlZmF1bHRzLl9zZXQoJ2dsb2JhbCcsIHtcclxuXHRsZWdlbmQ6IHtcclxuXHRcdGRpc3BsYXk6IHRydWUsXHJcblx0XHRwb3NpdGlvbjogJ3RvcCcsXHJcblx0XHRmdWxsV2lkdGg6IHRydWUsXHJcblx0XHRyZXZlcnNlOiBmYWxzZSxcclxuXHRcdHdlaWdodDogMTAwMCxcclxuXHJcblx0XHQvLyBhIGNhbGxiYWNrIHRoYXQgd2lsbCBoYW5kbGVcclxuXHRcdG9uQ2xpY2s6IGZ1bmN0aW9uKGUsIGxlZ2VuZEl0ZW0pIHtcclxuXHRcdFx0dmFyIGluZGV4ID0gbGVnZW5kSXRlbS5kYXRhc2V0SW5kZXg7XHJcblx0XHRcdHZhciBjaSA9IHRoaXMuY2hhcnQ7XHJcblx0XHRcdHZhciBtZXRhID0gY2kuZ2V0RGF0YXNldE1ldGEoaW5kZXgpO1xyXG5cclxuXHRcdFx0Ly8gU2VlIGNvbnRyb2xsZXIuaXNEYXRhc2V0VmlzaWJsZSBjb21tZW50XHJcblx0XHRcdG1ldGEuaGlkZGVuID0gbWV0YS5oaWRkZW4gPT09IG51bGwgPyAhY2kuZGF0YS5kYXRhc2V0c1tpbmRleF0uaGlkZGVuIDogbnVsbDtcclxuXHJcblx0XHRcdC8vIFdlIGhpZCBhIGRhdGFzZXQgLi4uIHJlcmVuZGVyIHRoZSBjaGFydFxyXG5cdFx0XHRjaS51cGRhdGUoKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0b25Ib3ZlcjogbnVsbCxcclxuXHJcblx0XHRsYWJlbHM6IHtcclxuXHRcdFx0Ym94V2lkdGg6IDQwLFxyXG5cdFx0XHRwYWRkaW5nOiAxMCxcclxuXHRcdFx0Ly8gR2VuZXJhdGVzIGxhYmVscyBzaG93biBpbiB0aGUgbGVnZW5kXHJcblx0XHRcdC8vIFZhbGlkIHByb3BlcnRpZXMgdG8gcmV0dXJuOlxyXG5cdFx0XHQvLyB0ZXh0IDogdGV4dCB0byBkaXNwbGF5XHJcblx0XHRcdC8vIGZpbGxTdHlsZSA6IGZpbGwgb2YgY29sb3VyZWQgYm94XHJcblx0XHRcdC8vIHN0cm9rZVN0eWxlOiBzdHJva2Ugb2YgY29sb3VyZWQgYm94XHJcblx0XHRcdC8vIGhpZGRlbiA6IGlmIHRoaXMgbGVnZW5kIGl0ZW0gcmVmZXJzIHRvIGEgaGlkZGVuIGl0ZW1cclxuXHRcdFx0Ly8gbGluZUNhcCA6IGNhcCBzdHlsZSBmb3IgbGluZVxyXG5cdFx0XHQvLyBsaW5lRGFzaFxyXG5cdFx0XHQvLyBsaW5lRGFzaE9mZnNldCA6XHJcblx0XHRcdC8vIGxpbmVKb2luIDpcclxuXHRcdFx0Ly8gbGluZVdpZHRoIDpcclxuXHRcdFx0Z2VuZXJhdGVMYWJlbHM6IGZ1bmN0aW9uKGNoYXJ0KSB7XHJcblx0XHRcdFx0dmFyIGRhdGEgPSBjaGFydC5kYXRhO1xyXG5cdFx0XHRcdHJldHVybiBoZWxwZXJzLmlzQXJyYXkoZGF0YS5kYXRhc2V0cykgPyBkYXRhLmRhdGFzZXRzLm1hcChmdW5jdGlvbihkYXRhc2V0LCBpKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdFx0XHR0ZXh0OiBkYXRhc2V0LmxhYmVsLFxyXG5cdFx0XHRcdFx0XHRmaWxsU3R5bGU6ICghaGVscGVycy5pc0FycmF5KGRhdGFzZXQuYmFja2dyb3VuZENvbG9yKSA/IGRhdGFzZXQuYmFja2dyb3VuZENvbG9yIDogZGF0YXNldC5iYWNrZ3JvdW5kQ29sb3JbMF0pLFxyXG5cdFx0XHRcdFx0XHRoaWRkZW46ICFjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGkpLFxyXG5cdFx0XHRcdFx0XHRsaW5lQ2FwOiBkYXRhc2V0LmJvcmRlckNhcFN0eWxlLFxyXG5cdFx0XHRcdFx0XHRsaW5lRGFzaDogZGF0YXNldC5ib3JkZXJEYXNoLFxyXG5cdFx0XHRcdFx0XHRsaW5lRGFzaE9mZnNldDogZGF0YXNldC5ib3JkZXJEYXNoT2Zmc2V0LFxyXG5cdFx0XHRcdFx0XHRsaW5lSm9pbjogZGF0YXNldC5ib3JkZXJKb2luU3R5bGUsXHJcblx0XHRcdFx0XHRcdGxpbmVXaWR0aDogZGF0YXNldC5ib3JkZXJXaWR0aCxcclxuXHRcdFx0XHRcdFx0c3Ryb2tlU3R5bGU6IGRhdGFzZXQuYm9yZGVyQ29sb3IsXHJcblx0XHRcdFx0XHRcdHBvaW50U3R5bGU6IGRhdGFzZXQucG9pbnRTdHlsZSxcclxuXHJcblx0XHRcdFx0XHRcdC8vIEJlbG93IGlzIGV4dHJhIGRhdGEgdXNlZCBmb3IgdG9nZ2xpbmcgdGhlIGRhdGFzZXRzXHJcblx0XHRcdFx0XHRcdGRhdGFzZXRJbmRleDogaVxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9LCB0aGlzKSA6IFtdO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0bGVnZW5kQ2FsbGJhY2s6IGZ1bmN0aW9uKGNoYXJ0KSB7XHJcblx0XHR2YXIgdGV4dCA9IFtdO1xyXG5cdFx0dGV4dC5wdXNoKCc8dWwgY2xhc3M9XCInICsgY2hhcnQuaWQgKyAnLWxlZ2VuZFwiPicpO1xyXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBjaGFydC5kYXRhLmRhdGFzZXRzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdHRleHQucHVzaCgnPGxpPjxzcGFuIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjonICsgY2hhcnQuZGF0YS5kYXRhc2V0c1tpXS5iYWNrZ3JvdW5kQ29sb3IgKyAnXCI+PC9zcGFuPicpO1xyXG5cdFx0XHRpZiAoY2hhcnQuZGF0YS5kYXRhc2V0c1tpXS5sYWJlbCkge1xyXG5cdFx0XHRcdHRleHQucHVzaChjaGFydC5kYXRhLmRhdGFzZXRzW2ldLmxhYmVsKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0ZXh0LnB1c2goJzwvbGk+Jyk7XHJcblx0XHR9XHJcblx0XHR0ZXh0LnB1c2goJzwvdWw+Jyk7XHJcblx0XHRyZXR1cm4gdGV4dC5qb2luKCcnKTtcclxuXHR9XHJcbn0pO1xyXG5cclxuLyoqXHJcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIGJveCB3aWR0aCBiYXNlZCBvbiB0aGUgdXNlUG9pbnRTdHlsZSBvcHRpb25cclxuICogQHBhcmFtIGxhYmVsb3B0cyB7T2JqZWN0fSB0aGUgbGFiZWwgb3B0aW9ucyBvbiB0aGUgbGVnZW5kXHJcbiAqIEBwYXJhbSBmb250U2l6ZSB7TnVtYmVyfSB0aGUgbGFiZWwgZm9udCBzaXplXHJcbiAqIEByZXR1cm4ge051bWJlcn0gd2lkdGggb2YgdGhlIGNvbG9yIGJveCBhcmVhXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRCb3hXaWR0aChsYWJlbE9wdHMsIGZvbnRTaXplKSB7XHJcblx0cmV0dXJuIGxhYmVsT3B0cy51c2VQb2ludFN0eWxlID9cclxuXHRcdGZvbnRTaXplICogTWF0aC5TUVJUMiA6XHJcblx0XHRsYWJlbE9wdHMuYm94V2lkdGg7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJTVBPUlRBTlQ6IHRoaXMgY2xhc3MgaXMgZXhwb3NlZCBwdWJsaWNseSBhcyBDaGFydC5MZWdlbmQsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcmVxdWlyZWQhXHJcbiAqL1xyXG52YXIgTGVnZW5kID0gRWxlbWVudC5leHRlbmQoe1xyXG5cclxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihjb25maWcpIHtcclxuXHRcdGhlbHBlcnMuZXh0ZW5kKHRoaXMsIGNvbmZpZyk7XHJcblxyXG5cdFx0Ly8gQ29udGFpbnMgaGl0IGJveGVzIGZvciBlYWNoIGRhdGFzZXQgKGluIGRhdGFzZXQgb3JkZXIpXHJcblx0XHR0aGlzLmxlZ2VuZEhpdEJveGVzID0gW107XHJcblxyXG5cdFx0Ly8gQXJlIHdlIGluIGRvdWdobnV0IG1vZGUgd2hpY2ggaGFzIGEgZGlmZmVyZW50IGRhdGEgdHlwZVxyXG5cdFx0dGhpcy5kb3VnaG51dE1vZGUgPSBmYWxzZTtcclxuXHR9LFxyXG5cclxuXHQvLyBUaGVzZSBtZXRob2RzIGFyZSBvcmRlcmVkIGJ5IGxpZmVjeWNsZS4gVXRpbGl0aWVzIHRoZW4gZm9sbG93LlxyXG5cdC8vIEFueSBmdW5jdGlvbiBkZWZpbmVkIGhlcmUgaXMgaW5oZXJpdGVkIGJ5IGFsbCBsZWdlbmQgdHlwZXMuXHJcblx0Ly8gQW55IGZ1bmN0aW9uIGNhbiBiZSBleHRlbmRlZCBieSB0aGUgbGVnZW5kIHR5cGVcclxuXHJcblx0YmVmb3JlVXBkYXRlOiBub29wLFxyXG5cdHVwZGF0ZTogZnVuY3Rpb24obWF4V2lkdGgsIG1heEhlaWdodCwgbWFyZ2lucykge1xyXG5cdFx0dmFyIG1lID0gdGhpcztcclxuXHJcblx0XHQvLyBVcGRhdGUgTGlmZWN5Y2xlIC0gUHJvYmFibHkgZG9uJ3Qgd2FudCB0byBldmVyIGV4dGVuZCBvciBvdmVyd3JpdGUgdGhpcyBmdW5jdGlvbiA7KVxyXG5cdFx0bWUuYmVmb3JlVXBkYXRlKCk7XHJcblxyXG5cdFx0Ly8gQWJzb3JiIHRoZSBtYXN0ZXIgbWVhc3VyZW1lbnRzXHJcblx0XHRtZS5tYXhXaWR0aCA9IG1heFdpZHRoO1xyXG5cdFx0bWUubWF4SGVpZ2h0ID0gbWF4SGVpZ2h0O1xyXG5cdFx0bWUubWFyZ2lucyA9IG1hcmdpbnM7XHJcblxyXG5cdFx0Ly8gRGltZW5zaW9uc1xyXG5cdFx0bWUuYmVmb3JlU2V0RGltZW5zaW9ucygpO1xyXG5cdFx0bWUuc2V0RGltZW5zaW9ucygpO1xyXG5cdFx0bWUuYWZ0ZXJTZXREaW1lbnNpb25zKCk7XHJcblx0XHQvLyBMYWJlbHNcclxuXHRcdG1lLmJlZm9yZUJ1aWxkTGFiZWxzKCk7XHJcblx0XHRtZS5idWlsZExhYmVscygpO1xyXG5cdFx0bWUuYWZ0ZXJCdWlsZExhYmVscygpO1xyXG5cclxuXHRcdC8vIEZpdFxyXG5cdFx0bWUuYmVmb3JlRml0KCk7XHJcblx0XHRtZS5maXQoKTtcclxuXHRcdG1lLmFmdGVyRml0KCk7XHJcblx0XHQvL1xyXG5cdFx0bWUuYWZ0ZXJVcGRhdGUoKTtcclxuXHJcblx0XHRyZXR1cm4gbWUubWluU2l6ZTtcclxuXHR9LFxyXG5cdGFmdGVyVXBkYXRlOiBub29wLFxyXG5cclxuXHQvL1xyXG5cclxuXHRiZWZvcmVTZXREaW1lbnNpb25zOiBub29wLFxyXG5cdHNldERpbWVuc2lvbnM6IGZ1bmN0aW9uKCkge1xyXG5cdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdC8vIFNldCB0aGUgdW5jb25zdHJhaW5lZCBkaW1lbnNpb24gYmVmb3JlIGxhYmVsIHJvdGF0aW9uXHJcblx0XHRpZiAobWUuaXNIb3Jpem9udGFsKCkpIHtcclxuXHRcdFx0Ly8gUmVzZXQgcG9zaXRpb24gYmVmb3JlIGNhbGN1bGF0aW5nIHJvdGF0aW9uXHJcblx0XHRcdG1lLndpZHRoID0gbWUubWF4V2lkdGg7XHJcblx0XHRcdG1lLmxlZnQgPSAwO1xyXG5cdFx0XHRtZS5yaWdodCA9IG1lLndpZHRoO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0bWUuaGVpZ2h0ID0gbWUubWF4SGVpZ2h0O1xyXG5cclxuXHRcdFx0Ly8gUmVzZXQgcG9zaXRpb24gYmVmb3JlIGNhbGN1bGF0aW5nIHJvdGF0aW9uXHJcblx0XHRcdG1lLnRvcCA9IDA7XHJcblx0XHRcdG1lLmJvdHRvbSA9IG1lLmhlaWdodDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBSZXNldCBwYWRkaW5nXHJcblx0XHRtZS5wYWRkaW5nTGVmdCA9IDA7XHJcblx0XHRtZS5wYWRkaW5nVG9wID0gMDtcclxuXHRcdG1lLnBhZGRpbmdSaWdodCA9IDA7XHJcblx0XHRtZS5wYWRkaW5nQm90dG9tID0gMDtcclxuXHJcblx0XHQvLyBSZXNldCBtaW5TaXplXHJcblx0XHRtZS5taW5TaXplID0ge1xyXG5cdFx0XHR3aWR0aDogMCxcclxuXHRcdFx0aGVpZ2h0OiAwXHJcblx0XHR9O1xyXG5cdH0sXHJcblx0YWZ0ZXJTZXREaW1lbnNpb25zOiBub29wLFxyXG5cclxuXHQvL1xyXG5cclxuXHRiZWZvcmVCdWlsZExhYmVsczogbm9vcCxcclxuXHRidWlsZExhYmVsczogZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0dmFyIGxhYmVsT3B0cyA9IG1lLm9wdGlvbnMubGFiZWxzIHx8IHt9O1xyXG5cdFx0dmFyIGxlZ2VuZEl0ZW1zID0gaGVscGVycy5jYWxsYmFjayhsYWJlbE9wdHMuZ2VuZXJhdGVMYWJlbHMsIFttZS5jaGFydF0sIG1lKSB8fCBbXTtcclxuXHJcblx0XHRpZiAobGFiZWxPcHRzLmZpbHRlcikge1xyXG5cdFx0XHRsZWdlbmRJdGVtcyA9IGxlZ2VuZEl0ZW1zLmZpbHRlcihmdW5jdGlvbihpdGVtKSB7XHJcblx0XHRcdFx0cmV0dXJuIGxhYmVsT3B0cy5maWx0ZXIoaXRlbSwgbWUuY2hhcnQuZGF0YSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChtZS5vcHRpb25zLnJldmVyc2UpIHtcclxuXHRcdFx0bGVnZW5kSXRlbXMucmV2ZXJzZSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdG1lLmxlZ2VuZEl0ZW1zID0gbGVnZW5kSXRlbXM7XHJcblx0fSxcclxuXHRhZnRlckJ1aWxkTGFiZWxzOiBub29wLFxyXG5cclxuXHQvL1xyXG5cclxuXHRiZWZvcmVGaXQ6IG5vb3AsXHJcblx0Zml0OiBmdW5jdGlvbigpIHtcclxuXHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHR2YXIgb3B0cyA9IG1lLm9wdGlvbnM7XHJcblx0XHR2YXIgbGFiZWxPcHRzID0gb3B0cy5sYWJlbHM7XHJcblx0XHR2YXIgZGlzcGxheSA9IG9wdHMuZGlzcGxheTtcclxuXHJcblx0XHR2YXIgY3R4ID0gbWUuY3R4O1xyXG5cclxuXHRcdHZhciBnbG9iYWxEZWZhdWx0ID0gZGVmYXVsdHMuZ2xvYmFsO1xyXG5cdFx0dmFyIHZhbHVlT3JEZWZhdWx0ID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdDtcclxuXHRcdHZhciBmb250U2l6ZSA9IHZhbHVlT3JEZWZhdWx0KGxhYmVsT3B0cy5mb250U2l6ZSwgZ2xvYmFsRGVmYXVsdC5kZWZhdWx0Rm9udFNpemUpO1xyXG5cdFx0dmFyIGZvbnRTdHlsZSA9IHZhbHVlT3JEZWZhdWx0KGxhYmVsT3B0cy5mb250U3R5bGUsIGdsb2JhbERlZmF1bHQuZGVmYXVsdEZvbnRTdHlsZSk7XHJcblx0XHR2YXIgZm9udEZhbWlseSA9IHZhbHVlT3JEZWZhdWx0KGxhYmVsT3B0cy5mb250RmFtaWx5LCBnbG9iYWxEZWZhdWx0LmRlZmF1bHRGb250RmFtaWx5KTtcclxuXHRcdHZhciBsYWJlbEZvbnQgPSBoZWxwZXJzLmZvbnRTdHJpbmcoZm9udFNpemUsIGZvbnRTdHlsZSwgZm9udEZhbWlseSk7XHJcblxyXG5cdFx0Ly8gUmVzZXQgaGl0IGJveGVzXHJcblx0XHR2YXIgaGl0Ym94ZXMgPSBtZS5sZWdlbmRIaXRCb3hlcyA9IFtdO1xyXG5cclxuXHRcdHZhciBtaW5TaXplID0gbWUubWluU2l6ZTtcclxuXHRcdHZhciBpc0hvcml6b250YWwgPSBtZS5pc0hvcml6b250YWwoKTtcclxuXHJcblx0XHRpZiAoaXNIb3Jpem9udGFsKSB7XHJcblx0XHRcdG1pblNpemUud2lkdGggPSBtZS5tYXhXaWR0aDsgLy8gZmlsbCBhbGwgdGhlIHdpZHRoXHJcblx0XHRcdG1pblNpemUuaGVpZ2h0ID0gZGlzcGxheSA/IDEwIDogMDtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdG1pblNpemUud2lkdGggPSBkaXNwbGF5ID8gMTAgOiAwO1xyXG5cdFx0XHRtaW5TaXplLmhlaWdodCA9IG1lLm1heEhlaWdodDsgLy8gZmlsbCBhbGwgdGhlIGhlaWdodFxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEluY3JlYXNlIHNpemVzIGhlcmVcclxuXHRcdGlmIChkaXNwbGF5KSB7XHJcblx0XHRcdGN0eC5mb250ID0gbGFiZWxGb250O1xyXG5cclxuXHRcdFx0aWYgKGlzSG9yaXpvbnRhbCkge1xyXG5cdFx0XHRcdC8vIExhYmVsc1xyXG5cclxuXHRcdFx0XHQvLyBXaWR0aCBvZiBlYWNoIGxpbmUgb2YgbGVnZW5kIGJveGVzLiBMYWJlbHMgd3JhcCBvbnRvIG11bHRpcGxlIGxpbmVzIHdoZW4gdGhlcmUgYXJlIHRvbyBtYW55IHRvIGZpdCBvbiBvbmVcclxuXHRcdFx0XHR2YXIgbGluZVdpZHRocyA9IG1lLmxpbmVXaWR0aHMgPSBbMF07XHJcblx0XHRcdFx0dmFyIHRvdGFsSGVpZ2h0ID0gbWUubGVnZW5kSXRlbXMubGVuZ3RoID8gZm9udFNpemUgKyAobGFiZWxPcHRzLnBhZGRpbmcpIDogMDtcclxuXHJcblx0XHRcdFx0Y3R4LnRleHRBbGlnbiA9ICdsZWZ0JztcclxuXHRcdFx0XHRjdHgudGV4dEJhc2VsaW5lID0gJ3RvcCc7XHJcblxyXG5cdFx0XHRcdGhlbHBlcnMuZWFjaChtZS5sZWdlbmRJdGVtcywgZnVuY3Rpb24obGVnZW5kSXRlbSwgaSkge1xyXG5cdFx0XHRcdFx0dmFyIGJveFdpZHRoID0gZ2V0Qm94V2lkdGgobGFiZWxPcHRzLCBmb250U2l6ZSk7XHJcblx0XHRcdFx0XHR2YXIgd2lkdGggPSBib3hXaWR0aCArIChmb250U2l6ZSAvIDIpICsgY3R4Lm1lYXN1cmVUZXh0KGxlZ2VuZEl0ZW0udGV4dCkud2lkdGg7XHJcblxyXG5cdFx0XHRcdFx0aWYgKGxpbmVXaWR0aHNbbGluZVdpZHRocy5sZW5ndGggLSAxXSArIHdpZHRoICsgbGFiZWxPcHRzLnBhZGRpbmcgPj0gbWUud2lkdGgpIHtcclxuXHRcdFx0XHRcdFx0dG90YWxIZWlnaHQgKz0gZm9udFNpemUgKyAobGFiZWxPcHRzLnBhZGRpbmcpO1xyXG5cdFx0XHRcdFx0XHRsaW5lV2lkdGhzW2xpbmVXaWR0aHMubGVuZ3RoXSA9IG1lLmxlZnQ7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gU3RvcmUgdGhlIGhpdGJveCB3aWR0aCBhbmQgaGVpZ2h0IGhlcmUuIEZpbmFsIHBvc2l0aW9uIHdpbGwgYmUgdXBkYXRlZCBpbiBgZHJhd2BcclxuXHRcdFx0XHRcdGhpdGJveGVzW2ldID0ge1xyXG5cdFx0XHRcdFx0XHRsZWZ0OiAwLFxyXG5cdFx0XHRcdFx0XHR0b3A6IDAsXHJcblx0XHRcdFx0XHRcdHdpZHRoOiB3aWR0aCxcclxuXHRcdFx0XHRcdFx0aGVpZ2h0OiBmb250U2l6ZVxyXG5cdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHRsaW5lV2lkdGhzW2xpbmVXaWR0aHMubGVuZ3RoIC0gMV0gKz0gd2lkdGggKyBsYWJlbE9wdHMucGFkZGluZztcclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0bWluU2l6ZS5oZWlnaHQgKz0gdG90YWxIZWlnaHQ7XHJcblxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHZhciB2UGFkZGluZyA9IGxhYmVsT3B0cy5wYWRkaW5nO1xyXG5cdFx0XHRcdHZhciBjb2x1bW5XaWR0aHMgPSBtZS5jb2x1bW5XaWR0aHMgPSBbXTtcclxuXHRcdFx0XHR2YXIgdG90YWxXaWR0aCA9IGxhYmVsT3B0cy5wYWRkaW5nO1xyXG5cdFx0XHRcdHZhciBjdXJyZW50Q29sV2lkdGggPSAwO1xyXG5cdFx0XHRcdHZhciBjdXJyZW50Q29sSGVpZ2h0ID0gMDtcclxuXHRcdFx0XHR2YXIgaXRlbUhlaWdodCA9IGZvbnRTaXplICsgdlBhZGRpbmc7XHJcblxyXG5cdFx0XHRcdGhlbHBlcnMuZWFjaChtZS5sZWdlbmRJdGVtcywgZnVuY3Rpb24obGVnZW5kSXRlbSwgaSkge1xyXG5cdFx0XHRcdFx0dmFyIGJveFdpZHRoID0gZ2V0Qm94V2lkdGgobGFiZWxPcHRzLCBmb250U2l6ZSk7XHJcblx0XHRcdFx0XHR2YXIgaXRlbVdpZHRoID0gYm94V2lkdGggKyAoZm9udFNpemUgLyAyKSArIGN0eC5tZWFzdXJlVGV4dChsZWdlbmRJdGVtLnRleHQpLndpZHRoO1xyXG5cclxuXHRcdFx0XHRcdC8vIElmIHRvbyB0YWxsLCBnbyB0byBuZXcgY29sdW1uXHJcblx0XHRcdFx0XHRpZiAoY3VycmVudENvbEhlaWdodCArIGl0ZW1IZWlnaHQgPiBtaW5TaXplLmhlaWdodCkge1xyXG5cdFx0XHRcdFx0XHR0b3RhbFdpZHRoICs9IGN1cnJlbnRDb2xXaWR0aCArIGxhYmVsT3B0cy5wYWRkaW5nO1xyXG5cdFx0XHRcdFx0XHRjb2x1bW5XaWR0aHMucHVzaChjdXJyZW50Q29sV2lkdGgpOyAvLyBwcmV2aW91cyBjb2x1bW4gd2lkdGhcclxuXHJcblx0XHRcdFx0XHRcdGN1cnJlbnRDb2xXaWR0aCA9IDA7XHJcblx0XHRcdFx0XHRcdGN1cnJlbnRDb2xIZWlnaHQgPSAwO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8vIEdldCBtYXggd2lkdGhcclxuXHRcdFx0XHRcdGN1cnJlbnRDb2xXaWR0aCA9IE1hdGgubWF4KGN1cnJlbnRDb2xXaWR0aCwgaXRlbVdpZHRoKTtcclxuXHRcdFx0XHRcdGN1cnJlbnRDb2xIZWlnaHQgKz0gaXRlbUhlaWdodDtcclxuXHJcblx0XHRcdFx0XHQvLyBTdG9yZSB0aGUgaGl0Ym94IHdpZHRoIGFuZCBoZWlnaHQgaGVyZS4gRmluYWwgcG9zaXRpb24gd2lsbCBiZSB1cGRhdGVkIGluIGBkcmF3YFxyXG5cdFx0XHRcdFx0aGl0Ym94ZXNbaV0gPSB7XHJcblx0XHRcdFx0XHRcdGxlZnQ6IDAsXHJcblx0XHRcdFx0XHRcdHRvcDogMCxcclxuXHRcdFx0XHRcdFx0d2lkdGg6IGl0ZW1XaWR0aCxcclxuXHRcdFx0XHRcdFx0aGVpZ2h0OiBmb250U2l6ZVxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0dG90YWxXaWR0aCArPSBjdXJyZW50Q29sV2lkdGg7XHJcblx0XHRcdFx0Y29sdW1uV2lkdGhzLnB1c2goY3VycmVudENvbFdpZHRoKTtcclxuXHRcdFx0XHRtaW5TaXplLndpZHRoICs9IHRvdGFsV2lkdGg7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRtZS53aWR0aCA9IG1pblNpemUud2lkdGg7XHJcblx0XHRtZS5oZWlnaHQgPSBtaW5TaXplLmhlaWdodDtcclxuXHR9LFxyXG5cdGFmdGVyRml0OiBub29wLFxyXG5cclxuXHQvLyBTaGFyZWQgTWV0aG9kc1xyXG5cdGlzSG9yaXpvbnRhbDogZnVuY3Rpb24oKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5vcHRpb25zLnBvc2l0aW9uID09PSAndG9wJyB8fCB0aGlzLm9wdGlvbnMucG9zaXRpb24gPT09ICdib3R0b20nO1xyXG5cdH0sXHJcblxyXG5cdC8vIEFjdHVhbGx5IGRyYXcgdGhlIGxlZ2VuZCBvbiB0aGUgY2FudmFzXHJcblx0ZHJhdzogZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0dmFyIG9wdHMgPSBtZS5vcHRpb25zO1xyXG5cdFx0dmFyIGxhYmVsT3B0cyA9IG9wdHMubGFiZWxzO1xyXG5cdFx0dmFyIGdsb2JhbERlZmF1bHQgPSBkZWZhdWx0cy5nbG9iYWw7XHJcblx0XHR2YXIgbGluZURlZmF1bHQgPSBnbG9iYWxEZWZhdWx0LmVsZW1lbnRzLmxpbmU7XHJcblx0XHR2YXIgbGVnZW5kV2lkdGggPSBtZS53aWR0aDtcclxuXHRcdHZhciBsaW5lV2lkdGhzID0gbWUubGluZVdpZHRocztcclxuXHJcblx0XHRpZiAob3B0cy5kaXNwbGF5KSB7XHJcblx0XHRcdHZhciBjdHggPSBtZS5jdHg7XHJcblx0XHRcdHZhciB2YWx1ZU9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQ7XHJcblx0XHRcdHZhciBmb250Q29sb3IgPSB2YWx1ZU9yRGVmYXVsdChsYWJlbE9wdHMuZm9udENvbG9yLCBnbG9iYWxEZWZhdWx0LmRlZmF1bHRGb250Q29sb3IpO1xyXG5cdFx0XHR2YXIgZm9udFNpemUgPSB2YWx1ZU9yRGVmYXVsdChsYWJlbE9wdHMuZm9udFNpemUsIGdsb2JhbERlZmF1bHQuZGVmYXVsdEZvbnRTaXplKTtcclxuXHRcdFx0dmFyIGZvbnRTdHlsZSA9IHZhbHVlT3JEZWZhdWx0KGxhYmVsT3B0cy5mb250U3R5bGUsIGdsb2JhbERlZmF1bHQuZGVmYXVsdEZvbnRTdHlsZSk7XHJcblx0XHRcdHZhciBmb250RmFtaWx5ID0gdmFsdWVPckRlZmF1bHQobGFiZWxPcHRzLmZvbnRGYW1pbHksIGdsb2JhbERlZmF1bHQuZGVmYXVsdEZvbnRGYW1pbHkpO1xyXG5cdFx0XHR2YXIgbGFiZWxGb250ID0gaGVscGVycy5mb250U3RyaW5nKGZvbnRTaXplLCBmb250U3R5bGUsIGZvbnRGYW1pbHkpO1xyXG5cdFx0XHR2YXIgY3Vyc29yO1xyXG5cclxuXHRcdFx0Ly8gQ2FudmFzIHNldHVwXHJcblx0XHRcdGN0eC50ZXh0QWxpZ24gPSAnbGVmdCc7XHJcblx0XHRcdGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcclxuXHRcdFx0Y3R4LmxpbmVXaWR0aCA9IDAuNTtcclxuXHRcdFx0Y3R4LnN0cm9rZVN0eWxlID0gZm9udENvbG9yOyAvLyBmb3Igc3RyaWtldGhyb3VnaCBlZmZlY3RcclxuXHRcdFx0Y3R4LmZpbGxTdHlsZSA9IGZvbnRDb2xvcjsgLy8gcmVuZGVyIGluIGNvcnJlY3QgY29sb3VyXHJcblx0XHRcdGN0eC5mb250ID0gbGFiZWxGb250O1xyXG5cclxuXHRcdFx0dmFyIGJveFdpZHRoID0gZ2V0Qm94V2lkdGgobGFiZWxPcHRzLCBmb250U2l6ZSk7XHJcblx0XHRcdHZhciBoaXRib3hlcyA9IG1lLmxlZ2VuZEhpdEJveGVzO1xyXG5cclxuXHRcdFx0Ly8gY3VycmVudCBwb3NpdGlvblxyXG5cdFx0XHR2YXIgZHJhd0xlZ2VuZEJveCA9IGZ1bmN0aW9uKHgsIHksIGxlZ2VuZEl0ZW0pIHtcclxuXHRcdFx0XHRpZiAoaXNOYU4oYm94V2lkdGgpIHx8IGJveFdpZHRoIDw9IDApIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8vIFNldCB0aGUgY3R4IGZvciB0aGUgYm94XHJcblx0XHRcdFx0Y3R4LnNhdmUoKTtcclxuXHJcblx0XHRcdFx0Y3R4LmZpbGxTdHlsZSA9IHZhbHVlT3JEZWZhdWx0KGxlZ2VuZEl0ZW0uZmlsbFN0eWxlLCBnbG9iYWxEZWZhdWx0LmRlZmF1bHRDb2xvcik7XHJcblx0XHRcdFx0Y3R4LmxpbmVDYXAgPSB2YWx1ZU9yRGVmYXVsdChsZWdlbmRJdGVtLmxpbmVDYXAsIGxpbmVEZWZhdWx0LmJvcmRlckNhcFN0eWxlKTtcclxuXHRcdFx0XHRjdHgubGluZURhc2hPZmZzZXQgPSB2YWx1ZU9yRGVmYXVsdChsZWdlbmRJdGVtLmxpbmVEYXNoT2Zmc2V0LCBsaW5lRGVmYXVsdC5ib3JkZXJEYXNoT2Zmc2V0KTtcclxuXHRcdFx0XHRjdHgubGluZUpvaW4gPSB2YWx1ZU9yRGVmYXVsdChsZWdlbmRJdGVtLmxpbmVKb2luLCBsaW5lRGVmYXVsdC5ib3JkZXJKb2luU3R5bGUpO1xyXG5cdFx0XHRcdGN0eC5saW5lV2lkdGggPSB2YWx1ZU9yRGVmYXVsdChsZWdlbmRJdGVtLmxpbmVXaWR0aCwgbGluZURlZmF1bHQuYm9yZGVyV2lkdGgpO1xyXG5cdFx0XHRcdGN0eC5zdHJva2VTdHlsZSA9IHZhbHVlT3JEZWZhdWx0KGxlZ2VuZEl0ZW0uc3Ryb2tlU3R5bGUsIGdsb2JhbERlZmF1bHQuZGVmYXVsdENvbG9yKTtcclxuXHRcdFx0XHR2YXIgaXNMaW5lV2lkdGhaZXJvID0gKHZhbHVlT3JEZWZhdWx0KGxlZ2VuZEl0ZW0ubGluZVdpZHRoLCBsaW5lRGVmYXVsdC5ib3JkZXJXaWR0aCkgPT09IDApO1xyXG5cclxuXHRcdFx0XHRpZiAoY3R4LnNldExpbmVEYXNoKSB7XHJcblx0XHRcdFx0XHQvLyBJRSA5IGFuZCAxMCBkbyBub3Qgc3VwcG9ydCBsaW5lIGRhc2hcclxuXHRcdFx0XHRcdGN0eC5zZXRMaW5lRGFzaCh2YWx1ZU9yRGVmYXVsdChsZWdlbmRJdGVtLmxpbmVEYXNoLCBsaW5lRGVmYXVsdC5ib3JkZXJEYXNoKSk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAob3B0cy5sYWJlbHMgJiYgb3B0cy5sYWJlbHMudXNlUG9pbnRTdHlsZSkge1xyXG5cdFx0XHRcdFx0Ly8gUmVjYWxjdWxhdGUgeCBhbmQgeSBmb3IgZHJhd1BvaW50KCkgYmVjYXVzZSBpdHMgZXhwZWN0aW5nXHJcblx0XHRcdFx0XHQvLyB4IGFuZCB5IHRvIGJlIGNlbnRlciBvZiBmaWd1cmUgKGluc3RlYWQgb2YgdG9wIGxlZnQpXHJcblx0XHRcdFx0XHR2YXIgcmFkaXVzID0gZm9udFNpemUgKiBNYXRoLlNRUlQyIC8gMjtcclxuXHRcdFx0XHRcdHZhciBvZmZTZXQgPSByYWRpdXMgLyBNYXRoLlNRUlQyO1xyXG5cdFx0XHRcdFx0dmFyIGNlbnRlclggPSB4ICsgb2ZmU2V0O1xyXG5cdFx0XHRcdFx0dmFyIGNlbnRlclkgPSB5ICsgb2ZmU2V0O1xyXG5cclxuXHRcdFx0XHRcdC8vIERyYXcgcG9pbnRTdHlsZSBhcyBsZWdlbmQgc3ltYm9sXHJcblx0XHRcdFx0XHRoZWxwZXJzLmNhbnZhcy5kcmF3UG9pbnQoY3R4LCBsZWdlbmRJdGVtLnBvaW50U3R5bGUsIHJhZGl1cywgY2VudGVyWCwgY2VudGVyWSk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdC8vIERyYXcgYm94IGFzIGxlZ2VuZCBzeW1ib2xcclxuXHRcdFx0XHRcdGlmICghaXNMaW5lV2lkdGhaZXJvKSB7XHJcblx0XHRcdFx0XHRcdGN0eC5zdHJva2VSZWN0KHgsIHksIGJveFdpZHRoLCBmb250U2l6ZSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRjdHguZmlsbFJlY3QoeCwgeSwgYm94V2lkdGgsIGZvbnRTaXplKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGN0eC5yZXN0b3JlKCk7XHJcblx0XHRcdH07XHJcblx0XHRcdHZhciBmaWxsVGV4dCA9IGZ1bmN0aW9uKHgsIHksIGxlZ2VuZEl0ZW0sIHRleHRXaWR0aCkge1xyXG5cdFx0XHRcdHZhciBoYWxmRm9udFNpemUgPSBmb250U2l6ZSAvIDI7XHJcblx0XHRcdFx0dmFyIHhMZWZ0ID0gYm94V2lkdGggKyBoYWxmRm9udFNpemUgKyB4O1xyXG5cdFx0XHRcdHZhciB5TWlkZGxlID0geSArIGhhbGZGb250U2l6ZTtcclxuXHJcblx0XHRcdFx0Y3R4LmZpbGxUZXh0KGxlZ2VuZEl0ZW0udGV4dCwgeExlZnQsIHlNaWRkbGUpO1xyXG5cclxuXHRcdFx0XHRpZiAobGVnZW5kSXRlbS5oaWRkZW4pIHtcclxuXHRcdFx0XHRcdC8vIFN0cmlrZXRocm91Z2ggdGhlIHRleHQgaWYgaGlkZGVuXHJcblx0XHRcdFx0XHRjdHguYmVnaW5QYXRoKCk7XHJcblx0XHRcdFx0XHRjdHgubGluZVdpZHRoID0gMjtcclxuXHRcdFx0XHRcdGN0eC5tb3ZlVG8oeExlZnQsIHlNaWRkbGUpO1xyXG5cdFx0XHRcdFx0Y3R4LmxpbmVUbyh4TGVmdCArIHRleHRXaWR0aCwgeU1pZGRsZSk7XHJcblx0XHRcdFx0XHRjdHguc3Ryb2tlKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0Ly8gSG9yaXpvbnRhbFxyXG5cdFx0XHR2YXIgaXNIb3Jpem9udGFsID0gbWUuaXNIb3Jpem9udGFsKCk7XHJcblx0XHRcdGlmIChpc0hvcml6b250YWwpIHtcclxuXHRcdFx0XHRjdXJzb3IgPSB7XHJcblx0XHRcdFx0XHR4OiBtZS5sZWZ0ICsgKChsZWdlbmRXaWR0aCAtIGxpbmVXaWR0aHNbMF0pIC8gMiksXHJcblx0XHRcdFx0XHR5OiBtZS50b3AgKyBsYWJlbE9wdHMucGFkZGluZyxcclxuXHRcdFx0XHRcdGxpbmU6IDBcclxuXHRcdFx0XHR9O1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGN1cnNvciA9IHtcclxuXHRcdFx0XHRcdHg6IG1lLmxlZnQgKyBsYWJlbE9wdHMucGFkZGluZyxcclxuXHRcdFx0XHRcdHk6IG1lLnRvcCArIGxhYmVsT3B0cy5wYWRkaW5nLFxyXG5cdFx0XHRcdFx0bGluZTogMFxyXG5cdFx0XHRcdH07XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHZhciBpdGVtSGVpZ2h0ID0gZm9udFNpemUgKyBsYWJlbE9wdHMucGFkZGluZztcclxuXHRcdFx0aGVscGVycy5lYWNoKG1lLmxlZ2VuZEl0ZW1zLCBmdW5jdGlvbihsZWdlbmRJdGVtLCBpKSB7XHJcblx0XHRcdFx0dmFyIHRleHRXaWR0aCA9IGN0eC5tZWFzdXJlVGV4dChsZWdlbmRJdGVtLnRleHQpLndpZHRoO1xyXG5cdFx0XHRcdHZhciB3aWR0aCA9IGJveFdpZHRoICsgKGZvbnRTaXplIC8gMikgKyB0ZXh0V2lkdGg7XHJcblx0XHRcdFx0dmFyIHggPSBjdXJzb3IueDtcclxuXHRcdFx0XHR2YXIgeSA9IGN1cnNvci55O1xyXG5cclxuXHRcdFx0XHRpZiAoaXNIb3Jpem9udGFsKSB7XHJcblx0XHRcdFx0XHRpZiAoeCArIHdpZHRoID49IGxlZ2VuZFdpZHRoKSB7XHJcblx0XHRcdFx0XHRcdHkgPSBjdXJzb3IueSArPSBpdGVtSGVpZ2h0O1xyXG5cdFx0XHRcdFx0XHRjdXJzb3IubGluZSsrO1xyXG5cdFx0XHRcdFx0XHR4ID0gY3Vyc29yLnggPSBtZS5sZWZ0ICsgKChsZWdlbmRXaWR0aCAtIGxpbmVXaWR0aHNbY3Vyc29yLmxpbmVdKSAvIDIpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoeSArIGl0ZW1IZWlnaHQgPiBtZS5ib3R0b20pIHtcclxuXHRcdFx0XHRcdHggPSBjdXJzb3IueCA9IHggKyBtZS5jb2x1bW5XaWR0aHNbY3Vyc29yLmxpbmVdICsgbGFiZWxPcHRzLnBhZGRpbmc7XHJcblx0XHRcdFx0XHR5ID0gY3Vyc29yLnkgPSBtZS50b3AgKyBsYWJlbE9wdHMucGFkZGluZztcclxuXHRcdFx0XHRcdGN1cnNvci5saW5lKys7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRkcmF3TGVnZW5kQm94KHgsIHksIGxlZ2VuZEl0ZW0pO1xyXG5cclxuXHRcdFx0XHRoaXRib3hlc1tpXS5sZWZ0ID0geDtcclxuXHRcdFx0XHRoaXRib3hlc1tpXS50b3AgPSB5O1xyXG5cclxuXHRcdFx0XHQvLyBGaWxsIHRoZSBhY3R1YWwgbGFiZWxcclxuXHRcdFx0XHRmaWxsVGV4dCh4LCB5LCBsZWdlbmRJdGVtLCB0ZXh0V2lkdGgpO1xyXG5cclxuXHRcdFx0XHRpZiAoaXNIb3Jpem9udGFsKSB7XHJcblx0XHRcdFx0XHRjdXJzb3IueCArPSB3aWR0aCArIChsYWJlbE9wdHMucGFkZGluZyk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGN1cnNvci55ICs9IGl0ZW1IZWlnaHQ7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0LyoqXHJcblx0ICogSGFuZGxlIGFuIGV2ZW50XHJcblx0ICogQHByaXZhdGVcclxuXHQgKiBAcGFyYW0ge0lFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgdG8gaGFuZGxlXHJcblx0ICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiBhIGNoYW5nZSBvY2N1cmVkXHJcblx0ICovXHJcblx0aGFuZGxlRXZlbnQ6IGZ1bmN0aW9uKGUpIHtcclxuXHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHR2YXIgb3B0cyA9IG1lLm9wdGlvbnM7XHJcblx0XHR2YXIgdHlwZSA9IGUudHlwZSA9PT0gJ21vdXNldXAnID8gJ2NsaWNrJyA6IGUudHlwZTtcclxuXHRcdHZhciBjaGFuZ2VkID0gZmFsc2U7XHJcblxyXG5cdFx0aWYgKHR5cGUgPT09ICdtb3VzZW1vdmUnKSB7XHJcblx0XHRcdGlmICghb3B0cy5vbkhvdmVyKSB7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2UgaWYgKHR5cGUgPT09ICdjbGljaycpIHtcclxuXHRcdFx0aWYgKCFvcHRzLm9uQ2xpY2spIHtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBDaGFydCBldmVudCBhbHJlYWR5IGhhcyByZWxhdGl2ZSBwb3NpdGlvbiBpbiBpdFxyXG5cdFx0dmFyIHggPSBlLng7XHJcblx0XHR2YXIgeSA9IGUueTtcclxuXHJcblx0XHRpZiAoeCA+PSBtZS5sZWZ0ICYmIHggPD0gbWUucmlnaHQgJiYgeSA+PSBtZS50b3AgJiYgeSA8PSBtZS5ib3R0b20pIHtcclxuXHRcdFx0Ly8gU2VlIGlmIHdlIGFyZSB0b3VjaGluZyBvbmUgb2YgdGhlIGRhdGFzZXQgYm94ZXNcclxuXHRcdFx0dmFyIGxoID0gbWUubGVnZW5kSGl0Qm94ZXM7XHJcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbGgubGVuZ3RoOyArK2kpIHtcclxuXHRcdFx0XHR2YXIgaGl0Qm94ID0gbGhbaV07XHJcblxyXG5cdFx0XHRcdGlmICh4ID49IGhpdEJveC5sZWZ0ICYmIHggPD0gaGl0Qm94LmxlZnQgKyBoaXRCb3gud2lkdGggJiYgeSA+PSBoaXRCb3gudG9wICYmIHkgPD0gaGl0Qm94LnRvcCArIGhpdEJveC5oZWlnaHQpIHtcclxuXHRcdFx0XHRcdC8vIFRvdWNoaW5nIGFuIGVsZW1lbnRcclxuXHRcdFx0XHRcdGlmICh0eXBlID09PSAnY2xpY2snKSB7XHJcblx0XHRcdFx0XHRcdC8vIHVzZSBlLm5hdGl2ZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuXHRcdFx0XHRcdFx0b3B0cy5vbkNsaWNrLmNhbGwobWUsIGUubmF0aXZlLCBtZS5sZWdlbmRJdGVtc1tpXSk7XHJcblx0XHRcdFx0XHRcdGNoYW5nZWQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAodHlwZSA9PT0gJ21vdXNlbW92ZScpIHtcclxuXHRcdFx0XHRcdFx0Ly8gdXNlIGUubmF0aXZlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxyXG5cdFx0XHRcdFx0XHRvcHRzLm9uSG92ZXIuY2FsbChtZSwgZS5uYXRpdmUsIG1lLmxlZ2VuZEl0ZW1zW2ldKTtcclxuXHRcdFx0XHRcdFx0Y2hhbmdlZCA9IHRydWU7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBjaGFuZ2VkO1xyXG5cdH1cclxufSk7XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVOZXdMZWdlbmRBbmRBdHRhY2goY2hhcnQsIGxlZ2VuZE9wdHMpIHtcclxuXHR2YXIgbGVnZW5kID0gbmV3IExlZ2VuZCh7XHJcblx0XHRjdHg6IGNoYXJ0LmN0eCxcclxuXHRcdG9wdGlvbnM6IGxlZ2VuZE9wdHMsXHJcblx0XHRjaGFydDogY2hhcnRcclxuXHR9KTtcclxuXHJcblx0bGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIGxlZ2VuZCwgbGVnZW5kT3B0cyk7XHJcblx0bGF5b3V0cy5hZGRCb3goY2hhcnQsIGxlZ2VuZCk7XHJcblx0Y2hhcnQubGVnZW5kID0gbGVnZW5kO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IHtcclxuXHRpZDogJ2xlZ2VuZCcsXHJcblxyXG5cdC8qKlxyXG5cdCAqIEJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IHNpbmNlIDIuMS41LCB0aGUgbGVnZW5kIGlzIHJlZ2lzdGVyZWQgYXMgYSBwbHVnaW4sIG1ha2luZ1xyXG5cdCAqIENoYXJ0LkxlZ2VuZCBvYnNvbGV0ZS4gVG8gYXZvaWQgYSBicmVha2luZyBjaGFuZ2UsIHdlIGV4cG9ydCB0aGUgTGVnZW5kIGFzIHBhcnQgb2ZcclxuXHQgKiB0aGUgcGx1Z2luLCB3aGljaCBvbmUgd2lsbCBiZSByZS1leHBvc2VkIGluIHRoZSBjaGFydC5qcyBmaWxlLlxyXG5cdCAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL3B1bGwvMjY0MFxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICovXHJcblx0X2VsZW1lbnQ6IExlZ2VuZCxcclxuXHJcblx0YmVmb3JlSW5pdDogZnVuY3Rpb24oY2hhcnQpIHtcclxuXHRcdHZhciBsZWdlbmRPcHRzID0gY2hhcnQub3B0aW9ucy5sZWdlbmQ7XHJcblxyXG5cdFx0aWYgKGxlZ2VuZE9wdHMpIHtcclxuXHRcdFx0Y3JlYXRlTmV3TGVnZW5kQW5kQXR0YWNoKGNoYXJ0LCBsZWdlbmRPcHRzKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRiZWZvcmVVcGRhdGU6IGZ1bmN0aW9uKGNoYXJ0KSB7XHJcblx0XHR2YXIgbGVnZW5kT3B0cyA9IGNoYXJ0Lm9wdGlvbnMubGVnZW5kO1xyXG5cdFx0dmFyIGxlZ2VuZCA9IGNoYXJ0LmxlZ2VuZDtcclxuXHJcblx0XHRpZiAobGVnZW5kT3B0cykge1xyXG5cdFx0XHRoZWxwZXJzLm1lcmdlSWYobGVnZW5kT3B0cywgZGVmYXVsdHMuZ2xvYmFsLmxlZ2VuZCk7XHJcblxyXG5cdFx0XHRpZiAobGVnZW5kKSB7XHJcblx0XHRcdFx0bGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIGxlZ2VuZCwgbGVnZW5kT3B0cyk7XHJcblx0XHRcdFx0bGVnZW5kLm9wdGlvbnMgPSBsZWdlbmRPcHRzO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGNyZWF0ZU5ld0xlZ2VuZEFuZEF0dGFjaChjaGFydCwgbGVnZW5kT3B0cyk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSBpZiAobGVnZW5kKSB7XHJcblx0XHRcdGxheW91dHMucmVtb3ZlQm94KGNoYXJ0LCBsZWdlbmQpO1xyXG5cdFx0XHRkZWxldGUgY2hhcnQubGVnZW5kO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdGFmdGVyRXZlbnQ6IGZ1bmN0aW9uKGNoYXJ0LCBlKSB7XHJcblx0XHR2YXIgbGVnZW5kID0gY2hhcnQubGVnZW5kO1xyXG5cdFx0aWYgKGxlZ2VuZCkge1xyXG5cdFx0XHRsZWdlbmQuaGFuZGxlRXZlbnQoZSk7XHJcblx0XHR9XHJcblx0fVxyXG59O1xyXG5cclxufSx7XCIyNlwiOjI2LFwiMjdcIjoyNyxcIjMxXCI6MzEsXCI0NlwiOjQ2fV0sNTM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcclxudmFyIEVsZW1lbnQgPSByZXF1aXJlKDI3KTtcclxudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcclxudmFyIGxheW91dHMgPSByZXF1aXJlKDMxKTtcclxuXHJcbnZhciBub29wID0gaGVscGVycy5ub29wO1xyXG5cclxuZGVmYXVsdHMuX3NldCgnZ2xvYmFsJywge1xyXG5cdHRpdGxlOiB7XHJcblx0XHRkaXNwbGF5OiBmYWxzZSxcclxuXHRcdGZvbnRTdHlsZTogJ2JvbGQnLFxyXG5cdFx0ZnVsbFdpZHRoOiB0cnVlLFxyXG5cdFx0bGluZUhlaWdodDogMS4yLFxyXG5cdFx0cGFkZGluZzogMTAsXHJcblx0XHRwb3NpdGlvbjogJ3RvcCcsXHJcblx0XHR0ZXh0OiAnJyxcclxuXHRcdHdlaWdodDogMjAwMCAgICAgICAgIC8vIGJ5IGRlZmF1bHQgZ3JlYXRlciB0aGFuIGxlZ2VuZCAoMTAwMCkgdG8gYmUgYWJvdmVcclxuXHR9XHJcbn0pO1xyXG5cclxuLyoqXHJcbiAqIElNUE9SVEFOVDogdGhpcyBjbGFzcyBpcyBleHBvc2VkIHB1YmxpY2x5IGFzIENoYXJ0LkxlZ2VuZCwgYmFja3dhcmQgY29tcGF0aWJpbGl0eSByZXF1aXJlZCFcclxuICovXHJcbnZhciBUaXRsZSA9IEVsZW1lbnQuZXh0ZW5kKHtcclxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihjb25maWcpIHtcclxuXHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRoZWxwZXJzLmV4dGVuZChtZSwgY29uZmlnKTtcclxuXHJcblx0XHQvLyBDb250YWlucyBoaXQgYm94ZXMgZm9yIGVhY2ggZGF0YXNldCAoaW4gZGF0YXNldCBvcmRlcilcclxuXHRcdG1lLmxlZ2VuZEhpdEJveGVzID0gW107XHJcblx0fSxcclxuXHJcblx0Ly8gVGhlc2UgbWV0aG9kcyBhcmUgb3JkZXJlZCBieSBsaWZlY3ljbGUuIFV0aWxpdGllcyB0aGVuIGZvbGxvdy5cclxuXHJcblx0YmVmb3JlVXBkYXRlOiBub29wLFxyXG5cdHVwZGF0ZTogZnVuY3Rpb24obWF4V2lkdGgsIG1heEhlaWdodCwgbWFyZ2lucykge1xyXG5cdFx0dmFyIG1lID0gdGhpcztcclxuXHJcblx0XHQvLyBVcGRhdGUgTGlmZWN5Y2xlIC0gUHJvYmFibHkgZG9uJ3Qgd2FudCB0byBldmVyIGV4dGVuZCBvciBvdmVyd3JpdGUgdGhpcyBmdW5jdGlvbiA7KVxyXG5cdFx0bWUuYmVmb3JlVXBkYXRlKCk7XHJcblxyXG5cdFx0Ly8gQWJzb3JiIHRoZSBtYXN0ZXIgbWVhc3VyZW1lbnRzXHJcblx0XHRtZS5tYXhXaWR0aCA9IG1heFdpZHRoO1xyXG5cdFx0bWUubWF4SGVpZ2h0ID0gbWF4SGVpZ2h0O1xyXG5cdFx0bWUubWFyZ2lucyA9IG1hcmdpbnM7XHJcblxyXG5cdFx0Ly8gRGltZW5zaW9uc1xyXG5cdFx0bWUuYmVmb3JlU2V0RGltZW5zaW9ucygpO1xyXG5cdFx0bWUuc2V0RGltZW5zaW9ucygpO1xyXG5cdFx0bWUuYWZ0ZXJTZXREaW1lbnNpb25zKCk7XHJcblx0XHQvLyBMYWJlbHNcclxuXHRcdG1lLmJlZm9yZUJ1aWxkTGFiZWxzKCk7XHJcblx0XHRtZS5idWlsZExhYmVscygpO1xyXG5cdFx0bWUuYWZ0ZXJCdWlsZExhYmVscygpO1xyXG5cclxuXHRcdC8vIEZpdFxyXG5cdFx0bWUuYmVmb3JlRml0KCk7XHJcblx0XHRtZS5maXQoKTtcclxuXHRcdG1lLmFmdGVyRml0KCk7XHJcblx0XHQvL1xyXG5cdFx0bWUuYWZ0ZXJVcGRhdGUoKTtcclxuXHJcblx0XHRyZXR1cm4gbWUubWluU2l6ZTtcclxuXHJcblx0fSxcclxuXHRhZnRlclVwZGF0ZTogbm9vcCxcclxuXHJcblx0Ly9cclxuXHJcblx0YmVmb3JlU2V0RGltZW5zaW9uczogbm9vcCxcclxuXHRzZXREaW1lbnNpb25zOiBmdW5jdGlvbigpIHtcclxuXHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHQvLyBTZXQgdGhlIHVuY29uc3RyYWluZWQgZGltZW5zaW9uIGJlZm9yZSBsYWJlbCByb3RhdGlvblxyXG5cdFx0aWYgKG1lLmlzSG9yaXpvbnRhbCgpKSB7XHJcblx0XHRcdC8vIFJlc2V0IHBvc2l0aW9uIGJlZm9yZSBjYWxjdWxhdGluZyByb3RhdGlvblxyXG5cdFx0XHRtZS53aWR0aCA9IG1lLm1heFdpZHRoO1xyXG5cdFx0XHRtZS5sZWZ0ID0gMDtcclxuXHRcdFx0bWUucmlnaHQgPSBtZS53aWR0aDtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdG1lLmhlaWdodCA9IG1lLm1heEhlaWdodDtcclxuXHJcblx0XHRcdC8vIFJlc2V0IHBvc2l0aW9uIGJlZm9yZSBjYWxjdWxhdGluZyByb3RhdGlvblxyXG5cdFx0XHRtZS50b3AgPSAwO1xyXG5cdFx0XHRtZS5ib3R0b20gPSBtZS5oZWlnaHQ7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gUmVzZXQgcGFkZGluZ1xyXG5cdFx0bWUucGFkZGluZ0xlZnQgPSAwO1xyXG5cdFx0bWUucGFkZGluZ1RvcCA9IDA7XHJcblx0XHRtZS5wYWRkaW5nUmlnaHQgPSAwO1xyXG5cdFx0bWUucGFkZGluZ0JvdHRvbSA9IDA7XHJcblxyXG5cdFx0Ly8gUmVzZXQgbWluU2l6ZVxyXG5cdFx0bWUubWluU2l6ZSA9IHtcclxuXHRcdFx0d2lkdGg6IDAsXHJcblx0XHRcdGhlaWdodDogMFxyXG5cdFx0fTtcclxuXHR9LFxyXG5cdGFmdGVyU2V0RGltZW5zaW9uczogbm9vcCxcclxuXHJcblx0Ly9cclxuXHJcblx0YmVmb3JlQnVpbGRMYWJlbHM6IG5vb3AsXHJcblx0YnVpbGRMYWJlbHM6IG5vb3AsXHJcblx0YWZ0ZXJCdWlsZExhYmVsczogbm9vcCxcclxuXHJcblx0Ly9cclxuXHJcblx0YmVmb3JlRml0OiBub29wLFxyXG5cdGZpdDogZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0dmFyIHZhbHVlT3JEZWZhdWx0ID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdDtcclxuXHRcdHZhciBvcHRzID0gbWUub3B0aW9ucztcclxuXHRcdHZhciBkaXNwbGF5ID0gb3B0cy5kaXNwbGF5O1xyXG5cdFx0dmFyIGZvbnRTaXplID0gdmFsdWVPckRlZmF1bHQob3B0cy5mb250U2l6ZSwgZGVmYXVsdHMuZ2xvYmFsLmRlZmF1bHRGb250U2l6ZSk7XHJcblx0XHR2YXIgbWluU2l6ZSA9IG1lLm1pblNpemU7XHJcblx0XHR2YXIgbGluZUNvdW50ID0gaGVscGVycy5pc0FycmF5KG9wdHMudGV4dCkgPyBvcHRzLnRleHQubGVuZ3RoIDogMTtcclxuXHRcdHZhciBsaW5lSGVpZ2h0ID0gaGVscGVycy5vcHRpb25zLnRvTGluZUhlaWdodChvcHRzLmxpbmVIZWlnaHQsIGZvbnRTaXplKTtcclxuXHRcdHZhciB0ZXh0U2l6ZSA9IGRpc3BsYXkgPyAobGluZUNvdW50ICogbGluZUhlaWdodCkgKyAob3B0cy5wYWRkaW5nICogMikgOiAwO1xyXG5cclxuXHRcdGlmIChtZS5pc0hvcml6b250YWwoKSkge1xyXG5cdFx0XHRtaW5TaXplLndpZHRoID0gbWUubWF4V2lkdGg7IC8vIGZpbGwgYWxsIHRoZSB3aWR0aFxyXG5cdFx0XHRtaW5TaXplLmhlaWdodCA9IHRleHRTaXplO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0bWluU2l6ZS53aWR0aCA9IHRleHRTaXplO1xyXG5cdFx0XHRtaW5TaXplLmhlaWdodCA9IG1lLm1heEhlaWdodDsgLy8gZmlsbCBhbGwgdGhlIGhlaWdodFxyXG5cdFx0fVxyXG5cclxuXHRcdG1lLndpZHRoID0gbWluU2l6ZS53aWR0aDtcclxuXHRcdG1lLmhlaWdodCA9IG1pblNpemUuaGVpZ2h0O1xyXG5cclxuXHR9LFxyXG5cdGFmdGVyRml0OiBub29wLFxyXG5cclxuXHQvLyBTaGFyZWQgTWV0aG9kc1xyXG5cdGlzSG9yaXpvbnRhbDogZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgcG9zID0gdGhpcy5vcHRpb25zLnBvc2l0aW9uO1xyXG5cdFx0cmV0dXJuIHBvcyA9PT0gJ3RvcCcgfHwgcG9zID09PSAnYm90dG9tJztcclxuXHR9LFxyXG5cclxuXHQvLyBBY3R1YWxseSBkcmF3IHRoZSB0aXRsZSBibG9jayBvbiB0aGUgY2FudmFzXHJcblx0ZHJhdzogZnVuY3Rpb24oKSB7XHJcblx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0dmFyIGN0eCA9IG1lLmN0eDtcclxuXHRcdHZhciB2YWx1ZU9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQ7XHJcblx0XHR2YXIgb3B0cyA9IG1lLm9wdGlvbnM7XHJcblx0XHR2YXIgZ2xvYmFsRGVmYXVsdHMgPSBkZWZhdWx0cy5nbG9iYWw7XHJcblxyXG5cdFx0aWYgKG9wdHMuZGlzcGxheSkge1xyXG5cdFx0XHR2YXIgZm9udFNpemUgPSB2YWx1ZU9yRGVmYXVsdChvcHRzLmZvbnRTaXplLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFNpemUpO1xyXG5cdFx0XHR2YXIgZm9udFN0eWxlID0gdmFsdWVPckRlZmF1bHQob3B0cy5mb250U3R5bGUsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250U3R5bGUpO1xyXG5cdFx0XHR2YXIgZm9udEZhbWlseSA9IHZhbHVlT3JEZWZhdWx0KG9wdHMuZm9udEZhbWlseSwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRGYW1pbHkpO1xyXG5cdFx0XHR2YXIgdGl0bGVGb250ID0gaGVscGVycy5mb250U3RyaW5nKGZvbnRTaXplLCBmb250U3R5bGUsIGZvbnRGYW1pbHkpO1xyXG5cdFx0XHR2YXIgbGluZUhlaWdodCA9IGhlbHBlcnMub3B0aW9ucy50b0xpbmVIZWlnaHQob3B0cy5saW5lSGVpZ2h0LCBmb250U2l6ZSk7XHJcblx0XHRcdHZhciBvZmZzZXQgPSBsaW5lSGVpZ2h0IC8gMiArIG9wdHMucGFkZGluZztcclxuXHRcdFx0dmFyIHJvdGF0aW9uID0gMDtcclxuXHRcdFx0dmFyIHRvcCA9IG1lLnRvcDtcclxuXHRcdFx0dmFyIGxlZnQgPSBtZS5sZWZ0O1xyXG5cdFx0XHR2YXIgYm90dG9tID0gbWUuYm90dG9tO1xyXG5cdFx0XHR2YXIgcmlnaHQgPSBtZS5yaWdodDtcclxuXHRcdFx0dmFyIG1heFdpZHRoLCB0aXRsZVgsIHRpdGxlWTtcclxuXHJcblx0XHRcdGN0eC5maWxsU3R5bGUgPSB2YWx1ZU9yRGVmYXVsdChvcHRzLmZvbnRDb2xvciwgZ2xvYmFsRGVmYXVsdHMuZGVmYXVsdEZvbnRDb2xvcik7IC8vIHJlbmRlciBpbiBjb3JyZWN0IGNvbG91clxyXG5cdFx0XHRjdHguZm9udCA9IHRpdGxlRm9udDtcclxuXHJcblx0XHRcdC8vIEhvcml6b250YWxcclxuXHRcdFx0aWYgKG1lLmlzSG9yaXpvbnRhbCgpKSB7XHJcblx0XHRcdFx0dGl0bGVYID0gbGVmdCArICgocmlnaHQgLSBsZWZ0KSAvIDIpOyAvLyBtaWRwb2ludCBvZiB0aGUgd2lkdGhcclxuXHRcdFx0XHR0aXRsZVkgPSB0b3AgKyBvZmZzZXQ7XHJcblx0XHRcdFx0bWF4V2lkdGggPSByaWdodCAtIGxlZnQ7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGl0bGVYID0gb3B0cy5wb3NpdGlvbiA9PT0gJ2xlZnQnID8gbGVmdCArIG9mZnNldCA6IHJpZ2h0IC0gb2Zmc2V0O1xyXG5cdFx0XHRcdHRpdGxlWSA9IHRvcCArICgoYm90dG9tIC0gdG9wKSAvIDIpO1xyXG5cdFx0XHRcdG1heFdpZHRoID0gYm90dG9tIC0gdG9wO1xyXG5cdFx0XHRcdHJvdGF0aW9uID0gTWF0aC5QSSAqIChvcHRzLnBvc2l0aW9uID09PSAnbGVmdCcgPyAtMC41IDogMC41KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y3R4LnNhdmUoKTtcclxuXHRcdFx0Y3R4LnRyYW5zbGF0ZSh0aXRsZVgsIHRpdGxlWSk7XHJcblx0XHRcdGN0eC5yb3RhdGUocm90YXRpb24pO1xyXG5cdFx0XHRjdHgudGV4dEFsaWduID0gJ2NlbnRlcic7XHJcblx0XHRcdGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcclxuXHJcblx0XHRcdHZhciB0ZXh0ID0gb3B0cy50ZXh0O1xyXG5cdFx0XHRpZiAoaGVscGVycy5pc0FycmF5KHRleHQpKSB7XHJcblx0XHRcdFx0dmFyIHkgPSAwO1xyXG5cdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7ICsraSkge1xyXG5cdFx0XHRcdFx0Y3R4LmZpbGxUZXh0KHRleHRbaV0sIDAsIHksIG1heFdpZHRoKTtcclxuXHRcdFx0XHRcdHkgKz0gbGluZUhlaWdodDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0Y3R4LmZpbGxUZXh0KHRleHQsIDAsIDAsIG1heFdpZHRoKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y3R4LnJlc3RvcmUoKTtcclxuXHRcdH1cclxuXHR9XHJcbn0pO1xyXG5cclxuZnVuY3Rpb24gY3JlYXRlTmV3VGl0bGVCbG9ja0FuZEF0dGFjaChjaGFydCwgdGl0bGVPcHRzKSB7XHJcblx0dmFyIHRpdGxlID0gbmV3IFRpdGxlKHtcclxuXHRcdGN0eDogY2hhcnQuY3R4LFxyXG5cdFx0b3B0aW9uczogdGl0bGVPcHRzLFxyXG5cdFx0Y2hhcnQ6IGNoYXJ0XHJcblx0fSk7XHJcblxyXG5cdGxheW91dHMuY29uZmlndXJlKGNoYXJ0LCB0aXRsZSwgdGl0bGVPcHRzKTtcclxuXHRsYXlvdXRzLmFkZEJveChjaGFydCwgdGl0bGUpO1xyXG5cdGNoYXJ0LnRpdGxlQmxvY2sgPSB0aXRsZTtcclxufVxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSB7XHJcblx0aWQ6ICd0aXRsZScsXHJcblxyXG5cdC8qKlxyXG5cdCAqIEJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IHNpbmNlIDIuMS41LCB0aGUgdGl0bGUgaXMgcmVnaXN0ZXJlZCBhcyBhIHBsdWdpbiwgbWFraW5nXHJcblx0ICogQ2hhcnQuVGl0bGUgb2Jzb2xldGUuIFRvIGF2b2lkIGEgYnJlYWtpbmcgY2hhbmdlLCB3ZSBleHBvcnQgdGhlIFRpdGxlIGFzIHBhcnQgb2ZcclxuXHQgKiB0aGUgcGx1Z2luLCB3aGljaCBvbmUgd2lsbCBiZSByZS1leHBvc2VkIGluIHRoZSBjaGFydC5qcyBmaWxlLlxyXG5cdCAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL3B1bGwvMjY0MFxyXG5cdCAqIEBwcml2YXRlXHJcblx0ICovXHJcblx0X2VsZW1lbnQ6IFRpdGxlLFxyXG5cclxuXHRiZWZvcmVJbml0OiBmdW5jdGlvbihjaGFydCkge1xyXG5cdFx0dmFyIHRpdGxlT3B0cyA9IGNoYXJ0Lm9wdGlvbnMudGl0bGU7XHJcblxyXG5cdFx0aWYgKHRpdGxlT3B0cykge1xyXG5cdFx0XHRjcmVhdGVOZXdUaXRsZUJsb2NrQW5kQXR0YWNoKGNoYXJ0LCB0aXRsZU9wdHMpO1xyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdGJlZm9yZVVwZGF0ZTogZnVuY3Rpb24oY2hhcnQpIHtcclxuXHRcdHZhciB0aXRsZU9wdHMgPSBjaGFydC5vcHRpb25zLnRpdGxlO1xyXG5cdFx0dmFyIHRpdGxlQmxvY2sgPSBjaGFydC50aXRsZUJsb2NrO1xyXG5cclxuXHRcdGlmICh0aXRsZU9wdHMpIHtcclxuXHRcdFx0aGVscGVycy5tZXJnZUlmKHRpdGxlT3B0cywgZGVmYXVsdHMuZ2xvYmFsLnRpdGxlKTtcclxuXHJcblx0XHRcdGlmICh0aXRsZUJsb2NrKSB7XHJcblx0XHRcdFx0bGF5b3V0cy5jb25maWd1cmUoY2hhcnQsIHRpdGxlQmxvY2ssIHRpdGxlT3B0cyk7XHJcblx0XHRcdFx0dGl0bGVCbG9jay5vcHRpb25zID0gdGl0bGVPcHRzO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGNyZWF0ZU5ld1RpdGxlQmxvY2tBbmRBdHRhY2goY2hhcnQsIHRpdGxlT3B0cyk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSBpZiAodGl0bGVCbG9jaykge1xyXG5cdFx0XHRsYXlvdXRzLnJlbW92ZUJveChjaGFydCwgdGl0bGVCbG9jayk7XHJcblx0XHRcdGRlbGV0ZSBjaGFydC50aXRsZUJsb2NrO1xyXG5cdFx0fVxyXG5cdH1cclxufTtcclxuXHJcbn0se1wiMjZcIjoyNixcIjI3XCI6MjcsXCIzMVwiOjMxLFwiNDZcIjo0Nn1dLDU0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIFNjYWxlID0gcmVxdWlyZSgzMyk7XHJcbnZhciBzY2FsZVNlcnZpY2UgPSByZXF1aXJlKDM0KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XHJcblxyXG5cdC8vIERlZmF1bHQgY29uZmlnIGZvciBhIGNhdGVnb3J5IHNjYWxlXHJcblx0dmFyIGRlZmF1bHRDb25maWcgPSB7XHJcblx0XHRwb3NpdGlvbjogJ2JvdHRvbSdcclxuXHR9O1xyXG5cclxuXHR2YXIgRGF0YXNldFNjYWxlID0gU2NhbGUuZXh0ZW5kKHtcclxuXHRcdC8qKlxyXG5cdFx0KiBJbnRlcm5hbCBmdW5jdGlvbiB0byBnZXQgdGhlIGNvcnJlY3QgbGFiZWxzLiBJZiBkYXRhLnhMYWJlbHMgb3IgZGF0YS55TGFiZWxzIGFyZSBkZWZpbmVkLCB1c2UgdGhvc2VcclxuXHRcdCogZWxzZSBmYWxsIGJhY2sgdG8gZGF0YS5sYWJlbHNcclxuXHRcdCogQHByaXZhdGVcclxuXHRcdCovXHJcblx0XHRnZXRMYWJlbHM6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgZGF0YSA9IHRoaXMuY2hhcnQuZGF0YTtcclxuXHRcdFx0cmV0dXJuIHRoaXMub3B0aW9ucy5sYWJlbHMgfHwgKHRoaXMuaXNIb3Jpem9udGFsKCkgPyBkYXRhLnhMYWJlbHMgOiBkYXRhLnlMYWJlbHMpIHx8IGRhdGEubGFiZWxzO1xyXG5cdFx0fSxcclxuXHJcblx0XHRkZXRlcm1pbmVEYXRhTGltaXRzOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIGxhYmVscyA9IG1lLmdldExhYmVscygpO1xyXG5cdFx0XHRtZS5taW5JbmRleCA9IDA7XHJcblx0XHRcdG1lLm1heEluZGV4ID0gbGFiZWxzLmxlbmd0aCAtIDE7XHJcblx0XHRcdHZhciBmaW5kSW5kZXg7XHJcblxyXG5cdFx0XHRpZiAobWUub3B0aW9ucy50aWNrcy5taW4gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdC8vIHVzZXIgc3BlY2lmaWVkIG1pbiB2YWx1ZVxyXG5cdFx0XHRcdGZpbmRJbmRleCA9IGxhYmVscy5pbmRleE9mKG1lLm9wdGlvbnMudGlja3MubWluKTtcclxuXHRcdFx0XHRtZS5taW5JbmRleCA9IGZpbmRJbmRleCAhPT0gLTEgPyBmaW5kSW5kZXggOiBtZS5taW5JbmRleDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKG1lLm9wdGlvbnMudGlja3MubWF4ICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHQvLyB1c2VyIHNwZWNpZmllZCBtYXggdmFsdWVcclxuXHRcdFx0XHRmaW5kSW5kZXggPSBsYWJlbHMuaW5kZXhPZihtZS5vcHRpb25zLnRpY2tzLm1heCk7XHJcblx0XHRcdFx0bWUubWF4SW5kZXggPSBmaW5kSW5kZXggIT09IC0xID8gZmluZEluZGV4IDogbWUubWF4SW5kZXg7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG1lLm1pbiA9IGxhYmVsc1ttZS5taW5JbmRleF07XHJcblx0XHRcdG1lLm1heCA9IGxhYmVsc1ttZS5tYXhJbmRleF07XHJcblx0XHR9LFxyXG5cclxuXHRcdGJ1aWxkVGlja3M6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgbGFiZWxzID0gbWUuZ2V0TGFiZWxzKCk7XHJcblx0XHRcdC8vIElmIHdlIGFyZSB2aWV3aW5nIHNvbWUgc3Vic2V0IG9mIGxhYmVscywgc2xpY2UgdGhlIG9yaWdpbmFsIGFycmF5XHJcblx0XHRcdG1lLnRpY2tzID0gKG1lLm1pbkluZGV4ID09PSAwICYmIG1lLm1heEluZGV4ID09PSBsYWJlbHMubGVuZ3RoIC0gMSkgPyBsYWJlbHMgOiBsYWJlbHMuc2xpY2UobWUubWluSW5kZXgsIG1lLm1heEluZGV4ICsgMSk7XHJcblx0XHR9LFxyXG5cclxuXHRcdGdldExhYmVsRm9ySW5kZXg6IGZ1bmN0aW9uKGluZGV4LCBkYXRhc2V0SW5kZXgpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIGRhdGEgPSBtZS5jaGFydC5kYXRhO1xyXG5cdFx0XHR2YXIgaXNIb3Jpem9udGFsID0gbWUuaXNIb3Jpem9udGFsKCk7XHJcblxyXG5cdFx0XHRpZiAoZGF0YS55TGFiZWxzICYmICFpc0hvcml6b250YWwpIHtcclxuXHRcdFx0XHRyZXR1cm4gbWUuZ2V0UmlnaHRWYWx1ZShkYXRhLmRhdGFzZXRzW2RhdGFzZXRJbmRleF0uZGF0YVtpbmRleF0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBtZS50aWNrc1tpbmRleCAtIG1lLm1pbkluZGV4XTtcclxuXHRcdH0sXHJcblxyXG5cdFx0Ly8gVXNlZCB0byBnZXQgZGF0YSB2YWx1ZSBsb2NhdGlvbnMuICBWYWx1ZSBjYW4gZWl0aGVyIGJlIGFuIGluZGV4IG9yIGEgbnVtZXJpY2FsIHZhbHVlXHJcblx0XHRnZXRQaXhlbEZvclZhbHVlOiBmdW5jdGlvbih2YWx1ZSwgaW5kZXgpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIG9mZnNldCA9IG1lLm9wdGlvbnMub2Zmc2V0O1xyXG5cdFx0XHQvLyAxIGlzIGFkZGVkIGJlY2F1c2Ugd2UgbmVlZCB0aGUgbGVuZ3RoIGJ1dCB3ZSBoYXZlIHRoZSBpbmRleGVzXHJcblx0XHRcdHZhciBvZmZzZXRBbXQgPSBNYXRoLm1heCgobWUubWF4SW5kZXggKyAxIC0gbWUubWluSW5kZXggLSAob2Zmc2V0ID8gMCA6IDEpKSwgMSk7XHJcblxyXG5cdFx0XHQvLyBJZiB2YWx1ZSBpcyBhIGRhdGEgb2JqZWN0LCB0aGVuIGluZGV4IGlzIHRoZSBpbmRleCBpbiB0aGUgZGF0YSBhcnJheSxcclxuXHRcdFx0Ly8gbm90IHRoZSBpbmRleCBvZiB0aGUgc2NhbGUuIFdlIG5lZWQgdG8gY2hhbmdlIHRoYXQuXHJcblx0XHRcdHZhciB2YWx1ZUNhdGVnb3J5O1xyXG5cdFx0XHRpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xyXG5cdFx0XHRcdHZhbHVlQ2F0ZWdvcnkgPSBtZS5pc0hvcml6b250YWwoKSA/IHZhbHVlLnggOiB2YWx1ZS55O1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh2YWx1ZUNhdGVnb3J5ICE9PSB1bmRlZmluZWQgfHwgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgaXNOYU4oaW5kZXgpKSkge1xyXG5cdFx0XHRcdHZhciBsYWJlbHMgPSBtZS5nZXRMYWJlbHMoKTtcclxuXHRcdFx0XHR2YWx1ZSA9IHZhbHVlQ2F0ZWdvcnkgfHwgdmFsdWU7XHJcblx0XHRcdFx0dmFyIGlkeCA9IGxhYmVscy5pbmRleE9mKHZhbHVlKTtcclxuXHRcdFx0XHRpbmRleCA9IGlkeCAhPT0gLTEgPyBpZHggOiBpbmRleDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKG1lLmlzSG9yaXpvbnRhbCgpKSB7XHJcblx0XHRcdFx0dmFyIHZhbHVlV2lkdGggPSBtZS53aWR0aCAvIG9mZnNldEFtdDtcclxuXHRcdFx0XHR2YXIgd2lkdGhPZmZzZXQgPSAodmFsdWVXaWR0aCAqIChpbmRleCAtIG1lLm1pbkluZGV4KSk7XHJcblxyXG5cdFx0XHRcdGlmIChvZmZzZXQpIHtcclxuXHRcdFx0XHRcdHdpZHRoT2Zmc2V0ICs9ICh2YWx1ZVdpZHRoIC8gMik7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gbWUubGVmdCArIE1hdGgucm91bmQod2lkdGhPZmZzZXQpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHZhciB2YWx1ZUhlaWdodCA9IG1lLmhlaWdodCAvIG9mZnNldEFtdDtcclxuXHRcdFx0dmFyIGhlaWdodE9mZnNldCA9ICh2YWx1ZUhlaWdodCAqIChpbmRleCAtIG1lLm1pbkluZGV4KSk7XHJcblxyXG5cdFx0XHRpZiAob2Zmc2V0KSB7XHJcblx0XHRcdFx0aGVpZ2h0T2Zmc2V0ICs9ICh2YWx1ZUhlaWdodCAvIDIpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gbWUudG9wICsgTWF0aC5yb3VuZChoZWlnaHRPZmZzZXQpO1xyXG5cdFx0fSxcclxuXHRcdGdldFBpeGVsRm9yVGljazogZnVuY3Rpb24oaW5kZXgpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0UGl4ZWxGb3JWYWx1ZSh0aGlzLnRpY2tzW2luZGV4XSwgaW5kZXggKyB0aGlzLm1pbkluZGV4LCBudWxsKTtcclxuXHRcdH0sXHJcblx0XHRnZXRWYWx1ZUZvclBpeGVsOiBmdW5jdGlvbihwaXhlbCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgb2Zmc2V0ID0gbWUub3B0aW9ucy5vZmZzZXQ7XHJcblx0XHRcdHZhciB2YWx1ZTtcclxuXHRcdFx0dmFyIG9mZnNldEFtdCA9IE1hdGgubWF4KChtZS5fdGlja3MubGVuZ3RoIC0gKG9mZnNldCA/IDAgOiAxKSksIDEpO1xyXG5cdFx0XHR2YXIgaG9yeiA9IG1lLmlzSG9yaXpvbnRhbCgpO1xyXG5cdFx0XHR2YXIgdmFsdWVEaW1lbnNpb24gPSAoaG9yeiA/IG1lLndpZHRoIDogbWUuaGVpZ2h0KSAvIG9mZnNldEFtdDtcclxuXHJcblx0XHRcdHBpeGVsIC09IGhvcnogPyBtZS5sZWZ0IDogbWUudG9wO1xyXG5cclxuXHRcdFx0aWYgKG9mZnNldCkge1xyXG5cdFx0XHRcdHBpeGVsIC09ICh2YWx1ZURpbWVuc2lvbiAvIDIpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAocGl4ZWwgPD0gMCkge1xyXG5cdFx0XHRcdHZhbHVlID0gMDtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR2YWx1ZSA9IE1hdGgucm91bmQocGl4ZWwgLyB2YWx1ZURpbWVuc2lvbik7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiB2YWx1ZSArIG1lLm1pbkluZGV4O1xyXG5cdFx0fSxcclxuXHRcdGdldEJhc2VQaXhlbDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmJvdHRvbTtcclxuXHRcdH1cclxuXHR9KTtcclxuXHJcblx0c2NhbGVTZXJ2aWNlLnJlZ2lzdGVyU2NhbGVUeXBlKCdjYXRlZ29yeScsIERhdGFzZXRTY2FsZSwgZGVmYXVsdENvbmZpZyk7XHJcbn07XHJcblxyXG59LHtcIjMzXCI6MzMsXCIzNFwiOjM0fV0sNTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcclxudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcclxudmFyIHNjYWxlU2VydmljZSA9IHJlcXVpcmUoMzQpO1xyXG52YXIgVGlja3MgPSByZXF1aXJlKDM1KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcclxuXHJcblx0dmFyIGRlZmF1bHRDb25maWcgPSB7XHJcblx0XHRwb3NpdGlvbjogJ2xlZnQnLFxyXG5cdFx0dGlja3M6IHtcclxuXHRcdFx0Y2FsbGJhY2s6IFRpY2tzLmZvcm1hdHRlcnMubGluZWFyXHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0dmFyIExpbmVhclNjYWxlID0gQ2hhcnQuTGluZWFyU2NhbGVCYXNlLmV4dGVuZCh7XHJcblxyXG5cdFx0ZGV0ZXJtaW5lRGF0YUxpbWl0czogZnVuY3Rpb24oKSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciBvcHRzID0gbWUub3B0aW9ucztcclxuXHRcdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XHJcblx0XHRcdHZhciBkYXRhID0gY2hhcnQuZGF0YTtcclxuXHRcdFx0dmFyIGRhdGFzZXRzID0gZGF0YS5kYXRhc2V0cztcclxuXHRcdFx0dmFyIGlzSG9yaXpvbnRhbCA9IG1lLmlzSG9yaXpvbnRhbCgpO1xyXG5cdFx0XHR2YXIgREVGQVVMVF9NSU4gPSAwO1xyXG5cdFx0XHR2YXIgREVGQVVMVF9NQVggPSAxO1xyXG5cclxuXHRcdFx0ZnVuY3Rpb24gSURNYXRjaGVzKG1ldGEpIHtcclxuXHRcdFx0XHRyZXR1cm4gaXNIb3Jpem9udGFsID8gbWV0YS54QXhpc0lEID09PSBtZS5pZCA6IG1ldGEueUF4aXNJRCA9PT0gbWUuaWQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEZpcnN0IENhbGN1bGF0ZSB0aGUgcmFuZ2VcclxuXHRcdFx0bWUubWluID0gbnVsbDtcclxuXHRcdFx0bWUubWF4ID0gbnVsbDtcclxuXHJcblx0XHRcdHZhciBoYXNTdGFja3MgPSBvcHRzLnN0YWNrZWQ7XHJcblx0XHRcdGlmIChoYXNTdGFja3MgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdGhlbHBlcnMuZWFjaChkYXRhc2V0cywgZnVuY3Rpb24oZGF0YXNldCwgZGF0YXNldEluZGV4KSB7XHJcblx0XHRcdFx0XHRpZiAoaGFzU3RhY2tzKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR2YXIgbWV0YSA9IGNoYXJ0LmdldERhdGFzZXRNZXRhKGRhdGFzZXRJbmRleCk7XHJcblx0XHRcdFx0XHRpZiAoY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShkYXRhc2V0SW5kZXgpICYmIElETWF0Y2hlcyhtZXRhKSAmJlxyXG5cdFx0XHRcdFx0XHRtZXRhLnN0YWNrICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0aGFzU3RhY2tzID0gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKG9wdHMuc3RhY2tlZCB8fCBoYXNTdGFja3MpIHtcclxuXHRcdFx0XHR2YXIgdmFsdWVzUGVyU3RhY2sgPSB7fTtcclxuXHJcblx0XHRcdFx0aGVscGVycy5lYWNoKGRhdGFzZXRzLCBmdW5jdGlvbihkYXRhc2V0LCBkYXRhc2V0SW5kZXgpIHtcclxuXHRcdFx0XHRcdHZhciBtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcclxuXHRcdFx0XHRcdHZhciBrZXkgPSBbXHJcblx0XHRcdFx0XHRcdG1ldGEudHlwZSxcclxuXHRcdFx0XHRcdFx0Ly8gd2UgaGF2ZSBhIHNlcGFyYXRlIHN0YWNrIGZvciBzdGFjaz11bmRlZmluZWQgZGF0YXNldHMgd2hlbiB0aGUgb3B0cy5zdGFja2VkIGlzIHVuZGVmaW5lZFxyXG5cdFx0XHRcdFx0XHQoKG9wdHMuc3RhY2tlZCA9PT0gdW5kZWZpbmVkICYmIG1ldGEuc3RhY2sgPT09IHVuZGVmaW5lZCkgPyBkYXRhc2V0SW5kZXggOiAnJyksXHJcblx0XHRcdFx0XHRcdG1ldGEuc3RhY2tcclxuXHRcdFx0XHRcdF0uam9pbignLicpO1xyXG5cclxuXHRcdFx0XHRcdGlmICh2YWx1ZXNQZXJTdGFja1trZXldID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0dmFsdWVzUGVyU3RhY2tba2V5XSA9IHtcclxuXHRcdFx0XHRcdFx0XHRwb3NpdGl2ZVZhbHVlczogW10sXHJcblx0XHRcdFx0XHRcdFx0bmVnYXRpdmVWYWx1ZXM6IFtdXHJcblx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0Ly8gU3RvcmUgdGhlc2UgcGVyIHR5cGVcclxuXHRcdFx0XHRcdHZhciBwb3NpdGl2ZVZhbHVlcyA9IHZhbHVlc1BlclN0YWNrW2tleV0ucG9zaXRpdmVWYWx1ZXM7XHJcblx0XHRcdFx0XHR2YXIgbmVnYXRpdmVWYWx1ZXMgPSB2YWx1ZXNQZXJTdGFja1trZXldLm5lZ2F0aXZlVmFsdWVzO1xyXG5cclxuXHRcdFx0XHRcdGlmIChjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGRhdGFzZXRJbmRleCkgJiYgSURNYXRjaGVzKG1ldGEpKSB7XHJcblx0XHRcdFx0XHRcdGhlbHBlcnMuZWFjaChkYXRhc2V0LmRhdGEsIGZ1bmN0aW9uKHJhd1ZhbHVlLCBpbmRleCkge1xyXG5cdFx0XHRcdFx0XHRcdHZhciB2YWx1ZSA9ICttZS5nZXRSaWdodFZhbHVlKHJhd1ZhbHVlKTtcclxuXHRcdFx0XHRcdFx0XHRpZiAoaXNOYU4odmFsdWUpIHx8IG1ldGEuZGF0YVtpbmRleF0uaGlkZGVuKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRwb3NpdGl2ZVZhbHVlc1tpbmRleF0gPSBwb3NpdGl2ZVZhbHVlc1tpbmRleF0gfHwgMDtcclxuXHRcdFx0XHRcdFx0XHRuZWdhdGl2ZVZhbHVlc1tpbmRleF0gPSBuZWdhdGl2ZVZhbHVlc1tpbmRleF0gfHwgMDtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKG9wdHMucmVsYXRpdmVQb2ludHMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHBvc2l0aXZlVmFsdWVzW2luZGV4XSA9IDEwMDtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHZhbHVlIDwgMCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0bmVnYXRpdmVWYWx1ZXNbaW5kZXhdICs9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRwb3NpdGl2ZVZhbHVlc1tpbmRleF0gKz0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0aGVscGVycy5lYWNoKHZhbHVlc1BlclN0YWNrLCBmdW5jdGlvbih2YWx1ZXNGb3JUeXBlKSB7XHJcblx0XHRcdFx0XHR2YXIgdmFsdWVzID0gdmFsdWVzRm9yVHlwZS5wb3NpdGl2ZVZhbHVlcy5jb25jYXQodmFsdWVzRm9yVHlwZS5uZWdhdGl2ZVZhbHVlcyk7XHJcblx0XHRcdFx0XHR2YXIgbWluVmFsID0gaGVscGVycy5taW4odmFsdWVzKTtcclxuXHRcdFx0XHRcdHZhciBtYXhWYWwgPSBoZWxwZXJzLm1heCh2YWx1ZXMpO1xyXG5cdFx0XHRcdFx0bWUubWluID0gbWUubWluID09PSBudWxsID8gbWluVmFsIDogTWF0aC5taW4obWUubWluLCBtaW5WYWwpO1xyXG5cdFx0XHRcdFx0bWUubWF4ID0gbWUubWF4ID09PSBudWxsID8gbWF4VmFsIDogTWF0aC5tYXgobWUubWF4LCBtYXhWYWwpO1xyXG5cdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRoZWxwZXJzLmVhY2goZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkge1xyXG5cdFx0XHRcdFx0dmFyIG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpO1xyXG5cdFx0XHRcdFx0aWYgKGNoYXJ0LmlzRGF0YXNldFZpc2libGUoZGF0YXNldEluZGV4KSAmJiBJRE1hdGNoZXMobWV0YSkpIHtcclxuXHRcdFx0XHRcdFx0aGVscGVycy5lYWNoKGRhdGFzZXQuZGF0YSwgZnVuY3Rpb24ocmF3VmFsdWUsIGluZGV4KSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIHZhbHVlID0gK21lLmdldFJpZ2h0VmFsdWUocmF3VmFsdWUpO1xyXG5cdFx0XHRcdFx0XHRcdGlmIChpc05hTih2YWx1ZSkgfHwgbWV0YS5kYXRhW2luZGV4XS5oaWRkZW4pIHtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmIChtZS5taW4gPT09IG51bGwpIHtcclxuXHRcdFx0XHRcdFx0XHRcdG1lLm1pbiA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodmFsdWUgPCBtZS5taW4pIHtcclxuXHRcdFx0XHRcdFx0XHRcdG1lLm1pbiA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKG1lLm1heCA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0bWUubWF4ID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICh2YWx1ZSA+IG1lLm1heCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0bWUubWF4ID0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0bWUubWluID0gaXNGaW5pdGUobWUubWluKSAmJiAhaXNOYU4obWUubWluKSA/IG1lLm1pbiA6IERFRkFVTFRfTUlOO1xyXG5cdFx0XHRtZS5tYXggPSBpc0Zpbml0ZShtZS5tYXgpICYmICFpc05hTihtZS5tYXgpID8gbWUubWF4IDogREVGQVVMVF9NQVg7XHJcblxyXG5cdFx0XHQvLyBDb21tb24gYmFzZSBpbXBsZW1lbnRhdGlvbiB0byBoYW5kbGUgdGlja3MubWluLCB0aWNrcy5tYXgsIHRpY2tzLmJlZ2luQXRaZXJvXHJcblx0XHRcdHRoaXMuaGFuZGxlVGlja1JhbmdlT3B0aW9ucygpO1xyXG5cdFx0fSxcclxuXHRcdGdldFRpY2tMaW1pdDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdHZhciBtYXhUaWNrcztcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIHRpY2tPcHRzID0gbWUub3B0aW9ucy50aWNrcztcclxuXHJcblx0XHRcdGlmIChtZS5pc0hvcml6b250YWwoKSkge1xyXG5cdFx0XHRcdG1heFRpY2tzID0gTWF0aC5taW4odGlja09wdHMubWF4VGlja3NMaW1pdCA/IHRpY2tPcHRzLm1heFRpY2tzTGltaXQgOiAxMSwgTWF0aC5jZWlsKG1lLndpZHRoIC8gNTApKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHQvLyBUaGUgZmFjdG9yIG9mIDIgdXNlZCB0byBzY2FsZSB0aGUgZm9udCBzaXplIGhhcyBiZWVuIGV4cGVyaW1lbnRhbGx5IGRldGVybWluZWQuXHJcblx0XHRcdFx0dmFyIHRpY2tGb250U2l6ZSA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQodGlja09wdHMuZm9udFNpemUsIGRlZmF1bHRzLmdsb2JhbC5kZWZhdWx0Rm9udFNpemUpO1xyXG5cdFx0XHRcdG1heFRpY2tzID0gTWF0aC5taW4odGlja09wdHMubWF4VGlja3NMaW1pdCA/IHRpY2tPcHRzLm1heFRpY2tzTGltaXQgOiAxMSwgTWF0aC5jZWlsKG1lLmhlaWdodCAvICgyICogdGlja0ZvbnRTaXplKSkpO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gbWF4VGlja3M7XHJcblx0XHR9LFxyXG5cdFx0Ly8gQ2FsbGVkIGFmdGVyIHRoZSB0aWNrcyBhcmUgYnVpbHQuIFdlIG5lZWRcclxuXHRcdGhhbmRsZURpcmVjdGlvbmFsQ2hhbmdlczogZnVuY3Rpb24oKSB7XHJcblx0XHRcdGlmICghdGhpcy5pc0hvcml6b250YWwoKSkge1xyXG5cdFx0XHRcdC8vIFdlIGFyZSBpbiBhIHZlcnRpY2FsIG9yaWVudGF0aW9uLiBUaGUgdG9wIHZhbHVlIGlzIHRoZSBoaWdoZXN0LiBTbyByZXZlcnNlIHRoZSBhcnJheVxyXG5cdFx0XHRcdHRoaXMudGlja3MucmV2ZXJzZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cdFx0Z2V0TGFiZWxGb3JJbmRleDogZnVuY3Rpb24oaW5kZXgsIGRhdGFzZXRJbmRleCkge1xyXG5cdFx0XHRyZXR1cm4gK3RoaXMuZ2V0UmlnaHRWYWx1ZSh0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHNbZGF0YXNldEluZGV4XS5kYXRhW2luZGV4XSk7XHJcblx0XHR9LFxyXG5cdFx0Ly8gVXRpbHNcclxuXHRcdGdldFBpeGVsRm9yVmFsdWU6IGZ1bmN0aW9uKHZhbHVlKSB7XHJcblx0XHRcdC8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZml0IGhhcyBiZWVuIHJ1biBzbyB0aGF0XHJcblx0XHRcdC8vIHRoaXMubGVmdCwgdGhpcy50b3AsIHRoaXMucmlnaHQsIGFuZCB0aGlzLmJvdHRvbSBoYXZlIGJlZW4gZGVmaW5lZFxyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgc3RhcnQgPSBtZS5zdGFydDtcclxuXHJcblx0XHRcdHZhciByaWdodFZhbHVlID0gK21lLmdldFJpZ2h0VmFsdWUodmFsdWUpO1xyXG5cdFx0XHR2YXIgcGl4ZWw7XHJcblx0XHRcdHZhciByYW5nZSA9IG1lLmVuZCAtIHN0YXJ0O1xyXG5cclxuXHRcdFx0aWYgKG1lLmlzSG9yaXpvbnRhbCgpKSB7XHJcblx0XHRcdFx0cGl4ZWwgPSBtZS5sZWZ0ICsgKG1lLndpZHRoIC8gcmFuZ2UgKiAocmlnaHRWYWx1ZSAtIHN0YXJ0KSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cGl4ZWwgPSBtZS5ib3R0b20gLSAobWUuaGVpZ2h0IC8gcmFuZ2UgKiAocmlnaHRWYWx1ZSAtIHN0YXJ0KSk7XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHBpeGVsO1xyXG5cdFx0fSxcclxuXHRcdGdldFZhbHVlRm9yUGl4ZWw6IGZ1bmN0aW9uKHBpeGVsKSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciBpc0hvcml6b250YWwgPSBtZS5pc0hvcml6b250YWwoKTtcclxuXHRcdFx0dmFyIGlubmVyRGltZW5zaW9uID0gaXNIb3Jpem9udGFsID8gbWUud2lkdGggOiBtZS5oZWlnaHQ7XHJcblx0XHRcdHZhciBvZmZzZXQgPSAoaXNIb3Jpem9udGFsID8gcGl4ZWwgLSBtZS5sZWZ0IDogbWUuYm90dG9tIC0gcGl4ZWwpIC8gaW5uZXJEaW1lbnNpb247XHJcblx0XHRcdHJldHVybiBtZS5zdGFydCArICgobWUuZW5kIC0gbWUuc3RhcnQpICogb2Zmc2V0KTtcclxuXHRcdH0sXHJcblx0XHRnZXRQaXhlbEZvclRpY2s6IGZ1bmN0aW9uKGluZGV4KSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmdldFBpeGVsRm9yVmFsdWUodGhpcy50aWNrc0FzTnVtYmVyc1tpbmRleF0pO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cclxuXHRzY2FsZVNlcnZpY2UucmVnaXN0ZXJTY2FsZVR5cGUoJ2xpbmVhcicsIExpbmVhclNjYWxlLCBkZWZhdWx0Q29uZmlnKTtcclxufTtcclxuXHJcbn0se1wiMjZcIjoyNixcIjM0XCI6MzQsXCIzNVwiOjM1LFwiNDZcIjo0Nn1dLDU2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcclxudmFyIFNjYWxlID0gcmVxdWlyZSgzMyk7XHJcblxyXG4vKipcclxuICogR2VuZXJhdGUgYSBzZXQgb2YgbGluZWFyIHRpY2tzXHJcbiAqIEBwYXJhbSBnZW5lcmF0aW9uT3B0aW9ucyB0aGUgb3B0aW9ucyB1c2VkIHRvIGdlbmVyYXRlIHRoZSB0aWNrc1xyXG4gKiBAcGFyYW0gZGF0YVJhbmdlIHRoZSByYW5nZSBvZiB0aGUgZGF0YVxyXG4gKiBAcmV0dXJucyB7QXJyYXk8TnVtYmVyPn0gYXJyYXkgb2YgdGljayB2YWx1ZXNcclxuICovXHJcbmZ1bmN0aW9uIGdlbmVyYXRlVGlja3MoZ2VuZXJhdGlvbk9wdGlvbnMsIGRhdGFSYW5nZSkge1xyXG5cdHZhciB0aWNrcyA9IFtdO1xyXG5cdC8vIFRvIGdldCBhIFwibmljZVwiIHZhbHVlIGZvciB0aGUgdGljayBzcGFjaW5nLCB3ZSB3aWxsIHVzZSB0aGUgYXBwcm9wcmlhdGVseSBuYW1lZFxyXG5cdC8vIFwibmljZSBudW1iZXJcIiBhbGdvcml0aG0uIFNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzg1MDY4ODEvbmljZS1sYWJlbC1hbGdvcml0aG0tZm9yLWNoYXJ0cy13aXRoLW1pbmltdW0tdGlja3NcclxuXHQvLyBmb3IgZGV0YWlscy5cclxuXHJcblx0dmFyIGZhY3RvcjtcclxuXHR2YXIgcHJlY2lzaW9uO1xyXG5cdHZhciBzcGFjaW5nO1xyXG5cclxuXHRpZiAoZ2VuZXJhdGlvbk9wdGlvbnMuc3RlcFNpemUgJiYgZ2VuZXJhdGlvbk9wdGlvbnMuc3RlcFNpemUgPiAwKSB7XHJcblx0XHRzcGFjaW5nID0gZ2VuZXJhdGlvbk9wdGlvbnMuc3RlcFNpemU7XHJcblx0fSBlbHNlIHtcclxuXHRcdHZhciBuaWNlUmFuZ2UgPSBoZWxwZXJzLm5pY2VOdW0oZGF0YVJhbmdlLm1heCAtIGRhdGFSYW5nZS5taW4sIGZhbHNlKTtcclxuXHRcdHNwYWNpbmcgPSBoZWxwZXJzLm5pY2VOdW0obmljZVJhbmdlIC8gKGdlbmVyYXRpb25PcHRpb25zLm1heFRpY2tzIC0gMSksIHRydWUpO1xyXG5cclxuXHRcdHByZWNpc2lvbiA9IGdlbmVyYXRpb25PcHRpb25zLnByZWNpc2lvbjtcclxuXHRcdGlmIChwcmVjaXNpb24gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHQvLyBJZiB0aGUgdXNlciBzcGVjaWZpZWQgYSBwcmVjaXNpb24sIHJvdW5kIHRvIHRoYXQgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzXHJcblx0XHRcdGZhY3RvciA9IE1hdGgucG93KDEwLCBwcmVjaXNpb24pO1xyXG5cdFx0XHRzcGFjaW5nID0gTWF0aC5jZWlsKHNwYWNpbmcgKiBmYWN0b3IpIC8gZmFjdG9yO1xyXG5cdFx0fVxyXG5cdH1cclxuXHR2YXIgbmljZU1pbiA9IE1hdGguZmxvb3IoZGF0YVJhbmdlLm1pbiAvIHNwYWNpbmcpICogc3BhY2luZztcclxuXHR2YXIgbmljZU1heCA9IE1hdGguY2VpbChkYXRhUmFuZ2UubWF4IC8gc3BhY2luZykgKiBzcGFjaW5nO1xyXG5cclxuXHQvLyBJZiBtaW4sIG1heCBhbmQgc3RlcFNpemUgaXMgc2V0IGFuZCB0aGV5IG1ha2UgYW4gZXZlbmx5IHNwYWNlZCBzY2FsZSB1c2UgaXQuXHJcblx0aWYgKCFoZWxwZXJzLmlzTnVsbE9yVW5kZWYoZ2VuZXJhdGlvbk9wdGlvbnMubWluKSAmJiAhaGVscGVycy5pc051bGxPclVuZGVmKGdlbmVyYXRpb25PcHRpb25zLm1heCkgJiYgZ2VuZXJhdGlvbk9wdGlvbnMuc3RlcFNpemUpIHtcclxuXHRcdC8vIElmIHZlcnkgY2xvc2UgdG8gb3VyIHdob2xlIG51bWJlciwgdXNlIGl0LlxyXG5cdFx0aWYgKGhlbHBlcnMuYWxtb3N0V2hvbGUoKGdlbmVyYXRpb25PcHRpb25zLm1heCAtIGdlbmVyYXRpb25PcHRpb25zLm1pbikgLyBnZW5lcmF0aW9uT3B0aW9ucy5zdGVwU2l6ZSwgc3BhY2luZyAvIDEwMDApKSB7XHJcblx0XHRcdG5pY2VNaW4gPSBnZW5lcmF0aW9uT3B0aW9ucy5taW47XHJcblx0XHRcdG5pY2VNYXggPSBnZW5lcmF0aW9uT3B0aW9ucy5tYXg7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHR2YXIgbnVtU3BhY2VzID0gKG5pY2VNYXggLSBuaWNlTWluKSAvIHNwYWNpbmc7XHJcblx0Ly8gSWYgdmVyeSBjbG9zZSB0byBvdXIgcm91bmRlZCB2YWx1ZSwgdXNlIGl0LlxyXG5cdGlmIChoZWxwZXJzLmFsbW9zdEVxdWFscyhudW1TcGFjZXMsIE1hdGgucm91bmQobnVtU3BhY2VzKSwgc3BhY2luZyAvIDEwMDApKSB7XHJcblx0XHRudW1TcGFjZXMgPSBNYXRoLnJvdW5kKG51bVNwYWNlcyk7XHJcblx0fSBlbHNlIHtcclxuXHRcdG51bVNwYWNlcyA9IE1hdGguY2VpbChudW1TcGFjZXMpO1xyXG5cdH1cclxuXHJcblx0cHJlY2lzaW9uID0gMTtcclxuXHRpZiAoc3BhY2luZyA8IDEpIHtcclxuXHRcdHByZWNpc2lvbiA9IE1hdGgucG93KDEwLCAxIC0gTWF0aC5mbG9vcihoZWxwZXJzLmxvZzEwKHNwYWNpbmcpKSk7XHJcblx0XHRuaWNlTWluID0gTWF0aC5yb3VuZChuaWNlTWluICogcHJlY2lzaW9uKSAvIHByZWNpc2lvbjtcclxuXHRcdG5pY2VNYXggPSBNYXRoLnJvdW5kKG5pY2VNYXggKiBwcmVjaXNpb24pIC8gcHJlY2lzaW9uO1xyXG5cdH1cclxuXHR0aWNrcy5wdXNoKGdlbmVyYXRpb25PcHRpb25zLm1pbiAhPT0gdW5kZWZpbmVkID8gZ2VuZXJhdGlvbk9wdGlvbnMubWluIDogbmljZU1pbik7XHJcblx0Zm9yICh2YXIgaiA9IDE7IGogPCBudW1TcGFjZXM7ICsraikge1xyXG5cdFx0dGlja3MucHVzaChNYXRoLnJvdW5kKChuaWNlTWluICsgaiAqIHNwYWNpbmcpICogcHJlY2lzaW9uKSAvIHByZWNpc2lvbik7XHJcblx0fVxyXG5cdHRpY2tzLnB1c2goZ2VuZXJhdGlvbk9wdGlvbnMubWF4ICE9PSB1bmRlZmluZWQgPyBnZW5lcmF0aW9uT3B0aW9ucy5tYXggOiBuaWNlTWF4KTtcclxuXHJcblx0cmV0dXJuIHRpY2tzO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENoYXJ0KSB7XHJcblxyXG5cdHZhciBub29wID0gaGVscGVycy5ub29wO1xyXG5cclxuXHRDaGFydC5MaW5lYXJTY2FsZUJhc2UgPSBTY2FsZS5leHRlbmQoe1xyXG5cdFx0Z2V0UmlnaHRWYWx1ZTogZnVuY3Rpb24odmFsdWUpIHtcclxuXHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuXHRcdFx0XHRyZXR1cm4gK3ZhbHVlO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBTY2FsZS5wcm90b3R5cGUuZ2V0UmlnaHRWYWx1ZS5jYWxsKHRoaXMsIHZhbHVlKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0aGFuZGxlVGlja1JhbmdlT3B0aW9uczogZnVuY3Rpb24oKSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciBvcHRzID0gbWUub3B0aW9ucztcclxuXHRcdFx0dmFyIHRpY2tPcHRzID0gb3B0cy50aWNrcztcclxuXHJcblx0XHRcdC8vIElmIHdlIGFyZSBmb3JjaW5nIGl0IHRvIGJlZ2luIGF0IDAsIGJ1dCAwIHdpbGwgYWxyZWFkeSBiZSByZW5kZXJlZCBvbiB0aGUgY2hhcnQsXHJcblx0XHRcdC8vIGRvIG5vdGhpbmcgc2luY2UgdGhhdCB3b3VsZCBtYWtlIHRoZSBjaGFydCB3ZWlyZC4gSWYgdGhlIHVzZXIgcmVhbGx5IHdhbnRzIGEgd2VpcmQgY2hhcnRcclxuXHRcdFx0Ly8gYXhpcywgdGhleSBjYW4gbWFudWFsbHkgb3ZlcnJpZGUgaXRcclxuXHRcdFx0aWYgKHRpY2tPcHRzLmJlZ2luQXRaZXJvKSB7XHJcblx0XHRcdFx0dmFyIG1pblNpZ24gPSBoZWxwZXJzLnNpZ24obWUubWluKTtcclxuXHRcdFx0XHR2YXIgbWF4U2lnbiA9IGhlbHBlcnMuc2lnbihtZS5tYXgpO1xyXG5cclxuXHRcdFx0XHRpZiAobWluU2lnbiA8IDAgJiYgbWF4U2lnbiA8IDApIHtcclxuXHRcdFx0XHRcdC8vIG1vdmUgdGhlIHRvcCB1cCB0byAwXHJcblx0XHRcdFx0XHRtZS5tYXggPSAwO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAobWluU2lnbiA+IDAgJiYgbWF4U2lnbiA+IDApIHtcclxuXHRcdFx0XHRcdC8vIG1vdmUgdGhlIGJvdHRvbSBkb3duIHRvIDBcclxuXHRcdFx0XHRcdG1lLm1pbiA9IDA7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHR2YXIgc2V0TWluID0gdGlja09wdHMubWluICE9PSB1bmRlZmluZWQgfHwgdGlja09wdHMuc3VnZ2VzdGVkTWluICE9PSB1bmRlZmluZWQ7XHJcblx0XHRcdHZhciBzZXRNYXggPSB0aWNrT3B0cy5tYXggIT09IHVuZGVmaW5lZCB8fCB0aWNrT3B0cy5zdWdnZXN0ZWRNYXggIT09IHVuZGVmaW5lZDtcclxuXHJcblx0XHRcdGlmICh0aWNrT3B0cy5taW4gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdG1lLm1pbiA9IHRpY2tPcHRzLm1pbjtcclxuXHRcdFx0fSBlbHNlIGlmICh0aWNrT3B0cy5zdWdnZXN0ZWRNaW4gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdGlmIChtZS5taW4gPT09IG51bGwpIHtcclxuXHRcdFx0XHRcdG1lLm1pbiA9IHRpY2tPcHRzLnN1Z2dlc3RlZE1pbjtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0bWUubWluID0gTWF0aC5taW4obWUubWluLCB0aWNrT3B0cy5zdWdnZXN0ZWRNaW4pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKHRpY2tPcHRzLm1heCAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0bWUubWF4ID0gdGlja09wdHMubWF4O1xyXG5cdFx0XHR9IGVsc2UgaWYgKHRpY2tPcHRzLnN1Z2dlc3RlZE1heCAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0aWYgKG1lLm1heCA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0bWUubWF4ID0gdGlja09wdHMuc3VnZ2VzdGVkTWF4O1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRtZS5tYXggPSBNYXRoLm1heChtZS5tYXgsIHRpY2tPcHRzLnN1Z2dlc3RlZE1heCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoc2V0TWluICE9PSBzZXRNYXgpIHtcclxuXHRcdFx0XHQvLyBXZSBzZXQgdGhlIG1pbiBvciB0aGUgbWF4IGJ1dCBub3QgYm90aC5cclxuXHRcdFx0XHQvLyBTbyBlbnN1cmUgdGhhdCBvdXIgcmFuZ2UgaXMgZ29vZFxyXG5cdFx0XHRcdC8vIEludmVydGVkIG9yIDAgbGVuZ3RoIHJhbmdlIGNhbiBoYXBwZW4gd2hlblxyXG5cdFx0XHRcdC8vIHRpY2tzLm1pbiBpcyBzZXQsIGFuZCBubyBkYXRhc2V0cyBhcmUgdmlzaWJsZVxyXG5cdFx0XHRcdGlmIChtZS5taW4gPj0gbWUubWF4KSB7XHJcblx0XHRcdFx0XHRpZiAoc2V0TWluKSB7XHJcblx0XHRcdFx0XHRcdG1lLm1heCA9IG1lLm1pbiArIDE7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRtZS5taW4gPSBtZS5tYXggLSAxO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKG1lLm1pbiA9PT0gbWUubWF4KSB7XHJcblx0XHRcdFx0bWUubWF4Kys7XHJcblxyXG5cdFx0XHRcdGlmICghdGlja09wdHMuYmVnaW5BdFplcm8pIHtcclxuXHRcdFx0XHRcdG1lLm1pbi0tO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdGdldFRpY2tMaW1pdDogbm9vcCxcclxuXHRcdGhhbmRsZURpcmVjdGlvbmFsQ2hhbmdlczogbm9vcCxcclxuXHJcblx0XHRidWlsZFRpY2tzOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIG9wdHMgPSBtZS5vcHRpb25zO1xyXG5cdFx0XHR2YXIgdGlja09wdHMgPSBvcHRzLnRpY2tzO1xyXG5cclxuXHRcdFx0Ly8gRmlndXJlIG91dCB3aGF0IHRoZSBtYXggbnVtYmVyIG9mIHRpY2tzIHdlIGNhbiBzdXBwb3J0IGl0IGlzIGJhc2VkIG9uIHRoZSBzaXplIG9mXHJcblx0XHRcdC8vIHRoZSBheGlzIGFyZWEuIEZvciBub3csIHdlIHNheSB0aGF0IHRoZSBtaW5pbXVtIHRpY2sgc3BhY2luZyBpbiBwaXhlbHMgbXVzdCBiZSA1MFxyXG5cdFx0XHQvLyBXZSBhbHNvIGxpbWl0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aWNrcyB0byAxMSB3aGljaCBnaXZlcyBhIG5pY2UgMTAgc3F1YXJlcyBvblxyXG5cdFx0XHQvLyB0aGUgZ3JhcGguIE1ha2Ugc3VyZSB3ZSBhbHdheXMgaGF2ZSBhdCBsZWFzdCAyIHRpY2tzXHJcblx0XHRcdHZhciBtYXhUaWNrcyA9IG1lLmdldFRpY2tMaW1pdCgpO1xyXG5cdFx0XHRtYXhUaWNrcyA9IE1hdGgubWF4KDIsIG1heFRpY2tzKTtcclxuXHJcblx0XHRcdHZhciBudW1lcmljR2VuZXJhdG9yT3B0aW9ucyA9IHtcclxuXHRcdFx0XHRtYXhUaWNrczogbWF4VGlja3MsXHJcblx0XHRcdFx0bWluOiB0aWNrT3B0cy5taW4sXHJcblx0XHRcdFx0bWF4OiB0aWNrT3B0cy5tYXgsXHJcblx0XHRcdFx0cHJlY2lzaW9uOiB0aWNrT3B0cy5wcmVjaXNpb24sXHJcblx0XHRcdFx0c3RlcFNpemU6IGhlbHBlcnMudmFsdWVPckRlZmF1bHQodGlja09wdHMuZml4ZWRTdGVwU2l6ZSwgdGlja09wdHMuc3RlcFNpemUpXHJcblx0XHRcdH07XHJcblx0XHRcdHZhciB0aWNrcyA9IG1lLnRpY2tzID0gZ2VuZXJhdGVUaWNrcyhudW1lcmljR2VuZXJhdG9yT3B0aW9ucywgbWUpO1xyXG5cclxuXHRcdFx0bWUuaGFuZGxlRGlyZWN0aW9uYWxDaGFuZ2VzKCk7XHJcblxyXG5cdFx0XHQvLyBBdCB0aGlzIHBvaW50LCB3ZSBuZWVkIHRvIHVwZGF0ZSBvdXIgbWF4IGFuZCBtaW4gZ2l2ZW4gdGhlIHRpY2sgdmFsdWVzIHNpbmNlIHdlIGhhdmUgZXhwYW5kZWQgdGhlXHJcblx0XHRcdC8vIHJhbmdlIG9mIHRoZSBzY2FsZVxyXG5cdFx0XHRtZS5tYXggPSBoZWxwZXJzLm1heCh0aWNrcyk7XHJcblx0XHRcdG1lLm1pbiA9IGhlbHBlcnMubWluKHRpY2tzKTtcclxuXHJcblx0XHRcdGlmICh0aWNrT3B0cy5yZXZlcnNlKSB7XHJcblx0XHRcdFx0dGlja3MucmV2ZXJzZSgpO1xyXG5cclxuXHRcdFx0XHRtZS5zdGFydCA9IG1lLm1heDtcclxuXHRcdFx0XHRtZS5lbmQgPSBtZS5taW47XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0bWUuc3RhcnQgPSBtZS5taW47XHJcblx0XHRcdFx0bWUuZW5kID0gbWUubWF4O1xyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cdFx0Y29udmVydFRpY2tzVG9MYWJlbHM6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHRtZS50aWNrc0FzTnVtYmVycyA9IG1lLnRpY2tzLnNsaWNlKCk7XHJcblx0XHRcdG1lLnplcm9MaW5lSW5kZXggPSBtZS50aWNrcy5pbmRleE9mKDApO1xyXG5cclxuXHRcdFx0U2NhbGUucHJvdG90eXBlLmNvbnZlcnRUaWNrc1RvTGFiZWxzLmNhbGwobWUpO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG59O1xyXG5cclxufSx7XCIzM1wiOjMzLFwiNDZcIjo0Nn1dLDU3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXtcclxuJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcclxudmFyIFNjYWxlID0gcmVxdWlyZSgzMyk7XHJcbnZhciBzY2FsZVNlcnZpY2UgPSByZXF1aXJlKDM0KTtcclxudmFyIFRpY2tzID0gcmVxdWlyZSgzNSk7XHJcblxyXG4vKipcclxuICogR2VuZXJhdGUgYSBzZXQgb2YgbG9nYXJpdGhtaWMgdGlja3NcclxuICogQHBhcmFtIGdlbmVyYXRpb25PcHRpb25zIHRoZSBvcHRpb25zIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHRpY2tzXHJcbiAqIEBwYXJhbSBkYXRhUmFuZ2UgdGhlIHJhbmdlIG9mIHRoZSBkYXRhXHJcbiAqIEByZXR1cm5zIHtBcnJheTxOdW1iZXI+fSBhcnJheSBvZiB0aWNrIHZhbHVlc1xyXG4gKi9cclxuZnVuY3Rpb24gZ2VuZXJhdGVUaWNrcyhnZW5lcmF0aW9uT3B0aW9ucywgZGF0YVJhbmdlKSB7XHJcblx0dmFyIHRpY2tzID0gW107XHJcblx0dmFyIHZhbHVlT3JEZWZhdWx0ID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdDtcclxuXHJcblx0Ly8gRmlndXJlIG91dCB3aGF0IHRoZSBtYXggbnVtYmVyIG9mIHRpY2tzIHdlIGNhbiBzdXBwb3J0IGl0IGlzIGJhc2VkIG9uIHRoZSBzaXplIG9mXHJcblx0Ly8gdGhlIGF4aXMgYXJlYS4gRm9yIG5vdywgd2Ugc2F5IHRoYXQgdGhlIG1pbmltdW0gdGljayBzcGFjaW5nIGluIHBpeGVscyBtdXN0IGJlIDUwXHJcblx0Ly8gV2UgYWxzbyBsaW1pdCB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGlja3MgdG8gMTEgd2hpY2ggZ2l2ZXMgYSBuaWNlIDEwIHNxdWFyZXMgb25cclxuXHQvLyB0aGUgZ3JhcGhcclxuXHR2YXIgdGlja1ZhbCA9IHZhbHVlT3JEZWZhdWx0KGdlbmVyYXRpb25PcHRpb25zLm1pbiwgTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoaGVscGVycy5sb2cxMChkYXRhUmFuZ2UubWluKSkpKTtcclxuXHJcblx0dmFyIGVuZEV4cCA9IE1hdGguZmxvb3IoaGVscGVycy5sb2cxMChkYXRhUmFuZ2UubWF4KSk7XHJcblx0dmFyIGVuZFNpZ25pZmljYW5kID0gTWF0aC5jZWlsKGRhdGFSYW5nZS5tYXggLyBNYXRoLnBvdygxMCwgZW5kRXhwKSk7XHJcblx0dmFyIGV4cCwgc2lnbmlmaWNhbmQ7XHJcblxyXG5cdGlmICh0aWNrVmFsID09PSAwKSB7XHJcblx0XHRleHAgPSBNYXRoLmZsb29yKGhlbHBlcnMubG9nMTAoZGF0YVJhbmdlLm1pbk5vdFplcm8pKTtcclxuXHRcdHNpZ25pZmljYW5kID0gTWF0aC5mbG9vcihkYXRhUmFuZ2UubWluTm90WmVybyAvIE1hdGgucG93KDEwLCBleHApKTtcclxuXHJcblx0XHR0aWNrcy5wdXNoKHRpY2tWYWwpO1xyXG5cdFx0dGlja1ZhbCA9IHNpZ25pZmljYW5kICogTWF0aC5wb3coMTAsIGV4cCk7XHJcblx0fSBlbHNlIHtcclxuXHRcdGV4cCA9IE1hdGguZmxvb3IoaGVscGVycy5sb2cxMCh0aWNrVmFsKSk7XHJcblx0XHRzaWduaWZpY2FuZCA9IE1hdGguZmxvb3IodGlja1ZhbCAvIE1hdGgucG93KDEwLCBleHApKTtcclxuXHR9XHJcblx0dmFyIHByZWNpc2lvbiA9IGV4cCA8IDAgPyBNYXRoLnBvdygxMCwgTWF0aC5hYnMoZXhwKSkgOiAxO1xyXG5cclxuXHRkbyB7XHJcblx0XHR0aWNrcy5wdXNoKHRpY2tWYWwpO1xyXG5cclxuXHRcdCsrc2lnbmlmaWNhbmQ7XHJcblx0XHRpZiAoc2lnbmlmaWNhbmQgPT09IDEwKSB7XHJcblx0XHRcdHNpZ25pZmljYW5kID0gMTtcclxuXHRcdFx0KytleHA7XHJcblx0XHRcdHByZWNpc2lvbiA9IGV4cCA+PSAwID8gMSA6IHByZWNpc2lvbjtcclxuXHRcdH1cclxuXHJcblx0XHR0aWNrVmFsID0gTWF0aC5yb3VuZChzaWduaWZpY2FuZCAqIE1hdGgucG93KDEwLCBleHApICogcHJlY2lzaW9uKSAvIHByZWNpc2lvbjtcclxuXHR9IHdoaWxlIChleHAgPCBlbmRFeHAgfHwgKGV4cCA9PT0gZW5kRXhwICYmIHNpZ25pZmljYW5kIDwgZW5kU2lnbmlmaWNhbmQpKTtcclxuXHJcblx0dmFyIGxhc3RUaWNrID0gdmFsdWVPckRlZmF1bHQoZ2VuZXJhdGlvbk9wdGlvbnMubWF4LCB0aWNrVmFsKTtcclxuXHR0aWNrcy5wdXNoKGxhc3RUaWNrKTtcclxuXHJcblx0cmV0dXJuIHRpY2tzO1xyXG59XHJcblxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDaGFydCkge1xyXG5cclxuXHR2YXIgZGVmYXVsdENvbmZpZyA9IHtcclxuXHRcdHBvc2l0aW9uOiAnbGVmdCcsXHJcblxyXG5cdFx0Ly8gbGFiZWwgc2V0dGluZ3NcclxuXHRcdHRpY2tzOiB7XHJcblx0XHRcdGNhbGxiYWNrOiBUaWNrcy5mb3JtYXR0ZXJzLmxvZ2FyaXRobWljXHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0dmFyIExvZ2FyaXRobWljU2NhbGUgPSBTY2FsZS5leHRlbmQoe1xyXG5cdFx0ZGV0ZXJtaW5lRGF0YUxpbWl0czogZnVuY3Rpb24oKSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciBvcHRzID0gbWUub3B0aW9ucztcclxuXHRcdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XHJcblx0XHRcdHZhciBkYXRhID0gY2hhcnQuZGF0YTtcclxuXHRcdFx0dmFyIGRhdGFzZXRzID0gZGF0YS5kYXRhc2V0cztcclxuXHRcdFx0dmFyIGlzSG9yaXpvbnRhbCA9IG1lLmlzSG9yaXpvbnRhbCgpO1xyXG5cdFx0XHRmdW5jdGlvbiBJRE1hdGNoZXMobWV0YSkge1xyXG5cdFx0XHRcdHJldHVybiBpc0hvcml6b250YWwgPyBtZXRhLnhBeGlzSUQgPT09IG1lLmlkIDogbWV0YS55QXhpc0lEID09PSBtZS5pZDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gQ2FsY3VsYXRlIFJhbmdlXHJcblx0XHRcdG1lLm1pbiA9IG51bGw7XHJcblx0XHRcdG1lLm1heCA9IG51bGw7XHJcblx0XHRcdG1lLm1pbk5vdFplcm8gPSBudWxsO1xyXG5cclxuXHRcdFx0dmFyIGhhc1N0YWNrcyA9IG9wdHMuc3RhY2tlZDtcclxuXHRcdFx0aWYgKGhhc1N0YWNrcyA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0aGVscGVycy5lYWNoKGRhdGFzZXRzLCBmdW5jdGlvbihkYXRhc2V0LCBkYXRhc2V0SW5kZXgpIHtcclxuXHRcdFx0XHRcdGlmIChoYXNTdGFja3MpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHZhciBtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcclxuXHRcdFx0XHRcdGlmIChjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGRhdGFzZXRJbmRleCkgJiYgSURNYXRjaGVzKG1ldGEpICYmXHJcblx0XHRcdFx0XHRcdG1ldGEuc3RhY2sgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRoYXNTdGFja3MgPSB0cnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAob3B0cy5zdGFja2VkIHx8IGhhc1N0YWNrcykge1xyXG5cdFx0XHRcdHZhciB2YWx1ZXNQZXJTdGFjayA9IHt9O1xyXG5cclxuXHRcdFx0XHRoZWxwZXJzLmVhY2goZGF0YXNldHMsIGZ1bmN0aW9uKGRhdGFzZXQsIGRhdGFzZXRJbmRleCkge1xyXG5cdFx0XHRcdFx0dmFyIG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpO1xyXG5cdFx0XHRcdFx0dmFyIGtleSA9IFtcclxuXHRcdFx0XHRcdFx0bWV0YS50eXBlLFxyXG5cdFx0XHRcdFx0XHQvLyB3ZSBoYXZlIGEgc2VwYXJhdGUgc3RhY2sgZm9yIHN0YWNrPXVuZGVmaW5lZCBkYXRhc2V0cyB3aGVuIHRoZSBvcHRzLnN0YWNrZWQgaXMgdW5kZWZpbmVkXHJcblx0XHRcdFx0XHRcdCgob3B0cy5zdGFja2VkID09PSB1bmRlZmluZWQgJiYgbWV0YS5zdGFjayA9PT0gdW5kZWZpbmVkKSA/IGRhdGFzZXRJbmRleCA6ICcnKSxcclxuXHRcdFx0XHRcdFx0bWV0YS5zdGFja1xyXG5cdFx0XHRcdFx0XS5qb2luKCcuJyk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKGNoYXJ0LmlzRGF0YXNldFZpc2libGUoZGF0YXNldEluZGV4KSAmJiBJRE1hdGNoZXMobWV0YSkpIHtcclxuXHRcdFx0XHRcdFx0aWYgKHZhbHVlc1BlclN0YWNrW2tleV0gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRcdHZhbHVlc1BlclN0YWNrW2tleV0gPSBbXTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0aGVscGVycy5lYWNoKGRhdGFzZXQuZGF0YSwgZnVuY3Rpb24ocmF3VmFsdWUsIGluZGV4KSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIHZhbHVlcyA9IHZhbHVlc1BlclN0YWNrW2tleV07XHJcblx0XHRcdFx0XHRcdFx0dmFyIHZhbHVlID0gK21lLmdldFJpZ2h0VmFsdWUocmF3VmFsdWUpO1xyXG5cdFx0XHRcdFx0XHRcdC8vIGludmFsaWQsIGhpZGRlbiBhbmQgbmVnYXRpdmUgdmFsdWVzIGFyZSBpZ25vcmVkXHJcblx0XHRcdFx0XHRcdFx0aWYgKGlzTmFOKHZhbHVlKSB8fCBtZXRhLmRhdGFbaW5kZXhdLmhpZGRlbiB8fCB2YWx1ZSA8IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0dmFsdWVzW2luZGV4XSA9IHZhbHVlc1tpbmRleF0gfHwgMDtcclxuXHRcdFx0XHRcdFx0XHR2YWx1ZXNbaW5kZXhdICs9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0aGVscGVycy5lYWNoKHZhbHVlc1BlclN0YWNrLCBmdW5jdGlvbih2YWx1ZXNGb3JUeXBlKSB7XHJcblx0XHRcdFx0XHRpZiAodmFsdWVzRm9yVHlwZS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHRcdHZhciBtaW5WYWwgPSBoZWxwZXJzLm1pbih2YWx1ZXNGb3JUeXBlKTtcclxuXHRcdFx0XHRcdFx0dmFyIG1heFZhbCA9IGhlbHBlcnMubWF4KHZhbHVlc0ZvclR5cGUpO1xyXG5cdFx0XHRcdFx0XHRtZS5taW4gPSBtZS5taW4gPT09IG51bGwgPyBtaW5WYWwgOiBNYXRoLm1pbihtZS5taW4sIG1pblZhbCk7XHJcblx0XHRcdFx0XHRcdG1lLm1heCA9IG1lLm1heCA9PT0gbnVsbCA/IG1heFZhbCA6IE1hdGgubWF4KG1lLm1heCwgbWF4VmFsKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0aGVscGVycy5lYWNoKGRhdGFzZXRzLCBmdW5jdGlvbihkYXRhc2V0LCBkYXRhc2V0SW5kZXgpIHtcclxuXHRcdFx0XHRcdHZhciBtZXRhID0gY2hhcnQuZ2V0RGF0YXNldE1ldGEoZGF0YXNldEluZGV4KTtcclxuXHRcdFx0XHRcdGlmIChjaGFydC5pc0RhdGFzZXRWaXNpYmxlKGRhdGFzZXRJbmRleCkgJiYgSURNYXRjaGVzKG1ldGEpKSB7XHJcblx0XHRcdFx0XHRcdGhlbHBlcnMuZWFjaChkYXRhc2V0LmRhdGEsIGZ1bmN0aW9uKHJhd1ZhbHVlLCBpbmRleCkge1xyXG5cdFx0XHRcdFx0XHRcdHZhciB2YWx1ZSA9ICttZS5nZXRSaWdodFZhbHVlKHJhd1ZhbHVlKTtcclxuXHRcdFx0XHRcdFx0XHQvLyBpbnZhbGlkLCBoaWRkZW4gYW5kIG5lZ2F0aXZlIHZhbHVlcyBhcmUgaWdub3JlZFxyXG5cdFx0XHRcdFx0XHRcdGlmIChpc05hTih2YWx1ZSkgfHwgbWV0YS5kYXRhW2luZGV4XS5oaWRkZW4gfHwgdmFsdWUgPCAwKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAobWUubWluID09PSBudWxsKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRtZS5taW4gPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHZhbHVlIDwgbWUubWluKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRtZS5taW4gPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmIChtZS5tYXggPT09IG51bGwpIHtcclxuXHRcdFx0XHRcdFx0XHRcdG1lLm1heCA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodmFsdWUgPiBtZS5tYXgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdG1lLm1heCA9IHZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKHZhbHVlICE9PSAwICYmIChtZS5taW5Ob3RaZXJvID09PSBudWxsIHx8IHZhbHVlIDwgbWUubWluTm90WmVybykpIHtcclxuXHRcdFx0XHRcdFx0XHRcdG1lLm1pbk5vdFplcm8gPSB2YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBDb21tb24gYmFzZSBpbXBsZW1lbnRhdGlvbiB0byBoYW5kbGUgdGlja3MubWluLCB0aWNrcy5tYXhcclxuXHRcdFx0dGhpcy5oYW5kbGVUaWNrUmFuZ2VPcHRpb25zKCk7XHJcblx0XHR9LFxyXG5cdFx0aGFuZGxlVGlja1JhbmdlT3B0aW9uczogZnVuY3Rpb24oKSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciBvcHRzID0gbWUub3B0aW9ucztcclxuXHRcdFx0dmFyIHRpY2tPcHRzID0gb3B0cy50aWNrcztcclxuXHRcdFx0dmFyIHZhbHVlT3JEZWZhdWx0ID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdDtcclxuXHRcdFx0dmFyIERFRkFVTFRfTUlOID0gMTtcclxuXHRcdFx0dmFyIERFRkFVTFRfTUFYID0gMTA7XHJcblxyXG5cdFx0XHRtZS5taW4gPSB2YWx1ZU9yRGVmYXVsdCh0aWNrT3B0cy5taW4sIG1lLm1pbik7XHJcblx0XHRcdG1lLm1heCA9IHZhbHVlT3JEZWZhdWx0KHRpY2tPcHRzLm1heCwgbWUubWF4KTtcclxuXHJcblx0XHRcdGlmIChtZS5taW4gPT09IG1lLm1heCkge1xyXG5cdFx0XHRcdGlmIChtZS5taW4gIT09IDAgJiYgbWUubWluICE9PSBudWxsKSB7XHJcblx0XHRcdFx0XHRtZS5taW4gPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihoZWxwZXJzLmxvZzEwKG1lLm1pbikpIC0gMSk7XHJcblx0XHRcdFx0XHRtZS5tYXggPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihoZWxwZXJzLmxvZzEwKG1lLm1heCkpICsgMSk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdG1lLm1pbiA9IERFRkFVTFRfTUlOO1xyXG5cdFx0XHRcdFx0bWUubWF4ID0gREVGQVVMVF9NQVg7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChtZS5taW4gPT09IG51bGwpIHtcclxuXHRcdFx0XHRtZS5taW4gPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihoZWxwZXJzLmxvZzEwKG1lLm1heCkpIC0gMSk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKG1lLm1heCA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdG1lLm1heCA9IG1lLm1pbiAhPT0gMFxyXG5cdFx0XHRcdFx0PyBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihoZWxwZXJzLmxvZzEwKG1lLm1pbikpICsgMSlcclxuXHRcdFx0XHRcdDogREVGQVVMVF9NQVg7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKG1lLm1pbk5vdFplcm8gPT09IG51bGwpIHtcclxuXHRcdFx0XHRpZiAobWUubWluID4gMCkge1xyXG5cdFx0XHRcdFx0bWUubWluTm90WmVybyA9IG1lLm1pbjtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKG1lLm1heCA8IDEpIHtcclxuXHRcdFx0XHRcdG1lLm1pbk5vdFplcm8gPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihoZWxwZXJzLmxvZzEwKG1lLm1heCkpKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0bWUubWluTm90WmVybyA9IERFRkFVTFRfTUlOO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdGJ1aWxkVGlja3M6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgb3B0cyA9IG1lLm9wdGlvbnM7XHJcblx0XHRcdHZhciB0aWNrT3B0cyA9IG9wdHMudGlja3M7XHJcblx0XHRcdHZhciByZXZlcnNlID0gIW1lLmlzSG9yaXpvbnRhbCgpO1xyXG5cclxuXHRcdFx0dmFyIGdlbmVyYXRpb25PcHRpb25zID0ge1xyXG5cdFx0XHRcdG1pbjogdGlja09wdHMubWluLFxyXG5cdFx0XHRcdG1heDogdGlja09wdHMubWF4XHJcblx0XHRcdH07XHJcblx0XHRcdHZhciB0aWNrcyA9IG1lLnRpY2tzID0gZ2VuZXJhdGVUaWNrcyhnZW5lcmF0aW9uT3B0aW9ucywgbWUpO1xyXG5cclxuXHRcdFx0Ly8gQXQgdGhpcyBwb2ludCwgd2UgbmVlZCB0byB1cGRhdGUgb3VyIG1heCBhbmQgbWluIGdpdmVuIHRoZSB0aWNrIHZhbHVlcyBzaW5jZSB3ZSBoYXZlIGV4cGFuZGVkIHRoZVxyXG5cdFx0XHQvLyByYW5nZSBvZiB0aGUgc2NhbGVcclxuXHRcdFx0bWUubWF4ID0gaGVscGVycy5tYXgodGlja3MpO1xyXG5cdFx0XHRtZS5taW4gPSBoZWxwZXJzLm1pbih0aWNrcyk7XHJcblxyXG5cdFx0XHRpZiAodGlja09wdHMucmV2ZXJzZSkge1xyXG5cdFx0XHRcdHJldmVyc2UgPSAhcmV2ZXJzZTtcclxuXHRcdFx0XHRtZS5zdGFydCA9IG1lLm1heDtcclxuXHRcdFx0XHRtZS5lbmQgPSBtZS5taW47XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0bWUuc3RhcnQgPSBtZS5taW47XHJcblx0XHRcdFx0bWUuZW5kID0gbWUubWF4O1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChyZXZlcnNlKSB7XHJcblx0XHRcdFx0dGlja3MucmV2ZXJzZSgpO1xyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cdFx0Y29udmVydFRpY2tzVG9MYWJlbHM6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR0aGlzLnRpY2tWYWx1ZXMgPSB0aGlzLnRpY2tzLnNsaWNlKCk7XHJcblxyXG5cdFx0XHRTY2FsZS5wcm90b3R5cGUuY29udmVydFRpY2tzVG9MYWJlbHMuY2FsbCh0aGlzKTtcclxuXHRcdH0sXHJcblx0XHQvLyBHZXQgdGhlIGNvcnJlY3QgdG9vbHRpcCBsYWJlbFxyXG5cdFx0Z2V0TGFiZWxGb3JJbmRleDogZnVuY3Rpb24oaW5kZXgsIGRhdGFzZXRJbmRleCkge1xyXG5cdFx0XHRyZXR1cm4gK3RoaXMuZ2V0UmlnaHRWYWx1ZSh0aGlzLmNoYXJ0LmRhdGEuZGF0YXNldHNbZGF0YXNldEluZGV4XS5kYXRhW2luZGV4XSk7XHJcblx0XHR9LFxyXG5cdFx0Z2V0UGl4ZWxGb3JUaWNrOiBmdW5jdGlvbihpbmRleCkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRQaXhlbEZvclZhbHVlKHRoaXMudGlja1ZhbHVlc1tpbmRleF0pO1xyXG5cdFx0fSxcclxuXHRcdC8qKlxyXG5cdFx0ICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IHRpY2suXHJcblx0XHQgKiBAcGFyYW0ge051bWJlcn0gdmFsdWUgLSBUaGUgbWluaW11bSBub3QgemVybyB2YWx1ZS5cclxuXHRcdCAqIEByZXR1cm4ge051bWJlcn0gVGhlIGZpcnN0IHRpY2sgdmFsdWUuXHJcblx0XHQgKiBAcHJpdmF0ZVxyXG5cdFx0ICovXHJcblx0XHRfZ2V0Rmlyc3RUaWNrVmFsdWU6IGZ1bmN0aW9uKHZhbHVlKSB7XHJcblx0XHRcdHZhciBleHAgPSBNYXRoLmZsb29yKGhlbHBlcnMubG9nMTAodmFsdWUpKTtcclxuXHRcdFx0dmFyIHNpZ25pZmljYW5kID0gTWF0aC5mbG9vcih2YWx1ZSAvIE1hdGgucG93KDEwLCBleHApKTtcclxuXHJcblx0XHRcdHJldHVybiBzaWduaWZpY2FuZCAqIE1hdGgucG93KDEwLCBleHApO1xyXG5cdFx0fSxcclxuXHRcdGdldFBpeGVsRm9yVmFsdWU6IGZ1bmN0aW9uKHZhbHVlKSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciByZXZlcnNlID0gbWUub3B0aW9ucy50aWNrcy5yZXZlcnNlO1xyXG5cdFx0XHR2YXIgbG9nMTAgPSBoZWxwZXJzLmxvZzEwO1xyXG5cdFx0XHR2YXIgZmlyc3RUaWNrVmFsdWUgPSBtZS5fZ2V0Rmlyc3RUaWNrVmFsdWUobWUubWluTm90WmVybyk7XHJcblx0XHRcdHZhciBvZmZzZXQgPSAwO1xyXG5cdFx0XHR2YXIgaW5uZXJEaW1lbnNpb24sIHBpeGVsLCBzdGFydCwgZW5kLCBzaWduO1xyXG5cclxuXHRcdFx0dmFsdWUgPSArbWUuZ2V0UmlnaHRWYWx1ZSh2YWx1ZSk7XHJcblx0XHRcdGlmIChyZXZlcnNlKSB7XHJcblx0XHRcdFx0c3RhcnQgPSBtZS5lbmQ7XHJcblx0XHRcdFx0ZW5kID0gbWUuc3RhcnQ7XHJcblx0XHRcdFx0c2lnbiA9IC0xO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHN0YXJ0ID0gbWUuc3RhcnQ7XHJcblx0XHRcdFx0ZW5kID0gbWUuZW5kO1xyXG5cdFx0XHRcdHNpZ24gPSAxO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChtZS5pc0hvcml6b250YWwoKSkge1xyXG5cdFx0XHRcdGlubmVyRGltZW5zaW9uID0gbWUud2lkdGg7XHJcblx0XHRcdFx0cGl4ZWwgPSByZXZlcnNlID8gbWUucmlnaHQgOiBtZS5sZWZ0O1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGlubmVyRGltZW5zaW9uID0gbWUuaGVpZ2h0O1xyXG5cdFx0XHRcdHNpZ24gKj0gLTE7IC8vIGludmVydCwgc2luY2UgdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSBjYW52YXMgaXMgYXQgcGl4ZWwgKDAsIDApXHJcblx0XHRcdFx0cGl4ZWwgPSByZXZlcnNlID8gbWUudG9wIDogbWUuYm90dG9tO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh2YWx1ZSAhPT0gc3RhcnQpIHtcclxuXHRcdFx0XHRpZiAoc3RhcnQgPT09IDApIHsgLy8gaW5jbHVkZSB6ZXJvIHRpY2tcclxuXHRcdFx0XHRcdG9mZnNldCA9IGhlbHBlcnMuZ2V0VmFsdWVPckRlZmF1bHQoXHJcblx0XHRcdFx0XHRcdG1lLm9wdGlvbnMudGlja3MuZm9udFNpemUsXHJcblx0XHRcdFx0XHRcdENoYXJ0LmRlZmF1bHRzLmdsb2JhbC5kZWZhdWx0Rm9udFNpemVcclxuXHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRpbm5lckRpbWVuc2lvbiAtPSBvZmZzZXQ7XHJcblx0XHRcdFx0XHRzdGFydCA9IGZpcnN0VGlja1ZhbHVlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAodmFsdWUgIT09IDApIHtcclxuXHRcdFx0XHRcdG9mZnNldCArPSBpbm5lckRpbWVuc2lvbiAvIChsb2cxMChlbmQpIC0gbG9nMTAoc3RhcnQpKSAqIChsb2cxMCh2YWx1ZSkgLSBsb2cxMChzdGFydCkpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRwaXhlbCArPSBzaWduICogb2Zmc2V0O1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBwaXhlbDtcclxuXHRcdH0sXHJcblx0XHRnZXRWYWx1ZUZvclBpeGVsOiBmdW5jdGlvbihwaXhlbCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgcmV2ZXJzZSA9IG1lLm9wdGlvbnMudGlja3MucmV2ZXJzZTtcclxuXHRcdFx0dmFyIGxvZzEwID0gaGVscGVycy5sb2cxMDtcclxuXHRcdFx0dmFyIGZpcnN0VGlja1ZhbHVlID0gbWUuX2dldEZpcnN0VGlja1ZhbHVlKG1lLm1pbk5vdFplcm8pO1xyXG5cdFx0XHR2YXIgaW5uZXJEaW1lbnNpb24sIHN0YXJ0LCBlbmQsIHZhbHVlO1xyXG5cclxuXHRcdFx0aWYgKHJldmVyc2UpIHtcclxuXHRcdFx0XHRzdGFydCA9IG1lLmVuZDtcclxuXHRcdFx0XHRlbmQgPSBtZS5zdGFydDtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRzdGFydCA9IG1lLnN0YXJ0O1xyXG5cdFx0XHRcdGVuZCA9IG1lLmVuZDtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAobWUuaXNIb3Jpem9udGFsKCkpIHtcclxuXHRcdFx0XHRpbm5lckRpbWVuc2lvbiA9IG1lLndpZHRoO1xyXG5cdFx0XHRcdHZhbHVlID0gcmV2ZXJzZSA/IG1lLnJpZ2h0IC0gcGl4ZWwgOiBwaXhlbCAtIG1lLmxlZnQ7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0aW5uZXJEaW1lbnNpb24gPSBtZS5oZWlnaHQ7XHJcblx0XHRcdFx0dmFsdWUgPSByZXZlcnNlID8gcGl4ZWwgLSBtZS50b3AgOiBtZS5ib3R0b20gLSBwaXhlbDtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodmFsdWUgIT09IHN0YXJ0KSB7XHJcblx0XHRcdFx0aWYgKHN0YXJ0ID09PSAwKSB7IC8vIGluY2x1ZGUgemVybyB0aWNrXHJcblx0XHRcdFx0XHR2YXIgb2Zmc2V0ID0gaGVscGVycy5nZXRWYWx1ZU9yRGVmYXVsdChcclxuXHRcdFx0XHRcdFx0bWUub3B0aW9ucy50aWNrcy5mb250U2l6ZSxcclxuXHRcdFx0XHRcdFx0Q2hhcnQuZGVmYXVsdHMuZ2xvYmFsLmRlZmF1bHRGb250U2l6ZVxyXG5cdFx0XHRcdFx0KTtcclxuXHRcdFx0XHRcdHZhbHVlIC09IG9mZnNldDtcclxuXHRcdFx0XHRcdGlubmVyRGltZW5zaW9uIC09IG9mZnNldDtcclxuXHRcdFx0XHRcdHN0YXJ0ID0gZmlyc3RUaWNrVmFsdWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHZhbHVlICo9IGxvZzEwKGVuZCkgLSBsb2cxMChzdGFydCk7XHJcblx0XHRcdFx0dmFsdWUgLz0gaW5uZXJEaW1lbnNpb247XHJcblx0XHRcdFx0dmFsdWUgPSBNYXRoLnBvdygxMCwgbG9nMTAoc3RhcnQpICsgdmFsdWUpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiB2YWx1ZTtcclxuXHRcdH1cclxuXHR9KTtcclxuXHJcblx0c2NhbGVTZXJ2aWNlLnJlZ2lzdGVyU2NhbGVUeXBlKCdsb2dhcml0aG1pYycsIExvZ2FyaXRobWljU2NhbGUsIGRlZmF1bHRDb25maWcpO1xyXG59O1xyXG5cclxufSx7XCIzM1wiOjMzLFwiMzRcIjozNCxcIjM1XCI6MzUsXCI0NlwiOjQ2fV0sNTg6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe1xyXG4ndXNlIHN0cmljdCc7XHJcblxyXG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKDI2KTtcclxudmFyIGhlbHBlcnMgPSByZXF1aXJlKDQ2KTtcclxudmFyIHNjYWxlU2VydmljZSA9IHJlcXVpcmUoMzQpO1xyXG52YXIgVGlja3MgPSByZXF1aXJlKDM1KTtcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQ2hhcnQpIHtcclxuXHJcblx0dmFyIGdsb2JhbERlZmF1bHRzID0gZGVmYXVsdHMuZ2xvYmFsO1xyXG5cclxuXHR2YXIgZGVmYXVsdENvbmZpZyA9IHtcclxuXHRcdGRpc3BsYXk6IHRydWUsXHJcblxyXG5cdFx0Ly8gQm9vbGVhbiAtIFdoZXRoZXIgdG8gYW5pbWF0ZSBzY2FsaW5nIHRoZSBjaGFydCBmcm9tIHRoZSBjZW50cmVcclxuXHRcdGFuaW1hdGU6IHRydWUsXHJcblx0XHRwb3NpdGlvbjogJ2NoYXJ0QXJlYScsXHJcblxyXG5cdFx0YW5nbGVMaW5lczoge1xyXG5cdFx0XHRkaXNwbGF5OiB0cnVlLFxyXG5cdFx0XHRjb2xvcjogJ3JnYmEoMCwgMCwgMCwgMC4xKScsXHJcblx0XHRcdGxpbmVXaWR0aDogMVxyXG5cdFx0fSxcclxuXHJcblx0XHRncmlkTGluZXM6IHtcclxuXHRcdFx0Y2lyY3VsYXI6IGZhbHNlXHJcblx0XHR9LFxyXG5cclxuXHRcdC8vIGxhYmVsIHNldHRpbmdzXHJcblx0XHR0aWNrczoge1xyXG5cdFx0XHQvLyBCb29sZWFuIC0gU2hvdyBhIGJhY2tkcm9wIHRvIHRoZSBzY2FsZSBsYWJlbFxyXG5cdFx0XHRzaG93TGFiZWxCYWNrZHJvcDogdHJ1ZSxcclxuXHJcblx0XHRcdC8vIFN0cmluZyAtIFRoZSBjb2xvdXIgb2YgdGhlIGxhYmVsIGJhY2tkcm9wXHJcblx0XHRcdGJhY2tkcm9wQ29sb3I6ICdyZ2JhKDI1NSwyNTUsMjU1LDAuNzUpJyxcclxuXHJcblx0XHRcdC8vIE51bWJlciAtIFRoZSBiYWNrZHJvcCBwYWRkaW5nIGFib3ZlICYgYmVsb3cgdGhlIGxhYmVsIGluIHBpeGVsc1xyXG5cdFx0XHRiYWNrZHJvcFBhZGRpbmdZOiAyLFxyXG5cclxuXHRcdFx0Ly8gTnVtYmVyIC0gVGhlIGJhY2tkcm9wIHBhZGRpbmcgdG8gdGhlIHNpZGUgb2YgdGhlIGxhYmVsIGluIHBpeGVsc1xyXG5cdFx0XHRiYWNrZHJvcFBhZGRpbmdYOiAyLFxyXG5cclxuXHRcdFx0Y2FsbGJhY2s6IFRpY2tzLmZvcm1hdHRlcnMubGluZWFyXHJcblx0XHR9LFxyXG5cclxuXHRcdHBvaW50TGFiZWxzOiB7XHJcblx0XHRcdC8vIEJvb2xlYW4gLSBpZiB0cnVlLCBzaG93IHBvaW50IGxhYmVsc1xyXG5cdFx0XHRkaXNwbGF5OiB0cnVlLFxyXG5cclxuXHRcdFx0Ly8gTnVtYmVyIC0gUG9pbnQgbGFiZWwgZm9udCBzaXplIGluIHBpeGVsc1xyXG5cdFx0XHRmb250U2l6ZTogMTAsXHJcblxyXG5cdFx0XHQvLyBGdW5jdGlvbiAtIFVzZWQgdG8gY29udmVydCBwb2ludCBsYWJlbHNcclxuXHRcdFx0Y2FsbGJhY2s6IGZ1bmN0aW9uKGxhYmVsKSB7XHJcblx0XHRcdFx0cmV0dXJuIGxhYmVsO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0ZnVuY3Rpb24gZ2V0VmFsdWVDb3VudChzY2FsZSkge1xyXG5cdFx0dmFyIG9wdHMgPSBzY2FsZS5vcHRpb25zO1xyXG5cdFx0cmV0dXJuIG9wdHMuYW5nbGVMaW5lcy5kaXNwbGF5IHx8IG9wdHMucG9pbnRMYWJlbHMuZGlzcGxheSA/IHNjYWxlLmNoYXJ0LmRhdGEubGFiZWxzLmxlbmd0aCA6IDA7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBnZXRQb2ludExhYmVsRm9udE9wdGlvbnMoc2NhbGUpIHtcclxuXHRcdHZhciBwb2ludExhYmVsT3B0aW9ucyA9IHNjYWxlLm9wdGlvbnMucG9pbnRMYWJlbHM7XHJcblx0XHR2YXIgZm9udFNpemUgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KHBvaW50TGFiZWxPcHRpb25zLmZvbnRTaXplLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFNpemUpO1xyXG5cdFx0dmFyIGZvbnRTdHlsZSA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQocG9pbnRMYWJlbE9wdGlvbnMuZm9udFN0eWxlLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFN0eWxlKTtcclxuXHRcdHZhciBmb250RmFtaWx5ID0gaGVscGVycy52YWx1ZU9yRGVmYXVsdChwb2ludExhYmVsT3B0aW9ucy5mb250RmFtaWx5LCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udEZhbWlseSk7XHJcblx0XHR2YXIgZm9udCA9IGhlbHBlcnMuZm9udFN0cmluZyhmb250U2l6ZSwgZm9udFN0eWxlLCBmb250RmFtaWx5KTtcclxuXHJcblx0XHRyZXR1cm4ge1xyXG5cdFx0XHRzaXplOiBmb250U2l6ZSxcclxuXHRcdFx0c3R5bGU6IGZvbnRTdHlsZSxcclxuXHRcdFx0ZmFtaWx5OiBmb250RmFtaWx5LFxyXG5cdFx0XHRmb250OiBmb250XHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gbWVhc3VyZUxhYmVsU2l6ZShjdHgsIGZvbnRTaXplLCBsYWJlbCkge1xyXG5cdFx0aWYgKGhlbHBlcnMuaXNBcnJheShsYWJlbCkpIHtcclxuXHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHR3OiBoZWxwZXJzLmxvbmdlc3RUZXh0KGN0eCwgY3R4LmZvbnQsIGxhYmVsKSxcclxuXHRcdFx0XHRoOiAobGFiZWwubGVuZ3RoICogZm9udFNpemUpICsgKChsYWJlbC5sZW5ndGggLSAxKSAqIDEuNSAqIGZvbnRTaXplKVxyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB7XHJcblx0XHRcdHc6IGN0eC5tZWFzdXJlVGV4dChsYWJlbCkud2lkdGgsXHJcblx0XHRcdGg6IGZvbnRTaXplXHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gZGV0ZXJtaW5lTGltaXRzKGFuZ2xlLCBwb3MsIHNpemUsIG1pbiwgbWF4KSB7XHJcblx0XHRpZiAoYW5nbGUgPT09IG1pbiB8fCBhbmdsZSA9PT0gbWF4KSB7XHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0c3RhcnQ6IHBvcyAtIChzaXplIC8gMiksXHJcblx0XHRcdFx0ZW5kOiBwb3MgKyAoc2l6ZSAvIDIpXHJcblx0XHRcdH07XHJcblx0XHR9IGVsc2UgaWYgKGFuZ2xlIDwgbWluIHx8IGFuZ2xlID4gbWF4KSB7XHJcblx0XHRcdHJldHVybiB7XHJcblx0XHRcdFx0c3RhcnQ6IHBvcyAtIHNpemUgLSA1LFxyXG5cdFx0XHRcdGVuZDogcG9zXHJcblx0XHRcdH07XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0c3RhcnQ6IHBvcyxcclxuXHRcdFx0ZW5kOiBwb3MgKyBzaXplICsgNVxyXG5cdFx0fTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEhlbHBlciBmdW5jdGlvbiB0byBmaXQgYSByYWRpYWwgbGluZWFyIHNjYWxlIHdpdGggcG9pbnQgbGFiZWxzXHJcblx0ICovXHJcblx0ZnVuY3Rpb24gZml0V2l0aFBvaW50TGFiZWxzKHNjYWxlKSB7XHJcblx0XHQvKlxyXG5cdFx0ICogUmlnaHQsIHRoaXMgaXMgcmVhbGx5IGNvbmZ1c2luZyBhbmQgdGhlcmUgaXMgYSBsb3Qgb2YgbWF0aHMgZ29pbmcgb24gaGVyZVxyXG5cdFx0ICogVGhlIGdpc3Qgb2YgdGhlIHByb2JsZW0gaXMgaGVyZTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vbm5uaWNrLzY5NmNjOWM1NWY0YjBiZWI4ZmU5XHJcblx0XHQgKlxyXG5cdFx0ICogUmVhY3Rpb246IGh0dHBzOi8vZGwuZHJvcGJveHVzZXJjb250ZW50LmNvbS91LzM0NjAxMzYzL3Rvb211Y2hzY2llbmNlLmdpZlxyXG5cdFx0ICpcclxuXHRcdCAqIFNvbHV0aW9uOlxyXG5cdFx0ICpcclxuXHRcdCAqIFdlIGFzc3VtZSB0aGUgcmFkaXVzIG9mIHRoZSBwb2x5Z29uIGlzIGhhbGYgdGhlIHNpemUgb2YgdGhlIGNhbnZhcyBhdCBmaXJzdFxyXG5cdFx0ICogYXQgZWFjaCBpbmRleCB3ZSBjaGVjayBpZiB0aGUgdGV4dCBvdmVybGFwcy5cclxuXHRcdCAqXHJcblx0XHQgKiBXaGVyZSBpdCBkb2VzLCB3ZSBzdG9yZSB0aGF0IGFuZ2xlIGFuZCB0aGF0IGluZGV4LlxyXG5cdFx0ICpcclxuXHRcdCAqIEFmdGVyIGZpbmRpbmcgdGhlIGxhcmdlc3QgaW5kZXggYW5kIGFuZ2xlIHdlIGNhbGN1bGF0ZSBob3cgbXVjaCB3ZSBuZWVkIHRvIHJlbW92ZVxyXG5cdFx0ICogZnJvbSB0aGUgc2hhcGUgcmFkaXVzIHRvIG1vdmUgdGhlIHBvaW50IGlud2FyZHMgYnkgdGhhdCB4LlxyXG5cdFx0ICpcclxuXHRcdCAqIFdlIGF2ZXJhZ2UgdGhlIGxlZnQgYW5kIHJpZ2h0IGRpc3RhbmNlcyB0byBnZXQgdGhlIG1heGltdW0gc2hhcGUgcmFkaXVzIHRoYXQgY2FuIGZpdCBpbiB0aGUgYm94XHJcblx0XHQgKiBhbG9uZyB3aXRoIGxhYmVscy5cclxuXHRcdCAqXHJcblx0XHQgKiBPbmNlIHdlIGhhdmUgdGhhdCwgd2UgY2FuIGZpbmQgdGhlIGNlbnRyZSBwb2ludCBmb3IgdGhlIGNoYXJ0LCBieSB0YWtpbmcgdGhlIHggdGV4dCBwcm90cnVzaW9uXHJcblx0XHQgKiBvbiBlYWNoIHNpZGUsIHJlbW92aW5nIHRoYXQgZnJvbSB0aGUgc2l6ZSwgaGFsdmluZyBpdCBhbmQgYWRkaW5nIHRoZSBsZWZ0IHggcHJvdHJ1c2lvbiB3aWR0aC5cclxuXHRcdCAqXHJcblx0XHQgKiBUaGlzIHdpbGwgbWVhbiB3ZSBoYXZlIGEgc2hhcGUgZml0dGVkIHRvIHRoZSBjYW52YXMsIGFzIGxhcmdlIGFzIGl0IGNhbiBiZSB3aXRoIHRoZSBsYWJlbHNcclxuXHRcdCAqIGFuZCBwb3NpdGlvbiBpdCBpbiB0aGUgbW9zdCBzcGFjZSBlZmZpY2llbnQgbWFubmVyXHJcblx0XHQgKlxyXG5cdFx0ICogaHR0cHM6Ly9kbC5kcm9wYm94dXNlcmNvbnRlbnQuY29tL3UvMzQ2MDEzNjMveWVhaHNjaWVuY2UuZ2lmXHJcblx0XHQgKi9cclxuXHJcblx0XHR2YXIgcGxGb250ID0gZ2V0UG9pbnRMYWJlbEZvbnRPcHRpb25zKHNjYWxlKTtcclxuXHJcblx0XHQvLyBHZXQgbWF4aW11bSByYWRpdXMgb2YgdGhlIHBvbHlnb24uIEVpdGhlciBoYWxmIHRoZSBoZWlnaHQgKG1pbnVzIHRoZSB0ZXh0IHdpZHRoKSBvciBoYWxmIHRoZSB3aWR0aC5cclxuXHRcdC8vIFVzZSB0aGlzIHRvIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0ICsgY2hhbmdlLiAtIE1ha2Ugc3VyZSBML1IgcHJvdHJ1c2lvbiBpcyBhdCBsZWFzdCAwIHRvIHN0b3AgaXNzdWVzIHdpdGggY2VudHJlIHBvaW50c1xyXG5cdFx0dmFyIGxhcmdlc3RQb3NzaWJsZVJhZGl1cyA9IE1hdGgubWluKHNjYWxlLmhlaWdodCAvIDIsIHNjYWxlLndpZHRoIC8gMik7XHJcblx0XHR2YXIgZnVydGhlc3RMaW1pdHMgPSB7XHJcblx0XHRcdHI6IHNjYWxlLndpZHRoLFxyXG5cdFx0XHRsOiAwLFxyXG5cdFx0XHR0OiBzY2FsZS5oZWlnaHQsXHJcblx0XHRcdGI6IDBcclxuXHRcdH07XHJcblx0XHR2YXIgZnVydGhlc3RBbmdsZXMgPSB7fTtcclxuXHRcdHZhciBpLCB0ZXh0U2l6ZSwgcG9pbnRQb3NpdGlvbjtcclxuXHJcblx0XHRzY2FsZS5jdHguZm9udCA9IHBsRm9udC5mb250O1xyXG5cdFx0c2NhbGUuX3BvaW50TGFiZWxTaXplcyA9IFtdO1xyXG5cclxuXHRcdHZhciB2YWx1ZUNvdW50ID0gZ2V0VmFsdWVDb3VudChzY2FsZSk7XHJcblx0XHRmb3IgKGkgPSAwOyBpIDwgdmFsdWVDb3VudDsgaSsrKSB7XHJcblx0XHRcdHBvaW50UG9zaXRpb24gPSBzY2FsZS5nZXRQb2ludFBvc2l0aW9uKGksIGxhcmdlc3RQb3NzaWJsZVJhZGl1cyk7XHJcblx0XHRcdHRleHRTaXplID0gbWVhc3VyZUxhYmVsU2l6ZShzY2FsZS5jdHgsIHBsRm9udC5zaXplLCBzY2FsZS5wb2ludExhYmVsc1tpXSB8fCAnJyk7XHJcblx0XHRcdHNjYWxlLl9wb2ludExhYmVsU2l6ZXNbaV0gPSB0ZXh0U2l6ZTtcclxuXHJcblx0XHRcdC8vIEFkZCBxdWFydGVyIGNpcmNsZSB0byBtYWtlIGRlZ3JlZSAwIG1lYW4gdG9wIG9mIGNpcmNsZVxyXG5cdFx0XHR2YXIgYW5nbGVSYWRpYW5zID0gc2NhbGUuZ2V0SW5kZXhBbmdsZShpKTtcclxuXHRcdFx0dmFyIGFuZ2xlID0gaGVscGVycy50b0RlZ3JlZXMoYW5nbGVSYWRpYW5zKSAlIDM2MDtcclxuXHRcdFx0dmFyIGhMaW1pdHMgPSBkZXRlcm1pbmVMaW1pdHMoYW5nbGUsIHBvaW50UG9zaXRpb24ueCwgdGV4dFNpemUudywgMCwgMTgwKTtcclxuXHRcdFx0dmFyIHZMaW1pdHMgPSBkZXRlcm1pbmVMaW1pdHMoYW5nbGUsIHBvaW50UG9zaXRpb24ueSwgdGV4dFNpemUuaCwgOTAsIDI3MCk7XHJcblxyXG5cdFx0XHRpZiAoaExpbWl0cy5zdGFydCA8IGZ1cnRoZXN0TGltaXRzLmwpIHtcclxuXHRcdFx0XHRmdXJ0aGVzdExpbWl0cy5sID0gaExpbWl0cy5zdGFydDtcclxuXHRcdFx0XHRmdXJ0aGVzdEFuZ2xlcy5sID0gYW5nbGVSYWRpYW5zO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoaExpbWl0cy5lbmQgPiBmdXJ0aGVzdExpbWl0cy5yKSB7XHJcblx0XHRcdFx0ZnVydGhlc3RMaW1pdHMuciA9IGhMaW1pdHMuZW5kO1xyXG5cdFx0XHRcdGZ1cnRoZXN0QW5nbGVzLnIgPSBhbmdsZVJhZGlhbnM7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICh2TGltaXRzLnN0YXJ0IDwgZnVydGhlc3RMaW1pdHMudCkge1xyXG5cdFx0XHRcdGZ1cnRoZXN0TGltaXRzLnQgPSB2TGltaXRzLnN0YXJ0O1xyXG5cdFx0XHRcdGZ1cnRoZXN0QW5nbGVzLnQgPSBhbmdsZVJhZGlhbnM7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICh2TGltaXRzLmVuZCA+IGZ1cnRoZXN0TGltaXRzLmIpIHtcclxuXHRcdFx0XHRmdXJ0aGVzdExpbWl0cy5iID0gdkxpbWl0cy5lbmQ7XHJcblx0XHRcdFx0ZnVydGhlc3RBbmdsZXMuYiA9IGFuZ2xlUmFkaWFucztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHNjYWxlLnNldFJlZHVjdGlvbnMobGFyZ2VzdFBvc3NpYmxlUmFkaXVzLCBmdXJ0aGVzdExpbWl0cywgZnVydGhlc3RBbmdsZXMpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSGVscGVyIGZ1bmN0aW9uIHRvIGZpdCBhIHJhZGlhbCBsaW5lYXIgc2NhbGUgd2l0aCBubyBwb2ludCBsYWJlbHNcclxuXHQgKi9cclxuXHRmdW5jdGlvbiBmaXQoc2NhbGUpIHtcclxuXHRcdHZhciBsYXJnZXN0UG9zc2libGVSYWRpdXMgPSBNYXRoLm1pbihzY2FsZS5oZWlnaHQgLyAyLCBzY2FsZS53aWR0aCAvIDIpO1xyXG5cdFx0c2NhbGUuZHJhd2luZ0FyZWEgPSBNYXRoLnJvdW5kKGxhcmdlc3RQb3NzaWJsZVJhZGl1cyk7XHJcblx0XHRzY2FsZS5zZXRDZW50ZXJQb2ludCgwLCAwLCAwLCAwKTtcclxuXHR9XHJcblxyXG5cdGZ1bmN0aW9uIGdldFRleHRBbGlnbkZvckFuZ2xlKGFuZ2xlKSB7XHJcblx0XHRpZiAoYW5nbGUgPT09IDAgfHwgYW5nbGUgPT09IDE4MCkge1xyXG5cdFx0XHRyZXR1cm4gJ2NlbnRlcic7XHJcblx0XHR9IGVsc2UgaWYgKGFuZ2xlIDwgMTgwKSB7XHJcblx0XHRcdHJldHVybiAnbGVmdCc7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuICdyaWdodCc7XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBmaWxsVGV4dChjdHgsIHRleHQsIHBvc2l0aW9uLCBmb250U2l6ZSkge1xyXG5cdFx0aWYgKGhlbHBlcnMuaXNBcnJheSh0ZXh0KSkge1xyXG5cdFx0XHR2YXIgeSA9IHBvc2l0aW9uLnk7XHJcblx0XHRcdHZhciBzcGFjaW5nID0gMS41ICogZm9udFNpemU7XHJcblxyXG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyArK2kpIHtcclxuXHRcdFx0XHRjdHguZmlsbFRleHQodGV4dFtpXSwgcG9zaXRpb24ueCwgeSk7XHJcblx0XHRcdFx0eSArPSBzcGFjaW5nO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjdHguZmlsbFRleHQodGV4dCwgcG9zaXRpb24ueCwgcG9zaXRpb24ueSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBhZGp1c3RQb2ludFBvc2l0aW9uRm9yTGFiZWxIZWlnaHQoYW5nbGUsIHRleHRTaXplLCBwb3NpdGlvbikge1xyXG5cdFx0aWYgKGFuZ2xlID09PSA5MCB8fCBhbmdsZSA9PT0gMjcwKSB7XHJcblx0XHRcdHBvc2l0aW9uLnkgLT0gKHRleHRTaXplLmggLyAyKTtcclxuXHRcdH0gZWxzZSBpZiAoYW5nbGUgPiAyNzAgfHwgYW5nbGUgPCA5MCkge1xyXG5cdFx0XHRwb3NpdGlvbi55IC09IHRleHRTaXplLmg7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBkcmF3UG9pbnRMYWJlbHMoc2NhbGUpIHtcclxuXHRcdHZhciBjdHggPSBzY2FsZS5jdHg7XHJcblx0XHR2YXIgb3B0cyA9IHNjYWxlLm9wdGlvbnM7XHJcblx0XHR2YXIgYW5nbGVMaW5lT3B0cyA9IG9wdHMuYW5nbGVMaW5lcztcclxuXHRcdHZhciBwb2ludExhYmVsT3B0cyA9IG9wdHMucG9pbnRMYWJlbHM7XHJcblxyXG5cdFx0Y3R4LmxpbmVXaWR0aCA9IGFuZ2xlTGluZU9wdHMubGluZVdpZHRoO1xyXG5cdFx0Y3R4LnN0cm9rZVN0eWxlID0gYW5nbGVMaW5lT3B0cy5jb2xvcjtcclxuXHJcblx0XHR2YXIgb3V0ZXJEaXN0YW5jZSA9IHNjYWxlLmdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlKG9wdHMudGlja3MucmV2ZXJzZSA/IHNjYWxlLm1pbiA6IHNjYWxlLm1heCk7XHJcblxyXG5cdFx0Ly8gUG9pbnQgTGFiZWwgRm9udFxyXG5cdFx0dmFyIHBsRm9udCA9IGdldFBvaW50TGFiZWxGb250T3B0aW9ucyhzY2FsZSk7XHJcblxyXG5cdFx0Y3R4LnRleHRCYXNlbGluZSA9ICd0b3AnO1xyXG5cclxuXHRcdGZvciAodmFyIGkgPSBnZXRWYWx1ZUNvdW50KHNjYWxlKSAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcblx0XHRcdGlmIChhbmdsZUxpbmVPcHRzLmRpc3BsYXkpIHtcclxuXHRcdFx0XHR2YXIgb3V0ZXJQb3NpdGlvbiA9IHNjYWxlLmdldFBvaW50UG9zaXRpb24oaSwgb3V0ZXJEaXN0YW5jZSk7XHJcblx0XHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xyXG5cdFx0XHRcdGN0eC5tb3ZlVG8oc2NhbGUueENlbnRlciwgc2NhbGUueUNlbnRlcik7XHJcblx0XHRcdFx0Y3R4LmxpbmVUbyhvdXRlclBvc2l0aW9uLngsIG91dGVyUG9zaXRpb24ueSk7XHJcblx0XHRcdFx0Y3R4LnN0cm9rZSgpO1xyXG5cdFx0XHRcdGN0eC5jbG9zZVBhdGgoKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKHBvaW50TGFiZWxPcHRzLmRpc3BsYXkpIHtcclxuXHRcdFx0XHQvLyBFeHRyYSAzcHggb3V0IGZvciBzb21lIGxhYmVsIHNwYWNpbmdcclxuXHRcdFx0XHR2YXIgcG9pbnRMYWJlbFBvc2l0aW9uID0gc2NhbGUuZ2V0UG9pbnRQb3NpdGlvbihpLCBvdXRlckRpc3RhbmNlICsgNSk7XHJcblxyXG5cdFx0XHRcdC8vIEtlZXAgdGhpcyBpbiBsb29wIHNpbmNlIHdlIG1heSBzdXBwb3J0IGFycmF5IHByb3BlcnRpZXMgaGVyZVxyXG5cdFx0XHRcdHZhciBwb2ludExhYmVsRm9udENvbG9yID0gaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQocG9pbnRMYWJlbE9wdHMuZm9udENvbG9yLCBpLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udENvbG9yKTtcclxuXHRcdFx0XHRjdHguZm9udCA9IHBsRm9udC5mb250O1xyXG5cdFx0XHRcdGN0eC5maWxsU3R5bGUgPSBwb2ludExhYmVsRm9udENvbG9yO1xyXG5cclxuXHRcdFx0XHR2YXIgYW5nbGVSYWRpYW5zID0gc2NhbGUuZ2V0SW5kZXhBbmdsZShpKTtcclxuXHRcdFx0XHR2YXIgYW5nbGUgPSBoZWxwZXJzLnRvRGVncmVlcyhhbmdsZVJhZGlhbnMpO1xyXG5cdFx0XHRcdGN0eC50ZXh0QWxpZ24gPSBnZXRUZXh0QWxpZ25Gb3JBbmdsZShhbmdsZSk7XHJcblx0XHRcdFx0YWRqdXN0UG9pbnRQb3NpdGlvbkZvckxhYmVsSGVpZ2h0KGFuZ2xlLCBzY2FsZS5fcG9pbnRMYWJlbFNpemVzW2ldLCBwb2ludExhYmVsUG9zaXRpb24pO1xyXG5cdFx0XHRcdGZpbGxUZXh0KGN0eCwgc2NhbGUucG9pbnRMYWJlbHNbaV0gfHwgJycsIHBvaW50TGFiZWxQb3NpdGlvbiwgcGxGb250LnNpemUpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRmdW5jdGlvbiBkcmF3UmFkaXVzTGluZShzY2FsZSwgZ3JpZExpbmVPcHRzLCByYWRpdXMsIGluZGV4KSB7XHJcblx0XHR2YXIgY3R4ID0gc2NhbGUuY3R4O1xyXG5cdFx0Y3R4LnN0cm9rZVN0eWxlID0gaGVscGVycy52YWx1ZUF0SW5kZXhPckRlZmF1bHQoZ3JpZExpbmVPcHRzLmNvbG9yLCBpbmRleCAtIDEpO1xyXG5cdFx0Y3R4LmxpbmVXaWR0aCA9IGhlbHBlcnMudmFsdWVBdEluZGV4T3JEZWZhdWx0KGdyaWRMaW5lT3B0cy5saW5lV2lkdGgsIGluZGV4IC0gMSk7XHJcblxyXG5cdFx0aWYgKHNjYWxlLm9wdGlvbnMuZ3JpZExpbmVzLmNpcmN1bGFyKSB7XHJcblx0XHRcdC8vIERyYXcgY2lyY3VsYXIgYXJjcyBiZXR3ZWVuIHRoZSBwb2ludHNcclxuXHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xyXG5cdFx0XHRjdHguYXJjKHNjYWxlLnhDZW50ZXIsIHNjYWxlLnlDZW50ZXIsIHJhZGl1cywgMCwgTWF0aC5QSSAqIDIpO1xyXG5cdFx0XHRjdHguY2xvc2VQYXRoKCk7XHJcblx0XHRcdGN0eC5zdHJva2UoKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vIERyYXcgc3RyYWlnaHQgbGluZXMgY29ubmVjdGluZyBlYWNoIGluZGV4XHJcblx0XHRcdHZhciB2YWx1ZUNvdW50ID0gZ2V0VmFsdWVDb3VudChzY2FsZSk7XHJcblxyXG5cdFx0XHRpZiAodmFsdWVDb3VudCA9PT0gMCkge1xyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y3R4LmJlZ2luUGF0aCgpO1xyXG5cdFx0XHR2YXIgcG9pbnRQb3NpdGlvbiA9IHNjYWxlLmdldFBvaW50UG9zaXRpb24oMCwgcmFkaXVzKTtcclxuXHRcdFx0Y3R4Lm1vdmVUbyhwb2ludFBvc2l0aW9uLngsIHBvaW50UG9zaXRpb24ueSk7XHJcblxyXG5cdFx0XHRmb3IgKHZhciBpID0gMTsgaSA8IHZhbHVlQ291bnQ7IGkrKykge1xyXG5cdFx0XHRcdHBvaW50UG9zaXRpb24gPSBzY2FsZS5nZXRQb2ludFBvc2l0aW9uKGksIHJhZGl1cyk7XHJcblx0XHRcdFx0Y3R4LmxpbmVUbyhwb2ludFBvc2l0aW9uLngsIHBvaW50UG9zaXRpb24ueSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGN0eC5jbG9zZVBhdGgoKTtcclxuXHRcdFx0Y3R4LnN0cm9rZSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0ZnVuY3Rpb24gbnVtYmVyT3JaZXJvKHBhcmFtKSB7XHJcblx0XHRyZXR1cm4gaGVscGVycy5pc051bWJlcihwYXJhbSkgPyBwYXJhbSA6IDA7XHJcblx0fVxyXG5cclxuXHR2YXIgTGluZWFyUmFkaWFsU2NhbGUgPSBDaGFydC5MaW5lYXJTY2FsZUJhc2UuZXh0ZW5kKHtcclxuXHRcdHNldERpbWVuc2lvbnM6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgb3B0cyA9IG1lLm9wdGlvbnM7XHJcblx0XHRcdHZhciB0aWNrT3B0cyA9IG9wdHMudGlja3M7XHJcblx0XHRcdC8vIFNldCB0aGUgdW5jb25zdHJhaW5lZCBkaW1lbnNpb24gYmVmb3JlIGxhYmVsIHJvdGF0aW9uXHJcblx0XHRcdG1lLndpZHRoID0gbWUubWF4V2lkdGg7XHJcblx0XHRcdG1lLmhlaWdodCA9IG1lLm1heEhlaWdodDtcclxuXHRcdFx0bWUueENlbnRlciA9IE1hdGgucm91bmQobWUud2lkdGggLyAyKTtcclxuXHRcdFx0bWUueUNlbnRlciA9IE1hdGgucm91bmQobWUuaGVpZ2h0IC8gMik7XHJcblxyXG5cdFx0XHR2YXIgbWluU2l6ZSA9IGhlbHBlcnMubWluKFttZS5oZWlnaHQsIG1lLndpZHRoXSk7XHJcblx0XHRcdHZhciB0aWNrRm9udFNpemUgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KHRpY2tPcHRzLmZvbnRTaXplLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFNpemUpO1xyXG5cdFx0XHRtZS5kcmF3aW5nQXJlYSA9IG9wdHMuZGlzcGxheSA/IChtaW5TaXplIC8gMikgLSAodGlja0ZvbnRTaXplIC8gMiArIHRpY2tPcHRzLmJhY2tkcm9wUGFkZGluZ1kpIDogKG1pblNpemUgLyAyKTtcclxuXHRcdH0sXHJcblx0XHRkZXRlcm1pbmVEYXRhTGltaXRzOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIGNoYXJ0ID0gbWUuY2hhcnQ7XHJcblx0XHRcdHZhciBtaW4gPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XHJcblx0XHRcdHZhciBtYXggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XHJcblxyXG5cdFx0XHRoZWxwZXJzLmVhY2goY2hhcnQuZGF0YS5kYXRhc2V0cywgZnVuY3Rpb24oZGF0YXNldCwgZGF0YXNldEluZGV4KSB7XHJcblx0XHRcdFx0aWYgKGNoYXJ0LmlzRGF0YXNldFZpc2libGUoZGF0YXNldEluZGV4KSkge1xyXG5cdFx0XHRcdFx0dmFyIG1ldGEgPSBjaGFydC5nZXREYXRhc2V0TWV0YShkYXRhc2V0SW5kZXgpO1xyXG5cclxuXHRcdFx0XHRcdGhlbHBlcnMuZWFjaChkYXRhc2V0LmRhdGEsIGZ1bmN0aW9uKHJhd1ZhbHVlLCBpbmRleCkge1xyXG5cdFx0XHRcdFx0XHR2YXIgdmFsdWUgPSArbWUuZ2V0UmlnaHRWYWx1ZShyYXdWYWx1ZSk7XHJcblx0XHRcdFx0XHRcdGlmIChpc05hTih2YWx1ZSkgfHwgbWV0YS5kYXRhW2luZGV4XS5oaWRkZW4pIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdG1pbiA9IE1hdGgubWluKHZhbHVlLCBtaW4pO1xyXG5cdFx0XHRcdFx0XHRtYXggPSBNYXRoLm1heCh2YWx1ZSwgbWF4KTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRtZS5taW4gPSAobWluID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgPyAwIDogbWluKTtcclxuXHRcdFx0bWUubWF4ID0gKG1heCA9PT0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZID8gMCA6IG1heCk7XHJcblxyXG5cdFx0XHQvLyBDb21tb24gYmFzZSBpbXBsZW1lbnRhdGlvbiB0byBoYW5kbGUgdGlja3MubWluLCB0aWNrcy5tYXgsIHRpY2tzLmJlZ2luQXRaZXJvXHJcblx0XHRcdG1lLmhhbmRsZVRpY2tSYW5nZU9wdGlvbnMoKTtcclxuXHRcdH0sXHJcblx0XHRnZXRUaWNrTGltaXQ6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgdGlja09wdHMgPSB0aGlzLm9wdGlvbnMudGlja3M7XHJcblx0XHRcdHZhciB0aWNrRm9udFNpemUgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KHRpY2tPcHRzLmZvbnRTaXplLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFNpemUpO1xyXG5cdFx0XHRyZXR1cm4gTWF0aC5taW4odGlja09wdHMubWF4VGlja3NMaW1pdCA/IHRpY2tPcHRzLm1heFRpY2tzTGltaXQgOiAxMSwgTWF0aC5jZWlsKHRoaXMuZHJhd2luZ0FyZWEgLyAoMS41ICogdGlja0ZvbnRTaXplKSkpO1xyXG5cdFx0fSxcclxuXHRcdGNvbnZlcnRUaWNrc1RvTGFiZWxzOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHJcblx0XHRcdENoYXJ0LkxpbmVhclNjYWxlQmFzZS5wcm90b3R5cGUuY29udmVydFRpY2tzVG9MYWJlbHMuY2FsbChtZSk7XHJcblxyXG5cdFx0XHQvLyBQb2ludCBsYWJlbHNcclxuXHRcdFx0bWUucG9pbnRMYWJlbHMgPSBtZS5jaGFydC5kYXRhLmxhYmVscy5tYXAobWUub3B0aW9ucy5wb2ludExhYmVscy5jYWxsYmFjaywgbWUpO1xyXG5cdFx0fSxcclxuXHRcdGdldExhYmVsRm9ySW5kZXg6IGZ1bmN0aW9uKGluZGV4LCBkYXRhc2V0SW5kZXgpIHtcclxuXHRcdFx0cmV0dXJuICt0aGlzLmdldFJpZ2h0VmFsdWUodGhpcy5jaGFydC5kYXRhLmRhdGFzZXRzW2RhdGFzZXRJbmRleF0uZGF0YVtpbmRleF0pO1xyXG5cdFx0fSxcclxuXHRcdGZpdDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdGlmICh0aGlzLm9wdGlvbnMucG9pbnRMYWJlbHMuZGlzcGxheSkge1xyXG5cdFx0XHRcdGZpdFdpdGhQb2ludExhYmVscyh0aGlzKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRmaXQodGhpcyk7XHJcblx0XHRcdH1cclxuXHRcdH0sXHJcblx0XHQvKipcclxuXHRcdCAqIFNldCByYWRpdXMgcmVkdWN0aW9ucyBhbmQgZGV0ZXJtaW5lIG5ldyByYWRpdXMgYW5kIGNlbnRlciBwb2ludFxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cdFx0c2V0UmVkdWN0aW9uczogZnVuY3Rpb24obGFyZ2VzdFBvc3NpYmxlUmFkaXVzLCBmdXJ0aGVzdExpbWl0cywgZnVydGhlc3RBbmdsZXMpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIHJhZGl1c1JlZHVjdGlvbkxlZnQgPSBmdXJ0aGVzdExpbWl0cy5sIC8gTWF0aC5zaW4oZnVydGhlc3RBbmdsZXMubCk7XHJcblx0XHRcdHZhciByYWRpdXNSZWR1Y3Rpb25SaWdodCA9IE1hdGgubWF4KGZ1cnRoZXN0TGltaXRzLnIgLSBtZS53aWR0aCwgMCkgLyBNYXRoLnNpbihmdXJ0aGVzdEFuZ2xlcy5yKTtcclxuXHRcdFx0dmFyIHJhZGl1c1JlZHVjdGlvblRvcCA9IC1mdXJ0aGVzdExpbWl0cy50IC8gTWF0aC5jb3MoZnVydGhlc3RBbmdsZXMudCk7XHJcblx0XHRcdHZhciByYWRpdXNSZWR1Y3Rpb25Cb3R0b20gPSAtTWF0aC5tYXgoZnVydGhlc3RMaW1pdHMuYiAtIG1lLmhlaWdodCwgMCkgLyBNYXRoLmNvcyhmdXJ0aGVzdEFuZ2xlcy5iKTtcclxuXHJcblx0XHRcdHJhZGl1c1JlZHVjdGlvbkxlZnQgPSBudW1iZXJPclplcm8ocmFkaXVzUmVkdWN0aW9uTGVmdCk7XHJcblx0XHRcdHJhZGl1c1JlZHVjdGlvblJpZ2h0ID0gbnVtYmVyT3JaZXJvKHJhZGl1c1JlZHVjdGlvblJpZ2h0KTtcclxuXHRcdFx0cmFkaXVzUmVkdWN0aW9uVG9wID0gbnVtYmVyT3JaZXJvKHJhZGl1c1JlZHVjdGlvblRvcCk7XHJcblx0XHRcdHJhZGl1c1JlZHVjdGlvbkJvdHRvbSA9IG51bWJlck9yWmVybyhyYWRpdXNSZWR1Y3Rpb25Cb3R0b20pO1xyXG5cclxuXHRcdFx0bWUuZHJhd2luZ0FyZWEgPSBNYXRoLm1pbihcclxuXHRcdFx0XHRNYXRoLnJvdW5kKGxhcmdlc3RQb3NzaWJsZVJhZGl1cyAtIChyYWRpdXNSZWR1Y3Rpb25MZWZ0ICsgcmFkaXVzUmVkdWN0aW9uUmlnaHQpIC8gMiksXHJcblx0XHRcdFx0TWF0aC5yb3VuZChsYXJnZXN0UG9zc2libGVSYWRpdXMgLSAocmFkaXVzUmVkdWN0aW9uVG9wICsgcmFkaXVzUmVkdWN0aW9uQm90dG9tKSAvIDIpKTtcclxuXHRcdFx0bWUuc2V0Q2VudGVyUG9pbnQocmFkaXVzUmVkdWN0aW9uTGVmdCwgcmFkaXVzUmVkdWN0aW9uUmlnaHQsIHJhZGl1c1JlZHVjdGlvblRvcCwgcmFkaXVzUmVkdWN0aW9uQm90dG9tKTtcclxuXHRcdH0sXHJcblx0XHRzZXRDZW50ZXJQb2ludDogZnVuY3Rpb24obGVmdE1vdmVtZW50LCByaWdodE1vdmVtZW50LCB0b3BNb3ZlbWVudCwgYm90dG9tTW92ZW1lbnQpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIG1heFJpZ2h0ID0gbWUud2lkdGggLSByaWdodE1vdmVtZW50IC0gbWUuZHJhd2luZ0FyZWE7XHJcblx0XHRcdHZhciBtYXhMZWZ0ID0gbGVmdE1vdmVtZW50ICsgbWUuZHJhd2luZ0FyZWE7XHJcblx0XHRcdHZhciBtYXhUb3AgPSB0b3BNb3ZlbWVudCArIG1lLmRyYXdpbmdBcmVhO1xyXG5cdFx0XHR2YXIgbWF4Qm90dG9tID0gbWUuaGVpZ2h0IC0gYm90dG9tTW92ZW1lbnQgLSBtZS5kcmF3aW5nQXJlYTtcclxuXHJcblx0XHRcdG1lLnhDZW50ZXIgPSBNYXRoLnJvdW5kKCgobWF4TGVmdCArIG1heFJpZ2h0KSAvIDIpICsgbWUubGVmdCk7XHJcblx0XHRcdG1lLnlDZW50ZXIgPSBNYXRoLnJvdW5kKCgobWF4VG9wICsgbWF4Qm90dG9tKSAvIDIpICsgbWUudG9wKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0Z2V0SW5kZXhBbmdsZTogZnVuY3Rpb24oaW5kZXgpIHtcclxuXHRcdFx0dmFyIGFuZ2xlTXVsdGlwbGllciA9IChNYXRoLlBJICogMikgLyBnZXRWYWx1ZUNvdW50KHRoaXMpO1xyXG5cdFx0XHR2YXIgc3RhcnRBbmdsZSA9IHRoaXMuY2hhcnQub3B0aW9ucyAmJiB0aGlzLmNoYXJ0Lm9wdGlvbnMuc3RhcnRBbmdsZSA/XHJcblx0XHRcdFx0dGhpcy5jaGFydC5vcHRpb25zLnN0YXJ0QW5nbGUgOlxyXG5cdFx0XHRcdDA7XHJcblxyXG5cdFx0XHR2YXIgc3RhcnRBbmdsZVJhZGlhbnMgPSBzdGFydEFuZ2xlICogTWF0aC5QSSAqIDIgLyAzNjA7XHJcblxyXG5cdFx0XHQvLyBTdGFydCBmcm9tIHRoZSB0b3AgaW5zdGVhZCBvZiByaWdodCwgc28gcmVtb3ZlIGEgcXVhcnRlciBvZiB0aGUgY2lyY2xlXHJcblx0XHRcdHJldHVybiBpbmRleCAqIGFuZ2xlTXVsdGlwbGllciArIHN0YXJ0QW5nbGVSYWRpYW5zO1xyXG5cdFx0fSxcclxuXHRcdGdldERpc3RhbmNlRnJvbUNlbnRlckZvclZhbHVlOiBmdW5jdGlvbih2YWx1ZSkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cclxuXHRcdFx0aWYgKHZhbHVlID09PSBudWxsKSB7XHJcblx0XHRcdFx0cmV0dXJuIDA7IC8vIG51bGwgYWx3YXlzIGluIGNlbnRlclxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyBUYWtlIGludG8gYWNjb3VudCBoYWxmIGZvbnQgc2l6ZSArIHRoZSB5UGFkZGluZyBvZiB0aGUgdG9wIHZhbHVlXHJcblx0XHRcdHZhciBzY2FsaW5nRmFjdG9yID0gbWUuZHJhd2luZ0FyZWEgLyAobWUubWF4IC0gbWUubWluKTtcclxuXHRcdFx0aWYgKG1lLm9wdGlvbnMudGlja3MucmV2ZXJzZSkge1xyXG5cdFx0XHRcdHJldHVybiAobWUubWF4IC0gdmFsdWUpICogc2NhbGluZ0ZhY3RvcjtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gKHZhbHVlIC0gbWUubWluKSAqIHNjYWxpbmdGYWN0b3I7XHJcblx0XHR9LFxyXG5cdFx0Z2V0UG9pbnRQb3NpdGlvbjogZnVuY3Rpb24oaW5kZXgsIGRpc3RhbmNlRnJvbUNlbnRlcikge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgdGhpc0FuZ2xlID0gbWUuZ2V0SW5kZXhBbmdsZShpbmRleCkgLSAoTWF0aC5QSSAvIDIpO1xyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdHg6IE1hdGgucm91bmQoTWF0aC5jb3ModGhpc0FuZ2xlKSAqIGRpc3RhbmNlRnJvbUNlbnRlcikgKyBtZS54Q2VudGVyLFxyXG5cdFx0XHRcdHk6IE1hdGgucm91bmQoTWF0aC5zaW4odGhpc0FuZ2xlKSAqIGRpc3RhbmNlRnJvbUNlbnRlcikgKyBtZS55Q2VudGVyXHJcblx0XHRcdH07XHJcblx0XHR9LFxyXG5cdFx0Z2V0UG9pbnRQb3NpdGlvbkZvclZhbHVlOiBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0UG9pbnRQb3NpdGlvbihpbmRleCwgdGhpcy5nZXREaXN0YW5jZUZyb21DZW50ZXJGb3JWYWx1ZSh2YWx1ZSkpO1xyXG5cdFx0fSxcclxuXHJcblx0XHRnZXRCYXNlUG9zaXRpb246IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgbWluID0gbWUubWluO1xyXG5cdFx0XHR2YXIgbWF4ID0gbWUubWF4O1xyXG5cclxuXHRcdFx0cmV0dXJuIG1lLmdldFBvaW50UG9zaXRpb25Gb3JWYWx1ZSgwLFxyXG5cdFx0XHRcdG1lLmJlZ2luQXRaZXJvID8gMCA6XHJcblx0XHRcdFx0bWluIDwgMCAmJiBtYXggPCAwID8gbWF4IDpcclxuXHRcdFx0XHRtaW4gPiAwICYmIG1heCA+IDAgPyBtaW4gOlxyXG5cdFx0XHRcdDApO1xyXG5cdFx0fSxcclxuXHJcblx0XHRkcmF3OiBmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIG9wdHMgPSBtZS5vcHRpb25zO1xyXG5cdFx0XHR2YXIgZ3JpZExpbmVPcHRzID0gb3B0cy5ncmlkTGluZXM7XHJcblx0XHRcdHZhciB0aWNrT3B0cyA9IG9wdHMudGlja3M7XHJcblx0XHRcdHZhciB2YWx1ZU9yRGVmYXVsdCA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQ7XHJcblxyXG5cdFx0XHRpZiAob3B0cy5kaXNwbGF5KSB7XHJcblx0XHRcdFx0dmFyIGN0eCA9IG1lLmN0eDtcclxuXHRcdFx0XHR2YXIgc3RhcnRBbmdsZSA9IHRoaXMuZ2V0SW5kZXhBbmdsZSgwKTtcclxuXHJcblx0XHRcdFx0Ly8gVGljayBGb250XHJcblx0XHRcdFx0dmFyIHRpY2tGb250U2l6ZSA9IHZhbHVlT3JEZWZhdWx0KHRpY2tPcHRzLmZvbnRTaXplLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFNpemUpO1xyXG5cdFx0XHRcdHZhciB0aWNrRm9udFN0eWxlID0gdmFsdWVPckRlZmF1bHQodGlja09wdHMuZm9udFN0eWxlLCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udFN0eWxlKTtcclxuXHRcdFx0XHR2YXIgdGlja0ZvbnRGYW1pbHkgPSB2YWx1ZU9yRGVmYXVsdCh0aWNrT3B0cy5mb250RmFtaWx5LCBnbG9iYWxEZWZhdWx0cy5kZWZhdWx0Rm9udEZhbWlseSk7XHJcblx0XHRcdFx0dmFyIHRpY2tMYWJlbEZvbnQgPSBoZWxwZXJzLmZvbnRTdHJpbmcodGlja0ZvbnRTaXplLCB0aWNrRm9udFN0eWxlLCB0aWNrRm9udEZhbWlseSk7XHJcblxyXG5cdFx0XHRcdGhlbHBlcnMuZWFjaChtZS50aWNrcywgZnVuY3Rpb24obGFiZWwsIGluZGV4KSB7XHJcblx0XHRcdFx0XHQvLyBEb24ndCBkcmF3IGEgY2VudHJlIHZhbHVlIChpZiBpdCBpcyBtaW5pbXVtKVxyXG5cdFx0XHRcdFx0aWYgKGluZGV4ID4gMCB8fCB0aWNrT3B0cy5yZXZlcnNlKSB7XHJcblx0XHRcdFx0XHRcdHZhciB5Q2VudGVyT2Zmc2V0ID0gbWUuZ2V0RGlzdGFuY2VGcm9tQ2VudGVyRm9yVmFsdWUobWUudGlja3NBc051bWJlcnNbaW5kZXhdKTtcclxuXHJcblx0XHRcdFx0XHRcdC8vIERyYXcgY2lyY3VsYXIgbGluZXMgYXJvdW5kIHRoZSBzY2FsZVxyXG5cdFx0XHRcdFx0XHRpZiAoZ3JpZExpbmVPcHRzLmRpc3BsYXkgJiYgaW5kZXggIT09IDApIHtcclxuXHRcdFx0XHRcdFx0XHRkcmF3UmFkaXVzTGluZShtZSwgZ3JpZExpbmVPcHRzLCB5Q2VudGVyT2Zmc2V0LCBpbmRleCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmICh0aWNrT3B0cy5kaXNwbGF5KSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIHRpY2tGb250Q29sb3IgPSB2YWx1ZU9yRGVmYXVsdCh0aWNrT3B0cy5mb250Q29sb3IsIGdsb2JhbERlZmF1bHRzLmRlZmF1bHRGb250Q29sb3IpO1xyXG5cdFx0XHRcdFx0XHRcdGN0eC5mb250ID0gdGlja0xhYmVsRm9udDtcclxuXHJcblx0XHRcdFx0XHRcdFx0Y3R4LnNhdmUoKTtcclxuXHRcdFx0XHRcdFx0XHRjdHgudHJhbnNsYXRlKG1lLnhDZW50ZXIsIG1lLnlDZW50ZXIpO1xyXG5cdFx0XHRcdFx0XHRcdGN0eC5yb3RhdGUoc3RhcnRBbmdsZSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdGlmICh0aWNrT3B0cy5zaG93TGFiZWxCYWNrZHJvcCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dmFyIGxhYmVsV2lkdGggPSBjdHgubWVhc3VyZVRleHQobGFiZWwpLndpZHRoO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y3R4LmZpbGxTdHlsZSA9IHRpY2tPcHRzLmJhY2tkcm9wQ29sb3I7XHJcblx0XHRcdFx0XHRcdFx0XHRjdHguZmlsbFJlY3QoXHJcblx0XHRcdFx0XHRcdFx0XHRcdC1sYWJlbFdpZHRoIC8gMiAtIHRpY2tPcHRzLmJhY2tkcm9wUGFkZGluZ1gsXHJcblx0XHRcdFx0XHRcdFx0XHRcdC15Q2VudGVyT2Zmc2V0IC0gdGlja0ZvbnRTaXplIC8gMiAtIHRpY2tPcHRzLmJhY2tkcm9wUGFkZGluZ1ksXHJcblx0XHRcdFx0XHRcdFx0XHRcdGxhYmVsV2lkdGggKyB0aWNrT3B0cy5iYWNrZHJvcFBhZGRpbmdYICogMixcclxuXHRcdFx0XHRcdFx0XHRcdFx0dGlja0ZvbnRTaXplICsgdGlja09wdHMuYmFja2Ryb3BQYWRkaW5nWSAqIDJcclxuXHRcdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRjdHgudGV4dEFsaWduID0gJ2NlbnRlcic7XHJcblx0XHRcdFx0XHRcdFx0Y3R4LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xyXG5cdFx0XHRcdFx0XHRcdGN0eC5maWxsU3R5bGUgPSB0aWNrRm9udENvbG9yO1xyXG5cdFx0XHRcdFx0XHRcdGN0eC5maWxsVGV4dChsYWJlbCwgMCwgLXlDZW50ZXJPZmZzZXQpO1xyXG5cdFx0XHRcdFx0XHRcdGN0eC5yZXN0b3JlKCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0aWYgKG9wdHMuYW5nbGVMaW5lcy5kaXNwbGF5IHx8IG9wdHMucG9pbnRMYWJlbHMuZGlzcGxheSkge1xyXG5cdFx0XHRcdFx0ZHJhd1BvaW50TGFiZWxzKG1lKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9KTtcclxuXHJcblx0c2NhbGVTZXJ2aWNlLnJlZ2lzdGVyU2NhbGVUeXBlKCdyYWRpYWxMaW5lYXInLCBMaW5lYXJSYWRpYWxTY2FsZSwgZGVmYXVsdENvbmZpZyk7XHJcbn07XHJcblxyXG59LHtcIjI2XCI6MjYsXCIzNFwiOjM0LFwiMzVcIjozNSxcIjQ2XCI6NDZ9XSw1OTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7XHJcbi8qIGdsb2JhbCB3aW5kb3c6IGZhbHNlICovXHJcbid1c2Ugc3RyaWN0JztcclxuXHJcbnZhciBtb21lbnQgPSByZXF1aXJlKDEpO1xyXG5tb21lbnQgPSB0eXBlb2YgbW9tZW50ID09PSAnZnVuY3Rpb24nID8gbW9tZW50IDogd2luZG93Lm1vbWVudDtcclxuXHJcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoMjYpO1xyXG52YXIgaGVscGVycyA9IHJlcXVpcmUoNDYpO1xyXG52YXIgU2NhbGUgPSByZXF1aXJlKDMzKTtcclxudmFyIHNjYWxlU2VydmljZSA9IHJlcXVpcmUoMzQpO1xyXG5cclxuLy8gSW50ZWdlciBjb25zdGFudHMgYXJlIGZyb20gdGhlIEVTNiBzcGVjLlxyXG52YXIgTUlOX0lOVEVHRVIgPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUiB8fCAtOTAwNzE5OTI1NDc0MDk5MTtcclxudmFyIE1BWF9JTlRFR0VSID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgfHwgOTAwNzE5OTI1NDc0MDk5MTtcclxuXHJcbnZhciBJTlRFUlZBTFMgPSB7XHJcblx0bWlsbGlzZWNvbmQ6IHtcclxuXHRcdGNvbW1vbjogdHJ1ZSxcclxuXHRcdHNpemU6IDEsXHJcblx0XHRzdGVwczogWzEsIDIsIDUsIDEwLCAyMCwgNTAsIDEwMCwgMjUwLCA1MDBdXHJcblx0fSxcclxuXHRzZWNvbmQ6IHtcclxuXHRcdGNvbW1vbjogdHJ1ZSxcclxuXHRcdHNpemU6IDEwMDAsXHJcblx0XHRzdGVwczogWzEsIDIsIDUsIDEwLCAxNSwgMzBdXHJcblx0fSxcclxuXHRtaW51dGU6IHtcclxuXHRcdGNvbW1vbjogdHJ1ZSxcclxuXHRcdHNpemU6IDYwMDAwLFxyXG5cdFx0c3RlcHM6IFsxLCAyLCA1LCAxMCwgMTUsIDMwXVxyXG5cdH0sXHJcblx0aG91cjoge1xyXG5cdFx0Y29tbW9uOiB0cnVlLFxyXG5cdFx0c2l6ZTogMzYwMDAwMCxcclxuXHRcdHN0ZXBzOiBbMSwgMiwgMywgNiwgMTJdXHJcblx0fSxcclxuXHRkYXk6IHtcclxuXHRcdGNvbW1vbjogdHJ1ZSxcclxuXHRcdHNpemU6IDg2NDAwMDAwLFxyXG5cdFx0c3RlcHM6IFsxLCAyLCA1XVxyXG5cdH0sXHJcblx0d2Vlazoge1xyXG5cdFx0Y29tbW9uOiBmYWxzZSxcclxuXHRcdHNpemU6IDYwNDgwMDAwMCxcclxuXHRcdHN0ZXBzOiBbMSwgMiwgMywgNF1cclxuXHR9LFxyXG5cdG1vbnRoOiB7XHJcblx0XHRjb21tb246IHRydWUsXHJcblx0XHRzaXplOiAyLjYyOGU5LFxyXG5cdFx0c3RlcHM6IFsxLCAyLCAzXVxyXG5cdH0sXHJcblx0cXVhcnRlcjoge1xyXG5cdFx0Y29tbW9uOiBmYWxzZSxcclxuXHRcdHNpemU6IDcuODg0ZTksXHJcblx0XHRzdGVwczogWzEsIDIsIDMsIDRdXHJcblx0fSxcclxuXHR5ZWFyOiB7XHJcblx0XHRjb21tb246IHRydWUsXHJcblx0XHRzaXplOiAzLjE1NGUxMFxyXG5cdH1cclxufTtcclxuXHJcbnZhciBVTklUUyA9IE9iamVjdC5rZXlzKElOVEVSVkFMUyk7XHJcblxyXG5mdW5jdGlvbiBzb3J0ZXIoYSwgYikge1xyXG5cdHJldHVybiBhIC0gYjtcclxufVxyXG5cclxuZnVuY3Rpb24gYXJyYXlVbmlxdWUoaXRlbXMpIHtcclxuXHR2YXIgaGFzaCA9IHt9O1xyXG5cdHZhciBvdXQgPSBbXTtcclxuXHR2YXIgaSwgaWxlbiwgaXRlbTtcclxuXHJcblx0Zm9yIChpID0gMCwgaWxlbiA9IGl0ZW1zLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xyXG5cdFx0aXRlbSA9IGl0ZW1zW2ldO1xyXG5cdFx0aWYgKCFoYXNoW2l0ZW1dKSB7XHJcblx0XHRcdGhhc2hbaXRlbV0gPSB0cnVlO1xyXG5cdFx0XHRvdXQucHVzaChpdGVtKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHJldHVybiBvdXQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIHt0aW1lLCBwb3N9IG9iamVjdHMgdXNlZCB0byBpbnRlcnBvbGF0ZSBhIHNwZWNpZmljIGB0aW1lYCBvciBwb3NpdGlvblxyXG4gKiAoYHBvc2ApIG9uIHRoZSBzY2FsZSwgYnkgc2VhcmNoaW5nIGVudHJpZXMgYmVmb3JlIGFuZCBhZnRlciB0aGUgcmVxdWVzdGVkIHZhbHVlLiBgcG9zYCBpc1xyXG4gKiBhIGRlY2ltYWwgYmV0d2VlbiAwIGFuZCAxOiAwIGJlaW5nIHRoZSBzdGFydCBvZiB0aGUgc2NhbGUgKGxlZnQgb3IgdG9wKSBhbmQgMSB0aGUgb3RoZXJcclxuICogZXh0cmVtaXR5IChsZWZ0ICsgd2lkdGggb3IgdG9wICsgaGVpZ2h0KS4gTm90ZSB0aGF0IGl0IHdvdWxkIGJlIG1vcmUgb3B0aW1pemVkIHRvIGRpcmVjdGx5XHJcbiAqIHN0b3JlIHByZS1jb21wdXRlZCBwaXhlbHMsIGJ1dCB0aGUgc2NhbGUgZGltZW5zaW9ucyBhcmUgbm90IGd1YXJhbnRlZWQgYXQgdGhlIHRpbWUgd2UgbmVlZFxyXG4gKiB0byBjcmVhdGUgdGhlIGxvb2t1cCB0YWJsZS4gVGhlIHRhYmxlIEFMV0FZUyBjb250YWlucyBhdCBsZWFzdCB0d28gaXRlbXM6IG1pbiBhbmQgbWF4LlxyXG4gKlxyXG4gKiBAcGFyYW0ge051bWJlcltdfSB0aW1lc3RhbXBzIC0gdGltZXN0YW1wcyBzb3J0ZWQgZnJvbSBsb3dlc3QgdG8gaGlnaGVzdC5cclxuICogQHBhcmFtIHtTdHJpbmd9IGRpc3RyaWJ1dGlvbiAtIElmICdsaW5lYXInLCB0aW1lc3RhbXBzIHdpbGwgYmUgc3ByZWFkIGxpbmVhcmx5IGFsb25nIHRoZSBtaW5cclxuICogYW5kIG1heCByYW5nZSwgc28gYmFzaWNhbGx5LCB0aGUgdGFibGUgd2lsbCBjb250YWlucyBvbmx5IHR3byBpdGVtczoge21pbiwgMH0gYW5kIHttYXgsIDF9LlxyXG4gKiBJZiAnc2VyaWVzJywgdGltZXN0YW1wcyB3aWxsIGJlIHBvc2l0aW9uZWQgYXQgdGhlIHNhbWUgZGlzdGFuY2UgZnJvbSBlYWNoIG90aGVyLiBJbiB0aGlzXHJcbiAqIGNhc2UsIG9ubHkgdGltZXN0YW1wcyB0aGF0IGJyZWFrIHRoZSB0aW1lIGxpbmVhcml0eSBhcmUgcmVnaXN0ZXJlZCwgbWVhbmluZyB0aGF0IGluIHRoZVxyXG4gKiBiZXN0IGNhc2UsIGFsbCB0aW1lc3RhbXBzIGFyZSBsaW5lYXIsIHRoZSB0YWJsZSBjb250YWlucyBvbmx5IG1pbiBhbmQgbWF4LlxyXG4gKi9cclxuZnVuY3Rpb24gYnVpbGRMb29rdXBUYWJsZSh0aW1lc3RhbXBzLCBtaW4sIG1heCwgZGlzdHJpYnV0aW9uKSB7XHJcblx0aWYgKGRpc3RyaWJ1dGlvbiA9PT0gJ2xpbmVhcicgfHwgIXRpbWVzdGFtcHMubGVuZ3RoKSB7XHJcblx0XHRyZXR1cm4gW1xyXG5cdFx0XHR7dGltZTogbWluLCBwb3M6IDB9LFxyXG5cdFx0XHR7dGltZTogbWF4LCBwb3M6IDF9XHJcblx0XHRdO1xyXG5cdH1cclxuXHJcblx0dmFyIHRhYmxlID0gW107XHJcblx0dmFyIGl0ZW1zID0gW21pbl07XHJcblx0dmFyIGksIGlsZW4sIHByZXYsIGN1cnIsIG5leHQ7XHJcblxyXG5cdGZvciAoaSA9IDAsIGlsZW4gPSB0aW1lc3RhbXBzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xyXG5cdFx0Y3VyciA9IHRpbWVzdGFtcHNbaV07XHJcblx0XHRpZiAoY3VyciA+IG1pbiAmJiBjdXJyIDwgbWF4KSB7XHJcblx0XHRcdGl0ZW1zLnB1c2goY3Vycik7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRpdGVtcy5wdXNoKG1heCk7XHJcblxyXG5cdGZvciAoaSA9IDAsIGlsZW4gPSBpdGVtcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcclxuXHRcdG5leHQgPSBpdGVtc1tpICsgMV07XHJcblx0XHRwcmV2ID0gaXRlbXNbaSAtIDFdO1xyXG5cdFx0Y3VyciA9IGl0ZW1zW2ldO1xyXG5cclxuXHRcdC8vIG9ubHkgYWRkIHBvaW50cyB0aGF0IGJyZWFrcyB0aGUgc2NhbGUgbGluZWFyaXR5XHJcblx0XHRpZiAocHJldiA9PT0gdW5kZWZpbmVkIHx8IG5leHQgPT09IHVuZGVmaW5lZCB8fCBNYXRoLnJvdW5kKChuZXh0ICsgcHJldikgLyAyKSAhPT0gY3Vycikge1xyXG5cdFx0XHR0YWJsZS5wdXNoKHt0aW1lOiBjdXJyLCBwb3M6IGkgLyAoaWxlbiAtIDEpfSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gdGFibGU7XHJcbn1cclxuXHJcbi8vIEBzZWUgYWRhcHRlZCBmcm9tIGh0dHA6Ly93d3cuYW51amdha2hhci5jb20vMjAxNC8wMy8wMS9iaW5hcnktc2VhcmNoLWluLWphdmFzY3JpcHQvXHJcbmZ1bmN0aW9uIGxvb2t1cCh0YWJsZSwga2V5LCB2YWx1ZSkge1xyXG5cdHZhciBsbyA9IDA7XHJcblx0dmFyIGhpID0gdGFibGUubGVuZ3RoIC0gMTtcclxuXHR2YXIgbWlkLCBpMCwgaTE7XHJcblxyXG5cdHdoaWxlIChsbyA+PSAwICYmIGxvIDw9IGhpKSB7XHJcblx0XHRtaWQgPSAobG8gKyBoaSkgPj4gMTtcclxuXHRcdGkwID0gdGFibGVbbWlkIC0gMV0gfHwgbnVsbDtcclxuXHRcdGkxID0gdGFibGVbbWlkXTtcclxuXHJcblx0XHRpZiAoIWkwKSB7XHJcblx0XHRcdC8vIGdpdmVuIHZhbHVlIGlzIG91dHNpZGUgdGFibGUgKGJlZm9yZSBmaXJzdCBpdGVtKVxyXG5cdFx0XHRyZXR1cm4ge2xvOiBudWxsLCBoaTogaTF9O1xyXG5cdFx0fSBlbHNlIGlmIChpMVtrZXldIDwgdmFsdWUpIHtcclxuXHRcdFx0bG8gPSBtaWQgKyAxO1xyXG5cdFx0fSBlbHNlIGlmIChpMFtrZXldID4gdmFsdWUpIHtcclxuXHRcdFx0aGkgPSBtaWQgLSAxO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cmV0dXJuIHtsbzogaTAsIGhpOiBpMX07XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvLyBnaXZlbiB2YWx1ZSBpcyBvdXRzaWRlIHRhYmxlIChhZnRlciBsYXN0IGl0ZW0pXHJcblx0cmV0dXJuIHtsbzogaTEsIGhpOiBudWxsfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIExpbmVhcmx5IGludGVycG9sYXRlcyB0aGUgZ2l2ZW4gc291cmNlIGB2YWx1ZWAgdXNpbmcgdGhlIHRhYmxlIGl0ZW1zIGBza2V5YCB2YWx1ZXMgYW5kXHJcbiAqIHJldHVybnMgdGhlIGFzc29jaWF0ZWQgYHRrZXlgIHZhbHVlLiBGb3IgZXhhbXBsZSwgaW50ZXJwb2xhdGUodGFibGUsICd0aW1lJywgNDIsICdwb3MnKVxyXG4gKiByZXR1cm5zIHRoZSBwb3NpdGlvbiBmb3IgYSB0aW1lc3RhbXAgZXF1YWwgdG8gNDIuIElmIHZhbHVlIGlzIG91dCBvZiBib3VuZHMsIHZhbHVlcyBhdFxyXG4gKiBpbmRleCBbMCwgMV0gb3IgW24gLSAxLCBuXSBhcmUgdXNlZCBmb3IgdGhlIGludGVycG9sYXRpb24uXHJcbiAqL1xyXG5mdW5jdGlvbiBpbnRlcnBvbGF0ZSh0YWJsZSwgc2tleSwgc3ZhbCwgdGtleSkge1xyXG5cdHZhciByYW5nZSA9IGxvb2t1cCh0YWJsZSwgc2tleSwgc3ZhbCk7XHJcblxyXG5cdC8vIE5vdGU6IHRoZSBsb29rdXAgdGFibGUgQUxXQVlTIGNvbnRhaW5zIGF0IGxlYXN0IDIgaXRlbXMgKG1pbiBhbmQgbWF4KVxyXG5cdHZhciBwcmV2ID0gIXJhbmdlLmxvID8gdGFibGVbMF0gOiAhcmFuZ2UuaGkgPyB0YWJsZVt0YWJsZS5sZW5ndGggLSAyXSA6IHJhbmdlLmxvO1xyXG5cdHZhciBuZXh0ID0gIXJhbmdlLmxvID8gdGFibGVbMV0gOiAhcmFuZ2UuaGkgPyB0YWJsZVt0YWJsZS5sZW5ndGggLSAxXSA6IHJhbmdlLmhpO1xyXG5cclxuXHR2YXIgc3BhbiA9IG5leHRbc2tleV0gLSBwcmV2W3NrZXldO1xyXG5cdHZhciByYXRpbyA9IHNwYW4gPyAoc3ZhbCAtIHByZXZbc2tleV0pIC8gc3BhbiA6IDA7XHJcblx0dmFyIG9mZnNldCA9IChuZXh0W3RrZXldIC0gcHJldlt0a2V5XSkgKiByYXRpbztcclxuXHJcblx0cmV0dXJuIHByZXZbdGtleV0gKyBvZmZzZXQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb252ZXJ0IHRoZSBnaXZlbiB2YWx1ZSB0byBhIG1vbWVudCBvYmplY3QgdXNpbmcgdGhlIGdpdmVuIHRpbWUgb3B0aW9ucy5cclxuICogQHNlZSBodHRwOi8vbW9tZW50anMuY29tL2RvY3MvIy9wYXJzaW5nL1xyXG4gKi9cclxuZnVuY3Rpb24gbW9tZW50aWZ5KHZhbHVlLCBvcHRpb25zKSB7XHJcblx0dmFyIHBhcnNlciA9IG9wdGlvbnMucGFyc2VyO1xyXG5cdHZhciBmb3JtYXQgPSBvcHRpb25zLnBhcnNlciB8fCBvcHRpb25zLmZvcm1hdDtcclxuXHJcblx0aWYgKHR5cGVvZiBwYXJzZXIgPT09ICdmdW5jdGlvbicpIHtcclxuXHRcdHJldHVybiBwYXJzZXIodmFsdWUpO1xyXG5cdH1cclxuXHJcblx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIGZvcm1hdCA9PT0gJ3N0cmluZycpIHtcclxuXHRcdHJldHVybiBtb21lbnQodmFsdWUsIGZvcm1hdCk7XHJcblx0fVxyXG5cclxuXHRpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIG1vbWVudCkpIHtcclxuXHRcdHZhbHVlID0gbW9tZW50KHZhbHVlKTtcclxuXHR9XHJcblxyXG5cdGlmICh2YWx1ZS5pc1ZhbGlkKCkpIHtcclxuXHRcdHJldHVybiB2YWx1ZTtcclxuXHR9XHJcblxyXG5cdC8vIExhYmVscyBhcmUgaW4gYW4gaW5jb21wYXRpYmxlIG1vbWVudCBmb3JtYXQgYW5kIG5vIGBwYXJzZXJgIGhhcyBiZWVuIHByb3ZpZGVkLlxyXG5cdC8vIFRoZSB1c2VyIG1pZ2h0IHN0aWxsIHVzZSB0aGUgZGVwcmVjYXRlZCBgZm9ybWF0YCBvcHRpb24gdG8gY29udmVydCBoaXMgaW5wdXRzLlxyXG5cdGlmICh0eXBlb2YgZm9ybWF0ID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRyZXR1cm4gZm9ybWF0KHZhbHVlKTtcclxuXHR9XHJcblxyXG5cdHJldHVybiB2YWx1ZTtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2UoaW5wdXQsIHNjYWxlKSB7XHJcblx0aWYgKGhlbHBlcnMuaXNOdWxsT3JVbmRlZihpbnB1dCkpIHtcclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHJcblx0dmFyIG9wdGlvbnMgPSBzY2FsZS5vcHRpb25zLnRpbWU7XHJcblx0dmFyIHZhbHVlID0gbW9tZW50aWZ5KHNjYWxlLmdldFJpZ2h0VmFsdWUoaW5wdXQpLCBvcHRpb25zKTtcclxuXHRpZiAoIXZhbHVlLmlzVmFsaWQoKSkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cclxuXHRpZiAob3B0aW9ucy5yb3VuZCkge1xyXG5cdFx0dmFsdWUuc3RhcnRPZihvcHRpb25zLnJvdW5kKTtcclxuXHR9XHJcblxyXG5cdHJldHVybiB2YWx1ZS52YWx1ZU9mKCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdW5pdCB0byBza2lwIHRvIGJlIGFibGUgdG8gZGlzcGxheSB1cCB0byBgY2FwYWNpdHlgIG51bWJlciBvZiB0aWNrc1xyXG4gKiBpbiBgdW5pdGAgZm9yIHRoZSBnaXZlbiBgbWluYCAvIGBtYXhgIHJhbmdlIGFuZCByZXNwZWN0aW5nIHRoZSBpbnRlcnZhbCBzdGVwcyBjb25zdHJhaW50cy5cclxuICovXHJcbmZ1bmN0aW9uIGRldGVybWluZVN0ZXBTaXplKG1pbiwgbWF4LCB1bml0LCBjYXBhY2l0eSkge1xyXG5cdHZhciByYW5nZSA9IG1heCAtIG1pbjtcclxuXHR2YXIgaW50ZXJ2YWwgPSBJTlRFUlZBTFNbdW5pdF07XHJcblx0dmFyIG1pbGxpc2Vjb25kcyA9IGludGVydmFsLnNpemU7XHJcblx0dmFyIHN0ZXBzID0gaW50ZXJ2YWwuc3RlcHM7XHJcblx0dmFyIGksIGlsZW4sIGZhY3RvcjtcclxuXHJcblx0aWYgKCFzdGVwcykge1xyXG5cdFx0cmV0dXJuIE1hdGguY2VpbChyYW5nZSAvIChjYXBhY2l0eSAqIG1pbGxpc2Vjb25kcykpO1xyXG5cdH1cclxuXHJcblx0Zm9yIChpID0gMCwgaWxlbiA9IHN0ZXBzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xyXG5cdFx0ZmFjdG9yID0gc3RlcHNbaV07XHJcblx0XHRpZiAoTWF0aC5jZWlsKHJhbmdlIC8gKG1pbGxpc2Vjb25kcyAqIGZhY3RvcikpIDw9IGNhcGFjaXR5KSB7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIGZhY3RvcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEZpZ3VyZXMgb3V0IHdoYXQgdW5pdCByZXN1bHRzIGluIGFuIGFwcHJvcHJpYXRlIG51bWJlciBvZiBhdXRvLWdlbmVyYXRlZCB0aWNrc1xyXG4gKi9cclxuZnVuY3Rpb24gZGV0ZXJtaW5lVW5pdEZvckF1dG9UaWNrcyhtaW5Vbml0LCBtaW4sIG1heCwgY2FwYWNpdHkpIHtcclxuXHR2YXIgaWxlbiA9IFVOSVRTLmxlbmd0aDtcclxuXHR2YXIgaSwgaW50ZXJ2YWwsIGZhY3RvcjtcclxuXHJcblx0Zm9yIChpID0gVU5JVFMuaW5kZXhPZihtaW5Vbml0KTsgaSA8IGlsZW4gLSAxOyArK2kpIHtcclxuXHRcdGludGVydmFsID0gSU5URVJWQUxTW1VOSVRTW2ldXTtcclxuXHRcdGZhY3RvciA9IGludGVydmFsLnN0ZXBzID8gaW50ZXJ2YWwuc3RlcHNbaW50ZXJ2YWwuc3RlcHMubGVuZ3RoIC0gMV0gOiBNQVhfSU5URUdFUjtcclxuXHJcblx0XHRpZiAoaW50ZXJ2YWwuY29tbW9uICYmIE1hdGguY2VpbCgobWF4IC0gbWluKSAvIChmYWN0b3IgKiBpbnRlcnZhbC5zaXplKSkgPD0gY2FwYWNpdHkpIHtcclxuXHRcdFx0cmV0dXJuIFVOSVRTW2ldO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIFVOSVRTW2lsZW4gLSAxXTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEZpZ3VyZXMgb3V0IHdoYXQgdW5pdCB0byBmb3JtYXQgYSBzZXQgb2YgdGlja3Mgd2l0aFxyXG4gKi9cclxuZnVuY3Rpb24gZGV0ZXJtaW5lVW5pdEZvckZvcm1hdHRpbmcodGlja3MsIG1pblVuaXQsIG1pbiwgbWF4KSB7XHJcblx0dmFyIGR1cmF0aW9uID0gbW9tZW50LmR1cmF0aW9uKG1vbWVudChtYXgpLmRpZmYobW9tZW50KG1pbikpKTtcclxuXHR2YXIgaWxlbiA9IFVOSVRTLmxlbmd0aDtcclxuXHR2YXIgaSwgdW5pdDtcclxuXHJcblx0Zm9yIChpID0gaWxlbiAtIDE7IGkgPj0gVU5JVFMuaW5kZXhPZihtaW5Vbml0KTsgaS0tKSB7XHJcblx0XHR1bml0ID0gVU5JVFNbaV07XHJcblx0XHRpZiAoSU5URVJWQUxTW3VuaXRdLmNvbW1vbiAmJiBkdXJhdGlvbi5hcyh1bml0KSA+PSB0aWNrcy5sZW5ndGgpIHtcclxuXHRcdFx0cmV0dXJuIHVuaXQ7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gVU5JVFNbbWluVW5pdCA/IFVOSVRTLmluZGV4T2YobWluVW5pdCkgOiAwXTtcclxufVxyXG5cclxuZnVuY3Rpb24gZGV0ZXJtaW5lTWFqb3JVbml0KHVuaXQpIHtcclxuXHRmb3IgKHZhciBpID0gVU5JVFMuaW5kZXhPZih1bml0KSArIDEsIGlsZW4gPSBVTklUUy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcclxuXHRcdGlmIChJTlRFUlZBTFNbVU5JVFNbaV1dLmNvbW1vbikge1xyXG5cdFx0XHRyZXR1cm4gVU5JVFNbaV07XHJcblx0XHR9XHJcblx0fVxyXG59XHJcblxyXG4vKipcclxuICogR2VuZXJhdGVzIGEgbWF4aW11bSBvZiBgY2FwYWNpdHlgIHRpbWVzdGFtcHMgYmV0d2VlbiBtaW4gYW5kIG1heCwgcm91bmRlZCB0byB0aGVcclxuICogYG1pbm9yYCB1bml0LCBhbGlnbmVkIG9uIHRoZSBgbWFqb3JgIHVuaXQgYW5kIHVzaW5nIHRoZSBnaXZlbiBzY2FsZSB0aW1lIGBvcHRpb25zYC5cclxuICogSW1wb3J0YW50OiB0aGlzIG1ldGhvZCBjYW4gcmV0dXJuIHRpY2tzIG91dHNpZGUgdGhlIG1pbiBhbmQgbWF4IHJhbmdlLCBpdCdzIHRoZVxyXG4gKiByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGluZyBjb2RlIHRvIGNsYW1wIHZhbHVlcyBpZiBuZWVkZWQuXHJcbiAqL1xyXG5mdW5jdGlvbiBnZW5lcmF0ZShtaW4sIG1heCwgY2FwYWNpdHksIG9wdGlvbnMpIHtcclxuXHR2YXIgdGltZU9wdHMgPSBvcHRpb25zLnRpbWU7XHJcblx0dmFyIG1pbm9yID0gdGltZU9wdHMudW5pdCB8fCBkZXRlcm1pbmVVbml0Rm9yQXV0b1RpY2tzKHRpbWVPcHRzLm1pblVuaXQsIG1pbiwgbWF4LCBjYXBhY2l0eSk7XHJcblx0dmFyIG1ham9yID0gZGV0ZXJtaW5lTWFqb3JVbml0KG1pbm9yKTtcclxuXHR2YXIgc3RlcFNpemUgPSBoZWxwZXJzLnZhbHVlT3JEZWZhdWx0KHRpbWVPcHRzLnN0ZXBTaXplLCB0aW1lT3B0cy51bml0U3RlcFNpemUpO1xyXG5cdHZhciB3ZWVrZGF5ID0gbWlub3IgPT09ICd3ZWVrJyA/IHRpbWVPcHRzLmlzb1dlZWtkYXkgOiBmYWxzZTtcclxuXHR2YXIgbWFqb3JUaWNrc0VuYWJsZWQgPSBvcHRpb25zLnRpY2tzLm1ham9yLmVuYWJsZWQ7XHJcblx0dmFyIGludGVydmFsID0gSU5URVJWQUxTW21pbm9yXTtcclxuXHR2YXIgZmlyc3QgPSBtb21lbnQobWluKTtcclxuXHR2YXIgbGFzdCA9IG1vbWVudChtYXgpO1xyXG5cdHZhciB0aWNrcyA9IFtdO1xyXG5cdHZhciB0aW1lO1xyXG5cclxuXHRpZiAoIXN0ZXBTaXplKSB7XHJcblx0XHRzdGVwU2l6ZSA9IGRldGVybWluZVN0ZXBTaXplKG1pbiwgbWF4LCBtaW5vciwgY2FwYWNpdHkpO1xyXG5cdH1cclxuXHJcblx0Ly8gRm9yICd3ZWVrJyB1bml0LCBoYW5kbGUgdGhlIGZpcnN0IGRheSBvZiB3ZWVrIG9wdGlvblxyXG5cdGlmICh3ZWVrZGF5KSB7XHJcblx0XHRmaXJzdCA9IGZpcnN0Lmlzb1dlZWtkYXkod2Vla2RheSk7XHJcblx0XHRsYXN0ID0gbGFzdC5pc29XZWVrZGF5KHdlZWtkYXkpO1xyXG5cdH1cclxuXHJcblx0Ly8gQWxpZ24gZmlyc3QvbGFzdCB0aWNrcyBvbiB1bml0XHJcblx0Zmlyc3QgPSBmaXJzdC5zdGFydE9mKHdlZWtkYXkgPyAnZGF5JyA6IG1pbm9yKTtcclxuXHRsYXN0ID0gbGFzdC5zdGFydE9mKHdlZWtkYXkgPyAnZGF5JyA6IG1pbm9yKTtcclxuXHJcblx0Ly8gTWFrZSBzdXJlIHRoYXQgdGhlIGxhc3QgdGljayBpbmNsdWRlIG1heFxyXG5cdGlmIChsYXN0IDwgbWF4KSB7XHJcblx0XHRsYXN0LmFkZCgxLCBtaW5vcik7XHJcblx0fVxyXG5cclxuXHR0aW1lID0gbW9tZW50KGZpcnN0KTtcclxuXHJcblx0aWYgKG1ham9yVGlja3NFbmFibGVkICYmIG1ham9yICYmICF3ZWVrZGF5ICYmICF0aW1lT3B0cy5yb3VuZCkge1xyXG5cdFx0Ly8gQWxpZ24gdGhlIGZpcnN0IHRpY2sgb24gdGhlIHByZXZpb3VzIGBtaW5vcmAgdW5pdCBhbGlnbmVkIG9uIHRoZSBgbWFqb3JgIHVuaXQ6XHJcblx0XHQvLyB3ZSBmaXJzdCBhbGlnbmVkIHRpbWUgb24gdGhlIHByZXZpb3VzIGBtYWpvcmAgdW5pdCB0aGVuIGFkZCB0aGUgbnVtYmVyIG9mIGZ1bGxcclxuXHRcdC8vIHN0ZXBTaXplIHRoZXJlIGlzIGJldHdlZW4gZmlyc3QgYW5kIHRoZSBwcmV2aW91cyBtYWpvciB0aW1lLlxyXG5cdFx0dGltZS5zdGFydE9mKG1ham9yKTtcclxuXHRcdHRpbWUuYWRkKH5+KChmaXJzdCAtIHRpbWUpIC8gKGludGVydmFsLnNpemUgKiBzdGVwU2l6ZSkpICogc3RlcFNpemUsIG1pbm9yKTtcclxuXHR9XHJcblxyXG5cdGZvciAoOyB0aW1lIDwgbGFzdDsgdGltZS5hZGQoc3RlcFNpemUsIG1pbm9yKSkge1xyXG5cdFx0dGlja3MucHVzaCgrdGltZSk7XHJcblx0fVxyXG5cclxuXHR0aWNrcy5wdXNoKCt0aW1lKTtcclxuXHJcblx0cmV0dXJuIHRpY2tzO1xyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyB0aGUgcmlnaHQgYW5kIGxlZnQgb2Zmc2V0cyBmcm9tIGVkZ2VzIGluIHRoZSBmb3JtIG9mIHtsZWZ0LCByaWdodH0uXHJcbiAqIE9mZnNldHMgYXJlIGFkZGVkIHdoZW4gdGhlIGBvZmZzZXRgIG9wdGlvbiBpcyB0cnVlLlxyXG4gKi9cclxuZnVuY3Rpb24gY29tcHV0ZU9mZnNldHModGFibGUsIHRpY2tzLCBtaW4sIG1heCwgb3B0aW9ucykge1xyXG5cdHZhciBsZWZ0ID0gMDtcclxuXHR2YXIgcmlnaHQgPSAwO1xyXG5cdHZhciB1cHBlciwgbG93ZXI7XHJcblxyXG5cdGlmIChvcHRpb25zLm9mZnNldCAmJiB0aWNrcy5sZW5ndGgpIHtcclxuXHRcdGlmICghb3B0aW9ucy50aW1lLm1pbikge1xyXG5cdFx0XHR1cHBlciA9IHRpY2tzLmxlbmd0aCA+IDEgPyB0aWNrc1sxXSA6IG1heDtcclxuXHRcdFx0bG93ZXIgPSB0aWNrc1swXTtcclxuXHRcdFx0bGVmdCA9IChcclxuXHRcdFx0XHRpbnRlcnBvbGF0ZSh0YWJsZSwgJ3RpbWUnLCB1cHBlciwgJ3BvcycpIC1cclxuXHRcdFx0XHRpbnRlcnBvbGF0ZSh0YWJsZSwgJ3RpbWUnLCBsb3dlciwgJ3BvcycpXHJcblx0XHRcdCkgLyAyO1xyXG5cdFx0fVxyXG5cdFx0aWYgKCFvcHRpb25zLnRpbWUubWF4KSB7XHJcblx0XHRcdHVwcGVyID0gdGlja3NbdGlja3MubGVuZ3RoIC0gMV07XHJcblx0XHRcdGxvd2VyID0gdGlja3MubGVuZ3RoID4gMSA/IHRpY2tzW3RpY2tzLmxlbmd0aCAtIDJdIDogbWluO1xyXG5cdFx0XHRyaWdodCA9IChcclxuXHRcdFx0XHRpbnRlcnBvbGF0ZSh0YWJsZSwgJ3RpbWUnLCB1cHBlciwgJ3BvcycpIC1cclxuXHRcdFx0XHRpbnRlcnBvbGF0ZSh0YWJsZSwgJ3RpbWUnLCBsb3dlciwgJ3BvcycpXHJcblx0XHRcdCkgLyAyO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cmV0dXJuIHtsZWZ0OiBsZWZ0LCByaWdodDogcmlnaHR9O1xyXG59XHJcblxyXG5mdW5jdGlvbiB0aWNrc0Zyb21UaW1lc3RhbXBzKHZhbHVlcywgbWFqb3JVbml0KSB7XHJcblx0dmFyIHRpY2tzID0gW107XHJcblx0dmFyIGksIGlsZW4sIHZhbHVlLCBtYWpvcjtcclxuXHJcblx0Zm9yIChpID0gMCwgaWxlbiA9IHZhbHVlcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcclxuXHRcdHZhbHVlID0gdmFsdWVzW2ldO1xyXG5cdFx0bWFqb3IgPSBtYWpvclVuaXQgPyB2YWx1ZSA9PT0gK21vbWVudCh2YWx1ZSkuc3RhcnRPZihtYWpvclVuaXQpIDogZmFsc2U7XHJcblxyXG5cdFx0dGlja3MucHVzaCh7XHJcblx0XHRcdHZhbHVlOiB2YWx1ZSxcclxuXHRcdFx0bWFqb3I6IG1ham9yXHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdHJldHVybiB0aWNrcztcclxufVxyXG5cclxuZnVuY3Rpb24gZGV0ZXJtaW5lTGFiZWxGb3JtYXQoZGF0YSwgdGltZU9wdHMpIHtcclxuXHR2YXIgaSwgbW9tZW50RGF0ZSwgaGFzVGltZTtcclxuXHR2YXIgaWxlbiA9IGRhdGEubGVuZ3RoO1xyXG5cclxuXHQvLyBmaW5kIHRoZSBsYWJlbCB3aXRoIHRoZSBtb3N0IHBhcnRzIChtaWxsaXNlY29uZHMsIG1pbnV0ZXMsIGV0Yy4pXHJcblx0Ly8gZm9ybWF0IGFsbCBsYWJlbHMgd2l0aCB0aGUgc2FtZSBsZXZlbCBvZiBkZXRhaWwgYXMgdGhlIG1vc3Qgc3BlY2lmaWMgbGFiZWxcclxuXHRmb3IgKGkgPSAwOyBpIDwgaWxlbjsgaSsrKSB7XHJcblx0XHRtb21lbnREYXRlID0gbW9tZW50aWZ5KGRhdGFbaV0sIHRpbWVPcHRzKTtcclxuXHRcdGlmIChtb21lbnREYXRlLm1pbGxpc2Vjb25kKCkgIT09IDApIHtcclxuXHRcdFx0cmV0dXJuICdNTU0gRCwgWVlZWSBoOm1tOnNzLlNTUyBhJztcclxuXHRcdH1cclxuXHRcdGlmIChtb21lbnREYXRlLnNlY29uZCgpICE9PSAwIHx8IG1vbWVudERhdGUubWludXRlKCkgIT09IDAgfHwgbW9tZW50RGF0ZS5ob3VyKCkgIT09IDApIHtcclxuXHRcdFx0aGFzVGltZSA9IHRydWU7XHJcblx0XHR9XHJcblx0fVxyXG5cdGlmIChoYXNUaW1lKSB7XHJcblx0XHRyZXR1cm4gJ01NTSBELCBZWVlZIGg6bW06c3MgYSc7XHJcblx0fVxyXG5cdHJldHVybiAnTU1NIEQsIFlZWVknO1xyXG59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xyXG5cclxuXHR2YXIgZGVmYXVsdENvbmZpZyA9IHtcclxuXHRcdHBvc2l0aW9uOiAnYm90dG9tJyxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIERhdGEgZGlzdHJpYnV0aW9uIGFsb25nIHRoZSBzY2FsZTpcclxuXHRcdCAqIC0gJ2xpbmVhcic6IGRhdGEgYXJlIHNwcmVhZCBhY2NvcmRpbmcgdG8gdGhlaXIgdGltZSAoZGlzdGFuY2VzIGNhbiB2YXJ5KSxcclxuXHRcdCAqIC0gJ3Nlcmllcyc6IGRhdGEgYXJlIHNwcmVhZCBhdCB0aGUgc2FtZSBkaXN0YW5jZSBmcm9tIGVhY2ggb3RoZXIuXHJcblx0XHQgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGFydGpzL0NoYXJ0LmpzL3B1bGwvNDUwN1xyXG5cdFx0ICogQHNpbmNlIDIuNy4wXHJcblx0XHQgKi9cclxuXHRcdGRpc3RyaWJ1dGlvbjogJ2xpbmVhcicsXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBTY2FsZSBib3VuZGFyeSBzdHJhdGVneSAoYnlwYXNzZWQgYnkgbWluL21heCB0aW1lIG9wdGlvbnMpXHJcblx0XHQgKiAtIGBkYXRhYDogbWFrZSBzdXJlIGRhdGEgYXJlIGZ1bGx5IHZpc2libGUsIHRpY2tzIG91dHNpZGUgYXJlIHJlbW92ZWRcclxuXHRcdCAqIC0gYHRpY2tzYDogbWFrZSBzdXJlIHRpY2tzIGFyZSBmdWxseSB2aXNpYmxlLCBkYXRhIG91dHNpZGUgYXJlIHRydW5jYXRlZFxyXG5cdFx0ICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9wdWxsLzQ1NTZcclxuXHRcdCAqIEBzaW5jZSAyLjcuMFxyXG5cdFx0ICovXHJcblx0XHRib3VuZHM6ICdkYXRhJyxcclxuXHJcblx0XHR0aW1lOiB7XHJcblx0XHRcdHBhcnNlcjogZmFsc2UsIC8vIGZhbHNlID09IGEgcGF0dGVybiBzdHJpbmcgZnJvbSBodHRwOi8vbW9tZW50anMuY29tL2RvY3MvIy9wYXJzaW5nL3N0cmluZy1mb3JtYXQvIG9yIGEgY3VzdG9tIGNhbGxiYWNrIHRoYXQgY29udmVydHMgaXRzIGFyZ3VtZW50IHRvIGEgbW9tZW50XHJcblx0XHRcdGZvcm1hdDogZmFsc2UsIC8vIERFUFJFQ0FURUQgZmFsc2UgPT0gZGF0ZSBvYmplY3RzLCBtb21lbnQgb2JqZWN0LCBjYWxsYmFjayBvciBhIHBhdHRlcm4gc3RyaW5nIGZyb20gaHR0cDovL21vbWVudGpzLmNvbS9kb2NzLyMvcGFyc2luZy9zdHJpbmctZm9ybWF0L1xyXG5cdFx0XHR1bml0OiBmYWxzZSwgLy8gZmFsc2UgPT0gYXV0b21hdGljIG9yIG92ZXJyaWRlIHdpdGggd2VlaywgbW9udGgsIHllYXIsIGV0Yy5cclxuXHRcdFx0cm91bmQ6IGZhbHNlLCAvLyBub25lLCBvciBvdmVycmlkZSB3aXRoIHdlZWssIG1vbnRoLCB5ZWFyLCBldGMuXHJcblx0XHRcdGRpc3BsYXlGb3JtYXQ6IGZhbHNlLCAvLyBERVBSRUNBVEVEXHJcblx0XHRcdGlzb1dlZWtkYXk6IGZhbHNlLCAvLyBvdmVycmlkZSB3ZWVrIHN0YXJ0IGRheSAtIHNlZSBodHRwOi8vbW9tZW50anMuY29tL2RvY3MvIy9nZXQtc2V0L2lzby13ZWVrZGF5L1xyXG5cdFx0XHRtaW5Vbml0OiAnbWlsbGlzZWNvbmQnLFxyXG5cclxuXHRcdFx0Ly8gZGVmYXVsdHMgdG8gdW5pdCdzIGNvcnJlc3BvbmRpbmcgdW5pdEZvcm1hdCBiZWxvdyBvciBvdmVycmlkZSB1c2luZyBwYXR0ZXJuIHN0cmluZyBmcm9tIGh0dHA6Ly9tb21lbnRqcy5jb20vZG9jcy8jL2Rpc3BsYXlpbmcvZm9ybWF0L1xyXG5cdFx0XHRkaXNwbGF5Rm9ybWF0czoge1xyXG5cdFx0XHRcdG1pbGxpc2Vjb25kOiAnaDptbTpzcy5TU1MgYScsIC8vIDExOjIwOjAxLjEyMyBBTSxcclxuXHRcdFx0XHRzZWNvbmQ6ICdoOm1tOnNzIGEnLCAvLyAxMToyMDowMSBBTVxyXG5cdFx0XHRcdG1pbnV0ZTogJ2g6bW0gYScsIC8vIDExOjIwIEFNXHJcblx0XHRcdFx0aG91cjogJ2hBJywgLy8gNVBNXHJcblx0XHRcdFx0ZGF5OiAnTU1NIEQnLCAvLyBTZXAgNFxyXG5cdFx0XHRcdHdlZWs6ICdsbCcsIC8vIFdlZWsgNDYsIG9yIG1heWJlIFwiW1ddV1cgLSBZWVlZXCIgP1xyXG5cdFx0XHRcdG1vbnRoOiAnTU1NIFlZWVknLCAvLyBTZXB0IDIwMTVcclxuXHRcdFx0XHRxdWFydGVyOiAnW1FdUSAtIFlZWVknLCAvLyBRM1xyXG5cdFx0XHRcdHllYXI6ICdZWVlZJyAvLyAyMDE1XHJcblx0XHRcdH0sXHJcblx0XHR9LFxyXG5cdFx0dGlja3M6IHtcclxuXHRcdFx0YXV0b1NraXA6IGZhbHNlLFxyXG5cclxuXHRcdFx0LyoqXHJcblx0XHRcdCAqIFRpY2tzIGdlbmVyYXRpb24gaW5wdXQgdmFsdWVzOlxyXG5cdFx0XHQgKiAtICdhdXRvJzogZ2VuZXJhdGVzIFwib3B0aW1hbFwiIHRpY2tzIGJhc2VkIG9uIHNjYWxlIHNpemUgYW5kIHRpbWUgb3B0aW9ucy5cclxuXHRcdFx0ICogLSAnZGF0YSc6IGdlbmVyYXRlcyB0aWNrcyBmcm9tIGRhdGEgKGluY2x1ZGluZyBsYWJlbHMgZnJvbSBkYXRhIHt0fHh8eX0gb2JqZWN0cykuXHJcblx0XHRcdCAqIC0gJ2xhYmVscyc6IGdlbmVyYXRlcyB0aWNrcyBmcm9tIHVzZXIgZ2l2ZW4gYGRhdGEubGFiZWxzYCB2YWx1ZXMgT05MWS5cclxuXHRcdFx0ICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vY2hhcnRqcy9DaGFydC5qcy9wdWxsLzQ1MDdcclxuXHRcdFx0ICogQHNpbmNlIDIuNy4wXHJcblx0XHRcdCAqL1xyXG5cdFx0XHRzb3VyY2U6ICdhdXRvJyxcclxuXHJcblx0XHRcdG1ham9yOiB7XHJcblx0XHRcdFx0ZW5hYmxlZDogZmFsc2VcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdHZhciBUaW1lU2NhbGUgPSBTY2FsZS5leHRlbmQoe1xyXG5cdFx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XHJcblx0XHRcdGlmICghbW9tZW50KSB7XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDaGFydC5qcyAtIE1vbWVudC5qcyBjb3VsZCBub3QgYmUgZm91bmQhIFlvdSBtdXN0IGluY2x1ZGUgaXQgYmVmb3JlIENoYXJ0LmpzIHRvIHVzZSB0aGUgdGltZSBzY2FsZS4gRG93bmxvYWQgYXQgaHR0cHM6Ly9tb21lbnRqcy5jb20nKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dGhpcy5tZXJnZVRpY2tzT3B0aW9ucygpO1xyXG5cclxuXHRcdFx0U2NhbGUucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0dXBkYXRlOiBmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIG9wdGlvbnMgPSBtZS5vcHRpb25zO1xyXG5cclxuXHRcdFx0Ly8gREVQUkVDQVRJT05TOiBvdXRwdXQgYSBtZXNzYWdlIG9ubHkgb25lIHRpbWUgcGVyIHVwZGF0ZVxyXG5cdFx0XHRpZiAob3B0aW9ucy50aW1lICYmIG9wdGlvbnMudGltZS5mb3JtYXQpIHtcclxuXHRcdFx0XHRjb25zb2xlLndhcm4oJ29wdGlvbnMudGltZS5mb3JtYXQgaXMgZGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgYnkgb3B0aW9ucy50aW1lLnBhcnNlci4nKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIFNjYWxlLnByb3RvdHlwZS51cGRhdGUuYXBwbHkobWUsIGFyZ3VtZW50cyk7XHJcblx0XHR9LFxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQWxsb3dzIGRhdGEgdG8gYmUgcmVmZXJlbmNlZCB2aWEgJ3QnIGF0dHJpYnV0ZVxyXG5cdFx0ICovXHJcblx0XHRnZXRSaWdodFZhbHVlOiBmdW5jdGlvbihyYXdWYWx1ZSkge1xyXG5cdFx0XHRpZiAocmF3VmFsdWUgJiYgcmF3VmFsdWUudCAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0cmF3VmFsdWUgPSByYXdWYWx1ZS50O1xyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiBTY2FsZS5wcm90b3R5cGUuZ2V0UmlnaHRWYWx1ZS5jYWxsKHRoaXMsIHJhd1ZhbHVlKTtcclxuXHRcdH0sXHJcblxyXG5cdFx0ZGV0ZXJtaW5lRGF0YUxpbWl0czogZnVuY3Rpb24oKSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciBjaGFydCA9IG1lLmNoYXJ0O1xyXG5cdFx0XHR2YXIgdGltZU9wdHMgPSBtZS5vcHRpb25zLnRpbWU7XHJcblx0XHRcdHZhciB1bml0ID0gdGltZU9wdHMudW5pdCB8fCAnZGF5JztcclxuXHRcdFx0dmFyIG1pbiA9IE1BWF9JTlRFR0VSO1xyXG5cdFx0XHR2YXIgbWF4ID0gTUlOX0lOVEVHRVI7XHJcblx0XHRcdHZhciB0aW1lc3RhbXBzID0gW107XHJcblx0XHRcdHZhciBkYXRhc2V0cyA9IFtdO1xyXG5cdFx0XHR2YXIgbGFiZWxzID0gW107XHJcblx0XHRcdHZhciBpLCBqLCBpbGVuLCBqbGVuLCBkYXRhLCB0aW1lc3RhbXA7XHJcblxyXG5cdFx0XHQvLyBDb252ZXJ0IGxhYmVscyB0byB0aW1lc3RhbXBzXHJcblx0XHRcdGZvciAoaSA9IDAsIGlsZW4gPSBjaGFydC5kYXRhLmxhYmVscy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcclxuXHRcdFx0XHRsYWJlbHMucHVzaChwYXJzZShjaGFydC5kYXRhLmxhYmVsc1tpXSwgbWUpKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gQ29udmVydCBkYXRhIHRvIHRpbWVzdGFtcHNcclxuXHRcdFx0Zm9yIChpID0gMCwgaWxlbiA9IChjaGFydC5kYXRhLmRhdGFzZXRzIHx8IFtdKS5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcclxuXHRcdFx0XHRpZiAoY2hhcnQuaXNEYXRhc2V0VmlzaWJsZShpKSkge1xyXG5cdFx0XHRcdFx0ZGF0YSA9IGNoYXJ0LmRhdGEuZGF0YXNldHNbaV0uZGF0YTtcclxuXHJcblx0XHRcdFx0XHQvLyBMZXQncyBjb25zaWRlciB0aGF0IGFsbCBkYXRhIGhhdmUgdGhlIHNhbWUgZm9ybWF0LlxyXG5cdFx0XHRcdFx0aWYgKGhlbHBlcnMuaXNPYmplY3QoZGF0YVswXSkpIHtcclxuXHRcdFx0XHRcdFx0ZGF0YXNldHNbaV0gPSBbXTtcclxuXHJcblx0XHRcdFx0XHRcdGZvciAoaiA9IDAsIGpsZW4gPSBkYXRhLmxlbmd0aDsgaiA8IGpsZW47ICsraikge1xyXG5cdFx0XHRcdFx0XHRcdHRpbWVzdGFtcCA9IHBhcnNlKGRhdGFbal0sIG1lKTtcclxuXHRcdFx0XHRcdFx0XHR0aW1lc3RhbXBzLnB1c2godGltZXN0YW1wKTtcclxuXHRcdFx0XHRcdFx0XHRkYXRhc2V0c1tpXVtqXSA9IHRpbWVzdGFtcDtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0dGltZXN0YW1wcy5wdXNoLmFwcGx5KHRpbWVzdGFtcHMsIGxhYmVscyk7XHJcblx0XHRcdFx0XHRcdGRhdGFzZXRzW2ldID0gbGFiZWxzLnNsaWNlKDApO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRkYXRhc2V0c1tpXSA9IFtdO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKGxhYmVscy5sZW5ndGgpIHtcclxuXHRcdFx0XHQvLyBTb3J0IGxhYmVscyAqKmFmdGVyKiogZGF0YSBoYXZlIGJlZW4gY29udmVydGVkXHJcblx0XHRcdFx0bGFiZWxzID0gYXJyYXlVbmlxdWUobGFiZWxzKS5zb3J0KHNvcnRlcik7XHJcblx0XHRcdFx0bWluID0gTWF0aC5taW4obWluLCBsYWJlbHNbMF0pO1xyXG5cdFx0XHRcdG1heCA9IE1hdGgubWF4KG1heCwgbGFiZWxzW2xhYmVscy5sZW5ndGggLSAxXSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICh0aW1lc3RhbXBzLmxlbmd0aCkge1xyXG5cdFx0XHRcdHRpbWVzdGFtcHMgPSBhcnJheVVuaXF1ZSh0aW1lc3RhbXBzKS5zb3J0KHNvcnRlcik7XHJcblx0XHRcdFx0bWluID0gTWF0aC5taW4obWluLCB0aW1lc3RhbXBzWzBdKTtcclxuXHRcdFx0XHRtYXggPSBNYXRoLm1heChtYXgsIHRpbWVzdGFtcHNbdGltZXN0YW1wcy5sZW5ndGggLSAxXSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG1pbiA9IHBhcnNlKHRpbWVPcHRzLm1pbiwgbWUpIHx8IG1pbjtcclxuXHRcdFx0bWF4ID0gcGFyc2UodGltZU9wdHMubWF4LCBtZSkgfHwgbWF4O1xyXG5cclxuXHRcdFx0Ly8gSW4gY2FzZSB0aGVyZSBpcyBubyB2YWxpZCBtaW4vbWF4LCBzZXQgbGltaXRzIGJhc2VkIG9uIHVuaXQgdGltZSBvcHRpb25cclxuXHRcdFx0bWluID0gbWluID09PSBNQVhfSU5URUdFUiA/ICttb21lbnQoKS5zdGFydE9mKHVuaXQpIDogbWluO1xyXG5cdFx0XHRtYXggPSBtYXggPT09IE1JTl9JTlRFR0VSID8gK21vbWVudCgpLmVuZE9mKHVuaXQpICsgMSA6IG1heDtcclxuXHJcblx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IG1heCBpcyBzdHJpY3RseSBoaWdoZXIgdGhhbiBtaW4gKHJlcXVpcmVkIGJ5IHRoZSBsb29rdXAgdGFibGUpXHJcblx0XHRcdG1lLm1pbiA9IE1hdGgubWluKG1pbiwgbWF4KTtcclxuXHRcdFx0bWUubWF4ID0gTWF0aC5tYXgobWluICsgMSwgbWF4KTtcclxuXHJcblx0XHRcdC8vIFBSSVZBVEVcclxuXHRcdFx0bWUuX2hvcml6b250YWwgPSBtZS5pc0hvcml6b250YWwoKTtcclxuXHRcdFx0bWUuX3RhYmxlID0gW107XHJcblx0XHRcdG1lLl90aW1lc3RhbXBzID0ge1xyXG5cdFx0XHRcdGRhdGE6IHRpbWVzdGFtcHMsXHJcblx0XHRcdFx0ZGF0YXNldHM6IGRhdGFzZXRzLFxyXG5cdFx0XHRcdGxhYmVsczogbGFiZWxzXHJcblx0XHRcdH07XHJcblx0XHR9LFxyXG5cclxuXHRcdGJ1aWxkVGlja3M6IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgbWluID0gbWUubWluO1xyXG5cdFx0XHR2YXIgbWF4ID0gbWUubWF4O1xyXG5cdFx0XHR2YXIgb3B0aW9ucyA9IG1lLm9wdGlvbnM7XHJcblx0XHRcdHZhciB0aW1lT3B0cyA9IG9wdGlvbnMudGltZTtcclxuXHRcdFx0dmFyIHRpbWVzdGFtcHMgPSBbXTtcclxuXHRcdFx0dmFyIHRpY2tzID0gW107XHJcblx0XHRcdHZhciBpLCBpbGVuLCB0aW1lc3RhbXA7XHJcblxyXG5cdFx0XHRzd2l0Y2ggKG9wdGlvbnMudGlja3Muc291cmNlKSB7XHJcblx0XHRcdGNhc2UgJ2RhdGEnOlxyXG5cdFx0XHRcdHRpbWVzdGFtcHMgPSBtZS5fdGltZXN0YW1wcy5kYXRhO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlICdsYWJlbHMnOlxyXG5cdFx0XHRcdHRpbWVzdGFtcHMgPSBtZS5fdGltZXN0YW1wcy5sYWJlbHM7XHJcblx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdGNhc2UgJ2F1dG8nOlxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdHRpbWVzdGFtcHMgPSBnZW5lcmF0ZShtaW4sIG1heCwgbWUuZ2V0TGFiZWxDYXBhY2l0eShtaW4pLCBvcHRpb25zKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKG9wdGlvbnMuYm91bmRzID09PSAndGlja3MnICYmIHRpbWVzdGFtcHMubGVuZ3RoKSB7XHJcblx0XHRcdFx0bWluID0gdGltZXN0YW1wc1swXTtcclxuXHRcdFx0XHRtYXggPSB0aW1lc3RhbXBzW3RpbWVzdGFtcHMubGVuZ3RoIC0gMV07XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8vIEVuZm9yY2UgbGltaXRzIHdpdGggdXNlciBtaW4vbWF4IG9wdGlvbnNcclxuXHRcdFx0bWluID0gcGFyc2UodGltZU9wdHMubWluLCBtZSkgfHwgbWluO1xyXG5cdFx0XHRtYXggPSBwYXJzZSh0aW1lT3B0cy5tYXgsIG1lKSB8fCBtYXg7XHJcblxyXG5cdFx0XHQvLyBSZW1vdmUgdGlja3Mgb3V0c2lkZSB0aGUgbWluL21heCByYW5nZVxyXG5cdFx0XHRmb3IgKGkgPSAwLCBpbGVuID0gdGltZXN0YW1wcy5sZW5ndGg7IGkgPCBpbGVuOyArK2kpIHtcclxuXHRcdFx0XHR0aW1lc3RhbXAgPSB0aW1lc3RhbXBzW2ldO1xyXG5cdFx0XHRcdGlmICh0aW1lc3RhbXAgPj0gbWluICYmIHRpbWVzdGFtcCA8PSBtYXgpIHtcclxuXHRcdFx0XHRcdHRpY2tzLnB1c2godGltZXN0YW1wKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG1lLm1pbiA9IG1pbjtcclxuXHRcdFx0bWUubWF4ID0gbWF4O1xyXG5cclxuXHRcdFx0Ly8gUFJJVkFURVxyXG5cdFx0XHRtZS5fdW5pdCA9IHRpbWVPcHRzLnVuaXQgfHwgZGV0ZXJtaW5lVW5pdEZvckZvcm1hdHRpbmcodGlja3MsIHRpbWVPcHRzLm1pblVuaXQsIG1lLm1pbiwgbWUubWF4KTtcclxuXHRcdFx0bWUuX21ham9yVW5pdCA9IGRldGVybWluZU1ham9yVW5pdChtZS5fdW5pdCk7XHJcblx0XHRcdG1lLl90YWJsZSA9IGJ1aWxkTG9va3VwVGFibGUobWUuX3RpbWVzdGFtcHMuZGF0YSwgbWluLCBtYXgsIG9wdGlvbnMuZGlzdHJpYnV0aW9uKTtcclxuXHRcdFx0bWUuX29mZnNldHMgPSBjb21wdXRlT2Zmc2V0cyhtZS5fdGFibGUsIHRpY2tzLCBtaW4sIG1heCwgb3B0aW9ucyk7XHJcblx0XHRcdG1lLl9sYWJlbEZvcm1hdCA9IGRldGVybWluZUxhYmVsRm9ybWF0KG1lLl90aW1lc3RhbXBzLmRhdGEsIHRpbWVPcHRzKTtcclxuXHJcblx0XHRcdHJldHVybiB0aWNrc0Zyb21UaW1lc3RhbXBzKHRpY2tzLCBtZS5fbWFqb3JVbml0KTtcclxuXHRcdH0sXHJcblxyXG5cdFx0Z2V0TGFiZWxGb3JJbmRleDogZnVuY3Rpb24oaW5kZXgsIGRhdGFzZXRJbmRleCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgZGF0YSA9IG1lLmNoYXJ0LmRhdGE7XHJcblx0XHRcdHZhciB0aW1lT3B0cyA9IG1lLm9wdGlvbnMudGltZTtcclxuXHRcdFx0dmFyIGxhYmVsID0gZGF0YS5sYWJlbHMgJiYgaW5kZXggPCBkYXRhLmxhYmVscy5sZW5ndGggPyBkYXRhLmxhYmVsc1tpbmRleF0gOiAnJztcclxuXHRcdFx0dmFyIHZhbHVlID0gZGF0YS5kYXRhc2V0c1tkYXRhc2V0SW5kZXhdLmRhdGFbaW5kZXhdO1xyXG5cclxuXHRcdFx0aWYgKGhlbHBlcnMuaXNPYmplY3QodmFsdWUpKSB7XHJcblx0XHRcdFx0bGFiZWwgPSBtZS5nZXRSaWdodFZhbHVlKHZhbHVlKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodGltZU9wdHMudG9vbHRpcEZvcm1hdCkge1xyXG5cdFx0XHRcdHJldHVybiBtb21lbnRpZnkobGFiZWwsIHRpbWVPcHRzKS5mb3JtYXQodGltZU9wdHMudG9vbHRpcEZvcm1hdCk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHR5cGVvZiBsYWJlbCA9PT0gJ3N0cmluZycpIHtcclxuXHRcdFx0XHRyZXR1cm4gbGFiZWw7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBtb21lbnRpZnkobGFiZWwsIHRpbWVPcHRzKS5mb3JtYXQobWUuX2xhYmVsRm9ybWF0KTtcclxuXHRcdH0sXHJcblxyXG5cdFx0LyoqXHJcblx0XHQgKiBGdW5jdGlvbiB0byBmb3JtYXQgYW4gaW5kaXZpZHVhbCB0aWNrIG1hcmtcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHRcdHRpY2tGb3JtYXRGdW5jdGlvbjogZnVuY3Rpb24odGljaywgaW5kZXgsIHRpY2tzLCBmb3JtYXRPdmVycmlkZSkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgb3B0aW9ucyA9IG1lLm9wdGlvbnM7XHJcblx0XHRcdHZhciB0aW1lID0gdGljay52YWx1ZU9mKCk7XHJcblx0XHRcdHZhciBmb3JtYXRzID0gb3B0aW9ucy50aW1lLmRpc3BsYXlGb3JtYXRzO1xyXG5cdFx0XHR2YXIgbWlub3JGb3JtYXQgPSBmb3JtYXRzW21lLl91bml0XTtcclxuXHRcdFx0dmFyIG1ham9yVW5pdCA9IG1lLl9tYWpvclVuaXQ7XHJcblx0XHRcdHZhciBtYWpvckZvcm1hdCA9IGZvcm1hdHNbbWFqb3JVbml0XTtcclxuXHRcdFx0dmFyIG1ham9yVGltZSA9IHRpY2suY2xvbmUoKS5zdGFydE9mKG1ham9yVW5pdCkudmFsdWVPZigpO1xyXG5cdFx0XHR2YXIgbWFqb3JUaWNrT3B0cyA9IG9wdGlvbnMudGlja3MubWFqb3I7XHJcblx0XHRcdHZhciBtYWpvciA9IG1ham9yVGlja09wdHMuZW5hYmxlZCAmJiBtYWpvclVuaXQgJiYgbWFqb3JGb3JtYXQgJiYgdGltZSA9PT0gbWFqb3JUaW1lO1xyXG5cdFx0XHR2YXIgbGFiZWwgPSB0aWNrLmZvcm1hdChmb3JtYXRPdmVycmlkZSA/IGZvcm1hdE92ZXJyaWRlIDogbWFqb3IgPyBtYWpvckZvcm1hdCA6IG1pbm9yRm9ybWF0KTtcclxuXHRcdFx0dmFyIHRpY2tPcHRzID0gbWFqb3IgPyBtYWpvclRpY2tPcHRzIDogb3B0aW9ucy50aWNrcy5taW5vcjtcclxuXHRcdFx0dmFyIGZvcm1hdHRlciA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQodGlja09wdHMuY2FsbGJhY2ssIHRpY2tPcHRzLnVzZXJDYWxsYmFjayk7XHJcblxyXG5cdFx0XHRyZXR1cm4gZm9ybWF0dGVyID8gZm9ybWF0dGVyKGxhYmVsLCBpbmRleCwgdGlja3MpIDogbGFiZWw7XHJcblx0XHR9LFxyXG5cclxuXHRcdGNvbnZlcnRUaWNrc1RvTGFiZWxzOiBmdW5jdGlvbih0aWNrcykge1xyXG5cdFx0XHR2YXIgbGFiZWxzID0gW107XHJcblx0XHRcdHZhciBpLCBpbGVuO1xyXG5cclxuXHRcdFx0Zm9yIChpID0gMCwgaWxlbiA9IHRpY2tzLmxlbmd0aDsgaSA8IGlsZW47ICsraSkge1xyXG5cdFx0XHRcdGxhYmVscy5wdXNoKHRoaXMudGlja0Zvcm1hdEZ1bmN0aW9uKG1vbWVudCh0aWNrc1tpXS52YWx1ZSksIGksIHRpY2tzKSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBsYWJlbHM7XHJcblx0XHR9LFxyXG5cclxuXHRcdC8qKlxyXG5cdFx0ICogQHByaXZhdGVcclxuXHRcdCAqL1xyXG5cdFx0Z2V0UGl4ZWxGb3JPZmZzZXQ6IGZ1bmN0aW9uKHRpbWUpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIHNpemUgPSBtZS5faG9yaXpvbnRhbCA/IG1lLndpZHRoIDogbWUuaGVpZ2h0O1xyXG5cdFx0XHR2YXIgc3RhcnQgPSBtZS5faG9yaXpvbnRhbCA/IG1lLmxlZnQgOiBtZS50b3A7XHJcblx0XHRcdHZhciBwb3MgPSBpbnRlcnBvbGF0ZShtZS5fdGFibGUsICd0aW1lJywgdGltZSwgJ3BvcycpO1xyXG5cclxuXHRcdFx0cmV0dXJuIHN0YXJ0ICsgc2l6ZSAqIChtZS5fb2Zmc2V0cy5sZWZ0ICsgcG9zKSAvIChtZS5fb2Zmc2V0cy5sZWZ0ICsgMSArIG1lLl9vZmZzZXRzLnJpZ2h0KTtcclxuXHRcdH0sXHJcblxyXG5cdFx0Z2V0UGl4ZWxGb3JWYWx1ZTogZnVuY3Rpb24odmFsdWUsIGluZGV4LCBkYXRhc2V0SW5kZXgpIHtcclxuXHRcdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFx0dmFyIHRpbWUgPSBudWxsO1xyXG5cclxuXHRcdFx0aWYgKGluZGV4ICE9PSB1bmRlZmluZWQgJiYgZGF0YXNldEluZGV4ICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHR0aW1lID0gbWUuX3RpbWVzdGFtcHMuZGF0YXNldHNbZGF0YXNldEluZGV4XVtpbmRleF07XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICh0aW1lID09PSBudWxsKSB7XHJcblx0XHRcdFx0dGltZSA9IHBhcnNlKHZhbHVlLCBtZSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmICh0aW1lICE9PSBudWxsKSB7XHJcblx0XHRcdFx0cmV0dXJuIG1lLmdldFBpeGVsRm9yT2Zmc2V0KHRpbWUpO1xyXG5cdFx0XHR9XHJcblx0XHR9LFxyXG5cclxuXHRcdGdldFBpeGVsRm9yVGljazogZnVuY3Rpb24oaW5kZXgpIHtcclxuXHRcdFx0dmFyIHRpY2tzID0gdGhpcy5nZXRUaWNrcygpO1xyXG5cdFx0XHRyZXR1cm4gaW5kZXggPj0gMCAmJiBpbmRleCA8IHRpY2tzLmxlbmd0aCA/XHJcblx0XHRcdFx0dGhpcy5nZXRQaXhlbEZvck9mZnNldCh0aWNrc1tpbmRleF0udmFsdWUpIDpcclxuXHRcdFx0XHRudWxsO1xyXG5cdFx0fSxcclxuXHJcblx0XHRnZXRWYWx1ZUZvclBpeGVsOiBmdW5jdGlvbihwaXhlbCkge1xyXG5cdFx0XHR2YXIgbWUgPSB0aGlzO1xyXG5cdFx0XHR2YXIgc2l6ZSA9IG1lLl9ob3Jpem9udGFsID8gbWUud2lkdGggOiBtZS5oZWlnaHQ7XHJcblx0XHRcdHZhciBzdGFydCA9IG1lLl9ob3Jpem9udGFsID8gbWUubGVmdCA6IG1lLnRvcDtcclxuXHRcdFx0dmFyIHBvcyA9IChzaXplID8gKHBpeGVsIC0gc3RhcnQpIC8gc2l6ZSA6IDApICogKG1lLl9vZmZzZXRzLmxlZnQgKyAxICsgbWUuX29mZnNldHMubGVmdCkgLSBtZS5fb2Zmc2V0cy5yaWdodDtcclxuXHRcdFx0dmFyIHRpbWUgPSBpbnRlcnBvbGF0ZShtZS5fdGFibGUsICdwb3MnLCBwb3MsICd0aW1lJyk7XHJcblxyXG5cdFx0XHRyZXR1cm4gbW9tZW50KHRpbWUpO1xyXG5cdFx0fSxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIENydWRlIGFwcHJveGltYXRpb24gb2Ygd2hhdCB0aGUgbGFiZWwgd2lkdGggbWlnaHQgYmVcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHRcdGdldExhYmVsV2lkdGg6IGZ1bmN0aW9uKGxhYmVsKSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblx0XHRcdHZhciB0aWNrc09wdHMgPSBtZS5vcHRpb25zLnRpY2tzO1xyXG5cdFx0XHR2YXIgdGlja0xhYmVsV2lkdGggPSBtZS5jdHgubWVhc3VyZVRleHQobGFiZWwpLndpZHRoO1xyXG5cdFx0XHR2YXIgYW5nbGUgPSBoZWxwZXJzLnRvUmFkaWFucyh0aWNrc09wdHMubWF4Um90YXRpb24pO1xyXG5cdFx0XHR2YXIgY29zUm90YXRpb24gPSBNYXRoLmNvcyhhbmdsZSk7XHJcblx0XHRcdHZhciBzaW5Sb3RhdGlvbiA9IE1hdGguc2luKGFuZ2xlKTtcclxuXHRcdFx0dmFyIHRpY2tGb250U2l6ZSA9IGhlbHBlcnMudmFsdWVPckRlZmF1bHQodGlja3NPcHRzLmZvbnRTaXplLCBkZWZhdWx0cy5nbG9iYWwuZGVmYXVsdEZvbnRTaXplKTtcclxuXHJcblx0XHRcdHJldHVybiAodGlja0xhYmVsV2lkdGggKiBjb3NSb3RhdGlvbikgKyAodGlja0ZvbnRTaXplICogc2luUm90YXRpb24pO1xyXG5cdFx0fSxcclxuXHJcblx0XHQvKipcclxuXHRcdCAqIEBwcml2YXRlXHJcblx0XHQgKi9cclxuXHRcdGdldExhYmVsQ2FwYWNpdHk6IGZ1bmN0aW9uKGV4YW1wbGVUaW1lKSB7XHJcblx0XHRcdHZhciBtZSA9IHRoaXM7XHJcblxyXG5cdFx0XHR2YXIgZm9ybWF0T3ZlcnJpZGUgPSBtZS5vcHRpb25zLnRpbWUuZGlzcGxheUZvcm1hdHMubWlsbGlzZWNvbmQ7XHQvLyBQaWNrIHRoZSBsb25nZXN0IGZvcm1hdCBmb3IgZ3Vlc3RpbWF0aW9uXHJcblxyXG5cdFx0XHR2YXIgZXhhbXBsZUxhYmVsID0gbWUudGlja0Zvcm1hdEZ1bmN0aW9uKG1vbWVudChleGFtcGxlVGltZSksIDAsIFtdLCBmb3JtYXRPdmVycmlkZSk7XHJcblx0XHRcdHZhciB0aWNrTGFiZWxXaWR0aCA9IG1lLmdldExhYmVsV2lkdGgoZXhhbXBsZUxhYmVsKTtcclxuXHRcdFx0dmFyIGlubmVyV2lkdGggPSBtZS5pc0hvcml6b250YWwoKSA/IG1lLndpZHRoIDogbWUuaGVpZ2h0O1xyXG5cclxuXHRcdFx0dmFyIGNhcGFjaXR5ID0gTWF0aC5mbG9vcihpbm5lcldpZHRoIC8gdGlja0xhYmVsV2lkdGgpO1xyXG5cdFx0XHRyZXR1cm4gY2FwYWNpdHkgPiAwID8gY2FwYWNpdHkgOiAxO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cclxuXHRzY2FsZVNlcnZpY2UucmVnaXN0ZXJTY2FsZVR5cGUoJ3RpbWUnLCBUaW1lU2NhbGUsIGRlZmF1bHRDb25maWcpO1xyXG59O1xyXG5cclxufSx7XCIxXCI6MSxcIjI2XCI6MjYsXCIzM1wiOjMzLFwiMzRcIjozNCxcIjQ2XCI6NDZ9XX0se30sWzddKSg3KVxyXG59KTtcclxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL0NoYXJ0LmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7\n");
|
|
|
|
/***/ })
|
|
|
|
/******/ }); |