@clickview/reports 0.0.26 → 0.0.27-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/dist/bundles.json +2 -2
  2. package/dist/css/11-reports.chunk.css +365 -0
  3. package/dist/css/13-reports.chunk.css +1846 -0
  4. package/dist/css/16-reports.chunk.css +39 -0
  5. package/dist/css/17-reports.chunk.css +42 -0
  6. package/dist/css/18-reports.chunk.css +37 -0
  7. package/dist/css/19-reports.chunk.css +21 -0
  8. package/dist/css/2-reports.chunk.css +49 -0
  9. package/dist/css/20-reports.chunk.css +34 -0
  10. package/dist/css/22-reports.chunk.css +12 -0
  11. package/dist/css/24-reports.chunk.css +163 -0
  12. package/dist/css/25-reports.chunk.css +72 -0
  13. package/dist/css/26-reports.chunk.css +80 -0
  14. package/dist/css/27-reports.chunk.css +30 -0
  15. package/dist/css/28-reports.chunk.css +143 -0
  16. package/dist/css/29-reports.chunk.css +24 -0
  17. package/dist/css/30-reports.chunk.css +21 -0
  18. package/dist/css/31-reports.chunk.css +9 -0
  19. package/dist/css/32-reports.chunk.css +60 -0
  20. package/dist/css/33-reports.chunk.css +3 -0
  21. package/dist/css/34-reports.chunk.css +12 -0
  22. package/dist/css/35-reports.chunk.css +12 -0
  23. package/dist/css/36-reports.chunk.css +22 -0
  24. package/dist/css/4-reports.chunk.css +22 -0
  25. package/dist/css/5-reports.chunk.css +44 -0
  26. package/dist/css/6-reports.chunk.css +63 -0
  27. package/dist/css/7-reports.chunk.css +83 -0
  28. package/dist/css/reports-app.css +11498 -0
  29. package/dist/scripts/{0-45d6f561a1-reports.chunk.js → 0-0994898684-reports.chunk.js} +1 -1
  30. package/dist/scripts/0-reports.chunk.js +43 -0
  31. package/dist/scripts/{1-b44bc2d382-reports.chunk.js → 1-74923a7364-reports.chunk.js} +1 -1
  32. package/dist/scripts/1-reports.chunk.js +11 -0
  33. package/dist/scripts/{10-c9b19fd45d-reports.chunk.js → 10-72de985ca6-reports.chunk.js} +1 -1
  34. package/dist/scripts/10-reports.chunk.js +11 -0
  35. package/dist/scripts/{11-4d34a4e7ba-reports.chunk.js → 11-61af1e19c7-reports.chunk.js} +1 -1
  36. package/dist/scripts/11-reports.chunk.js +397 -0
  37. package/dist/scripts/{12-3a1b307676-reports.chunk.js → 12-a58508b6ee-reports.chunk.js} +1 -1
  38. package/dist/scripts/12-reports.chunk.js +43 -0
  39. package/dist/scripts/13-reports.chunk.js +1088 -0
  40. package/dist/scripts/14-reports.chunk.js +1255 -0
  41. package/dist/scripts/{15-b5cdf2ca83-reports.chunk.js → 15-6d142f0f60-reports.chunk.js} +2 -2
  42. package/dist/scripts/15-reports.chunk.js +43 -0
  43. package/dist/scripts/16-2c857db15c-reports.chunk.js +1 -0
  44. package/dist/scripts/16-reports.chunk.js +167 -0
  45. package/dist/scripts/17-f19243cfde-reports.chunk.js +1 -0
  46. package/dist/scripts/17-reports.chunk.js +151 -0
  47. package/dist/scripts/{18-26152e90cf-reports.chunk.js → 18-fdcee8d99b-reports.chunk.js} +1 -1
  48. package/dist/scripts/18-reports.chunk.js +104 -0
  49. package/dist/scripts/19-48d8402ead-reports.chunk.js +1 -0
  50. package/dist/scripts/19-reports.chunk.js +97 -0
  51. package/dist/scripts/{2-10046bd9c7-reports.chunk.js → 2-6363a15c1a-reports.chunk.js} +1 -1
  52. package/dist/scripts/2-reports.chunk.js +42 -0
  53. package/dist/scripts/{20-fb21388afa-reports.chunk.js → 20-d599187e5b-reports.chunk.js} +1 -1
  54. package/dist/scripts/20-reports.chunk.js +72 -0
  55. package/dist/scripts/{21-1f824cdc04-reports.chunk.js → 21-3d1f0982d4-reports.chunk.js} +1 -1
  56. package/dist/scripts/21-reports.chunk.js +67 -0
  57. package/dist/scripts/{22-b39a13f4bc-reports.chunk.js → 22-c2ea378dce-reports.chunk.js} +1 -1
  58. package/dist/scripts/22-reports.chunk.js +34 -0
  59. package/dist/scripts/{23-b4762a301a-reports.chunk.js → 23-8d9a55c243-reports.chunk.js} +1 -1
  60. package/dist/scripts/23-reports.chunk.js +2469 -0
  61. package/dist/scripts/{24-192d8a65eb-reports.chunk.js → 24-4552a4d4b1-reports.chunk.js} +1 -1
  62. package/dist/scripts/24-reports.chunk.js +704 -0
  63. package/dist/scripts/{25-514ac9b009-reports.chunk.js → 25-2217879368-reports.chunk.js} +1 -1
  64. package/dist/scripts/25-reports.chunk.js +227 -0
  65. package/dist/scripts/{26-6d77d19c83-reports.chunk.js → 26-a9a0806c8e-reports.chunk.js} +1 -1
  66. package/dist/scripts/26-reports.chunk.js +214 -0
  67. package/dist/scripts/{27-1e40e49481-reports.chunk.js → 27-98603dad42-reports.chunk.js} +1 -1
  68. package/dist/scripts/27-reports.chunk.js +150 -0
  69. package/dist/scripts/{28-2e12aa2b84-reports.chunk.js → 28-83e02981bb-reports.chunk.js} +1 -1
  70. package/dist/scripts/28-reports.chunk.js +119 -0
  71. package/dist/scripts/{29-8df8a60b39-reports.chunk.js → 29-07f938f396-reports.chunk.js} +1 -1
  72. package/dist/scripts/29-reports.chunk.js +105 -0
  73. package/dist/scripts/{3-581ba906a8-reports.chunk.js → 3-54445e0784-reports.chunk.js} +1 -1
  74. package/dist/scripts/3-reports.chunk.js +17 -0
  75. package/dist/scripts/{30-c692a12728-reports.chunk.js → 30-5b1fa09845-reports.chunk.js} +1 -1
  76. package/dist/scripts/30-reports.chunk.js +97 -0
  77. package/dist/scripts/{31-d560bb2964-reports.chunk.js → 31-39c16f8ecb-reports.chunk.js} +1 -1
  78. package/dist/scripts/31-reports.chunk.js +81 -0
  79. package/dist/scripts/32-reports.chunk.js +81 -0
  80. package/dist/scripts/33-reports.chunk.js +50 -0
  81. package/dist/scripts/34-reports.chunk.js +34 -0
  82. package/dist/scripts/35-reports.chunk.js +34 -0
  83. package/dist/scripts/36-reports.chunk.js +18 -0
  84. package/dist/scripts/37-reports.chunk.js +11 -0
  85. package/dist/scripts/38-reports.chunk.js +11 -0
  86. package/dist/scripts/39-reports.chunk.js +11 -0
  87. package/dist/scripts/4-0563be5390-reports.chunk.js +1 -0
  88. package/dist/scripts/4-reports.chunk.js +89 -0
  89. package/dist/scripts/40-reports.chunk.js +11 -0
  90. package/dist/scripts/{5-dc395553ff-reports.chunk.js → 5-7de2073c7c-reports.chunk.js} +15 -15
  91. package/dist/scripts/5-reports.chunk.js +73 -0
  92. package/dist/scripts/{6-7b13156847-reports.chunk.js → 6-6ca85a7710-reports.chunk.js} +1 -1
  93. package/dist/scripts/6-reports.chunk.js +113 -0
  94. package/dist/scripts/{7-11a1aa63ca-reports.chunk.js → 7-4972d87778-reports.chunk.js} +1 -1
  95. package/dist/scripts/7-reports.chunk.js +56 -0
  96. package/dist/scripts/8-3b004dbc7d-reports.chunk.js +1 -0
  97. package/dist/scripts/8-reports.chunk.js +17 -0
  98. package/dist/scripts/{9-b9fdcedfb5-reports.chunk.js → 9-a223165d25-reports.chunk.js} +1 -1
  99. package/dist/scripts/9-reports.chunk.js +35 -0
  100. package/dist/scripts/bundle-0fc3abb0ed.min.js +19 -0
  101. package/dist/scripts/bundle.js +7281 -0
  102. package/dist/scripts/polyfills-241c416f13.min.js +1 -0
  103. package/dist/scripts/polyfills.js +2750 -0
  104. package/package.json +3 -3
  105. package/dist/scripts/16-13269fde77-reports.chunk.js +0 -1
  106. package/dist/scripts/17-e4c043a006-reports.chunk.js +0 -1
  107. package/dist/scripts/19-935f79cf67-reports.chunk.js +0 -1
  108. package/dist/scripts/4-7099530847-reports.chunk.js +0 -1
  109. package/dist/scripts/8-e5da1d6aa4-reports.chunk.js +0 -1
  110. package/dist/scripts/bundle-6d2a417531.min.js +0 -19
  111. package/dist/scripts/polyfills-fc123dbc56.min.js +0 -1
@@ -0,0 +1,17 @@
1
+ (window["webpackJsonp_clickview_reports"] = window["webpackJsonp_clickview_reports"] || []).push([[3],{
2
+
3
+ /***/ "../../../node_modules/highcharts-react-official/dist/highcharts-react.min.js":
4
+ /***/ (function(module, exports, __webpack_require__) {
5
+
6
+ eval("!function(e,t){ true?module.exports=t(__webpack_require__(\"react\"),__webpack_require__(\"../../../node_modules/highcharts/highcharts.js\")):undefined}(\"undefined\"!=typeof self?self:this,function(e,t){return function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var r={};return t.m=e,t.c=r,t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,\"a\",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p=\"\",t(t.s=0)}([function(e,t,r){\"use strict\";function n(){return n=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},n.apply(this,arguments)}function o(e){return i(e)||u(e)||c()}function c(){throw new TypeError(\"Invalid attempt to spread non-iterable instance\")}function u(e){if(Symbol.iterator in Object(e)||\"[object Arguments]\"===Object.prototype.toString.call(e))return Array.from(e)}function i(e){if(Array.isArray(e)){for(var t=0,r=new Array(e.length);t<e.length;t++)r[t]=e[t];return r}}Object.defineProperty(t,\"__esModule\",{value:!0});var a=r(1),s=r.n(a),f=r(2),p=r.n(f),l=\"undefined\"!=typeof window?a.useLayoutEffect:a.useEffect,d=Object(a.forwardRef)(function(e,t){var r=Object(a.useRef)(),c=Object(a.useRef)();return l(function(){function t(){var t=e.highcharts||p.a,n=e.constructorType||\"chart\";t?t[n]?e.options?c.current=t[n](r.current,e.options,e.callback?e.callback:void 0):console.warn('The \"options\" property was not passed.'):console.warn('The \"constructorType\" property is incorrect or some required module is not imported.'):console.warn('The \"highcharts\" property was not passed.')}if(c.current){if(!1!==e.allowChartUpdate)if(!e.immutable&&c.current){var n;(n=c.current).update.apply(n,[e.options].concat(o(e.updateArgs||[!0,!0])))}else t()}else t()}),l(function(){return function(){c.current&&(c.current.destroy(),c.current=null)}},[]),Object(a.useImperativeHandle)(t,function(){return{get chart(){return c.current},container:r}},[]),s.a.createElement(\"div\",n({},e.containerProps,{ref:r}))});t.default=Object(a.memo)(d)},function(t,r){t.exports=e},function(e,r){e.exports=t}])});\n//# sourceMappingURL=highcharts-react.min.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2hpZ2hjaGFydHMtcmVhY3Qtb2ZmaWNpYWwvZGlzdC9oaWdoY2hhcnRzLXJlYWN0Lm1pbi5qcy5qcyIsInNvdXJjZXMiOlsiZmlsZTovL0M6L0NsaWNrVmlldyBQcm9qZWN0cy9jbGlja3ZpZXcvbm9kZV9tb2R1bGVzL2hpZ2hjaGFydHMtcmVhY3Qtb2ZmaWNpYWwvZGlzdC9oaWdoY2hhcnRzLXJlYWN0Lm1pbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIhZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KHJlcXVpcmUoXCJyZWFjdFwiKSxyZXF1aXJlKFwiaGlnaGNoYXJ0c1wiKSk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJyZWFjdFwiLFwiaGlnaGNoYXJ0c1wiXSx0KTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzLkhpZ2hjaGFydHNSZWFjdD10KHJlcXVpcmUoXCJyZWFjdFwiKSxyZXF1aXJlKFwiaGlnaGNoYXJ0c1wiKSk6ZS5IaWdoY2hhcnRzUmVhY3Q9dChlLlJlYWN0LGUuSGlnaGNoYXJ0cyl9KFwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcyxmdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe2lmKHJbbl0pcmV0dXJuIHJbbl0uZXhwb3J0czt2YXIgbz1yW25dPXtpOm4sbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gZVtuXS5jYWxsKG8uZXhwb3J0cyxvLG8uZXhwb3J0cyx0KSxvLmw9ITAsby5leHBvcnRzfXZhciByPXt9O3JldHVybiB0Lm09ZSx0LmM9cix0LmQ9ZnVuY3Rpb24oZSxyLG4pe3QubyhlLHIpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCxnZXQ6bn0pfSx0Lm49ZnVuY3Rpb24oZSl7dmFyIHI9ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIHQuZChyLFwiYVwiLHIpLHJ9LHQubz1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX0sdC5wPVwiXCIsdCh0LnM9MCl9KFtmdW5jdGlvbihlLHQscil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gbigpe3JldHVybiBuPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciByPWFyZ3VtZW50c1t0XTtmb3IodmFyIG4gaW4gcilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocixuKSYmKGVbbl09cltuXSl9cmV0dXJuIGV9LG4uYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIG8oZSl7cmV0dXJuIGkoZSl8fHUoZSl8fGMoKX1mdW5jdGlvbiBjKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpfWZ1bmN0aW9uIHUoZSl7aWYoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChlKXx8XCJbb2JqZWN0IEFyZ3VtZW50c11cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSlyZXR1cm4gQXJyYXkuZnJvbShlKX1mdW5jdGlvbiBpKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpe2Zvcih2YXIgdD0wLHI9bmV3IEFycmF5KGUubGVuZ3RoKTt0PGUubGVuZ3RoO3QrKylyW3RdPWVbdF07cmV0dXJuIHJ9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBhPXIoMSkscz1yLm4oYSksZj1yKDIpLHA9ci5uKGYpLGw9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz9hLnVzZUxheW91dEVmZmVjdDphLnVzZUVmZmVjdCxkPU9iamVjdChhLmZvcndhcmRSZWYpKGZ1bmN0aW9uKGUsdCl7dmFyIHI9T2JqZWN0KGEudXNlUmVmKSgpLGM9T2JqZWN0KGEudXNlUmVmKSgpO3JldHVybiBsKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0PWUuaGlnaGNoYXJ0c3x8cC5hLG49ZS5jb25zdHJ1Y3RvclR5cGV8fFwiY2hhcnRcIjt0P3Rbbl0/ZS5vcHRpb25zP2MuY3VycmVudD10W25dKHIuY3VycmVudCxlLm9wdGlvbnMsZS5jYWxsYmFjaz9lLmNhbGxiYWNrOnZvaWQgMCk6Y29uc29sZS53YXJuKCdUaGUgXCJvcHRpb25zXCIgcHJvcGVydHkgd2FzIG5vdCBwYXNzZWQuJyk6Y29uc29sZS53YXJuKCdUaGUgXCJjb25zdHJ1Y3RvclR5cGVcIiBwcm9wZXJ0eSBpcyBpbmNvcnJlY3Qgb3Igc29tZSByZXF1aXJlZCBtb2R1bGUgaXMgbm90IGltcG9ydGVkLicpOmNvbnNvbGUud2FybignVGhlIFwiaGlnaGNoYXJ0c1wiIHByb3BlcnR5IHdhcyBub3QgcGFzc2VkLicpfWlmKGMuY3VycmVudCl7aWYoITEhPT1lLmFsbG93Q2hhcnRVcGRhdGUpaWYoIWUuaW1tdXRhYmxlJiZjLmN1cnJlbnQpe3ZhciBuOyhuPWMuY3VycmVudCkudXBkYXRlLmFwcGx5KG4sW2Uub3B0aW9uc10uY29uY2F0KG8oZS51cGRhdGVBcmdzfHxbITAsITBdKSkpfWVsc2UgdCgpfWVsc2UgdCgpfSksbChmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe2MuY3VycmVudCYmKGMuY3VycmVudC5kZXN0cm95KCksYy5jdXJyZW50PW51bGwpfX0sW10pLE9iamVjdChhLnVzZUltcGVyYXRpdmVIYW5kbGUpKHQsZnVuY3Rpb24oKXtyZXR1cm57Z2V0IGNoYXJ0KCl7cmV0dXJuIGMuY3VycmVudH0sY29udGFpbmVyOnJ9fSxbXSkscy5hLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIixuKHt9LGUuY29udGFpbmVyUHJvcHMse3JlZjpyfSkpfSk7dC5kZWZhdWx0PU9iamVjdChhLm1lbW8pKGQpfSxmdW5jdGlvbih0LHIpe3QuZXhwb3J0cz1lfSxmdW5jdGlvbihlLHIpe2UuZXhwb3J0cz10fV0pfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oaWdoY2hhcnRzLXJlYWN0Lm1pbi5qcy5tYXAiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/highcharts-react-official/dist/highcharts-react.min.js\n");
7
+
8
+ /***/ }),
9
+
10
+ /***/ "../../../node_modules/highcharts/highcharts.js":
11
+ /***/ (function(module, exports, __webpack_require__) {
12
+
13
+ eval("var __WEBPACK_AMD_DEFINE_RESULT__;/*\n Highcharts JS v9.1.0 (2021-05-03)\n\n (c) 2009-2021 Torstein Honsi\n\n License: www.highcharts.com/license\n*/\n(function(W,O){ true&&module.exports?(O[\"default\"]=O,module.exports=W.document?O(W):O): true?!(__WEBPACK_AMD_DEFINE_RESULT__ = (function(){return O(W)}).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)):(undefined)})(\"undefined\"!==typeof window?window:this,function(W){function O(D,b,e,z){D.hasOwnProperty(b)||(D[b]=z.apply(null,e))}var e={};O(e,\"Core/Globals.js\",[],function(){var D=\"undefined\"!==typeof W?W:\"undefined\"!==typeof window?window:{},b;(function(b){b.SVG_NS=\n\"http://www.w3.org/2000/svg\";b.product=\"Highcharts\";b.version=\"9.1.0\";b.win=D;b.doc=b.win.document;b.svg=b.doc&&b.doc.createElementNS&&!!b.doc.createElementNS(b.SVG_NS,\"svg\").createSVGRect;b.userAgent=b.win.navigator&&b.win.navigator.userAgent||\"\";b.isChrome=-1!==b.userAgent.indexOf(\"Chrome\");b.isFirefox=-1!==b.userAgent.indexOf(\"Firefox\");b.isMS=/(edge|msie|trident)/i.test(b.userAgent)&&!b.win.opera;b.isSafari=!b.isChrome&&-1!==b.userAgent.indexOf(\"Safari\");b.isTouchDevice=/(Mobile|Android|Windows Phone)/.test(b.userAgent);\nb.isWebKit=-1!==b.userAgent.indexOf(\"AppleWebKit\");b.deg2rad=2*Math.PI/360;b.hasBidiBug=b.isFirefox&&4>parseInt(b.userAgent.split(\"Firefox/\")[1],10);b.hasTouch=!!b.win.TouchEvent;b.marginNames=[\"plotTop\",\"marginRight\",\"marginBottom\",\"plotLeft\"];b.noop=function(){};b.supportsPassiveEvents=function(){var D=!1;if(!b.isMS){var e=Object.defineProperty({},\"passive\",{get:function(){D=!0}});b.win.addEventListener&&b.win.removeEventListener&&(b.win.addEventListener(\"testPassive\",b.noop,e),b.win.removeEventListener(\"testPassive\",\nb.noop,e))}return D}();b.charts=[];b.dateFormats={};b.seriesTypes={};b.symbolSizes={}})(b||(b={}));return b});O(e,\"Core/Utilities.js\",[e[\"Core/Globals.js\"]],function(D){function b(a,c,h,r){var y=c?\"Highcharts error\":\"Highcharts warning\";32===a&&(a=y+\": Deprecated member\");var d=w(a),M=d?y+\" #\"+a+\": www.highcharts.com/errors/\"+a+\"/\":a.toString();if(\"undefined\"!==typeof r){var t=\"\";d&&(M+=\"?\");n(r,function(p,a){t+=\"\\n - \"+a+\": \"+p;d&&(M+=encodeURI(a)+\"=\"+encodeURI(p))});M+=t}E(Highcharts,\"displayError\",\n{chart:h,code:a,message:M,params:r},function(){if(c)throw Error(M);g.console&&-1===b.messages.indexOf(M)&&console.warn(M)});b.messages.push(M)}function e(a,c){var y={};n(a,function(g,h){if(C(a[h],!0)&&!a.nodeType&&c[h])g=e(a[h],c[h]),Object.keys(g).length&&(y[h]=g);else if(C(a[h])||a[h]!==c[h])y[h]=a[h]});return y}function z(a,c){return parseInt(a,c||10)}function H(a){return\"string\"===typeof a}function G(a){a=Object.prototype.toString.call(a);return\"[object Array]\"===a||\"[object Array Iterator]\"===\na}function C(a,c){return!!a&&\"object\"===typeof a&&(!c||!G(a))}function B(a){return C(a)&&\"number\"===typeof a.nodeType}function x(a){var c=a&&a.constructor;return!(!C(a,!0)||B(a)||!c||!c.name||\"Object\"===c.name)}function w(a){return\"number\"===typeof a&&!isNaN(a)&&Infinity>a&&-Infinity<a}function v(a){return\"undefined\"!==typeof a&&null!==a}function f(a,c,g){var y;H(c)?v(g)?a.setAttribute(c,g):a&&a.getAttribute&&((y=a.getAttribute(c))||\"class\"!==c||(y=a.getAttribute(c+\"Name\"))):n(c,function(c,y){a.setAttribute(y,\nc)});return y}function d(a,c){var y;a||(a={});for(y in c)a[y]=c[y];return a}function q(){for(var a=arguments,c=a.length,g=0;g<c;g++){var h=a[g];if(\"undefined\"!==typeof h&&null!==h)return h}}function k(a,c){D.isMS&&!D.svg&&c&&\"undefined\"!==typeof c.opacity&&(c.filter=\"alpha(opacity=\"+100*c.opacity+\")\");d(a.style,c)}function l(a,g,h,r,m){a=c.createElement(a);g&&d(a,g);m&&k(a,{padding:\"0\",border:\"none\",margin:\"0\"});h&&k(a,h);r&&r.appendChild(a);return a}function N(a,c){return parseFloat(a.toPrecision(c||\n14))}function u(a,c,h){var y=D.getStyle||u;if(\"width\"===c)return c=Math.min(a.offsetWidth,a.scrollWidth),h=a.getBoundingClientRect&&a.getBoundingClientRect().width,h<c&&h>=c-1&&(c=Math.floor(h)),Math.max(0,c-(y(a,\"padding-left\",!0)||0)-(y(a,\"padding-right\",!0)||0));if(\"height\"===c)return Math.max(0,Math.min(a.offsetHeight,a.scrollHeight)-(y(a,\"padding-top\",!0)||0)-(y(a,\"padding-bottom\",!0)||0));g.getComputedStyle||b(27,!0);if(a=g.getComputedStyle(a,void 0)){var r=a.getPropertyValue(c);q(h,\"opacity\"!==\nc)&&(r=z(r))}return r}function n(a,c,g){for(var h in a)Object.hasOwnProperty.call(a,h)&&c.call(g||a[h],a[h],h,a)}function J(a,c,g){function h(t,p){var c=a.removeEventListener||D.removeEventListenerPolyfill;c&&c.call(a,t,p,!1)}function y(t){var p;if(a.nodeName){if(c){var g={};g[c]=!0}else g=t;n(g,function(a,c){if(t[c])for(p=t[c].length;p--;)h(c,t[c][p].fn)})}}var r=\"function\"===typeof a&&a.prototype||a;if(Object.hasOwnProperty.call(r,\"hcEvents\")){var M=r.hcEvents;c?(r=M[c]||[],g?(M[c]=r.filter(function(a){return g!==\na.fn}),h(c,g)):(y(M),M[c]=[])):(y(M),delete r.hcEvents)}}function E(a,g,h,r){h=h||{};if(c.createEvent&&(a.dispatchEvent||a.fireEvent&&a!==D)){var y=c.createEvent(\"Events\");y.initEvent(g,!0,!0);h=d(y,h);a.dispatchEvent?a.dispatchEvent(h):a.fireEvent(g,h)}else if(a.hcEvents){h.target||d(h,{preventDefault:function(){h.defaultPrevented=!0},target:a,type:g});y=[];for(var m=a,M=!1;m.hcEvents;)Object.hasOwnProperty.call(m,\"hcEvents\")&&m.hcEvents[g]&&(y.length&&(M=!0),y.unshift.apply(y,m.hcEvents[g])),m=\nObject.getPrototypeOf(m);M&&y.sort(function(a,p){return a.order-p.order});y.forEach(function(t){!1===t.fn.call(a,h)&&h.preventDefault()})}r&&!h.defaultPrevented&&r.call(a,h)}var m=D.charts,c=D.doc,g=D.win;\"\";(b||(b={})).messages=[];var a;Math.easeInOutSine=function(a){return-.5*(Math.cos(Math.PI*a)-1)};var h=Array.prototype.find?function(a,c){return a.find(c)}:function(a,c){var g,h=a.length;for(g=0;g<h;g++)if(c(a[g],g))return a[g]};n({map:\"map\",each:\"forEach\",grep:\"filter\",reduce:\"reduce\",some:\"some\"},\nfunction(a,c){D[c]=function(g){var h;b(32,!1,void 0,(h={},h[\"Highcharts.\"+c]=\"use Array.\"+a,h));return Array.prototype[a].apply(g,[].slice.call(arguments,1))}});var r,A=function(){var a=Math.random().toString(36).substring(2,9)+\"-\",c=0;return function(){return\"highcharts-\"+(r?\"\":a)+c++}}();g.jQuery&&(g.jQuery.fn.highcharts=function(){var a=[].slice.call(arguments);if(this[0])return a[0]?(new (D[H(a[0])?a.shift():\"Chart\"])(this[0],a[0],a[1]),this):m[f(this[0],\"data-highcharts-chart\")]});return{addEvent:function(a,\nc,g,h){void 0===h&&(h={});var r=\"function\"===typeof a&&a.prototype||a;Object.hasOwnProperty.call(r,\"hcEvents\")||(r.hcEvents={});r=r.hcEvents;D.Point&&a instanceof D.Point&&a.series&&a.series.chart&&(a.series.chart.runTrackerClick=!0);var y=a.addEventListener||D.addEventListenerPolyfill;y&&y.call(a,c,g,D.supportsPassiveEvents?{passive:void 0===h.passive?-1!==c.indexOf(\"touch\"):h.passive,capture:!1}:!1);r[c]||(r[c]=[]);r[c].push({fn:g,order:\"number\"===typeof h.order?h.order:Infinity});r[c].sort(function(a,\nt){return a.order-t.order});return function(){J(a,c,g)}},arrayMax:function(a){for(var c=a.length,g=a[0];c--;)a[c]>g&&(g=a[c]);return g},arrayMin:function(a){for(var c=a.length,g=a[0];c--;)a[c]<g&&(g=a[c]);return g},attr:f,clamp:function(a,c,g){return a>c?a<g?a:g:c},cleanRecursively:e,clearTimeout:function(a){v(a)&&clearTimeout(a)},correctFloat:N,createElement:l,css:k,defined:v,destroyObjectProperties:function(a,c){n(a,function(g,h){g&&g!==c&&g.destroy&&g.destroy();delete a[h]})},discardElement:function(c){a||\n(a=l(\"div\"));c&&a.appendChild(c);a.innerHTML=\"\"},erase:function(a,c){for(var g=a.length;g--;)if(a[g]===c){a.splice(g,1);break}},error:b,extend:d,extendClass:function(a,c){var g=function(){};g.prototype=new a;d(g.prototype,c);return g},find:h,fireEvent:E,getMagnitude:function(a){return Math.pow(10,Math.floor(Math.log(a)/Math.LN10))},getNestedProperty:function(a,c){for(a=a.split(\".\");a.length&&v(c);){var h=a.shift();if(\"undefined\"===typeof h||\"__proto__\"===h)return;c=c[h];if(!v(c)||\"function\"===typeof c||\n\"number\"===typeof c.nodeType||c===g)return}return c},getStyle:u,inArray:function(a,c,g){b(32,!1,void 0,{\"Highcharts.inArray\":\"use Array.indexOf\"});return c.indexOf(a,g)},isArray:G,isClass:x,isDOMElement:B,isFunction:function(a){return\"function\"===typeof a},isNumber:w,isObject:C,isString:H,keys:function(a){b(32,!1,void 0,{\"Highcharts.keys\":\"use Object.keys\"});return Object.keys(a)},merge:function(){var a,c=arguments,g={},h=function(a,c){\"object\"!==typeof a&&(a={});n(c,function(t,p){\"__proto__\"!==p&&\n\"constructor\"!==p&&(!C(t,!0)||x(t)||B(t)?a[p]=c[p]:a[p]=h(a[p]||{},t))});return a};!0===c[0]&&(g=c[1],c=Array.prototype.slice.call(c,2));var r=c.length;for(a=0;a<r;a++)g=h(g,c[a]);return g},normalizeTickInterval:function(a,c,g,h,r){var d=a;g=q(g,1);var M=a/g;c||(c=r?[1,1.2,1.5,2,2.5,3,4,5,6,8,10]:[1,2,2.5,5,10],!1===h&&(1===g?c=c.filter(function(a){return 0===a%1}):.1>=g&&(c=[1/g])));for(h=0;h<c.length&&!(d=c[h],r&&d*g>=a||!r&&M<=(c[h]+(c[h+1]||c[h]))/2);h++);return d=N(d*g,-Math.round(Math.log(.001)/\nMath.LN10))},objectEach:n,offset:function(a){var h=c.documentElement;a=a.parentElement||a.parentNode?a.getBoundingClientRect():{top:0,left:0,width:0,height:0};return{top:a.top+(g.pageYOffset||h.scrollTop)-(h.clientTop||0),left:a.left+(g.pageXOffset||h.scrollLeft)-(h.clientLeft||0),width:a.width,height:a.height}},pad:function(a,c,g){return Array((c||2)+1-String(a).replace(\"-\",\"\").length).join(g||\"0\")+a},pick:q,pInt:z,relativeLength:function(a,c,g){return/%$/.test(a)?c*parseFloat(a)/100+(g||0):parseFloat(a)},\nremoveEvent:J,splat:function(a){return G(a)?a:[a]},stableSort:function(a,c){var g=a.length,h,r;for(r=0;r<g;r++)a[r].safeI=r;a.sort(function(a,g){h=c(a,g);return 0===h?a.safeI-g.safeI:h});for(r=0;r<g;r++)delete a[r].safeI},syncTimeout:function(a,c,g){if(0<c)return setTimeout(a,c,g);a.call(0,g);return-1},timeUnits:{millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:24192E5,year:314496E5},uniqueKey:A,useSerialIds:function(a){return r=q(a,r)},wrap:function(a,c,g){var h=a[c];a[c]=\nfunction(){var a=Array.prototype.slice.call(arguments),c=arguments,r=this;r.proceed=function(){h.apply(r,arguments.length?arguments:c)};a.unshift(h);a=g.apply(this,a);r.proceed=null;return a}}}});O(e,\"Core/Color/Color.js\",[e[\"Core/Globals.js\"],e[\"Core/Utilities.js\"]],function(D,b){var e=b.isNumber,z=b.merge,H=b.pInt;\"\";b=function(){function b(e){this.parsers=[{regex:/rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]?(?:\\.[0-9]+)?)\\s*\\)/,parse:function(b){return[H(b[1]),H(b[2]),\nH(b[3]),parseFloat(b[4],10)]}},{regex:/rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/,parse:function(b){return[H(b[1]),H(b[2]),H(b[3]),1]}}];this.rgba=[];if(D.Color!==b)return new D.Color(e);if(!(this instanceof b))return new b(e);this.init(e)}b.parse=function(e){return new b(e)};b.prototype.init=function(e){var B,x;if((this.input=e=b.names[e&&e.toLowerCase?e.toLowerCase():\"\"]||e)&&e.stops)this.stops=e.stops.map(function(f){return new b(f[1])});else{if(e&&e.charAt&&\"#\"===e.charAt()){var w=\ne.length;e=parseInt(e.substr(1),16);7===w?B=[(e&16711680)>>16,(e&65280)>>8,e&255,1]:4===w&&(B=[(e&3840)>>4|(e&3840)>>8,(e&240)>>4|e&240,(e&15)<<4|e&15,1])}if(!B)for(x=this.parsers.length;x--&&!B;){var v=this.parsers[x];(w=v.regex.exec(e))&&(B=v.parse(w))}}this.rgba=B||[]};b.prototype.get=function(b){var B=this.input,x=this.rgba;if(\"undefined\"!==typeof this.stops){var w=z(B);w.stops=[].concat(w.stops);this.stops.forEach(function(v,f){w.stops[f]=[w.stops[f][0],v.get(b)]})}else w=x&&e(x[0])?\"rgb\"===\nb||!b&&1===x[3]?\"rgb(\"+x[0]+\",\"+x[1]+\",\"+x[2]+\")\":\"a\"===b?x[3]:\"rgba(\"+x.join(\",\")+\")\":B;return w};b.prototype.brighten=function(b){var B,x=this.rgba;if(this.stops)this.stops.forEach(function(w){w.brighten(b)});else if(e(b)&&0!==b)for(B=0;3>B;B++)x[B]+=H(255*b),0>x[B]&&(x[B]=0),255<x[B]&&(x[B]=255);return this};b.prototype.setOpacity=function(b){this.rgba[3]=b;return this};b.prototype.tweenTo=function(b,e){var x=this.rgba,w=b.rgba;w.length&&x&&x.length?(b=1!==w[3]||1!==x[3],e=(b?\"rgba(\":\"rgb(\")+Math.round(w[0]+\n(x[0]-w[0])*(1-e))+\",\"+Math.round(w[1]+(x[1]-w[1])*(1-e))+\",\"+Math.round(w[2]+(x[2]-w[2])*(1-e))+(b?\",\"+(w[3]+(x[3]-w[3])*(1-e)):\"\")+\")\"):e=b.input||\"none\";return e};b.names={white:\"#ffffff\",black:\"#000000\"};return b}();D.Color=b;D.color=b.parse;return b});O(e,\"Core/Color/Palette.js\",[],function(){return{colors:\"#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1\".split(\" \"),backgroundColor:\"#ffffff\",neutralColor100:\"#000000\",neutralColor80:\"#333333\",neutralColor60:\"#666666\",\nneutralColor40:\"#999999\",neutralColor20:\"#cccccc\",neutralColor10:\"#e6e6e6\",neutralColor5:\"#f2f2f2\",neutralColor3:\"#f7f7f7\",highlightColor100:\"#003399\",highlightColor80:\"#335cad\",highlightColor60:\"#6685c2\",highlightColor20:\"#ccd6eb\",highlightColor10:\"#e6ebf5\",positiveColor:\"#06b535\",negativeColor:\"#f21313\"}});O(e,\"Core/Time.js\",[e[\"Core/Globals.js\"],e[\"Core/Utilities.js\"]],function(e,b){var D=e.win,z=b.defined,H=b.error,G=b.extend,C=b.isObject,B=b.merge,x=b.objectEach,w=b.pad,v=b.pick,f=b.splat,d=\nb.timeUnits;\"\";b=function(){function q(d){this.options={};this.variableTimezone=this.useUTC=!1;this.Date=D.Date;this.getTimezoneOffset=this.timezoneOffsetFunction();this.update(d)}q.prototype.get=function(d,l){if(this.variableTimezone||this.timezoneOffset){var k=l.getTime(),u=k-this.getTimezoneOffset(l);l.setTime(u);d=l[\"getUTC\"+d]();l.setTime(k);return d}return this.useUTC?l[\"getUTC\"+d]():l[\"get\"+d]()};q.prototype.set=function(d,l,f){if(this.variableTimezone||this.timezoneOffset){if(\"Milliseconds\"===\nd||\"Seconds\"===d||\"Minutes\"===d&&0===this.getTimezoneOffset(l)%36E5)return l[\"setUTC\"+d](f);var u=this.getTimezoneOffset(l);u=l.getTime()-u;l.setTime(u);l[\"setUTC\"+d](f);d=this.getTimezoneOffset(l);u=l.getTime()+d;return l.setTime(u)}return this.useUTC?l[\"setUTC\"+d](f):l[\"set\"+d](f)};q.prototype.update=function(d){var l=v(d&&d.useUTC,!0);this.options=d=B(!0,this.options||{},d);this.Date=d.Date||D.Date||Date;this.timezoneOffset=(this.useUTC=l)&&d.timezoneOffset;this.getTimezoneOffset=this.timezoneOffsetFunction();\nthis.variableTimezone=l&&!(!d.getTimezoneOffset&&!d.timezone)};q.prototype.makeTime=function(d,l,f,u,n,q){if(this.useUTC){var k=this.Date.UTC.apply(0,arguments);var m=this.getTimezoneOffset(k);k+=m;var c=this.getTimezoneOffset(k);m!==c?k+=c-m:m-36E5!==this.getTimezoneOffset(k-36E5)||e.isSafari||(k-=36E5)}else k=(new this.Date(d,l,v(f,1),v(u,0),v(n,0),v(q,0))).getTime();return k};q.prototype.timezoneOffsetFunction=function(){var d=this,l=this.options,f=l.moment||D.moment;if(!this.useUTC)return function(d){return 6E4*\n(new Date(d.toString())).getTimezoneOffset()};if(l.timezone){if(f)return function(d){return 6E4*-f.tz(d,l.timezone).utcOffset()};H(25)}return this.useUTC&&l.getTimezoneOffset?function(d){return 6E4*l.getTimezoneOffset(d.valueOf())}:function(){return 6E4*(d.timezoneOffset||0)}};q.prototype.dateFormat=function(d,f,q){if(!z(f)||isNaN(f))return e.defaultOptions.lang&&e.defaultOptions.lang.invalidDate||\"\";d=v(d,\"%Y-%m-%d %H:%M:%S\");var l=this,n=new this.Date(f),k=this.get(\"Hours\",n),N=this.get(\"Day\",n),\nm=this.get(\"Date\",n),c=this.get(\"Month\",n),g=this.get(\"FullYear\",n),a=e.defaultOptions.lang,h=a&&a.weekdays,r=a&&a.shortWeekdays;n=G({a:r?r[N]:h[N].substr(0,3),A:h[N],d:w(m),e:w(m,2,\" \"),w:N,b:a.shortMonths[c],B:a.months[c],m:w(c+1),o:c+1,y:g.toString().substr(2,2),Y:g,H:w(k),k:k,I:w(k%12||12),l:k%12||12,M:w(this.get(\"Minutes\",n)),p:12>k?\"AM\":\"PM\",P:12>k?\"am\":\"pm\",S:w(n.getSeconds()),L:w(Math.floor(f%1E3),3)},e.dateFormats);x(n,function(a,c){for(;-1!==d.indexOf(\"%\"+c);)d=d.replace(\"%\"+c,\"function\"===\ntypeof a?a.call(l,f):a)});return q?d.substr(0,1).toUpperCase()+d.substr(1):d};q.prototype.resolveDTLFormat=function(d){return C(d,!0)?d:(d=f(d),{main:d[0],from:d[1],to:d[2]})};q.prototype.getTimeTicks=function(f,l,q,u){var n=this,k=[],N={};var m=new n.Date(l);var c=f.unitRange,g=f.count||1,a;u=v(u,1);if(z(l)){n.set(\"Milliseconds\",m,c>=d.second?0:g*Math.floor(n.get(\"Milliseconds\",m)/g));c>=d.second&&n.set(\"Seconds\",m,c>=d.minute?0:g*Math.floor(n.get(\"Seconds\",m)/g));c>=d.minute&&n.set(\"Minutes\",m,\nc>=d.hour?0:g*Math.floor(n.get(\"Minutes\",m)/g));c>=d.hour&&n.set(\"Hours\",m,c>=d.day?0:g*Math.floor(n.get(\"Hours\",m)/g));c>=d.day&&n.set(\"Date\",m,c>=d.month?1:Math.max(1,g*Math.floor(n.get(\"Date\",m)/g)));if(c>=d.month){n.set(\"Month\",m,c>=d.year?0:g*Math.floor(n.get(\"Month\",m)/g));var h=n.get(\"FullYear\",m)}c>=d.year&&n.set(\"FullYear\",m,h-h%g);c===d.week&&(h=n.get(\"Day\",m),n.set(\"Date\",m,n.get(\"Date\",m)-h+u+(h<u?-7:0)));h=n.get(\"FullYear\",m);u=n.get(\"Month\",m);var r=n.get(\"Date\",m),A=n.get(\"Hours\",m);\nl=m.getTime();!n.variableTimezone&&n.useUTC||!z(q)||(a=q-l>4*d.month||n.getTimezoneOffset(l)!==n.getTimezoneOffset(q));l=m.getTime();for(m=1;l<q;)k.push(l),l=c===d.year?n.makeTime(h+m*g,0):c===d.month?n.makeTime(h,u+m*g):!a||c!==d.day&&c!==d.week?a&&c===d.hour&&1<g?n.makeTime(h,u,r,A+m*g):l+c*g:n.makeTime(h,u,r+m*g*(c===d.day?1:7)),m++;k.push(l);c<=d.hour&&1E4>k.length&&k.forEach(function(a){0===a%18E5&&\"000000000\"===n.dateFormat(\"%H%M%S%L\",a)&&(N[a]=\"day\")})}k.info=G(f,{higherRanks:N,totalRange:c*\ng});return k};return q}();e.Time=b;return e.Time});O(e,\"Core/Options.js\",[e[\"Core/Globals.js\"],e[\"Core/Color/Color.js\"],e[\"Core/Color/Palette.js\"],e[\"Core/Time.js\"],e[\"Core/Utilities.js\"]],function(e,b,I,z,H){var D=e.isTouchDevice,C=e.svg;b=b.parse;var B=H.merge;\"\";var x={colors:I.colors,symbols:[\"circle\",\"diamond\",\"square\",\"triangle\",\"triangle-down\"],lang:{loading:\"Loading...\",months:\"January February March April May June July August September October November December\".split(\" \"),shortMonths:\"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\".split(\" \"),\nweekdays:\"Sunday Monday Tuesday Wednesday Thursday Friday Saturday\".split(\" \"),decimalPoint:\".\",numericSymbols:\"kMGTPE\".split(\"\"),resetZoom:\"Reset zoom\",resetZoomTitle:\"Reset zoom level 1:1\",thousandsSep:\" \"},global:{},time:{Date:void 0,getTimezoneOffset:void 0,timezone:void 0,timezoneOffset:0,useUTC:!0},chart:{panning:{enabled:!1,type:\"x\"},styledMode:!1,borderRadius:0,colorCount:10,defaultSeriesType:\"line\",ignoreHiddenSeries:!0,spacing:[10,10,15,10],resetZoomButton:{theme:{zIndex:6},position:{align:\"right\",\nx:-10,y:10}},zoomBySingleTouch:!1,width:null,height:null,borderColor:I.highlightColor80,backgroundColor:I.backgroundColor,plotBorderColor:I.neutralColor20},title:{text:\"Chart title\",align:\"center\",margin:15,widthAdjust:-44},subtitle:{text:\"\",align:\"center\",widthAdjust:-44},caption:{margin:15,text:\"\",align:\"left\",verticalAlign:\"bottom\"},plotOptions:{},labels:{style:{position:\"absolute\",color:I.neutralColor80}},legend:{enabled:!0,align:\"center\",alignColumns:!0,layout:\"horizontal\",labelFormatter:function(){return this.name},\nborderColor:I.neutralColor40,borderRadius:0,navigation:{activeColor:I.highlightColor100,inactiveColor:I.neutralColor20},itemStyle:{color:I.neutralColor80,cursor:\"pointer\",fontSize:\"12px\",fontWeight:\"bold\",textOverflow:\"ellipsis\"},itemHoverStyle:{color:I.neutralColor100},itemHiddenStyle:{color:I.neutralColor20},shadow:!1,itemCheckboxStyle:{position:\"absolute\",width:\"13px\",height:\"13px\"},squareSymbol:!0,symbolPadding:5,verticalAlign:\"bottom\",x:0,y:0,title:{style:{fontWeight:\"bold\"}}},loading:{labelStyle:{fontWeight:\"bold\",\nposition:\"relative\",top:\"45%\"},style:{position:\"absolute\",backgroundColor:I.backgroundColor,opacity:.5,textAlign:\"center\"}},tooltip:{enabled:!0,animation:C,borderRadius:3,dateTimeLabelFormats:{millisecond:\"%A, %b %e, %H:%M:%S.%L\",second:\"%A, %b %e, %H:%M:%S\",minute:\"%A, %b %e, %H:%M\",hour:\"%A, %b %e, %H:%M\",day:\"%A, %b %e, %Y\",week:\"Week from %A, %b %e, %Y\",month:\"%B %Y\",year:\"%Y\"},footerFormat:\"\",padding:8,snap:D?25:10,headerFormat:'<span style=\"font-size: 10px\">{point.key}</span><br/>',pointFormat:'<span style=\"color:{point.color}\">\\u25cf</span> {series.name}: <b>{point.y}</b><br/>',\nbackgroundColor:b(I.neutralColor3).setOpacity(.85).get(),borderWidth:1,shadow:!0,style:{color:I.neutralColor80,cursor:\"default\",fontSize:\"12px\",whiteSpace:\"nowrap\"}},credits:{enabled:!0,href:\"https://www.highcharts.com?credits\",position:{align:\"right\",x:-10,verticalAlign:\"bottom\",y:-5},style:{cursor:\"pointer\",color:I.neutralColor40,fontSize:\"9px\"},text:\"Highcharts.com\"}};x.chart.styledMode=!1;\"\";var w=new z(B(x.global,x.time));return{defaultOptions:x,defaultTime:w,getOptions:function(){return x},\nsetOptions:function(v){B(!0,x,v);if(v.time||v.global)e.time?e.time.update(B(x.global,x.time,v.global,v.time)):e.time=w;return x}}});O(e,\"Core/Animation/Fx.js\",[e[\"Core/Color/Color.js\"],e[\"Core/Globals.js\"],e[\"Core/Utilities.js\"]],function(e,b,I){var D=e.parse,H=b.win,G=I.isNumber,C=I.objectEach;return function(){function b(b,w,v){this.pos=NaN;this.options=w;this.elem=b;this.prop=v}b.prototype.dSetter=function(){var b=this.paths,w=b&&b[0];b=b&&b[1];var v=this.now||0,f=[];if(1!==v&&w&&b)if(w.length===\nb.length&&1>v)for(var d=0;d<b.length;d++){for(var q=w[d],k=b[d],l=[],N=0;N<k.length;N++){var u=q[N],n=k[N];G(u)&&G(n)&&(\"A\"!==k[0]||4!==N&&5!==N)?l[N]=u+v*(n-u):l[N]=n}f.push(l)}else f=b;else f=this.toD||[];this.elem.attr(\"d\",f,void 0,!0)};b.prototype.update=function(){var b=this.elem,w=this.prop,v=this.now,f=this.options.step;if(this[w+\"Setter\"])this[w+\"Setter\"]();else b.attr?b.element&&b.attr(w,v,null,!0):b.style[w]=v+this.unit;f&&f.call(b,v,this)};b.prototype.run=function(e,w,v){var f=this,d=f.options,\nq=function(d){return q.stopped?!1:f.step(d)},k=H.requestAnimationFrame||function(d){setTimeout(d,13)},l=function(){for(var d=0;d<b.timers.length;d++)b.timers[d]()||b.timers.splice(d--,1);b.timers.length&&k(l)};e!==w||this.elem[\"forceAnimate:\"+this.prop]?(this.startTime=+new Date,this.start=e,this.end=w,this.unit=v,this.now=this.start,this.pos=0,q.elem=this.elem,q.prop=this.prop,q()&&1===b.timers.push(q)&&k(l)):(delete d.curAnim[this.prop],d.complete&&0===Object.keys(d.curAnim).length&&d.complete.call(this.elem))};\nb.prototype.step=function(b){var w=+new Date,v=this.options,f=this.elem,d=v.complete,q=v.duration,k=v.curAnim;if(f.attr&&!f.element)b=!1;else if(b||w>=q+this.startTime){this.now=this.end;this.pos=1;this.update();var l=k[this.prop]=!0;C(k,function(d){!0!==d&&(l=!1)});l&&d&&d.call(f);b=!1}else this.pos=v.easing((w-this.startTime)/q),this.now=this.start+(this.end-this.start)*this.pos,this.update(),b=!0;return b};b.prototype.initPath=function(b,w,v){function f(d,m){for(;d.length<J;){var c=d[0],g=m[J-\nd.length];g&&\"M\"===c[0]&&(d[0]=\"C\"===g[0]?[\"C\",c[1],c[2],c[1],c[2],c[1],c[2]]:[\"L\",c[1],c[2]]);d.unshift(c);l&&(c=d.pop(),d.push(d[d.length-1],c))}}function d(d,m){for(;d.length<J;)if(m=d[Math.floor(d.length/N)-1].slice(),\"C\"===m[0]&&(m[1]=m[5],m[2]=m[6]),l){var c=d[Math.floor(d.length/N)].slice();d.splice(d.length/2,0,m,c)}else d.push(m)}var q=b.startX,k=b.endX;v=v.slice();var l=b.isArea,N=l?2:1;w=w&&w.slice();if(!w)return[v,v];if(q&&k&&k.length){for(b=0;b<q.length;b++)if(q[b]===k[0]){var u=b;break}else if(q[0]===\nk[k.length-q.length+b]){u=b;var n=!0;break}else if(q[q.length-1]===k[k.length-q.length+b]){u=q.length-b;break}\"undefined\"===typeof u&&(w=[])}if(w.length&&G(u)){var J=v.length+u*N;n?(f(w,v),d(v,w)):(f(v,w),d(w,v))}return[w,v]};b.prototype.fillSetter=function(){b.prototype.strokeSetter.apply(this,arguments)};b.prototype.strokeSetter=function(){this.elem.attr(this.prop,D(this.start).tweenTo(D(this.end),this.pos),null,!0)};b.timers=[];return b}()});O(e,\"Core/Animation/AnimationUtilities.js\",[e[\"Core/Animation/Fx.js\"],\ne[\"Core/Utilities.js\"]],function(e,b){function D(d){return x(d)?w({duration:500,defer:0},d):{duration:d?500:0,defer:0}}function z(d,f){for(var q=e.timers.length;q--;)e.timers[q].elem!==d||f&&f!==e.timers[q].prop||(e.timers[q].stopped=!0)}var H=b.defined,G=b.getStyle,C=b.isArray,B=b.isNumber,x=b.isObject,w=b.merge,v=b.objectEach,f=b.pick;return{animate:function(d,f,k){var l,q=\"\",u,n;if(!x(k)){var b=arguments;k={duration:b[2],easing:b[3],complete:b[4]}}B(k.duration)||(k.duration=400);k.easing=\"function\"===\ntypeof k.easing?k.easing:Math[k.easing]||Math.easeInOutSine;k.curAnim=w(f);v(f,function(b,m){z(d,m);n=new e(d,k,m);u=void 0;\"d\"===m&&C(f.d)?(n.paths=n.initPath(d,d.pathArray,f.d),n.toD=f.d,l=0,u=1):d.attr?l=d.attr(m):(l=parseFloat(G(d,m))||0,\"opacity\"!==m&&(q=\"px\"));u||(u=b);\"string\"===typeof u&&u.match(\"px\")&&(u=u.replace(/px/g,\"\"));n.run(l,u,q)})},animObject:D,getDeferredAnimation:function(d,f,b){var l=D(f),q=0,u=0;(b?[b]:d.series).forEach(function(d){d=D(d.options.animation);q=f&&H(f.defer)?l.defer:\nMath.max(q,d.duration+d.defer);u=Math.min(l.duration,d.duration)});d.renderer.forExport&&(q=0);return{defer:Math.max(0,q-u),duration:Math.min(q,u)}},setAnimation:function(d,q){q.renderer.globalAnimation=f(d,q.options.chart.animation,!0)},stop:z}});O(e,\"Core/Renderer/HTML/AST.js\",[e[\"Core/Globals.js\"],e[\"Core/Utilities.js\"]],function(e,b){var D=e.SVG_NS,z=b.attr,H=b.createElement,G=b.discardElement,C=b.error,B=b.isString,x=b.objectEach,w=b.splat;\"\";var v=!1;try{v=!!(new DOMParser).parseFromString(\"\",\n\"text/html\")}catch(f){}return function(){function f(d){this.nodes=\"string\"===typeof d?this.parseMarkup(d):d}f.filterUserAttributes=function(d){x(d,function(q,b){var l=!0;-1===f.allowedAttributes.indexOf(b)&&(l=!1);-1!==[\"background\",\"dynsrc\",\"href\",\"lowsrc\",\"src\"].indexOf(b)&&(l=B(q)&&f.allowedReferences.some(function(d){return 0===q.indexOf(d)}));l||(C(\"Highcharts warning: Invalid attribute '\"+b+\"' in config\"),delete d[b])});return d};f.setElementHTML=function(d,q){d.innerHTML=\"\";q&&(new f(q)).addToDOM(d)};\nf.prototype.addToDOM=function(d){function q(d,l){var b;w(d).forEach(function(d){var n=d.tagName,u=d.textContent?e.doc.createTextNode(d.textContent):void 0;if(n)if(\"#text\"===n)var k=u;else if(-1!==f.allowedTags.indexOf(n)){n=e.doc.createElementNS(\"svg\"===n?D:l.namespaceURI||D,n);var m=d.attributes||{};x(d,function(c,g){\"tagName\"!==g&&\"attributes\"!==g&&\"children\"!==g&&\"textContent\"!==g&&(m[g]=c)});z(n,f.filterUserAttributes(m));u&&n.appendChild(u);q(d.children||[],n);k=n}else C(\"Highcharts warning: Invalid tagName '\"+\nn+\"' in config\");k&&l.appendChild(k);b=k});return b}return q(this.nodes,d)};f.prototype.parseMarkup=function(d){var f=[];if(v)d=(new DOMParser).parseFromString(d,\"text/html\");else{var b=H(\"div\");b.innerHTML=d;d={body:b}}var l=function(d,f){var n=d.nodeName.toLowerCase(),b={tagName:n};if(\"#text\"===n){n=d.textContent||\"\";if(/^[\\s]*$/.test(n))return;b.textContent=n}if(n=d.attributes){var u={};[].forEach.call(n,function(c){u[c.name]=c.value});b.attributes=u}if(d.childNodes.length){var m=[];[].forEach.call(d.childNodes,\nfunction(c){l(c,m)});m.length&&(b.children=m)}f.push(b)};[].forEach.call(d.body.childNodes,function(d){return l(d,f)});b&&G(b);return f};f.allowedTags=\"a b br button caption circle clipPath code dd defs div dl dt em feComponentTransfer feFuncA feFuncB feFuncG feFuncR feGaussianBlur feOffset feMerge feMergeNode filter h1 h2 h3 h4 h5 h6 hr i img li linearGradient marker ol p path pattern pre rect small span stop strong style sub sup svg table text thead tbody tspan td th tr u ul #text\".split(\" \");f.allowedAttributes=\n\"aria-controls aria-describedby aria-expanded aria-haspopup aria-hidden aria-label aria-labelledby aria-live aria-pressed aria-readonly aria-roledescription aria-selected class clip-path color colspan cx cy d dx dy disabled fill height href id in markerHeight markerWidth offset opacity orient padding paddingLeft patternUnits r refX refY role scope slope src startOffset stdDeviation stroke stroke-linecap stroke-width style result rowspan summary target tabindex text-align textAnchor textLength type valign width x x1 x2 y y1 y2 zIndex\".split(\" \");\nf.allowedReferences=\"https:// http:// mailto: / ../ ./ #\".split(\" \");return f}()});O(e,\"Core/FormatUtilities.js\",[e[\"Core/Options.js\"],e[\"Core/Utilities.js\"]],function(e,b){function D(b,v,f,d){b=+b||0;v=+v;var q=z.lang,k=(b.toString().split(\".\")[1]||\"\").split(\"e\")[0].length,l=b.toString().split(\"e\"),N=v;if(-1===v)v=Math.min(k,20);else if(!C(v))v=2;else if(v&&l[1]&&0>l[1]){var u=v+ +l[1];0<=u?(l[0]=(+l[0]).toExponential(u).split(\"e\")[0],v=u):(l[0]=l[0].split(\".\")[0]||0,b=20>v?(l[0]*Math.pow(10,l[1])).toFixed(v):\n0,l[1]=0)}u=(Math.abs(l[1]?l[0]:b)+Math.pow(10,-Math.max(v,k)-1)).toFixed(v);k=String(x(u));var n=3<k.length?k.length%3:0;f=B(f,q.decimalPoint);d=B(d,q.thousandsSep);b=(0>b?\"-\":\"\")+(n?k.substr(0,n)+d:\"\");b=0>+l[1]&&!N?\"0\":b+k.substr(n).replace(/(\\d{3})(?=\\d)/g,\"$1\"+d);v&&(b+=f+u.slice(-v));l[1]&&0!==+b&&(b+=\"e\"+l[1]);return b}var z=e.defaultOptions,H=e.defaultTime,G=b.getNestedProperty,C=b.isNumber,B=b.pick,x=b.pInt;return{dateFormat:function(b,v,f){return H.dateFormat(b,v,f)},format:function(b,v,\nf){var d=\"{\",q=!1,k=/f$/,l=/\\.([0-9])/,N=z.lang,u=f&&f.time||H;f=f&&f.numberFormatter||D;for(var n=[];b;){var J=b.indexOf(d);if(-1===J)break;var E=b.slice(0,J);if(q){E=E.split(\":\");d=G(E.shift()||\"\",v);if(E.length&&\"number\"===typeof d)if(E=E.join(\":\"),k.test(E)){var m=parseInt((E.match(l)||[\"\",\"-1\"])[1],10);null!==d&&(d=f(d,m,N.decimalPoint,-1<E.indexOf(\",\")?N.thousandsSep:\"\"))}else d=u.dateFormat(E,d);n.push(d)}else n.push(E);b=b.slice(J+1);d=(q=!q)?\"}\":\"{\"}n.push(b);return n.join(\"\")},numberFormat:D}});\nO(e,\"Core/Renderer/SVG/SVGElement.js\",[e[\"Core/Animation/AnimationUtilities.js\"],e[\"Core/Renderer/HTML/AST.js\"],e[\"Core/Color/Color.js\"],e[\"Core/Globals.js\"],e[\"Core/Color/Palette.js\"],e[\"Core/Utilities.js\"]],function(e,b,I,z,H,G){var D=e.animate,B=e.animObject,x=e.stop,w=z.deg2rad,v=z.doc,f=z.noop,d=z.svg,q=z.SVG_NS,k=z.win,l=G.addEvent,N=G.attr,u=G.createElement,n=G.css,J=G.defined,E=G.erase,m=G.extend,c=G.fireEvent,g=G.isArray,a=G.isFunction,h=G.isNumber,r=G.isString,A=G.merge,y=G.objectEach,L=\nG.pick,P=G.pInt,R=G.syncTimeout,V=G.uniqueKey;e=function(){function e(){this.element=void 0;this.onEvents={};this.opacity=1;this.renderer=void 0;this.SVG_NS=q;this.symbolCustomAttribs=\"x y width height r start end innerR anchorX anchorY rounded\".split(\" \")}e.prototype._defaultGetter=function(a){a=L(this[a+\"Value\"],this[a],this.element?this.element.getAttribute(a):null,0);/^[\\-0-9\\.]+$/.test(a)&&(a=parseFloat(a));return a};e.prototype._defaultSetter=function(a,t,p){p.setAttribute(t,a)};e.prototype.add=\nfunction(a){var t=this.renderer,p=this.element;a&&(this.parentGroup=a);this.parentInverted=a&&a.inverted;\"undefined\"!==typeof this.textStr&&\"text\"===this.element.nodeName&&t.buildText(this);this.added=!0;if(!a||a.handleZ||this.zIndex)var c=this.zIndexSetter();c||(a?a.element:t.box).appendChild(p);if(this.onAdd)this.onAdd();return this};e.prototype.addClass=function(a,t){var p=t?\"\":this.attr(\"class\")||\"\";a=(a||\"\").split(/ /g).reduce(function(a,t){-1===p.indexOf(t)&&a.push(t);return a},p?[p]:[]).join(\" \");\na!==p&&this.attr(\"class\",a);return this};e.prototype.afterSetters=function(){this.doTransform&&(this.updateTransform(),this.doTransform=!1)};e.prototype.align=function(a,t,p){var c={},g=this.renderer,d=g.alignedObjects,F,h,K;if(a){if(this.alignOptions=a,this.alignByTranslate=t,!p||r(p))this.alignTo=F=p||\"renderer\",E(d,this),d.push(this),p=void 0}else a=this.alignOptions,t=this.alignByTranslate,F=this.alignTo;p=L(p,g[F],\"scrollablePlotBox\"===F?g.plotBox:void 0,g);F=a.align;var M=a.verticalAlign;g=\n(p.x||0)+(a.x||0);d=(p.y||0)+(a.y||0);\"right\"===F?h=1:\"center\"===F&&(h=2);h&&(g+=(p.width-(a.width||0))/h);c[t?\"translateX\":\"x\"]=Math.round(g);\"bottom\"===M?K=1:\"middle\"===M&&(K=2);K&&(d+=(p.height-(a.height||0))/K);c[t?\"translateY\":\"y\"]=Math.round(d);this[this.placed?\"animate\":\"attr\"](c);this.placed=!0;this.alignAttr=c;return this};e.prototype.alignSetter=function(a){var t={left:\"start\",center:\"middle\",right:\"end\"};t[a]&&(this.alignValue=a,this.element.setAttribute(\"text-anchor\",t[a]))};e.prototype.animate=\nfunction(a,t,p){var c=this,g=B(L(t,this.renderer.globalAnimation,!0));t=g.defer;L(v.hidden,v.msHidden,v.webkitHidden,!1)&&(g.duration=0);0!==g.duration?(p&&(g.complete=p),R(function(){c.element&&D(c,a,g)},t)):(this.attr(a,void 0,p),y(a,function(a,p){g.step&&g.step.call(this,a,{prop:p,pos:1,elem:this})},this));return this};e.prototype.applyTextOutline=function(a){var t=this.element;-1!==a.indexOf(\"contrast\")&&(a=a.replace(/contrast/g,this.renderer.getContrast(t.style.fill)));var p=a.split(\" \");a=p[p.length-\n1];if((p=p[0])&&\"none\"!==p&&z.svg){this.fakeTS=!0;this.ySetter=this.xSetter;p=p.replace(/(^[\\d\\.]+)(.*?)$/g,function(a,p,t){return 2*Number(p)+t});this.removeTextOutline();var c=v.createElementNS(q,\"tspan\");N(c,{\"class\":\"highcharts-text-outline\",fill:a,stroke:a,\"stroke-width\":p,\"stroke-linejoin\":\"round\"});[].forEach.call(t.childNodes,function(a){var p=a.cloneNode(!0);p.removeAttribute&&[\"fill\",\"stroke\",\"stroke-width\",\"stroke\"].forEach(function(a){return p.removeAttribute(a)});c.appendChild(p)});var g=\nv.createElementNS(q,\"tspan\");g.textContent=\"\\u200b\";[\"x\",\"y\"].forEach(function(a){var p=t.getAttribute(a);p&&g.setAttribute(a,p)});c.appendChild(g);t.insertBefore(c,t.firstChild)}};e.prototype.attr=function(a,t,p,c){var g=this.element,d=this.symbolCustomAttribs,h,r=this,K,m;if(\"string\"===typeof a&&\"undefined\"!==typeof t){var M=a;a={};a[M]=t}\"string\"===typeof a?r=(this[a+\"Getter\"]||this._defaultGetter).call(this,a,g):(y(a,function(p,t){K=!1;c||x(this,t);this.symbolName&&-1!==d.indexOf(t)&&(h||(this.symbolAttr(a),\nh=!0),K=!0);!this.rotation||\"x\"!==t&&\"y\"!==t||(this.doTransform=!0);K||(m=this[t+\"Setter\"]||this._defaultSetter,m.call(this,p,t,g),!this.styledMode&&this.shadows&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(t)&&this.updateShadows(t,p,m))},this),this.afterSetters());p&&p.call(this);return r};e.prototype.clip=function(a){return this.attr(\"clip-path\",a?\"url(\"+this.renderer.url+\"#\"+a.id+\")\":\"none\")};e.prototype.crisp=function(a,t){t=t||a.strokeWidth||0;var p=Math.round(t)%2/2;a.x=Math.floor(a.x||\nthis.x||0)+p;a.y=Math.floor(a.y||this.y||0)+p;a.width=Math.floor((a.width||this.width||0)-2*p);a.height=Math.floor((a.height||this.height||0)-2*p);J(a.strokeWidth)&&(a.strokeWidth=t);return a};e.prototype.complexColor=function(a,t,p){var d=this.renderer,h,r,F,m,K,M,f,b,l,n,u=[],q;c(this.renderer,\"complexColor\",{args:arguments},function(){a.radialGradient?r=\"radialGradient\":a.linearGradient&&(r=\"linearGradient\");if(r){F=a[r];K=d.gradients;M=a.stops;l=p.radialReference;g(F)&&(a[r]=F={x1:F[0],y1:F[1],\nx2:F[2],y2:F[3],gradientUnits:\"userSpaceOnUse\"});\"radialGradient\"===r&&l&&!J(F.gradientUnits)&&(m=F,F=A(F,d.getRadialAttr(l,m),{gradientUnits:\"userSpaceOnUse\"}));y(F,function(a,p){\"id\"!==p&&u.push(p,a)});y(M,function(a){u.push(a)});u=u.join(\",\");if(K[u])n=K[u].attr(\"id\");else{F.id=n=V();var c=K[u]=d.createElement(r).attr(F).add(d.defs);c.radAttr=m;c.stops=[];M.forEach(function(a){0===a[1].indexOf(\"rgba\")?(h=I.parse(a[1]),f=h.get(\"rgb\"),b=h.get(\"a\")):(f=a[1],b=1);a=d.createElement(\"stop\").attr({offset:a[0],\n\"stop-color\":f,\"stop-opacity\":b}).add(c);c.stops.push(a)})}q=\"url(\"+d.url+\"#\"+n+\")\";p.setAttribute(t,q);p.gradient=u;a.toString=function(){return q}}})};e.prototype.css=function(a){var t=this.styles,p={},c=this.element,g=[\"textOutline\",\"textOverflow\",\"width\"],h=\"\",F=!t;a&&a.color&&(a.fill=a.color);t&&y(a,function(a,c){t&&t[c]!==a&&(p[c]=a,F=!0)});if(F){t&&(a=m(t,p));if(a)if(null===a.width||\"auto\"===a.width)delete this.textWidth;else if(\"text\"===c.nodeName.toLowerCase()&&a.width)var r=this.textWidth=\nP(a.width);this.styles=a;r&&!d&&this.renderer.forExport&&delete a.width;if(c.namespaceURI===this.SVG_NS){var K=function(a,p){return\"-\"+p.toLowerCase()};y(a,function(a,p){-1===g.indexOf(p)&&(h+=p.replace(/([A-Z])/g,K)+\":\"+a+\";\")});h&&N(c,\"style\",h)}else n(c,a);this.added&&(\"text\"===this.element.nodeName&&this.renderer.buildText(this),a&&a.textOutline&&this.applyTextOutline(a.textOutline))}return this};e.prototype.dashstyleSetter=function(a){var t=this[\"stroke-width\"];\"inherit\"===t&&(t=1);if(a=a&&a.toLowerCase()){var p=\na.replace(\"shortdashdotdot\",\"3,1,1,1,1,1,\").replace(\"shortdashdot\",\"3,1,1,1\").replace(\"shortdot\",\"1,1,\").replace(\"shortdash\",\"3,1,\").replace(\"longdash\",\"8,3,\").replace(/dot/g,\"1,3,\").replace(\"dash\",\"4,3,\").replace(/,$/,\"\").split(\",\");for(a=p.length;a--;)p[a]=\"\"+P(p[a])*L(t,NaN);a=p.join(\",\").replace(/NaN/g,\"none\");this.element.setAttribute(\"stroke-dasharray\",a)}};e.prototype.destroy=function(){var a=this,t=a.element||{},p=a.renderer,c=t.ownerSVGElement,g=p.isSVG&&\"SPAN\"===t.nodeName&&a.parentGroup||\nvoid 0;t.onclick=t.onmouseout=t.onmouseover=t.onmousemove=t.point=null;x(a);if(a.clipPath&&c){var d=a.clipPath;[].forEach.call(c.querySelectorAll(\"[clip-path],[CLIP-PATH]\"),function(a){-1<a.getAttribute(\"clip-path\").indexOf(d.element.id)&&a.removeAttribute(\"clip-path\")});a.clipPath=d.destroy()}if(a.stops){for(c=0;c<a.stops.length;c++)a.stops[c].destroy();a.stops.length=0;a.stops=void 0}a.safeRemoveChild(t);for(p.styledMode||a.destroyShadows();g&&g.div&&0===g.div.childNodes.length;)t=g.parentGroup,\na.safeRemoveChild(g.div),delete g.div,g=t;a.alignTo&&E(p.alignedObjects,a);y(a,function(p,c){a[c]&&a[c].parentGroup===a&&a[c].destroy&&a[c].destroy();delete a[c]})};e.prototype.destroyShadows=function(){(this.shadows||[]).forEach(function(a){this.safeRemoveChild(a)},this);this.shadows=void 0};e.prototype.destroyTextPath=function(a,c){var p=a.getElementsByTagName(\"text\")[0];if(p){if(p.removeAttribute(\"dx\"),p.removeAttribute(\"dy\"),c.element.setAttribute(\"id\",\"\"),this.textPathWrapper&&p.getElementsByTagName(\"textPath\").length){for(a=\nthis.textPathWrapper.element.childNodes;a.length;)p.appendChild(a[0]);p.removeChild(this.textPathWrapper.element)}}else if(a.getAttribute(\"dx\")||a.getAttribute(\"dy\"))a.removeAttribute(\"dx\"),a.removeAttribute(\"dy\");this.textPathWrapper&&(this.textPathWrapper=this.textPathWrapper.destroy())};e.prototype.dSetter=function(a,c,p){g(a)&&(\"string\"===typeof a[0]&&(a=this.renderer.pathToSegments(a)),this.pathArray=a,a=a.reduce(function(a,p,c){return p&&p.join?(c?a+\" \":\"\")+p.join(\" \"):(p||\"\").toString()},\"\"));\n/(NaN| {2}|^$)/.test(a)&&(a=\"M 0 0\");this[c]!==a&&(p.setAttribute(c,a),this[c]=a)};e.prototype.fadeOut=function(a){var c=this;c.animate({opacity:0},{duration:L(a,150),complete:function(){c.attr({y:-9999}).hide()}})};e.prototype.fillSetter=function(a,c,p){\"string\"===typeof a?p.setAttribute(c,a):a&&this.complexColor(a,c,p)};e.prototype.getBBox=function(c,t){var p=this.renderer,g=this.element,d=this.styles,h=this.textStr,F=p.cache,r=p.cacheKeys,K=g.namespaceURI===this.SVG_NS;t=L(t,this.rotation,0);var A=\np.styledMode?g&&e.prototype.getStyle.call(g,\"font-size\"):d&&d.fontSize,f;if(J(h)){var b=h.toString();-1===b.indexOf(\"<\")&&(b=b.replace(/[0-9]/g,\"0\"));b+=[\"\",t,A,this.textWidth,d&&d.textOverflow,d&&d.fontWeight].join()}b&&!c&&(f=F[b]);if(!f){if(K||p.forExport){try{var y=this.fakeTS&&function(a){var p=g.querySelector(\".highcharts-text-outline\");p&&n(p,{display:a})};a(y)&&y(\"none\");f=g.getBBox?m({},g.getBBox()):{width:g.offsetWidth,height:g.offsetHeight};a(y)&&y(\"\")}catch(Y){\"\"}if(!f||0>f.width)f={width:0,\nheight:0}}else f=this.htmlGetBBox();p.isSVG&&(c=f.width,p=f.height,K&&(f.height=p={\"11px,17\":14,\"13px,20\":16}[d&&d.fontSize+\",\"+Math.round(p)]||p),t&&(d=t*w,f.width=Math.abs(p*Math.sin(d))+Math.abs(c*Math.cos(d)),f.height=Math.abs(p*Math.cos(d))+Math.abs(c*Math.sin(d))));if(b&&0<f.height){for(;250<r.length;)delete F[r.shift()];F[b]||r.push(b);F[b]=f}}return f};e.prototype.getStyle=function(a){return k.getComputedStyle(this.element||this,\"\").getPropertyValue(a)};e.prototype.hasClass=function(a){return-1!==\n(\"\"+this.attr(\"class\")).split(\" \").indexOf(a)};e.prototype.hide=function(a){a?this.attr({y:-9999}):this.attr({visibility:\"hidden\"});return this};e.prototype.htmlGetBBox=function(){return{height:0,width:0,x:0,y:0}};e.prototype.init=function(a,t){this.element=\"span\"===t?u(t):v.createElementNS(this.SVG_NS,t);this.renderer=a;c(this,\"afterInit\")};e.prototype.invert=function(a){this.inverted=a;this.updateTransform();return this};e.prototype.on=function(a,c){var p=this.onEvents;if(p[a])p[a]();p[a]=l(this.element,\na,c);return this};e.prototype.opacitySetter=function(a,c,p){this.opacity=a=Number(Number(a).toFixed(3));p.setAttribute(c,a)};e.prototype.removeClass=function(a){return this.attr(\"class\",(\"\"+this.attr(\"class\")).replace(r(a)?new RegExp(\"(^| )\"+a+\"( |$)\"):a,\" \").replace(/ +/g,\" \").trim())};e.prototype.removeTextOutline=function(){var a=this.element.querySelector(\"tspan.highcharts-text-outline\");a&&this.safeRemoveChild(a)};e.prototype.safeRemoveChild=function(a){var c=a.parentNode;c&&c.removeChild(a)};\ne.prototype.setRadialReference=function(a){var c=this.element.gradient&&this.renderer.gradients[this.element.gradient];this.element.radialReference=a;c&&c.radAttr&&c.animate(this.renderer.getRadialAttr(a,c.radAttr));return this};e.prototype.setTextPath=function(a,c){var p=this.element,t=this.text?this.text.element:p,g={textAnchor:\"text-anchor\"},d=!1,F=this.textPathWrapper,r=!F;c=A(!0,{enabled:!0,attributes:{dy:-5,startOffset:\"50%\",textAnchor:\"middle\"}},c);var K=b.filterUserAttributes(c.attributes);\nif(a&&c&&c.enabled){F&&null===F.element.parentNode?(r=!0,F=F.destroy()):F&&this.removeTextOutline.call(F.parentGroup);this.options&&this.options.padding&&(K.dx=-this.options.padding);F||(this.textPathWrapper=F=this.renderer.createElement(\"textPath\"),d=!0);var m=F.element;(c=a.element.getAttribute(\"id\"))||a.element.setAttribute(\"id\",c=V());if(r)for(t.setAttribute(\"y\",0),h(K.dx)&&t.setAttribute(\"x\",-K.dx),a=[].slice.call(t.childNodes),r=0;r<a.length;r++){var l=a[r];l.nodeType!==Node.TEXT_NODE&&\"tspan\"!==\nl.nodeName||m.appendChild(l)}d&&F&&F.add({element:t});m.setAttributeNS(\"http://www.w3.org/1999/xlink\",\"href\",this.renderer.url+\"#\"+c);J(K.dy)&&(m.parentNode.setAttribute(\"dy\",K.dy),delete K.dy);J(K.dx)&&(m.parentNode.setAttribute(\"dx\",K.dx),delete K.dx);y(K,function(a,p){m.setAttribute(g[p]||p,a)});p.removeAttribute(\"transform\");this.removeTextOutline.call(F);this.text&&!this.renderer.styledMode&&this.attr({fill:\"none\",\"stroke-width\":0});this.applyTextOutline=this.updateTransform=f}else F&&(delete this.updateTransform,\ndelete this.applyTextOutline,this.destroyTextPath(p,a),this.updateTransform(),this.options&&this.options.rotation&&this.applyTextOutline(this.options.style.textOutline));return this};e.prototype.shadow=function(a,c,p){var t=[],g=this.element,d=this.oldShadowOptions,h={color:H.neutralColor100,offsetX:1,offsetY:1,opacity:.15,width:3},r=!1,K;!0===a?K=h:\"object\"===typeof a&&(K=m(h,a));K&&(K&&d&&y(K,function(a,p){a!==d[p]&&(r=!0)}),r&&this.destroyShadows(),this.oldShadowOptions=K);if(!K)this.destroyShadows();\nelse if(!this.shadows){var A=K.opacity/K.width;var f=this.parentInverted?\"translate(-1,-1)\":\"translate(\"+K.offsetX+\", \"+K.offsetY+\")\";for(h=1;h<=K.width;h++){var b=g.cloneNode(!1);var l=2*K.width+1-2*h;N(b,{stroke:a.color||H.neutralColor100,\"stroke-opacity\":A*h,\"stroke-width\":l,transform:f,fill:\"none\"});b.setAttribute(\"class\",(b.getAttribute(\"class\")||\"\")+\" highcharts-shadow\");p&&(N(b,\"height\",Math.max(N(b,\"height\")-l,0)),b.cutHeight=l);c?c.element.appendChild(b):g.parentNode&&g.parentNode.insertBefore(b,\ng);t.push(b)}this.shadows=t}return this};e.prototype.show=function(a){return this.attr({visibility:a?\"inherit\":\"visible\"})};e.prototype.strokeSetter=function(a,c,p){this[c]=a;this.stroke&&this[\"stroke-width\"]?(e.prototype.fillSetter.call(this,this.stroke,\"stroke\",p),p.setAttribute(\"stroke-width\",this[\"stroke-width\"]),this.hasStroke=!0):\"stroke-width\"===c&&0===a&&this.hasStroke?(p.removeAttribute(\"stroke\"),this.hasStroke=!1):this.renderer.styledMode&&this[\"stroke-width\"]&&(p.setAttribute(\"stroke-width\",\nthis[\"stroke-width\"]),this.hasStroke=!0)};e.prototype.strokeWidth=function(){if(!this.renderer.styledMode)return this[\"stroke-width\"]||0;var a=this.getStyle(\"stroke-width\"),c=0;if(a.indexOf(\"px\")===a.length-2)c=P(a);else if(\"\"!==a){var p=v.createElementNS(q,\"rect\");N(p,{width:a,\"stroke-width\":0});this.element.parentNode.appendChild(p);c=p.getBBox().width;p.parentNode.removeChild(p)}return c};e.prototype.symbolAttr=function(a){var c=this;\"x y r start end width height innerR anchorX anchorY clockwise\".split(\" \").forEach(function(p){c[p]=\nL(a[p],c[p])});c.attr({d:c.renderer.symbols[c.symbolName](c.x,c.y,c.width,c.height,c)})};e.prototype.textSetter=function(a){a!==this.textStr&&(delete this.textPxLength,this.textStr=a,this.added&&this.renderer.buildText(this))};e.prototype.titleSetter=function(a){var c=this.element,p=c.getElementsByTagName(\"title\")[0]||v.createElementNS(this.SVG_NS,\"title\");c.insertBefore?c.insertBefore(p,c.firstChild):c.appendChild(p);p.textContent=String(L(a,\"\")).replace(/<[^>]*>/g,\"\").replace(/&lt;/g,\"<\").replace(/&gt;/g,\n\">\")};e.prototype.toFront=function(){var a=this.element;a.parentNode.appendChild(a);return this};e.prototype.translate=function(a,c){return this.attr({translateX:a,translateY:c})};e.prototype.updateShadows=function(a,c,p){var t=this.shadows;if(t)for(var g=t.length;g--;)p.call(t[g],\"height\"===a?Math.max(c-(t[g].cutHeight||0),0):\"d\"===a?this.d:c,a,t[g])};e.prototype.updateTransform=function(){var a=this.scaleX,c=this.scaleY,p=this.inverted,g=this.rotation,d=this.matrix,h=this.element,F=this.translateX||\n0,r=this.translateY||0;p&&(F+=this.width,r+=this.height);F=[\"translate(\"+F+\",\"+r+\")\"];J(d)&&F.push(\"matrix(\"+d.join(\",\")+\")\");p?F.push(\"rotate(90) scale(-1,1)\"):g&&F.push(\"rotate(\"+g+\" \"+L(this.rotationOriginX,h.getAttribute(\"x\"),0)+\" \"+L(this.rotationOriginY,h.getAttribute(\"y\")||0)+\")\");(J(a)||J(c))&&F.push(\"scale(\"+L(a,1)+\" \"+L(c,1)+\")\");F.length&&h.setAttribute(\"transform\",F.join(\" \"))};e.prototype.visibilitySetter=function(a,c,p){\"inherit\"===a?p.removeAttribute(c):this[c]!==a&&p.setAttribute(c,\na);this[c]=a};e.prototype.xGetter=function(a){\"circle\"===this.element.nodeName&&(\"x\"===a?a=\"cx\":\"y\"===a&&(a=\"cy\"));return this._defaultGetter(a)};e.prototype.zIndexSetter=function(a,c){var p=this.renderer,g=this.parentGroup,t=(g||p).element||p.box,d=this.element;p=t===p.box;var h=!1;var r=this.added;var K;J(a)?(d.setAttribute(\"data-z-index\",a),a=+a,this[c]===a&&(r=!1)):J(this[c])&&d.removeAttribute(\"data-z-index\");this[c]=a;if(r){(a=this.zIndex)&&g&&(g.handleZ=!0);c=t.childNodes;for(K=c.length-1;0<=\nK&&!h;K--){g=c[K];r=g.getAttribute(\"data-z-index\");var m=!J(r);if(g!==d)if(0>a&&m&&!p&&!K)t.insertBefore(d,c[K]),h=!0;else if(P(r)<=a||m&&(!J(a)||0<=a))t.insertBefore(d,c[K+1]||null),h=!0}h||(t.insertBefore(d,c[p?3:0]||null),h=!0)}return h};return e}();e.prototype[\"stroke-widthSetter\"]=e.prototype.strokeSetter;e.prototype.yGetter=e.prototype.xGetter;e.prototype.matrixSetter=e.prototype.rotationOriginXSetter=e.prototype.rotationOriginYSetter=e.prototype.rotationSetter=e.prototype.scaleXSetter=e.prototype.scaleYSetter=\ne.prototype.translateXSetter=e.prototype.translateYSetter=e.prototype.verticalAlignSetter=function(a,c){this[c]=a;this.doTransform=!0};\"\";return e});O(e,\"Core/Renderer/SVG/SVGLabel.js\",[e[\"Core/Renderer/SVG/SVGElement.js\"],e[\"Core/Utilities.js\"]],function(e,b){function D(b,f){C(b)?b!==this[f]&&(this[f]=b,this.updateTextPadding()):this[f]=void 0}var z=this&&this.__extends||function(){var b=function(f,d){b=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d,b){d.__proto__=b}||function(d,\nb){for(var f in b)b.hasOwnProperty(f)&&(d[f]=b[f])};return b(f,d)};return function(f,d){function q(){this.constructor=f}b(f,d);f.prototype=null===d?Object.create(d):(q.prototype=d.prototype,new q)}}(),H=b.defined,G=b.extend,C=b.isNumber,B=b.merge,x=b.pick,w=b.removeEvent;return function(b){function f(d,q,k,l,e,u,n,v,E,m){var c=b.call(this)||this;c.paddingSetter=D;c.paddingLeftSetter=D;c.paddingRightSetter=D;c.init(d,\"g\");c.textStr=q;c.x=k;c.y=l;c.anchorX=u;c.anchorY=n;c.baseline=E;c.className=m;\"button\"!==\nm&&c.addClass(\"highcharts-label\");m&&c.addClass(\"highcharts-\"+m);c.text=d.text(\"\",0,0,v).attr({zIndex:1});if(\"string\"===typeof e){var g=/^url\\((.*?)\\)$/.test(e);if(c.renderer.symbols[e]||g)c.symbolKey=e}c.bBox=f.emptyBBox;c.padding=3;c.baselineOffset=0;c.needsBox=d.styledMode||g;c.deferredAttr={};c.alignFactor=0;return c}z(f,b);f.prototype.alignSetter=function(d){d={left:0,center:.5,right:1}[d];d!==this.alignFactor&&(this.alignFactor=d,this.bBox&&C(this.xSetting)&&this.attr({x:this.xSetting}))};f.prototype.anchorXSetter=\nfunction(d,b){this.anchorX=d;this.boxAttr(b,Math.round(d)-this.getCrispAdjust()-this.xSetting)};f.prototype.anchorYSetter=function(d,b){this.anchorY=d;this.boxAttr(b,d-this.ySetting)};f.prototype.boxAttr=function(d,b){this.box?this.box.attr(d,b):this.deferredAttr[d]=b};f.prototype.css=function(d){if(d){var b={},k=void 0;d=B(d);f.textProps.forEach(function(f){\"undefined\"!==typeof d[f]&&(b[f]=d[f],delete d[f])});this.text.css(b);k=\"width\"in b;\"fontSize\"in b||\"fontWeight\"in b?this.updateTextPadding():\nk&&this.updateBoxSize()}return e.prototype.css.call(this,d)};f.prototype.destroy=function(){w(this.element,\"mouseenter\");w(this.element,\"mouseleave\");this.text&&this.text.destroy();this.box&&(this.box=this.box.destroy());e.prototype.destroy.call(this)};f.prototype.fillSetter=function(d,b){d&&(this.needsBox=!0);this.fill=d;this.boxAttr(b,d)};f.prototype.getBBox=function(){this.textStr&&0===this.bBox.width&&0===this.bBox.height&&this.updateBoxSize();var d=this.padding,b=x(this.paddingLeft,d);return{width:this.width,\nheight:this.height,x:this.bBox.x-b,y:this.bBox.y-d}};f.prototype.getCrispAdjust=function(){return this.renderer.styledMode&&this.box?this.box.strokeWidth()%2/2:(this[\"stroke-width\"]?parseInt(this[\"stroke-width\"],10):0)%2/2};f.prototype.heightSetter=function(d){this.heightSetting=d};f.prototype.on=function(d,b){var f=this,l=f.text,q=l&&\"SPAN\"===l.element.tagName?l:void 0;if(q){var u=function(l){(\"mouseenter\"===d||\"mouseleave\"===d)&&l.relatedTarget instanceof Element&&(f.element.compareDocumentPosition(l.relatedTarget)&\nNode.DOCUMENT_POSITION_CONTAINED_BY||q.element.compareDocumentPosition(l.relatedTarget)&Node.DOCUMENT_POSITION_CONTAINED_BY)||b.call(f.element,l)};q.on(d,u)}e.prototype.on.call(f,d,u||b);return f};f.prototype.onAdd=function(){var d=this.textStr;this.text.add(this);this.attr({text:H(d)?d:\"\",x:this.x,y:this.y});this.box&&H(this.anchorX)&&this.attr({anchorX:this.anchorX,anchorY:this.anchorY})};f.prototype.rSetter=function(d,b){this.boxAttr(b,d)};f.prototype.shadow=function(d){d&&!this.renderer.styledMode&&\n(this.updateBoxSize(),this.box&&this.box.shadow(d));return this};f.prototype.strokeSetter=function(d,b){this.stroke=d;this.boxAttr(b,d)};f.prototype[\"stroke-widthSetter\"]=function(d,b){d&&(this.needsBox=!0);this[\"stroke-width\"]=d;this.boxAttr(b,d)};f.prototype[\"text-alignSetter\"]=function(d){this.textAlign=d};f.prototype.textSetter=function(d){\"undefined\"!==typeof d&&this.text.attr({text:d});this.updateTextPadding()};f.prototype.updateBoxSize=function(){var d=this.text.element.style,b={},e=this.padding,\nl=this.bBox=C(this.widthSetting)&&C(this.heightSetting)&&!this.textAlign||!H(this.text.textStr)?f.emptyBBox:this.text.getBBox();this.width=this.getPaddedWidth();this.height=(this.heightSetting||l.height||0)+2*e;this.baselineOffset=e+Math.min(this.renderer.fontMetrics(d&&d.fontSize,this.text).b,l.height||Infinity);this.needsBox&&(this.box||(d=this.box=this.symbolKey?this.renderer.symbol(this.symbolKey):this.renderer.rect(),d.addClass((\"button\"===this.className?\"\":\"highcharts-label-box\")+(this.className?\n\" highcharts-\"+this.className+\"-box\":\"\")),d.add(this)),d=this.getCrispAdjust(),b.x=d,b.y=(this.baseline?-this.baselineOffset:0)+d,b.width=Math.round(this.width),b.height=Math.round(this.height),this.box.attr(G(b,this.deferredAttr)),this.deferredAttr={})};f.prototype.updateTextPadding=function(){var d=this.text;this.updateBoxSize();var b=this.baseline?0:this.baselineOffset,f=x(this.paddingLeft,this.padding);H(this.widthSetting)&&this.bBox&&(\"center\"===this.textAlign||\"right\"===this.textAlign)&&(f+=\n{center:.5,right:1}[this.textAlign]*(this.widthSetting-this.bBox.width));if(f!==d.x||b!==d.y)d.attr(\"x\",f),d.hasBoxWidthChanged&&(this.bBox=d.getBBox(!0)),\"undefined\"!==typeof b&&d.attr(\"y\",b);d.x=f;d.y=b};f.prototype.widthSetter=function(d){this.widthSetting=C(d)?d:void 0};f.prototype.getPaddedWidth=function(){var d=this.padding,b=x(this.paddingLeft,d);d=x(this.paddingRight,d);return(this.widthSetting||this.bBox.width||0)+b+d};f.prototype.xSetter=function(d){this.x=d;this.alignFactor&&(d-=this.alignFactor*\nthis.getPaddedWidth(),this[\"forceAnimate:x\"]=!0);this.xSetting=Math.round(d);this.attr(\"translateX\",this.xSetting)};f.prototype.ySetter=function(d){this.ySetting=this.y=Math.round(d);this.attr(\"translateY\",this.ySetting)};f.emptyBBox={width:0,height:0,x:0,y:0};f.textProps=\"color direction fontFamily fontSize fontStyle fontWeight lineHeight textAlign textDecoration textOutline textOverflow width\".split(\" \");return f}(e)});O(e,\"Core/Renderer/SVG/TextBuilder.js\",[e[\"Core/Globals.js\"],e[\"Core/Utilities.js\"],\ne[\"Core/Renderer/HTML/AST.js\"]],function(e,b,I){var D=e.doc,H=e.SVG_NS,G=b.attr,C=b.isString,B=b.objectEach,x=b.pick;return function(){function b(b){var f=b.styles;this.renderer=b.renderer;this.svgElement=b;this.width=b.textWidth;this.textLineHeight=f&&f.lineHeight;this.textOutline=f&&f.textOutline;this.ellipsis=!(!f||\"ellipsis\"!==f.textOverflow);this.noWrap=!(!f||\"nowrap\"!==f.whiteSpace);this.fontSize=f&&f.fontSize}b.prototype.buildSVG=function(){var b=this.svgElement,f=b.element,d=b.renderer,e=\nx(b.textStr,\"\").toString(),k=-1!==e.indexOf(\"<\"),l=f.childNodes,N=l.length;d=this.width&&!b.added&&d.box;var u=/<br.*?>/g;var n=[e,this.ellipsis,this.noWrap,this.textLineHeight,this.textOutline,this.fontSize,this.width].join();if(n!==b.textCache){b.textCache=n;for(delete b.actualWidth;N--;)f.removeChild(l[N]);k||this.ellipsis||this.width||-1!==e.indexOf(\" \")&&(!this.noWrap||u.test(e))?\"\"!==e&&(d&&d.appendChild(f),e=new I(e),this.modifyTree(e.nodes),e.addToDOM(b.element),this.modifyDOM(),this.ellipsis&&\n-1!==(f.textContent||\"\").indexOf(\"\\u2026\")&&b.attr(\"title\",this.unescapeEntities(b.textStr||\"\",[\"&lt;\",\"&gt;\"])),d&&d.removeChild(f)):f.appendChild(D.createTextNode(this.unescapeEntities(e)));C(this.textOutline)&&b.applyTextOutline&&b.applyTextOutline(this.textOutline)}};b.prototype.modifyDOM=function(){var b=this,f=this.svgElement,d=G(f.element,\"x\");[].forEach.call(f.element.querySelectorAll(\"tspan.highcharts-br\"),function(f){f.nextSibling&&f.previousSibling&&G(f,{dy:b.getLineHeight(f.nextSibling),\nx:d})});var e=this.width||0;if(e){var k=function(l,u){var n=l.textContent||\"\",k=n.replace(/([^\\^])-/g,\"$1- \").split(\" \"),q=!b.noWrap&&(1<k.length||1<f.element.childNodes.length),m=b.getLineHeight(u),c=0,g=f.actualWidth;if(b.ellipsis)n&&b.truncate(l,n,void 0,0,Math.max(0,e-parseInt(b.fontSize||12,10)),function(a,c){return a.substring(0,c)+\"\\u2026\"});else if(q){n=[];for(q=[];u.firstChild&&u.firstChild!==l;)q.push(u.firstChild),u.removeChild(u.firstChild);for(;k.length;)k.length&&!b.noWrap&&0<c&&(n.push(l.textContent||\n\"\"),l.textContent=k.join(\" \").replace(/- /g,\"-\")),b.truncate(l,void 0,k,0===c?g||0:0,e,function(a,c){return k.slice(0,c).join(\" \").replace(/- /g,\"-\")}),g=f.actualWidth,c++;q.forEach(function(a){u.insertBefore(a,l)});n.forEach(function(a){u.insertBefore(D.createTextNode(a),l);a=D.createElementNS(H,\"tspan\");a.textContent=\"\\u200b\";G(a,{dy:m,x:d});u.insertBefore(a,l)})}},l=function(d){[].slice.call(d.childNodes).forEach(function(b){b.nodeType===Node.TEXT_NODE?k(b,d):(-1!==b.className.baseVal.indexOf(\"highcharts-br\")&&\n(f.actualWidth=0),l(b))})};l(f.element)}};b.prototype.getLineHeight=function(b){var f;b=b.nodeType===Node.TEXT_NODE?b.parentElement:b;this.renderer.styledMode||(f=b&&/(px|em)$/.test(b.style.fontSize)?b.style.fontSize:this.fontSize||this.renderer.style.fontSize||12);return this.textLineHeight?parseInt(this.textLineHeight.toString(),10):this.renderer.fontMetrics(f,b||this.svgElement.element).h};b.prototype.modifyTree=function(b){var f=this,d=function(e,k){var l=e.tagName,q=f.renderer.styledMode,u=e.attributes||\n{};if(\"b\"===l||\"strong\"===l)q?u[\"class\"]=\"highcharts-strong\":u.style=\"font-weight:bold;\"+(u.style||\"\");else if(\"i\"===l||\"em\"===l)q?u[\"class\"]=\"highcharts-emphasized\":u.style=\"font-style:italic;\"+(u.style||\"\");C(u.style)&&(u.style=u.style.replace(/(;| |^)color([ :])/,\"$1fill$2\"));\"br\"===l&&(u[\"class\"]=\"highcharts-br\",e.textContent=\"\\u200b\",(k=b[k+1])&&k.textContent&&(k.textContent=k.textContent.replace(/^ +/gm,\"\")));\"#text\"!==l&&\"a\"!==l&&(e.tagName=\"tspan\");e.attributes=u;e.children&&e.children.filter(function(d){return\"#text\"!==\nd.tagName}).forEach(d)};for(b.forEach(d);b[0]&&\"tspan\"===b[0].tagName&&!b[0].children;)b.splice(0,1)};b.prototype.truncate=function(b,f,d,e,k,l){var q=this.svgElement,u=q.renderer,n=q.rotation,J=[],E=d?1:0,m=(f||d||\"\").length,c=m,g,a=function(a,c){c=c||a;var g=b.parentNode;if(g&&\"undefined\"===typeof J[c])if(g.getSubStringLength)try{J[c]=e+g.getSubStringLength(0,d?c+1:c)}catch(L){\"\"}else u.getSpanWidth&&(b.textContent=l(f||d,a),J[c]=e+u.getSpanWidth(q,b));return J[c]};q.rotation=0;var h=a(b.textContent.length);\nif(e+h>k){for(;E<=m;)c=Math.ceil((E+m)/2),d&&(g=l(d,c)),h=a(c,g&&g.length-1),E===m?E=m+1:h>k?m=c-1:E=c;0===m?b.textContent=\"\":f&&m===f.length-1||(b.textContent=g||l(f||d,c))}d&&d.splice(0,c);q.actualWidth=h;q.rotation=n};b.prototype.unescapeEntities=function(b,f){B(this.renderer.escapes,function(d,e){f&&-1!==f.indexOf(d)||(b=b.toString().replace(new RegExp(d,\"g\"),e))});return b};return b}()});O(e,\"Core/Renderer/SVG/SVGRenderer.js\",[e[\"Core/Color/Color.js\"],e[\"Core/Globals.js\"],e[\"Core/Color/Palette.js\"],\ne[\"Core/Renderer/SVG/SVGElement.js\"],e[\"Core/Renderer/SVG/SVGLabel.js\"],e[\"Core/Renderer/HTML/AST.js\"],e[\"Core/Renderer/SVG/TextBuilder.js\"],e[\"Core/Utilities.js\"]],function(e,b,I,z,H,G,C,B){var x=B.addEvent,w=B.attr,v=B.createElement,f=B.css,d=B.defined,q=B.destroyObjectProperties,k=B.extend,l=B.isArray,N=B.isNumber,u=B.isObject,n=B.isString,J=B.merge,E=B.pick,m=B.pInt,c=B.uniqueKey,g=b.charts,a=b.deg2rad,h=b.doc,r=b.isFirefox,A=b.isMS,y=b.isWebKit,L=b.noop,P=b.SVG_NS,R=b.symbolSizes,V=b.win,Q;B=\nfunction(){function t(a,c,g,t,d,h,r){this.width=this.url=this.style=this.isSVG=this.imgCount=this.height=this.gradients=this.globalAnimation=this.defs=this.chartIndex=this.cacheKeys=this.cache=this.boxWrapper=this.box=this.alignedObjects=void 0;this.init(a,c,g,t,d,h,r)}t.prototype.init=function(a,c,g,t,d,b,K){var p=this.createElement(\"svg\").attr({version:\"1.1\",\"class\":\"highcharts-root\"});K||p.css(this.getStyle(t));t=p.element;a.appendChild(t);w(a,\"dir\",\"ltr\");-1===a.innerHTML.indexOf(\"xmlns\")&&w(t,\n\"xmlns\",this.SVG_NS);this.isSVG=!0;this.box=t;this.boxWrapper=p;this.alignedObjects=[];this.url=this.getReferenceURL();this.createElement(\"desc\").add().element.appendChild(h.createTextNode(\"Created with Highcharts 9.1.0\"));this.defs=this.createElement(\"defs\").add();this.allowHTML=b;this.forExport=d;this.styledMode=K;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(c,g,!1);var F;r&&a.getBoundingClientRect&&(c=function(){f(a,{left:0,top:0});F=a.getBoundingClientRect();\nf(a,{left:Math.ceil(F.left)-F.left+\"px\",top:Math.ceil(F.top)-F.top+\"px\"})},c(),this.unSubPixelFix=x(V,\"resize\",c))};t.prototype.definition=function(a){return(new G([a])).addToDOM(this.defs.element)};t.prototype.getReferenceURL=function(){if((r||y)&&h.getElementsByTagName(\"base\").length){if(!d(Q)){var a=c();a=(new G([{tagName:\"svg\",attributes:{width:8,height:8},children:[{tagName:\"defs\",children:[{tagName:\"clipPath\",attributes:{id:a},children:[{tagName:\"rect\",attributes:{width:4,height:4}}]}]},{tagName:\"rect\",\nattributes:{id:\"hitme\",width:8,height:8,\"clip-path\":\"url(#\"+a+\")\",fill:\"rgba(0,0,0,0.001)\"}}]}])).addToDOM(h.body);f(a,{position:\"fixed\",top:0,left:0,zIndex:9E5});var g=h.elementFromPoint(6,6);Q=\"hitme\"===(g&&g.id);h.body.removeChild(a)}if(Q)return V.location.href.split(\"#\")[0].replace(/<[^>]*>/g,\"\").replace(/([\\('\\)])/g,\"\\\\$1\").replace(/ /g,\"%20\")}return\"\"};t.prototype.getStyle=function(a){return this.style=k({fontFamily:'\"Lucida Grande\", \"Lucida Sans Unicode\", Arial, Helvetica, sans-serif',fontSize:\"12px\"},\na)};t.prototype.setStyle=function(a){this.boxWrapper.css(this.getStyle(a))};t.prototype.isHidden=function(){return!this.boxWrapper.getBBox().width};t.prototype.destroy=function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();q(this.gradients||{});this.gradients=null;a&&(this.defs=a.destroy());this.unSubPixelFix&&this.unSubPixelFix();return this.alignedObjects=null};t.prototype.createElement=function(a){var c=new this.Element;c.init(this,a);return c};t.prototype.getRadialAttr=\nfunction(a,c){return{cx:a[0]-a[2]/2+(c.cx||0)*a[2],cy:a[1]-a[2]/2+(c.cy||0)*a[2],r:(c.r||0)*a[2]}};t.prototype.buildText=function(a){(new C(a)).buildSVG()};t.prototype.getContrast=function(a){a=e.parse(a).rgba;a[0]*=1;a[1]*=1.2;a[2]*=.5;return 459<a[0]+a[1]+a[2]?\"#000000\":\"#FFFFFF\"};t.prototype.button=function(a,c,g,t,d,h,r,b,m,f){var p=this.label(a,c,g,m,void 0,void 0,f,void 0,\"button\"),F=0,K=this.styledMode,y=d?J(d):{};a=y&&y.style||{};y=G.filterUserAttributes(y);p.attr(J({padding:8,r:2},y));if(!K){y=\nJ({fill:I.neutralColor3,stroke:I.neutralColor20,\"stroke-width\":1,style:{color:I.neutralColor80,cursor:\"pointer\",fontWeight:\"normal\"}},{style:a},y);var l=y.style;delete y.style;h=J(y,{fill:I.neutralColor10},G.filterUserAttributes(h||{}));var S=h.style;delete h.style;r=J(y,{fill:I.highlightColor10,style:{color:I.neutralColor100,fontWeight:\"bold\"}},G.filterUserAttributes(r||{}));var u=r.style;delete r.style;b=J(y,{style:{color:I.neutralColor20}},G.filterUserAttributes(b||{}));var n=b.style;delete b.style}x(p.element,\nA?\"mouseover\":\"mouseenter\",function(){3!==F&&p.setState(1)});x(p.element,A?\"mouseout\":\"mouseleave\",function(){3!==F&&p.setState(F)});p.setState=function(a){1!==a&&(p.state=F=a);p.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/).addClass(\"highcharts-button-\"+[\"normal\",\"hover\",\"pressed\",\"disabled\"][a||0]);K||p.attr([y,h,r,b][a||0]).css([l,S,u,n][a||0])};K||p.attr(y).css(k({cursor:\"default\"},l));return p.on(\"touchstart\",function(a){return a.stopPropagation()}).on(\"click\",function(a){3!==\nF&&t.call(p,a)})};t.prototype.crispLine=function(a,c,g){void 0===g&&(g=\"round\");var p=a[0],t=a[1];p[1]===t[1]&&(p[1]=t[1]=Math[g](p[1])-c%2/2);p[2]===t[2]&&(p[2]=t[2]=Math[g](p[2])+c%2/2);return a};t.prototype.path=function(a){var c=this.styledMode?{}:{fill:\"none\"};l(a)?c.d=a:u(a)&&k(c,a);return this.createElement(\"path\").attr(c)};t.prototype.circle=function(a,c,g){a=u(a)?a:\"undefined\"===typeof a?{}:{x:a,y:c,r:g};c=this.createElement(\"circle\");c.xSetter=c.ySetter=function(a,c,p){p.setAttribute(\"c\"+\nc,a)};return c.attr(a)};t.prototype.arc=function(a,c,g,t,d,h){u(a)?(t=a,c=t.y,g=t.r,a=t.x):t={innerR:t,start:d,end:h};a=this.symbol(\"arc\",a,c,g,g,t);a.r=g;return a};t.prototype.rect=function(a,c,g,t,d,h){d=u(a)?a.r:d;var p=this.createElement(\"rect\");a=u(a)?a:\"undefined\"===typeof a?{}:{x:a,y:c,width:Math.max(g,0),height:Math.max(t,0)};this.styledMode||(\"undefined\"!==typeof h&&(a[\"stroke-width\"]=h,a=p.crisp(a)),a.fill=\"none\");d&&(a.r=d);p.rSetter=function(a,c,g){p.r=a;w(g,{rx:a,ry:a})};p.rGetter=function(){return p.r||\n0};return p.attr(a)};t.prototype.setSize=function(a,c,g){this.width=a;this.height=c;this.boxWrapper.animate({width:a,height:c},{step:function(){this.attr({viewBox:\"0 0 \"+this.attr(\"width\")+\" \"+this.attr(\"height\")})},duration:E(g,!0)?void 0:0});this.alignElements()};t.prototype.g=function(a){var c=this.createElement(\"g\");return a?c.attr({\"class\":\"highcharts-\"+a}):c};t.prototype.image=function(a,c,g,t,d,h){var p={preserveAspectRatio:\"none\"},r=function(a,c){a.setAttributeNS?a.setAttributeNS(\"http://www.w3.org/1999/xlink\",\n\"href\",c):a.setAttribute(\"hc-svg-href\",c)},F=function(c){r(b.element,a);h.call(b,c)};1<arguments.length&&k(p,{x:c,y:g,width:t,height:d});var b=this.createElement(\"image\").attr(p);h?(r(b.element,\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\"),p=new V.Image,x(p,\"load\",F),p.src=a,p.complete&&F({})):r(b.element,a);return b};t.prototype.symbol=function(a,c,t,r,F,b){var p=this,m=/^url\\((.*?)\\)$/,A=m.test(a),y=!A&&(this.symbols[a]?a:\"circle\"),l=y&&this.symbols[y],u;if(l){\"number\"===\ntypeof c&&(u=l.call(this.symbols,Math.round(c||0),Math.round(t||0),r||0,F||0,b));var n=this.path(u);p.styledMode||n.attr(\"fill\",\"none\");k(n,{symbolName:y,x:c,y:t,width:r,height:F});b&&k(n,b)}else if(A){var e=a.match(m)[1];n=this.image(e);n.imgwidth=E(R[e]&&R[e].width,b&&b.width);n.imgheight=E(R[e]&&R[e].height,b&&b.height);var S=function(){n.attr({width:n.width,height:n.height})};[\"width\",\"height\"].forEach(function(a){n[a+\"Setter\"]=function(a,c){var p=this[\"img\"+c];this[c]=a;d(p)&&(b&&\"within\"===\nb.backgroundSize&&this.width&&this.height&&(p=Math.round(p*Math.min(this.width/this.imgwidth,this.height/this.imgheight))),this.element&&this.element.setAttribute(c,p),this.alignByTranslate||(a=((this[c]||0)-p)/2,this.attr(\"width\"===c?{translateX:a}:{translateY:a})))}});d(c)&&n.attr({x:c,y:t});n.isImg=!0;d(n.imgwidth)&&d(n.imgheight)?S():(n.attr({width:0,height:0}),v(\"img\",{onload:function(){var a=g[p.chartIndex];0===this.width&&(f(this,{position:\"absolute\",top:\"-999em\"}),h.body.appendChild(this));\nR[e]={width:this.width,height:this.height};n.imgwidth=this.width;n.imgheight=this.height;n.element&&S();this.parentNode&&this.parentNode.removeChild(this);p.imgCount--;if(!p.imgCount&&a&&!a.hasLoaded)a.onload()},src:e}),this.imgCount++)}return n};t.prototype.clipRect=function(a,g,t,d){var p=c()+\"-\",h=this.createElement(\"clipPath\").attr({id:p}).add(this.defs);a=this.rect(a,g,t,d,0).add(h);a.id=p;a.clipPath=h;a.count=0;return a};t.prototype.text=function(a,c,g,t){var p={};if(t&&(this.allowHTML||!this.forExport))return this.html(a,\nc,g);p.x=Math.round(c||0);g&&(p.y=Math.round(g));d(a)&&(p.text=a);a=this.createElement(\"text\").attr(p);t||(a.xSetter=function(a,c,p){var g=p.getElementsByTagName(\"tspan\"),t=p.getAttribute(c),d;for(d=0;d<g.length;d++){var h=g[d];h.getAttribute(c)===t&&h.setAttribute(c,a)}p.setAttribute(c,a)});return a};t.prototype.fontMetrics=function(a,c){a=!this.styledMode&&/px/.test(a)||!V.getComputedStyle?a||c&&c.style&&c.style.fontSize||this.style&&this.style.fontSize:c&&z.prototype.getStyle.call(c,\"font-size\");\na=/px/.test(a)?m(a):12;c=24>a?a+3:Math.round(1.2*a);return{h:c,b:Math.round(.8*c),f:a}};t.prototype.rotCorr=function(c,g,t){var p=c;g&&t&&(p=Math.max(p*Math.cos(g*a),4));return{x:-c/3*Math.sin(g*a),y:p}};t.prototype.pathToSegments=function(a){for(var c=[],g=[],p={A:8,C:7,H:2,L:3,M:3,Q:5,S:5,T:3,V:2},t=0;t<a.length;t++)n(g[0])&&N(a[t])&&g.length===p[g[0].toUpperCase()]&&a.splice(t,0,g[0].replace(\"M\",\"L\").replace(\"m\",\"l\")),\"string\"===typeof a[t]&&(g.length&&c.push(g.slice(0)),g.length=0),g.push(a[t]);\nc.push(g.slice(0));return c};t.prototype.label=function(a,c,g,t,d,h,r,b,m){return new H(this,a,c,g,t,d,h,r,b,m)};t.prototype.alignElements=function(){this.alignedObjects.forEach(function(a){return a.align()})};return t}();B.prototype.Element=z;B.prototype.SVG_NS=P;B.prototype.draw=L;B.prototype.escapes={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",\"'\":\"&#39;\",'\"':\"&quot;\"};var M=function(a,c,g,d,h){h=h&&h.r||0;return[[\"M\",a+h,c],[\"L\",a+g-h,c],[\"C\",a+g,c,a+g,c,a+g,c+h],[\"L\",a+g,c+d-h],[\"C\",a+g,c+d,a+g,c+d,a+\ng-h,c+d],[\"L\",a+h,c+d],[\"C\",a,c+d,a,c+d,a,c+d-h],[\"L\",a,c+h],[\"C\",a,c,a,c,a+h,c]]};L=function(a,c,g,d,h){return h&&h.r?M(a,c,g,d,h):[[\"M\",a,c],[\"L\",a+g,c],[\"L\",a+g,c+d],[\"L\",a,c+d],[\"Z\"]]};B.prototype.symbols={circle:function(a,c,g,d){return this.arc(a+g/2,c+d/2,g/2,d/2,{start:.5*Math.PI,end:2.5*Math.PI,open:!1})},rect:L,square:L,triangle:function(a,c,g,d){return[[\"M\",a+g/2,c],[\"L\",a+g,c+d],[\"L\",a,c+d],[\"Z\"]]},\"triangle-down\":function(a,c,g,d){return[[\"M\",a,c],[\"L\",a+g,c],[\"L\",a+g/2,c+d],[\"Z\"]]},\ndiamond:function(a,c,g,d){return[[\"M\",a+g/2,c],[\"L\",a+g,c+d/2],[\"L\",a+g/2,c+d],[\"L\",a,c+d/2],[\"Z\"]]},arc:function(a,c,g,h,r){var t=[];if(r){var p=r.start||0,b=E(r.r,g);g=E(r.r,h||g);var m=(r.end||0)-.001;h=r.innerR;var f=E(r.open,.001>Math.abs((r.end||0)-p-2*Math.PI)),A=Math.cos(p),y=Math.sin(p),l=Math.cos(m),n=Math.sin(m);p=E(r.longArc,.001>m-p-Math.PI?0:1);t.push([\"M\",a+b*A,c+g*y],[\"A\",b,g,0,p,E(r.clockwise,1),a+b*l,c+g*n]);d(h)&&t.push(f?[\"M\",a+h*l,c+h*n]:[\"L\",a+h*l,c+h*n],[\"A\",h,h,0,p,d(r.clockwise)?\n1-r.clockwise:0,a+h*A,c+h*y]);f||t.push([\"Z\"])}return t},callout:function(a,c,g,d,h){var p=Math.min(h&&h.r||0,g,d),t=p+6,r=h&&h.anchorX;h=h&&h.anchorY||0;var b=M(a,c,g,d,{r:p});if(!N(r))return b;a+r>=g?h>c+t&&h<c+d-t?b.splice(3,1,[\"L\",a+g,h-6],[\"L\",a+g+6,h],[\"L\",a+g,h+6],[\"L\",a+g,c+d-p]):b.splice(3,1,[\"L\",a+g,d/2],[\"L\",r,h],[\"L\",a+g,d/2],[\"L\",a+g,c+d-p]):0>=a+r?h>c+t&&h<c+d-t?b.splice(7,1,[\"L\",a,h+6],[\"L\",a-6,h],[\"L\",a,h-6],[\"L\",a,c+p]):b.splice(7,1,[\"L\",a,d/2],[\"L\",r,h],[\"L\",a,d/2],[\"L\",a,c+p]):\nh&&h>d&&r>a+t&&r<a+g-t?b.splice(5,1,[\"L\",r+6,c+d],[\"L\",r,c+d+6],[\"L\",r-6,c+d],[\"L\",a+p,c+d]):h&&0>h&&r>a+t&&r<a+g-t&&b.splice(1,1,[\"L\",r-6,c],[\"L\",r,c-6],[\"L\",r+6,c],[\"L\",g-p,c]);return b}};b.SVGRenderer=B;b.Renderer=b.SVGRenderer;return b.Renderer});O(e,\"Core/Renderer/HTML/HTMLElement.js\",[e[\"Core/Globals.js\"],e[\"Core/Renderer/SVG/SVGElement.js\"],e[\"Core/Utilities.js\"]],function(e,b,I){var D=e.isFirefox,H=e.isMS,G=e.isWebKit,C=e.win,B=I.css,x=I.defined,w=I.extend,v=I.pick,f=I.pInt;w(b.prototype,\n{htmlCss:function(d){var b=\"SPAN\"===this.element.tagName&&d&&\"width\"in d,f=v(b&&d.width,void 0);if(b){delete d.width;this.textWidth=f;var l=!0}d&&\"ellipsis\"===d.textOverflow&&(d.whiteSpace=\"nowrap\",d.overflow=\"hidden\");this.styles=w(this.styles,d);B(this.element,d);l&&this.htmlUpdateTransform();return this},htmlGetBBox:function(){var d=this.element;return{x:d.offsetLeft,y:d.offsetTop,width:d.offsetWidth,height:d.offsetHeight}},htmlUpdateTransform:function(){if(this.added){var d=this.renderer,b=this.element,\ne=this.translateX||0,l=this.translateY||0,N=this.x||0,u=this.y||0,n=this.textAlign||\"left\",J={left:0,center:.5,right:1}[n],E=this.styles;E=E&&E.whiteSpace;B(b,{marginLeft:e,marginTop:l});!d.styledMode&&this.shadows&&this.shadows.forEach(function(a){B(a,{marginLeft:e+1,marginTop:l+1})});this.inverted&&[].forEach.call(b.childNodes,function(a){d.invertChild(a,b)});if(\"SPAN\"===b.tagName){var m=this.rotation,c=void 0;c=this.textWidth&&f(this.textWidth);var g=[m,n,b.innerHTML,this.textWidth,this.textAlign].join(),\na;(a=c!==this.oldTextWidth)&&!(a=c>this.oldTextWidth)&&((a=this.textPxLength)||(B(b,{width:\"\",whiteSpace:E||\"nowrap\"}),a=b.offsetWidth),a=a>c);a&&(/[ \\-]/.test(b.textContent||b.innerText)||\"ellipsis\"===b.style.textOverflow)?(B(b,{width:c+\"px\",display:\"block\",whiteSpace:E||\"normal\"}),this.oldTextWidth=c,this.hasBoxWidthChanged=!0):this.hasBoxWidthChanged=!1;g!==this.cTT&&(c=d.fontMetrics(b.style.fontSize,b).b,!x(m)||m===(this.oldRotation||0)&&n===this.oldAlign||this.setSpanRotation(m,J,c),this.getSpanCorrection(!x(m)&&\nthis.textPxLength||b.offsetWidth,c,J,m,n));B(b,{left:N+(this.xCorr||0)+\"px\",top:u+(this.yCorr||0)+\"px\"});this.cTT=g;this.oldRotation=m;this.oldAlign=n}}else this.alignOnAdd=!0},setSpanRotation:function(d,b,f){var l={},e=H&&!/Edge/.test(C.navigator.userAgent)?\"-ms-transform\":G?\"-webkit-transform\":D?\"MozTransform\":C.opera?\"-o-transform\":void 0;e&&(l[e]=l.transform=\"rotate(\"+d+\"deg)\",l[e+(D?\"Origin\":\"-origin\")]=l.transformOrigin=100*b+\"% \"+f+\"px\",B(this.element,l))},getSpanCorrection:function(d,b,f){this.xCorr=\n-d*f;this.yCorr=-b}});return b});O(e,\"Core/Renderer/HTML/HTMLRenderer.js\",[e[\"Core/Renderer/HTML/AST.js\"],e[\"Core/Renderer/SVG/SVGElement.js\"],e[\"Core/Renderer/SVG/SVGRenderer.js\"],e[\"Core/Utilities.js\"]],function(e,b,I,z){var D=z.attr,G=z.createElement,C=z.extend,B=z.pick;C(I.prototype,{html:function(x,w,v){var f=this.createElement(\"span\"),d=f.element,q=f.renderer,k=q.isSVG,l=function(d,f){[\"opacity\",\"visibility\"].forEach(function(l){d[l+\"Setter\"]=function(n,e,m){var c=d.div?d.div.style:f;b.prototype[l+\n\"Setter\"].call(this,n,e,m);c&&(c[e]=n)}});d.addedSetters=!0};f.textSetter=function(d){d!==this.textStr&&(delete this.bBox,delete this.oldTextWidth,e.setElementHTML(this.element,B(d,\"\")),this.textStr=d,f.doTransform=!0)};k&&l(f,f.element.style);f.xSetter=f.ySetter=f.alignSetter=f.rotationSetter=function(d,b){\"align\"===b?f.alignValue=f.textAlign=d:f[b]=d;f.doTransform=!0};f.afterSetters=function(){this.doTransform&&(this.htmlUpdateTransform(),this.doTransform=!1)};f.attr({text:x,x:Math.round(w),y:Math.round(v)}).css({position:\"absolute\"});\nq.styledMode||f.css({fontFamily:this.style.fontFamily,fontSize:this.style.fontSize});d.style.whiteSpace=\"nowrap\";f.css=f.htmlCss;k&&(f.add=function(b){var e=q.box.parentNode,n=[];if(this.parentGroup=b){var k=b.div;if(!k){for(;b;)n.push(b),b=b.parentGroup;n.reverse().forEach(function(d){function b(c,g){d[g]=c;\"translateX\"===g?a.left=c+\"px\":a.top=c+\"px\";d.doTransform=!0}var c=D(d.element,\"class\"),g=d.styles||{};k=d.div=d.div||G(\"div\",c?{className:c}:void 0,{position:\"absolute\",left:(d.translateX||0)+\n\"px\",top:(d.translateY||0)+\"px\",display:d.display,opacity:d.opacity,cursor:g.cursor,pointerEvents:g.pointerEvents},k||e);var a=k.style;C(d,{classSetter:function(a){return function(c){this.element.setAttribute(\"class\",c);a.className=c}}(k),on:function(){n[0].div&&f.on.apply({element:n[0].div,onEvents:f.onEvents},arguments);return d},translateXSetter:b,translateYSetter:b});d.addedSetters||l(d)})}}else k=e;k.appendChild(d);f.added=!0;f.alignOnAdd&&f.htmlUpdateTransform();return f});return f}});return I});\nO(e,\"Core/Axis/Tick.js\",[e[\"Core/FormatUtilities.js\"],e[\"Core/Globals.js\"],e[\"Core/Utilities.js\"]],function(e,b,I){var D=b.deg2rad,H=I.clamp,G=I.correctFloat,C=I.defined,B=I.destroyObjectProperties,x=I.extend,w=I.fireEvent,v=I.isNumber,f=I.merge,d=I.objectEach,q=I.pick;\"\";I=function(){function b(d,b,f,e,k){this.isNewLabel=this.isNew=!0;this.axis=d;this.pos=b;this.type=f||\"\";this.parameters=k||{};this.tickmarkOffset=this.parameters.tickmarkOffset;this.options=this.parameters.options;w(this,\"init\");\nf||e||this.addLabel()}b.prototype.addLabel=function(){var d=this,b=d.axis,f=b.options,n=b.chart,k=b.categories,E=b.logarithmic,m=b.names,c=d.pos,g=q(d.options&&d.options.labels,f.labels),a=b.tickPositions,h=c===a[0],r=c===a[a.length-1],A=d.label,y=(!g.step||1===g.step)&&1===b.tickInterval;a=a.info;var L,P;k=this.parameters.category||(k?q(k[c],m[c],c):c);E&&v(k)&&(k=G(E.lin2log(k)));if(b.dateTime&&a){var R=n.time.resolveDTLFormat(f.dateTimeLabelFormats[!f.grid&&a.higherRanks[c]||a.unitName]);var V=\nR.main}d.isFirst=h;d.isLast=r;var Q={axis:b,chart:n,dateTimeLabelFormat:V,isFirst:h,isLast:r,pos:c,tick:d,tickPositionInfo:a,value:k};w(this,\"labelFormat\",Q);var M=function(a){return g.formatter?g.formatter.call(a,a):g.format?(a.text=b.defaultLabelFormatter.call(a),e.format(g.format,a,n)):b.defaultLabelFormatter.call(a,a)};f=M.call(Q,Q);if(P=R&&R.list)d.shortenLabel=function(){for(L=0;L<P.length;L++)if(x(Q,{dateTimeLabelFormat:P[L]}),A.attr({text:M.call(Q,Q)}),A.getBBox().width<b.getSlotWidth(d)-\n2*g.padding)return;A.attr({text:\"\"})};y&&b._addedPlotLB&&d.moveLabel(f,g);C(A)||d.movedLabel?A&&A.textStr!==f&&!y&&(!A.textWidth||g.style.width||A.styles.width||A.css({width:null}),A.attr({text:f}),A.textPxLength=A.getBBox().width):(d.label=A=d.createLabel({x:0,y:0},f,g),d.rotation=0)};b.prototype.createLabel=function(d,b,e){var n=this.axis,l=n.chart;if(d=C(b)&&e.enabled?l.renderer.text(b,d.x,d.y,e.useHTML).add(n.labelGroup):null)l.styledMode||d.css(f(e.style)),d.textPxLength=d.getBBox().width;return d};\nb.prototype.destroy=function(){B(this,this.axis)};b.prototype.getPosition=function(d,b,f,e){var n=this.axis,l=n.chart,m=e&&l.oldChartHeight||l.chartHeight;d={x:d?G(n.translate(b+f,null,null,e)+n.transB):n.left+n.offset+(n.opposite?(e&&l.oldChartWidth||l.chartWidth)-n.right-n.left:0),y:d?m-n.bottom+n.offset-(n.opposite?n.height:0):G(m-n.translate(b+f,null,null,e)-n.transB)};d.y=H(d.y,-1E5,1E5);w(this,\"afterGetPosition\",{pos:d});return d};b.prototype.getLabelPosition=function(d,b,f,e,k,q,m,c){var g=\nthis.axis,a=g.transA,h=g.isLinked&&g.linkedParent?g.linkedParent.reversed:g.reversed,r=g.staggerLines,A=g.tickRotCorr||{x:0,y:0},y=k.y,n=e||g.reserveSpaceDefault?0:-g.labelOffset*(\"center\"===g.labelAlign?.5:1),l={};C(y)||(y=0===g.side?f.rotation?-8:-f.getBBox().height:2===g.side?A.y+8:Math.cos(f.rotation*D)*(A.y-f.getBBox(!1,0).height/2));d=d+k.x+n+A.x-(q&&e?q*a*(h?-1:1):0);b=b+y-(q&&!e?q*a*(h?1:-1):0);r&&(f=m/(c||1)%r,g.opposite&&(f=r-f-1),b+=g.labelOffset/r*f);l.x=d;l.y=Math.round(b);w(this,\"afterGetLabelPosition\",\n{pos:l,tickmarkOffset:q,index:m});return l};b.prototype.getLabelSize=function(){return this.label?this.label.getBBox()[this.axis.horiz?\"height\":\"width\"]:0};b.prototype.getMarkPath=function(d,b,f,e,k,q){return q.crispLine([[\"M\",d,b],[\"L\",d+(k?0:-f),b+(k?f:0)]],e)};b.prototype.handleOverflow=function(d){var b=this.axis,f=b.options.labels,e=d.x,l=b.chart.chartWidth,k=b.chart.spacing,m=q(b.labelLeft,Math.min(b.pos,k[3]));k=q(b.labelRight,Math.max(b.isRadial?0:b.pos+b.len,l-k[1]));var c=this.label,g=this.rotation,\na={left:0,center:.5,right:1}[b.labelAlign||c.attr(\"align\")],h=c.getBBox().width,r=b.getSlotWidth(this),A=r,y=1,L,P={};if(g||\"justify\"!==f.overflow)0>g&&e-a*h<m?L=Math.round(e/Math.cos(g*D)-m):0<g&&e+a*h>k&&(L=Math.round((l-e)/Math.cos(g*D)));else if(l=e+(1-a)*h,e-a*h<m?A=d.x+A*(1-a)-m:l>k&&(A=k-d.x+A*a,y=-1),A=Math.min(r,A),A<r&&\"center\"===b.labelAlign&&(d.x+=y*(r-A-a*(r-Math.min(h,A)))),h>A||b.autoRotation&&(c.styles||{}).width)L=A;L&&(this.shortenLabel?this.shortenLabel():(P.width=Math.floor(L)+\n\"px\",(f.style||{}).textOverflow||(P.textOverflow=\"ellipsis\"),c.css(P)))};b.prototype.moveLabel=function(b,f){var e=this,n=e.label,l=!1,k=e.axis,m=k.reversed;n&&n.textStr===b?(e.movedLabel=n,l=!0,delete e.label):d(k.ticks,function(c){l||c.isNew||c===e||!c.label||c.label.textStr!==b||(e.movedLabel=c.label,l=!0,c.labelPos=e.movedLabel.xy,delete c.label)});if(!l&&(e.labelPos||n)){var c=e.labelPos||n.xy;n=k.horiz?m?0:k.width+k.left:c.x;k=k.horiz?c.y:m?k.width+k.left:0;e.movedLabel=e.createLabel({x:n,y:k},\nb,f);e.movedLabel&&e.movedLabel.attr({opacity:0})}};b.prototype.render=function(d,b,f){var e=this.axis,l=e.horiz,k=this.pos,m=q(this.tickmarkOffset,e.tickmarkOffset);k=this.getPosition(l,k,m,b);m=k.x;var c=k.y;e=l&&m===e.pos+e.len||!l&&c===e.pos?-1:1;l=q(f,this.label&&this.label.newOpacity,1);f=q(f,1);this.isActive=!0;this.renderGridLine(b,f,e);this.renderMark(k,f,e);this.renderLabel(k,b,l,d);this.isNew=!1;w(this,\"afterRender\")};b.prototype.renderGridLine=function(d,b,f){var e=this.axis,l=e.options,\nk=this.gridLine,m={},c=this.pos,g=this.type,a=q(this.tickmarkOffset,e.tickmarkOffset),h=e.chart.renderer,r=l.gridLineWidth,A=l.gridLineColor,y=l.gridLineDashStyle;\"minor\"===this.type&&(r=l.minorGridLineWidth,A=l.minorGridLineColor,y=l.minorGridLineDashStyle);k||(e.chart.styledMode||(m.stroke=A,m[\"stroke-width\"]=r||0,m.dashstyle=y),g||(m.zIndex=1),d&&(b=0),this.gridLine=k=h.path().attr(m).addClass(\"highcharts-\"+(g?g+\"-\":\"\")+\"grid-line\").add(e.gridGroup));if(k&&(f=e.getPlotLinePath({value:c+a,lineWidth:k.strokeWidth()*\nf,force:\"pass\",old:d})))k[d||this.isNew?\"attr\":\"animate\"]({d:f,opacity:b})};b.prototype.renderMark=function(d,b,f){var e=this.axis,l=e.options,k=e.chart.renderer,m=this.type,c=e.tickSize(m?m+\"Tick\":\"tick\"),g=this.mark,a=!g,h=d.x;d=d.y;var r=q(l[\"minor\"!==m?\"tickWidth\":\"minorTickWidth\"],!m&&e.isXAxis?1:0);l=l[\"minor\"!==m?\"tickColor\":\"minorTickColor\"];c&&(e.opposite&&(c[0]=-c[0]),a&&(this.mark=g=k.path().addClass(\"highcharts-\"+(m?m+\"-\":\"\")+\"tick\").add(e.axisGroup),e.chart.styledMode||g.attr({stroke:l,\n\"stroke-width\":r})),g[a?\"attr\":\"animate\"]({d:this.getMarkPath(h,d,c[0],g.strokeWidth()*f,e.horiz,k),opacity:b}))};b.prototype.renderLabel=function(d,b,f,e){var l=this.axis,n=l.horiz,m=l.options,c=this.label,g=m.labels,a=g.step;l=q(this.tickmarkOffset,l.tickmarkOffset);var h=!0,r=d.x;d=d.y;c&&v(r)&&(c.xy=d=this.getLabelPosition(r,d,c,n,g,l,e,a),this.isFirst&&!this.isLast&&!m.showFirstLabel||this.isLast&&!this.isFirst&&!m.showLastLabel?h=!1:!n||g.step||g.rotation||b||0===f||this.handleOverflow(d),a&&\ne%a&&(h=!1),h&&v(d.y)?(d.opacity=f,c[this.isNewLabel?\"attr\":\"animate\"](d),this.isNewLabel=!1):(c.attr(\"y\",-9999),this.isNewLabel=!0))};b.prototype.replaceMovedLabel=function(){var d=this.label,b=this.axis,f=b.reversed;if(d&&!this.isNew){var e=b.horiz?f?b.left:b.width+b.left:d.xy.x;f=b.horiz?d.xy.y:f?b.width+b.top:b.top;d.animate({x:e,y:f,opacity:0},void 0,d.destroy);delete this.label}b.isDirty=!0;this.label=this.movedLabel;delete this.movedLabel};return b}();b.Tick=I;return b.Tick});O(e,\"Core/Axis/Axis.js\",\n[e[\"Core/Animation/AnimationUtilities.js\"],e[\"Core/Color/Color.js\"],e[\"Core/Globals.js\"],e[\"Core/Color/Palette.js\"],e[\"Core/Options.js\"],e[\"Core/Axis/Tick.js\"],e[\"Core/Utilities.js\"]],function(e,b,I,z,H,G,C){var B=e.animObject,x=H.defaultOptions,w=C.addEvent,v=C.arrayMax,f=C.arrayMin,d=C.clamp,q=C.correctFloat,k=C.defined,l=C.destroyObjectProperties,N=C.erase,u=C.error,n=C.extend,J=C.fireEvent,E=C.getMagnitude,m=C.isArray,c=C.isFunction,g=C.isNumber,a=C.isString,h=C.merge,r=C.normalizeTickInterval,\nA=C.objectEach,y=C.pick,L=C.relativeLength,P=C.removeEvent,R=C.splat,V=C.syncTimeout;\"\";var Q=I.deg2rad;e=function(){function e(a,c){this.zoomEnabled=this.width=this.visible=this.userOptions=this.translationSlope=this.transB=this.transA=this.top=this.ticks=this.tickRotCorr=this.tickPositions=this.tickmarkOffset=this.tickInterval=this.tickAmount=this.side=this.series=this.right=this.positiveValuesOnly=this.pos=this.pointRangePadding=this.pointRange=this.plotLinesAndBandsGroups=this.plotLinesAndBands=\nthis.paddedTicks=this.overlap=this.options=this.offset=this.names=this.minPixelPadding=this.minorTicks=this.minorTickInterval=this.min=this.maxLabelLength=this.max=this.len=this.left=this.labelFormatter=this.labelEdge=this.isLinked=this.height=this.hasVisibleSeries=this.hasNames=this.coll=this.closestPointRange=this.chart=this.categories=this.bottom=this.alternateBands=void 0;this.init(a,c)}e.prototype.init=function(a,d){var b=d.isX,h=this;h.chart=a;h.horiz=a.inverted&&!h.isZAxis?!b:b;h.isXAxis=b;\nh.coll=h.coll||(b?\"xAxis\":\"yAxis\");J(this,\"init\",{userOptions:d});h.opposite=y(d.opposite,h.opposite);h.side=y(d.side,h.side,h.horiz?h.opposite?0:2:h.opposite?1:3);h.setOptions(d);var p=this.options,t=p.labels,r=p.type;h.userOptions=d;h.minPixelPadding=0;h.reversed=y(p.reversed,h.reversed);h.visible=p.visible;h.zoomEnabled=p.zoomEnabled;h.hasNames=\"category\"===r||!0===p.categories;h.categories=p.categories||h.hasNames;h.names||(h.names=[],h.names.keys={});h.plotLinesAndBandsGroups={};h.positiveValuesOnly=\n!!h.logarithmic;h.isLinked=k(p.linkedTo);h.ticks={};h.labelEdge=[];h.minorTicks={};h.plotLinesAndBands=[];h.alternateBands={};h.len=0;h.minRange=h.userMinRange=p.minRange||p.maxZoom;h.range=p.range;h.offset=p.offset||0;h.max=null;h.min=null;d=y(p.crosshair,R(a.options.tooltip.crosshairs)[b?0:1]);h.crosshair=!0===d?{}:d;d=h.options.events;-1===a.axes.indexOf(h)&&(b?a.axes.splice(a.xAxis.length,0,h):a.axes.push(h),a[h.coll].push(h));h.series=h.series||[];a.inverted&&!h.isZAxis&&b&&\"undefined\"===typeof h.reversed&&\n(h.reversed=!0);h.labelRotation=g(t.rotation)?t.rotation:void 0;A(d,function(a,d){c(a)&&w(h,d,a)});J(this,\"afterInit\")};e.prototype.setOptions=function(a){this.options=h(e.defaultOptions,\"yAxis\"===this.coll&&e.defaultYAxisOptions,[e.defaultTopAxisOptions,e.defaultRightAxisOptions,e.defaultBottomAxisOptions,e.defaultLeftAxisOptions][this.side],h(x[this.coll],a));J(this,\"afterSetOptions\",{userOptions:a})};e.prototype.defaultLabelFormatter=function(){var a=this.axis,c=g(this.value)?this.value:NaN,d=\na.chart.time,h=this.dateTimeLabelFormat,b=x.lang,r=b.numericSymbols;b=b.numericSymbolMagnitude||1E3;var e=r&&r.length,f=a.logarithmic?Math.abs(c):a.tickInterval,m=this.chart.numberFormatter;if(a.categories)var A=\"\"+this.value;else if(h)A=d.dateFormat(h,c);else if(e&&1E3<=f)for(;e--&&\"undefined\"===typeof A;)a=Math.pow(b,e+1),f>=a&&0===10*c%a&&null!==r[e]&&0!==c&&(A=m(c/a,-1)+r[e]);\"undefined\"===typeof A&&(A=1E4<=Math.abs(c)?m(c,-1):m(c,-1,void 0,\"\"));return A};e.prototype.getSeriesExtremes=function(){var a=\nthis,c=a.chart,d;J(this,\"getSeriesExtremes\",null,function(){a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis;a.stacking&&a.stacking.buildStacks();a.series.forEach(function(h){if(h.visible||!c.options.chart.ignoreHiddenSeries){var b=h.options,p=b.threshold;a.hasVisibleSeries=!0;a.positiveValuesOnly&&0>=p&&(p=null);if(a.isXAxis){if(b=h.xData,b.length){b=a.logarithmic?b.filter(a.validatePositiveValue):b;d=h.getXExtremes(b);var t=d.min;var r=d.max;g(t)||t instanceof\nDate||(b=b.filter(g),d=h.getXExtremes(b),t=d.min,r=d.max);b.length&&(a.dataMin=Math.min(y(a.dataMin,t),t),a.dataMax=Math.max(y(a.dataMax,r),r))}}else if(h=h.applyExtremes(),g(h.dataMin)&&(t=h.dataMin,a.dataMin=Math.min(y(a.dataMin,t),t)),g(h.dataMax)&&(r=h.dataMax,a.dataMax=Math.max(y(a.dataMax,r),r)),k(p)&&(a.threshold=p),!b.softThreshold||a.positiveValuesOnly)a.softThreshold=!1}})});J(this,\"afterGetSeriesExtremes\")};e.prototype.translate=function(a,c,d,h,b,r){var p=this.linkedParent||this,t=1,e=\n0,f=h&&p.old?p.old.transA:p.transA;h=h&&p.old?p.old.min:p.min;var F=p.minPixelPadding;b=(p.isOrdinal||p.brokenAxis&&p.brokenAxis.hasBreaks||p.logarithmic&&b)&&p.lin2val;f||(f=p.transA);d&&(t*=-1,e=p.len);p.reversed&&(t*=-1,e-=t*(p.sector||p.len));c?(a=(a*t+e-F)/f+h,b&&(a=p.lin2val(a))):(b&&(a=p.val2lin(a)),a=g(h)?t*(a-h)*f+e+t*F+(g(r)?f*r:0):void 0);return a};e.prototype.toPixels=function(a,c){return this.translate(a,!1,!this.horiz,null,!0)+(c?0:this.pos)};e.prototype.toValue=function(a,c){return this.translate(a-\n(c?0:this.pos),!0,!this.horiz,null,!0)};e.prototype.getPlotLinePath=function(a){function c(a,c,g){if(\"pass\"!==l&&a<c||a>g)l?a=d(a,c,g):v=!0;return a}var h=this,b=h.chart,t=h.left,r=h.top,e=a.old,f=a.value,m=a.translatedValue,A=a.lineWidth,l=a.force,n,k,u,L,q=e&&b.oldChartHeight||b.chartHeight,P=e&&b.oldChartWidth||b.chartWidth,v,da=h.transB;a={value:f,lineWidth:A,old:e,force:l,acrossPanes:a.acrossPanes,translatedValue:m};J(this,\"getPlotLinePath\",a,function(a){m=y(m,h.translate(f,null,null,e));m=d(m,\n-1E5,1E5);n=u=Math.round(m+da);k=L=Math.round(q-m-da);g(m)?h.horiz?(k=r,L=q-h.bottom,n=u=c(n,t,t+h.width)):(n=t,u=P-h.right,k=L=c(k,r,r+h.height)):(v=!0,l=!1);a.path=v&&!l?null:b.renderer.crispLine([[\"M\",n,k],[\"L\",u,L]],A||1)});return a.path};e.prototype.getLinearTickPositions=function(a,c,d){var g=q(Math.floor(c/a)*a);d=q(Math.ceil(d/a)*a);var h=[],b;q(g+a)===g&&(b=20);if(this.single)return[c];for(c=g;c<=d;){h.push(c);c=q(c+a,b);if(c===p)break;var p=c}return h};e.prototype.getMinorTickInterval=function(){var a=\nthis.options;return!0===a.minorTicks?y(a.minorTickInterval,\"auto\"):!1===a.minorTicks?null:a.minorTickInterval};e.prototype.getMinorTickPositions=function(){var a=this.options,c=this.tickPositions,d=this.minorTickInterval,g=[],h=this.pointRangePadding||0,b=this.min-h;h=this.max+h;var r=h-b;if(r&&r/d<this.len/3){var e=this.logarithmic;if(e)this.paddedTicks.forEach(function(a,c,h){c&&g.push.apply(g,e.getLogTickPositions(d,h[c-1],h[c],!0))});else if(this.dateTime&&\"auto\"===this.getMinorTickInterval())g=\ng.concat(this.getTimeTicks(this.dateTime.normalizeTimeTickInterval(d),b,h,a.startOfWeek));else for(a=b+(c[0]-b)%d;a<=h&&a!==g[0];a+=d)g.push(a)}0!==g.length&&this.trimTicks(g);return g};e.prototype.adjustForMinRange=function(){var a=this.options,c=this.min,d=this.max,g=this.logarithmic,h=0,b,r,e,m;this.isXAxis&&\"undefined\"===typeof this.minRange&&!g&&(k(a.min)||k(a.max)?this.minRange=null:(this.series.forEach(function(a){e=a.xData;m=a.xIncrement?1:e.length-1;if(1<e.length)for(b=m;0<b;b--)if(r=e[b]-\ne[b-1],!h||r<h)h=r}),this.minRange=Math.min(5*h,this.dataMax-this.dataMin)));if(d-c<this.minRange){var A=this.dataMax-this.dataMin>=this.minRange;var l=this.minRange;var n=(l-d+c)/2;n=[c-n,y(a.min,c-n)];A&&(n[2]=this.logarithmic?this.logarithmic.log2lin(this.dataMin):this.dataMin);c=v(n);d=[c+l,y(a.max,c+l)];A&&(d[2]=g?g.log2lin(this.dataMax):this.dataMax);d=f(d);d-c<l&&(n[0]=d-l,n[1]=y(a.min,d-l),c=v(n))}this.min=c;this.max=d};e.prototype.getClosest=function(){var a;this.categories?a=1:this.series.forEach(function(c){var d=\nc.closestPointRange,g=c.visible||!c.chart.options.chart.ignoreHiddenSeries;!c.noSharedTooltip&&k(d)&&g&&(a=k(a)?Math.min(a,d):d)});return a};e.prototype.nameToX=function(a){var c=m(this.categories),d=c?this.categories:this.names,g=a.options.x;a.series.requireSorting=!1;k(g)||(g=this.options.uniqueNames?c?d.indexOf(a.name):y(d.keys[a.name],-1):a.series.autoIncrement());if(-1===g){if(!c)var h=d.length}else h=g;\"undefined\"!==typeof h&&(this.names[h]=a.name,this.names.keys[a.name]=h);return h};e.prototype.updateNames=\nfunction(){var a=this,c=this.names;0<c.length&&(Object.keys(c.keys).forEach(function(a){delete c.keys[a]}),c.length=0,this.minRange=this.userMinRange,(this.series||[]).forEach(function(c){c.xIncrement=null;if(!c.points||c.isDirtyData)a.max=Math.max(a.max,c.xData.length-1),c.processData(),c.generatePoints();c.data.forEach(function(d,g){if(d&&d.options&&\"undefined\"!==typeof d.name){var h=a.nameToX(d);\"undefined\"!==typeof h&&h!==d.x&&(d.x=h,c.xData[g]=h)}})}))};e.prototype.setAxisTranslation=function(){var c=\nthis,d=c.max-c.min,g=c.axisPointRange||0,h=0,b=0,r=c.linkedParent,e=!!c.categories,f=c.transA,m=c.isXAxis;if(m||e||g){var A=c.getClosest();r?(h=r.minPointOffset,b=r.pointRangePadding):c.series.forEach(function(d){var p=e?1:m?y(d.options.pointRange,A,0):c.axisPointRange||0,r=d.options.pointPlacement;g=Math.max(g,p);if(!c.single||e)d=d.is(\"xrange\")?!m:m,h=Math.max(h,d&&a(r)?0:p/2),b=Math.max(b,d&&\"on\"===r?0:p)});r=c.ordinal&&c.ordinal.slope&&A?c.ordinal.slope/A:1;c.minPointOffset=h*=r;c.pointRangePadding=\nb*=r;c.pointRange=Math.min(g,c.single&&e?1:d);m&&(c.closestPointRange=A)}c.translationSlope=c.transA=f=c.staticScale||c.len/(d+b||1);c.transB=c.horiz?c.left:c.bottom;c.minPixelPadding=f*h;J(this,\"afterSetAxisTranslation\")};e.prototype.minFromRange=function(){return this.max-this.range};e.prototype.setTickInterval=function(a){var c=this,d=c.chart,h=c.logarithmic,b=c.options,e=c.isXAxis,t=c.isLinked,f=b.maxPadding,m=b.minPadding,A=b.tickInterval,l=b.tickPixelInterval,n=c.categories,L=g(c.threshold)?\nc.threshold:null,P=c.softThreshold;c.dateTime||n||t||this.getTickAmount();var v=y(c.userMin,b.min);var w=y(c.userMax,b.max);if(t){c.linkedParent=d[c.coll][b.linkedTo];var R=c.linkedParent.getExtremes();c.min=y(R.min,R.dataMin);c.max=y(R.max,R.dataMax);b.type!==c.linkedParent.options.type&&u(11,1,d)}else{if(P&&k(L))if(c.dataMin>=L)R=L,m=0;else if(c.dataMax<=L){var Q=L;f=0}c.min=y(v,R,c.dataMin);c.max=y(w,Q,c.dataMax)}h&&(c.positiveValuesOnly&&!a&&0>=Math.min(c.min,y(c.dataMin,c.min))&&u(10,1,d),c.min=\nq(h.log2lin(c.min),16),c.max=q(h.log2lin(c.max),16));c.range&&k(c.max)&&(c.userMin=c.min=v=Math.max(c.dataMin,c.minFromRange()),c.userMax=w=c.max,c.range=null);J(c,\"foundExtremes\");c.beforePadding&&c.beforePadding();c.adjustForMinRange();!(n||c.axisPointRange||c.stacking&&c.stacking.usePercentage||t)&&k(c.min)&&k(c.max)&&(d=c.max-c.min)&&(!k(v)&&m&&(c.min-=d*m),!k(w)&&f&&(c.max+=d*f));g(c.userMin)||(g(b.softMin)&&b.softMin<c.min&&(c.min=v=b.softMin),g(b.floor)&&(c.min=Math.max(c.min,b.floor)));g(c.userMax)||\n(g(b.softMax)&&b.softMax>c.max&&(c.max=w=b.softMax),g(b.ceiling)&&(c.max=Math.min(c.max,b.ceiling)));P&&k(c.dataMin)&&(L=L||0,!k(v)&&c.min<L&&c.dataMin>=L?c.min=c.options.minRange?Math.min(L,c.max-c.minRange):L:!k(w)&&c.max>L&&c.dataMax<=L&&(c.max=c.options.minRange?Math.max(L,c.min+c.minRange):L));g(c.min)&&g(c.max)&&!this.chart.polar&&c.min>c.max&&(k(c.options.min)?c.max=c.min:k(c.options.max)&&(c.min=c.max));c.tickInterval=c.min===c.max||\"undefined\"===typeof c.min||\"undefined\"===typeof c.max?1:\nt&&c.linkedParent&&!A&&l===c.linkedParent.options.tickPixelInterval?A=c.linkedParent.tickInterval:y(A,this.tickAmount?(c.max-c.min)/Math.max(this.tickAmount-1,1):void 0,n?1:(c.max-c.min)*l/Math.max(c.len,l));e&&!a&&c.series.forEach(function(a){a.processData(c.min!==(c.old&&c.old.min)||c.max!==(c.old&&c.old.max))});c.setAxisTranslation();J(this,\"initialAxisTranslation\");c.pointRange&&!A&&(c.tickInterval=Math.max(c.pointRange,c.tickInterval));a=y(b.minTickInterval,c.dateTime&&!c.series.some(function(a){return a.noSharedTooltip})?\nc.closestPointRange:0);!A&&c.tickInterval<a&&(c.tickInterval=a);c.dateTime||c.logarithmic||A||(c.tickInterval=r(c.tickInterval,void 0,E(c.tickInterval),y(b.allowDecimals,.5>c.tickInterval||void 0!==this.tickAmount),!!this.tickAmount));this.tickAmount||(c.tickInterval=c.unsquish());this.setTickPositions()};e.prototype.setTickPositions=function(){var a=this.options,c=a.tickPositions;var d=this.getMinorTickInterval();var g=a.tickPositioner,h=this.hasVerticalPanning(),b=\"colorAxis\"===this.coll,r=(b||\n!h)&&a.startOnTick;h=(b||!h)&&a.endOnTick;this.tickmarkOffset=this.categories&&\"between\"===a.tickmarkPlacement&&1===this.tickInterval?.5:0;this.minorTickInterval=\"auto\"===d&&this.tickInterval?this.tickInterval/5:d;this.single=this.min===this.max&&k(this.min)&&!this.tickAmount&&(parseInt(this.min,10)===this.min||!1!==a.allowDecimals);this.tickPositions=d=c&&c.slice();!d&&(this.ordinal&&this.ordinal.positions||!((this.max-this.min)/this.tickInterval>Math.max(2*this.len,200))?d=this.dateTime?this.getTimeTicks(this.dateTime.normalizeTimeTickInterval(this.tickInterval,\na.units),this.min,this.max,a.startOfWeek,this.ordinal&&this.ordinal.positions,this.closestPointRange,!0):this.logarithmic?this.logarithmic.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max):(d=[this.min,this.max],u(19,!1,this.chart)),d.length>this.len&&(d=[d[0],d.pop()],d[0]===d[1]&&(d.length=1)),this.tickPositions=d,g&&(g=g.apply(this,[this.min,this.max])))&&(this.tickPositions=d=g);this.paddedTicks=d.slice(0);this.trimTicks(d,\nr,h);this.isLinked||(this.single&&2>d.length&&!this.categories&&!this.series.some(function(a){return a.is(\"heatmap\")&&\"between\"===a.options.pointPlacement})&&(this.min-=.5,this.max+=.5),c||g||this.adjustTickAmount());J(this,\"afterSetTickPositions\")};e.prototype.trimTicks=function(a,c,d){var g=a[0],h=a[a.length-1],b=!this.isOrdinal&&this.minPointOffset||0;J(this,\"trimTicks\");if(!this.isLinked){if(c&&-Infinity!==g)this.min=g;else for(;this.min-b>a[0];)a.shift();if(d)this.max=h;else for(;this.max+b<\na[a.length-1];)a.pop();0===a.length&&k(g)&&!this.options.tickPositions&&a.push((h+g)/2)}};e.prototype.alignToOthers=function(){var a={},c,d=this.options;!1!==this.chart.options.chart.alignTicks&&d.alignTicks&&!1!==d.startOnTick&&!1!==d.endOnTick&&!this.logarithmic&&this.chart[this.coll].forEach(function(d){var g=d.options;g=[d.horiz?g.left:g.top,g.width,g.height,g.pane].join();d.series.length&&(a[g]?c=!0:a[g]=1)});return c};e.prototype.getTickAmount=function(){var a=this.options,c=a.tickAmount,d=\na.tickPixelInterval;!k(a.tickInterval)&&!c&&this.len<d&&!this.isRadial&&!this.logarithmic&&a.startOnTick&&a.endOnTick&&(c=2);!c&&this.alignToOthers()&&(c=Math.ceil(this.len/d)+1);4>c&&(this.finalTickAmt=c,c=5);this.tickAmount=c};e.prototype.adjustTickAmount=function(){var a=this.options,c=this.tickInterval,d=this.tickPositions,h=this.tickAmount,b=this.finalTickAmt,r=d&&d.length,e=y(this.threshold,this.softThreshold?0:null);if(this.hasData()&&g(this.min)&&g(this.max)){if(r<h){for(;d.length<h;)d.length%\n2||this.min===e?d.push(q(d[d.length-1]+c)):d.unshift(q(d[0]-c));this.transA*=(r-1)/(h-1);this.min=a.startOnTick?d[0]:Math.min(this.min,d[0]);this.max=a.endOnTick?d[d.length-1]:Math.max(this.max,d[d.length-1])}else r>h&&(this.tickInterval*=2,this.setTickPositions());if(k(b)){for(c=a=d.length;c--;)(3===b&&1===c%2||2>=b&&0<c&&c<a-1)&&d.splice(c,1);this.finalTickAmt=void 0}}};e.prototype.setScale=function(){var a,c=!1,d=!1;this.series.forEach(function(a){c=c||a.isDirtyData||a.isDirty;d=d||a.xAxis&&a.xAxis.isDirty||\n!1});this.setAxisSize();(a=this.len!==(this.old&&this.old.len))||c||d||this.isLinked||this.forceRedraw||this.userMin!==(this.old&&this.old.userMin)||this.userMax!==(this.old&&this.old.userMax)||this.alignToOthers()?(this.stacking&&this.stacking.resetStacks(),this.forceRedraw=!1,this.getSeriesExtremes(),this.setTickInterval(),this.isDirty||(this.isDirty=a||this.min!==(this.old&&this.old.min)||this.max!==(this.old&&this.old.max))):this.stacking&&this.stacking.cleanStacks();c&&this.panningState&&(this.panningState.isDirty=\n!0);J(this,\"afterSetScale\")};e.prototype.setExtremes=function(a,c,d,g,h){var b=this,r=b.chart;d=y(d,!0);b.series.forEach(function(a){delete a.kdTree});h=n(h,{min:a,max:c});J(b,\"setExtremes\",h,function(){b.userMin=a;b.userMax=c;b.eventArgs=h;d&&r.redraw(g)})};e.prototype.zoom=function(a,c){var d=this,g=this.dataMin,h=this.dataMax,b=this.options,r=Math.min(g,y(b.min,g)),e=Math.max(h,y(b.max,h));a={newMin:a,newMax:c};J(this,\"zoom\",a,function(a){var c=a.newMin,b=a.newMax;if(c!==d.min||b!==d.max)d.allowZoomOutside||\n(k(g)&&(c<r&&(c=r),c>e&&(c=e)),k(h)&&(b<r&&(b=r),b>e&&(b=e))),d.displayBtn=\"undefined\"!==typeof c||\"undefined\"!==typeof b,d.setExtremes(c,b,!1,void 0,{trigger:\"zoom\"});a.zoomed=!0});return a.zoomed};e.prototype.setAxisSize=function(){var a=this.chart,c=this.options,d=c.offsets||[0,0,0,0],g=this.horiz,h=this.width=Math.round(L(y(c.width,a.plotWidth-d[3]+d[1]),a.plotWidth)),b=this.height=Math.round(L(y(c.height,a.plotHeight-d[0]+d[2]),a.plotHeight)),r=this.top=Math.round(L(y(c.top,a.plotTop+d[0]),a.plotHeight,\na.plotTop));c=this.left=Math.round(L(y(c.left,a.plotLeft+d[3]),a.plotWidth,a.plotLeft));this.bottom=a.chartHeight-b-r;this.right=a.chartWidth-h-c;this.len=Math.max(g?h:b,0);this.pos=g?c:r};e.prototype.getExtremes=function(){var a=this.logarithmic;return{min:a?q(a.lin2log(this.min)):this.min,max:a?q(a.lin2log(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}};e.prototype.getThreshold=function(a){var c=this.logarithmic,d=c?c.lin2log(this.min):this.min;\nc=c?c.lin2log(this.max):this.max;null===a||-Infinity===a?a=d:Infinity===a?a=c:d>a?a=d:c<a&&(a=c);return this.translate(a,0,1,0,1)};e.prototype.autoLabelAlign=function(a){var c=(y(a,0)-90*this.side+720)%360;a={align:\"center\"};J(this,\"autoLabelAlign\",a,function(a){15<c&&165>c?a.align=\"right\":195<c&&345>c&&(a.align=\"left\")});return a.align};e.prototype.tickSize=function(a){var c=this.options,d=c[\"tick\"===a?\"tickLength\":\"minorTickLength\"],g=y(c[\"tick\"===a?\"tickWidth\":\"minorTickWidth\"],\"tick\"===a&&this.isXAxis&&\n!this.categories?1:0);if(g&&d){\"inside\"===c[a+\"Position\"]&&(d=-d);var h=[d,g]}a={tickSize:h};J(this,\"afterTickSize\",a);return a.tickSize};e.prototype.labelMetrics=function(){var a=this.tickPositions&&this.tickPositions[0]||0;return this.chart.renderer.fontMetrics(this.options.labels.style.fontSize,this.ticks[a]&&this.ticks[a].label)};e.prototype.unsquish=function(){var a=this.options.labels,c=this.horiz,d=this.tickInterval,h=d,b=this.len/(((this.categories?1:0)+this.max-this.min)/d),r,e=a.rotation,\nf=this.labelMetrics(),m,A=Number.MAX_VALUE,l=Math.max(this.max-this.min,0),n=function(a){var c=a/(b||1);c=1<c?Math.ceil(c):1;c*d>l&&Infinity!==a&&Infinity!==b&&l&&(c=Math.ceil(l/d));return q(c*d)};if(c){if(!a.staggerLines&&!a.step)if(g(e))var k=[e];else b<a.autoRotationLimit&&(k=a.autoRotation);k&&k.forEach(function(a){if(a===e||a&&-90<=a&&90>=a){m=n(Math.abs(f.h/Math.sin(Q*a)));var c=m+Math.abs(a/360);c<A&&(A=c,r=a,h=m)}})}else a.step||(h=n(f.h));this.autoRotation=k;this.labelRotation=y(r,g(e)?e:\n0);return h};e.prototype.getSlotWidth=function(a){var c=this.chart,d=this.horiz,h=this.options.labels,b=Math.max(this.tickPositions.length-(this.categories?0:1),1),r=c.margin[3];if(a&&g(a.slotWidth))return a.slotWidth;if(d&&2>h.step)return h.rotation?0:(this.staggerLines||1)*this.len/b;if(!d){a=h.style.width;if(void 0!==a)return parseInt(String(a),10);if(r)return r-c.spacing[3]}return.33*c.chartWidth};e.prototype.renderUnsquish=function(){var c=this.chart,d=c.renderer,g=this.tickPositions,h=this.ticks,\nb=this.options.labels,r=b.style,e=this.horiz,f=this.getSlotWidth(),m=Math.max(1,Math.round(f-2*b.padding)),A={},y=this.labelMetrics(),l=r.textOverflow,n=0;a(b.rotation)||(A.rotation=b.rotation||0);g.forEach(function(a){a=h[a];a.movedLabel&&a.replaceMovedLabel();a&&a.label&&a.label.textPxLength>n&&(n=a.label.textPxLength)});this.maxLabelLength=n;if(this.autoRotation)n>m&&n>y.h?A.rotation=this.labelRotation:this.labelRotation=0;else if(f){var k=m;if(!l){var L=\"clip\";for(m=g.length;!e&&m--;){var u=g[m];\nif(u=h[u].label)u.styles&&\"ellipsis\"===u.styles.textOverflow?u.css({textOverflow:\"clip\"}):u.textPxLength>f&&u.css({width:f+\"px\"}),u.getBBox().height>this.len/g.length-(y.h-y.f)&&(u.specificTextOverflow=\"ellipsis\")}}}A.rotation&&(k=n>.5*c.chartHeight?.33*c.chartHeight:n,l||(L=\"ellipsis\"));if(this.labelAlign=b.align||this.autoLabelAlign(this.labelRotation))A.align=this.labelAlign;g.forEach(function(a){var c=(a=h[a])&&a.label,d=r.width,g={};c&&(c.attr(A),a.shortenLabel?a.shortenLabel():k&&!d&&\"nowrap\"!==\nr.whiteSpace&&(k<c.textPxLength||\"SPAN\"===c.element.tagName)?(g.width=k+\"px\",l||(g.textOverflow=c.specificTextOverflow||L),c.css(g)):c.styles&&c.styles.width&&!g.width&&!d&&c.css({width:null}),delete c.specificTextOverflow,a.rotation=A.rotation)},this);this.tickRotCorr=d.rotCorr(y.b,this.labelRotation||0,0!==this.side)};e.prototype.hasData=function(){return this.series.some(function(a){return a.hasData()})||this.options.showEmpty&&k(this.min)&&k(this.max)};e.prototype.addTitle=function(a){var c=this.chart.renderer,\nd=this.horiz,g=this.opposite,b=this.options.title,r,e=this.chart.styledMode;this.axisTitle||((r=b.textAlign)||(r=(d?{low:\"left\",middle:\"center\",high:\"right\"}:{low:g?\"right\":\"left\",middle:\"center\",high:g?\"left\":\"right\"})[b.align]),this.axisTitle=c.text(b.text||\"\",0,0,b.useHTML).attr({zIndex:7,rotation:b.rotation,align:r}).addClass(\"highcharts-axis-title\"),e||this.axisTitle.css(h(b.style)),this.axisTitle.add(this.axisGroup),this.axisTitle.isNew=!0);e||b.style.width||this.isRadial||this.axisTitle.css({width:this.len+\n\"px\"});this.axisTitle[a?\"show\":\"hide\"](a)};e.prototype.generateTick=function(a){var c=this.ticks;c[a]?c[a].addLabel():c[a]=new G(this,a)};e.prototype.getOffset=function(){var a=this,c=this,d=c.chart,g=d.renderer,h=c.options,b=c.tickPositions,r=c.ticks,e=c.horiz,f=c.side,m=d.inverted&&!c.isZAxis?[1,0,3,2][f]:f,l,n=0,L=0,u=h.title,P=h.labels,q=0,v=d.axisOffset;d=d.clipOffset;var w=[-1,1,1,-1][f],da=h.className,ia=c.axisParent;var E=c.hasData();c.showAxis=l=E||h.showEmpty;c.staggerLines=c.horiz&&P.staggerLines||\nvoid 0;if(!c.axisGroup){var R=function(c,d,h){return g.g(c).attr({zIndex:h}).addClass(\"highcharts-\"+a.coll.toLowerCase()+d+\" \"+(a.isRadial?\"highcharts-radial-axis\"+d+\" \":\"\")+(da||\"\")).add(ia)};c.gridGroup=R(\"grid\",\"-grid\",h.gridZIndex);c.axisGroup=R(\"axis\",\"\",h.zIndex);c.labelGroup=R(\"axis-labels\",\"-labels\",P.zIndex)}E||c.isLinked?(b.forEach(function(a,d){c.generateTick(a,d)}),c.renderUnsquish(),c.reserveSpaceDefault=0===f||2===f||{1:\"left\",3:\"right\"}[f]===c.labelAlign,y(P.reserveSpace,\"center\"===\nc.labelAlign?!0:null,c.reserveSpaceDefault)&&b.forEach(function(a){q=Math.max(r[a].getLabelSize(),q)}),c.staggerLines&&(q*=c.staggerLines),c.labelOffset=q*(c.opposite?-1:1)):A(r,function(a,c){a.destroy();delete r[c]});if(u&&u.text&&!1!==u.enabled&&(c.addTitle(l),l&&!1!==u.reserveSpace)){c.titleOffset=n=c.axisTitle.getBBox()[e?\"height\":\"width\"];var Q=u.offset;L=k(Q)?0:y(u.margin,e?5:10)}c.renderLine();c.offset=w*y(h.offset,v[f]?v[f]+(h.margin||0):0);c.tickRotCorr=c.tickRotCorr||{x:0,y:0};u=0===f?-c.labelMetrics().h:\n2===f?c.tickRotCorr.y:0;L=Math.abs(q)+L;q&&(L=L-u+w*(e?y(P.y,c.tickRotCorr.y+8*w):P.x));c.axisTitleMargin=y(Q,L);c.getMaxLabelDimensions&&(c.maxLabelDimensions=c.getMaxLabelDimensions(r,b));e=this.tickSize(\"tick\");v[f]=Math.max(v[f],(c.axisTitleMargin||0)+n+w*c.offset,L,b&&b.length&&e?e[0]+w*c.offset:0);h=h.offset?0:2*Math.floor(c.axisLine.strokeWidth()/2);d[m]=Math.max(d[m],h);J(this,\"afterGetOffset\")};e.prototype.getLinePath=function(a){var c=this.chart,d=this.opposite,g=this.offset,h=this.horiz,\nb=this.left+(d?this.width:0)+g;g=c.chartHeight-this.bottom-(d?this.height:0)+g;d&&(a*=-1);return c.renderer.crispLine([[\"M\",h?this.left:b,h?g:this.top],[\"L\",h?c.chartWidth-this.right:b,h?g:c.chartHeight-this.bottom]],a)};e.prototype.renderLine=function(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass(\"highcharts-axis-line\").add(this.axisGroup),this.chart.styledMode||this.axisLine.attr({stroke:this.options.lineColor,\"stroke-width\":this.options.lineWidth,zIndex:7}))};e.prototype.getTitlePosition=\nfunction(){var a=this.horiz,c=this.left,d=this.top,g=this.len,h=this.options.title,b=a?c:d,r=this.opposite,e=this.offset,f=h.x,m=h.y,A=this.axisTitle,y=this.chart.renderer.fontMetrics(h.style.fontSize,A);A=Math.max(A.getBBox(null,0).height-y.h-1,0);g={low:b+(a?0:g),middle:b+g/2,high:b+(a?g:0)}[h.align];c=(a?d+this.height:c)+(a?1:-1)*(r?-1:1)*this.axisTitleMargin+[-A,A,y.f,-A][this.side];a={x:a?g+f:c+(r?this.width:0)+e+f,y:a?c+m-(r?this.height:0)+e:g+m};J(this,\"afterGetTitlePosition\",{titlePosition:a});\nreturn a};e.prototype.renderMinorTick=function(a){var c=this.chart.hasRendered&&this.old,d=this.minorTicks;d[a]||(d[a]=new G(this,a,\"minor\"));c&&d[a].isNew&&d[a].render(null,!0);d[a].render(null,!1,1)};e.prototype.renderTick=function(a,c){var d=this.ticks,g=this.chart.hasRendered&&this.old;if(!this.isLinked||a>=this.min&&a<=this.max||this.grid&&this.grid.isColumn)d[a]||(d[a]=new G(this,a)),g&&d[a].isNew&&d[a].render(c,!0,-1),d[a].render(c)};e.prototype.render=function(){var a=this,c=a.chart,d=a.logarithmic,\nh=a.options,b=a.isLinked,r=a.tickPositions,e=a.axisTitle,f=a.ticks,m=a.minorTicks,y=a.alternateBands,l=h.stackLabels,n=h.alternateGridColor,k=a.tickmarkOffset,L=a.axisLine,u=a.showAxis,q=B(c.renderer.globalAnimation),P,v;a.labelEdge.length=0;a.overlap=!1;[f,m,y].forEach(function(a){A(a,function(a){a.isActive=!1})});if(a.hasData()||b)a.minorTickInterval&&!a.categories&&a.getMinorTickPositions().forEach(function(c){a.renderMinorTick(c)}),r.length&&(r.forEach(function(c,d){a.renderTick(c,d)}),k&&(0===\na.min||a.single)&&(f[-1]||(f[-1]=new G(a,-1,null,!0)),f[-1].render(-1))),n&&r.forEach(function(g,h){v=\"undefined\"!==typeof r[h+1]?r[h+1]+k:a.max-k;0===h%2&&g<a.max&&v<=a.max+(c.polar?-k:k)&&(y[g]||(y[g]=new I.PlotLineOrBand(a)),P=g+k,y[g].options={from:d?d.lin2log(P):P,to:d?d.lin2log(v):v,color:n,className:\"highcharts-alternate-grid\"},y[g].render(),y[g].isActive=!0)}),a._addedPlotLB||(a._addedPlotLB=!0,(h.plotLines||[]).concat(h.plotBands||[]).forEach(function(c){a.addPlotBandOrLine(c)}));[f,m,y].forEach(function(a){var d,\ng=[],h=q.duration;A(a,function(a,c){a.isActive||(a.render(c,!1,0),a.isActive=!1,g.push(c))});V(function(){for(d=g.length;d--;)a[g[d]]&&!a[g[d]].isActive&&(a[g[d]].destroy(),delete a[g[d]])},a!==y&&c.hasRendered&&h?h:0)});L&&(L[L.isPlaced?\"animate\":\"attr\"]({d:this.getLinePath(L.strokeWidth())}),L.isPlaced=!0,L[u?\"show\":\"hide\"](u));e&&u&&(h=a.getTitlePosition(),g(h.y)?(e[e.isNew?\"attr\":\"animate\"](h),e.isNew=!1):(e.attr(\"y\",-9999),e.isNew=!0));l&&l.enabled&&a.stacking&&a.stacking.renderStackTotals();\na.old={len:a.len,max:a.max,min:a.min,transA:a.transA,userMax:a.userMax,userMin:a.userMin};a.isDirty=!1;J(this,\"afterRender\")};e.prototype.redraw=function(){this.visible&&(this.render(),this.plotLinesAndBands.forEach(function(a){a.render()}));this.series.forEach(function(a){a.isDirty=!0})};e.prototype.getKeepProps=function(){return this.keepProps||e.keepProps};e.prototype.destroy=function(a){var c=this,d=c.plotLinesAndBands,g;J(this,\"destroy\",{keepEvents:a});a||P(c);[c.ticks,c.minorTicks,c.alternateBands].forEach(function(a){l(a)});\nif(d)for(a=d.length;a--;)d[a].destroy();\"axisLine axisTitle axisGroup gridGroup labelGroup cross scrollbar\".split(\" \").forEach(function(a){c[a]&&(c[a]=c[a].destroy())});for(g in c.plotLinesAndBandsGroups)c.plotLinesAndBandsGroups[g]=c.plotLinesAndBandsGroups[g].destroy();A(c,function(a,d){-1===c.getKeepProps().indexOf(d)&&delete c[d]})};e.prototype.drawCrosshair=function(a,c){var d=this.crosshair,g=y(d&&d.snap,!0),h,r=this.cross,e=this.chart;J(this,\"drawCrosshair\",{e:a,point:c});a||(a=this.cross&&\nthis.cross.e);if(d&&!1!==(k(c)||!g)){g?k(c)&&(h=y(\"colorAxis\"!==this.coll?c.crosshairPos:null,this.isXAxis?c.plotX:this.len-c.plotY)):h=a&&(this.horiz?a.chartX-this.pos:this.len-a.chartY+this.pos);if(k(h)){var f={value:c&&(this.isXAxis?c.x:y(c.stackY,c.y)),translatedValue:h};e.polar&&n(f,{isCrosshair:!0,chartX:a&&a.chartX,chartY:a&&a.chartY,point:c});f=this.getPlotLinePath(f)||null}if(!k(f)){this.hideCrosshair();return}g=this.categories&&!this.isRadial;r||(this.cross=r=e.renderer.path().addClass(\"highcharts-crosshair highcharts-crosshair-\"+\n(g?\"category \":\"thin \")+(d.className||\"\")).attr({zIndex:y(d.zIndex,2)}).add(),e.styledMode||(r.attr({stroke:d.color||(g?b.parse(z.highlightColor20).setOpacity(.25).get():z.neutralColor20),\"stroke-width\":y(d.width,1)}).css({\"pointer-events\":\"none\"}),d.dashStyle&&r.attr({dashstyle:d.dashStyle})));r.show().attr({d:f});g&&!d.width&&r.attr({\"stroke-width\":this.transA});this.cross.e=a}else this.hideCrosshair();J(this,\"afterDrawCrosshair\",{e:a,point:c})};e.prototype.hideCrosshair=function(){this.cross&&\nthis.cross.hide();J(this,\"afterHideCrosshair\")};e.prototype.hasVerticalPanning=function(){var a=this.chart.options.chart.panning;return!!(a&&a.enabled&&/y/.test(a.type))};e.prototype.validatePositiveValue=function(a){return g(a)&&0<a};e.prototype.update=function(a,c){var d=this.chart,g=a&&a.events||{};a=h(this.userOptions,a);A(d.options[this.coll].events,function(a,c){\"undefined\"===typeof g[c]&&(g[c]=void 0)});this.destroy(!0);this.init(d,n(a,{events:g}));d.isDirtyBox=!0;y(c,!0)&&d.redraw()};e.prototype.remove=\nfunction(a){for(var c=this.chart,d=this.coll,g=this.series,h=g.length;h--;)g[h]&&g[h].remove(!1);N(c.axes,this);N(c[d],this);c[d].forEach(function(a,c){a.options.index=a.userOptions.index=c});this.destroy();c.isDirtyBox=!0;y(a,!0)&&c.redraw()};e.prototype.setTitle=function(a,c){this.update({title:a},c)};e.prototype.setCategories=function(a,c){this.update({categories:a},c)};e.defaultOptions={alignTicks:!0,allowDecimals:void 0,zIndex:2,zoomEnabled:!0,dateTimeLabelFormats:{millisecond:{main:\"%H:%M:%S.%L\",\nrange:!1},second:{main:\"%H:%M:%S\",range:!1},minute:{main:\"%H:%M\",range:!1},hour:{main:\"%H:%M\",range:!1},day:{main:\"%e. %b\"},week:{main:\"%e. %b\"},month:{main:\"%b '%y\"},year:{main:\"%Y\"}},endOnTick:!1,gridLineDashStyle:\"Solid\",gridZIndex:1,labels:{autoRotation:void 0,autoRotationLimit:80,distance:void 0,enabled:!0,indentation:10,overflow:\"justify\",padding:5,reserveSpace:void 0,rotation:void 0,staggerLines:0,step:0,useHTML:!1,x:0,zIndex:7,style:{color:z.neutralColor60,cursor:\"default\",fontSize:\"11px\"}},\nmaxPadding:.01,minorGridLineDashStyle:\"Solid\",minorTickLength:2,minorTickPosition:\"outside\",minPadding:.01,offset:void 0,opposite:!1,reversed:void 0,reversedStacks:!1,showEmpty:!0,showFirstLabel:!0,showLastLabel:!0,startOfWeek:1,startOnTick:!1,tickLength:10,tickPixelInterval:100,tickmarkPlacement:\"between\",tickPosition:\"outside\",title:{align:\"middle\",rotation:0,useHTML:!1,x:0,y:0,style:{color:z.neutralColor60}},type:\"linear\",uniqueNames:!0,visible:!0,minorGridLineColor:z.neutralColor5,minorGridLineWidth:1,\nminorTickColor:z.neutralColor40,lineColor:z.highlightColor20,lineWidth:1,gridLineColor:z.neutralColor10,gridLineWidth:void 0,tickColor:z.highlightColor20};e.defaultYAxisOptions={reversedStacks:!0,endOnTick:!0,maxPadding:.05,minPadding:.05,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8},startOnTick:!0,title:{rotation:270,text:\"Values\"},stackLabels:{animation:{},allowOverlap:!1,enabled:!1,crop:!0,overflow:\"justify\",formatter:function(){var a=this.axis.chart.numberFormatter;return a(this.total,-1)},\nstyle:{color:z.neutralColor100,fontSize:\"11px\",fontWeight:\"bold\",textOutline:\"1px contrast\"}},gridLineWidth:1,lineWidth:0};e.defaultLeftAxisOptions={labels:{x:-15},title:{rotation:270}};e.defaultRightAxisOptions={labels:{x:15},title:{rotation:90}};e.defaultBottomAxisOptions={labels:{autoRotation:[-45],x:0},margin:15,title:{rotation:0}};e.defaultTopAxisOptions={labels:{autoRotation:[-45],x:0},margin:15,title:{rotation:0}};e.keepProps=\"extKey hcEvents names series userMax userMin\".split(\" \");return e}();\nI.Axis=e;return I.Axis});O(e,\"Core/Axis/DateTimeAxis.js\",[e[\"Core/Axis/Axis.js\"],e[\"Core/Utilities.js\"]],function(e,b){var D=b.addEvent,z=b.getMagnitude,H=b.normalizeTickInterval,G=b.timeUnits,C=function(){function b(b){this.axis=b}b.prototype.normalizeTimeTickInterval=function(b,e){var v=e||[[\"millisecond\",[1,2,5,10,20,25,50,100,200,500]],[\"second\",[1,2,5,10,15,30]],[\"minute\",[1,2,5,10,15,30]],[\"hour\",[1,2,3,4,6,8,12]],[\"day\",[1,2]],[\"week\",[1,2]],[\"month\",[1,2,3,4,6]],[\"year\",null]];e=v[v.length-\n1];var f=G[e[0]],d=e[1],q;for(q=0;q<v.length&&!(e=v[q],f=G[e[0]],d=e[1],v[q+1]&&b<=(f*d[d.length-1]+G[v[q+1][0]])/2);q++);f===G.year&&b<5*f&&(d=[1,2,5]);b=H(b/f,d,\"year\"===e[0]?Math.max(z(b/f),1):1);return{unitRange:f,count:b,unitName:e[0]}};return b}();b=function(){function b(){}b.compose=function(b){b.keepProps.push(\"dateTime\");b.prototype.getTimeTicks=function(){return this.chart.time.getTimeTicks.apply(this.chart.time,arguments)};D(b,\"init\",function(b){\"datetime\"!==b.userOptions.type?this.dateTime=\nvoid 0:this.dateTime||(this.dateTime=new C(this))})};b.AdditionsClass=C;return b}();b.compose(e);return b});O(e,\"Core/Axis/LogarithmicAxis.js\",[e[\"Core/Axis/Axis.js\"],e[\"Core/Utilities.js\"]],function(e,b){var D=b.addEvent,z=b.getMagnitude,H=b.normalizeTickInterval,G=b.pick,C=function(){function b(b){this.axis=b}b.prototype.getLogTickPositions=function(b,e,v,f){var d=this.axis,q=d.len,k=d.options,l=[];f||(this.minorAutoInterval=void 0);if(.5<=b)b=Math.round(b),l=d.getLinearTickPositions(b,e,v);else if(.08<=\nb){var w=Math.floor(e),u,n=k=void 0;for(q=.3<b?[1,2,4]:.15<b?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];w<v+1&&!n;w++){var J=q.length;for(u=0;u<J&&!n;u++){var E=this.log2lin(this.lin2log(w)*q[u]);E>e&&(!f||k<=v)&&\"undefined\"!==typeof k&&l.push(k);k>v&&(n=!0);k=E}}}else e=this.lin2log(e),v=this.lin2log(v),b=f?d.getMinorTickInterval():k.tickInterval,b=G(\"auto\"===b?null:b,this.minorAutoInterval,k.tickPixelInterval/(f?5:1)*(v-e)/((f?q/d.tickPositions.length:q)||1)),b=H(b,void 0,z(b)),l=d.getLinearTickPositions(b,\ne,v).map(this.log2lin),f||(this.minorAutoInterval=b/5);f||(d.tickInterval=b);return l};b.prototype.lin2log=function(b){return Math.pow(10,b)};b.prototype.log2lin=function(b){return Math.log(b)/Math.LN10};return b}();b=function(){function b(){}b.compose=function(b){b.keepProps.push(\"logarithmic\");D(b,\"init\",function(b){var e=this.logarithmic;\"logarithmic\"!==b.userOptions.type?this.logarithmic=void 0:e||(this.logarithmic=new C(this))});D(b,\"afterInit\",function(){var b=this.logarithmic;b&&(this.lin2val=\nfunction(e){return b.lin2log(e)},this.val2lin=function(e){return b.log2lin(e)})})};return b}();b.compose(e);return b});O(e,\"Core/Axis/PlotLineOrBand.js\",[e[\"Core/Axis/Axis.js\"],e[\"Core/Globals.js\"],e[\"Core/Color/Palette.js\"],e[\"Core/Utilities.js\"]],function(e,b,I,z){var D=z.arrayMax,G=z.arrayMin,C=z.defined,B=z.destroyObjectProperties,x=z.erase,w=z.extend,v=z.fireEvent,f=z.isNumber,d=z.merge,q=z.objectEach,k=z.pick;z=function(){function b(d,b){this.axis=d;b&&(this.options=b,this.id=b.id)}b.prototype.render=\nfunction(){v(this,\"render\");var b=this,e=b.axis,f=e.horiz,l=e.logarithmic,E=b.options,m=E.label,c=b.label,g=E.to,a=E.from,h=E.value,r=C(a)&&C(g),A=C(h),y=b.svgElem,L=!y,P=[],R=E.color,w=k(E.zIndex,0),Q=E.events;P={\"class\":\"highcharts-plot-\"+(r?\"band \":\"line \")+(E.className||\"\")};var M={},t=e.chart.renderer,p=r?\"bands\":\"lines\";l&&(a=l.log2lin(a),g=l.log2lin(g),h=l.log2lin(h));e.chart.styledMode||(A?(P.stroke=R||I.neutralColor40,P[\"stroke-width\"]=k(E.width,1),E.dashStyle&&(P.dashstyle=E.dashStyle)):\nr&&(P.fill=R||I.highlightColor10,E.borderWidth&&(P.stroke=E.borderColor,P[\"stroke-width\"]=E.borderWidth)));M.zIndex=w;p+=\"-\"+w;(l=e.plotLinesAndBandsGroups[p])||(e.plotLinesAndBandsGroups[p]=l=t.g(\"plot-\"+p).attr(M).add());L&&(b.svgElem=y=t.path().attr(P).add(l));if(A)P=e.getPlotLinePath({value:h,lineWidth:y.strokeWidth(),acrossPanes:E.acrossPanes});else if(r)P=e.getPlotBandPath(a,g,E);else return;!b.eventsAdded&&Q&&(q(Q,function(a,c){y.on(c,function(a){Q[c].apply(b,[a])})}),b.eventsAdded=!0);(L||\n!y.d)&&P&&P.length?y.attr({d:P}):y&&(P?(y.show(!0),y.animate({d:P})):y.d&&(y.hide(),c&&(b.label=c=c.destroy())));m&&(C(m.text)||C(m.formatter))&&P&&P.length&&0<e.width&&0<e.height&&!P.isFlat?(m=d({align:f&&r&&\"center\",x:f?!r&&4:10,verticalAlign:!f&&r&&\"middle\",y:f?r?16:10:r?6:-4,rotation:f&&!r&&90},m),this.renderLabel(m,P,r,w)):c&&c.hide();return b};b.prototype.renderLabel=function(d,b,e,f){var l=this.label,m=this.axis.chart.renderer;l||(l={align:d.textAlign||d.align,rotation:d.rotation,\"class\":\"highcharts-plot-\"+\n(e?\"band\":\"line\")+\"-label \"+(d.className||\"\")},l.zIndex=f,f=this.getLabelText(d),this.label=l=m.text(f,0,0,d.useHTML).attr(l).add(),this.axis.chart.styledMode||l.css(d.style));m=b.xBounds||[b[0][1],b[1][1],e?b[2][1]:b[0][1]];b=b.yBounds||[b[0][2],b[1][2],e?b[2][2]:b[0][2]];e=G(m);f=G(b);l.align(d,!1,{x:e,y:f,width:D(m)-e,height:D(b)-f});l.show(!0)};b.prototype.getLabelText=function(d){return C(d.formatter)?d.formatter.call(this):d.text};b.prototype.destroy=function(){x(this.axis.plotLinesAndBands,\nthis);delete this.axis;B(this)};return b}();w(e.prototype,{getPlotBandPath:function(d,b,e){void 0===e&&(e=this.options);var l=this.getPlotLinePath({value:b,force:!0,acrossPanes:e.acrossPanes});e=this.getPlotLinePath({value:d,force:!0,acrossPanes:e.acrossPanes});var k=[],q=this.horiz,m=1;d=!f(this.min)||!f(this.max)||d<this.min&&b<this.min||d>this.max&&b>this.max;if(e&&l){if(d){var c=e.toString()===l.toString();m=0}for(d=0;d<e.length;d+=2){b=e[d];var g=e[d+1],a=l[d],h=l[d+1];\"M\"!==b[0]&&\"L\"!==b[0]||\n\"M\"!==g[0]&&\"L\"!==g[0]||\"M\"!==a[0]&&\"L\"!==a[0]||\"M\"!==h[0]&&\"L\"!==h[0]||(q&&a[1]===b[1]?(a[1]+=m,h[1]+=m):q||a[2]!==b[2]||(a[2]+=m,h[2]+=m),k.push([\"M\",b[1],b[2]],[\"L\",g[1],g[2]],[\"L\",h[1],h[2]],[\"L\",a[1],a[2]],[\"Z\"]));k.isFlat=c}}return k},addPlotBand:function(d){return this.addPlotBandOrLine(d,\"plotBands\")},addPlotLine:function(d){return this.addPlotBandOrLine(d,\"plotLines\")},addPlotBandOrLine:function(d,e){var f=this,l=new b.PlotLineOrBand(this,d),k=this.userOptions;this.visible&&(l=l.render());\nif(l){this._addedPlotLB||(this._addedPlotLB=!0,(k.plotLines||[]).concat(k.plotBands||[]).forEach(function(d){f.addPlotBandOrLine(d)}));if(e){var q=k[e]||[];q.push(d);k[e]=q}this.plotLinesAndBands.push(l)}return l},removePlotBandOrLine:function(d){for(var b=this.plotLinesAndBands,e=this.options,f=this.userOptions,l=b.length;l--;)b[l].id===d&&b[l].destroy();[e.plotLines||[],f.plotLines||[],e.plotBands||[],f.plotBands||[]].forEach(function(b){for(l=b.length;l--;)(b[l]||{}).id===d&&x(b,b[l])})},removePlotBand:function(d){this.removePlotBandOrLine(d)},\nremovePlotLine:function(d){this.removePlotBandOrLine(d)}});b.PlotLineOrBand=z;return b.PlotLineOrBand});O(e,\"Core/Tooltip.js\",[e[\"Core/FormatUtilities.js\"],e[\"Core/Globals.js\"],e[\"Core/Color/Palette.js\"],e[\"Core/Utilities.js\"]],function(e,b,I,z){var D=e.format,G=b.doc,C=z.clamp,B=z.css,x=z.defined,w=z.discardElement,v=z.extend,f=z.fireEvent,d=z.isArray,q=z.isNumber,k=z.isString,l=z.merge,N=z.pick,u=z.splat,n=z.syncTimeout,J=z.timeUnits;\"\";e=function(){function e(d,c){this.container=void 0;this.crosshairs=\n[];this.distance=0;this.isHidden=!0;this.isSticky=!1;this.now={};this.options={};this.outside=!1;this.chart=d;this.init(d,c)}e.prototype.applyFilter=function(){var d=this.chart;d.renderer.definition({tagName:\"filter\",attributes:{id:\"drop-shadow-\"+d.index,opacity:.5},children:[{tagName:\"feGaussianBlur\",attributes:{\"in\":\"SourceAlpha\",stdDeviation:1}},{tagName:\"feOffset\",attributes:{dx:1,dy:1}},{tagName:\"feComponentTransfer\",children:[{tagName:\"feFuncA\",attributes:{type:\"linear\",slope:.3}}]},{tagName:\"feMerge\",\nchildren:[{tagName:\"feMergeNode\"},{tagName:\"feMergeNode\",attributes:{\"in\":\"SourceGraphic\"}}]}]});d.renderer.definition({tagName:\"style\",textContent:\".highcharts-tooltip-\"+d.index+\"{filter:url(#drop-shadow-\"+d.index+\")}\"})};e.prototype.bodyFormatter=function(d){return d.map(function(c){var d=c.series.tooltipOptions;return(d[(c.point.formatPrefix||\"point\")+\"Formatter\"]||c.point.tooltipFormatter).call(c.point,d[(c.point.formatPrefix||\"point\")+\"Format\"]||\"\")})};e.prototype.cleanSplit=function(d){this.chart.series.forEach(function(c){var b=\nc&&c.tt;b&&(!b.isActive||d?c.tt=b.destroy():b.isActive=!1)})};e.prototype.defaultFormatter=function(d){var c=this.points||u(this);var b=[d.tooltipFooterHeaderFormatter(c[0])];b=b.concat(d.bodyFormatter(c));b.push(d.tooltipFooterHeaderFormatter(c[0],!0));return b};e.prototype.destroy=function(){this.label&&(this.label=this.label.destroy());this.split&&this.tt&&(this.cleanSplit(this.chart,!0),this.tt=this.tt.destroy());this.renderer&&(this.renderer=this.renderer.destroy(),w(this.container));z.clearTimeout(this.hideTimer);\nz.clearTimeout(this.tooltipTimeout)};e.prototype.getAnchor=function(d,c){var b=this.chart;var a=b.pointer;var h=b.inverted,e=b.plotTop,f=b.plotLeft,m=0,l=0,k,n;d=u(d);this.followPointer&&c?(\"undefined\"===typeof c.chartX&&(c=a.normalize(c)),a=[c.chartX-f,c.chartY-e]):d[0].tooltipPos?a=d[0].tooltipPos:(d.forEach(function(a){k=a.series.yAxis;n=a.series.xAxis;m+=a.plotX||0;l+=a.plotLow?(a.plotLow+(a.plotHigh||0))/2:a.plotY||0;n&&k&&(h?(m+=e+b.plotHeight-n.len-n.pos,l+=f+b.plotWidth-k.len-k.pos):(m+=n.pos-\nf,l+=k.pos-e))}),m/=d.length,l/=d.length,a=[h?b.plotWidth-l:m,h?b.plotHeight-m:l],this.shared&&1<d.length&&c&&(h?a[0]=c.chartX-f:a[1]=c.chartY-e));return a.map(Math.round)};e.prototype.getDateFormat=function(d,c,b,a){var h=this.chart.time,g=h.dateFormat(\"%m-%d %H:%M:%S.%L\",c),e={millisecond:15,second:12,minute:9,hour:6,day:3},f=\"millisecond\";for(m in J){if(d===J.week&&+h.dateFormat(\"%w\",c)===b&&\"00:00:00.000\"===g.substr(6)){var m=\"week\";break}if(J[m]>d){m=f;break}if(e[m]&&g.substr(e[m])!==\"01-01 00:00:00.000\".substr(e[m]))break;\n\"week\"!==m&&(f=m)}if(m)var l=h.resolveDTLFormat(a[m]).main;return l};e.prototype.getLabel=function(){var d=this,c=this.chart.renderer,g=this.chart.styledMode,a=this.options,h=\"tooltip\"+(x(a.className)?\" \"+a.className:\"\"),e=a.style&&a.style.pointerEvents||(!this.followPointer&&a.stickOnContact?\"auto\":\"none\"),f,y=function(){d.inContact=!0},l=function(){var a=d.chart.hoverSeries;d.inContact=!1;if(a&&a.onMouseOut)a.onMouseOut()};if(!this.label){if(this.outside){var k=this.chart.options.chart.style;this.container=\nf=b.doc.createElement(\"div\");f.className=\"highcharts-tooltip-container\";B(f,{position:\"absolute\",top:\"1px\",pointerEvents:e,zIndex:Math.max(this.options.style&&this.options.style.zIndex||0,(k&&k.zIndex||0)+3)});b.doc.body.appendChild(f);this.renderer=c=new b.Renderer(f,0,0,k,void 0,void 0,c.styledMode)}this.split?this.label=c.g(h):(this.label=c.label(\"\",0,0,a.shape||\"callout\",null,null,a.useHTML,null,h).attr({padding:a.padding,r:a.borderRadius}),g||this.label.attr({fill:a.backgroundColor,\"stroke-width\":a.borderWidth}).css(a.style).css({pointerEvents:e}).shadow(a.shadow));\ng&&(this.applyFilter(),this.label.addClass(\"highcharts-tooltip-\"+this.chart.index));if(d.outside&&!d.split){var n=this.label,q=n.xSetter,u=n.ySetter;n.xSetter=function(a){q.call(n,d.distance);f.style.left=a+\"px\"};n.ySetter=function(a){u.call(n,d.distance);f.style.top=a+\"px\"}}this.label.on(\"mouseenter\",y).on(\"mouseleave\",l).attr({zIndex:8}).add()}return this.label};e.prototype.getPosition=function(d,c,b){var a=this.chart,h=this.distance,g={},e=a.inverted&&b.h||0,f,m=this.outside,l=m?G.documentElement.clientWidth-\n2*h:a.chartWidth,k=m?Math.max(G.body.scrollHeight,G.documentElement.scrollHeight,G.body.offsetHeight,G.documentElement.offsetHeight,G.documentElement.clientHeight):a.chartHeight,n=a.pointer.getChartPosition(),q=function(g){var e=\"x\"===g;return[g,e?l:k,e?d:c].concat(m?[e?d*n.scaleX:c*n.scaleY,e?n.left-h+(b.plotX+a.plotLeft)*n.scaleX:n.top-h+(b.plotY+a.plotTop)*n.scaleY,0,e?l:k]:[e?d:c,e?b.plotX+a.plotLeft:b.plotY+a.plotTop,e?a.plotLeft:a.plotTop,e?a.plotLeft+a.plotWidth:a.plotTop+a.plotHeight])},u=\nq(\"y\"),t=q(\"x\"),p=!this.followPointer&&N(b.ttBelow,!a.inverted===!!b.negative),v=function(a,c,d,b,r,f,A){var y=m?\"y\"===a?h*n.scaleY:h*n.scaleX:h,l=(d-b)/2,F=b<r-h,k=r+h+b<c,K=r-y-d+l;r=r+y-l;if(p&&k)g[a]=r;else if(!p&&F)g[a]=K;else if(F)g[a]=Math.min(A-b,0>K-e?K:K-e);else if(k)g[a]=Math.max(f,r+e+d>c?r:r+e);else return!1},w=function(a,c,d,b,e){var r;e<h||e>c-h?r=!1:g[a]=e<d/2?1:e>c-b/2?c-b-2:e-d/2;return r},E=function(a){var c=u;u=t;t=c;f=a},F=function(){!1!==v.apply(0,u)?!1!==w.apply(0,t)||f||(E(!0),\nF()):f?g.x=g.y=0:(E(!0),F())};(a.inverted||1<this.len)&&E();F();return g};e.prototype.getXDateFormat=function(d,c,b){c=c.dateTimeLabelFormats;var a=b&&b.closestPointRange;return(a?this.getDateFormat(a,d.x,b.options.startOfWeek,c):c.day)||c.year};e.prototype.hide=function(d){var c=this;z.clearTimeout(this.hideTimer);d=N(d,this.options.hideDelay,500);this.isHidden||(this.hideTimer=n(function(){c.getLabel().fadeOut(d?void 0:d);c.isHidden=!0},d))};e.prototype.init=function(d,c){this.chart=d;this.options=\nc;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.split=c.split&&!d.inverted&&!d.polar;this.shared=c.shared||this.split;this.outside=N(c.outside,!(!d.scrollablePixelsX&&!d.scrollablePixelsY))};e.prototype.isStickyOnContact=function(){return!(this.followPointer||!this.options.stickOnContact||!this.inContact)};e.prototype.move=function(d,c,b,a){var h=this,g=h.now,e=!1!==h.options.animation&&!h.isHidden&&(1<Math.abs(d-g.x)||1<Math.abs(c-g.y)),f=h.followPointer||1<h.len;v(g,{x:e?(2*g.x+d)/\n3:d,y:e?(g.y+c)/2:c,anchorX:f?void 0:e?(2*g.anchorX+b)/3:b,anchorY:f?void 0:e?(g.anchorY+a)/2:a});h.getLabel().attr(g);h.drawTracker();e&&(z.clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){h&&h.move(d,c,b,a)},32))};e.prototype.refresh=function(b,c){var g=this.chart,a=this.options,h=u(b),e=h[0],m={},y=[],l=a.formatter||this.defaultFormatter;m=this.shared;var k=g.styledMode;if(a.enabled){z.clearTimeout(this.hideTimer);this.followPointer=!this.split&&e.series.tooltipOptions.followPointer;\nvar n=this.getAnchor(b,c);var q=n[0];var v=n[1];!m||!d(b)&&b.series&&b.series.noSharedTooltip?m=e.getLabelConfig():(g.pointer.applyInactiveState(h),h.forEach(function(a){a.setState(\"hover\");y.push(a.getLabelConfig())}),m={x:e.category,y:e.y},m.points=y);this.len=y.length;b=l.call(m,this);l=e.series;this.distance=N(l.tooltipOptions.distance,16);if(!1===b)this.hide();else{if(this.split)this.renderSplit(b,h);else if(h=q,m=v,c&&g.pointer.isDirectTouch&&(h=c.chartX-g.plotLeft,m=c.chartY-g.plotTop),g.polar||\n!1===l.options.clip||l.shouldShowTooltip(h,m))c=this.getLabel(),a.style.width&&!k||c.css({width:this.chart.spacingBox.width+\"px\"}),c.attr({text:b&&b.join?b.join(\"\"):b}),c.removeClass(/highcharts-color-[\\d]+/g).addClass(\"highcharts-color-\"+N(e.colorIndex,l.colorIndex)),k||c.attr({stroke:a.borderColor||e.color||l.color||I.neutralColor60}),this.updatePosition({plotX:q,plotY:v,negative:e.negative,ttBelow:e.ttBelow,h:n[2]||0});else{this.hide();return}this.isHidden&&this.label&&this.label.attr({opacity:1}).show();\nthis.isHidden=!1}f(this,\"refresh\")}};e.prototype.renderSplit=function(d,c){function g(c,d,b,g,h){void 0===h&&(h=!0);b?(d=X?0:ba,c=C(c-g/2,S.left,S.right-g-(a.outside?U:0))):(d-=B,c=h?c-g-J:c+J,c=C(c,h?c:S.left,S.right));return{x:c,y:d}}var a=this,h=a.chart,e=a.chart,f=e.chartWidth,m=e.chartHeight,l=e.plotHeight,n=e.plotLeft,q=e.plotTop,u=e.pointer,w=e.scrollablePixelsY;w=void 0===w?0:w;var E=e.scrollablePixelsX,t=e.scrollingContainer;t=void 0===t?{scrollLeft:0,scrollTop:0}:t;var p=t.scrollLeft;t=\nt.scrollTop;var x=e.styledMode,J=a.distance,D=a.options,F=a.options.positioner,S=a.outside&&\"number\"!==typeof E?G.documentElement.getBoundingClientRect():{left:p,right:p+f,top:t,bottom:t+m},K=a.getLabel(),T=this.renderer||h.renderer,X=!(!h.xAxis[0]||!h.xAxis[0].opposite);h=u.getChartPosition();var U=h.left;h=h.top;var B=q+t,z=0,ba=l-w;k(d)&&(d=[!1,d]);d=d.slice(0,c.length+1).reduce(function(d,b,h){if(!1!==b&&\"\"!==b){h=c[h-1]||{isHeader:!0,plotX:c[0].plotX,plotY:l,series:{}};var e=h.isHeader,r=e?a:\nh.series;b=b.toString();var f=r.tt,m=h.isHeader;var A=h.series;var y=\"highcharts-color-\"+N(h.colorIndex,A.colorIndex,\"none\");f||(f={padding:D.padding,r:D.borderRadius},x||(f.fill=D.backgroundColor,f[\"stroke-width\"]=D.borderWidth),f=T.label(\"\",0,0,D[m?\"headerShape\":\"shape\"]||\"callout\",void 0,void 0,D.useHTML).addClass((m?\"highcharts-tooltip-header \":\"\")+\"highcharts-tooltip-box \"+y).attr(f).add(K));f.isActive=!0;f.attr({text:b});x||f.css(D.style).shadow(D.shadow).attr({stroke:D.borderColor||h.color||\nA.color||I.neutralColor80});r=r.tt=f;m=r.getBBox();b=m.width+r.strokeWidth();e&&(z=m.height,ba+=z,X&&(B-=z));A=h.plotX;A=void 0===A?0:A;y=h.plotY;y=void 0===y?0:y;f=h.series;if(h.isHeader){A=n+A;var k=q+l/2}else{var p=f.xAxis,t=f.yAxis;A=p.pos+C(A,-J,p.len+J);f.shouldShowTooltip(0,t.pos-q+y,{ignoreX:!0})&&(k=t.pos+y)}A=C(A,S.left-J,S.right+J);\"number\"===typeof k?(m=m.height+1,y=F?F.call(a,b,m,h):g(A,k,e,b),d.push({align:F?0:void 0,anchorX:A,anchorY:k,boxWidth:b,point:h,rank:N(y.rank,e?1:0),size:m,\ntarget:y.y,tt:r,x:y.x})):r.isActive=!1}return d},[]);!F&&d.some(function(c){var d=(a.outside?U:0)+c.anchorX;return d<S.left&&d+c.boxWidth<S.right?!0:d<U-S.left+c.boxWidth&&S.right-d>d})&&(d=d.map(function(a){var c=g(a.anchorX,a.anchorY,a.point.isHeader,a.boxWidth,!1);return v(a,{target:c.y,x:c.x})}));a.cleanSplit();b.distribute(d,ba);var H=U,ca=U;d.forEach(function(c){var d=c.x,b=c.boxWidth;c=c.isHeader;c||(a.outside&&U+d<H&&(H=U+d),!c&&a.outside&&H+b>ca&&(ca=U+d))});d.forEach(function(c){var d=c.x,\nb=c.anchorX,h=c.pos,g=c.point.isHeader;h={visibility:\"undefined\"===typeof h?\"hidden\":\"inherit\",x:d,y:h+B,anchorX:b,anchorY:c.anchorY};if(a.outside&&d<b){var e=U-H;0<e&&(g||(h.x=d+e,h.anchorX=b+e),g&&(h.x=(ca-H)/2,h.anchorX=b+e))}c.tt.attr(h)});d=a.container;w=a.renderer;a.outside&&d&&w&&(e=K.getBBox(),w.setSize(e.width+e.x,e.height+e.y,!1),d.style.left=H+\"px\",d.style.top=h+\"px\")};e.prototype.drawTracker=function(){if(this.followPointer||!this.options.stickOnContact)this.tracker&&this.tracker.destroy();\nelse{var d=this.chart,c=this.label,b=d.hoverPoint;if(c&&b){var a={x:0,y:0,width:0,height:0};b=this.getAnchor(b);var h=c.getBBox();b[0]+=d.plotLeft-c.translateX;b[1]+=d.plotTop-c.translateY;a.x=Math.min(0,b[0]);a.y=Math.min(0,b[1]);a.width=0>b[0]?Math.max(Math.abs(b[0]),h.width-b[0]):Math.max(Math.abs(b[0]),h.width);a.height=0>b[1]?Math.max(Math.abs(b[1]),h.height-Math.abs(b[1])):Math.max(Math.abs(b[1]),h.height);this.tracker?this.tracker.attr(a):(this.tracker=c.renderer.rect(a).addClass(\"highcharts-tracker\").add(c),\nd.styledMode||this.tracker.attr({fill:\"rgba(0,0,0,0)\"}))}}};e.prototype.styledModeFormat=function(d){return d.replace('style=\"font-size: 10px\"','class=\"highcharts-header\"').replace(/style=\"color:{(point|series)\\.color}\"/g,'class=\"highcharts-color-{$1.colorIndex}\"')};e.prototype.tooltipFooterHeaderFormatter=function(d,c){var b=c?\"footer\":\"header\",a=d.series,h=a.tooltipOptions,e=h.xDateFormat,m=a.xAxis,l=m&&\"datetime\"===m.options.type&&q(d.key),k=h[b+\"Format\"];c={isFooter:c,labelConfig:d};f(this,\"headerFormatter\",\nc,function(c){l&&!e&&(e=this.getXDateFormat(d,h,m));l&&e&&(d.point&&d.point.tooltipDateKeys||[\"key\"]).forEach(function(a){k=k.replace(\"{point.\"+a+\"}\",\"{point.\"+a+\":\"+e+\"}\")});a.chart.styledMode&&(k=this.styledModeFormat(k));c.text=D(k,{point:d,series:a},this.chart)});return c.text};e.prototype.update=function(d){this.destroy();l(!0,this.chart.options.tooltip.userOptions,d);this.init(this.chart,l(!0,this.options,d))};e.prototype.updatePosition=function(d){var c=this.chart,b=c.pointer,a=this.getLabel(),\nh=d.plotX+c.plotLeft;c=d.plotY+c.plotTop;b=b.getChartPosition();d=(this.options.positioner||this.getPosition).call(this,a.width,a.height,d);if(this.outside){var e=(this.options.borderWidth||0)+2*this.distance;this.renderer.setSize(a.width+e,a.height+e,!1);if(1!==b.scaleX||1!==b.scaleY)B(this.container,{transform:\"scale(\"+b.scaleX+\", \"+b.scaleY+\")\"}),h*=b.scaleX,c*=b.scaleY;h+=b.left-d.x;c+=b.top-d.y}this.move(Math.round(d.x),Math.round(d.y||0),h,c)};return e}();b.Tooltip=e;return b.Tooltip});O(e,\n\"Core/Pointer.js\",[e[\"Core/Color/Color.js\"],e[\"Core/Globals.js\"],e[\"Core/Color/Palette.js\"],e[\"Core/Tooltip.js\"],e[\"Core/Utilities.js\"]],function(e,b,I,z,H){var D=e.parse,C=b.charts,B=b.noop,x=H.addEvent,w=H.attr,v=H.css,f=H.defined,d=H.extend,q=H.find,k=H.fireEvent,l=H.isNumber,N=H.isObject,u=H.objectEach,n=H.offset,J=H.pick,E=H.splat;\"\";e=function(){function e(c,d){this.lastValidTouch={};this.pinchDown=[];this.runChartClick=!1;this.eventsToUnbind=[];this.chart=c;this.hasDragged=!1;this.options=\nd;this.init(c,d)}e.prototype.applyInactiveState=function(c){var d=[],a;(c||[]).forEach(function(c){a=c.series;d.push(a);a.linkedParent&&d.push(a.linkedParent);a.linkedSeries&&(d=d.concat(a.linkedSeries));a.navigatorSeries&&d.push(a.navigatorSeries)});this.chart.series.forEach(function(a){-1===d.indexOf(a)?a.setState(\"inactive\",!0):a.options.inactiveOtherPoints&&a.setAllPointsToState(\"inactive\")})};e.prototype.destroy=function(){var c=this;this.eventsToUnbind.forEach(function(c){return c()});this.eventsToUnbind=\n[];b.chartCount||(b.unbindDocumentMouseUp&&(b.unbindDocumentMouseUp=b.unbindDocumentMouseUp()),b.unbindDocumentTouchEnd&&(b.unbindDocumentTouchEnd=b.unbindDocumentTouchEnd()));clearInterval(c.tooltipTimeout);u(c,function(d,a){c[a]=void 0})};e.prototype.drag=function(c){var d=this.chart,a=d.options.chart,b=c.chartX,e=c.chartY,f=this.zoomHor,l=this.zoomVert,m=d.plotLeft,k=d.plotTop,n=d.plotWidth,q=d.plotHeight,u=this.selectionMarker,v=this.mouseDownX||0,t=this.mouseDownY||0,p=N(a.panning)?a.panning&&\na.panning.enabled:a.panning,w=a.panKey&&c[a.panKey+\"Key\"];if(!u||!u.touch)if(b<m?b=m:b>m+n&&(b=m+n),e<k?e=k:e>k+q&&(e=k+q),this.hasDragged=Math.sqrt(Math.pow(v-b,2)+Math.pow(t-e,2)),10<this.hasDragged){var E=d.isInsidePlot(v-m,t-k,{visiblePlotOnly:!0});d.hasCartesianSeries&&(this.zoomX||this.zoomY)&&E&&!w&&!u&&(this.selectionMarker=u=d.renderer.rect(m,k,f?1:n,l?1:q,0).attr({\"class\":\"highcharts-selection-marker\",zIndex:7}).add(),d.styledMode||u.attr({fill:a.selectionMarkerFill||D(I.highlightColor80).setOpacity(.25).get()}));\nu&&f&&(b-=v,u.attr({width:Math.abs(b),x:(0<b?0:b)+v}));u&&l&&(b=e-t,u.attr({height:Math.abs(b),y:(0<b?0:b)+t}));E&&!u&&p&&d.pan(c,a.panning)}};e.prototype.dragStart=function(c){var d=this.chart;d.mouseIsDown=c.type;d.cancelClick=!1;d.mouseDownX=this.mouseDownX=c.chartX;d.mouseDownY=this.mouseDownY=c.chartY};e.prototype.drop=function(c){var b=this,a=this.chart,h=this.hasPinched;if(this.selectionMarker){var e={originalEvent:c,xAxis:[],yAxis:[]},A=this.selectionMarker,m=A.attr?A.attr(\"x\"):A.x,n=A.attr?\nA.attr(\"y\"):A.y,q=A.attr?A.attr(\"width\"):A.width,u=A.attr?A.attr(\"height\"):A.height,w;if(this.hasDragged||h)a.axes.forEach(function(a){if(a.zoomEnabled&&f(a.min)&&(h||b[{xAxis:\"zoomX\",yAxis:\"zoomY\"}[a.coll]])&&l(m)&&l(n)){var d=a.horiz,g=\"touchend\"===c.type?a.minPixelPadding:0,r=a.toValue((d?m:n)+g);d=a.toValue((d?m+q:n+u)-g);e[a.coll].push({axis:a,min:Math.min(r,d),max:Math.max(r,d)});w=!0}}),w&&k(a,\"selection\",e,function(c){a.zoom(d(c,h?{animation:!1}:null))});l(a.index)&&(this.selectionMarker=\nthis.selectionMarker.destroy());h&&this.scaleGroups()}a&&l(a.index)&&(v(a.container,{cursor:a._cursor}),a.cancelClick=10<this.hasDragged,a.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[])};e.prototype.findNearestKDPoint=function(c,d,a){var b=this.chart,g=b.hoverPoint;b=b.tooltip;if(g&&b&&b.isStickyOnContact())return g;var e;c.forEach(function(c){var b=!(c.noSharedTooltip&&d)&&0>c.options.findNearestPointBy.indexOf(\"y\");c=c.searchPoint(a,b);if((b=N(c,!0)&&c.series)&&!(b=!N(e,!0))){b=\ne.distX-c.distX;var h=e.dist-c.dist,g=(c.series.group&&c.series.group.zIndex)-(e.series.group&&e.series.group.zIndex);b=0<(0!==b&&d?b:0!==h?h:0!==g?g:e.series.index>c.series.index?-1:1)}b&&(e=c)});return e};e.prototype.getChartCoordinatesFromPoint=function(c,d){var a=c.series,b=a.xAxis;a=a.yAxis;var g=c.shapeArgs;if(b&&a){var e=J(c.clientX,c.plotX),f=c.plotY||0;c.isNode&&g&&l(g.x)&&l(g.y)&&(e=g.x,f=g.y);return d?{chartX:a.len+a.pos-f,chartY:b.len+b.pos-e}:{chartX:e+b.pos,chartY:f+a.pos}}if(g&&g.x&&\ng.y)return{chartX:g.x,chartY:g.y}};e.prototype.getChartPosition=function(){if(this.chartPosition)return this.chartPosition;var c=this.chart.container,d=n(c);this.chartPosition={left:d.left,top:d.top,scaleX:1,scaleY:1};var a=c.offsetWidth;c=c.offsetHeight;2<a&&2<c&&(this.chartPosition.scaleX=d.width/a,this.chartPosition.scaleY=d.height/c);return this.chartPosition};e.prototype.getCoordinates=function(c){var d={xAxis:[],yAxis:[]};this.chart.axes.forEach(function(a){d[a.isXAxis?\"xAxis\":\"yAxis\"].push({axis:a,\nvalue:a.toValue(c[a.horiz?\"chartX\":\"chartY\"])})});return d};e.prototype.getHoverData=function(c,d,a,b,e,f){var h,g=[];b=!(!b||!c);var r=d&&!d.stickyTracking,l={chartX:f?f.chartX:void 0,chartY:f?f.chartY:void 0,shared:e};k(this,\"beforeGetHoverData\",l);r=r?[d]:a.filter(function(a){return l.filter?l.filter(a):a.visible&&!(!e&&a.directTouch)&&J(a.options.enableMouseTracking,!0)&&a.stickyTracking});d=(h=b||!f?c:this.findNearestKDPoint(r,e,f))&&h.series;h&&(e&&!d.noSharedTooltip?(r=a.filter(function(a){return l.filter?\nl.filter(a):a.visible&&!(!e&&a.directTouch)&&J(a.options.enableMouseTracking,!0)&&!a.noSharedTooltip}),r.forEach(function(a){var c=q(a.points,function(a){return a.x===h.x&&!a.isNull});N(c)&&(a.chart.isBoosting&&(c=a.getPoint(c)),g.push(c))})):g.push(h));l={hoverPoint:h};k(this,\"afterGetHoverData\",l);return{hoverPoint:l.hoverPoint,hoverSeries:d,hoverPoints:g}};e.prototype.getPointFromEvent=function(c){c=c.target;for(var d;c&&!d;)d=c.point,c=c.parentNode;return d};e.prototype.onTrackerMouseOut=function(c){c=\nc.relatedTarget||c.toElement;var d=this.chart.hoverSeries;this.isDirectTouch=!1;if(!(!d||!c||d.stickyTracking||this.inClass(c,\"highcharts-tooltip\")||this.inClass(c,\"highcharts-series-\"+d.index)&&this.inClass(c,\"highcharts-tracker\")))d.onMouseOut()};e.prototype.inClass=function(c,d){for(var a;c;){if(a=w(c,\"class\")){if(-1!==a.indexOf(d))return!0;if(-1!==a.indexOf(\"highcharts-container\"))return!1}c=c.parentNode}};e.prototype.init=function(c,d){this.options=d;this.chart=c;this.runChartClick=!(!d.chart.events||\n!d.chart.events.click);this.pinchDown=[];this.lastValidTouch={};z&&(c.tooltip=new z(c,d.tooltip),this.followTouchMove=J(d.tooltip.followTouchMove,!0));this.setDOMEvents()};e.prototype.normalize=function(c,b){var a=c.touches,h=a?a.length?a.item(0):J(a.changedTouches,c.changedTouches)[0]:c;b||(b=this.getChartPosition());a=h.pageX-b.left;h=h.pageY-b.top;a/=b.scaleX;h/=b.scaleY;return d(c,{chartX:Math.round(a),chartY:Math.round(h)})};e.prototype.onContainerClick=function(c){var b=this.chart,a=b.hoverPoint;\nc=this.normalize(c);var h=b.plotLeft,e=b.plotTop;b.cancelClick||(a&&this.inClass(c.target,\"highcharts-tracker\")?(k(a.series,\"click\",d(c,{point:a})),b.hoverPoint&&a.firePointEvent(\"click\",c)):(d(c,this.getCoordinates(c)),b.isInsidePlot(c.chartX-h,c.chartY-e,{visiblePlotOnly:!0})&&k(b,\"click\",c)))};e.prototype.onContainerMouseDown=function(c){var d=1===((c.buttons||c.button)&1);c=this.normalize(c);if(b.isFirefox&&0!==c.button)this.onContainerMouseMove(c);if(\"undefined\"===typeof c.button||d)this.zoomOption(c),\nd&&c.preventDefault&&c.preventDefault(),this.dragStart(c)};e.prototype.onContainerMouseLeave=function(c){var d=C[J(b.hoverChartIndex,-1)],a=this.chart.tooltip;c=this.normalize(c);d&&(c.relatedTarget||c.toElement)&&(d.pointer.reset(),d.pointer.chartPosition=void 0);a&&!a.isHidden&&this.reset()};e.prototype.onContainerMouseEnter=function(c){delete this.chartPosition};e.prototype.onContainerMouseMove=function(c){var d=this.chart;c=this.normalize(c);this.setHoverChartIndex();c.preventDefault||(c.returnValue=\n!1);(\"mousedown\"===d.mouseIsDown||this.touchSelect(c))&&this.drag(c);d.openMenu||!this.inClass(c.target,\"highcharts-tracker\")&&!d.isInsidePlot(c.chartX-d.plotLeft,c.chartY-d.plotTop,{visiblePlotOnly:!0})||this.runPointActions(c)};e.prototype.onDocumentTouchEnd=function(c){C[b.hoverChartIndex]&&C[b.hoverChartIndex].pointer.drop(c)};e.prototype.onContainerTouchMove=function(c){if(this.touchSelect(c))this.onContainerMouseMove(c);else this.touch(c)};e.prototype.onContainerTouchStart=function(c){if(this.touchSelect(c))this.onContainerMouseDown(c);\nelse this.zoomOption(c),this.touch(c,!0)};e.prototype.onDocumentMouseMove=function(c){var d=this.chart,a=this.chartPosition;c=this.normalize(c,a);var b=d.tooltip;!a||b&&b.isStickyOnContact()||d.isInsidePlot(c.chartX-d.plotLeft,c.chartY-d.plotTop,{visiblePlotOnly:!0})||this.inClass(c.target,\"highcharts-tracker\")||this.reset()};e.prototype.onDocumentMouseUp=function(c){var d=C[J(b.hoverChartIndex,-1)];d&&d.pointer.drop(c)};e.prototype.pinch=function(c){var b=this,a=b.chart,h=b.pinchDown,e=c.touches||\n[],f=e.length,l=b.lastValidTouch,m=b.hasZoom,k=b.selectionMarker,n={},q=1===f&&(b.inClass(c.target,\"highcharts-tracker\")&&a.runTrackerClick||b.runChartClick),u={};1<f&&(b.initiated=!0);m&&b.initiated&&!q&&!1!==c.cancelable&&c.preventDefault();[].map.call(e,function(a){return b.normalize(a)});\"touchstart\"===c.type?([].forEach.call(e,function(a,c){h[c]={chartX:a.chartX,chartY:a.chartY}}),l.x=[h[0].chartX,h[1]&&h[1].chartX],l.y=[h[0].chartY,h[1]&&h[1].chartY],a.axes.forEach(function(c){if(c.zoomEnabled){var d=\na.bounds[c.horiz?\"h\":\"v\"],b=c.minPixelPadding,h=c.toPixels(Math.min(J(c.options.min,c.dataMin),c.dataMin)),e=c.toPixels(Math.max(J(c.options.max,c.dataMax),c.dataMax)),g=Math.max(h,e);d.min=Math.min(c.pos,Math.min(h,e)-b);d.max=Math.max(c.pos+c.len,g+b)}}),b.res=!0):b.followTouchMove&&1===f?this.runPointActions(b.normalize(c)):h.length&&(k||(b.selectionMarker=k=d({destroy:B,touch:!0},a.plotBox)),b.pinchTranslate(h,e,n,k,u,l),b.hasPinched=m,b.scaleGroups(n,u),b.res&&(b.res=!1,this.reset(!1,0)))};e.prototype.pinchTranslate=\nfunction(c,d,a,b,e,f){this.zoomHor&&this.pinchTranslateDirection(!0,c,d,a,b,e,f);this.zoomVert&&this.pinchTranslateDirection(!1,c,d,a,b,e,f)};e.prototype.pinchTranslateDirection=function(c,d,a,b,e,f,l,m){var h=this.chart,g=c?\"x\":\"y\",r=c?\"X\":\"Y\",k=\"chart\"+r,n=c?\"width\":\"height\",A=h[\"plot\"+(c?\"Left\":\"Top\")],y,q,u=m||1,L=h.inverted,F=h.bounds[c?\"h\":\"v\"],v=1===d.length,K=d[0][k],w=a[0][k],E=!v&&d[1][k],x=!v&&a[1][k];a=function(){\"number\"===typeof x&&20<Math.abs(K-E)&&(u=m||Math.abs(w-x)/Math.abs(K-E));\nq=(A-w)/u+K;y=h[\"plot\"+(c?\"Width\":\"Height\")]/u};a();d=q;if(d<F.min){d=F.min;var J=!0}else d+y>F.max&&(d=F.max-y,J=!0);J?(w-=.8*(w-l[g][0]),\"number\"===typeof x&&(x-=.8*(x-l[g][1])),a()):l[g]=[w,x];L||(f[g]=q-A,f[n]=y);f=L?1/u:u;e[n]=y;e[g]=d;b[L?c?\"scaleY\":\"scaleX\":\"scale\"+r]=u;b[\"translate\"+r]=f*A+(w-f*K)};e.prototype.reset=function(c,d){var a=this.chart,b=a.hoverSeries,e=a.hoverPoint,g=a.hoverPoints,f=a.tooltip,l=f&&f.shared?g:e;c&&l&&E(l).forEach(function(a){a.series.isCartesian&&\"undefined\"===\ntypeof a.plotX&&(c=!1)});if(c)f&&l&&E(l).length&&(f.refresh(l),f.shared&&g?g.forEach(function(a){a.setState(a.state,!0);a.series.isCartesian&&(a.series.xAxis.crosshair&&a.series.xAxis.drawCrosshair(null,a),a.series.yAxis.crosshair&&a.series.yAxis.drawCrosshair(null,a))}):e&&(e.setState(e.state,!0),a.axes.forEach(function(a){a.crosshair&&e.series[a.coll]===a&&a.drawCrosshair(null,e)})));else{if(e)e.onMouseOut();g&&g.forEach(function(a){a.setState()});if(b)b.onMouseOut();f&&f.hide(d);this.unDocMouseMove&&\n(this.unDocMouseMove=this.unDocMouseMove());a.axes.forEach(function(a){a.hideCrosshair()});this.hoverX=a.hoverPoints=a.hoverPoint=null}};e.prototype.runPointActions=function(c,d){var a=this.chart,h=a.tooltip&&a.tooltip.options.enabled?a.tooltip:void 0,e=h?h.shared:!1,g=d||a.hoverPoint,f=g&&g.series||a.hoverSeries;f=this.getHoverData(g,f,a.series,(!c||\"touchmove\"!==c.type)&&(!!d||f&&f.directTouch&&this.isDirectTouch),e,c);g=f.hoverPoint;var l=f.hoverPoints;d=(f=f.hoverSeries)&&f.tooltipOptions.followPointer&&\n!f.tooltipOptions.split;e=e&&f&&!f.noSharedTooltip;if(g&&(g!==a.hoverPoint||h&&h.isHidden)){(a.hoverPoints||[]).forEach(function(a){-1===l.indexOf(a)&&a.setState()});if(a.hoverSeries!==f)f.onMouseOver();this.applyInactiveState(l);(l||[]).forEach(function(a){a.setState(\"hover\")});a.hoverPoint&&a.hoverPoint.firePointEvent(\"mouseOut\");if(!g.series)return;a.hoverPoints=l;a.hoverPoint=g;g.firePointEvent(\"mouseOver\");h&&h.refresh(e?l:g,c)}else d&&h&&!h.isHidden&&(g=h.getAnchor([{}],c),a.isInsidePlot(g[0],\ng[1],{visiblePlotOnly:!0})&&h.updatePosition({plotX:g[0],plotY:g[1]}));this.unDocMouseMove||(this.unDocMouseMove=x(a.container.ownerDocument,\"mousemove\",function(a){var c=C[b.hoverChartIndex];if(c)c.pointer.onDocumentMouseMove(a)}),this.eventsToUnbind.push(this.unDocMouseMove));a.axes.forEach(function(d){var b=J((d.crosshair||{}).snap,!0),h;b&&((h=a.hoverPoint)&&h.series[d.coll]===d||(h=q(l,function(a){return a.series[d.coll]===d})));h||!b?d.drawCrosshair(c,h):d.hideCrosshair()})};e.prototype.scaleGroups=\nfunction(c,d){var a=this.chart,b;a.series.forEach(function(h){b=c||h.getPlotBox();h.xAxis&&h.xAxis.zoomEnabled&&h.group&&(h.group.attr(b),h.markerGroup&&(h.markerGroup.attr(b),h.markerGroup.clip(d?a.clipRect:null)),h.dataLabelsGroup&&h.dataLabelsGroup.attr(b))});a.clipRect.attr(d||a.clipBox)};e.prototype.setDOMEvents=function(){var c=this,d=this.chart.container,a=d.ownerDocument;d.onmousedown=this.onContainerMouseDown.bind(this);d.onmousemove=this.onContainerMouseMove.bind(this);d.onclick=this.onContainerClick.bind(this);\nthis.eventsToUnbind.push(x(d,\"mouseenter\",this.onContainerMouseEnter.bind(this)));this.eventsToUnbind.push(x(d,\"mouseleave\",this.onContainerMouseLeave.bind(this)));b.unbindDocumentMouseUp||(b.unbindDocumentMouseUp=x(a,\"mouseup\",this.onDocumentMouseUp.bind(this)));for(var h=this.chart.renderTo.parentElement;h&&\"BODY\"!==h.tagName;)this.eventsToUnbind.push(x(h,\"scroll\",function(){delete c.chartPosition})),h=h.parentElement;b.hasTouch&&(this.eventsToUnbind.push(x(d,\"touchstart\",this.onContainerTouchStart.bind(this),\n{passive:!1})),this.eventsToUnbind.push(x(d,\"touchmove\",this.onContainerTouchMove.bind(this),{passive:!1})),b.unbindDocumentTouchEnd||(b.unbindDocumentTouchEnd=x(a,\"touchend\",this.onDocumentTouchEnd.bind(this),{passive:!1})))};e.prototype.setHoverChartIndex=function(){var c=this.chart,d=b.charts[J(b.hoverChartIndex,-1)];if(d&&d!==c)d.pointer.onContainerMouseLeave({relatedTarget:!0});d&&d.mouseIsDown||(b.hoverChartIndex=c.index)};e.prototype.touch=function(c,d){var a=this.chart,b;this.setHoverChartIndex();\nif(1===c.touches.length)if(c=this.normalize(c),(b=a.isInsidePlot(c.chartX-a.plotLeft,c.chartY-a.plotTop,{visiblePlotOnly:!0}))&&!a.openMenu){d&&this.runPointActions(c);if(\"touchmove\"===c.type){d=this.pinchDown;var e=d[0]?4<=Math.sqrt(Math.pow(d[0].chartX-c.chartX,2)+Math.pow(d[0].chartY-c.chartY,2)):!1}J(e,!0)&&this.pinch(c)}else d&&this.reset();else 2===c.touches.length&&this.pinch(c)};e.prototype.touchSelect=function(c){return!(!this.chart.options.chart.zoomBySingleTouch||!c.touches||1!==c.touches.length)};\ne.prototype.zoomOption=function(c){var d=this.chart,a=d.options.chart,b=a.zoomType||\"\";d=d.inverted;/touch/.test(c.type)&&(b=J(a.pinchType,b));this.zoomX=c=/x/.test(b);this.zoomY=b=/y/.test(b);this.zoomHor=c&&!d||b&&d;this.zoomVert=b&&!d||c&&d;this.hasZoom=c||b};return e}();return b.Pointer=e});O(e,\"Core/MSPointer.js\",[e[\"Core/Globals.js\"],e[\"Core/Pointer.js\"],e[\"Core/Utilities.js\"]],function(e,b,I){function D(){var d=[];d.item=function(d){return this[d]};f(q,function(b){d.push({pageX:b.pageX,pageY:b.pageY,\ntarget:b.target})});return d}function H(d,b,f,k){\"touch\"!==d.pointerType&&d.pointerType!==d.MSPOINTER_TYPE_TOUCH||!C[e.hoverChartIndex]||(k(d),k=C[e.hoverChartIndex].pointer,k[b]({type:f,target:d.currentTarget,preventDefault:x,touches:D()}))}var G=this&&this.__extends||function(){var d=function(b,e){d=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(d,b){d.__proto__=b}||function(d,b){for(var e in b)b.hasOwnProperty(e)&&(d[e]=b[e])};return d(b,e)};return function(b,e){function f(){this.constructor=\nb}d(b,e);b.prototype=null===e?Object.create(e):(f.prototype=e.prototype,new f)}}(),C=e.charts,B=e.doc,x=e.noop,w=I.addEvent,v=I.css,f=I.objectEach,d=I.removeEvent,q={},k=!!e.win.PointerEvent;return function(b){function e(){return null!==b&&b.apply(this,arguments)||this}G(e,b);e.prototype.batchMSEvents=function(d){d(this.chart.container,k?\"pointerdown\":\"MSPointerDown\",this.onContainerPointerDown);d(this.chart.container,k?\"pointermove\":\"MSPointerMove\",this.onContainerPointerMove);d(B,k?\"pointerup\":\n\"MSPointerUp\",this.onDocumentPointerUp)};e.prototype.destroy=function(){this.batchMSEvents(d);b.prototype.destroy.call(this)};e.prototype.init=function(d,e){b.prototype.init.call(this,d,e);this.hasZoom&&v(d.container,{\"-ms-touch-action\":\"none\",\"touch-action\":\"none\"})};e.prototype.onContainerPointerDown=function(d){H(d,\"onContainerTouchStart\",\"touchstart\",function(d){q[d.pointerId]={pageX:d.pageX,pageY:d.pageY,target:d.currentTarget}})};e.prototype.onContainerPointerMove=function(d){H(d,\"onContainerTouchMove\",\n\"touchmove\",function(d){q[d.pointerId]={pageX:d.pageX,pageY:d.pageY};q[d.pointerId].target||(q[d.pointerId].target=d.currentTarget)})};e.prototype.onDocumentPointerUp=function(d){H(d,\"onDocumentTouchEnd\",\"touchend\",function(d){delete q[d.pointerId]})};e.prototype.setDOMEvents=function(){b.prototype.setDOMEvents.call(this);(this.hasZoom||this.followTouchMove)&&this.batchMSEvents(w)};return e}(b)});O(e,\"Core/Series/Point.js\",[e[\"Core/Renderer/HTML/AST.js\"],e[\"Core/Animation/AnimationUtilities.js\"],\ne[\"Core/FormatUtilities.js\"],e[\"Core/Globals.js\"],e[\"Core/Options.js\"],e[\"Core/Utilities.js\"]],function(e,b,I,z,H,G){var D=b.animObject,B=I.format,x=H.defaultOptions,w=G.addEvent,v=G.defined,f=G.erase,d=G.extend,q=G.fireEvent,k=G.getNestedProperty,l=G.isArray,N=G.isFunction,u=G.isNumber,n=G.isObject,J=G.merge,E=G.objectEach,m=G.pick,c=G.syncTimeout,g=G.removeEvent,a=G.uniqueKey;\"\";b=function(){function b(){this.colorIndex=this.category=void 0;this.formatPrefix=\"point\";this.id=void 0;this.isNull=!1;\nthis.percentage=this.options=this.name=void 0;this.selected=!1;this.total=this.series=void 0;this.visible=!0;this.x=void 0}b.prototype.animateBeforeDestroy=function(){var a=this,c={x:a.startXPos,opacity:0},b,e=a.getGraphicalProps();e.singular.forEach(function(d){b=\"dataLabel\"===d;a[d]=a[d].animate(b?{x:a[d].startXPos,y:a[d].startYPos,opacity:0}:c)});e.plural.forEach(function(c){a[c].forEach(function(c){c.element&&c.animate(d({x:a.startXPos},c.startYPos?{x:c.startXPos,y:c.startYPos}:{}))})})};b.prototype.applyOptions=\nfunction(a,c){var e=this.series,h=e.options.pointValKey||e.pointValKey;a=b.prototype.optionsToObject.call(this,a);d(this,a);this.options=this.options?d(this.options,a):a;a.group&&delete this.group;a.dataLabels&&delete this.dataLabels;h&&(this.y=b.prototype.getNestedProperty.call(this,h));this.formatPrefix=(this.isNull=m(this.isValid&&!this.isValid(),null===this.x||!u(this.y)))?\"null\":\"point\";this.selected&&(this.state=\"select\");\"name\"in this&&\"undefined\"===typeof c&&e.xAxis&&e.xAxis.hasNames&&(this.x=\ne.xAxis.nameToX(this));\"undefined\"===typeof this.x&&e&&(this.x=\"undefined\"===typeof c?e.autoIncrement(this):c);return this};b.prototype.destroy=function(){function a(){if(d.graphic||d.dataLabel||d.dataLabels)g(d),d.destroyElements();for(m in d)d[m]=null}var d=this,b=d.series,e=b.chart;b=b.options.dataSorting;var h=e.hoverPoints,l=D(d.series.chart.renderer.globalAnimation),m;d.legendItem&&e.legend.destroyItem(d);h&&(d.setState(),f(h,d),h.length||(e.hoverPoints=null));if(d===e.hoverPoint)d.onMouseOut();\nb&&b.enabled?(this.animateBeforeDestroy(),c(a,l.duration)):a();e.pointCount--};b.prototype.destroyElements=function(a){var c=this;a=c.getGraphicalProps(a);a.singular.forEach(function(a){c[a]=c[a].destroy()});a.plural.forEach(function(a){c[a].forEach(function(a){a.element&&a.destroy()});delete c[a]})};b.prototype.firePointEvent=function(a,c,d){var b=this,e=this.series.options;(e.point.events[a]||b.options&&b.options.events&&b.options.events[a])&&b.importEvents();\"click\"===a&&e.allowPointSelect&&(d=\nfunction(a){b.select&&b.select(null,a.ctrlKey||a.metaKey||a.shiftKey)});q(b,a,c,d)};b.prototype.getClassName=function(){return\"highcharts-point\"+(this.selected?\" highcharts-point-select\":\"\")+(this.negative?\" highcharts-negative\":\"\")+(this.isNull?\" highcharts-null-point\":\"\")+(\"undefined\"!==typeof this.colorIndex?\" highcharts-color-\"+this.colorIndex:\"\")+(this.options.className?\" \"+this.options.className:\"\")+(this.zone&&this.zone.className?\" \"+this.zone.className.replace(\"highcharts-negative\",\"\"):\"\")};\nb.prototype.getGraphicalProps=function(a){var c=this,d=[],b,e={singular:[],plural:[]};a=a||{graphic:1,dataLabel:1};a.graphic&&d.push(\"graphic\",\"upperGraphic\",\"shadowGroup\");a.dataLabel&&d.push(\"dataLabel\",\"dataLabelUpper\",\"connector\");for(b=d.length;b--;){var h=d[b];c[h]&&e.singular.push(h)}[\"dataLabel\",\"connector\"].forEach(function(d){var b=d+\"s\";a[d]&&c[b]&&e.plural.push(b)});return e};b.prototype.getLabelConfig=function(){return{x:this.category,y:this.y,color:this.color,colorIndex:this.colorIndex,\nkey:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}};b.prototype.getNestedProperty=function(a){if(a)return 0===a.indexOf(\"custom.\")?k(a,this.options):this[a]};b.prototype.getZone=function(){var a=this.series,c=a.zones;a=a.zoneAxis||\"y\";var d=0,b;for(b=c[d];this[a]>=b.value;)b=c[++d];this.nonZonedColor||(this.nonZonedColor=this.color);this.color=b&&b.color&&!this.options.color?b.color:this.nonZonedColor;return b};b.prototype.hasNewShapeType=\nfunction(){return(this.graphic&&(this.graphic.symbolName||this.graphic.element.nodeName))!==this.shapeType};b.prototype.init=function(c,d,b){this.series=c;this.applyOptions(d,b);this.id=v(this.id)?this.id:a();this.resolveColor();c.chart.pointCount++;q(this,\"afterInit\");return this};b.prototype.optionsToObject=function(a){var c={},d=this.series,e=d.options.keys,h=e||d.pointArrayMap||[\"y\"],g=h.length,f=0,r=0;if(u(a)||null===a)c[h[0]]=a;else if(l(a))for(!e&&a.length>g&&(d=typeof a[0],\"string\"===d?c.name=\na[0]:\"number\"===d&&(c.x=a[0]),f++);r<g;)e&&\"undefined\"===typeof a[f]||(0<h[r].indexOf(\".\")?b.prototype.setNestedProperty(c,a[f],h[r]):c[h[r]]=a[f]),f++,r++;else\"object\"===typeof a&&(c=a,a.dataLabels&&(d._hasPointLabels=!0),a.marker&&(d._hasPointMarkers=!0));return c};b.prototype.resolveColor=function(){var a=this.series;var c=a.chart.options.chart.colorCount;var d=a.chart.styledMode;delete this.nonZonedColor;if(a.options.colorByPoint){if(!d){c=a.options.colors||a.chart.options.colors;var b=c[a.colorCounter];\nc=c.length}d=a.colorCounter;a.colorCounter++;a.colorCounter===c&&(a.colorCounter=0)}else d||(b=a.color),d=a.colorIndex;this.colorIndex=m(this.options.colorIndex,d);this.color=m(this.options.color,b)};b.prototype.setNestedProperty=function(a,c,d){d.split(\".\").reduce(function(a,d,b,e){a[d]=e.length-1===b?c:n(a[d],!0)?a[d]:{};return a[d]},a);return a};b.prototype.tooltipFormatter=function(a){var c=this.series,d=c.tooltipOptions,b=m(d.valueDecimals,\"\"),e=d.valuePrefix||\"\",h=d.valueSuffix||\"\";c.chart.styledMode&&\n(a=c.chart.tooltip.styledModeFormat(a));(c.pointArrayMap||[\"y\"]).forEach(function(c){c=\"{point.\"+c;if(e||h)a=a.replace(RegExp(c+\"}\",\"g\"),e+c+\"}\"+h);a=a.replace(RegExp(c+\"}\",\"g\"),c+\":,.\"+b+\"f}\")});return B(a,{point:this,series:this.series},c.chart)};b.prototype.update=function(a,c,d,b){function e(){h.applyOptions(a);var b=f&&h.hasDummyGraphic;b=null===h.y?!b:b;f&&b&&(h.graphic=f.destroy(),delete h.hasDummyGraphic);n(a,!0)&&(f&&f.element&&a&&a.marker&&\"undefined\"!==typeof a.marker.symbol&&(h.graphic=\nf.destroy()),a&&a.dataLabels&&h.dataLabel&&(h.dataLabel=h.dataLabel.destroy()),h.connector&&(h.connector=h.connector.destroy()));r=h.index;g.updateParallelArrays(h,r);k.data[r]=n(k.data[r],!0)||n(a,!0)?h.options:m(a,k.data[r]);g.isDirty=g.isDirtyData=!0;!g.fixedBox&&g.hasCartesianSeries&&(l.isDirtyBox=!0);\"point\"===k.legendType&&(l.isDirtyLegend=!0);c&&l.redraw(d)}var h=this,g=h.series,f=h.graphic,r,l=g.chart,k=g.options;c=m(c,!0);!1===b?e():h.firePointEvent(\"update\",{options:a},e)};b.prototype.remove=\nfunction(a,c){this.series.removePoint(this.series.data.indexOf(this),a,c)};b.prototype.select=function(a,c){var d=this,b=d.series,e=b.chart;this.selectedStaging=a=m(a,!d.selected);d.firePointEvent(a?\"select\":\"unselect\",{accumulate:c},function(){d.selected=d.options.selected=a;b.options.data[b.data.indexOf(d)]=d.options;d.setState(a&&\"select\");c||e.getSelectedPoints().forEach(function(a){var c=a.series;a.selected&&a!==d&&(a.selected=a.options.selected=!1,c.options.data[c.data.indexOf(a)]=a.options,\na.setState(e.hoverPoints&&c.options.inactiveOtherPoints?\"inactive\":\"\"),a.firePointEvent(\"unselect\"))})});delete this.selectedStaging};b.prototype.onMouseOver=function(a){var c=this.series.chart,d=c.pointer;a=a?d.normalize(a):d.getChartCoordinatesFromPoint(this,c.inverted);d.runPointActions(a,this)};b.prototype.onMouseOut=function(){var a=this.series.chart;this.firePointEvent(\"mouseOut\");this.series.options.inactiveOtherPoints||(a.hoverPoints||[]).forEach(function(a){a.setState()});a.hoverPoints=a.hoverPoint=\nnull};b.prototype.importEvents=function(){if(!this.hasImportedEvents){var a=this,c=J(a.series.options.point,a.options).events;a.events=c;E(c,function(c,d){N(c)&&w(a,d,c)});this.hasImportedEvents=!0}};b.prototype.setState=function(a,c){var b=this.series,h=this.state,g=b.options.states[a||\"normal\"]||{},f=x.plotOptions[b.type].marker&&b.options.marker,r=f&&!1===f.enabled,l=f&&f.states&&f.states[a||\"normal\"]||{},k=!1===l.enabled,n=b.stateMarkerGraphic,p=this.marker||{},A=b.chart,v=b.halo,w,F=f&&b.markerAttribs;\na=a||\"\";if(!(a===this.state&&!c||this.selected&&\"select\"!==a||!1===g.enabled||a&&(k||r&&!1===l.enabled)||a&&p.states&&p.states[a]&&!1===p.states[a].enabled)){this.state=a;F&&(w=b.markerAttribs(this,a));if(this.graphic&&!this.hasDummyGraphic){h&&this.graphic.removeClass(\"highcharts-point-\"+h);a&&this.graphic.addClass(\"highcharts-point-\"+a);if(!A.styledMode){var S=b.pointAttribs(this,a);var K=m(A.options.chart.animation,g.animation);b.options.inactiveOtherPoints&&u(S.opacity)&&((this.dataLabels||[]).forEach(function(a){a&&\na.animate({opacity:S.opacity},K)}),this.connector&&this.connector.animate({opacity:S.opacity},K));this.graphic.animate(S,K)}w&&this.graphic.animate(w,m(A.options.chart.animation,l.animation,f.animation));n&&n.hide()}else{if(a&&l){h=p.symbol||b.symbol;n&&n.currentSymbol!==h&&(n=n.destroy());if(w)if(n)n[c?\"animate\":\"attr\"]({x:w.x,y:w.y});else h&&(b.stateMarkerGraphic=n=A.renderer.symbol(h,w.x,w.y,w.width,w.height).add(b.markerGroup),n.currentSymbol=h);!A.styledMode&&n&&n.attr(b.pointAttribs(this,a))}n&&\n(n[a&&this.isInside?\"show\":\"hide\"](),n.element.point=this)}g=g.halo;w=(n=this.graphic||n)&&n.visibility||\"inherit\";g&&g.size&&n&&\"hidden\"!==w&&!this.isCluster?(v||(b.halo=v=A.renderer.path().add(n.parentGroup)),v.show()[c?\"animate\":\"attr\"]({d:this.haloPath(g.size)}),v.attr({\"class\":\"highcharts-halo highcharts-color-\"+m(this.colorIndex,b.colorIndex)+(this.className?\" \"+this.className:\"\"),visibility:w,zIndex:-1}),v.point=this,A.styledMode||v.attr(d({fill:this.color||b.color,\"fill-opacity\":g.opacity},\ne.filterUserAttributes(g.attributes||{})))):v&&v.point&&v.point.haloPath&&v.animate({d:v.point.haloPath(0)},null,v.hide);q(this,\"afterSetState\",{state:a})}};b.prototype.haloPath=function(a){return this.series.chart.renderer.symbols.circle(Math.floor(this.plotX)-a,this.plotY-a,2*a,2*a)};return b}();return z.Point=b});O(e,\"Core/Legend.js\",[e[\"Core/Animation/AnimationUtilities.js\"],e[\"Core/FormatUtilities.js\"],e[\"Core/Globals.js\"],e[\"Core/Series/Point.js\"],e[\"Core/Utilities.js\"]],function(e,b,I,z,H){var D=\ne.animObject,C=e.setAnimation,B=b.format;e=I.isFirefox;var x=I.marginNames;b=I.win;var w=H.addEvent,v=H.createElement,f=H.css,d=H.defined,q=H.discardElement,k=H.find,l=H.fireEvent,N=H.isNumber,u=H.merge,n=H.pick,J=H.relativeLength,E=H.stableSort,m=H.syncTimeout;H=H.wrap;var c=function(){function c(a,c){this.allItems=[];this.contentGroup=this.box=void 0;this.display=!1;this.group=void 0;this.offsetWidth=this.maxLegendWidth=this.maxItemWidth=this.legendWidth=this.legendHeight=this.lastLineHeight=this.lastItemY=\nthis.itemY=this.itemX=this.itemMarginTop=this.itemMarginBottom=this.itemHeight=this.initialItemY=0;this.options={};this.padding=0;this.pages=[];this.proximate=!1;this.scrollGroup=void 0;this.widthOption=this.totalItemWidth=this.titleHeight=this.symbolWidth=this.symbolHeight=0;this.chart=a;this.init(a,c)}c.prototype.init=function(a,c){this.chart=a;this.setOptions(c);c.enabled&&(this.render(),w(this.chart,\"endResize\",function(){this.legend.positionCheckboxes()}),this.proximate?this.unchartrender=w(this.chart,\n\"render\",function(){this.legend.proximatePositions();this.legend.positionItems()}):this.unchartrender&&this.unchartrender())};c.prototype.setOptions=function(a){var c=n(a.padding,8);this.options=a;this.chart.styledMode||(this.itemStyle=a.itemStyle,this.itemHiddenStyle=u(this.itemStyle,a.itemHiddenStyle));this.itemMarginTop=a.itemMarginTop||0;this.itemMarginBottom=a.itemMarginBottom||0;this.padding=c;this.initialItemY=c-5;this.symbolWidth=n(a.symbolWidth,16);this.pages=[];this.proximate=\"proximate\"===\na.layout&&!this.chart.inverted;this.baseline=void 0};c.prototype.update=function(a,c){var d=this.chart;this.setOptions(u(!0,this.options,a));this.destroy();d.isDirtyLegend=d.isDirtyBox=!0;n(c,!0)&&d.redraw();l(this,\"afterUpdate\")};c.prototype.colorizeItem=function(a,c){a.legendGroup[c?\"removeClass\":\"addClass\"](\"highcharts-legend-item-hidden\");if(!this.chart.styledMode){var d=this.options,b=a.legendItem,e=a.legendLine,h=a.legendSymbol,g=this.itemHiddenStyle.color;d=c?d.itemStyle.color:g;var f=c?a.color||\ng:g,m=a.options&&a.options.marker,k={fill:f};b&&b.css({fill:d,color:d});e&&e.attr({stroke:f});h&&(m&&h.isMarker&&(k=a.pointAttribs(),c||(k.stroke=k.fill=g)),h.attr(k))}l(this,\"afterColorizeItem\",{item:a,visible:c})};c.prototype.positionItems=function(){this.allItems.forEach(this.positionItem,this);this.chart.isResizing||this.positionCheckboxes()};c.prototype.positionItem=function(a){var c=this,b=this.options,e=b.symbolPadding,g=!b.rtl,f=a._legendItemPos;b=f[0];f=f[1];var k=a.checkbox,m=a.legendGroup;\nm&&m.element&&(e={translateX:g?b:this.legendWidth-b-2*e-4,translateY:f},g=function(){l(c,\"afterPositionItem\",{item:a})},d(m.translateY)?m.animate(e,void 0,g):(m.attr(e),g()));k&&(k.x=b,k.y=f)};c.prototype.destroyItem=function(a){var c=a.checkbox;[\"legendItem\",\"legendLine\",\"legendSymbol\",\"legendGroup\"].forEach(function(c){a[c]&&(a[c]=a[c].destroy())});c&&q(a.checkbox)};c.prototype.destroy=function(){function a(a){this[a]&&(this[a]=this[a].destroy())}this.getAllItems().forEach(function(c){[\"legendItem\",\n\"legendGroup\"].forEach(a,c)});\"clipRect up down pager nav box title group\".split(\" \").forEach(a,this);this.display=null};c.prototype.positionCheckboxes=function(){var a=this.group&&this.group.alignAttr,c=this.clipHeight||this.legendHeight,d=this.titleHeight;if(a){var b=a.translateY;this.allItems.forEach(function(e){var h=e.checkbox;if(h){var g=b+d+h.y+(this.scrollOffset||0)+3;f(h,{left:a.translateX+e.checkboxOffset+h.x-20+\"px\",top:g+\"px\",display:this.proximate||g>b-6&&g<b+c-6?\"\":\"none\"})}},this)}};\nc.prototype.renderTitle=function(){var a=this.options,c=this.padding,d=a.title,b=0;d.text&&(this.title||(this.title=this.chart.renderer.label(d.text,c-3,c-4,null,null,null,a.useHTML,null,\"legend-title\").attr({zIndex:1}),this.chart.styledMode||this.title.css(d.style),this.title.add(this.group)),d.width||this.title.css({width:this.maxLegendWidth+\"px\"}),a=this.title.getBBox(),b=a.height,this.offsetWidth=a.width,this.contentGroup.attr({translateY:b}));this.titleHeight=b};c.prototype.setText=function(a){var c=\nthis.options;a.legendItem.attr({text:c.labelFormat?B(c.labelFormat,a,this.chart):c.labelFormatter.call(a)})};c.prototype.renderItem=function(a){var c=this.chart,d=c.renderer,b=this.options,e=this.symbolWidth,g=b.symbolPadding||0,f=this.itemStyle,l=this.itemHiddenStyle,k=\"horizontal\"===b.layout?n(b.itemDistance,20):0,m=!b.rtl,q=a.legendItem,t=!a.series,p=!t&&a.series.drawLegendSymbol?a.series:a,v=p.options,w=this.createCheckboxForItem&&v&&v.showCheckbox;v=e+g+k+(w?20:0);var E=b.useHTML,F=a.options.className;\nq||(a.legendGroup=d.g(\"legend-item\").addClass(\"highcharts-\"+p.type+\"-series highcharts-color-\"+a.colorIndex+(F?\" \"+F:\"\")+(t?\" highcharts-series-\"+a.index:\"\")).attr({zIndex:1}).add(this.scrollGroup),a.legendItem=q=d.text(\"\",m?e+g:-g,this.baseline||0,E),c.styledMode||q.css(u(a.visible?f:l)),q.attr({align:m?\"left\":\"right\",zIndex:2}).add(a.legendGroup),this.baseline||(this.fontMetrics=d.fontMetrics(c.styledMode?12:f.fontSize,q),this.baseline=this.fontMetrics.f+3+this.itemMarginTop,q.attr(\"y\",this.baseline),\nthis.symbolHeight=b.symbolHeight||this.fontMetrics.f,b.squareSymbol&&(this.symbolWidth=n(b.symbolWidth,Math.max(this.symbolHeight,16)),v=this.symbolWidth+g+k+(w?20:0),m&&q.attr(\"x\",this.symbolWidth+g))),p.drawLegendSymbol(this,a),this.setItemEvents&&this.setItemEvents(a,q,E));w&&!a.checkbox&&this.createCheckboxForItem&&this.createCheckboxForItem(a);this.colorizeItem(a,a.visible);!c.styledMode&&f.width||q.css({width:(b.itemWidth||this.widthOption||c.spacingBox.width)-v+\"px\"});this.setText(a);c=q.getBBox();\na.itemWidth=a.checkboxOffset=b.itemWidth||a.legendItemWidth||c.width+v;this.maxItemWidth=Math.max(this.maxItemWidth,a.itemWidth);this.totalItemWidth+=a.itemWidth;this.itemHeight=a.itemHeight=Math.round(a.legendItemHeight||c.height||this.symbolHeight)};c.prototype.layoutItem=function(a){var c=this.options,d=this.padding,b=\"horizontal\"===c.layout,e=a.itemHeight,g=this.itemMarginBottom,f=this.itemMarginTop,l=b?n(c.itemDistance,20):0,m=this.maxLegendWidth;c=c.alignColumns&&this.totalItemWidth>m?this.maxItemWidth:\na.itemWidth;b&&this.itemX-d+c>m&&(this.itemX=d,this.lastLineHeight&&(this.itemY+=f+this.lastLineHeight+g),this.lastLineHeight=0);this.lastItemY=f+this.itemY+g;this.lastLineHeight=Math.max(e,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];b?this.itemX+=c:(this.itemY+=f+e+g,this.lastLineHeight=e);this.offsetWidth=this.widthOption||Math.max((b?this.itemX-d-(a.checkbox?0:l):c)+d,this.offsetWidth)};c.prototype.getAllItems=function(){var a=[];this.chart.series.forEach(function(c){var b=c&&\nc.options;c&&n(b.showInLegend,d(b.linkedTo)?!1:void 0,!0)&&(a=a.concat(c.legendItems||(\"point\"===b.legendType?c.data:c)))});l(this,\"afterGetAllItems\",{allItems:a});return a};c.prototype.getAlignment=function(){var a=this.options;return this.proximate?a.align.charAt(0)+\"tv\":a.floating?\"\":a.align.charAt(0)+a.verticalAlign.charAt(0)+a.layout.charAt(0)};c.prototype.adjustMargins=function(a,c){var b=this.chart,e=this.options,h=this.getAlignment();h&&[/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/].forEach(function(g,\nf){g.test(h)&&!d(a[f])&&(b[x[f]]=Math.max(b[x[f]],b.legend[(f+1)%2?\"legendHeight\":\"legendWidth\"]+[1,-1,-1,1][f]*e[f%2?\"x\":\"y\"]+n(e.margin,12)+c[f]+(b.titleOffset[f]||0)))})};c.prototype.proximatePositions=function(){var a=this.chart,c=[],d=\"left\"===this.options.align;this.allItems.forEach(function(b){var e;var h=d;if(b.yAxis){b.xAxis.options.reversed&&(h=!h);b.points&&(e=k(h?b.points:b.points.slice(0).reverse(),function(a){return N(a.plotY)}));h=this.itemMarginTop+b.legendItem.getBBox().height+this.itemMarginBottom;\nvar g=b.yAxis.top-a.plotTop;b.visible?(e=e?e.plotY:b.yAxis.height,e+=g-.3*h):e=g+b.yAxis.height;c.push({target:e,size:h,item:b})}},this);I.distribute(c,a.plotHeight);c.forEach(function(c){c.item._legendItemPos[1]=a.plotTop-a.spacing[0]+c.pos})};c.prototype.render=function(){var a=this.chart,c=a.renderer,d=this.group,b=this.box,e=this.options,g=this.padding;this.itemX=g;this.itemY=this.initialItemY;this.lastItemY=this.offsetWidth=0;this.widthOption=J(e.width,a.spacingBox.width-g);var f=a.spacingBox.width-\n2*g-e.x;-1<[\"rm\",\"lm\"].indexOf(this.getAlignment().substring(0,2))&&(f/=2);this.maxLegendWidth=this.widthOption||f;d||(this.group=d=c.g(\"legend\").attr({zIndex:7}).add(),this.contentGroup=c.g().attr({zIndex:1}).add(d),this.scrollGroup=c.g().add(this.contentGroup));this.renderTitle();var m=this.getAllItems();E(m,function(a,c){return(a.options&&a.options.legendIndex||0)-(c.options&&c.options.legendIndex||0)});e.reversed&&m.reverse();this.allItems=m;this.display=f=!!m.length;this.itemHeight=this.totalItemWidth=\nthis.maxItemWidth=this.lastLineHeight=0;m.forEach(this.renderItem,this);m.forEach(this.layoutItem,this);m=(this.widthOption||this.offsetWidth)+g;var k=this.lastItemY+this.lastLineHeight+this.titleHeight;k=this.handleOverflow(k);k+=g;b||(this.box=b=c.rect().addClass(\"highcharts-legend-box\").attr({r:e.borderRadius}).add(d),b.isNew=!0);a.styledMode||b.attr({stroke:e.borderColor,\"stroke-width\":e.borderWidth||0,fill:e.backgroundColor||\"none\"}).shadow(e.shadow);0<m&&0<k&&(b[b.isNew?\"attr\":\"animate\"](b.crisp.call({},\n{x:0,y:0,width:m,height:k},b.strokeWidth())),b.isNew=!1);b[f?\"show\":\"hide\"]();a.styledMode&&\"none\"===d.getStyle(\"display\")&&(m=k=0);this.legendWidth=m;this.legendHeight=k;f&&this.align();this.proximate||this.positionItems();l(this,\"afterRender\")};c.prototype.align=function(a){void 0===a&&(a=this.chart.spacingBox);var c=this.chart,d=this.options,b=a.y;/(lth|ct|rth)/.test(this.getAlignment())&&0<c.titleOffset[0]?b+=c.titleOffset[0]:/(lbh|cb|rbh)/.test(this.getAlignment())&&0<c.titleOffset[2]&&(b-=c.titleOffset[2]);\nb!==a.y&&(a=u(a,{y:b}));this.group.align(u(d,{width:this.legendWidth,height:this.legendHeight,verticalAlign:this.proximate?\"top\":d.verticalAlign}),!0,a)};c.prototype.handleOverflow=function(a){var c=this,d=this.chart,b=d.renderer,e=this.options,g=e.y,f=this.padding;g=d.spacingBox.height+(\"top\"===e.verticalAlign?-g:g)-f;var m=e.maxHeight,k,l=this.clipRect,q=e.navigation,t=n(q.animation,!0),p=q.arrowSize||12,u=this.nav,v=this.pages,w,F=this.allItems,S=function(a){\"number\"===typeof a?l.attr({height:a}):\nl&&(c.clipRect=l.destroy(),c.contentGroup.clip());c.contentGroup.div&&(c.contentGroup.div.style.clip=a?\"rect(\"+f+\"px,9999px,\"+(f+a)+\"px,0)\":\"auto\")},K=function(a){c[a]=b.circle(0,0,1.3*p).translate(p/2,p/2).add(u);d.styledMode||c[a].attr(\"fill\",\"rgba(0,0,0,0.0001)\");return c[a]};\"horizontal\"!==e.layout||\"middle\"===e.verticalAlign||e.floating||(g/=2);m&&(g=Math.min(g,m));v.length=0;a&&0<g&&a>g&&!1!==q.enabled?(this.clipHeight=k=Math.max(g-20-this.titleHeight-f,0),this.currentPage=n(this.currentPage,\n1),this.fullHeight=a,F.forEach(function(a,c){var d=a._legendItemPos[1],b=Math.round(a.legendItem.getBBox().height),e=v.length;if(!e||d-v[e-1]>k&&(w||d)!==v[e-1])v.push(w||d),e++;a.pageIx=e-1;w&&(F[c-1].pageIx=e-1);c===F.length-1&&d+b-v[e-1]>k&&d!==w&&(v.push(d),a.pageIx=e);d!==w&&(w=d)}),l||(l=c.clipRect=b.clipRect(0,f,9999,0),c.contentGroup.clip(l)),S(k),u||(this.nav=u=b.g().attr({zIndex:1}).add(this.group),this.up=b.symbol(\"triangle\",0,0,p,p).add(u),K(\"upTracker\").on(\"click\",function(){c.scroll(-1,\nt)}),this.pager=b.text(\"\",15,10).addClass(\"highcharts-legend-navigation\"),d.styledMode||this.pager.css(q.style),this.pager.add(u),this.down=b.symbol(\"triangle-down\",0,0,p,p).add(u),K(\"downTracker\").on(\"click\",function(){c.scroll(1,t)})),c.scroll(0),a=g):u&&(S(),this.nav=u.destroy(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0);return a};c.prototype.scroll=function(a,c){var d=this,b=this.chart,e=this.pages,h=e.length,g=this.currentPage+a;a=this.clipHeight;var f=this.options.navigation,k=\nthis.pager,q=this.padding;g>h&&(g=h);0<g&&(\"undefined\"!==typeof c&&C(c,b),this.nav.attr({translateX:q,translateY:a+this.padding+7+this.titleHeight,visibility:\"visible\"}),[this.up,this.upTracker].forEach(function(a){a.attr({\"class\":1===g?\"highcharts-legend-nav-inactive\":\"highcharts-legend-nav-active\"})}),k.attr({text:g+\"/\"+h}),[this.down,this.downTracker].forEach(function(a){a.attr({x:18+this.pager.getBBox().width,\"class\":g===h?\"highcharts-legend-nav-inactive\":\"highcharts-legend-nav-active\"})},this),\nb.styledMode||(this.up.attr({fill:1===g?f.inactiveColor:f.activeColor}),this.upTracker.css({cursor:1===g?\"default\":\"pointer\"}),this.down.attr({fill:g===h?f.inactiveColor:f.activeColor}),this.downTracker.css({cursor:g===h?\"default\":\"pointer\"})),this.scrollOffset=-e[g-1]+this.initialItemY,this.scrollGroup.animate({translateY:this.scrollOffset}),this.currentPage=g,this.positionCheckboxes(),c=D(n(c,b.renderer.globalAnimation,!0)),m(function(){l(d,\"afterScroll\",{currentPage:g})},c.duration))};c.prototype.setItemEvents=\nfunction(a,c,d){var b=this,e=b.chart.renderer.boxWrapper,h=a instanceof z,g=\"highcharts-legend-\"+(h?\"point\":\"series\")+\"-active\",f=b.chart.styledMode;(d?[c,a.legendSymbol]:[a.legendGroup]).forEach(function(d){if(d)d.on(\"mouseover\",function(){a.visible&&b.allItems.forEach(function(c){a!==c&&c.setState(\"inactive\",!h)});a.setState(\"hover\");a.visible&&e.addClass(g);f||c.css(b.options.itemHoverStyle)}).on(\"mouseout\",function(){b.chart.styledMode||c.css(u(a.visible?b.itemStyle:b.itemHiddenStyle));b.allItems.forEach(function(c){a!==\nc&&c.setState(\"\",!h)});e.removeClass(g);a.setState()}).on(\"click\",function(c){var d=function(){a.setVisible&&a.setVisible();b.allItems.forEach(function(c){a!==c&&c.setState(a.visible?\"inactive\":\"\",!h)})};e.removeClass(g);c={browserEvent:c};a.firePointEvent?a.firePointEvent(\"legendItemClick\",c,d):l(a,\"legendItemClick\",c,d)})})};c.prototype.createCheckboxForItem=function(a){a.checkbox=v(\"input\",{type:\"checkbox\",className:\"highcharts-legend-checkbox\",checked:a.selected,defaultChecked:a.selected},this.options.itemCheckboxStyle,\nthis.chart.container);w(a.checkbox,\"click\",function(c){l(a.series||a,\"checkboxClick\",{checked:c.target.checked,item:a},function(){a.select()})})};return c}();(/Trident\\/7\\.0/.test(b.navigator&&b.navigator.userAgent)||e)&&H(c.prototype,\"positionItem\",function(c,a){var d=this,b=function(){a._legendItemPos&&c.call(d,a)};b();d.bubbleLegend||setTimeout(b)});I.Legend=c;return I.Legend});O(e,\"Core/Series/SeriesRegistry.js\",[e[\"Core/Globals.js\"],e[\"Core/Options.js\"],e[\"Core/Series/Point.js\"],e[\"Core/Utilities.js\"]],\nfunction(e,b,I,z){var D=b.defaultOptions,G=z.error,C=z.extendClass,B=z.merge,x;(function(b){function v(e,d){var f=D.plotOptions||{},k=d.defaultOptions;d.prototype.pointClass||(d.prototype.pointClass=I);d.prototype.type=e;k&&(f[e]=k);b.seriesTypes[e]=d}b.seriesTypes=e.seriesTypes;b.getSeries=function(e,d){void 0===d&&(d={});var f=e.options.chart;f=d.type||f.type||f.defaultSeriesType||\"\";var k=b.seriesTypes[f];b||G(17,!0,e,{missingModuleFor:f});f=new k;\"function\"===typeof f.init&&f.init(e,d);return f};\nb.registerSeriesType=v;b.seriesType=function(e,d,q,k,l){var f=D.plotOptions||{};d=d||\"\";f[e]=B(f[d],q);v(e,C(b.seriesTypes[d]||function(){},k));b.seriesTypes[e].prototype.type=e;l&&(b.seriesTypes[e].prototype.pointClass=C(I,l));return b.seriesTypes[e]}})(x||(x={}));e.seriesType=x.seriesType;return x});O(e,\"Core/Chart/Chart.js\",[e[\"Core/Animation/AnimationUtilities.js\"],e[\"Core/Axis/Axis.js\"],e[\"Core/FormatUtilities.js\"],e[\"Core/Globals.js\"],e[\"Core/Legend.js\"],e[\"Core/MSPointer.js\"],e[\"Core/Options.js\"],\ne[\"Core/Color/Palette.js\"],e[\"Core/Pointer.js\"],e[\"Core/Series/SeriesRegistry.js\"],e[\"Core/Time.js\"],e[\"Core/Utilities.js\"],e[\"Core/Renderer/HTML/AST.js\"]],function(e,b,I,z,H,G,C,B,x,w,v,f,d){var q=e.animate,k=e.animObject,l=e.setAnimation,D=I.numberFormat,u=z.charts,n=z.doc,J=z.win,E=C.defaultOptions,m=C.defaultTime,c=w.seriesTypes,g=f.addEvent,a=f.attr,h=f.cleanRecursively,r=f.createElement,A=f.css,y=f.defined,L=f.discardElement,P=f.erase,R=f.error,V=f.extend,Q=f.find,M=f.fireEvent,t=f.getStyle,\np=f.isArray,O=f.isFunction,Z=f.isNumber,ea=f.isObject,F=f.isString,S=f.merge,K=f.objectEach,T=f.pick,X=f.pInt,U=f.relativeLength,fa=f.removeEvent,Y=f.splat,ba=f.syncTimeout,ha=f.uniqueKey,ca=z.marginNames,aa=function(){function e(a,c,d){this.series=this.renderTo=this.renderer=this.pointer=this.pointCount=this.plotWidth=this.plotTop=this.plotLeft=this.plotHeight=this.plotBox=this.options=this.numberFormatter=this.margin=this.legend=this.labelCollectors=this.isResizing=this.index=this.container=this.colorCounter=\nthis.clipBox=this.chartWidth=this.chartHeight=this.bounds=this.axisOffset=this.axes=void 0;this.sharedClips={};this.yAxis=this.xAxis=this.userOptions=this.titleOffset=this.time=this.symbolCounter=this.spacingBox=this.spacing=void 0;this.getArgs(a,c,d)}e.prototype.getArgs=function(a,c,d){F(a)||a.nodeName?(this.renderTo=a,this.init(c,d)):this.init(a,c)};e.prototype.init=function(a,c){var d=a.plotOptions||{};M(this,\"init\",{args:arguments},function(){var b=S(E,a),e=b.chart;K(b.plotOptions,function(a,\nc){ea(a)&&(a.tooltip=d[c]&&S(d[c].tooltip)||void 0)});b.tooltip.userOptions=a.chart&&a.chart.forExport&&a.tooltip.userOptions||a.tooltip;this.userOptions=a;var h=e.events;this.margin=[];this.spacing=[];this.bounds={h:{},v:{}};this.labelCollectors=[];this.callback=c;this.isResizing=0;this.options=b;this.axes=[];this.series=[];this.time=a.time&&Object.keys(a.time).length?new v(a.time):z.time;this.numberFormatter=e.numberFormatter||D;this.styledMode=e.styledMode;this.hasCartesianSeries=e.showAxes;var f=\nthis;f.index=u.length;u.push(f);z.chartCount++;h&&K(h,function(a,c){O(a)&&g(f,c,a)});f.xAxis=[];f.yAxis=[];f.pointCount=f.colorCounter=f.symbolCounter=0;M(f,\"afterInit\");f.firstRender()})};e.prototype.initSeries=function(a){var d=this.options.chart;d=a.type||d.type||d.defaultSeriesType;var b=c[d];b||R(17,!0,this,{missingModuleFor:d});d=new b;\"function\"===typeof d.init&&d.init(this,a);return d};e.prototype.setSeriesData=function(){this.getSeriesOrderByLinks().forEach(function(a){a.points||a.data||\n!a.enabledDataSorting||a.setData(a.options.data,!1)})};e.prototype.getSeriesOrderByLinks=function(){return this.series.concat().sort(function(a,c){return a.linkedSeries.length||c.linkedSeries.length?c.linkedSeries.length-a.linkedSeries.length:0})};e.prototype.orderSeries=function(a){var c=this.series;for(a=a||0;a<c.length;a++)c[a]&&(c[a].index=a,c[a].name=c[a].getName())};e.prototype.isInsidePlot=function(a,c,d){void 0===d&&(d={});var b=this.inverted,e=this.plotBox,h=this.plotLeft,g=this.plotTop,\nf=this.scrollablePlotBox,m=this.scrollingContainer;m=void 0===m?{scrollLeft:0,scrollTop:0}:m;var k=m.scrollLeft;m=m.scrollTop;var l=d.series;e=d.visiblePlotOnly&&f||e;f=d.inverted?c:a;c=d.inverted?a:c;a={x:f,y:c,isInsidePlot:!0};if(!d.ignoreX){var F=l&&(b?l.yAxis:l.xAxis)||{pos:h,len:Infinity};f=d.paneCoordinates?F.pos+f:h+f;f>=Math.max(k+h,F.pos)&&f<=Math.min(k+h+e.width,F.pos+F.len)||(a.isInsidePlot=!1)}!d.ignoreY&&a.isInsidePlot&&(b=l&&(b?l.xAxis:l.yAxis)||{pos:g,len:Infinity},d=d.paneCoordinates?\nb.pos+c:g+c,d>=Math.max(m+g,b.pos)&&d<=Math.min(m+g+e.height,b.pos+b.len)||(a.isInsidePlot=!1));M(this,\"afterIsInsidePlot\",a);return a.isInsidePlot};e.prototype.redraw=function(a){M(this,\"beforeRedraw\");var c=this.hasCartesianSeries?this.axes:this.colorAxis||[],d=this.series,b=this.pointer,e=this.legend,h=this.userOptions.legend,g=this.isDirtyLegend,f=this.isDirtyBox,m=this.renderer,k=m.isHidden(),F=[];this.setResponsive&&this.setResponsive(!1);l(this.hasRendered?a:!1,this);k&&this.temporaryDisplay();\nthis.layOutTitles();for(a=d.length;a--;){var n=d[a];if(n.options.stacking||n.options.centerInCategory){var r=!0;if(n.isDirty){var K=!0;break}}}if(K)for(a=d.length;a--;)n=d[a],n.options.stacking&&(n.isDirty=!0);d.forEach(function(a){a.isDirty&&(\"point\"===a.options.legendType?(\"function\"===typeof a.updateTotals&&a.updateTotals(),g=!0):h&&(h.labelFormatter||h.labelFormat)&&(g=!0));a.isDirtyData&&M(a,\"updatedData\")});g&&e&&e.options.enabled&&(e.render(),this.isDirtyLegend=!1);r&&this.getStacks();c.forEach(function(a){a.updateNames();\na.setScale()});this.getMargins();c.forEach(function(a){a.isDirty&&(f=!0)});c.forEach(function(a){var c=a.min+\",\"+a.max;a.extKey!==c&&(a.extKey=c,F.push(function(){M(a,\"afterSetExtremes\",V(a.eventArgs,a.getExtremes()));delete a.eventArgs}));(f||r)&&a.redraw()});f&&this.drawChartBox();M(this,\"predraw\");d.forEach(function(a){(f||a.isDirty)&&a.visible&&a.redraw();a.isDirtyData=!1});b&&b.reset(!0);m.draw();M(this,\"redraw\");M(this,\"render\");k&&this.temporaryDisplay(!0);F.forEach(function(a){a.call()})};\ne.prototype.get=function(a){function c(c){return c.id===a||c.options&&c.options.id===a}var d=this.series,b;var e=Q(this.axes,c)||Q(this.series,c);for(b=0;!e&&b<d.length;b++)e=Q(d[b].points||[],c);return e};e.prototype.getAxes=function(){var a=this,c=this.options,d=c.xAxis=Y(c.xAxis||{});c=c.yAxis=Y(c.yAxis||{});M(this,\"getAxes\");d.forEach(function(a,c){a.index=c;a.isX=!0});c.forEach(function(a,c){a.index=c});d.concat(c).forEach(function(c){new b(a,c)});M(this,\"afterGetAxes\")};e.prototype.getSelectedPoints=\nfunction(){var a=[];this.series.forEach(function(c){a=a.concat(c.getPointsCollection().filter(function(a){return T(a.selectedStaging,a.selected)}))});return a};e.prototype.getSelectedSeries=function(){return this.series.filter(function(a){return a.selected})};e.prototype.setTitle=function(a,c,d){this.applyDescription(\"title\",a);this.applyDescription(\"subtitle\",c);this.applyDescription(\"caption\",void 0);this.layOutTitles(d)};e.prototype.applyDescription=function(a,c){var d=this,b=\"title\"===a?{color:B.neutralColor80,\nfontSize:this.options.isStock?\"16px\":\"18px\"}:{color:B.neutralColor60};b=this.options[a]=S(!this.styledMode&&{style:b},this.options[a],c);var e=this[a];e&&c&&(this[a]=e=e.destroy());b&&!e&&(e=this.renderer.text(b.text,0,0,b.useHTML).attr({align:b.align,\"class\":\"highcharts-\"+a,zIndex:b.zIndex||4}).add(),e.update=function(c){d[{title:\"setTitle\",subtitle:\"setSubtitle\",caption:\"setCaption\"}[a]](c)},this.styledMode||e.css(b.style),this[a]=e)};e.prototype.layOutTitles=function(a){var c=[0,0,0],d=this.renderer,\nb=this.spacingBox;[\"title\",\"subtitle\",\"caption\"].forEach(function(a){var e=this[a],h=this.options[a],g=h.verticalAlign||\"top\";a=\"title\"===a?-3:\"top\"===g?c[0]+2:0;if(e){if(!this.styledMode)var f=h.style.fontSize;f=d.fontMetrics(f,e).b;e.css({width:(h.width||b.width+(h.widthAdjust||0))+\"px\"});var m=Math.round(e.getBBox(h.useHTML).height);e.align(V({y:\"bottom\"===g?f:a+f,height:m},h),!1,\"spacingBox\");h.floating||(\"top\"===g?c[0]=Math.ceil(c[0]+m):\"bottom\"===g&&(c[2]=Math.ceil(c[2]+m)))}},this);c[0]&&\"top\"===\n(this.options.title.verticalAlign||\"top\")&&(c[0]+=this.options.title.margin);c[2]&&\"bottom\"===this.options.caption.verticalAlign&&(c[2]+=this.options.caption.margin);var e=!this.titleOffset||this.titleOffset.join(\",\")!==c.join(\",\");this.titleOffset=c;M(this,\"afterLayOutTitles\");!this.isDirtyBox&&e&&(this.isDirtyBox=this.isDirtyLegend=e,this.hasRendered&&T(a,!0)&&this.isDirtyBox&&this.redraw())};e.prototype.getChartSize=function(){var a=this.options.chart,c=a.width;a=a.height;var d=this.renderTo;y(c)||\n(this.containerWidth=t(d,\"width\"));y(a)||(this.containerHeight=t(d,\"height\"));this.chartWidth=Math.max(0,c||this.containerWidth||600);this.chartHeight=Math.max(0,U(a,this.chartWidth)||(1<this.containerHeight?this.containerHeight:400))};e.prototype.temporaryDisplay=function(a){var c=this.renderTo;if(a)for(;c&&c.style;)c.hcOrigStyle&&(A(c,c.hcOrigStyle),delete c.hcOrigStyle),c.hcOrigDetached&&(n.body.removeChild(c),c.hcOrigDetached=!1),c=c.parentNode;else for(;c&&c.style;){n.body.contains(c)||c.parentNode||\n(c.hcOrigDetached=!0,n.body.appendChild(c));if(\"none\"===t(c,\"display\",!1)||c.hcOricDetached)c.hcOrigStyle={display:c.style.display,height:c.style.height,overflow:c.style.overflow},a={display:\"block\",overflow:\"hidden\"},c!==this.renderTo&&(a.height=0),A(c,a),c.offsetWidth||c.style.setProperty(\"display\",\"block\",\"important\");c=c.parentNode;if(c===n.body)break}};e.prototype.setClassName=function(a){this.container.className=\"highcharts-container \"+(a||\"\")};e.prototype.getContainer=function(){var c=this.options,\nd=c.chart;var b=this.renderTo;var e=ha(),h,g;b||(this.renderTo=b=d.renderTo);F(b)&&(this.renderTo=b=n.getElementById(b));b||R(13,!0,this);var f=X(a(b,\"data-highcharts-chart\"));Z(f)&&u[f]&&u[f].hasRendered&&u[f].destroy();a(b,\"data-highcharts-chart\",this.index);b.innerHTML=\"\";d.skipClone||b.offsetWidth||this.temporaryDisplay();this.getChartSize();f=this.chartWidth;var m=this.chartHeight;A(b,{overflow:\"hidden\"});this.styledMode||(h=V({position:\"relative\",overflow:\"hidden\",width:f+\"px\",height:m+\"px\",\ntextAlign:\"left\",lineHeight:\"normal\",zIndex:0,\"-webkit-tap-highlight-color\":\"rgba(0,0,0,0)\",userSelect:\"none\",\"touch-action\":\"manipulation\",outline:\"none\"},d.style||{}));this.container=b=r(\"div\",{id:e},h,b);this._cursor=b.style.cursor;this.renderer=new (z[d.renderer]||z.Renderer)(b,f,m,null,d.forExport,c.exporting&&c.exporting.allowHTML,this.styledMode);l(void 0,this);this.setClassName(d.className);if(this.styledMode)for(g in c.defs)this.renderer.definition(c.defs[g]);else this.renderer.setStyle(d.style);\nthis.renderer.chartIndex=this.index;M(this,\"afterGetContainer\")};e.prototype.getMargins=function(a){var c=this.spacing,d=this.margin,b=this.titleOffset;this.resetMargins();b[0]&&!y(d[0])&&(this.plotTop=Math.max(this.plotTop,b[0]+c[0]));b[2]&&!y(d[2])&&(this.marginBottom=Math.max(this.marginBottom,b[2]+c[2]));this.legend&&this.legend.display&&this.legend.adjustMargins(d,c);M(this,\"getMargins\");a||this.getAxisMargins()};e.prototype.getAxisMargins=function(){var a=this,c=a.axisOffset=[0,0,0,0],d=a.colorAxis,\nb=a.margin,e=function(a){a.forEach(function(a){a.visible&&a.getOffset()})};a.hasCartesianSeries?e(a.axes):d&&d.length&&e(d);ca.forEach(function(d,e){y(b[e])||(a[d]+=c[e])});a.setChartSize()};e.prototype.reflow=function(a){var c=this,d=c.options.chart,b=c.renderTo,e=y(d.width)&&y(d.height),h=d.width||t(b,\"width\");d=d.height||t(b,\"height\");b=a?a.target:J;delete c.pointer.chartPosition;if(!e&&!c.isPrinting&&h&&d&&(b===J||b===n)){if(h!==c.containerWidth||d!==c.containerHeight)f.clearTimeout(c.reflowTimeout),\nc.reflowTimeout=ba(function(){c.container&&c.setSize(void 0,void 0,!1)},a?100:0);c.containerWidth=h;c.containerHeight=d}};e.prototype.setReflow=function(a){var c=this;!1===a||this.unbindReflow?!1===a&&this.unbindReflow&&(this.unbindReflow=this.unbindReflow()):(this.unbindReflow=g(J,\"resize\",function(a){c.options&&c.reflow(a)}),g(this,\"destroy\",this.unbindReflow))};e.prototype.setSize=function(a,c,d){var b=this,e=b.renderer;b.isResizing+=1;l(d,b);d=e.globalAnimation;b.oldChartHeight=b.chartHeight;\nb.oldChartWidth=b.chartWidth;\"undefined\"!==typeof a&&(b.options.chart.width=a);\"undefined\"!==typeof c&&(b.options.chart.height=c);b.getChartSize();b.styledMode||(d?q:A)(b.container,{width:b.chartWidth+\"px\",height:b.chartHeight+\"px\"},d);b.setChartSize(!0);e.setSize(b.chartWidth,b.chartHeight,d);b.axes.forEach(function(a){a.isDirty=!0;a.setScale()});b.isDirtyLegend=!0;b.isDirtyBox=!0;b.layOutTitles();b.getMargins();b.redraw(d);b.oldChartHeight=null;M(b,\"resize\");ba(function(){b&&M(b,\"endResize\",null,\nfunction(){--b.isResizing})},k(d).duration)};e.prototype.setChartSize=function(a){var c=this.inverted,d=this.renderer,b=this.chartWidth,e=this.chartHeight,h=this.options.chart,g=this.spacing,f=this.clipOffset,m,l,k,F;this.plotLeft=m=Math.round(this.plotLeft);this.plotTop=l=Math.round(this.plotTop);this.plotWidth=k=Math.max(0,Math.round(b-m-this.marginRight));this.plotHeight=F=Math.max(0,Math.round(e-l-this.marginBottom));this.plotSizeX=c?F:k;this.plotSizeY=c?k:F;this.plotBorderWidth=h.plotBorderWidth||\n0;this.spacingBox=d.spacingBox={x:g[3],y:g[0],width:b-g[3]-g[1],height:e-g[0]-g[2]};this.plotBox=d.plotBox={x:m,y:l,width:k,height:F};e=2*Math.floor(this.plotBorderWidth/2);c=Math.ceil(Math.max(e,f[3])/2);b=Math.ceil(Math.max(e,f[0])/2);this.clipBox={x:c,y:b,width:Math.floor(this.plotSizeX-Math.max(e,f[1])/2-c),height:Math.max(0,Math.floor(this.plotSizeY-Math.max(e,f[2])/2-b))};a||(this.axes.forEach(function(a){a.setAxisSize();a.setAxisTranslation()}),d.alignElements());M(this,\"afterSetChartSize\",\n{skipAxes:a})};e.prototype.resetMargins=function(){M(this,\"resetMargins\");var a=this,c=a.options.chart;[\"margin\",\"spacing\"].forEach(function(d){var b=c[d],e=ea(b)?b:[b,b,b,b];[\"Top\",\"Right\",\"Bottom\",\"Left\"].forEach(function(b,h){a[d][h]=T(c[d+b],e[h])})});ca.forEach(function(c,d){a[c]=T(a.margin[d],a.spacing[d])});a.axisOffset=[0,0,0,0];a.clipOffset=[0,0,0,0]};e.prototype.drawChartBox=function(){var a=this.options.chart,c=this.renderer,d=this.chartWidth,b=this.chartHeight,e=this.chartBackground,h=\nthis.plotBackground,g=this.plotBorder,f=this.styledMode,m=this.plotBGImage,k=a.backgroundColor,l=a.plotBackgroundColor,F=a.plotBackgroundImage,n,r=this.plotLeft,K=this.plotTop,q=this.plotWidth,p=this.plotHeight,u=this.plotBox,v=this.clipRect,t=this.clipBox,w=\"animate\";e||(this.chartBackground=e=c.rect().addClass(\"highcharts-background\").add(),w=\"attr\");if(f)var y=n=e.strokeWidth();else{y=a.borderWidth||0;n=y+(a.shadow?8:0);k={fill:k||\"none\"};if(y||e[\"stroke-width\"])k.stroke=a.borderColor,k[\"stroke-width\"]=\ny;e.attr(k).shadow(a.shadow)}e[w]({x:n/2,y:n/2,width:d-n-y%2,height:b-n-y%2,r:a.borderRadius});w=\"animate\";h||(w=\"attr\",this.plotBackground=h=c.rect().addClass(\"highcharts-plot-background\").add());h[w](u);f||(h.attr({fill:l||\"none\"}).shadow(a.plotShadow),F&&(m?(F!==m.attr(\"href\")&&m.attr(\"href\",F),m.animate(u)):this.plotBGImage=c.image(F,r,K,q,p).add()));v?v.animate({width:t.width,height:t.height}):this.clipRect=c.clipRect(t);w=\"animate\";g||(w=\"attr\",this.plotBorder=g=c.rect().addClass(\"highcharts-plot-border\").attr({zIndex:1}).add());\nf||g.attr({stroke:a.plotBorderColor,\"stroke-width\":a.plotBorderWidth||0,fill:\"none\"});g[w](g.crisp({x:r,y:K,width:q,height:p},-g.strokeWidth()));this.isDirtyBox=!1;M(this,\"afterDrawChartBox\")};e.prototype.propFromSeries=function(){var a=this,d=a.options.chart,b,e=a.options.series,h,g;[\"inverted\",\"angular\",\"polar\"].forEach(function(f){b=c[d.type||d.defaultSeriesType];g=d[f]||b&&b.prototype[f];for(h=e&&e.length;!g&&h--;)(b=c[e[h].type])&&b.prototype[f]&&(g=!0);a[f]=g})};e.prototype.linkSeries=function(){var a=\nthis,c=a.series;c.forEach(function(a){a.linkedSeries.length=0});c.forEach(function(c){var d=c.options.linkedTo;F(d)&&(d=\":previous\"===d?a.series[c.index-1]:a.get(d))&&d.linkedParent!==c&&(d.linkedSeries.push(c),c.linkedParent=d,d.enabledDataSorting&&c.setDataSortingOptions(),c.visible=T(c.options.visible,d.options.visible,c.visible))});M(this,\"afterLinkSeries\")};e.prototype.renderSeries=function(){this.series.forEach(function(a){a.translate();a.render()})};e.prototype.renderLabels=function(){var a=\nthis,c=a.options.labels;c.items&&c.items.forEach(function(d){var b=V(c.style,d.style),e=X(b.left)+a.plotLeft,h=X(b.top)+a.plotTop+12;delete b.left;delete b.top;a.renderer.text(d.html,e,h).attr({zIndex:2}).css(b).add()})};e.prototype.render=function(){var a=this.axes,c=this.colorAxis,d=this.renderer,b=this.options,e=0,h=function(a){a.forEach(function(a){a.visible&&a.render()})};this.setTitle();this.legend=new H(this,b.legend);this.getStacks&&this.getStacks();this.getMargins(!0);this.setChartSize();\nb=this.plotWidth;a.some(function(a){if(a.horiz&&a.visible&&a.options.labels.enabled&&a.series.length)return e=21,!0});var g=this.plotHeight=Math.max(this.plotHeight-e,0);a.forEach(function(a){a.setScale()});this.getAxisMargins();var f=1.1<b/this.plotWidth;var m=1.05<g/this.plotHeight;if(f||m)a.forEach(function(a){(a.horiz&&f||!a.horiz&&m)&&a.setTickInterval(!0)}),this.getMargins();this.drawChartBox();this.hasCartesianSeries?h(a):c&&c.length&&h(c);this.seriesGroup||(this.seriesGroup=d.g(\"series-group\").attr({zIndex:3}).add());\nthis.renderSeries();this.renderLabels();this.addCredits();this.setResponsive&&this.setResponsive();this.hasRendered=!0};e.prototype.addCredits=function(a){var c=this,d=S(!0,this.options.credits,a);d.enabled&&!this.credits&&(this.credits=this.renderer.text(d.text+(this.mapCredits||\"\"),0,0).addClass(\"highcharts-credits\").on(\"click\",function(){d.href&&(J.location.href=d.href)}).attr({align:d.position.align,zIndex:8}),c.styledMode||this.credits.css(d.style),this.credits.add().align(d.position),this.credits.update=\nfunction(a){c.credits=c.credits.destroy();c.addCredits(a)})};e.prototype.destroy=function(){var a=this,c=a.axes,d=a.series,b=a.container,e,h=b&&b.parentNode;M(a,\"destroy\");a.renderer.forExport?P(u,a):u[a.index]=void 0;z.chartCount--;a.renderTo.removeAttribute(\"data-highcharts-chart\");fa(a);for(e=c.length;e--;)c[e]=c[e].destroy();this.scroller&&this.scroller.destroy&&this.scroller.destroy();for(e=d.length;e--;)d[e]=d[e].destroy();\"title subtitle chartBackground plotBackground plotBGImage plotBorder seriesGroup clipRect credits pointer rangeSelector legend resetZoomButton tooltip renderer\".split(\" \").forEach(function(c){var d=\na[c];d&&d.destroy&&(a[c]=d.destroy())});b&&(b.innerHTML=\"\",fa(b),h&&L(b));K(a,function(c,d){delete a[d]})};e.prototype.firstRender=function(){var a=this,c=a.options;if(!a.isReadyToRender||a.isReadyToRender()){a.getContainer();a.resetMargins();a.setChartSize();a.propFromSeries();a.getAxes();(p(c.series)?c.series:[]).forEach(function(c){a.initSeries(c)});a.linkSeries();a.setSeriesData();M(a,\"beforeRender\");x&&(a.pointer=z.hasTouch||!J.PointerEvent&&!J.MSPointerEvent?new x(a,c):new G(a,c));a.render();\na.pointer.getChartPosition();if(!a.renderer.imgCount&&!a.hasLoaded)a.onload();a.temporaryDisplay(!0)}};e.prototype.onload=function(){this.callbacks.concat([this.callback]).forEach(function(a){a&&\"undefined\"!==typeof this.index&&a.apply(this,[this])},this);M(this,\"load\");M(this,\"render\");y(this.index)&&this.setReflow(this.options.chart.reflow);this.hasLoaded=!0};e.prototype.addSeries=function(a,c,d){var b,e=this;a&&(c=T(c,!0),M(e,\"addSeries\",{options:a},function(){b=e.initSeries(a);e.isDirtyLegend=\n!0;e.linkSeries();b.enabledDataSorting&&b.setData(a.data,!1);M(e,\"afterAddSeries\",{series:b});c&&e.redraw(d)}));return b};e.prototype.addAxis=function(a,c,d,b){return this.createAxis(c?\"xAxis\":\"yAxis\",{axis:a,redraw:d,animation:b})};e.prototype.addColorAxis=function(a,c,d){return this.createAxis(\"colorAxis\",{axis:a,redraw:c,animation:d})};e.prototype.createAxis=function(a,c){var d=\"colorAxis\"===a,e=c.redraw,h=c.animation;a=S(c.axis,{index:this[a].length,isX:\"xAxis\"===a});a=d?new z.ColorAxis(this,\na):new b(this,a);d&&(this.isDirtyLegend=!0,this.axes.forEach(function(a){a.series=[]}),this.series.forEach(function(a){a.bindAxes();a.isDirtyData=!0}));T(e,!0)&&this.redraw(h);return a};e.prototype.showLoading=function(a){var c=this,b=c.options,e=c.loadingDiv,h=c.loadingSpan,f=b.loading,m=function(){e&&A(e,{left:c.plotLeft+\"px\",top:c.plotTop+\"px\",width:c.plotWidth+\"px\",height:c.plotHeight+\"px\"})};e||(c.loadingDiv=e=r(\"div\",{className:\"highcharts-loading highcharts-loading-hidden\"},null,c.container));\nh||(c.loadingSpan=h=r(\"span\",{className:\"highcharts-loading-inner\"},null,e),g(c,\"redraw\",m));e.className=\"highcharts-loading\";d.setElementHTML(h,T(a,b.lang.loading,\"\"));c.styledMode||(A(e,V(f.style,{zIndex:10})),A(h,f.labelStyle),c.loadingShown||(A(e,{opacity:0,display:\"\"}),q(e,{opacity:f.style.opacity||.5},{duration:f.showDuration||0})));c.loadingShown=!0;m()};e.prototype.hideLoading=function(){var a=this.options,c=this.loadingDiv;c&&(c.className=\"highcharts-loading highcharts-loading-hidden\",this.styledMode||\nq(c,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){A(c,{display:\"none\"})}}));this.loadingShown=!1};e.prototype.update=function(a,c,d,b){var e=this,g={credits:\"addCredits\",title:\"setTitle\",subtitle:\"setSubtitle\",caption:\"setCaption\"},f,k,l,n=a.isResponsiveOptions,r=[];M(e,\"update\",{options:a});n||e.setResponsive(!1,!0);a=h(a,e.options);e.userOptions=S(e.userOptions,a);if(f=a.chart){S(!0,e.options.chart,f);\"className\"in f&&e.setClassName(f.className);\"reflow\"in f&&e.setReflow(f.reflow);\nif(\"inverted\"in f||\"polar\"in f||\"type\"in f){e.propFromSeries();var q=!0}\"alignTicks\"in f&&(q=!0);K(f,function(a,c){-1!==e.propsRequireUpdateSeries.indexOf(\"chart.\"+c)&&(k=!0);-1!==e.propsRequireDirtyBox.indexOf(c)&&(e.isDirtyBox=!0);-1!==e.propsRequireReflow.indexOf(c)&&(n?e.isDirtyBox=!0:l=!0)});!e.styledMode&&\"style\"in f&&e.renderer.setStyle(f.style)}!e.styledMode&&a.colors&&(this.options.colors=a.colors);a.time&&(this.time===m&&(this.time=new v(a.time)),S(!0,e.options.time,a.time));K(a,function(c,\nd){if(e[d]&&\"function\"===typeof e[d].update)e[d].update(c,!1);else if(\"function\"===typeof e[g[d]])e[g[d]](c);else\"colors\"!==d&&-1===e.collectionsWithUpdate.indexOf(d)&&S(!0,e.options[d],a[d]);\"chart\"!==d&&-1!==e.propsRequireUpdateSeries.indexOf(d)&&(k=!0)});this.collectionsWithUpdate.forEach(function(c){if(a[c]){var b=[];e[c].forEach(function(a,c){a.options.isInternal||b.push(T(a.options.index,c))});Y(a[c]).forEach(function(a,h){var g=y(a.id),f;g&&(f=e.get(a.id));!f&&e[c]&&(f=e[c][b?b[h]:h])&&g&&\ny(f.options.id)&&(f=void 0);f&&f.coll===c&&(f.update(a,!1),d&&(f.touched=!0));!f&&d&&e.collectionsWithInit[c]&&(e.collectionsWithInit[c][0].apply(e,[a].concat(e.collectionsWithInit[c][1]||[]).concat([!1])).touched=!0)});d&&e[c].forEach(function(a){a.touched||a.options.isInternal?delete a.touched:r.push(a)})}});r.forEach(function(a){a.chart&&a.remove(!1)});q&&e.axes.forEach(function(a){a.update({},!1)});k&&e.getSeriesOrderByLinks().forEach(function(a){a.chart&&a.update({},!1)},this);q=f&&f.width;f=\nf&&f.height;F(f)&&(f=U(f,q||e.chartWidth));l||Z(q)&&q!==e.chartWidth||Z(f)&&f!==e.chartHeight?e.setSize(q,f,b):T(c,!0)&&e.redraw(b);M(e,\"afterUpdate\",{options:a,redraw:c,animation:b})};e.prototype.setSubtitle=function(a,c){this.applyDescription(\"subtitle\",a);this.layOutTitles(c)};e.prototype.setCaption=function(a,c){this.applyDescription(\"caption\",a);this.layOutTitles(c)};e.prototype.showResetZoom=function(){function a(){c.zoomOut()}var c=this,d=E.lang,b=c.options.chart.resetZoomButton,e=b.theme,\nh=e.states,g=\"chart\"===b.relativeTo||\"spacingBox\"===b.relativeTo?null:\"scrollablePlotBox\";M(this,\"beforeShowResetZoom\",null,function(){c.resetZoomButton=c.renderer.button(d.resetZoom,null,null,a,e,h&&h.hover).attr({align:b.position.align,title:d.resetZoomTitle}).addClass(\"highcharts-reset-zoom\").add().align(b.position,!1,g)});M(this,\"afterShowResetZoom\")};e.prototype.zoomOut=function(){M(this,\"selection\",{resetSelection:!0},this.zoom)};e.prototype.zoom=function(a){var c=this,d,b=c.pointer,e=!1,h=\nc.inverted?b.mouseDownX:b.mouseDownY;!a||a.resetSelection?(c.axes.forEach(function(a){d=a.zoom()}),b.initiated=!1):a.xAxis.concat(a.yAxis).forEach(function(a){var g=a.axis,f=c.inverted?g.left:g.top,m=c.inverted?f+g.width:f+g.height,k=g.isXAxis,l=!1;if(!k&&h>=f&&h<=m||k||!y(h))l=!0;b[k?\"zoomX\":\"zoomY\"]&&l&&(d=g.zoom(a.min,a.max),g.displayBtn&&(e=!0))});var g=c.resetZoomButton;e&&!g?c.showResetZoom():!e&&ea(g)&&(c.resetZoomButton=g.destroy());d&&c.redraw(T(c.options.chart.animation,a&&a.animation,100>\nc.pointCount))};e.prototype.pan=function(a,c){var d=this,b=d.hoverPoints,e=d.options.chart,h=d.options.mapNavigation&&d.options.mapNavigation.enabled,g;c=\"object\"===typeof c?c:{enabled:c,type:\"x\"};e&&e.panning&&(e.panning=c);var f=c.type;M(this,\"pan\",{originalEvent:a},function(){b&&b.forEach(function(a){a.setState()});var c=[1];\"xy\"===f?c=[1,0]:\"y\"===f&&(c=[0]);c.forEach(function(c){var b=d[c?\"xAxis\":\"yAxis\"][0],e=b.horiz,m=a[e?\"chartX\":\"chartY\"];e=e?\"mouseDownX\":\"mouseDownY\";var k=d[e],l=(b.pointRange||\n0)/2,F=b.reversed&&!d.inverted||!b.reversed&&d.inverted?-1:1,n=b.getExtremes(),r=b.toValue(k-m,!0)+l*F;F=b.toValue(k+b.len-m,!0)-l*F;var K=F<r;k=K?F:r;r=K?r:F;F=b.hasVerticalPanning();var q=b.panningState;!F||c||q&&!q.isDirty||b.series.forEach(function(a){var c=a.getProcessedData(!0);c=a.getExtremes(c.yData,!0);q||(q={startMin:Number.MAX_VALUE,startMax:-Number.MAX_VALUE});Z(c.dataMin)&&Z(c.dataMax)&&(q.startMin=Math.min(T(a.options.threshold,Infinity),c.dataMin,q.startMin),q.startMax=Math.max(T(a.options.threshold,\n-Infinity),c.dataMax,q.startMax))});c=Math.min(T(q&&q.startMin,n.dataMin),l?n.min:b.toValue(b.toPixels(n.min)-b.minPixelPadding));l=Math.max(T(q&&q.startMax,n.dataMax),l?n.max:b.toValue(b.toPixels(n.max)+b.minPixelPadding));b.panningState=q;b.isOrdinal||(F=c-k,0<F&&(r+=F,k=c),F=r-l,0<F&&(r=l,k-=F),b.series.length&&k!==n.min&&r!==n.max&&k>=c&&r<=l&&(b.setExtremes(k,r,!1,!1,{trigger:\"pan\"}),d.resetZoomButton||h||k===c||r===l||!f.match(\"y\")||(d.showResetZoom(),b.displayBtn=!1),g=!0),d[e]=m)});g&&d.redraw(!1);\nA(d.container,{cursor:\"move\"})})};return e}();V(aa.prototype,{callbacks:[],collectionsWithInit:{xAxis:[aa.prototype.addAxis,[!0]],yAxis:[aa.prototype.addAxis,[!1]],series:[aa.prototype.addSeries]},collectionsWithUpdate:[\"xAxis\",\"yAxis\",\"zAxis\",\"series\"],propsRequireDirtyBox:\"backgroundColor borderColor borderWidth borderRadius plotBackgroundColor plotBackgroundImage plotBorderColor plotBorderWidth plotShadow shadow\".split(\" \"),propsRequireReflow:\"margin marginTop marginRight marginBottom marginLeft spacing spacingTop spacingRight spacingBottom spacingLeft\".split(\" \"),\npropsRequireUpdateSeries:\"chart.inverted chart.polar chart.ignoreHiddenSeries chart.type colors plotOptions time tooltip\".split(\" \")});z.chart=function(a,c,d){return new aa(a,c,d)};z.Chart=aa;\"\";return aa});O(e,\"Mixins/LegendSymbol.js\",[e[\"Core/Globals.js\"],e[\"Core/Utilities.js\"]],function(e,b){var D=b.merge,z=b.pick;return e.LegendSymbolMixin={drawRectangle:function(b,e){var D=b.symbolHeight,B=b.options.squareSymbol;e.legendSymbol=this.chart.renderer.rect(B?(b.symbolWidth-D)/2:0,b.baseline-D+1,B?\nD:b.symbolWidth,D,z(b.options.symbolRadius,D/2)).addClass(\"highcharts-point\").attr({zIndex:3}).add(e.legendGroup)},drawLineMarker:function(b){var e=this.options,C=e.marker,B=b.symbolWidth,x=b.symbolHeight,w=x/2,v=this.chart.renderer,f=this.legendGroup;b=b.baseline-Math.round(.3*b.fontMetrics.b);var d={};this.chart.styledMode||(d={\"stroke-width\":e.lineWidth||0},e.dashStyle&&(d.dashstyle=e.dashStyle));this.legendLine=v.path([[\"M\",0,b],[\"L\",B,b]]).addClass(\"highcharts-graph\").attr(d).add(f);C&&!1!==\nC.enabled&&B&&(e=Math.min(z(C.radius,w),w),0===this.symbol.indexOf(\"url\")&&(C=D(C,{width:x,height:x}),e=0),this.legendSymbol=C=v.symbol(this.symbol,B/2-e,b-e,2*e,2*e,C).addClass(\"highcharts-point\").add(f),C.isMarker=!0)}}});O(e,\"Core/Series/Series.js\",[e[\"Core/Animation/AnimationUtilities.js\"],e[\"Core/Globals.js\"],e[\"Mixins/LegendSymbol.js\"],e[\"Core/Options.js\"],e[\"Core/Color/Palette.js\"],e[\"Core/Series/Point.js\"],e[\"Core/Series/SeriesRegistry.js\"],e[\"Core/Renderer/SVG/SVGElement.js\"],e[\"Core/Utilities.js\"]],\nfunction(e,b,I,z,H,G,C,B,x){var w=e.animObject,v=e.setAnimation,f=b.hasTouch,d=b.svg,q=b.win,k=z.defaultOptions,l=C.seriesTypes,D=x.addEvent,u=x.arrayMax,n=x.arrayMin,J=x.clamp,E=x.cleanRecursively,m=x.correctFloat,c=x.defined,g=x.erase,a=x.error,h=x.extend,r=x.find,A=x.fireEvent,y=x.getNestedProperty,L=x.isArray,P=x.isFunction,R=x.isNumber,V=x.isString,Q=x.merge,M=x.objectEach,t=x.pick,p=x.removeEvent,O=x.splat,Z=x.syncTimeout;e=function(){function b(){this.zones=this.yAxis=this.xAxis=this.userOptions=\nthis.tooltipOptions=this.processedYData=this.processedXData=this.points=this.options=this.linkedSeries=this.index=this.eventsToUnbind=this.eventOptions=this.data=this.chart=this._i=void 0}b.prototype.init=function(a,c){A(this,\"init\",{options:c});var d=this,b=a.series,e;this.eventOptions=this.eventOptions||{};this.eventsToUnbind=[];d.chart=a;d.options=d.setOptions(c);var g=d.options;d.linkedSeries=[];d.bindAxes();h(d,{name:g.name,state:\"\",visible:!1!==g.visible,selected:!0===g.selected});c=g.events;\nM(c,function(a,c){P(a)&&d.eventOptions[c]!==a&&(P(d.eventOptions[c])&&p(d,c,d.eventOptions[c]),d.eventOptions[c]=a,D(d,c,a))});if(c&&c.click||g.point&&g.point.events&&g.point.events.click||g.allowPointSelect)a.runTrackerClick=!0;d.getColor();d.getSymbol();d.parallelArrays.forEach(function(a){d[a+\"Data\"]||(d[a+\"Data\"]=[])});d.isCartesian&&(a.hasCartesianSeries=!0);b.length&&(e=b[b.length-1]);d._i=t(e&&e._i,-1)+1;d.opacity=d.options.opacity;a.orderSeries(this.insert(b));g.dataSorting&&g.dataSorting.enabled?\nd.setDataSortingOptions():d.points||d.data||d.setData(g.data,!1);A(this,\"afterInit\")};b.prototype.is=function(a){return l[a]&&this instanceof l[a]};b.prototype.insert=function(a){var c=this.options.index,d;if(R(c)){for(d=a.length;d--;)if(c>=t(a[d].options.index,a[d]._i)){a.splice(d+1,0,this);break}-1===d&&a.unshift(this);d+=1}else a.push(this);return t(d,a.length-1)};b.prototype.bindAxes=function(){var c=this,d=c.options,b=c.chart,e;A(this,\"bindAxes\",null,function(){(c.axisTypes||[]).forEach(function(h){var g=\n0;b[h].forEach(function(a){e=a.options;if(d[h]===g&&!e.isInternal||\"undefined\"!==typeof d[h]&&d[h]===e.id||\"undefined\"===typeof d[h]&&0===e.index)c.insert(a.series),c[h]=a,a.isDirty=!0;e.isInternal||g++});c[h]||c.optionalAxis===h||a(18,!0,b)})});A(this,\"afterBindAxes\")};b.prototype.updateParallelArrays=function(a,c){var d=a.series,b=arguments,e=R(c)?function(b){var e=\"y\"===b&&d.toYData?d.toYData(a):a[b];d[b+\"Data\"][c]=e}:function(a){Array.prototype[c].apply(d[a+\"Data\"],Array.prototype.slice.call(b,\n2))};d.parallelArrays.forEach(e)};b.prototype.hasData=function(){return this.visible&&\"undefined\"!==typeof this.dataMax&&\"undefined\"!==typeof this.dataMin||this.visible&&this.yData&&0<this.yData.length};b.prototype.autoIncrement=function(){var a=this.options,c=this.xIncrement,d,b=a.pointIntervalUnit,e=this.chart.time;c=t(c,a.pointStart,0);this.pointInterval=d=t(this.pointInterval,a.pointInterval,1);b&&(a=new e.Date(c),\"day\"===b?e.set(\"Date\",a,e.get(\"Date\",a)+d):\"month\"===b?e.set(\"Month\",a,e.get(\"Month\",\na)+d):\"year\"===b&&e.set(\"FullYear\",a,e.get(\"FullYear\",a)+d),d=a.getTime()-c);this.xIncrement=c+d;return c};b.prototype.setDataSortingOptions=function(){var a=this.options;h(this,{requireSorting:!1,sorted:!1,enabledDataSorting:!0,allowDG:!1});c(a.pointRange)||(a.pointRange=1)};b.prototype.setOptions=function(a){var d=this.chart,b=d.options,e=b.plotOptions,h=d.userOptions||{};a=Q(a);d=d.styledMode;var g={plotOptions:e,userOptions:a};A(this,\"setOptions\",g);var f=g.plotOptions[this.type],m=h.plotOptions||\n{};this.userOptions=g.userOptions;h=Q(f,e.series,h.plotOptions&&h.plotOptions[this.type],a);this.tooltipOptions=Q(k.tooltip,k.plotOptions.series&&k.plotOptions.series.tooltip,k.plotOptions[this.type].tooltip,b.tooltip.userOptions,e.series&&e.series.tooltip,e[this.type].tooltip,a.tooltip);this.stickyTracking=t(a.stickyTracking,m[this.type]&&m[this.type].stickyTracking,m.series&&m.series.stickyTracking,this.tooltipOptions.shared&&!this.noSharedTooltip?!0:h.stickyTracking);null===f.marker&&delete h.marker;\nthis.zoneAxis=h.zoneAxis;b=this.zones=(h.zones||[]).slice();!h.negativeColor&&!h.negativeFillColor||h.zones||(e={value:h[this.zoneAxis+\"Threshold\"]||h.threshold||0,className:\"highcharts-negative\"},d||(e.color=h.negativeColor,e.fillColor=h.negativeFillColor),b.push(e));b.length&&c(b[b.length-1].value)&&b.push(d?{}:{color:this.color,fillColor:this.fillColor});A(this,\"afterSetOptions\",{options:h});return h};b.prototype.getName=function(){return t(this.options.name,\"Series \"+(this.index+1))};b.prototype.getCyclic=\nfunction(a,d,b){var e=this.chart,h=this.userOptions,g=a+\"Index\",f=a+\"Counter\",m=b?b.length:t(e.options.chart[a+\"Count\"],e[a+\"Count\"]);if(!d){var k=t(h[g],h[\"_\"+g]);c(k)||(e.series.length||(e[f]=0),h[\"_\"+g]=k=e[f]%m,e[f]+=1);b&&(d=b[k])}\"undefined\"!==typeof k&&(this[g]=k);this[a]=d};b.prototype.getColor=function(){this.chart.styledMode?this.getCyclic(\"color\"):this.options.colorByPoint?this.color=H.neutralColor20:this.getCyclic(\"color\",this.options.color||k.plotOptions[this.type].color,this.chart.options.colors)};\nb.prototype.getPointsCollection=function(){return(this.hasGroupedData?this.points:this.data)||[]};b.prototype.getSymbol=function(){this.getCyclic(\"symbol\",this.options.marker.symbol,this.chart.options.symbols)};b.prototype.findPointIndex=function(a,c){var d=a.id,b=a.x,e=this.points,h,g=this.options.dataSorting;if(d)var f=this.chart.get(d);else if(this.linkedParent||this.enabledDataSorting){var m=g&&g.matchByName?\"name\":\"index\";f=r(e,function(c){return!c.touched&&c[m]===a[m]});if(!f)return}if(f){var k=\nf&&f.index;\"undefined\"!==typeof k&&(h=!0)}\"undefined\"===typeof k&&R(b)&&(k=this.xData.indexOf(b,c));-1!==k&&\"undefined\"!==typeof k&&this.cropped&&(k=k>=this.cropStart?k-this.cropStart:k);!h&&e[k]&&e[k].touched&&(k=void 0);return k};b.prototype.updateData=function(a,d){var b=this.options,e=b.dataSorting,h=this.points,g=[],f,k,m,l=this.requireSorting,n=a.length===h.length,r=!0;this.xIncrement=null;a.forEach(function(a,d){var k=c(a)&&this.pointClass.prototype.optionsToObject.call({series:this},a)||{};\nvar r=k.x;if(k.id||R(r)){if(r=this.findPointIndex(k,m),-1===r||\"undefined\"===typeof r?g.push(a):h[r]&&a!==b.data[r]?(h[r].update(a,!1,null,!1),h[r].touched=!0,l&&(m=r+1)):h[r]&&(h[r].touched=!0),!n||d!==r||e&&e.enabled||this.hasDerivedData)f=!0}else g.push(a)},this);if(f)for(a=h.length;a--;)(k=h[a])&&!k.touched&&k.remove&&k.remove(!1,d);else!n||e&&e.enabled?r=!1:(a.forEach(function(a,c){h[c].update&&a!==h[c].y&&h[c].update(a,!1,null,!1)}),g.length=0);h.forEach(function(a){a&&(a.touched=!1)});if(!r)return!1;\ng.forEach(function(a){this.addPoint(a,!1,null,null,!1)},this);null===this.xIncrement&&this.xData&&this.xData.length&&(this.xIncrement=u(this.xData),this.autoIncrement());return!0};b.prototype.setData=function(c,d,b,e){var h=this,g=h.points,f=g&&g.length||0,k,m=h.options,l=h.chart,r=m.dataSorting,n=null,q=h.xAxis;n=m.turboThreshold;var F=this.xData,p=this.yData,u=(k=h.pointArrayMap)&&k.length,v=m.keys,K=0,w=1,y;c=c||[];k=c.length;d=t(d,!0);r&&r.enabled&&(c=this.sortData(c));!1!==e&&k&&f&&!h.cropped&&\n!h.hasGroupedData&&h.visible&&!h.isSeriesBoosting&&(y=this.updateData(c,b));if(!y){h.xIncrement=null;h.colorCounter=0;this.parallelArrays.forEach(function(a){h[a+\"Data\"].length=0});if(n&&k>n)if(n=h.getFirstValidPoint(c),R(n))for(b=0;b<k;b++)F[b]=this.autoIncrement(),p[b]=c[b];else if(L(n))if(u)for(b=0;b<k;b++)e=c[b],F[b]=e[0],p[b]=e.slice(1,u+1);else for(v&&(K=v.indexOf(\"x\"),w=v.indexOf(\"y\"),K=0<=K?K:0,w=0<=w?w:1),b=0;b<k;b++)e=c[b],F[b]=e[K],p[b]=e[w];else a(12,!1,l);else for(b=0;b<k;b++)\"undefined\"!==\ntypeof c[b]&&(e={series:h},h.pointClass.prototype.applyOptions.apply(e,[c[b]]),h.updateParallelArrays(e,b));p&&V(p[0])&&a(14,!0,l);h.data=[];h.options.data=h.userOptions.data=c;for(b=f;b--;)g[b]&&g[b].destroy&&g[b].destroy();q&&(q.minRange=q.userMinRange);h.isDirty=l.isDirtyBox=!0;h.isDirtyData=!!g;b=!1}\"point\"===m.legendType&&(this.processData(),this.generatePoints());d&&l.redraw(b)};b.prototype.sortData=function(a){var d=this,b=d.options.dataSorting.sortKey||\"y\",e=function(a,d){return c(d)&&a.pointClass.prototype.optionsToObject.call({series:a},\nd)||{}};a.forEach(function(c,b){a[b]=e(d,c);a[b].index=b},this);a.concat().sort(function(a,c){a=y(b,a);c=y(b,c);return c<a?-1:c>a?1:0}).forEach(function(a,c){a.x=c},this);d.linkedSeries&&d.linkedSeries.forEach(function(c){var d=c.options,b=d.data;d.dataSorting&&d.dataSorting.enabled||!b||(b.forEach(function(d,h){b[h]=e(c,d);a[h]&&(b[h].x=a[h].x,b[h].index=h)}),c.setData(b,!1))});return a};b.prototype.getProcessedData=function(c){var d=this.xData,b=this.yData,e=d.length;var h=0;var g=this.xAxis,f=\nthis.options;var k=f.cropThreshold;var m=c||this.getExtremesFromAll||f.getExtremesFromAll,l=this.isCartesian;c=g&&g.val2lin;f=!(!g||!g.logarithmic);var n=this.requireSorting;if(g){g=g.getExtremes();var r=g.min;var q=g.max}if(l&&this.sorted&&!m&&(!k||e>k||this.forceCrop))if(d[e-1]<r||d[0]>q)d=[],b=[];else if(this.yData&&(d[0]<r||d[e-1]>q)){h=this.cropData(this.xData,this.yData,r,q);d=h.xData;b=h.yData;h=h.start;var F=!0}for(k=d.length||1;--k;)if(e=f?c(d[k])-c(d[k-1]):d[k]-d[k-1],0<e&&(\"undefined\"===\ntypeof p||e<p))var p=e;else 0>e&&n&&(a(15,!1,this.chart),n=!1);return{xData:d,yData:b,cropped:F,cropStart:h,closestPointRange:p}};b.prototype.processData=function(a){var c=this.xAxis;if(this.isCartesian&&!this.isDirty&&!c.isDirty&&!this.yAxis.isDirty&&!a)return!1;a=this.getProcessedData();this.cropped=a.cropped;this.cropStart=a.cropStart;this.processedXData=a.xData;this.processedYData=a.yData;this.closestPointRange=this.basePointRange=a.closestPointRange};b.prototype.cropData=function(a,c,d,b,e){var h=\na.length,g=0,f=h,k;e=t(e,this.cropShoulder);for(k=0;k<h;k++)if(a[k]>=d){g=Math.max(0,k-e);break}for(d=k;d<h;d++)if(a[d]>b){f=d+e;break}return{xData:a.slice(g,f),yData:c.slice(g,f),start:g,end:f}};b.prototype.generatePoints=function(){var a=this.options,c=a.data,d=this.data,b,e=this.processedXData,g=this.processedYData,f=this.pointClass,k=e.length,m=this.cropStart||0,l=this.hasGroupedData,n=a.keys,r=[],q;a=a.dataGrouping&&a.dataGrouping.groupAll?m:0;d||l||(d=[],d.length=c.length,d=this.data=d);n&&\nl&&(this.options.keys=!1);for(q=0;q<k;q++){var p=m+q;if(l){var u=(new f).init(this,[e[q]].concat(O(g[q])));u.dataGroup=this.groupMap[a+q];u.dataGroup.options&&(u.options=u.dataGroup.options,h(u,u.dataGroup.options),delete u.dataLabels)}else(u=d[p])||\"undefined\"===typeof c[p]||(d[p]=u=(new f).init(this,c[p],e[q]));u&&(u.index=l?a+q:p,r[q]=u)}this.options.keys=n;if(d&&(k!==(b=d.length)||l))for(q=0;q<b;q++)q!==m||l||(q+=k),d[q]&&(d[q].destroyElements(),d[q].plotX=void 0);this.data=d;this.points=r;A(this,\n\"afterGeneratePoints\")};b.prototype.getXExtremes=function(a){return{min:n(a),max:u(a)}};b.prototype.getExtremes=function(a,c){var d=this.xAxis,b=this.yAxis,e=this.processedXData||this.xData,h=[],g=0,f=0;var k=0;var m=this.requireSorting?this.cropShoulder:0,l=b?b.positiveValuesOnly:!1,r;a=a||this.stackedYData||this.processedYData||[];b=a.length;d&&(k=d.getExtremes(),f=k.min,k=k.max);for(r=0;r<b;r++){var q=e[r];var p=a[r];var F=(R(p)||L(p))&&(p.length||0<p||!l);q=c||this.getExtremesFromAll||this.options.getExtremesFromAll||\nthis.cropped||!d||(e[r+m]||q)>=f&&(e[r-m]||q)<=k;if(F&&q)if(F=p.length)for(;F--;)R(p[F])&&(h[g++]=p[F]);else h[g++]=p}a={dataMin:n(h),dataMax:u(h)};A(this,\"afterGetExtremes\",{dataExtremes:a});return a};b.prototype.applyExtremes=function(){var a=this.getExtremes();this.dataMin=a.dataMin;this.dataMax=a.dataMax;return a};b.prototype.getFirstValidPoint=function(a){for(var c=null,d=a.length,b=0;null===c&&b<d;)c=a[b],b++;return c};b.prototype.translate=function(){this.processedXData||this.processData();\nthis.generatePoints();var a=this.options,d=a.stacking,b=this.xAxis,e=b.categories,h=this.enabledDataSorting,g=this.yAxis,f=this.points,k=f.length,l=!!this.modifyValue,r,n=this.pointPlacementToXValue(),q=!!n,p=a.threshold,u=a.startFromThreshold?p:0,v,w=this.zoneAxis||\"y\",y=Number.MAX_VALUE;for(r=0;r<k;r++){var E=f[r],x=E.x,D=E.y,B=E.low,P=d&&g.stacking&&g.stacking.stacks[(this.negStacks&&D<(u?0:p)?\"-\":\"\")+this.stackKey],N=void 0,C=void 0;if(g.positiveValuesOnly&&!g.validatePositiveValue(D)||b.positiveValuesOnly&&\n!b.validatePositiveValue(x))E.isNull=!0;E.plotX=v=m(J(b.translate(x,0,0,0,1,n,\"flags\"===this.type),-1E5,1E5));if(d&&this.visible&&P&&P[x]){var z=this.getStackIndicator(z,x,this.index);E.isNull||(N=P[x],C=N.points[z.key])}L(C)&&(B=C[0],D=C[1],B===u&&z.key===P[x].base&&(B=t(R(p)&&p,g.min)),g.positiveValuesOnly&&0>=B&&(B=null),E.total=E.stackTotal=N.total,E.percentage=N.total&&E.y/N.total*100,E.stackY=D,this.irregularWidths||N.setOffset(this.pointXOffset||0,this.barW||0));E.yBottom=c(B)?J(g.translate(B,\n0,1,0,1),-1E5,1E5):null;l&&(D=this.modifyValue(D,E));E.plotY=void 0;R(D)&&(D=g.translate(D,!1,!0,!1,!0),\"undefined\"!==typeof D&&(E.plotY=J(D,-1E5,1E5)));E.isInside=this.isPointInside(E);E.clientX=q?m(b.translate(x,0,0,0,1,n)):v;E.negative=E[w]<(a[w+\"Threshold\"]||p||0);E.category=e&&\"undefined\"!==typeof e[E.x]?e[E.x]:E.x;if(!E.isNull&&!1!==E.visible){\"undefined\"!==typeof M&&(y=Math.min(y,Math.abs(v-M)));var M=v}E.zone=this.zones.length&&E.getZone();!E.graphic&&this.group&&h&&(E.isNew=!0)}this.closestPointRangePx=\ny;A(this,\"afterTranslate\")};b.prototype.getValidPoints=function(a,c,d){var b=this.chart;return(a||this.points||[]).filter(function(a){return c&&!b.isInsidePlot(a.plotX,a.plotY,{inverted:b.inverted})?!1:!1!==a.visible&&(d||!a.isNull)})};b.prototype.getClipBox=function(a,c){var d=this.options,b=this.chart,e=b.inverted,h=this.xAxis,g=h&&this.yAxis,f=b.options.chart.scrollablePlotArea||{};a&&!1===d.clip&&g?a=e?{y:-b.chartWidth+g.len+g.pos,height:b.chartWidth,width:b.chartHeight,x:-b.chartHeight+h.len+\nh.pos}:{y:-g.pos,height:b.chartHeight,width:b.chartWidth,x:-h.pos}:(a=this.clipBox||b.clipBox,c&&(a.width=b.plotSizeX,a.x=(b.scrollablePixelsX||0)*(f.scrollPositionX||0)));return c?{width:a.width,x:a.x}:a};b.prototype.getSharedClipKey=function(a){if(this.sharedClipKey)return this.sharedClipKey;var c=[a&&a.duration,a&&a.easing,a&&a.defer,this.getClipBox(a).height,this.options.xAxis,this.options.yAxis].join();if(!1!==this.options.clip||a)this.sharedClipKey=c;return c};b.prototype.setClip=function(a){var c=\nthis.chart,d=this.options,b=c.renderer,e=c.inverted,h=this.clipBox,g=this.getClipBox(a),f=this.getSharedClipKey(a),k=c.sharedClips[f],m=c.sharedClips[f+\"m\"];a&&(g.width=0,e&&(g.x=c.plotHeight+(!1!==d.clip?0:c.plotTop)));k?c.hasLoaded||k.attr(g):(a&&(c.sharedClips[f+\"m\"]=m=b.clipRect(e?(c.plotSizeX||0)+99:-99,e?-c.plotLeft:-c.plotTop,99,e?c.chartWidth:c.chartHeight)),c.sharedClips[f]=k=b.clipRect(g),k.count={length:0});a&&!k.count[this.index]&&(k.count[this.index]=!0,k.count.length+=1);if(!1!==d.clip||\na)this.group.clip(a||h?k:c.clipRect),this.markerGroup.clip(m);a||(k.count[this.index]&&(delete k.count[this.index],--k.count.length),0===k.count.length&&(h||(c.sharedClips[f]=k.destroy()),m&&(c.sharedClips[f+\"m\"]=m.destroy())))};b.prototype.animate=function(a){var c=this.chart,d=w(this.options.animation),b=this.sharedClipKey;if(a)this.setClip(d);else if(b){a=c.sharedClips[b];b=c.sharedClips[b+\"m\"];var e=this.getClipBox(d,!0);a&&a.animate(e,d);b&&b.animate({width:e.width+99,x:e.x-(c.inverted?0:99)},\nd)}};b.prototype.afterAnimate=function(){this.setClip();A(this,\"afterAnimate\");this.finishedAnimating=!0};b.prototype.drawPoints=function(){var a=this.points,c=this.chart,d,b,e=this.options.marker,h=this[this.specialGroup]||this.markerGroup,g=this.xAxis,f=t(e.enabled,!g||g.isRadial?!0:null,this.closestPointRangePx>=e.enabledThreshold*e.radius);if(!1!==e.enabled||this._hasPointMarkers)for(d=0;d<a.length;d++){var k=a[d];var m=(b=k.graphic)?\"animate\":\"attr\";var l=k.marker||{};var r=!!k.marker;if((f&&\n\"undefined\"===typeof l.enabled||l.enabled)&&!k.isNull&&!1!==k.visible){var n=t(l.symbol,this.symbol);var q=this.markerAttribs(k,k.selected&&\"select\");this.enabledDataSorting&&(k.startXPos=g.reversed?-(q.width||0):g.width);var p=!1!==k.isInside;b?b[p?\"show\":\"hide\"](p).animate(q):p&&(0<(q.width||0)||k.hasImage)&&(k.graphic=b=c.renderer.symbol(n,q.x,q.y,q.width,q.height,r?l:e).add(h),this.enabledDataSorting&&c.hasRendered&&(b.attr({x:k.startXPos}),m=\"animate\"));b&&\"animate\"===m&&b[p?\"show\":\"hide\"](p).animate(q);\nif(b&&!c.styledMode)b[m](this.pointAttribs(k,k.selected&&\"select\"));b&&b.addClass(k.getClassName(),!0)}else b&&(k.graphic=b.destroy())}};b.prototype.markerAttribs=function(a,c){var d=this.options,b=d.marker,e=a.marker||{},h=e.symbol||b.symbol,g=t(e.radius,b.radius);c&&(b=b.states[c],c=e.states&&e.states[c],g=t(c&&c.radius,b&&b.radius,g+(b&&b.radiusPlus||0)));a.hasImage=h&&0===h.indexOf(\"url\");a.hasImage&&(g=0);a={x:d.crisp?Math.floor(a.plotX-g):a.plotX-g,y:a.plotY-g};g&&(a.width=a.height=2*g);return a};\nb.prototype.pointAttribs=function(a,c){var d=this.options.marker,b=a&&a.options,e=b&&b.marker||{},h=this.color,g=b&&b.color,f=a&&a.color;b=t(e.lineWidth,d.lineWidth);var k=a&&a.zone&&a.zone.color;a=1;h=g||k||f||h;g=e.fillColor||d.fillColor||h;h=e.lineColor||d.lineColor||h;c=c||\"normal\";d=d.states[c];c=e.states&&e.states[c]||{};b=t(c.lineWidth,d.lineWidth,b+t(c.lineWidthPlus,d.lineWidthPlus,0));g=c.fillColor||d.fillColor||g;h=c.lineColor||d.lineColor||h;a=t(c.opacity,d.opacity,a);return{stroke:h,\"stroke-width\":b,\nfill:g,opacity:a}};b.prototype.destroy=function(a){var c=this,d=c.chart,b=/AppleWebKit\\/533/.test(q.navigator.userAgent),e,h,f=c.data||[],k,m;A(c,\"destroy\");this.removeEvents(a);(c.axisTypes||[]).forEach(function(a){(m=c[a])&&m.series&&(g(m.series,c),m.isDirty=m.forceRedraw=!0)});c.legendItem&&c.chart.legend.destroyItem(c);for(h=f.length;h--;)(k=f[h])&&k.destroy&&k.destroy();c.clips&&c.clips.forEach(function(a){return a.destroy()});x.clearTimeout(c.animationTimeout);M(c,function(a,c){a instanceof\nB&&!a.survive&&(e=b&&\"group\"===c?\"hide\":\"destroy\",a[e]())});d.hoverSeries===c&&(d.hoverSeries=void 0);g(d.series,c);d.orderSeries();M(c,function(d,b){a&&\"hcEvents\"===b||delete c[b]})};b.prototype.applyZones=function(){var a=this,c=this.chart,d=c.renderer,b=this.zones,e,h,g=this.clips||[],f,k=this.graph,m=this.area,l=Math.max(c.chartWidth,c.chartHeight),r=this[(this.zoneAxis||\"y\")+\"Axis\"],n=c.inverted,q,p,u,v=!1,w,y;if(b.length&&(k||m)&&r&&\"undefined\"!==typeof r.min){var E=r.reversed;var A=r.horiz;\nk&&!this.showLine&&k.hide();m&&m.hide();var x=r.getExtremes();b.forEach(function(b,F){e=E?A?c.plotWidth:0:A?0:r.toPixels(x.min)||0;e=J(t(h,e),0,l);h=J(Math.round(r.toPixels(t(b.value,x.max),!0)||0),0,l);v&&(e=h=r.toPixels(x.max));q=Math.abs(e-h);p=Math.min(e,h);u=Math.max(e,h);r.isXAxis?(f={x:n?u:p,y:0,width:q,height:l},A||(f.x=c.plotHeight-f.x)):(f={x:0,y:n?u:p,width:l,height:q},A&&(f.y=c.plotWidth-f.y));n&&d.isVML&&(f=r.isXAxis?{x:0,y:E?p:u,height:f.width,width:c.chartWidth}:{x:f.y-c.plotLeft-c.spacingBox.x,\ny:0,width:f.height,height:c.chartHeight});g[F]?g[F].animate(f):g[F]=d.clipRect(f);w=a[\"zone-area-\"+F];y=a[\"zone-graph-\"+F];k&&y&&y.clip(g[F]);m&&w&&w.clip(g[F]);v=b.value>x.max;a.resetZones&&0===h&&(h=void 0)});this.clips=g}else a.visible&&(k&&k.show(!0),m&&m.show(!0))};b.prototype.invertGroups=function(a){function c(){[\"group\",\"markerGroup\"].forEach(function(c){d[c]&&(b.renderer.isVML&&d[c].attr({width:d.yAxis.len,height:d.xAxis.len}),d[c].width=d.yAxis.len,d[c].height=d.xAxis.len,d[c].invert(d.isRadialSeries?\n!1:a))})}var d=this,b=d.chart;d.xAxis&&(d.eventsToUnbind.push(D(b,\"resize\",c)),c(),d.invertGroups=c)};b.prototype.plotGroup=function(a,d,b,e,h){var g=this[a],f=!g;b={visibility:b,zIndex:e||.1};\"undefined\"===typeof this.opacity||this.chart.styledMode||\"inactive\"===this.state||(b.opacity=this.opacity);f&&(this[a]=g=this.chart.renderer.g().add(h));g.addClass(\"highcharts-\"+d+\" highcharts-series-\"+this.index+\" highcharts-\"+this.type+\"-series \"+(c(this.colorIndex)?\"highcharts-color-\"+this.colorIndex+\" \":\n\"\")+(this.options.className||\"\")+(g.hasClass(\"highcharts-tracker\")?\" highcharts-tracker\":\"\"),!0);g.attr(b)[f?\"attr\":\"animate\"](this.getPlotBox());return g};b.prototype.getPlotBox=function(){var a=this.chart,c=this.xAxis,d=this.yAxis;a.inverted&&(c=d,d=this.xAxis);return{translateX:c?c.left:a.plotLeft,translateY:d?d.top:a.plotTop,scaleX:1,scaleY:1}};b.prototype.removeEvents=function(a){a||p(this);this.eventsToUnbind.length&&(this.eventsToUnbind.forEach(function(a){a()}),this.eventsToUnbind.length=\n0)};b.prototype.render=function(){var a=this,c=a.chart,d=a.options,b=w(d.animation),e=!a.finishedAnimating&&c.renderer.isSVG&&b.duration,h=a.visible?\"inherit\":\"hidden\",g=d.zIndex,f=a.hasRendered,k=c.seriesGroup,m=c.inverted;A(this,\"render\");var l=a.plotGroup(\"group\",\"series\",h,g,k);a.markerGroup=a.plotGroup(\"markerGroup\",\"markers\",h,g,k);e&&a.animate&&a.animate(!0);l.inverted=t(a.invertible,a.isCartesian)?m:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());a.visible&&a.drawPoints();a.drawDataLabels&&\na.drawDataLabels();a.redrawPoints&&a.redrawPoints();a.drawTracker&&!1!==a.options.enableMouseTracking&&a.drawTracker();a.invertGroups(m);!1===d.clip||a.sharedClipKey||f||l.clip(c.clipRect);e&&a.animate&&a.animate();f||(e&&b.defer&&(e+=b.defer),a.animationTimeout=Z(function(){a.afterAnimate()},e||0));a.isDirty=!1;a.hasRendered=!0;A(a,\"afterRender\")};b.prototype.redraw=function(){var a=this.chart,c=this.isDirty||this.isDirtyData,d=this.group,b=this.xAxis,e=this.yAxis;d&&(a.inverted&&d.attr({width:a.plotWidth,\nheight:a.plotHeight}),d.animate({translateX:t(b&&b.left,a.plotLeft),translateY:t(e&&e.top,a.plotTop)}));this.translate();this.render();c&&delete this.kdTree};b.prototype.searchPoint=function(a,c){var d=this.xAxis,b=this.yAxis,e=this.chart.inverted;return this.searchKDTree({clientX:e?d.len-a.chartY+d.pos:a.chartX-d.pos,plotY:e?b.len-a.chartX+b.pos:a.chartY-b.pos},c,a)};b.prototype.buildKDTree=function(a){function c(a,b,e){var h;if(h=a&&a.length){var g=d.kdAxisArray[b%e];a.sort(function(a,c){return a[g]-\nc[g]});h=Math.floor(h/2);return{point:a[h],left:c(a.slice(0,h),b+1,e),right:c(a.slice(h+1),b+1,e)}}}this.buildingKdTree=!0;var d=this,b=-1<d.options.findNearestPointBy.indexOf(\"y\")?2:1;delete d.kdTree;Z(function(){d.kdTree=c(d.getValidPoints(null,!d.directTouch),b,b);d.buildingKdTree=!1},d.options.kdNow||a&&\"touchstart\"===a.type?0:1)};b.prototype.searchKDTree=function(a,d,b){function e(a,d,b,m){var l=d.point,r=h.kdAxisArray[b%m],n=l;var q=c(a[g])&&c(l[g])?Math.pow(a[g]-l[g],2):null;var p=c(a[f])&&\nc(l[f])?Math.pow(a[f]-l[f],2):null;p=(q||0)+(p||0);l.dist=c(p)?Math.sqrt(p):Number.MAX_VALUE;l.distX=c(q)?Math.sqrt(q):Number.MAX_VALUE;r=a[r]-l[r];p=0>r?\"left\":\"right\";q=0>r?\"right\":\"left\";d[p]&&(p=e(a,d[p],b+1,m),n=p[k]<n[k]?p:l);d[q]&&Math.sqrt(r*r)<n[k]&&(a=e(a,d[q],b+1,m),n=a[k]<n[k]?a:n);return n}var h=this,g=this.kdAxisArray[0],f=this.kdAxisArray[1],k=d?\"distX\":\"dist\";d=-1<h.options.findNearestPointBy.indexOf(\"y\")?2:1;this.kdTree||this.buildingKdTree||this.buildKDTree(b);if(this.kdTree)return e(a,\nthis.kdTree,d,d)};b.prototype.pointPlacementToXValue=function(){var a=this.options,c=a.pointRange,d=this.xAxis;a=a.pointPlacement;\"between\"===a&&(a=d.reversed?-.5:.5);return R(a)?a*(c||d.pointRange):0};b.prototype.isPointInside=function(a){return\"undefined\"!==typeof a.plotY&&\"undefined\"!==typeof a.plotX&&0<=a.plotY&&a.plotY<=this.yAxis.len&&0<=a.plotX&&a.plotX<=this.xAxis.len};b.prototype.drawTracker=function(){var a=this,c=a.options,b=c.trackByArea,e=[].concat(b?a.areaPath:a.graphPath),h=a.chart,\ng=h.pointer,k=h.renderer,m=h.options.tooltip.snap,l=a.tracker,r=function(c){if(h.hoverSeries!==a)a.onMouseOver()},n=\"rgba(192,192,192,\"+(d?.0001:.002)+\")\";l?l.attr({d:e}):a.graph&&(a.tracker=k.path(e).attr({visibility:a.visible?\"visible\":\"hidden\",zIndex:2}).addClass(b?\"highcharts-tracker-area\":\"highcharts-tracker-line\").add(a.group),h.styledMode||a.tracker.attr({\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\",stroke:n,fill:b?n:\"none\",\"stroke-width\":a.graph.strokeWidth()+(b?0:2*m)}),[a.tracker,\na.markerGroup,a.dataLabelsGroup].forEach(function(a){if(a&&(a.addClass(\"highcharts-tracker\").on(\"mouseover\",r).on(\"mouseout\",function(a){g.onTrackerMouseOut(a)}),c.cursor&&!h.styledMode&&a.css({cursor:c.cursor}),f))a.on(\"touchstart\",r)}));A(this,\"afterDrawTracker\")};b.prototype.addPoint=function(a,c,d,b,e){var h=this.options,g=this.data,f=this.chart,k=this.xAxis;k=k&&k.hasNames&&k.names;var m=h.data,l=this.xData,r;c=t(c,!0);var n={series:this};this.pointClass.prototype.applyOptions.apply(n,[a]);var q=\nn.x;var p=l.length;if(this.requireSorting&&q<l[p-1])for(r=!0;p&&l[p-1]>q;)p--;this.updateParallelArrays(n,\"splice\",p,0,0);this.updateParallelArrays(n,p);k&&n.name&&(k[q]=n.name);m.splice(p,0,a);r&&(this.data.splice(p,0,null),this.processData());\"point\"===h.legendType&&this.generatePoints();d&&(g[0]&&g[0].remove?g[0].remove(!1):(g.shift(),this.updateParallelArrays(n,\"shift\"),m.shift()));!1!==e&&A(this,\"addPoint\",{point:n});this.isDirtyData=this.isDirty=!0;c&&f.redraw(b)};b.prototype.removePoint=function(a,\nc,d){var b=this,e=b.data,h=e[a],g=b.points,f=b.chart,k=function(){g&&g.length===e.length&&g.splice(a,1);e.splice(a,1);b.options.data.splice(a,1);b.updateParallelArrays(h||{series:b},\"splice\",a,1);h&&h.destroy();b.isDirty=!0;b.isDirtyData=!0;c&&f.redraw()};v(d,f);c=t(c,!0);h?h.firePointEvent(\"remove\",null,k):k()};b.prototype.remove=function(a,c,d,b){function e(){h.destroy(b);g.isDirtyLegend=g.isDirtyBox=!0;g.linkSeries();t(a,!0)&&g.redraw(c)}var h=this,g=h.chart;!1!==d?A(h,\"remove\",null,e):e()};b.prototype.update=\nfunction(c,d){c=E(c,this.userOptions);A(this,\"update\",{options:c});var b=this,e=b.chart,g=b.userOptions,f=b.initialType||b.type,k=e.options.plotOptions,m=c.type||g.type||e.options.chart.type,r=!(this.hasDerivedData||m&&m!==this.type||\"undefined\"!==typeof c.pointStart||\"undefined\"!==typeof c.pointInterval||b.hasOptionChanged(\"dataGrouping\")||b.hasOptionChanged(\"pointStart\")||b.hasOptionChanged(\"pointInterval\")||b.hasOptionChanged(\"pointIntervalUnit\")||b.hasOptionChanged(\"keys\")),n=l[f].prototype,q,\np=[\"eventOptions\",\"navigatorSeries\",\"baseSeries\"],u=b.finishedAnimating&&{animation:!1},v={};m=m||f;r&&(p.push(\"data\",\"isDirtyData\",\"points\",\"processedXData\",\"processedYData\",\"xIncrement\",\"cropped\",\"_hasPointMarkers\",\"_hasPointLabels\",\"clips\",\"nodes\",\"layout\",\"mapMap\",\"mapData\",\"minY\",\"maxY\",\"minX\",\"maxX\"),!1!==c.visible&&p.push(\"area\",\"graph\"),b.parallelArrays.forEach(function(a){p.push(a+\"Data\")}),c.data&&(c.dataSorting&&h(b.options.dataSorting,c.dataSorting),this.setData(c.data,!1)));c=Q(g,u,{index:\"undefined\"===\ntypeof g.index?b.index:g.index,pointStart:t(k&&k.series&&k.series.pointStart,g.pointStart,b.xData[0])},!r&&{data:b.options.data},c);r&&c.data&&(c.data=b.options.data);p=[\"group\",\"markerGroup\",\"dataLabelsGroup\",\"transformGroup\"].concat(p);p.forEach(function(a){p[a]=b[a];delete b[a]});g=!1;if(l[m]){if(g=m!==b.type,b.remove(!1,!1,!1,!0),g)if(Object.setPrototypeOf)Object.setPrototypeOf(b,l[m].prototype);else{k=Object.hasOwnProperty.call(b,\"hcEvents\")&&b.hcEvents;for(q in n)b[q]=void 0;h(b,l[m].prototype);\nk?b.hcEvents=k:delete b.hcEvents}}else a(17,!0,e,{missingModuleFor:m});p.forEach(function(a){b[a]=p[a]});b.init(e,c);if(r&&this.points){var w=b.options;!1===w.visible?(v.graphic=1,v.dataLabel=1):b._hasPointLabels||(c=w.marker,m=w.dataLabels,c&&(!1===c.enabled||\"symbol\"in c)&&(v.graphic=1),m&&!1===m.enabled&&(v.dataLabel=1));this.points.forEach(function(a){a&&a.series&&(a.resolveColor(),Object.keys(v).length&&a.destroyElements(v),!1===w.showInLegend&&a.legendItem&&e.legend.destroyItem(a))},this)}b.initialType=\nf;e.linkSeries();g&&b.linkedSeries.length&&(b.isDirtyData=!0);A(this,\"afterUpdate\");t(d,!0)&&e.redraw(r?void 0:!1)};b.prototype.setName=function(a){this.name=this.options.name=this.userOptions.name=a;this.chart.isDirtyLegend=!0};b.prototype.hasOptionChanged=function(a){var c=this.options[a],d=this.chart.options.plotOptions,b=this.userOptions[a];return b?c!==b:c!==t(d&&d[this.type]&&d[this.type][a],d&&d.series&&d.series[a],c)};b.prototype.onMouseOver=function(){var a=this.chart,c=a.hoverSeries;a.pointer.setHoverChartIndex();\nif(c&&c!==this)c.onMouseOut();this.options.events.mouseOver&&A(this,\"mouseOver\");this.setState(\"hover\");a.hoverSeries=this};b.prototype.onMouseOut=function(){var a=this.options,c=this.chart,d=c.tooltip,b=c.hoverPoint;c.hoverSeries=null;if(b)b.onMouseOut();this&&a.events.mouseOut&&A(this,\"mouseOut\");!d||this.stickyTracking||d.shared&&!this.noSharedTooltip||d.hide();c.series.forEach(function(a){a.setState(\"\",!0)})};b.prototype.setState=function(a,c){var d=this,b=d.options,e=d.graph,h=b.inactiveOtherPoints,\ng=b.states,f=b.lineWidth,k=b.opacity,m=t(g[a||\"normal\"]&&g[a||\"normal\"].animation,d.chart.options.chart.animation);b=0;a=a||\"\";if(d.state!==a&&([d.group,d.markerGroup,d.dataLabelsGroup].forEach(function(c){c&&(d.state&&c.removeClass(\"highcharts-series-\"+d.state),a&&c.addClass(\"highcharts-series-\"+a))}),d.state=a,!d.chart.styledMode)){if(g[a]&&!1===g[a].enabled)return;a&&(f=g[a].lineWidth||f+(g[a].lineWidthPlus||0),k=t(g[a].opacity,k));if(e&&!e.dashstyle)for(g={\"stroke-width\":f},e.animate(g,m);d[\"zone-graph-\"+\nb];)d[\"zone-graph-\"+b].animate(g,m),b+=1;h||[d.group,d.markerGroup,d.dataLabelsGroup,d.labelBySeries].forEach(function(a){a&&a.animate({opacity:k},m)})}c&&h&&d.points&&d.setAllPointsToState(a||void 0)};b.prototype.setAllPointsToState=function(a){this.points.forEach(function(c){c.setState&&c.setState(a)})};b.prototype.setVisible=function(a,c){var d=this,b=d.chart,e=d.legendItem,h=b.options.chart.ignoreHiddenSeries,g=d.visible;var f=(d.visible=a=d.options.visible=d.userOptions.visible=\"undefined\"===\ntypeof a?!g:a)?\"show\":\"hide\";[\"group\",\"dataLabelsGroup\",\"markerGroup\",\"tracker\",\"tt\"].forEach(function(a){if(d[a])d[a][f]()});if(b.hoverSeries===d||(b.hoverPoint&&b.hoverPoint.series)===d)d.onMouseOut();e&&b.legend.colorizeItem(d,a);d.isDirty=!0;d.options.stacking&&b.series.forEach(function(a){a.options.stacking&&a.visible&&(a.isDirty=!0)});d.linkedSeries.forEach(function(c){c.setVisible(a,!1)});h&&(b.isDirtyBox=!0);A(d,f);!1!==c&&b.redraw()};b.prototype.show=function(){this.setVisible(!0)};b.prototype.hide=\nfunction(){this.setVisible(!1)};b.prototype.select=function(a){this.selected=a=this.options.selected=\"undefined\"===typeof a?!this.selected:a;this.checkbox&&(this.checkbox.checked=a);A(this,a?\"select\":\"unselect\")};b.prototype.shouldShowTooltip=function(a,c,d){void 0===d&&(d={});d.series=this;d.visiblePlotOnly=!0;return this.chart.isInsidePlot(a,c,d)};b.defaultOptions={lineWidth:2,allowPointSelect:!1,crisp:!0,showCheckbox:!1,animation:{duration:1E3},events:{},marker:{enabledThreshold:2,lineColor:H.backgroundColor,\nlineWidth:0,radius:4,states:{normal:{animation:!0},hover:{animation:{duration:50},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:H.neutralColor20,lineColor:H.neutralColor100,lineWidth:2}}},point:{events:{}},dataLabels:{animation:{},align:\"center\",defer:!0,formatter:function(){var a=this.series.chart.numberFormatter;return\"number\"!==typeof this.y?\"\":a(this.y,-1)},padding:5,style:{fontSize:\"11px\",fontWeight:\"bold\",color:\"contrast\",textOutline:\"1px contrast\"},verticalAlign:\"bottom\",x:0,y:0},\ncropThreshold:300,opacity:1,pointRange:0,softThreshold:!0,states:{normal:{animation:!0},hover:{animation:{duration:50},lineWidthPlus:1,marker:{},halo:{size:10,opacity:.25}},select:{animation:{duration:0}},inactive:{animation:{duration:50},opacity:.2}},stickyTracking:!0,turboThreshold:1E3,findNearestPointBy:\"x\"};return b}();h(e.prototype,{axisTypes:[\"xAxis\",\"yAxis\"],coll:\"series\",colorCounter:0,cropShoulder:1,directTouch:!1,drawLegendSymbol:I.drawLineMarker,isCartesian:!0,kdAxisArray:[\"clientX\",\"plotY\"],\nparallelArrays:[\"x\",\"y\"],pointClass:G,requireSorting:!0,sorted:!0});C.series=e;\"\";\"\";return e});O(e,\"Extensions/ScrollablePlotArea.js\",[e[\"Core/Animation/AnimationUtilities.js\"],e[\"Core/Axis/Axis.js\"],e[\"Core/Chart/Chart.js\"],e[\"Core/Series/Series.js\"],e[\"Core/Globals.js\"],e[\"Core/Utilities.js\"]],function(e,b,I,z,H,G){var D=e.stop,B=G.addEvent,x=G.createElement,w=G.merge,v=G.pick;\"\";B(I,\"afterSetChartSize\",function(b){var d=this.options.chart.scrollablePlotArea,e=d&&d.minWidth;d=d&&d.minHeight;if(!this.renderer.forExport){if(e){if(this.scrollablePixelsX=\ne=Math.max(0,e-this.chartWidth)){this.scrollablePlotBox=this.renderer.scrollablePlotBox=w(this.plotBox);this.plotBox.width=this.plotWidth+=e;this.inverted?this.clipBox.height+=e:this.clipBox.width+=e;var f={1:{name:\"right\",value:e}}}}else d&&(this.scrollablePixelsY=e=Math.max(0,d-this.chartHeight))&&(this.scrollablePlotBox=this.renderer.scrollablePlotBox=w(this.plotBox),this.plotBox.height=this.plotHeight+=e,this.inverted?this.clipBox.width+=e:this.clipBox.height+=e,f={2:{name:\"bottom\",value:e}});\nf&&!b.skipAxes&&this.axes.forEach(function(d){f[d.side]?d.getPlotLinePath=function(){var b=f[d.side].name,e=this[b];this[b]=e-f[d.side].value;var k=H.Axis.prototype.getPlotLinePath.apply(this,arguments);this[b]=e;return k}:(d.setAxisSize(),d.setAxisTranslation())})}});B(I,\"render\",function(){this.scrollablePixelsX||this.scrollablePixelsY?(this.setUpScrolling&&this.setUpScrolling(),this.applyFixed()):this.fixedDiv&&this.applyFixed()});I.prototype.setUpScrolling=function(){var b=this,d={WebkitOverflowScrolling:\"touch\",\noverflowX:\"hidden\",overflowY:\"hidden\"};this.scrollablePixelsX&&(d.overflowX=\"auto\");this.scrollablePixelsY&&(d.overflowY=\"auto\");this.scrollingParent=x(\"div\",{className:\"highcharts-scrolling-parent\"},{position:\"relative\"},this.renderTo);this.scrollingContainer=x(\"div\",{className:\"highcharts-scrolling\"},d,this.scrollingParent);B(this.scrollingContainer,\"scroll\",function(){b.pointer&&delete b.pointer.chartPosition});this.innerContainer=x(\"div\",{className:\"highcharts-inner-container\"},null,this.scrollingContainer);\nthis.innerContainer.appendChild(this.container);this.setUpScrolling=null};I.prototype.moveFixedElements=function(){var b=this.container,d=this.fixedRenderer,e=\".highcharts-contextbutton .highcharts-credits .highcharts-legend .highcharts-legend-checkbox .highcharts-navigator-series .highcharts-navigator-xaxis .highcharts-navigator-yaxis .highcharts-navigator .highcharts-reset-zoom .highcharts-drillup-button .highcharts-scrollbar .highcharts-subtitle .highcharts-title\".split(\" \"),k;this.scrollablePixelsX&&\n!this.inverted?k=\".highcharts-yaxis\":this.scrollablePixelsX&&this.inverted?k=\".highcharts-xaxis\":this.scrollablePixelsY&&!this.inverted?k=\".highcharts-xaxis\":this.scrollablePixelsY&&this.inverted&&(k=\".highcharts-yaxis\");k&&e.push(k+\":not(.highcharts-radial-axis)\",k+\"-labels:not(.highcharts-radial-axis-labels)\");e.forEach(function(e){[].forEach.call(b.querySelectorAll(e),function(b){(b.namespaceURI===d.SVG_NS?d.box:d.box.parentNode).appendChild(b);b.style.pointerEvents=\"auto\"})})};I.prototype.applyFixed=\nfunction(){var b=!this.fixedDiv;var d=this.options.chart;var e=d.scrollablePlotArea;b?(this.fixedDiv=x(\"div\",{className:\"highcharts-fixed\"},{position:\"absolute\",overflow:\"hidden\",pointerEvents:\"none\",zIndex:(d.style&&d.style.zIndex||0)+2,top:0},null,!0),this.scrollingContainer&&this.scrollingContainer.parentNode.insertBefore(this.fixedDiv,this.scrollingContainer),this.renderTo.style.overflow=\"visible\",this.fixedRenderer=d=new H.Renderer(this.fixedDiv,this.chartWidth,this.chartHeight,this.options.chart.style),\nthis.scrollableMask=d.path().attr({fill:this.options.chart.backgroundColor||\"#fff\",\"fill-opacity\":v(e.opacity,.85),zIndex:-1}).addClass(\"highcharts-scrollable-mask\").add(),B(this,\"afterShowResetZoom\",this.moveFixedElements),B(this,\"afterDrilldown\",this.moveFixedElements),B(this,\"afterLayOutTitles\",this.moveFixedElements)):this.fixedRenderer.setSize(this.chartWidth,this.chartHeight);if(this.scrollableDirty||b)this.scrollableDirty=!1,this.moveFixedElements();d=this.chartWidth+(this.scrollablePixelsX||\n0);var k=this.chartHeight+(this.scrollablePixelsY||0);D(this.container);this.container.style.width=d+\"px\";this.container.style.height=k+\"px\";this.renderer.boxWrapper.attr({width:d,height:k,viewBox:[0,0,d,k].join(\" \")});this.chartBackground.attr({width:d,height:k});this.scrollingContainer.style.height=this.chartHeight+\"px\";b&&(e.scrollPositionX&&(this.scrollingContainer.scrollLeft=this.scrollablePixelsX*e.scrollPositionX),e.scrollPositionY&&(this.scrollingContainer.scrollTop=this.scrollablePixelsY*\ne.scrollPositionY));k=this.axisOffset;b=this.plotTop-k[0]-1;e=this.plotLeft-k[3]-1;d=this.plotTop+this.plotHeight+k[2]+1;k=this.plotLeft+this.plotWidth+k[1]+1;var l=this.plotLeft+this.plotWidth-(this.scrollablePixelsX||0),w=this.plotTop+this.plotHeight-(this.scrollablePixelsY||0);b=this.scrollablePixelsX?[[\"M\",0,b],[\"L\",this.plotLeft-1,b],[\"L\",this.plotLeft-1,d],[\"L\",0,d],[\"Z\"],[\"M\",l,b],[\"L\",this.chartWidth,b],[\"L\",this.chartWidth,d],[\"L\",l,d],[\"Z\"]]:this.scrollablePixelsY?[[\"M\",e,0],[\"L\",e,this.plotTop-\n1],[\"L\",k,this.plotTop-1],[\"L\",k,0],[\"Z\"],[\"M\",e,w],[\"L\",e,this.chartHeight],[\"L\",k,this.chartHeight],[\"L\",k,w],[\"Z\"]]:[[\"M\",0,0]];\"adjustHeight\"!==this.redrawTrigger&&this.scrollableMask.attr({d:b})};B(b,\"afterInit\",function(){this.chart.scrollableDirty=!0});B(z,\"show\",function(){this.chart.scrollableDirty=!0})});O(e,\"Core/Axis/StackingAxis.js\",[e[\"Core/Animation/AnimationUtilities.js\"],e[\"Core/Utilities.js\"]],function(e,b){var D=e.getDeferredAnimation,z=b.addEvent,H=b.destroyObjectProperties,G=\nb.fireEvent,C=b.isNumber,B=b.objectEach,x=function(){function b(b){this.oldStacks={};this.stacks={};this.stacksTouched=0;this.axis=b}b.prototype.buildStacks=function(){var b=this.axis,e=b.series,d=b.options.reversedStacks,q=e.length,k;if(!b.isXAxis){this.usePercentage=!1;for(k=q;k--;){var l=e[d?k:q-k-1];l.setStackedPoints();l.setGroupedPoints()}for(k=0;k<q;k++)e[k].modifyStacks();G(b,\"afterBuildStacks\")}};b.prototype.cleanStacks=function(){if(!this.axis.isXAxis){if(this.oldStacks)var b=this.stacks=\nthis.oldStacks;B(b,function(b){B(b,function(d){d.cumulative=d.total})})}};b.prototype.resetStacks=function(){var b=this,e=this.stacks;this.axis.isXAxis||B(e,function(d){B(d,function(e,f){C(e.touched)&&e.touched<b.stacksTouched?(e.destroy(),delete d[f]):(e.total=null,e.cumulative=null)})})};b.prototype.renderStackTotals=function(){var b=this.axis,e=b.chart,d=e.renderer,q=this.stacks;b=D(e,b.options.stackLabels&&b.options.stackLabels.animation||!1);var k=this.stackTotalGroup=this.stackTotalGroup||d.g(\"stack-labels\").attr({visibility:\"visible\",\nzIndex:6,opacity:0}).add();k.translate(e.plotLeft,e.plotTop);B(q,function(d){B(d,function(d){d.render(k)})});k.animate({opacity:1},b)};return b}();return function(){function b(){}b.compose=function(e){z(e,\"init\",b.onInit);z(e,\"destroy\",b.onDestroy)};b.onDestroy=function(){var b=this.stacking;if(b){var e=b.stacks;B(e,function(d,b){H(d);e[b]=null});b&&b.stackTotalGroup&&b.stackTotalGroup.destroy()}};b.onInit=function(){this.stacking||(this.stacking=new x(this))};return b}()});O(e,\"Extensions/Stacking.js\",\n[e[\"Core/Axis/Axis.js\"],e[\"Core/Chart/Chart.js\"],e[\"Core/FormatUtilities.js\"],e[\"Core/Globals.js\"],e[\"Core/Series/Series.js\"],e[\"Core/Axis/StackingAxis.js\"],e[\"Core/Utilities.js\"]],function(e,b,I,z,H,G,C){var D=I.format,x=C.correctFloat,w=C.defined,v=C.destroyObjectProperties,f=C.isArray,d=C.isNumber,q=C.objectEach,k=C.pick;\"\";var l=function(){function b(d,b,e,f,k){var c=d.chart.inverted;this.axis=d;this.isNegative=e;this.options=b=b||{};this.x=f;this.total=null;this.points={};this.hasValidPoints=\n!1;this.stack=k;this.rightCliff=this.leftCliff=0;this.alignOptions={align:b.align||(c?e?\"left\":\"right\":\"center\"),verticalAlign:b.verticalAlign||(c?\"middle\":e?\"bottom\":\"top\"),y:b.y,x:b.x};this.textAlign=b.textAlign||(c?e?\"right\":\"left\":\"center\")}b.prototype.destroy=function(){v(this,this.axis)};b.prototype.render=function(d){var b=this.axis.chart,e=this.options,f=e.format;f=f?D(f,this,b):e.formatter.call(this);this.label?this.label.attr({text:f,visibility:\"hidden\"}):(this.label=b.renderer.label(f,\nnull,null,e.shape,null,null,e.useHTML,!1,\"stack-labels\"),f={r:e.borderRadius||0,text:f,rotation:e.rotation,padding:k(e.padding,5),visibility:\"hidden\"},b.styledMode||(f.fill=e.backgroundColor,f.stroke=e.borderColor,f[\"stroke-width\"]=e.borderWidth,this.label.css(e.style)),this.label.attr(f),this.label.added||this.label.add(d));this.label.labelrank=b.plotSizeY};b.prototype.setOffset=function(b,e,f,l,m){var c=this.axis,g=c.chart;l=c.translate(c.stacking.usePercentage?100:l?l:this.total,0,0,0,1);f=c.translate(f?\nf:0);f=w(l)&&Math.abs(l-f);b=k(m,g.xAxis[0].translate(this.x))+b;c=w(l)&&this.getStackBox(g,this,b,l,e,f,c);e=this.label;f=this.isNegative;b=\"justify\"===k(this.options.overflow,\"justify\");var a=this.textAlign;e&&c&&(m=e.getBBox(),l=e.padding,a=\"left\"===a?g.inverted?-l:l:\"right\"===a?m.width:g.inverted&&\"center\"===a?m.width/2:g.inverted?f?m.width+l:-l:m.width/2,f=g.inverted?m.height/2:f?-l:m.height,this.alignOptions.x=k(this.options.x,0),this.alignOptions.y=k(this.options.y,0),c.x-=a,c.y-=f,e.align(this.alignOptions,\nnull,c),g.isInsidePlot(e.alignAttr.x+a-this.alignOptions.x,e.alignAttr.y+f-this.alignOptions.y)?e.show():(e.alignAttr.y=-9999,b=!1),b&&H.prototype.justifyDataLabel.call(this.axis,e,this.alignOptions,e.alignAttr,m,c),e.attr({x:e.alignAttr.x,y:e.alignAttr.y}),k(!b&&this.options.crop,!0)&&((g=d(e.x)&&d(e.y)&&g.isInsidePlot(e.x-l+e.width,e.y)&&g.isInsidePlot(e.x+l,e.y))||e.hide()))};b.prototype.getStackBox=function(d,b,e,f,k,c,g){var a=b.axis.reversed,h=d.inverted,m=g.height+g.pos-(h?d.plotLeft:d.plotTop);\nb=b.isNegative&&!a||!b.isNegative&&a;return{x:h?b?f-g.right:f-c+g.pos-d.plotLeft:e+d.xAxis[0].transB-d.plotLeft,y:h?g.height-e-k:b?m-f-c:m-f,width:h?c:k,height:h?k:c}};return b}();b.prototype.getStacks=function(){var d=this,b=d.inverted;d.yAxis.forEach(function(d){d.stacking&&d.stacking.stacks&&d.hasVisibleSeries&&(d.stacking.oldStacks=d.stacking.stacks)});d.series.forEach(function(e){var f=e.xAxis&&e.xAxis.options||{};!e.options.stacking||!0!==e.visible&&!1!==d.options.chart.ignoreHiddenSeries||\n(e.stackKey=[e.type,k(e.options.stack,\"\"),b?f.top:f.left,b?f.height:f.width].join())})};G.compose(e);H.prototype.setGroupedPoints=function(){var d=this.yAxis.stacking;this.options.centerInCategory&&(this.is(\"column\")||this.is(\"columnrange\"))&&!this.options.stacking&&1<this.chart.series.length?H.prototype.setStackedPoints.call(this,\"group\"):d&&q(d.stacks,function(b,e){\"group\"===e.slice(-5)&&(q(b,function(d){return d.destroy()}),delete d.stacks[e])})};H.prototype.setStackedPoints=function(d){var b=\nd||this.options.stacking;if(b&&(!0===this.visible||!1===this.chart.options.chart.ignoreHiddenSeries)){var e=this.processedXData,q=this.processedYData,v=[],m=q.length,c=this.options,g=c.threshold,a=k(c.startFromThreshold&&g,0);c=c.stack;d=d?this.type+\",\"+b:this.stackKey;var h=\"-\"+d,r=this.negStacks,A=this.yAxis,y=A.stacking.stacks,D=A.stacking.oldStacks,B,C;A.stacking.stacksTouched+=1;for(C=0;C<m;C++){var z=e[C];var Q=q[C];var M=this.getStackIndicator(M,z,this.index);var t=M.key;var p=(B=r&&Q<(a?0:\ng))?h:d;y[p]||(y[p]={});y[p][z]||(D[p]&&D[p][z]?(y[p][z]=D[p][z],y[p][z].total=null):y[p][z]=new l(A,A.options.stackLabels,B,z,c));p=y[p][z];null!==Q?(p.points[t]=p.points[this.index]=[k(p.cumulative,a)],w(p.cumulative)||(p.base=t),p.touched=A.stacking.stacksTouched,0<M.index&&!1===this.singleStacks&&(p.points[t][0]=p.points[this.index+\",\"+z+\",0\"][0])):p.points[t]=p.points[this.index]=null;\"percent\"===b?(B=B?d:h,r&&y[B]&&y[B][z]?(B=y[B][z],p.total=B.total=Math.max(B.total,p.total)+Math.abs(Q)||0):\np.total=x(p.total+(Math.abs(Q)||0))):\"group\"===b?(f(Q)&&(Q=Q[0]),null!==Q&&(p.total=(p.total||0)+1)):p.total=x(p.total+(Q||0));p.cumulative=\"group\"===b?(p.total||1)-1:k(p.cumulative,a)+(Q||0);null!==Q&&(p.points[t].push(p.cumulative),v[C]=p.cumulative,p.hasValidPoints=!0)}\"percent\"===b&&(A.stacking.usePercentage=!0);\"group\"!==b&&(this.stackedYData=v);A.stacking.oldStacks={}}};H.prototype.modifyStacks=function(){var d=this,b=d.stackKey,e=d.yAxis.stacking.stacks,f=d.processedXData,k,m=d.options.stacking;\nd[m+\"Stacker\"]&&[b,\"-\"+b].forEach(function(c){for(var b=f.length,a,h;b--;)if(a=f[b],k=d.getStackIndicator(k,a,d.index,c),h=(a=e[c]&&e[c][a])&&a.points[k.key])d[m+\"Stacker\"](h,a,b)})};H.prototype.percentStacker=function(d,b,e){b=b.total?100/b.total:0;d[0]=x(d[0]*b);d[1]=x(d[1]*b);this.stackedYData[e]=d[1]};H.prototype.getStackIndicator=function(d,b,e,f){!w(d)||d.x!==b||f&&d.key!==f?d={x:b,index:0,key:f}:d.index++;d.key=[e,b,d.index].join();return d};z.StackItem=l;return z.StackItem});O(e,\"Series/Line/LineSeries.js\",\n[e[\"Core/Color/Palette.js\"],e[\"Core/Series/Series.js\"],e[\"Core/Series/SeriesRegistry.js\"],e[\"Core/Utilities.js\"]],function(e,b,I,z){var D=this&&this.__extends||function(){var b=function(e,w){b=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(b,e){b.__proto__=e}||function(b,e){for(var d in e)e.hasOwnProperty(d)&&(b[d]=e[d])};return b(e,w)};return function(e,w){function v(){this.constructor=e}b(e,w);e.prototype=null===w?Object.create(w):(v.prototype=w.prototype,new v)}}(),G=z.defined,\nC=z.merge;z=function(B){function x(){var b=null!==B&&B.apply(this,arguments)||this;b.data=void 0;b.options=void 0;b.points=void 0;return b}D(x,B);x.prototype.drawGraph=function(){var b=this,v=this.options,f=(this.gappedPath||this.getGraphPath).call(this),d=this.chart.styledMode,q=[[\"graph\",\"highcharts-graph\"]];d||q[0].push(v.lineColor||this.color||e.neutralColor20,v.dashStyle);q=b.getZonesGraphs(q);q.forEach(function(e,l){var k=e[0],q=b[k],n=q?\"animate\":\"attr\";q?(q.endX=b.preventGraphAnimation?null:\nf.xMap,q.animate({d:f})):f.length&&(b[k]=q=b.chart.renderer.path(f).addClass(e[1]).attr({zIndex:1}).add(b.group));q&&!d&&(k={stroke:e[2],\"stroke-width\":v.lineWidth,fill:b.fillGraph&&b.color||\"none\"},e[3]?k.dashstyle=e[3]:\"square\"!==v.linecap&&(k[\"stroke-linecap\"]=k[\"stroke-linejoin\"]=\"round\"),q[n](k).shadow(2>l&&v.shadow));q&&(q.startX=f.xMap,q.isArea=f.isArea)})};x.prototype.getGraphPath=function(b,e,f){var d=this,q=d.options,k=q.step,l,v=[],u=[],n;b=b||d.points;(l=b.reversed)&&b.reverse();(k={right:1,\ncenter:2}[k]||k&&3)&&l&&(k=4-k);b=this.getValidPoints(b,!1,!(q.connectNulls&&!e&&!f));b.forEach(function(l,w){var m=l.plotX,c=l.plotY,g=b[w-1];(l.leftCliff||g&&g.rightCliff)&&!f&&(n=!0);l.isNull&&!G(e)&&0<w?n=!q.connectNulls:l.isNull&&!e?n=!0:(0===w||n?w=[[\"M\",l.plotX,l.plotY]]:d.getPointSpline?w=[d.getPointSpline(b,l,w)]:k?(w=1===k?[[\"L\",g.plotX,c]]:2===k?[[\"L\",(g.plotX+m)/2,g.plotY],[\"L\",(g.plotX+m)/2,c]]:[[\"L\",m,g.plotY]],w.push([\"L\",m,c])):w=[[\"L\",m,c]],u.push(l.x),k&&(u.push(l.x),2===k&&u.push(l.x)),\nv.push.apply(v,w),n=!1)});v.xMap=u;return d.graphPath=v};x.prototype.getZonesGraphs=function(b){this.zones.forEach(function(e,f){f=[\"zone-graph-\"+f,\"highcharts-graph highcharts-zone-graph-\"+f+\" \"+(e.className||\"\")];this.chart.styledMode||f.push(e.color||this.color,e.dashStyle||this.options.dashStyle);b.push(f)},this);return b};x.defaultOptions=C(b.defaultOptions,{});return x}(b);I.registerSeriesType(\"line\",z);\"\";return z});O(e,\"Series/Area/AreaSeries.js\",[e[\"Core/Color/Color.js\"],e[\"Mixins/LegendSymbol.js\"],\ne[\"Core/Series/SeriesRegistry.js\"],e[\"Core/Utilities.js\"]],function(e,b,I,z){var D=this&&this.__extends||function(){var b=function(e,d){b=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(b,d){b.__proto__=d}||function(b,d){for(var e in d)d.hasOwnProperty(e)&&(b[e]=d[e])};return b(e,d)};return function(e,d){function f(){this.constructor=e}b(e,d);e.prototype=null===d?Object.create(d):(f.prototype=d.prototype,new f)}}(),G=e.parse,C=I.seriesTypes.line;e=z.extend;var B=z.merge,x=z.objectEach,\nw=z.pick;z=function(b){function e(){var d=null!==b&&b.apply(this,arguments)||this;d.data=void 0;d.options=void 0;d.points=void 0;return d}D(e,b);e.prototype.drawGraph=function(){this.areaPath=[];b.prototype.drawGraph.apply(this);var d=this,e=this.areaPath,f=this.options,l=[[\"area\",\"highcharts-area\",this.color,f.fillColor]];this.zones.forEach(function(b,e){l.push([\"zone-area-\"+e,\"highcharts-area highcharts-zone-area-\"+e+\" \"+b.className,b.color||d.color,b.fillColor||f.fillColor])});l.forEach(function(b){var k=\nb[0],l=d[k],q=l?\"animate\":\"attr\",v={};l?(l.endX=d.preventGraphAnimation?null:e.xMap,l.animate({d:e})):(v.zIndex=0,l=d[k]=d.chart.renderer.path(e).addClass(b[1]).add(d.group),l.isArea=!0);d.chart.styledMode||(v.fill=w(b[3],G(b[2]).setOpacity(w(f.fillOpacity,.75)).get()));l[q](v);l.startX=e.xMap;l.shiftUnit=f.step?2:1})};e.prototype.getGraphPath=function(b){var d=C.prototype.getGraphPath,e=this.options,f=e.stacking,v=this.yAxis,u,n=[],x=[],E=this.index,m=v.stacking.stacks[this.stackKey],c=e.threshold,\ng=Math.round(v.getThreshold(e.threshold));e=w(e.connectNulls,\"percent\"===f);var a=function(a,d,e){var h=b[a];a=f&&m[h.x].points[E];var k=h[e+\"Null\"]||0;e=h[e+\"Cliff\"]||0;h=!0;if(e||k){var l=(k?a[0]:a[1])+e;var q=a[0]+e;h=!!k}else!f&&b[d]&&b[d].isNull&&(l=q=c);\"undefined\"!==typeof l&&(x.push({plotX:r,plotY:null===l?g:v.getThreshold(l),isNull:h,isCliff:!0}),n.push({plotX:r,plotY:null===q?g:v.getThreshold(q),doCurve:!1}))};b=b||this.points;f&&(b=this.getStackPoints(b));for(u=0;u<b.length;u++){f||(b[u].leftCliff=\nb[u].rightCliff=b[u].leftNull=b[u].rightNull=void 0);var h=b[u].isNull;var r=w(b[u].rectPlotX,b[u].plotX);var A=f?w(b[u].yBottom,g):g;if(!h||e)e||a(u,u-1,\"left\"),h&&!f&&e||(x.push(b[u]),n.push({x:u,plotX:r,plotY:A})),e||a(u,u+1,\"right\")}u=d.call(this,x,!0,!0);n.reversed=!0;h=d.call(this,n,!0,!0);(A=h[0])&&\"M\"===A[0]&&(h[0]=[\"L\",A[1],A[2]]);h=u.concat(h);h.length&&h.push([\"Z\"]);d=d.call(this,x,!1,e);h.xMap=u.xMap;this.areaPath=h;return d};e.prototype.getStackPoints=function(b){var d=this,e=[],f=[],\nv=this.xAxis,u=this.yAxis,n=u.stacking.stacks[this.stackKey],D={},E=u.series,m=E.length,c=u.options.reversedStacks?1:-1,g=E.indexOf(d);b=b||this.points;if(this.options.stacking){for(var a=0;a<b.length;a++)b[a].leftNull=b[a].rightNull=void 0,D[b[a].x]=b[a];x(n,function(a,c){null!==a.total&&f.push(c)});f.sort(function(a,c){return a-c});var h=E.map(function(a){return a.visible});f.forEach(function(a,b){var k=0,l,r;if(D[a]&&!D[a].isNull)e.push(D[a]),[-1,1].forEach(function(e){var k=1===e?\"rightNull\":\n\"leftNull\",q=0,t=n[f[b+e]];if(t)for(var p=g;0<=p&&p<m;){var v=E[p].index;l=t.points[v];l||(v===d.index?D[a][k]=!0:h[p]&&(r=n[a].points[v])&&(q-=r[1]-r[0]));p+=c}D[a][1===e?\"rightCliff\":\"leftCliff\"]=q});else{for(var q=g;0<=q&&q<m;){if(l=n[a].points[E[q].index]){k=l[1];break}q+=c}k=w(k,0);k=u.translate(k,0,1,0,1);e.push({isNull:!0,plotX:v.translate(a,0,0,0,1),x:a,plotY:k,yBottom:k})}})}return e};e.defaultOptions=B(C.defaultOptions,{threshold:0});return e}(C);e(z.prototype,{singleStacks:!1,drawLegendSymbol:b.drawRectangle});\nI.registerSeriesType(\"area\",z);\"\";return z});O(e,\"Series/Spline/SplineSeries.js\",[e[\"Core/Series/SeriesRegistry.js\"],e[\"Core/Utilities.js\"]],function(e,b){var D=this&&this.__extends||function(){var b=function(e,x){b=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(b,e){b.__proto__=e}||function(b,e){for(var f in e)e.hasOwnProperty(f)&&(b[f]=e[f])};return b(e,x)};return function(e,x){function w(){this.constructor=e}b(e,x);e.prototype=null===x?Object.create(x):(w.prototype=x.prototype,\nnew w)}}(),z=e.seriesTypes.line,H=b.merge,G=b.pick;b=function(b){function e(){var e=null!==b&&b.apply(this,arguments)||this;e.data=void 0;e.options=void 0;e.points=void 0;return e}D(e,b);e.prototype.getPointSpline=function(b,e,v){var f=e.plotX||0,d=e.plotY||0,q=b[v-1];v=b[v+1];if(q&&!q.isNull&&!1!==q.doCurve&&!e.isCliff&&v&&!v.isNull&&!1!==v.doCurve&&!e.isCliff){b=q.plotY||0;var k=v.plotX||0;v=v.plotY||0;var l=0;var w=(1.5*f+(q.plotX||0))/2.5;var u=(1.5*d+b)/2.5;k=(1.5*f+k)/2.5;var n=(1.5*d+v)/2.5;\nk!==w&&(l=(n-u)*(k-f)/(k-w)+d-n);u+=l;n+=l;u>b&&u>d?(u=Math.max(b,d),n=2*d-u):u<b&&u<d&&(u=Math.min(b,d),n=2*d-u);n>v&&n>d?(n=Math.max(v,d),u=2*d-n):n<v&&n<d&&(n=Math.min(v,d),u=2*d-n);e.rightContX=k;e.rightContY=n}e=[\"C\",G(q.rightContX,q.plotX,0),G(q.rightContY,q.plotY,0),G(w,f,0),G(u,d,0),f,d];q.rightContX=q.rightContY=void 0;return e};e.defaultOptions=H(z.defaultOptions);return e}(z);e.registerSeriesType(\"spline\",b);\"\";return b});O(e,\"Series/AreaSpline/AreaSplineSeries.js\",[e[\"Series/Area/AreaSeries.js\"],\ne[\"Series/Spline/SplineSeries.js\"],e[\"Mixins/LegendSymbol.js\"],e[\"Core/Series/SeriesRegistry.js\"],e[\"Core/Utilities.js\"]],function(e,b,I,z,H){var D=this&&this.__extends||function(){var b=function(e,f){b=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(b,e){b.__proto__=e}||function(b,e){for(var d in e)e.hasOwnProperty(d)&&(b[d]=e[d])};return b(e,f)};return function(e,f){function d(){this.constructor=e}b(e,f);e.prototype=null===f?Object.create(f):(d.prototype=f.prototype,new d)}}(),C=\ne.prototype,B=H.extend,x=H.merge;H=function(w){function v(){var b=null!==w&&w.apply(this,arguments)||this;b.data=void 0;b.points=void 0;b.options=void 0;return b}D(v,w);v.defaultOptions=x(b.defaultOptions,e.defaultOptions);return v}(b);B(H.prototype,{getGraphPath:C.getGraphPath,getStackPoints:C.getStackPoints,drawGraph:C.drawGraph,drawLegendSymbol:I.drawRectangle});z.registerSeriesType(\"areaspline\",H);\"\";return H});O(e,\"Series/Column/ColumnSeries.js\",[e[\"Core/Animation/AnimationUtilities.js\"],e[\"Core/Color/Color.js\"],\ne[\"Core/Globals.js\"],e[\"Mixins/LegendSymbol.js\"],e[\"Core/Color/Palette.js\"],e[\"Core/Series/Series.js\"],e[\"Core/Series/SeriesRegistry.js\"],e[\"Core/Utilities.js\"]],function(e,b,I,z,H,G,C,B){var x=this&&this.__extends||function(){var c=function(b,a){c=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(a,c){a.__proto__=c}||function(a,c){for(var b in c)c.hasOwnProperty(b)&&(a[b]=c[b])};return c(b,a)};return function(b,a){function d(){this.constructor=b}c(b,a);b.prototype=null===a?Object.create(a):\n(d.prototype=a.prototype,new d)}}(),w=e.animObject,v=b.parse,f=I.hasTouch;e=I.noop;var d=B.clamp,q=B.css,k=B.defined,l=B.extend,D=B.fireEvent,u=B.isArray,n=B.isNumber,J=B.merge,E=B.pick,m=B.objectEach;B=function(c){function b(){var a=null!==c&&c.apply(this,arguments)||this;a.borderWidth=void 0;a.data=void 0;a.group=void 0;a.options=void 0;a.points=void 0;return a}x(b,c);b.prototype.animate=function(a){var c=this,b=this.yAxis,e=c.options,g=this.chart.inverted,f={},k=g?\"translateX\":\"translateY\";if(a)f.scaleY=\n.001,a=d(b.toPixels(e.threshold),b.pos,b.pos+b.len),g?f.translateX=a-b.len:f.translateY=a,c.clipBox&&c.setClip(),c.group.attr(f);else{var m=Number(c.group.attr(k));c.group.animate({scaleY:1},l(w(c.options.animation),{step:function(a,d){c.group&&(f[k]=m+d.pos*(b.pos-m),c.group.attr(f))}}))}};b.prototype.init=function(a,b){c.prototype.init.apply(this,arguments);var d=this;a=d.chart;a.hasRendered&&a.series.forEach(function(a){a.type===d.type&&(a.isDirty=!0)})};b.prototype.getColumnMetrics=function(){var a=\nthis,c=a.options,b=a.xAxis,d=a.yAxis,e=b.options.reversedStacks;e=b.reversed&&!e||!b.reversed&&e;var g,f={},k=0;!1===c.grouping?k=1:a.chart.series.forEach(function(c){var b=c.yAxis,e=c.options;if(c.type===a.type&&(c.visible||!a.chart.options.chart.ignoreHiddenSeries)&&d.len===b.len&&d.pos===b.pos){if(e.stacking&&\"group\"!==e.stacking){g=c.stackKey;\"undefined\"===typeof f[g]&&(f[g]=k++);var h=f[g]}else!1!==e.grouping&&(h=k++);c.columnIndex=h}});var m=Math.min(Math.abs(b.transA)*(b.ordinal&&b.ordinal.slope||\nc.pointRange||b.closestPointRange||b.tickInterval||1),b.len),l=m*c.groupPadding,n=(m-2*l)/(k||1);c=Math.min(c.maxPointWidth||b.len,E(c.pointWidth,n*(1-2*c.pointPadding)));a.columnMetrics={width:c,offset:(n-c)/2+(l+((a.columnIndex||0)+(e?1:0))*n-m/2)*(e?-1:1),paddedWidth:n,columnCount:k};return a.columnMetrics};b.prototype.crispCol=function(a,c,b,d){var e=this.chart,h=this.borderWidth,g=-(h%2?.5:0);h=h%2?.5:1;e.inverted&&e.renderer.isVML&&(h+=1);this.options.crisp&&(b=Math.round(a+b)+g,a=Math.round(a)+\ng,b-=a);d=Math.round(c+d)+h;g=.5>=Math.abs(c)&&.5<d;c=Math.round(c)+h;d-=c;g&&d&&(--c,d+=1);return{x:a,y:c,width:b,height:d}};b.prototype.adjustForMissingColumns=function(a,c,b,d){var e=this,h=this.options.stacking;if(!b.isNull&&1<d.columnCount){var g=0,f=0;m(this.yAxis.stacking&&this.yAxis.stacking.stacks,function(a){if(\"number\"===typeof b.x&&(a=a[b.x.toString()])){var c=a.points[e.index],d=a.total;h?(c&&(g=f),a.hasValidPoints&&f++):u(c)&&(g=c[1],f=d||0)}});a=(b.plotX||0)+((f-1)*d.paddedWidth+c)/\n2-c-g*d.paddedWidth}return a};b.prototype.translate=function(){var a=this,c=a.chart,b=a.options,e=a.dense=2>a.closestPointRange*a.xAxis.transA;e=a.borderWidth=E(b.borderWidth,e?0:1);var g=a.xAxis,f=a.yAxis,m=b.threshold,l=a.translatedThreshold=f.getThreshold(m),q=E(b.minPointLength,5),v=a.getColumnMetrics(),u=v.width,t=a.barW=Math.max(u,1+2*e),p=a.pointXOffset=v.offset,w=a.dataMin,x=a.dataMax;c.inverted&&(l-=.5);b.pointPadding&&(t=Math.ceil(t));G.prototype.translate.apply(a);a.points.forEach(function(e){var h=\nE(e.yBottom,l),r=999+Math.abs(h),y=u,A=e.plotX||0;r=d(e.plotY,-r,f.len+r);A+=p;var D=t,B=Math.min(r,h),z=Math.max(r,h)-B;if(q&&Math.abs(z)<q){z=q;var C=!f.reversed&&!e.negative||f.reversed&&e.negative;n(m)&&n(x)&&e.y===m&&x<=m&&(f.min||0)<m&&(w!==x||(f.max||0)<=m)&&(C=!C);B=Math.abs(B-l)>q?h-q:l-(C?q:0)}k(e.options.pointWidth)&&(y=D=Math.ceil(e.options.pointWidth),A-=Math.round((y-u)/2));b.centerInCategory&&(A=a.adjustForMissingColumns(A,y,e,v));e.barX=A;e.pointWidth=y;e.tooltipPos=c.inverted?[d(f.len+\nf.pos-c.plotLeft-r,f.pos-c.plotLeft,f.len+f.pos-c.plotLeft),g.len+g.pos-c.plotTop-A-D/2,z]:[g.left-c.plotLeft+A+D/2,d(r+f.pos-c.plotTop,f.pos-c.plotTop,f.len+f.pos-c.plotTop),z];e.shapeType=a.pointClass.prototype.shapeType||\"rect\";e.shapeArgs=a.crispCol.apply(a,e.isNull?[A,l,D,0]:[A,B,D,z])})};b.prototype.drawGraph=function(){this.group[this.dense?\"addClass\":\"removeClass\"](\"highcharts-dense-data\")};b.prototype.pointAttribs=function(a,c){var b=this.options,d=this.pointAttrToOptions||{};var e=d.stroke||\n\"borderColor\";var h=d[\"stroke-width\"]||\"borderWidth\",g=a&&a.color||this.color,f=a&&a[e]||b[e]||g,k=a&&a[h]||b[h]||this[h]||0;d=a&&a.options.dashStyle||b.dashStyle;var m=E(a&&a.opacity,b.opacity,1);if(a&&this.zones.length){var l=a.getZone();g=a.options.color||l&&(l.color||a.nonZonedColor)||this.color;l&&(f=l.borderColor||f,d=l.dashStyle||d,k=l.borderWidth||k)}c&&a&&(a=J(b.states[c],a.options.states&&a.options.states[c]||{}),c=a.brightness,g=a.color||\"undefined\"!==typeof c&&v(g).brighten(a.brightness).get()||\ng,f=a[e]||f,k=a[h]||k,d=a.dashStyle||d,m=E(a.opacity,m));e={fill:g,stroke:f,\"stroke-width\":k,opacity:m};d&&(e.dashstyle=d);return e};b.prototype.drawPoints=function(){var a=this,c=this.chart,b=a.options,d=c.renderer,e=b.animationLimit||250,g;a.points.forEach(function(h){var f=h.graphic,k=!!f,m=f&&c.pointCount<e?\"animate\":\"attr\";if(n(h.plotY)&&null!==h.y){g=h.shapeArgs;f&&h.hasNewShapeType()&&(f=f.destroy());a.enabledDataSorting&&(h.startXPos=a.xAxis.reversed?-(g?g.width||0:0):a.xAxis.width);f||(h.graphic=\nf=d[h.shapeType](g).add(h.group||a.group))&&a.enabledDataSorting&&c.hasRendered&&c.pointCount<e&&(f.attr({x:h.startXPos}),k=!0,m=\"animate\");if(f&&k)f[m](J(g));if(b.borderRadius)f[m]({r:b.borderRadius});c.styledMode||f[m](a.pointAttribs(h,h.selected&&\"select\")).shadow(!1!==h.allowShadow&&b.shadow,null,b.stacking&&!b.borderRadius);f&&(f.addClass(h.getClassName(),!0),f.attr({visibility:h.visible?\"inherit\":\"hidden\"}))}else f&&(h.graphic=f.destroy())})};b.prototype.drawTracker=function(){var a=this,c=\na.chart,b=c.pointer,d=function(a){var c=b.getPointFromEvent(a);\"undefined\"!==typeof c&&(b.isDirectTouch=!0,c.onMouseOver(a))},e;a.points.forEach(function(a){e=u(a.dataLabels)?a.dataLabels:a.dataLabel?[a.dataLabel]:[];a.graphic&&(a.graphic.element.point=a);e.forEach(function(c){c.div?c.div.point=a:c.element.point=a})});a._hasTracking||(a.trackerGroups.forEach(function(e){if(a[e]){a[e].addClass(\"highcharts-tracker\").on(\"mouseover\",d).on(\"mouseout\",function(a){b.onTrackerMouseOut(a)});if(f)a[e].on(\"touchstart\",\nd);!c.styledMode&&a.options.cursor&&a[e].css(q).css({cursor:a.options.cursor})}}),a._hasTracking=!0);D(this,\"afterDrawTracker\")};b.prototype.remove=function(){var a=this,c=a.chart;c.hasRendered&&c.series.forEach(function(c){c.type===a.type&&(c.isDirty=!0)});G.prototype.remove.apply(a,arguments)};b.defaultOptions=J(G.defaultOptions,{borderRadius:0,centerInCategory:!1,groupPadding:.2,marker:null,pointPadding:.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{halo:!1,brightness:.1},\nselect:{color:H.neutralColor20,borderColor:H.neutralColor100}},dataLabels:{align:void 0,verticalAlign:void 0,y:void 0},startFromThreshold:!0,stickyTracking:!1,tooltip:{distance:6},threshold:0,borderColor:H.backgroundColor});return b}(G);l(B.prototype,{cropShoulder:0,directTouch:!0,drawLegendSymbol:z.drawRectangle,getSymbol:e,negStacks:!0,trackerGroups:[\"group\",\"dataLabelsGroup\"]});C.registerSeriesType(\"column\",B);\"\";\"\";return B});O(e,\"Series/Bar/BarSeries.js\",[e[\"Series/Column/ColumnSeries.js\"],e[\"Core/Series/SeriesRegistry.js\"],\ne[\"Core/Utilities.js\"]],function(e,b,I){var D=this&&this.__extends||function(){var b=function(e,x){b=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(b,e){b.__proto__=e}||function(b,e){for(var f in e)e.hasOwnProperty(f)&&(b[f]=e[f])};return b(e,x)};return function(e,x){function w(){this.constructor=e}b(e,x);e.prototype=null===x?Object.create(x):(w.prototype=x.prototype,new w)}}(),H=I.extend,G=I.merge;I=function(b){function B(){var e=null!==b&&b.apply(this,arguments)||this;e.data=void 0;\ne.options=void 0;e.points=void 0;return e}D(B,b);B.defaultOptions=G(e.defaultOptions,{});return B}(e);H(I.prototype,{inverted:!0});b.registerSeriesType(\"bar\",I);\"\";return I});O(e,\"Series/Scatter/ScatterSeries.js\",[e[\"Series/Column/ColumnSeries.js\"],e[\"Series/Line/LineSeries.js\"],e[\"Core/Series/SeriesRegistry.js\"],e[\"Core/Utilities.js\"]],function(e,b,I,z){var D=this&&this.__extends||function(){var b=function(e,v){b=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(b,d){b.__proto__=d}||\nfunction(b,d){for(var e in d)d.hasOwnProperty(e)&&(b[e]=d[e])};return b(e,v)};return function(e,v){function f(){this.constructor=e}b(e,v);e.prototype=null===v?Object.create(v):(f.prototype=v.prototype,new f)}}(),G=z.addEvent,C=z.extend,B=z.merge;z=function(e){function w(){var b=null!==e&&e.apply(this,arguments)||this;b.data=void 0;b.options=void 0;b.points=void 0;return b}D(w,e);w.prototype.applyJitter=function(){var b=this,e=this.options.jitter,d=this.points.length;e&&this.points.forEach(function(f,\nk){[\"x\",\"y\"].forEach(function(l,q){var v=\"plot\"+l.toUpperCase();if(e[l]&&!f.isNull){var n=b[l+\"Axis\"];var w=e[l]*n.transA;if(n&&!n.isLog){var E=Math.max(0,f[v]-w);n=Math.min(n.len,f[v]+w);q=1E4*Math.sin(k+q*d);f[v]=E+(n-E)*(q-Math.floor(q));\"x\"===l&&(f.clientX=f.plotX)}}})})};w.prototype.drawGraph=function(){(this.options.lineWidth||0===this.options.lineWidth&&this.graph&&this.graph.strokeWidth())&&e.prototype.drawGraph.call(this)};w.defaultOptions=B(b.defaultOptions,{lineWidth:0,findNearestPointBy:\"xy\",\njitter:{x:0,y:0},marker:{enabled:!0},tooltip:{headerFormat:'<span style=\"color:{point.color}\">\\u25cf</span> <span style=\"font-size: 10px\"> {series.name}</span><br/>',pointFormat:\"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>\"}});return w}(b);C(z.prototype,{drawTracker:e.prototype.drawTracker,sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:[\"group\",\"markerGroup\",\"dataLabelsGroup\"],takeOrdinalPosition:!1});G(z,\"afterTranslate\",function(){this.applyJitter()});I.registerSeriesType(\"scatter\",\nz);\"\";return z});O(e,\"Mixins/CenteredSeries.js\",[e[\"Core/Globals.js\"],e[\"Core/Series/Series.js\"],e[\"Core/Utilities.js\"]],function(e,b,I){var D=I.isNumber,H=I.pick,G=I.relativeLength,C=e.deg2rad;return e.CenteredSeriesMixin={getCenter:function(){var e=this.options,D=this.chart,w=2*(e.slicedOffset||0),v=D.plotWidth-2*w,f=D.plotHeight-2*w,d=e.center,q=Math.min(v,f),k=e.size,l=e.innerSize||0;\"string\"===typeof k&&(k=parseFloat(k));\"string\"===typeof l&&(l=parseFloat(l));e=[H(d[0],\"50%\"),H(d[1],\"50%\"),H(k&&\n0>k?void 0:e.size,\"100%\"),H(l&&0>l?void 0:e.innerSize||0,\"0%\")];!D.angular||this instanceof b||(e[3]=0);for(d=0;4>d;++d)k=e[d],D=2>d||2===d&&/%$/.test(k),e[d]=G(k,[v,f,q,e[2]][d])+(D?w:0);e[3]>e[2]&&(e[3]=e[2]);return e},getStartAndEndRadians:function(b,e){b=D(b)?b:0;e=D(e)&&e>b&&360>e-b?e:b+360;return{start:C*(b+-90),end:C*(e+-90)}}}});O(e,\"Series/Pie/PiePoint.js\",[e[\"Core/Animation/AnimationUtilities.js\"],e[\"Core/Series/Point.js\"],e[\"Core/Utilities.js\"]],function(e,b,I){var D=this&&this.__extends||\nfunction(){var b=function(e,d){b=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(b,d){b.__proto__=d}||function(b,d){for(var e in d)d.hasOwnProperty(e)&&(b[e]=d[e])};return b(e,d)};return function(e,d){function f(){this.constructor=e}b(e,d);e.prototype=null===d?Object.create(d):(f.prototype=d.prototype,new f)}}(),H=e.setAnimation,G=I.addEvent,C=I.defined;e=I.extend;var B=I.isNumber,x=I.pick,w=I.relativeLength;I=function(e){function f(){var b=null!==e&&e.apply(this,arguments)||this;\nb.labelDistance=void 0;b.options=void 0;b.series=void 0;return b}D(f,e);f.prototype.getConnectorPath=function(){var b=this.labelPosition,e=this.series.options.dataLabels,f=e.connectorShape,l=this.connectorShapes;l[f]&&(f=l[f]);return f.call(this,{x:b.final.x,y:b.final.y,alignment:b.alignment},b.connectorPosition,e)};f.prototype.getTranslate=function(){return this.sliced?this.slicedTranslation:{translateX:0,translateY:0}};f.prototype.haloPath=function(b){var d=this.shapeArgs;return this.sliced||!this.visible?\n[]:this.series.chart.renderer.symbols.arc(d.x,d.y,d.r+b,d.r+b,{innerR:d.r-1,start:d.start,end:d.end})};f.prototype.init=function(){b.prototype.init.apply(this,arguments);var d=this;d.name=x(d.name,\"Slice\");var e=function(b){d.slice(\"select\"===b.type)};G(d,\"select\",e);G(d,\"unselect\",e);return d};f.prototype.isValid=function(){return B(this.y)&&0<=this.y};f.prototype.setVisible=function(b,e){var d=this,f=d.series,q=f.chart,v=f.options.ignoreHiddenPoint;e=x(e,v);b!==d.visible&&(d.visible=d.options.visible=\nb=\"undefined\"===typeof b?!d.visible:b,f.options.data[f.data.indexOf(d)]=d.options,[\"graphic\",\"dataLabel\",\"connector\",\"shadowGroup\"].forEach(function(e){if(d[e])d[e][b?\"show\":\"hide\"](b)}),d.legendItem&&q.legend.colorizeItem(d,b),b||\"hover\"!==d.state||d.setState(\"\"),v&&(f.isDirty=!0),e&&q.redraw())};f.prototype.slice=function(b,e,f){var d=this.series;H(f,d.chart);x(e,!0);this.sliced=this.options.sliced=C(b)?b:!this.sliced;d.options.data[d.data.indexOf(this)]=this.options;this.graphic&&this.graphic.animate(this.getTranslate());\nthis.shadowGroup&&this.shadowGroup.animate(this.getTranslate())};return f}(b);e(I.prototype,{connectorShapes:{fixedOffset:function(b,e,d){var f=e.breakAt;e=e.touchingSliceAt;return[[\"M\",b.x,b.y],d.softConnector?[\"C\",b.x+(\"left\"===b.alignment?-5:5),b.y,2*f.x-e.x,2*f.y-e.y,f.x,f.y]:[\"L\",f.x,f.y],[\"L\",e.x,e.y]]},straight:function(b,e){e=e.touchingSliceAt;return[[\"M\",b.x,b.y],[\"L\",e.x,e.y]]},crookedLine:function(b,e,d){e=e.touchingSliceAt;var f=this.series,k=f.center[0],l=f.chart.plotWidth,v=f.chart.plotLeft;\nf=b.alignment;var u=this.shapeArgs.r;d=w(d.crookDistance,1);l=\"left\"===f?k+u+(l+v-k-u)*(1-d):v+(k-u)*d;d=[\"L\",l,b.y];k=!0;if(\"left\"===f?l>b.x||l<e.x:l<b.x||l>e.x)k=!1;b=[[\"M\",b.x,b.y]];k&&b.push(d);b.push([\"L\",e.x,e.y]);return b}}});return I});O(e,\"Series/Pie/PieSeries.js\",[e[\"Mixins/CenteredSeries.js\"],e[\"Series/Column/ColumnSeries.js\"],e[\"Core/Globals.js\"],e[\"Mixins/LegendSymbol.js\"],e[\"Core/Color/Palette.js\"],e[\"Series/Pie/PiePoint.js\"],e[\"Core/Series/Series.js\"],e[\"Core/Series/SeriesRegistry.js\"],\ne[\"Core/Renderer/SVG/SVGRenderer.js\"],e[\"Core/Utilities.js\"]],function(e,b,I,z,H,G,C,B,x,w){var v=this&&this.__extends||function(){var b=function(d,e){b=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(b,c){b.__proto__=c}||function(b,c){for(var d in c)c.hasOwnProperty(d)&&(b[d]=c[d])};return b(d,e)};return function(d,e){function f(){this.constructor=d}b(d,e);d.prototype=null===e?Object.create(e):(f.prototype=e.prototype,new f)}}(),f=e.getStartAndEndRadians;I=I.noop;var d=w.clamp,q=\nw.extend,k=w.fireEvent,l=w.merge,D=w.pick,u=w.relativeLength;w=function(b){function e(){var d=null!==b&&b.apply(this,arguments)||this;d.center=void 0;d.data=void 0;d.maxLabelDistance=void 0;d.options=void 0;d.points=void 0;return d}v(e,b);e.prototype.animate=function(b){var d=this,c=d.points,e=d.startAngleRad;b||c.forEach(function(a){var c=a.graphic,b=a.shapeArgs;c&&b&&(c.attr({r:D(a.startR,d.center&&d.center[3]/2),start:e,end:e}),c.animate({r:b.r,start:b.start,end:b.end},d.options.animation))})};\ne.prototype.drawEmpty=function(){var b=this.startAngleRad,d=this.endAngleRad,c=this.options;if(0===this.total&&this.center){var e=this.center[0];var a=this.center[1];this.graph||(this.graph=this.chart.renderer.arc(e,a,this.center[1]/2,0,b,d).addClass(\"highcharts-empty-series\").add(this.group));this.graph.attr({d:x.prototype.symbols.arc(e,a,this.center[2]/2,0,{start:b,end:d,innerR:this.center[3]/2})});this.chart.styledMode||this.graph.attr({\"stroke-width\":c.borderWidth,fill:c.fillColor||\"none\",stroke:c.color||\nH.neutralColor20})}else this.graph&&(this.graph=this.graph.destroy())};e.prototype.drawPoints=function(){var b=this.chart.renderer;this.points.forEach(function(d){d.graphic&&d.hasNewShapeType()&&(d.graphic=d.graphic.destroy());d.graphic||(d.graphic=b[d.shapeType](d.shapeArgs).add(d.series.group),d.delayedRendering=!0)})};e.prototype.generatePoints=function(){b.prototype.generatePoints.call(this);this.updateTotals()};e.prototype.getX=function(b,e,c){var g=this.center,a=this.radii?this.radii[c.index]||\n0:g[2]/2;b=Math.asin(d((b-g[1])/(a+c.labelDistance),-1,1));return g[0]+(e?-1:1)*Math.cos(b)*(a+c.labelDistance)+(0<c.labelDistance?(e?-1:1)*this.options.dataLabels.padding:0)};e.prototype.hasData=function(){return!!this.processedXData.length};e.prototype.redrawPoints=function(){var b=this,d=b.chart,c=d.renderer,e,a,h,f,k=b.options.shadow;this.drawEmpty();!k||b.shadowGroup||d.styledMode||(b.shadowGroup=c.g(\"shadow\").attr({zIndex:-1}).add(b.group));b.points.forEach(function(g){var m={};a=g.graphic;\nif(!g.isNull&&a){var r=void 0;f=g.shapeArgs;e=g.getTranslate();d.styledMode||(r=g.shadowGroup,k&&!r&&(r=g.shadowGroup=c.g(\"shadow\").add(b.shadowGroup)),r&&r.attr(e),h=b.pointAttribs(g,g.selected&&\"select\"));g.delayedRendering?(a.setRadialReference(b.center).attr(f).attr(e),d.styledMode||a.attr(h).attr({\"stroke-linejoin\":\"round\"}).shadow(k,r),g.delayedRendering=!1):(a.setRadialReference(b.center),d.styledMode||l(!0,m,h),l(!0,m,f,e),a.animate(m));a.attr({visibility:g.visible?\"inherit\":\"hidden\"});a.addClass(g.getClassName(),\n!0)}else a&&(g.graphic=a.destroy())})};e.prototype.sortByAngle=function(b,d){b.sort(function(c,b){return\"undefined\"!==typeof c.angle&&(b.angle-c.angle)*d})};e.prototype.translate=function(b){this.generatePoints();var d=0,c=this.options,e=c.slicedOffset,a=e+(c.borderWidth||0),h=f(c.startAngle,c.endAngle),l=this.startAngleRad=h.start;h=(this.endAngleRad=h.end)-l;var n=this.points,q=c.dataLabels.distance;c=c.ignoreHiddenPoint;var v,w=n.length;b||(this.center=b=this.getCenter());for(v=0;v<w;v++){var x=\nn[v];var E=l+d*h;!x.isValid()||c&&!x.visible||(d+=x.percentage/100);var z=l+d*h;var B={x:b[0],y:b[1],r:b[2]/2,innerR:b[3]/2,start:Math.round(1E3*E)/1E3,end:Math.round(1E3*z)/1E3};x.shapeType=\"arc\";x.shapeArgs=B;x.labelDistance=D(x.options.dataLabels&&x.options.dataLabels.distance,q);x.labelDistance=u(x.labelDistance,B.r);this.maxLabelDistance=Math.max(this.maxLabelDistance||0,x.labelDistance);z=(z+E)/2;z>1.5*Math.PI?z-=2*Math.PI:z<-Math.PI/2&&(z+=2*Math.PI);x.slicedTranslation={translateX:Math.round(Math.cos(z)*\ne),translateY:Math.round(Math.sin(z)*e)};B=Math.cos(z)*b[2]/2;var t=Math.sin(z)*b[2]/2;x.tooltipPos=[b[0]+.7*B,b[1]+.7*t];x.half=z<-Math.PI/2||z>Math.PI/2?1:0;x.angle=z;E=Math.min(a,x.labelDistance/5);x.labelPosition={natural:{x:b[0]+B+Math.cos(z)*x.labelDistance,y:b[1]+t+Math.sin(z)*x.labelDistance},\"final\":{},alignment:0>x.labelDistance?\"center\":x.half?\"right\":\"left\",connectorPosition:{breakAt:{x:b[0]+B+Math.cos(z)*E,y:b[1]+t+Math.sin(z)*E},touchingSliceAt:{x:b[0]+B,y:b[1]+t}}}}k(this,\"afterTranslate\")};\ne.prototype.updateTotals=function(){var b,d=0,c=this.points,e=c.length,a=this.options.ignoreHiddenPoint;for(b=0;b<e;b++){var h=c[b];!h.isValid()||a&&!h.visible||(d+=h.y)}this.total=d;for(b=0;b<e;b++)h=c[b],h.percentage=0<d&&(h.visible||!a)?h.y/d*100:0,h.total=d};e.defaultOptions=l(C.defaultOptions,{center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{allowOverlap:!0,connectorPadding:5,connectorShape:\"fixedOffset\",crookDistance:\"70%\",distance:30,enabled:!0,formatter:function(){return this.point.isNull?\nvoid 0:this.point.name},softConnector:!0,x:0},fillColor:void 0,ignoreHiddenPoint:!0,inactiveOtherPoints:!0,legendType:\"point\",marker:null,size:null,showInLegend:!1,slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:H.backgroundColor,borderWidth:1,lineWidth:void 0,states:{hover:{brightness:.1}}});return e}(C);q(w.prototype,{axisTypes:[],directTouch:!0,drawGraph:void 0,drawLegendSymbol:z.drawRectangle,drawTracker:b.prototype.drawTracker,getCenter:e.getCenter,getSymbol:I,isCartesian:!1,\nnoSharedTooltip:!0,pointAttribs:b.prototype.pointAttribs,pointClass:G,requireSorting:!1,searchPoint:I,trackerGroups:[\"group\",\"dataLabelsGroup\"]});B.registerSeriesType(\"pie\",w);\"\";return w});O(e,\"Core/Series/DataLabels.js\",[e[\"Core/Animation/AnimationUtilities.js\"],e[\"Core/FormatUtilities.js\"],e[\"Core/Globals.js\"],e[\"Core/Color/Palette.js\"],e[\"Core/Series/Series.js\"],e[\"Core/Series/SeriesRegistry.js\"],e[\"Core/Utilities.js\"]],function(e,b,I,z,H,G,C){var D=e.getDeferredAnimation,x=b.format;e=I.noop;\nG=G.seriesTypes;var w=C.arrayMax,v=C.clamp,f=C.defined,d=C.extend,q=C.fireEvent,k=C.isArray,l=C.merge,N=C.objectEach,u=C.pick,n=C.relativeLength,J=C.splat,E=C.stableSort;\"\";I.distribute=function(b,c,d){function a(a,c){return a.target-c.target}var e,g=!0,f=b,k=[];var l=0;var m=f.reducedLen||c;for(e=b.length;e--;)l+=b[e].size;if(l>m){E(b,function(a,c){return(c.rank||0)-(a.rank||0)});for(l=e=0;l<=m;)l+=b[e].size,e++;k=b.splice(e-1,b.length)}E(b,a);for(b=b.map(function(a){return{size:a.size,targets:[a.target],\nalign:u(a.align,.5)}});g;){for(e=b.length;e--;)g=b[e],l=(Math.min.apply(0,g.targets)+Math.max.apply(0,g.targets))/2,g.pos=v(l-g.size*g.align,0,c-g.size);e=b.length;for(g=!1;e--;)0<e&&b[e-1].pos+b[e-1].size>b[e].pos&&(b[e-1].size+=b[e].size,b[e-1].targets=b[e-1].targets.concat(b[e].targets),b[e-1].align=.5,b[e-1].pos+b[e-1].size>c&&(b[e-1].pos=c-b[e-1].size),b.splice(e,1),g=!0)}f.push.apply(f,k);e=0;b.some(function(a){var b=0;if(a.targets.some(function(){f[e].pos=a.pos+b;if(\"undefined\"!==typeof d&&\nMath.abs(f[e].pos-f[e].target)>d)return f.slice(0,e+1).forEach(function(a){delete a.pos}),f.reducedLen=(f.reducedLen||c)-.1*c,f.reducedLen>.1*c&&I.distribute(f,c,d),!0;b+=f[e].size;e++}))return!0});E(f,a)};H.prototype.drawDataLabels=function(){function b(a,c){var b=c.filter;return b?(c=b.operator,a=a[b.property],b=b.value,\">\"===c&&a>b||\"<\"===c&&a<b||\">=\"===c&&a>=b||\"<=\"===c&&a<=b||\"==\"===c&&a==b||\"===\"===c&&a===b?!0:!1):!0}function c(a,c){var b=[],d;if(k(a)&&!k(c))b=a.map(function(a){return l(a,c)});\nelse if(k(c)&&!k(a))b=c.map(function(c){return l(a,c)});else if(k(a)||k(c))for(d=Math.max(a.length,c.length);d--;)b[d]=l(a[d],c[d]);else b=l(a,c);return b}var d=this,a=d.chart,e=d.options,r=e.dataLabels,n=d.points,v,w=d.hasRendered||0,E=r.animation;E=r.defer?D(a,E,d):{defer:0,duration:0};var B=a.renderer;r=c(c(a.options.plotOptions&&a.options.plotOptions.series&&a.options.plotOptions.series.dataLabels,a.options.plotOptions&&a.options.plotOptions[d.type]&&a.options.plotOptions[d.type].dataLabels),\nr);q(this,\"drawDataLabels\");if(k(r)||r.enabled||d._hasPointLabels){var C=d.plotGroup(\"dataLabelsGroup\",\"data-labels\",w?\"inherit\":\"hidden\",r.zIndex||6);C.attr({opacity:+w});!w&&(w=d.dataLabelsGroup)&&(d.visible&&C.show(!0),w[e.animation?\"animate\":\"attr\"]({opacity:1},E));n.forEach(function(g){v=J(c(r,g.dlOptions||g.options&&g.options.dataLabels));v.forEach(function(c,h){var k=c.enabled&&(!g.isNull||g.dataLabelOnNull)&&b(g,c),l=g.dataLabels?g.dataLabels[h]:g.dataLabel,m=g.connectors?g.connectors[h]:\ng.connector,r=u(c.distance,g.labelDistance),n=!l;if(k){var q=g.getLabelConfig();var t=u(c[g.formatPrefix+\"Format\"],c.format);q=f(t)?x(t,q,a):(c[g.formatPrefix+\"Formatter\"]||c.formatter).call(q,c);t=c.style;var v=c.rotation;a.styledMode||(t.color=u(c.color,t.color,d.color,z.neutralColor100),\"contrast\"===t.color?(g.contrastColor=B.getContrast(g.color||d.color),t.color=!f(r)&&c.inside||0>r||e.stacking?g.contrastColor:z.neutralColor100):delete g.contrastColor,e.cursor&&(t.cursor=e.cursor));var w={r:c.borderRadius||\n0,rotation:v,padding:c.padding,zIndex:1};a.styledMode||(w.fill=c.backgroundColor,w.stroke=c.borderColor,w[\"stroke-width\"]=c.borderWidth);N(w,function(a,c){\"undefined\"===typeof a&&delete w[c]})}!l||k&&f(q)?k&&f(q)&&(l?w.text=q:(g.dataLabels=g.dataLabels||[],l=g.dataLabels[h]=v?B.text(q,0,-9999,c.useHTML).addClass(\"highcharts-data-label\"):B.label(q,0,-9999,c.shape,null,null,c.useHTML,null,\"data-label\"),h||(g.dataLabel=l),l.addClass(\" highcharts-data-label-color-\"+g.colorIndex+\" \"+(c.className||\"\")+\n(c.useHTML?\" highcharts-tracker\":\"\"))),l.options=c,l.attr(w),a.styledMode||l.css(t).shadow(c.shadow),l.added||l.add(C),c.textPath&&!c.useHTML&&(l.setTextPath(g.getDataLabelPath&&g.getDataLabelPath(l)||g.graphic,c.textPath),g.dataLabelPath&&!c.textPath.enabled&&(g.dataLabelPath=g.dataLabelPath.destroy())),d.alignDataLabel(g,l,c,null,n)):(g.dataLabel=g.dataLabel&&g.dataLabel.destroy(),g.dataLabels&&(1===g.dataLabels.length?delete g.dataLabels:delete g.dataLabels[h]),h||delete g.dataLabel,m&&(g.connector=\ng.connector.destroy(),g.connectors&&(1===g.connectors.length?delete g.connectors:delete g.connectors[h])))})})}q(this,\"afterDrawDataLabels\")};H.prototype.alignDataLabel=function(b,c,e,a,f){var g=this,h=this.chart,k=this.isCartesian&&h.inverted,l=this.enabledDataSorting,m=u(b.dlBox&&b.dlBox.centerX,b.plotX,-9999),n=u(b.plotY,-9999),q=c.getBBox(),v=e.rotation,w=e.align,t=h.isInsidePlot(m,Math.round(n),{inverted:k,paneCoordinates:!0,series:g}),p=\"justify\"===u(e.overflow,l?\"none\":\"justify\"),D=this.visible&&\n!1!==b.visible&&(b.series.forceDL||l&&!p||t||u(e.inside,!!this.options.stacking)&&a&&h.isInsidePlot(m,k?a.x+1:a.y+a.height-1,{inverted:k,paneCoordinates:!0,series:g}));var x=function(a){l&&g.xAxis&&!p&&g.setDataLabelStartPos(b,c,f,t,a)};if(D){var z=h.renderer.fontMetrics(h.styledMode?void 0:e.style.fontSize,c).b;a=d({x:k?this.yAxis.len-n:m,y:Math.round(k?this.xAxis.len-m:n),width:0,height:0},a);d(e,{width:q.width,height:q.height});v?(p=!1,m=h.renderer.rotCorr(z,v),m={x:a.x+(e.x||0)+a.width/2+m.x,\ny:a.y+(e.y||0)+{top:0,middle:.5,bottom:1}[e.verticalAlign]*a.height},x(m),c[f?\"attr\":\"animate\"](m).attr({align:w}),x=(v+720)%360,x=180<x&&360>x,\"left\"===w?m.y-=x?q.height:0:\"center\"===w?(m.x-=q.width/2,m.y-=q.height/2):\"right\"===w&&(m.x-=q.width,m.y-=x?0:q.height),c.placed=!0,c.alignAttr=m):(x(a),c.align(e,void 0,a),m=c.alignAttr);p&&0<=a.height?this.justifyDataLabel(c,e,m,q,a,f):u(e.crop,!0)&&(D=h.isInsidePlot(m.x,m.y,{paneCoordinates:!0,series:g})&&h.isInsidePlot(m.x+q.width,m.y+q.height,{paneCoordinates:!0,\nseries:g}));if(e.shape&&!v)c[f?\"attr\":\"animate\"]({anchorX:k?h.plotWidth-b.plotY:b.plotX,anchorY:k?h.plotHeight-b.plotX:b.plotY})}f&&l&&(c.placed=!1);D||l&&!p||(c.hide(!0),c.placed=!1)};H.prototype.setDataLabelStartPos=function(b,c,d,a,e){var g=this.chart,f=g.inverted,h=this.xAxis,k=h.reversed,l=f?c.height/2:c.width/2;b=(b=b.pointWidth)?b/2:0;h=f?e.x:k?-l-b:h.width-l+b;e=f?k?this.yAxis.height-l+b:-l-b:e.y;c.startXPos=h;c.startYPos=e;a?\"hidden\"===c.visibility&&(c.show(),c.attr({opacity:0}).animate({opacity:1})):\nc.attr({opacity:1}).animate({opacity:0},void 0,c.hide);g.hasRendered&&(d&&c.attr({x:c.startXPos,y:c.startYPos}),c.placed=!0)};H.prototype.justifyDataLabel=function(b,c,d,a,e,f){var g=this.chart,h=c.align,k=c.verticalAlign,l=b.box?0:b.padding||0,m=c.x;m=void 0===m?0:m;var n=c.y;var r=void 0===n?0:n;n=(d.x||0)+l;if(0>n){\"right\"===h&&0<=m?(c.align=\"left\",c.inside=!0):m-=n;var q=!0}n=(d.x||0)+a.width-l;n>g.plotWidth&&(\"left\"===h&&0>=m?(c.align=\"right\",c.inside=!0):m+=g.plotWidth-n,q=!0);n=d.y+l;0>n&&\n(\"bottom\"===k&&0<=r?(c.verticalAlign=\"top\",c.inside=!0):r-=n,q=!0);n=(d.y||0)+a.height-l;n>g.plotHeight&&(\"top\"===k&&0>=r?(c.verticalAlign=\"bottom\",c.inside=!0):r+=g.plotHeight-n,q=!0);q&&(c.x=m,c.y=r,b.placed=!f,b.align(c,void 0,e));return q};G.pie&&(G.pie.prototype.dataLabelPositioners={radialDistributionY:function(b){return b.top+b.distributeBox.pos},radialDistributionX:function(b,c,d,a){return b.getX(d<c.top+2||d>c.bottom-2?a:d,c.half,c)},justify:function(b,c,d){return d[0]+(b.half?-1:1)*(c+b.labelDistance)},\nalignToPlotEdges:function(b,c,d,a){b=b.getBBox().width;return c?b+a:d-b-a},alignToConnectors:function(b,c,d,a){var e=0,g;b.forEach(function(a){g=a.dataLabel.getBBox().width;g>e&&(e=g)});return c?e+a:d-e-a}},G.pie.prototype.drawDataLabels=function(){var b=this,c=b.data,d,a=b.chart,e=b.options.dataLabels||{},k=e.connectorPadding,n,q=a.plotWidth,v=a.plotHeight,x=a.plotLeft,D=Math.round(a.chartWidth/3),E,B=b.center,C=B[2]/2,t=B[1],p,G,J,N,F=[[],[]],O,K,T,X,U=[0,0,0,0],W=b.dataLabelPositioners,Y;b.visible&&\n(e.enabled||b._hasPointLabels)&&(c.forEach(function(a){a.dataLabel&&a.visible&&a.dataLabel.shortened&&(a.dataLabel.attr({width:\"auto\"}).css({width:\"auto\",textOverflow:\"clip\"}),a.dataLabel.shortened=!1)}),H.prototype.drawDataLabels.apply(b),c.forEach(function(a){a.dataLabel&&(a.visible?(F[a.half].push(a),a.dataLabel._pos=null,!f(e.style.width)&&!f(a.options.dataLabels&&a.options.dataLabels.style&&a.options.dataLabels.style.width)&&a.dataLabel.getBBox().width>D&&(a.dataLabel.css({width:Math.round(.7*\nD)+\"px\"}),a.dataLabel.shortened=!0)):(a.dataLabel=a.dataLabel.destroy(),a.dataLabels&&1===a.dataLabels.length&&delete a.dataLabels))}),F.forEach(function(c,g){var h=c.length,l=[],m;if(h){b.sortByAngle(c,g-.5);if(0<b.maxLabelDistance){var n=Math.max(0,t-C-b.maxLabelDistance);var r=Math.min(t+C+b.maxLabelDistance,a.plotHeight);c.forEach(function(b){0<b.labelDistance&&b.dataLabel&&(b.top=Math.max(0,t-C-b.labelDistance),b.bottom=Math.min(t+C+b.labelDistance,a.plotHeight),m=b.dataLabel.getBBox().height||\n21,b.distributeBox={target:b.labelPosition.natural.y-b.top+m/2,size:m,rank:b.y},l.push(b.distributeBox))});n=r+m-n;I.distribute(l,n,n/5)}for(X=0;X<h;X++){d=c[X];J=d.labelPosition;p=d.dataLabel;T=!1===d.visible?\"hidden\":\"inherit\";K=n=J.natural.y;l&&f(d.distributeBox)&&(\"undefined\"===typeof d.distributeBox.pos?T=\"hidden\":(N=d.distributeBox.size,K=W.radialDistributionY(d)));delete d.positionIndex;if(e.justify)O=W.justify(d,C,B);else switch(e.alignTo){case \"connectors\":O=W.alignToConnectors(c,g,q,x);\nbreak;case \"plotEdges\":O=W.alignToPlotEdges(p,g,q,x);break;default:O=W.radialDistributionX(b,d,K,n)}p._attr={visibility:T,align:J.alignment};Y=d.options.dataLabels||{};p._pos={x:O+u(Y.x,e.x)+({left:k,right:-k}[J.alignment]||0),y:K+u(Y.y,e.y)-10};J.final.x=O;J.final.y=K;u(e.crop,!0)&&(G=p.getBBox().width,n=null,O-G<k&&1===g?(n=Math.round(G-O+k),U[3]=Math.max(n,U[3])):O+G>q-k&&0===g&&(n=Math.round(O+G-q+k),U[1]=Math.max(n,U[1])),0>K-N/2?U[0]=Math.max(Math.round(-K+N/2),U[0]):K+N/2>v&&(U[2]=Math.max(Math.round(K+\nN/2-v),U[2])),p.sideOverflow=n)}}}),0===w(U)||this.verifyDataLabelOverflow(U))&&(this.placeDataLabels(),this.points.forEach(function(c){Y=l(e,c.options.dataLabels);if(n=u(Y.connectorWidth,1)){var d;E=c.connector;if((p=c.dataLabel)&&p._pos&&c.visible&&0<c.labelDistance){T=p._attr.visibility;if(d=!E)c.connector=E=a.renderer.path().addClass(\"highcharts-data-label-connector highcharts-color-\"+c.colorIndex+(c.className?\" \"+c.className:\"\")).add(b.dataLabelsGroup),a.styledMode||E.attr({\"stroke-width\":n,\nstroke:Y.connectorColor||c.color||z.neutralColor60});E[d?\"attr\":\"animate\"]({d:c.getConnectorPath()});E.attr(\"visibility\",T)}else E&&(c.connector=E.destroy())}}))},G.pie.prototype.placeDataLabels=function(){this.points.forEach(function(b){var c=b.dataLabel,d;c&&b.visible&&((d=c._pos)?(c.sideOverflow&&(c._attr.width=Math.max(c.getBBox().width-c.sideOverflow,0),c.css({width:c._attr.width+\"px\",textOverflow:(this.options.dataLabels.style||{}).textOverflow||\"ellipsis\"}),c.shortened=!0),c.attr(c._attr),\nc[c.moved?\"animate\":\"attr\"](d),c.moved=!0):c&&c.attr({y:-9999}));delete b.distributeBox},this)},G.pie.prototype.alignDataLabel=e,G.pie.prototype.verifyDataLabelOverflow=function(b){var c=this.center,d=this.options,a=d.center,e=d.minSize||80,f=null!==d.size;if(!f){if(null!==a[0])var k=Math.max(c[2]-Math.max(b[1],b[3]),e);else k=Math.max(c[2]-b[1]-b[3],e),c[0]+=(b[3]-b[1])/2;null!==a[1]?k=v(k,e,c[2]-Math.max(b[0],b[2])):(k=v(k,e,c[2]-b[0]-b[2]),c[1]+=(b[0]-b[2])/2);k<c[2]?(c[2]=k,c[3]=Math.min(n(d.innerSize||\n0,k),k),this.translate(c),this.drawDataLabels&&this.drawDataLabels()):f=!0}return f});G.column&&(G.column.prototype.alignDataLabel=function(b,c,d,a,e){var f=this.chart.inverted,g=b.series,h=b.dlBox||b.shapeArgs,k=u(b.below,b.plotY>u(this.translatedThreshold,g.yAxis.len)),m=u(d.inside,!!this.options.stacking);h&&(a=l(h),0>a.y&&(a.height+=a.y,a.y=0),h=a.y+a.height-g.yAxis.len,0<h&&h<a.height&&(a.height-=h),f&&(a={x:g.yAxis.len-a.y-a.height,y:g.xAxis.len-a.x-a.width,width:a.height,height:a.width}),m||\n(f?(a.x+=k?0:a.width,a.width=0):(a.y+=k?a.height:0,a.height=0)));d.align=u(d.align,!f||m?\"center\":k?\"right\":\"left\");d.verticalAlign=u(d.verticalAlign,f||m?\"middle\":k?\"top\":\"bottom\");H.prototype.alignDataLabel.call(this,b,c,d,a,e);d.inside&&b.contrastColor&&c.css({color:b.contrastColor})})});O(e,\"Extensions/OverlappingDataLabels.js\",[e[\"Core/Chart/Chart.js\"],e[\"Core/Utilities.js\"]],function(e,b){function D(b,e){var f=!1;if(b){var d=b.newOpacity;b.oldOpacity!==d&&(b.alignAttr&&b.placed?(b[d?\"removeClass\":\n\"addClass\"](\"highcharts-data-label-hidden\"),f=!0,b.alignAttr.opacity=d,b[b.isOld?\"animate\":\"attr\"](b.alignAttr,null,function(){e.styledMode||b.css({pointerEvents:d?\"auto\":\"none\"});b.visibility=d?\"inherit\":\"hidden\"}),H(e,\"afterHideOverlappingLabel\")):b.attr({opacity:d}));b.isOld=!0}return f}var z=b.addEvent,H=b.fireEvent,G=b.isArray,C=b.isNumber,B=b.objectEach,x=b.pick;z(e,\"render\",function(){var b=this,e=[];(this.labelCollectors||[]).forEach(function(b){e=e.concat(b())});(this.yAxis||[]).forEach(function(b){b.stacking&&\nb.options.stackLabels&&!b.options.stackLabels.allowOverlap&&B(b.stacking.stacks,function(b){B(b,function(b){e.push(b.label)})})});(this.series||[]).forEach(function(f){var d=f.options.dataLabels;f.visible&&(!1!==d.enabled||f._hasPointLabels)&&(d=function(d){return d.forEach(function(d){d.visible&&(G(d.dataLabels)?d.dataLabels:d.dataLabel?[d.dataLabel]:[]).forEach(function(f){var k=f.options;f.labelrank=x(k.labelrank,d.labelrank,d.shapeArgs&&d.shapeArgs.height);k.allowOverlap?(f.oldOpacity=f.opacity,\nf.newOpacity=1,D(f,b)):e.push(f)})})},d(f.nodes||[]),d(f.points))});this.hideOverlappingLabels(e)});e.prototype.hideOverlappingLabels=function(b){var e=this,f=b.length,d=e.renderer,q,k,l,w=!1;var u=function(b){var e,c=b.box?0:b.padding||0,f=e=0,a;if(b&&(!b.alignAttr||b.placed)){var h=b.alignAttr||{x:b.attr(\"x\"),y:b.attr(\"y\")};var k=b.parentGroup;b.width||(e=b.getBBox(),b.width=e.width,b.height=e.height,e=d.fontMetrics(null,b.element).h);var l=b.width-2*c;(a={left:\"0\",center:\"0.5\",right:\"1\"}[b.alignValue])?\nf=+a*l:C(b.x)&&Math.round(b.x)!==b.translateX&&(f=b.x-b.translateX);return{x:h.x+(k.translateX||0)+c-(f||0),y:h.y+(k.translateY||0)+c-e,width:b.width-2*c,height:b.height-2*c}}};for(k=0;k<f;k++)if(q=b[k])q.oldOpacity=q.opacity,q.newOpacity=1,q.absoluteBox=u(q);b.sort(function(b,d){return(d.labelrank||0)-(b.labelrank||0)});for(k=0;k<f;k++){var n=(u=b[k])&&u.absoluteBox;for(q=k+1;q<f;++q){var x=(l=b[q])&&l.absoluteBox;!n||!x||u===l||0===u.newOpacity||0===l.newOpacity||x.x>=n.x+n.width||x.x+x.width<=\nn.x||x.y>=n.y+n.height||x.y+x.height<=n.y||((u.labelrank<l.labelrank?u:l).newOpacity=0)}}b.forEach(function(b){D(b,e)&&(w=!0)});w&&H(e,\"afterHideAllOverlappingLabels\")}});O(e,\"Core/Responsive.js\",[e[\"Core/Chart/Chart.js\"],e[\"Core/Utilities.js\"]],function(e,b){var D=b.find,z=b.isArray,H=b.isObject,G=b.merge,C=b.objectEach,B=b.pick,x=b.splat,w=b.uniqueKey;e.prototype.setResponsive=function(b,e){var d=this.options.responsive,f=[],k=this.currentResponsive;!e&&d&&d.rules&&d.rules.forEach(function(b){\"undefined\"===\ntypeof b._id&&(b._id=w());this.matchResponsiveRule(b,f)},this);e=G.apply(0,f.map(function(b){return D(d.rules,function(d){return d._id===b}).chartOptions}));e.isResponsiveOptions=!0;f=f.toString()||void 0;f!==(k&&k.ruleIds)&&(k&&this.update(k.undoOptions,b,!0),f?(k=this.currentOptions(e),k.isResponsiveOptions=!0,this.currentResponsive={ruleIds:f,mergedOptions:e,undoOptions:k},this.update(e,b,!0)):this.currentResponsive=void 0)};e.prototype.matchResponsiveRule=function(b,e){var d=b.condition;(d.callback||\nfunction(){return this.chartWidth<=B(d.maxWidth,Number.MAX_VALUE)&&this.chartHeight<=B(d.maxHeight,Number.MAX_VALUE)&&this.chartWidth>=B(d.minWidth,0)&&this.chartHeight>=B(d.minHeight,0)}).call(this)&&e.push(b._id)};e.prototype.currentOptions=function(b){function e(b,f,q,u){var k;C(b,function(b,l){if(!u&&-1<d.collectionsWithUpdate.indexOf(l)&&f[l])for(b=x(b),q[l]=[],k=0;k<Math.max(b.length,f[l].length);k++)f[l][k]&&(void 0===b[k]?q[l][k]=f[l][k]:(q[l][k]={},e(b[k],f[l][k],q[l][k],u+1)));else H(b)?\n(q[l]=z(b)?[]:{},e(b,f[l]||{},q[l],u+1)):q[l]=\"undefined\"===typeof f[l]?null:f[l]})}var d=this,q={};e(b,this.options,q,0);return q}});O(e,\"masters/highcharts.src.js\",[e[\"Core/Globals.js\"],e[\"Core/Utilities.js\"],e[\"Core/Options.js\"],e[\"Core/Animation/Fx.js\"],e[\"Core/Animation/AnimationUtilities.js\"],e[\"Core/Renderer/HTML/AST.js\"],e[\"Core/FormatUtilities.js\"],e[\"Core/Renderer/SVG/SVGElement.js\"],e[\"Core/Series/Series.js\"]],function(e,b,I,z,H,G,C,B,x){e.animate=H.animate;e.animObject=H.animObject;e.getDeferredAnimation=\nH.getDeferredAnimation;e.setAnimation=H.setAnimation;e.stop=H.stop;e.timers=z.timers;e.AST=G;e.Fx=z;e.Series=x;e.SVGElement=B;e.dateFormat=C.dateFormat;e.format=C.format;e.numberFormat=C.numberFormat;e.defaultOptions=I.defaultOptions;e.getOptions=I.getOptions;e.time=I.defaultTime;e.setOptions=I.setOptions;e.addEvent=b.addEvent;e.arrayMax=b.arrayMax;e.arrayMin=b.arrayMin;e.attr=b.attr;e.clearTimeout=b.clearTimeout;e.correctFloat=b.correctFloat;e.createElement=b.createElement;e.css=b.css;e.defined=\nb.defined;e.destroyObjectProperties=b.destroyObjectProperties;e.discardElement=b.discardElement;e.erase=b.erase;e.error=b.error;e.extend=b.extend;e.extendClass=b.extendClass;e.find=b.find;e.fireEvent=b.fireEvent;e.getMagnitude=b.getMagnitude;e.getStyle=b.getStyle;e.inArray=b.inArray;e.isArray=b.isArray;e.isClass=b.isClass;e.isDOMElement=b.isDOMElement;e.isFunction=b.isFunction;e.isNumber=b.isNumber;e.isObject=b.isObject;e.isString=b.isString;e.keys=b.keys;e.merge=b.merge;e.normalizeTickInterval=b.normalizeTickInterval;\ne.objectEach=b.objectEach;e.offset=b.offset;e.pad=b.pad;e.pick=b.pick;e.pInt=b.pInt;e.relativeLength=b.relativeLength;e.removeEvent=b.removeEvent;e.splat=b.splat;e.stableSort=b.stableSort;e.syncTimeout=b.syncTimeout;e.timeUnits=b.timeUnits;e.uniqueKey=b.uniqueKey;e.useSerialIds=b.useSerialIds;e.wrap=b.wrap;return e});e[\"masters/highcharts.src.js\"]._modules=e;return e[\"masters/highcharts.src.js\"]});\n//# sourceMappingURL=highcharts.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2hpZ2hjaGFydHMvaGlnaGNoYXJ0cy5qcy5qcyIsInNvdXJjZXMiOlsiZmlsZTovL0M6L0NsaWNrVmlldyBQcm9qZWN0cy9jbGlja3ZpZXcvbm9kZV9tb2R1bGVzL2hpZ2hjaGFydHMvaGlnaGNoYXJ0cy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuIEhpZ2hjaGFydHMgSlMgdjkuMS4wICgyMDIxLTA1LTAzKVxuXG4gKGMpIDIwMDktMjAyMSBUb3JzdGVpbiBIb25zaVxuXG4gTGljZW5zZTogd3d3LmhpZ2hjaGFydHMuY29tL2xpY2Vuc2VcbiovXG4oZnVuY3Rpb24oVyxPKXtcIm9iamVjdFwiPT09dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHM/KE9bXCJkZWZhdWx0XCJdPU8sbW9kdWxlLmV4cG9ydHM9Vy5kb2N1bWVudD9PKFcpOk8pOlwiZnVuY3Rpb25cIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFwiaGlnaGNoYXJ0cy9oaWdoY2hhcnRzXCIsZnVuY3Rpb24oKXtyZXR1cm4gTyhXKX0pOihXLkhpZ2hjaGFydHMmJlcuSGlnaGNoYXJ0cy5lcnJvcigxNiwhMCksVy5IaWdoY2hhcnRzPU8oVykpfSkoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiB3aW5kb3c/d2luZG93OnRoaXMsZnVuY3Rpb24oVyl7ZnVuY3Rpb24gTyhELGIsZSx6KXtELmhhc093blByb3BlcnR5KGIpfHwoRFtiXT16LmFwcGx5KG51bGwsZSkpfXZhciBlPXt9O08oZSxcIkNvcmUvR2xvYmFscy5qc1wiLFtdLGZ1bmN0aW9uKCl7dmFyIEQ9XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBXP1c6XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiB3aW5kb3c/d2luZG93Ont9LGI7KGZ1bmN0aW9uKGIpe2IuU1ZHX05TPVxuXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiO2IucHJvZHVjdD1cIkhpZ2hjaGFydHNcIjtiLnZlcnNpb249XCI5LjEuMFwiO2Iud2luPUQ7Yi5kb2M9Yi53aW4uZG9jdW1lbnQ7Yi5zdmc9Yi5kb2MmJmIuZG9jLmNyZWF0ZUVsZW1lbnROUyYmISFiLmRvYy5jcmVhdGVFbGVtZW50TlMoYi5TVkdfTlMsXCJzdmdcIikuY3JlYXRlU1ZHUmVjdDtiLnVzZXJBZ2VudD1iLndpbi5uYXZpZ2F0b3ImJmIud2luLm5hdmlnYXRvci51c2VyQWdlbnR8fFwiXCI7Yi5pc0Nocm9tZT0tMSE9PWIudXNlckFnZW50LmluZGV4T2YoXCJDaHJvbWVcIik7Yi5pc0ZpcmVmb3g9LTEhPT1iLnVzZXJBZ2VudC5pbmRleE9mKFwiRmlyZWZveFwiKTtiLmlzTVM9LyhlZGdlfG1zaWV8dHJpZGVudCkvaS50ZXN0KGIudXNlckFnZW50KSYmIWIud2luLm9wZXJhO2IuaXNTYWZhcmk9IWIuaXNDaHJvbWUmJi0xIT09Yi51c2VyQWdlbnQuaW5kZXhPZihcIlNhZmFyaVwiKTtiLmlzVG91Y2hEZXZpY2U9LyhNb2JpbGV8QW5kcm9pZHxXaW5kb3dzIFBob25lKS8udGVzdChiLnVzZXJBZ2VudCk7XG5iLmlzV2ViS2l0PS0xIT09Yi51c2VyQWdlbnQuaW5kZXhPZihcIkFwcGxlV2ViS2l0XCIpO2IuZGVnMnJhZD0yKk1hdGguUEkvMzYwO2IuaGFzQmlkaUJ1Zz1iLmlzRmlyZWZveCYmND5wYXJzZUludChiLnVzZXJBZ2VudC5zcGxpdChcIkZpcmVmb3gvXCIpWzFdLDEwKTtiLmhhc1RvdWNoPSEhYi53aW4uVG91Y2hFdmVudDtiLm1hcmdpbk5hbWVzPVtcInBsb3RUb3BcIixcIm1hcmdpblJpZ2h0XCIsXCJtYXJnaW5Cb3R0b21cIixcInBsb3RMZWZ0XCJdO2Iubm9vcD1mdW5jdGlvbigpe307Yi5zdXBwb3J0c1Bhc3NpdmVFdmVudHM9ZnVuY3Rpb24oKXt2YXIgRD0hMTtpZighYi5pc01TKXt2YXIgZT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sXCJwYXNzaXZlXCIse2dldDpmdW5jdGlvbigpe0Q9ITB9fSk7Yi53aW4uYWRkRXZlbnRMaXN0ZW5lciYmYi53aW4ucmVtb3ZlRXZlbnRMaXN0ZW5lciYmKGIud2luLmFkZEV2ZW50TGlzdGVuZXIoXCJ0ZXN0UGFzc2l2ZVwiLGIubm9vcCxlKSxiLndpbi5yZW1vdmVFdmVudExpc3RlbmVyKFwidGVzdFBhc3NpdmVcIixcbmIubm9vcCxlKSl9cmV0dXJuIER9KCk7Yi5jaGFydHM9W107Yi5kYXRlRm9ybWF0cz17fTtiLnNlcmllc1R5cGVzPXt9O2Iuc3ltYm9sU2l6ZXM9e319KShifHwoYj17fSkpO3JldHVybiBifSk7TyhlLFwiQ29yZS9VdGlsaXRpZXMuanNcIixbZVtcIkNvcmUvR2xvYmFscy5qc1wiXV0sZnVuY3Rpb24oRCl7ZnVuY3Rpb24gYihhLGMsaCxyKXt2YXIgeT1jP1wiSGlnaGNoYXJ0cyBlcnJvclwiOlwiSGlnaGNoYXJ0cyB3YXJuaW5nXCI7MzI9PT1hJiYoYT15K1wiOiBEZXByZWNhdGVkIG1lbWJlclwiKTt2YXIgZD13KGEpLE09ZD95K1wiICNcIithK1wiOiB3d3cuaGlnaGNoYXJ0cy5jb20vZXJyb3JzL1wiK2ErXCIvXCI6YS50b1N0cmluZygpO2lmKFwidW5kZWZpbmVkXCIhPT10eXBlb2Ygcil7dmFyIHQ9XCJcIjtkJiYoTSs9XCI/XCIpO24ocixmdW5jdGlvbihwLGEpe3QrPVwiXFxuIC0gXCIrYStcIjogXCIrcDtkJiYoTSs9ZW5jb2RlVVJJKGEpK1wiPVwiK2VuY29kZVVSSShwKSl9KTtNKz10fUUoSGlnaGNoYXJ0cyxcImRpc3BsYXlFcnJvclwiLFxue2NoYXJ0OmgsY29kZTphLG1lc3NhZ2U6TSxwYXJhbXM6cn0sZnVuY3Rpb24oKXtpZihjKXRocm93IEVycm9yKE0pO2cuY29uc29sZSYmLTE9PT1iLm1lc3NhZ2VzLmluZGV4T2YoTSkmJmNvbnNvbGUud2FybihNKX0pO2IubWVzc2FnZXMucHVzaChNKX1mdW5jdGlvbiBlKGEsYyl7dmFyIHk9e307bihhLGZ1bmN0aW9uKGcsaCl7aWYoQyhhW2hdLCEwKSYmIWEubm9kZVR5cGUmJmNbaF0pZz1lKGFbaF0sY1toXSksT2JqZWN0LmtleXMoZykubGVuZ3RoJiYoeVtoXT1nKTtlbHNlIGlmKEMoYVtoXSl8fGFbaF0hPT1jW2hdKXlbaF09YVtoXX0pO3JldHVybiB5fWZ1bmN0aW9uIHooYSxjKXtyZXR1cm4gcGFyc2VJbnQoYSxjfHwxMCl9ZnVuY3Rpb24gSChhKXtyZXR1cm5cInN0cmluZ1wiPT09dHlwZW9mIGF9ZnVuY3Rpb24gRyhhKXthPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhKTtyZXR1cm5cIltvYmplY3QgQXJyYXldXCI9PT1hfHxcIltvYmplY3QgQXJyYXkgSXRlcmF0b3JdXCI9PT1cbmF9ZnVuY3Rpb24gQyhhLGMpe3JldHVybiEhYSYmXCJvYmplY3RcIj09PXR5cGVvZiBhJiYoIWN8fCFHKGEpKX1mdW5jdGlvbiBCKGEpe3JldHVybiBDKGEpJiZcIm51bWJlclwiPT09dHlwZW9mIGEubm9kZVR5cGV9ZnVuY3Rpb24geChhKXt2YXIgYz1hJiZhLmNvbnN0cnVjdG9yO3JldHVybiEoIUMoYSwhMCl8fEIoYSl8fCFjfHwhYy5uYW1lfHxcIk9iamVjdFwiPT09Yy5uYW1lKX1mdW5jdGlvbiB3KGEpe3JldHVyblwibnVtYmVyXCI9PT10eXBlb2YgYSYmIWlzTmFOKGEpJiZJbmZpbml0eT5hJiYtSW5maW5pdHk8YX1mdW5jdGlvbiB2KGEpe3JldHVyblwidW5kZWZpbmVkXCIhPT10eXBlb2YgYSYmbnVsbCE9PWF9ZnVuY3Rpb24gZihhLGMsZyl7dmFyIHk7SChjKT92KGcpP2Euc2V0QXR0cmlidXRlKGMsZyk6YSYmYS5nZXRBdHRyaWJ1dGUmJigoeT1hLmdldEF0dHJpYnV0ZShjKSl8fFwiY2xhc3NcIiE9PWN8fCh5PWEuZ2V0QXR0cmlidXRlKGMrXCJOYW1lXCIpKSk6bihjLGZ1bmN0aW9uKGMseSl7YS5zZXRBdHRyaWJ1dGUoeSxcbmMpfSk7cmV0dXJuIHl9ZnVuY3Rpb24gZChhLGMpe3ZhciB5O2F8fChhPXt9KTtmb3IoeSBpbiBjKWFbeV09Y1t5XTtyZXR1cm4gYX1mdW5jdGlvbiBxKCl7Zm9yKHZhciBhPWFyZ3VtZW50cyxjPWEubGVuZ3RoLGc9MDtnPGM7ZysrKXt2YXIgaD1hW2ddO2lmKFwidW5kZWZpbmVkXCIhPT10eXBlb2YgaCYmbnVsbCE9PWgpcmV0dXJuIGh9fWZ1bmN0aW9uIGsoYSxjKXtELmlzTVMmJiFELnN2ZyYmYyYmXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBjLm9wYWNpdHkmJihjLmZpbHRlcj1cImFscGhhKG9wYWNpdHk9XCIrMTAwKmMub3BhY2l0eStcIilcIik7ZChhLnN0eWxlLGMpfWZ1bmN0aW9uIGwoYSxnLGgscixtKXthPWMuY3JlYXRlRWxlbWVudChhKTtnJiZkKGEsZyk7bSYmayhhLHtwYWRkaW5nOlwiMFwiLGJvcmRlcjpcIm5vbmVcIixtYXJnaW46XCIwXCJ9KTtoJiZrKGEsaCk7ciYmci5hcHBlbmRDaGlsZChhKTtyZXR1cm4gYX1mdW5jdGlvbiBOKGEsYyl7cmV0dXJuIHBhcnNlRmxvYXQoYS50b1ByZWNpc2lvbihjfHxcbjE0KSl9ZnVuY3Rpb24gdShhLGMsaCl7dmFyIHk9RC5nZXRTdHlsZXx8dTtpZihcIndpZHRoXCI9PT1jKXJldHVybiBjPU1hdGgubWluKGEub2Zmc2V0V2lkdGgsYS5zY3JvbGxXaWR0aCksaD1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCxoPGMmJmg+PWMtMSYmKGM9TWF0aC5mbG9vcihoKSksTWF0aC5tYXgoMCxjLSh5KGEsXCJwYWRkaW5nLWxlZnRcIiwhMCl8fDApLSh5KGEsXCJwYWRkaW5nLXJpZ2h0XCIsITApfHwwKSk7aWYoXCJoZWlnaHRcIj09PWMpcmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oYS5vZmZzZXRIZWlnaHQsYS5zY3JvbGxIZWlnaHQpLSh5KGEsXCJwYWRkaW5nLXRvcFwiLCEwKXx8MCktKHkoYSxcInBhZGRpbmctYm90dG9tXCIsITApfHwwKSk7Zy5nZXRDb21wdXRlZFN0eWxlfHxiKDI3LCEwKTtpZihhPWcuZ2V0Q29tcHV0ZWRTdHlsZShhLHZvaWQgMCkpe3ZhciByPWEuZ2V0UHJvcGVydHlWYWx1ZShjKTtxKGgsXCJvcGFjaXR5XCIhPT1cbmMpJiYocj16KHIpKX1yZXR1cm4gcn1mdW5jdGlvbiBuKGEsYyxnKXtmb3IodmFyIGggaW4gYSlPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChhLGgpJiZjLmNhbGwoZ3x8YVtoXSxhW2hdLGgsYSl9ZnVuY3Rpb24gSihhLGMsZyl7ZnVuY3Rpb24gaCh0LHApe3ZhciBjPWEucmVtb3ZlRXZlbnRMaXN0ZW5lcnx8RC5yZW1vdmVFdmVudExpc3RlbmVyUG9seWZpbGw7YyYmYy5jYWxsKGEsdCxwLCExKX1mdW5jdGlvbiB5KHQpe3ZhciBwO2lmKGEubm9kZU5hbWUpe2lmKGMpe3ZhciBnPXt9O2dbY109ITB9ZWxzZSBnPXQ7bihnLGZ1bmN0aW9uKGEsYyl7aWYodFtjXSlmb3IocD10W2NdLmxlbmd0aDtwLS07KWgoYyx0W2NdW3BdLmZuKX0pfX12YXIgcj1cImZ1bmN0aW9uXCI9PT10eXBlb2YgYSYmYS5wcm90b3R5cGV8fGE7aWYoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwocixcImhjRXZlbnRzXCIpKXt2YXIgTT1yLmhjRXZlbnRzO2M/KHI9TVtjXXx8W10sZz8oTVtjXT1yLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gZyE9PVxuYS5mbn0pLGgoYyxnKSk6KHkoTSksTVtjXT1bXSkpOih5KE0pLGRlbGV0ZSByLmhjRXZlbnRzKX19ZnVuY3Rpb24gRShhLGcsaCxyKXtoPWh8fHt9O2lmKGMuY3JlYXRlRXZlbnQmJihhLmRpc3BhdGNoRXZlbnR8fGEuZmlyZUV2ZW50JiZhIT09RCkpe3ZhciB5PWMuY3JlYXRlRXZlbnQoXCJFdmVudHNcIik7eS5pbml0RXZlbnQoZywhMCwhMCk7aD1kKHksaCk7YS5kaXNwYXRjaEV2ZW50P2EuZGlzcGF0Y2hFdmVudChoKTphLmZpcmVFdmVudChnLGgpfWVsc2UgaWYoYS5oY0V2ZW50cyl7aC50YXJnZXR8fGQoaCx7cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXtoLmRlZmF1bHRQcmV2ZW50ZWQ9ITB9LHRhcmdldDphLHR5cGU6Z30pO3k9W107Zm9yKHZhciBtPWEsTT0hMTttLmhjRXZlbnRzOylPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtLFwiaGNFdmVudHNcIikmJm0uaGNFdmVudHNbZ10mJih5Lmxlbmd0aCYmKE09ITApLHkudW5zaGlmdC5hcHBseSh5LG0uaGNFdmVudHNbZ10pKSxtPVxuT2JqZWN0LmdldFByb3RvdHlwZU9mKG0pO00mJnkuc29ydChmdW5jdGlvbihhLHApe3JldHVybiBhLm9yZGVyLXAub3JkZXJ9KTt5LmZvckVhY2goZnVuY3Rpb24odCl7ITE9PT10LmZuLmNhbGwoYSxoKSYmaC5wcmV2ZW50RGVmYXVsdCgpfSl9ciYmIWguZGVmYXVsdFByZXZlbnRlZCYmci5jYWxsKGEsaCl9dmFyIG09RC5jaGFydHMsYz1ELmRvYyxnPUQud2luO1wiXCI7KGJ8fChiPXt9KSkubWVzc2FnZXM9W107dmFyIGE7TWF0aC5lYXNlSW5PdXRTaW5lPWZ1bmN0aW9uKGEpe3JldHVybi0uNSooTWF0aC5jb3MoTWF0aC5QSSphKS0xKX07dmFyIGg9QXJyYXkucHJvdG90eXBlLmZpbmQ/ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maW5kKGMpfTpmdW5jdGlvbihhLGMpe3ZhciBnLGg9YS5sZW5ndGg7Zm9yKGc9MDtnPGg7ZysrKWlmKGMoYVtnXSxnKSlyZXR1cm4gYVtnXX07bih7bWFwOlwibWFwXCIsZWFjaDpcImZvckVhY2hcIixncmVwOlwiZmlsdGVyXCIscmVkdWNlOlwicmVkdWNlXCIsc29tZTpcInNvbWVcIn0sXG5mdW5jdGlvbihhLGMpe0RbY109ZnVuY3Rpb24oZyl7dmFyIGg7YigzMiwhMSx2b2lkIDAsKGg9e30saFtcIkhpZ2hjaGFydHMuXCIrY109XCJ1c2UgQXJyYXkuXCIrYSxoKSk7cmV0dXJuIEFycmF5LnByb3RvdHlwZVthXS5hcHBseShnLFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKX19KTt2YXIgcixBPWZ1bmN0aW9uKCl7dmFyIGE9TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsOSkrXCItXCIsYz0wO3JldHVybiBmdW5jdGlvbigpe3JldHVyblwiaGlnaGNoYXJ0cy1cIisocj9cIlwiOmEpK2MrK319KCk7Zy5qUXVlcnkmJihnLmpRdWVyeS5mbi5oaWdoY2hhcnRzPWZ1bmN0aW9uKCl7dmFyIGE9W10uc2xpY2UuY2FsbChhcmd1bWVudHMpO2lmKHRoaXNbMF0pcmV0dXJuIGFbMF0/KG5ldyAoRFtIKGFbMF0pP2Euc2hpZnQoKTpcIkNoYXJ0XCJdKSh0aGlzWzBdLGFbMF0sYVsxXSksdGhpcyk6bVtmKHRoaXNbMF0sXCJkYXRhLWhpZ2hjaGFydHMtY2hhcnRcIildfSk7cmV0dXJue2FkZEV2ZW50OmZ1bmN0aW9uKGEsXG5jLGcsaCl7dm9pZCAwPT09aCYmKGg9e30pO3ZhciByPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBhJiZhLnByb3RvdHlwZXx8YTtPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChyLFwiaGNFdmVudHNcIil8fChyLmhjRXZlbnRzPXt9KTtyPXIuaGNFdmVudHM7RC5Qb2ludCYmYSBpbnN0YW5jZW9mIEQuUG9pbnQmJmEuc2VyaWVzJiZhLnNlcmllcy5jaGFydCYmKGEuc2VyaWVzLmNoYXJ0LnJ1blRyYWNrZXJDbGljaz0hMCk7dmFyIHk9YS5hZGRFdmVudExpc3RlbmVyfHxELmFkZEV2ZW50TGlzdGVuZXJQb2x5ZmlsbDt5JiZ5LmNhbGwoYSxjLGcsRC5zdXBwb3J0c1Bhc3NpdmVFdmVudHM/e3Bhc3NpdmU6dm9pZCAwPT09aC5wYXNzaXZlPy0xIT09Yy5pbmRleE9mKFwidG91Y2hcIik6aC5wYXNzaXZlLGNhcHR1cmU6ITF9OiExKTtyW2NdfHwocltjXT1bXSk7cltjXS5wdXNoKHtmbjpnLG9yZGVyOlwibnVtYmVyXCI9PT10eXBlb2YgaC5vcmRlcj9oLm9yZGVyOkluZmluaXR5fSk7cltjXS5zb3J0KGZ1bmN0aW9uKGEsXG50KXtyZXR1cm4gYS5vcmRlci10Lm9yZGVyfSk7cmV0dXJuIGZ1bmN0aW9uKCl7SihhLGMsZyl9fSxhcnJheU1heDpmdW5jdGlvbihhKXtmb3IodmFyIGM9YS5sZW5ndGgsZz1hWzBdO2MtLTspYVtjXT5nJiYoZz1hW2NdKTtyZXR1cm4gZ30sYXJyYXlNaW46ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWEubGVuZ3RoLGc9YVswXTtjLS07KWFbY108ZyYmKGc9YVtjXSk7cmV0dXJuIGd9LGF0dHI6ZixjbGFtcDpmdW5jdGlvbihhLGMsZyl7cmV0dXJuIGE+Yz9hPGc/YTpnOmN9LGNsZWFuUmVjdXJzaXZlbHk6ZSxjbGVhclRpbWVvdXQ6ZnVuY3Rpb24oYSl7dihhKSYmY2xlYXJUaW1lb3V0KGEpfSxjb3JyZWN0RmxvYXQ6TixjcmVhdGVFbGVtZW50OmwsY3NzOmssZGVmaW5lZDp2LGRlc3Ryb3lPYmplY3RQcm9wZXJ0aWVzOmZ1bmN0aW9uKGEsYyl7bihhLGZ1bmN0aW9uKGcsaCl7ZyYmZyE9PWMmJmcuZGVzdHJveSYmZy5kZXN0cm95KCk7ZGVsZXRlIGFbaF19KX0sZGlzY2FyZEVsZW1lbnQ6ZnVuY3Rpb24oYyl7YXx8XG4oYT1sKFwiZGl2XCIpKTtjJiZhLmFwcGVuZENoaWxkKGMpO2EuaW5uZXJIVE1MPVwiXCJ9LGVyYXNlOmZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBnPWEubGVuZ3RoO2ctLTspaWYoYVtnXT09PWMpe2Euc3BsaWNlKGcsMSk7YnJlYWt9fSxlcnJvcjpiLGV4dGVuZDpkLGV4dGVuZENsYXNzOmZ1bmN0aW9uKGEsYyl7dmFyIGc9ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPW5ldyBhO2QoZy5wcm90b3R5cGUsYyk7cmV0dXJuIGd9LGZpbmQ6aCxmaXJlRXZlbnQ6RSxnZXRNYWduaXR1ZGU6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2coYSkvTWF0aC5MTjEwKSl9LGdldE5lc3RlZFByb3BlcnR5OmZ1bmN0aW9uKGEsYyl7Zm9yKGE9YS5zcGxpdChcIi5cIik7YS5sZW5ndGgmJnYoYyk7KXt2YXIgaD1hLnNoaWZ0KCk7aWYoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBofHxcIl9fcHJvdG9fX1wiPT09aClyZXR1cm47Yz1jW2hdO2lmKCF2KGMpfHxcImZ1bmN0aW9uXCI9PT10eXBlb2YgY3x8XG5cIm51bWJlclwiPT09dHlwZW9mIGMubm9kZVR5cGV8fGM9PT1nKXJldHVybn1yZXR1cm4gY30sZ2V0U3R5bGU6dSxpbkFycmF5OmZ1bmN0aW9uKGEsYyxnKXtiKDMyLCExLHZvaWQgMCx7XCJIaWdoY2hhcnRzLmluQXJyYXlcIjpcInVzZSBBcnJheS5pbmRleE9mXCJ9KTtyZXR1cm4gYy5pbmRleE9mKGEsZyl9LGlzQXJyYXk6Ryxpc0NsYXNzOngsaXNET01FbGVtZW50OkIsaXNGdW5jdGlvbjpmdW5jdGlvbihhKXtyZXR1cm5cImZ1bmN0aW9uXCI9PT10eXBlb2YgYX0saXNOdW1iZXI6dyxpc09iamVjdDpDLGlzU3RyaW5nOkgsa2V5czpmdW5jdGlvbihhKXtiKDMyLCExLHZvaWQgMCx7XCJIaWdoY2hhcnRzLmtleXNcIjpcInVzZSBPYmplY3Qua2V5c1wifSk7cmV0dXJuIE9iamVjdC5rZXlzKGEpfSxtZXJnZTpmdW5jdGlvbigpe3ZhciBhLGM9YXJndW1lbnRzLGc9e30saD1mdW5jdGlvbihhLGMpe1wib2JqZWN0XCIhPT10eXBlb2YgYSYmKGE9e30pO24oYyxmdW5jdGlvbih0LHApe1wiX19wcm90b19fXCIhPT1wJiZcblwiY29uc3RydWN0b3JcIiE9PXAmJighQyh0LCEwKXx8eCh0KXx8Qih0KT9hW3BdPWNbcF06YVtwXT1oKGFbcF18fHt9LHQpKX0pO3JldHVybiBhfTshMD09PWNbMF0mJihnPWNbMV0sYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjLDIpKTt2YXIgcj1jLmxlbmd0aDtmb3IoYT0wO2E8cjthKyspZz1oKGcsY1thXSk7cmV0dXJuIGd9LG5vcm1hbGl6ZVRpY2tJbnRlcnZhbDpmdW5jdGlvbihhLGMsZyxoLHIpe3ZhciBkPWE7Zz1xKGcsMSk7dmFyIE09YS9nO2N8fChjPXI/WzEsMS4yLDEuNSwyLDIuNSwzLDQsNSw2LDgsMTBdOlsxLDIsMi41LDUsMTBdLCExPT09aCYmKDE9PT1nP2M9Yy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIDA9PT1hJTF9KTouMT49ZyYmKGM9WzEvZ10pKSk7Zm9yKGg9MDtoPGMubGVuZ3RoJiYhKGQ9Y1toXSxyJiZkKmc+PWF8fCFyJiZNPD0oY1toXSsoY1toKzFdfHxjW2hdKSkvMik7aCsrKTtyZXR1cm4gZD1OKGQqZywtTWF0aC5yb3VuZChNYXRoLmxvZyguMDAxKS9cbk1hdGguTE4xMCkpfSxvYmplY3RFYWNoOm4sb2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBoPWMuZG9jdW1lbnRFbGVtZW50O2E9YS5wYXJlbnRFbGVtZW50fHxhLnBhcmVudE5vZGU/YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTp7dG9wOjAsbGVmdDowLHdpZHRoOjAsaGVpZ2h0OjB9O3JldHVybnt0b3A6YS50b3ArKGcucGFnZVlPZmZzZXR8fGguc2Nyb2xsVG9wKS0oaC5jbGllbnRUb3B8fDApLGxlZnQ6YS5sZWZ0KyhnLnBhZ2VYT2Zmc2V0fHxoLnNjcm9sbExlZnQpLShoLmNsaWVudExlZnR8fDApLHdpZHRoOmEud2lkdGgsaGVpZ2h0OmEuaGVpZ2h0fX0scGFkOmZ1bmN0aW9uKGEsYyxnKXtyZXR1cm4gQXJyYXkoKGN8fDIpKzEtU3RyaW5nKGEpLnJlcGxhY2UoXCItXCIsXCJcIikubGVuZ3RoKS5qb2luKGd8fFwiMFwiKSthfSxwaWNrOnEscEludDp6LHJlbGF0aXZlTGVuZ3RoOmZ1bmN0aW9uKGEsYyxnKXtyZXR1cm4vJSQvLnRlc3QoYSk/YypwYXJzZUZsb2F0KGEpLzEwMCsoZ3x8MCk6cGFyc2VGbG9hdChhKX0sXG5yZW1vdmVFdmVudDpKLHNwbGF0OmZ1bmN0aW9uKGEpe3JldHVybiBHKGEpP2E6W2FdfSxzdGFibGVTb3J0OmZ1bmN0aW9uKGEsYyl7dmFyIGc9YS5sZW5ndGgsaCxyO2ZvcihyPTA7cjxnO3IrKylhW3JdLnNhZmVJPXI7YS5zb3J0KGZ1bmN0aW9uKGEsZyl7aD1jKGEsZyk7cmV0dXJuIDA9PT1oP2Euc2FmZUktZy5zYWZlSTpofSk7Zm9yKHI9MDtyPGc7cisrKWRlbGV0ZSBhW3JdLnNhZmVJfSxzeW5jVGltZW91dDpmdW5jdGlvbihhLGMsZyl7aWYoMDxjKXJldHVybiBzZXRUaW1lb3V0KGEsYyxnKTthLmNhbGwoMCxnKTtyZXR1cm4tMX0sdGltZVVuaXRzOnttaWxsaXNlY29uZDoxLHNlY29uZDoxRTMsbWludXRlOjZFNCxob3VyOjM2RTUsZGF5Ojg2NEU1LHdlZWs6NjA0OEU1LG1vbnRoOjI0MTkyRTUseWVhcjozMTQ0OTZFNX0sdW5pcXVlS2V5OkEsdXNlU2VyaWFsSWRzOmZ1bmN0aW9uKGEpe3JldHVybiByPXEoYSxyKX0sd3JhcDpmdW5jdGlvbihhLGMsZyl7dmFyIGg9YVtjXTthW2NdPVxuZnVuY3Rpb24oKXt2YXIgYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLGM9YXJndW1lbnRzLHI9dGhpcztyLnByb2NlZWQ9ZnVuY3Rpb24oKXtoLmFwcGx5KHIsYXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHM6Yyl9O2EudW5zaGlmdChoKTthPWcuYXBwbHkodGhpcyxhKTtyLnByb2NlZWQ9bnVsbDtyZXR1cm4gYX19fX0pO08oZSxcIkNvcmUvQ29sb3IvQ29sb3IuanNcIixbZVtcIkNvcmUvR2xvYmFscy5qc1wiXSxlW1wiQ29yZS9VdGlsaXRpZXMuanNcIl1dLGZ1bmN0aW9uKEQsYil7dmFyIGU9Yi5pc051bWJlcix6PWIubWVyZ2UsSD1iLnBJbnQ7XCJcIjtiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihlKXt0aGlzLnBhcnNlcnM9W3tyZWdleDovcmdiYVxcKFxccyooWzAtOV17MSwzfSlcXHMqLFxccyooWzAtOV17MSwzfSlcXHMqLFxccyooWzAtOV17MSwzfSlcXHMqLFxccyooWzAtOV0/KD86XFwuWzAtOV0rKT8pXFxzKlxcKS8scGFyc2U6ZnVuY3Rpb24oYil7cmV0dXJuW0goYlsxXSksSChiWzJdKSxcbkgoYlszXSkscGFyc2VGbG9hdChiWzRdLDEwKV19fSx7cmVnZXg6L3JnYlxcKFxccyooWzAtOV17MSwzfSlcXHMqLFxccyooWzAtOV17MSwzfSlcXHMqLFxccyooWzAtOV17MSwzfSlcXHMqXFwpLyxwYXJzZTpmdW5jdGlvbihiKXtyZXR1cm5bSChiWzFdKSxIKGJbMl0pLEgoYlszXSksMV19fV07dGhpcy5yZ2JhPVtdO2lmKEQuQ29sb3IhPT1iKXJldHVybiBuZXcgRC5Db2xvcihlKTtpZighKHRoaXMgaW5zdGFuY2VvZiBiKSlyZXR1cm4gbmV3IGIoZSk7dGhpcy5pbml0KGUpfWIucGFyc2U9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBiKGUpfTtiLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGUpe3ZhciBCLHg7aWYoKHRoaXMuaW5wdXQ9ZT1iLm5hbWVzW2UmJmUudG9Mb3dlckNhc2U/ZS50b0xvd2VyQ2FzZSgpOlwiXCJdfHxlKSYmZS5zdG9wcyl0aGlzLnN0b3BzPWUuc3RvcHMubWFwKGZ1bmN0aW9uKGYpe3JldHVybiBuZXcgYihmWzFdKX0pO2Vsc2V7aWYoZSYmZS5jaGFyQXQmJlwiI1wiPT09ZS5jaGFyQXQoKSl7dmFyIHc9XG5lLmxlbmd0aDtlPXBhcnNlSW50KGUuc3Vic3RyKDEpLDE2KTs3PT09dz9CPVsoZSYxNjcxMTY4MCk+PjE2LChlJjY1MjgwKT4+OCxlJjI1NSwxXTo0PT09dyYmKEI9WyhlJjM4NDApPj40fChlJjM4NDApPj44LChlJjI0MCk+PjR8ZSYyNDAsKGUmMTUpPDw0fGUmMTUsMV0pfWlmKCFCKWZvcih4PXRoaXMucGFyc2Vycy5sZW5ndGg7eC0tJiYhQjspe3ZhciB2PXRoaXMucGFyc2Vyc1t4XTsodz12LnJlZ2V4LmV4ZWMoZSkpJiYoQj12LnBhcnNlKHcpKX19dGhpcy5yZ2JhPUJ8fFtdfTtiLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oYil7dmFyIEI9dGhpcy5pbnB1dCx4PXRoaXMucmdiYTtpZihcInVuZGVmaW5lZFwiIT09dHlwZW9mIHRoaXMuc3RvcHMpe3ZhciB3PXooQik7dy5zdG9wcz1bXS5jb25jYXQody5zdG9wcyk7dGhpcy5zdG9wcy5mb3JFYWNoKGZ1bmN0aW9uKHYsZil7dy5zdG9wc1tmXT1bdy5zdG9wc1tmXVswXSx2LmdldChiKV19KX1lbHNlIHc9eCYmZSh4WzBdKT9cInJnYlwiPT09XG5ifHwhYiYmMT09PXhbM10/XCJyZ2IoXCIreFswXStcIixcIit4WzFdK1wiLFwiK3hbMl0rXCIpXCI6XCJhXCI9PT1iP3hbM106XCJyZ2JhKFwiK3guam9pbihcIixcIikrXCIpXCI6QjtyZXR1cm4gd307Yi5wcm90b3R5cGUuYnJpZ2h0ZW49ZnVuY3Rpb24oYil7dmFyIEIseD10aGlzLnJnYmE7aWYodGhpcy5zdG9wcyl0aGlzLnN0b3BzLmZvckVhY2goZnVuY3Rpb24odyl7dy5icmlnaHRlbihiKX0pO2Vsc2UgaWYoZShiKSYmMCE9PWIpZm9yKEI9MDszPkI7QisrKXhbQl0rPUgoMjU1KmIpLDA+eFtCXSYmKHhbQl09MCksMjU1PHhbQl0mJih4W0JdPTI1NSk7cmV0dXJuIHRoaXN9O2IucHJvdG90eXBlLnNldE9wYWNpdHk9ZnVuY3Rpb24oYil7dGhpcy5yZ2JhWzNdPWI7cmV0dXJuIHRoaXN9O2IucHJvdG90eXBlLnR3ZWVuVG89ZnVuY3Rpb24oYixlKXt2YXIgeD10aGlzLnJnYmEsdz1iLnJnYmE7dy5sZW5ndGgmJngmJngubGVuZ3RoPyhiPTEhPT13WzNdfHwxIT09eFszXSxlPShiP1wicmdiYShcIjpcInJnYihcIikrTWF0aC5yb3VuZCh3WzBdK1xuKHhbMF0td1swXSkqKDEtZSkpK1wiLFwiK01hdGgucm91bmQod1sxXSsoeFsxXS13WzFdKSooMS1lKSkrXCIsXCIrTWF0aC5yb3VuZCh3WzJdKyh4WzJdLXdbMl0pKigxLWUpKSsoYj9cIixcIisod1szXSsoeFszXS13WzNdKSooMS1lKSk6XCJcIikrXCIpXCIpOmU9Yi5pbnB1dHx8XCJub25lXCI7cmV0dXJuIGV9O2IubmFtZXM9e3doaXRlOlwiI2ZmZmZmZlwiLGJsYWNrOlwiIzAwMDAwMFwifTtyZXR1cm4gYn0oKTtELkNvbG9yPWI7RC5jb2xvcj1iLnBhcnNlO3JldHVybiBifSk7TyhlLFwiQ29yZS9Db2xvci9QYWxldHRlLmpzXCIsW10sZnVuY3Rpb24oKXtyZXR1cm57Y29sb3JzOlwiIzdjYjVlYyAjNDM0MzQ4ICM5MGVkN2QgI2Y3YTM1YyAjODA4NWU5ICNmMTVjODAgI2U0ZDM1NCAjMmI5MDhmICNmNDViNWIgIzkxZThlMVwiLnNwbGl0KFwiIFwiKSxiYWNrZ3JvdW5kQ29sb3I6XCIjZmZmZmZmXCIsbmV1dHJhbENvbG9yMTAwOlwiIzAwMDAwMFwiLG5ldXRyYWxDb2xvcjgwOlwiIzMzMzMzM1wiLG5ldXRyYWxDb2xvcjYwOlwiIzY2NjY2NlwiLFxubmV1dHJhbENvbG9yNDA6XCIjOTk5OTk5XCIsbmV1dHJhbENvbG9yMjA6XCIjY2NjY2NjXCIsbmV1dHJhbENvbG9yMTA6XCIjZTZlNmU2XCIsbmV1dHJhbENvbG9yNTpcIiNmMmYyZjJcIixuZXV0cmFsQ29sb3IzOlwiI2Y3ZjdmN1wiLGhpZ2hsaWdodENvbG9yMTAwOlwiIzAwMzM5OVwiLGhpZ2hsaWdodENvbG9yODA6XCIjMzM1Y2FkXCIsaGlnaGxpZ2h0Q29sb3I2MDpcIiM2Njg1YzJcIixoaWdobGlnaHRDb2xvcjIwOlwiI2NjZDZlYlwiLGhpZ2hsaWdodENvbG9yMTA6XCIjZTZlYmY1XCIscG9zaXRpdmVDb2xvcjpcIiMwNmI1MzVcIixuZWdhdGl2ZUNvbG9yOlwiI2YyMTMxM1wifX0pO08oZSxcIkNvcmUvVGltZS5qc1wiLFtlW1wiQ29yZS9HbG9iYWxzLmpzXCJdLGVbXCJDb3JlL1V0aWxpdGllcy5qc1wiXV0sZnVuY3Rpb24oZSxiKXt2YXIgRD1lLndpbix6PWIuZGVmaW5lZCxIPWIuZXJyb3IsRz1iLmV4dGVuZCxDPWIuaXNPYmplY3QsQj1iLm1lcmdlLHg9Yi5vYmplY3RFYWNoLHc9Yi5wYWQsdj1iLnBpY2ssZj1iLnNwbGF0LGQ9XG5iLnRpbWVVbml0cztcIlwiO2I9ZnVuY3Rpb24oKXtmdW5jdGlvbiBxKGQpe3RoaXMub3B0aW9ucz17fTt0aGlzLnZhcmlhYmxlVGltZXpvbmU9dGhpcy51c2VVVEM9ITE7dGhpcy5EYXRlPUQuRGF0ZTt0aGlzLmdldFRpbWV6b25lT2Zmc2V0PXRoaXMudGltZXpvbmVPZmZzZXRGdW5jdGlvbigpO3RoaXMudXBkYXRlKGQpfXEucHJvdG90eXBlLmdldD1mdW5jdGlvbihkLGwpe2lmKHRoaXMudmFyaWFibGVUaW1lem9uZXx8dGhpcy50aW1lem9uZU9mZnNldCl7dmFyIGs9bC5nZXRUaW1lKCksdT1rLXRoaXMuZ2V0VGltZXpvbmVPZmZzZXQobCk7bC5zZXRUaW1lKHUpO2Q9bFtcImdldFVUQ1wiK2RdKCk7bC5zZXRUaW1lKGspO3JldHVybiBkfXJldHVybiB0aGlzLnVzZVVUQz9sW1wiZ2V0VVRDXCIrZF0oKTpsW1wiZ2V0XCIrZF0oKX07cS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKGQsbCxmKXtpZih0aGlzLnZhcmlhYmxlVGltZXpvbmV8fHRoaXMudGltZXpvbmVPZmZzZXQpe2lmKFwiTWlsbGlzZWNvbmRzXCI9PT1cbmR8fFwiU2Vjb25kc1wiPT09ZHx8XCJNaW51dGVzXCI9PT1kJiYwPT09dGhpcy5nZXRUaW1lem9uZU9mZnNldChsKSUzNkU1KXJldHVybiBsW1wic2V0VVRDXCIrZF0oZik7dmFyIHU9dGhpcy5nZXRUaW1lem9uZU9mZnNldChsKTt1PWwuZ2V0VGltZSgpLXU7bC5zZXRUaW1lKHUpO2xbXCJzZXRVVENcIitkXShmKTtkPXRoaXMuZ2V0VGltZXpvbmVPZmZzZXQobCk7dT1sLmdldFRpbWUoKStkO3JldHVybiBsLnNldFRpbWUodSl9cmV0dXJuIHRoaXMudXNlVVRDP2xbXCJzZXRVVENcIitkXShmKTpsW1wic2V0XCIrZF0oZil9O3EucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihkKXt2YXIgbD12KGQmJmQudXNlVVRDLCEwKTt0aGlzLm9wdGlvbnM9ZD1CKCEwLHRoaXMub3B0aW9uc3x8e30sZCk7dGhpcy5EYXRlPWQuRGF0ZXx8RC5EYXRlfHxEYXRlO3RoaXMudGltZXpvbmVPZmZzZXQ9KHRoaXMudXNlVVRDPWwpJiZkLnRpbWV6b25lT2Zmc2V0O3RoaXMuZ2V0VGltZXpvbmVPZmZzZXQ9dGhpcy50aW1lem9uZU9mZnNldEZ1bmN0aW9uKCk7XG50aGlzLnZhcmlhYmxlVGltZXpvbmU9bCYmISghZC5nZXRUaW1lem9uZU9mZnNldCYmIWQudGltZXpvbmUpfTtxLnByb3RvdHlwZS5tYWtlVGltZT1mdW5jdGlvbihkLGwsZix1LG4scSl7aWYodGhpcy51c2VVVEMpe3ZhciBrPXRoaXMuRGF0ZS5VVEMuYXBwbHkoMCxhcmd1bWVudHMpO3ZhciBtPXRoaXMuZ2V0VGltZXpvbmVPZmZzZXQoayk7ays9bTt2YXIgYz10aGlzLmdldFRpbWV6b25lT2Zmc2V0KGspO20hPT1jP2srPWMtbTptLTM2RTUhPT10aGlzLmdldFRpbWV6b25lT2Zmc2V0KGstMzZFNSl8fGUuaXNTYWZhcml8fChrLT0zNkU1KX1lbHNlIGs9KG5ldyB0aGlzLkRhdGUoZCxsLHYoZiwxKSx2KHUsMCksdihuLDApLHYocSwwKSkpLmdldFRpbWUoKTtyZXR1cm4ga307cS5wcm90b3R5cGUudGltZXpvbmVPZmZzZXRGdW5jdGlvbj1mdW5jdGlvbigpe3ZhciBkPXRoaXMsbD10aGlzLm9wdGlvbnMsZj1sLm1vbWVudHx8RC5tb21lbnQ7aWYoIXRoaXMudXNlVVRDKXJldHVybiBmdW5jdGlvbihkKXtyZXR1cm4gNkU0KlxuKG5ldyBEYXRlKGQudG9TdHJpbmcoKSkpLmdldFRpbWV6b25lT2Zmc2V0KCl9O2lmKGwudGltZXpvbmUpe2lmKGYpcmV0dXJuIGZ1bmN0aW9uKGQpe3JldHVybiA2RTQqLWYudHooZCxsLnRpbWV6b25lKS51dGNPZmZzZXQoKX07SCgyNSl9cmV0dXJuIHRoaXMudXNlVVRDJiZsLmdldFRpbWV6b25lT2Zmc2V0P2Z1bmN0aW9uKGQpe3JldHVybiA2RTQqbC5nZXRUaW1lem9uZU9mZnNldChkLnZhbHVlT2YoKSl9OmZ1bmN0aW9uKCl7cmV0dXJuIDZFNCooZC50aW1lem9uZU9mZnNldHx8MCl9fTtxLnByb3RvdHlwZS5kYXRlRm9ybWF0PWZ1bmN0aW9uKGQsZixxKXtpZigheihmKXx8aXNOYU4oZikpcmV0dXJuIGUuZGVmYXVsdE9wdGlvbnMubGFuZyYmZS5kZWZhdWx0T3B0aW9ucy5sYW5nLmludmFsaWREYXRlfHxcIlwiO2Q9dihkLFwiJVktJW0tJWQgJUg6JU06JVNcIik7dmFyIGw9dGhpcyxuPW5ldyB0aGlzLkRhdGUoZiksaz10aGlzLmdldChcIkhvdXJzXCIsbiksTj10aGlzLmdldChcIkRheVwiLG4pLFxubT10aGlzLmdldChcIkRhdGVcIixuKSxjPXRoaXMuZ2V0KFwiTW9udGhcIixuKSxnPXRoaXMuZ2V0KFwiRnVsbFllYXJcIixuKSxhPWUuZGVmYXVsdE9wdGlvbnMubGFuZyxoPWEmJmEud2Vla2RheXMscj1hJiZhLnNob3J0V2Vla2RheXM7bj1HKHthOnI/cltOXTpoW05dLnN1YnN0cigwLDMpLEE6aFtOXSxkOncobSksZTp3KG0sMixcIiBcIiksdzpOLGI6YS5zaG9ydE1vbnRoc1tjXSxCOmEubW9udGhzW2NdLG06dyhjKzEpLG86YysxLHk6Zy50b1N0cmluZygpLnN1YnN0cigyLDIpLFk6ZyxIOncoayksazprLEk6dyhrJTEyfHwxMiksbDprJTEyfHwxMixNOncodGhpcy5nZXQoXCJNaW51dGVzXCIsbikpLHA6MTI+az9cIkFNXCI6XCJQTVwiLFA6MTI+az9cImFtXCI6XCJwbVwiLFM6dyhuLmdldFNlY29uZHMoKSksTDp3KE1hdGguZmxvb3IoZiUxRTMpLDMpfSxlLmRhdGVGb3JtYXRzKTt4KG4sZnVuY3Rpb24oYSxjKXtmb3IoOy0xIT09ZC5pbmRleE9mKFwiJVwiK2MpOylkPWQucmVwbGFjZShcIiVcIitjLFwiZnVuY3Rpb25cIj09PVxudHlwZW9mIGE/YS5jYWxsKGwsZik6YSl9KTtyZXR1cm4gcT9kLnN1YnN0cigwLDEpLnRvVXBwZXJDYXNlKCkrZC5zdWJzdHIoMSk6ZH07cS5wcm90b3R5cGUucmVzb2x2ZURUTEZvcm1hdD1mdW5jdGlvbihkKXtyZXR1cm4gQyhkLCEwKT9kOihkPWYoZCkse21haW46ZFswXSxmcm9tOmRbMV0sdG86ZFsyXX0pfTtxLnByb3RvdHlwZS5nZXRUaW1lVGlja3M9ZnVuY3Rpb24oZixsLHEsdSl7dmFyIG49dGhpcyxrPVtdLE49e307dmFyIG09bmV3IG4uRGF0ZShsKTt2YXIgYz1mLnVuaXRSYW5nZSxnPWYuY291bnR8fDEsYTt1PXYodSwxKTtpZih6KGwpKXtuLnNldChcIk1pbGxpc2Vjb25kc1wiLG0sYz49ZC5zZWNvbmQ/MDpnKk1hdGguZmxvb3Iobi5nZXQoXCJNaWxsaXNlY29uZHNcIixtKS9nKSk7Yz49ZC5zZWNvbmQmJm4uc2V0KFwiU2Vjb25kc1wiLG0sYz49ZC5taW51dGU/MDpnKk1hdGguZmxvb3Iobi5nZXQoXCJTZWNvbmRzXCIsbSkvZykpO2M+PWQubWludXRlJiZuLnNldChcIk1pbnV0ZXNcIixtLFxuYz49ZC5ob3VyPzA6ZypNYXRoLmZsb29yKG4uZ2V0KFwiTWludXRlc1wiLG0pL2cpKTtjPj1kLmhvdXImJm4uc2V0KFwiSG91cnNcIixtLGM+PWQuZGF5PzA6ZypNYXRoLmZsb29yKG4uZ2V0KFwiSG91cnNcIixtKS9nKSk7Yz49ZC5kYXkmJm4uc2V0KFwiRGF0ZVwiLG0sYz49ZC5tb250aD8xOk1hdGgubWF4KDEsZypNYXRoLmZsb29yKG4uZ2V0KFwiRGF0ZVwiLG0pL2cpKSk7aWYoYz49ZC5tb250aCl7bi5zZXQoXCJNb250aFwiLG0sYz49ZC55ZWFyPzA6ZypNYXRoLmZsb29yKG4uZ2V0KFwiTW9udGhcIixtKS9nKSk7dmFyIGg9bi5nZXQoXCJGdWxsWWVhclwiLG0pfWM+PWQueWVhciYmbi5zZXQoXCJGdWxsWWVhclwiLG0saC1oJWcpO2M9PT1kLndlZWsmJihoPW4uZ2V0KFwiRGF5XCIsbSksbi5zZXQoXCJEYXRlXCIsbSxuLmdldChcIkRhdGVcIixtKS1oK3UrKGg8dT8tNzowKSkpO2g9bi5nZXQoXCJGdWxsWWVhclwiLG0pO3U9bi5nZXQoXCJNb250aFwiLG0pO3ZhciByPW4uZ2V0KFwiRGF0ZVwiLG0pLEE9bi5nZXQoXCJIb3Vyc1wiLG0pO1xubD1tLmdldFRpbWUoKTshbi52YXJpYWJsZVRpbWV6b25lJiZuLnVzZVVUQ3x8IXoocSl8fChhPXEtbD40KmQubW9udGh8fG4uZ2V0VGltZXpvbmVPZmZzZXQobCkhPT1uLmdldFRpbWV6b25lT2Zmc2V0KHEpKTtsPW0uZ2V0VGltZSgpO2ZvcihtPTE7bDxxOylrLnB1c2gobCksbD1jPT09ZC55ZWFyP24ubWFrZVRpbWUoaCttKmcsMCk6Yz09PWQubW9udGg/bi5tYWtlVGltZShoLHUrbSpnKTohYXx8YyE9PWQuZGF5JiZjIT09ZC53ZWVrP2EmJmM9PT1kLmhvdXImJjE8Zz9uLm1ha2VUaW1lKGgsdSxyLEErbSpnKTpsK2MqZzpuLm1ha2VUaW1lKGgsdSxyK20qZyooYz09PWQuZGF5PzE6NykpLG0rKztrLnB1c2gobCk7Yzw9ZC5ob3VyJiYxRTQ+ay5sZW5ndGgmJmsuZm9yRWFjaChmdW5jdGlvbihhKXswPT09YSUxOEU1JiZcIjAwMDAwMDAwMFwiPT09bi5kYXRlRm9ybWF0KFwiJUglTSVTJUxcIixhKSYmKE5bYV09XCJkYXlcIil9KX1rLmluZm89RyhmLHtoaWdoZXJSYW5rczpOLHRvdGFsUmFuZ2U6Yypcbmd9KTtyZXR1cm4ga307cmV0dXJuIHF9KCk7ZS5UaW1lPWI7cmV0dXJuIGUuVGltZX0pO08oZSxcIkNvcmUvT3B0aW9ucy5qc1wiLFtlW1wiQ29yZS9HbG9iYWxzLmpzXCJdLGVbXCJDb3JlL0NvbG9yL0NvbG9yLmpzXCJdLGVbXCJDb3JlL0NvbG9yL1BhbGV0dGUuanNcIl0sZVtcIkNvcmUvVGltZS5qc1wiXSxlW1wiQ29yZS9VdGlsaXRpZXMuanNcIl1dLGZ1bmN0aW9uKGUsYixJLHosSCl7dmFyIEQ9ZS5pc1RvdWNoRGV2aWNlLEM9ZS5zdmc7Yj1iLnBhcnNlO3ZhciBCPUgubWVyZ2U7XCJcIjt2YXIgeD17Y29sb3JzOkkuY29sb3JzLHN5bWJvbHM6W1wiY2lyY2xlXCIsXCJkaWFtb25kXCIsXCJzcXVhcmVcIixcInRyaWFuZ2xlXCIsXCJ0cmlhbmdsZS1kb3duXCJdLGxhbmc6e2xvYWRpbmc6XCJMb2FkaW5nLi4uXCIsbW9udGhzOlwiSmFudWFyeSBGZWJydWFyeSBNYXJjaCBBcHJpbCBNYXkgSnVuZSBKdWx5IEF1Z3VzdCBTZXB0ZW1iZXIgT2N0b2JlciBOb3ZlbWJlciBEZWNlbWJlclwiLnNwbGl0KFwiIFwiKSxzaG9ydE1vbnRoczpcIkphbiBGZWIgTWFyIEFwciBNYXkgSnVuIEp1bCBBdWcgU2VwIE9jdCBOb3YgRGVjXCIuc3BsaXQoXCIgXCIpLFxud2Vla2RheXM6XCJTdW5kYXkgTW9uZGF5IFR1ZXNkYXkgV2VkbmVzZGF5IFRodXJzZGF5IEZyaWRheSBTYXR1cmRheVwiLnNwbGl0KFwiIFwiKSxkZWNpbWFsUG9pbnQ6XCIuXCIsbnVtZXJpY1N5bWJvbHM6XCJrTUdUUEVcIi5zcGxpdChcIlwiKSxyZXNldFpvb206XCJSZXNldCB6b29tXCIscmVzZXRab29tVGl0bGU6XCJSZXNldCB6b29tIGxldmVsIDE6MVwiLHRob3VzYW5kc1NlcDpcIiBcIn0sZ2xvYmFsOnt9LHRpbWU6e0RhdGU6dm9pZCAwLGdldFRpbWV6b25lT2Zmc2V0OnZvaWQgMCx0aW1lem9uZTp2b2lkIDAsdGltZXpvbmVPZmZzZXQ6MCx1c2VVVEM6ITB9LGNoYXJ0OntwYW5uaW5nOntlbmFibGVkOiExLHR5cGU6XCJ4XCJ9LHN0eWxlZE1vZGU6ITEsYm9yZGVyUmFkaXVzOjAsY29sb3JDb3VudDoxMCxkZWZhdWx0U2VyaWVzVHlwZTpcImxpbmVcIixpZ25vcmVIaWRkZW5TZXJpZXM6ITAsc3BhY2luZzpbMTAsMTAsMTUsMTBdLHJlc2V0Wm9vbUJ1dHRvbjp7dGhlbWU6e3pJbmRleDo2fSxwb3NpdGlvbjp7YWxpZ246XCJyaWdodFwiLFxueDotMTAseToxMH19LHpvb21CeVNpbmdsZVRvdWNoOiExLHdpZHRoOm51bGwsaGVpZ2h0Om51bGwsYm9yZGVyQ29sb3I6SS5oaWdobGlnaHRDb2xvcjgwLGJhY2tncm91bmRDb2xvcjpJLmJhY2tncm91bmRDb2xvcixwbG90Qm9yZGVyQ29sb3I6SS5uZXV0cmFsQ29sb3IyMH0sdGl0bGU6e3RleHQ6XCJDaGFydCB0aXRsZVwiLGFsaWduOlwiY2VudGVyXCIsbWFyZ2luOjE1LHdpZHRoQWRqdXN0Oi00NH0sc3VidGl0bGU6e3RleHQ6XCJcIixhbGlnbjpcImNlbnRlclwiLHdpZHRoQWRqdXN0Oi00NH0sY2FwdGlvbjp7bWFyZ2luOjE1LHRleHQ6XCJcIixhbGlnbjpcImxlZnRcIix2ZXJ0aWNhbEFsaWduOlwiYm90dG9tXCJ9LHBsb3RPcHRpb25zOnt9LGxhYmVsczp7c3R5bGU6e3Bvc2l0aW9uOlwiYWJzb2x1dGVcIixjb2xvcjpJLm5ldXRyYWxDb2xvcjgwfX0sbGVnZW5kOntlbmFibGVkOiEwLGFsaWduOlwiY2VudGVyXCIsYWxpZ25Db2x1bW5zOiEwLGxheW91dDpcImhvcml6b250YWxcIixsYWJlbEZvcm1hdHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5hbWV9LFxuYm9yZGVyQ29sb3I6SS5uZXV0cmFsQ29sb3I0MCxib3JkZXJSYWRpdXM6MCxuYXZpZ2F0aW9uOnthY3RpdmVDb2xvcjpJLmhpZ2hsaWdodENvbG9yMTAwLGluYWN0aXZlQ29sb3I6SS5uZXV0cmFsQ29sb3IyMH0saXRlbVN0eWxlOntjb2xvcjpJLm5ldXRyYWxDb2xvcjgwLGN1cnNvcjpcInBvaW50ZXJcIixmb250U2l6ZTpcIjEycHhcIixmb250V2VpZ2h0OlwiYm9sZFwiLHRleHRPdmVyZmxvdzpcImVsbGlwc2lzXCJ9LGl0ZW1Ib3ZlclN0eWxlOntjb2xvcjpJLm5ldXRyYWxDb2xvcjEwMH0saXRlbUhpZGRlblN0eWxlOntjb2xvcjpJLm5ldXRyYWxDb2xvcjIwfSxzaGFkb3c6ITEsaXRlbUNoZWNrYm94U3R5bGU6e3Bvc2l0aW9uOlwiYWJzb2x1dGVcIix3aWR0aDpcIjEzcHhcIixoZWlnaHQ6XCIxM3B4XCJ9LHNxdWFyZVN5bWJvbDohMCxzeW1ib2xQYWRkaW5nOjUsdmVydGljYWxBbGlnbjpcImJvdHRvbVwiLHg6MCx5OjAsdGl0bGU6e3N0eWxlOntmb250V2VpZ2h0OlwiYm9sZFwifX19LGxvYWRpbmc6e2xhYmVsU3R5bGU6e2ZvbnRXZWlnaHQ6XCJib2xkXCIsXG5wb3NpdGlvbjpcInJlbGF0aXZlXCIsdG9wOlwiNDUlXCJ9LHN0eWxlOntwb3NpdGlvbjpcImFic29sdXRlXCIsYmFja2dyb3VuZENvbG9yOkkuYmFja2dyb3VuZENvbG9yLG9wYWNpdHk6LjUsdGV4dEFsaWduOlwiY2VudGVyXCJ9fSx0b29sdGlwOntlbmFibGVkOiEwLGFuaW1hdGlvbjpDLGJvcmRlclJhZGl1czozLGRhdGVUaW1lTGFiZWxGb3JtYXRzOnttaWxsaXNlY29uZDpcIiVBLCAlYiAlZSwgJUg6JU06JVMuJUxcIixzZWNvbmQ6XCIlQSwgJWIgJWUsICVIOiVNOiVTXCIsbWludXRlOlwiJUEsICViICVlLCAlSDolTVwiLGhvdXI6XCIlQSwgJWIgJWUsICVIOiVNXCIsZGF5OlwiJUEsICViICVlLCAlWVwiLHdlZWs6XCJXZWVrIGZyb20gJUEsICViICVlLCAlWVwiLG1vbnRoOlwiJUIgJVlcIix5ZWFyOlwiJVlcIn0sZm9vdGVyRm9ybWF0OlwiXCIscGFkZGluZzo4LHNuYXA6RD8yNToxMCxoZWFkZXJGb3JtYXQ6JzxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxMHB4XCI+e3BvaW50LmtleX08L3NwYW4+PGJyLz4nLHBvaW50Rm9ybWF0Oic8c3BhbiBzdHlsZT1cImNvbG9yOntwb2ludC5jb2xvcn1cIj5cXHUyNWNmPC9zcGFuPiB7c2VyaWVzLm5hbWV9OiA8Yj57cG9pbnQueX08L2I+PGJyLz4nLFxuYmFja2dyb3VuZENvbG9yOmIoSS5uZXV0cmFsQ29sb3IzKS5zZXRPcGFjaXR5KC44NSkuZ2V0KCksYm9yZGVyV2lkdGg6MSxzaGFkb3c6ITAsc3R5bGU6e2NvbG9yOkkubmV1dHJhbENvbG9yODAsY3Vyc29yOlwiZGVmYXVsdFwiLGZvbnRTaXplOlwiMTJweFwiLHdoaXRlU3BhY2U6XCJub3dyYXBcIn19LGNyZWRpdHM6e2VuYWJsZWQ6ITAsaHJlZjpcImh0dHBzOi8vd3d3LmhpZ2hjaGFydHMuY29tP2NyZWRpdHNcIixwb3NpdGlvbjp7YWxpZ246XCJyaWdodFwiLHg6LTEwLHZlcnRpY2FsQWxpZ246XCJib3R0b21cIix5Oi01fSxzdHlsZTp7Y3Vyc29yOlwicG9pbnRlclwiLGNvbG9yOkkubmV1dHJhbENvbG9yNDAsZm9udFNpemU6XCI5cHhcIn0sdGV4dDpcIkhpZ2hjaGFydHMuY29tXCJ9fTt4LmNoYXJ0LnN0eWxlZE1vZGU9ITE7XCJcIjt2YXIgdz1uZXcgeihCKHguZ2xvYmFsLHgudGltZSkpO3JldHVybntkZWZhdWx0T3B0aW9uczp4LGRlZmF1bHRUaW1lOncsZ2V0T3B0aW9uczpmdW5jdGlvbigpe3JldHVybiB4fSxcbnNldE9wdGlvbnM6ZnVuY3Rpb24odil7QighMCx4LHYpO2lmKHYudGltZXx8di5nbG9iYWwpZS50aW1lP2UudGltZS51cGRhdGUoQih4Lmdsb2JhbCx4LnRpbWUsdi5nbG9iYWwsdi50aW1lKSk6ZS50aW1lPXc7cmV0dXJuIHh9fX0pO08oZSxcIkNvcmUvQW5pbWF0aW9uL0Z4LmpzXCIsW2VbXCJDb3JlL0NvbG9yL0NvbG9yLmpzXCJdLGVbXCJDb3JlL0dsb2JhbHMuanNcIl0sZVtcIkNvcmUvVXRpbGl0aWVzLmpzXCJdXSxmdW5jdGlvbihlLGIsSSl7dmFyIEQ9ZS5wYXJzZSxIPWIud2luLEc9SS5pc051bWJlcixDPUkub2JqZWN0RWFjaDtyZXR1cm4gZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsdyx2KXt0aGlzLnBvcz1OYU47dGhpcy5vcHRpb25zPXc7dGhpcy5lbGVtPWI7dGhpcy5wcm9wPXZ9Yi5wcm90b3R5cGUuZFNldHRlcj1mdW5jdGlvbigpe3ZhciBiPXRoaXMucGF0aHMsdz1iJiZiWzBdO2I9YiYmYlsxXTt2YXIgdj10aGlzLm5vd3x8MCxmPVtdO2lmKDEhPT12JiZ3JiZiKWlmKHcubGVuZ3RoPT09XG5iLmxlbmd0aCYmMT52KWZvcih2YXIgZD0wO2Q8Yi5sZW5ndGg7ZCsrKXtmb3IodmFyIHE9d1tkXSxrPWJbZF0sbD1bXSxOPTA7TjxrLmxlbmd0aDtOKyspe3ZhciB1PXFbTl0sbj1rW05dO0codSkmJkcobikmJihcIkFcIiE9PWtbMF18fDQhPT1OJiY1IT09Tik/bFtOXT11K3YqKG4tdSk6bFtOXT1ufWYucHVzaChsKX1lbHNlIGY9YjtlbHNlIGY9dGhpcy50b0R8fFtdO3RoaXMuZWxlbS5hdHRyKFwiZFwiLGYsdm9pZCAwLCEwKX07Yi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5lbGVtLHc9dGhpcy5wcm9wLHY9dGhpcy5ub3csZj10aGlzLm9wdGlvbnMuc3RlcDtpZih0aGlzW3crXCJTZXR0ZXJcIl0pdGhpc1t3K1wiU2V0dGVyXCJdKCk7ZWxzZSBiLmF0dHI/Yi5lbGVtZW50JiZiLmF0dHIodyx2LG51bGwsITApOmIuc3R5bGVbd109dit0aGlzLnVuaXQ7ZiYmZi5jYWxsKGIsdix0aGlzKX07Yi5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKGUsdyx2KXt2YXIgZj10aGlzLGQ9Zi5vcHRpb25zLFxucT1mdW5jdGlvbihkKXtyZXR1cm4gcS5zdG9wcGVkPyExOmYuc3RlcChkKX0saz1ILnJlcXVlc3RBbmltYXRpb25GcmFtZXx8ZnVuY3Rpb24oZCl7c2V0VGltZW91dChkLDEzKX0sbD1mdW5jdGlvbigpe2Zvcih2YXIgZD0wO2Q8Yi50aW1lcnMubGVuZ3RoO2QrKyliLnRpbWVyc1tkXSgpfHxiLnRpbWVycy5zcGxpY2UoZC0tLDEpO2IudGltZXJzLmxlbmd0aCYmayhsKX07ZSE9PXd8fHRoaXMuZWxlbVtcImZvcmNlQW5pbWF0ZTpcIit0aGlzLnByb3BdPyh0aGlzLnN0YXJ0VGltZT0rbmV3IERhdGUsdGhpcy5zdGFydD1lLHRoaXMuZW5kPXcsdGhpcy51bml0PXYsdGhpcy5ub3c9dGhpcy5zdGFydCx0aGlzLnBvcz0wLHEuZWxlbT10aGlzLmVsZW0scS5wcm9wPXRoaXMucHJvcCxxKCkmJjE9PT1iLnRpbWVycy5wdXNoKHEpJiZrKGwpKTooZGVsZXRlIGQuY3VyQW5pbVt0aGlzLnByb3BdLGQuY29tcGxldGUmJjA9PT1PYmplY3Qua2V5cyhkLmN1ckFuaW0pLmxlbmd0aCYmZC5jb21wbGV0ZS5jYWxsKHRoaXMuZWxlbSkpfTtcbmIucHJvdG90eXBlLnN0ZXA9ZnVuY3Rpb24oYil7dmFyIHc9K25ldyBEYXRlLHY9dGhpcy5vcHRpb25zLGY9dGhpcy5lbGVtLGQ9di5jb21wbGV0ZSxxPXYuZHVyYXRpb24saz12LmN1ckFuaW07aWYoZi5hdHRyJiYhZi5lbGVtZW50KWI9ITE7ZWxzZSBpZihifHx3Pj1xK3RoaXMuc3RhcnRUaW1lKXt0aGlzLm5vdz10aGlzLmVuZDt0aGlzLnBvcz0xO3RoaXMudXBkYXRlKCk7dmFyIGw9a1t0aGlzLnByb3BdPSEwO0MoayxmdW5jdGlvbihkKXshMCE9PWQmJihsPSExKX0pO2wmJmQmJmQuY2FsbChmKTtiPSExfWVsc2UgdGhpcy5wb3M9di5lYXNpbmcoKHctdGhpcy5zdGFydFRpbWUpL3EpLHRoaXMubm93PXRoaXMuc3RhcnQrKHRoaXMuZW5kLXRoaXMuc3RhcnQpKnRoaXMucG9zLHRoaXMudXBkYXRlKCksYj0hMDtyZXR1cm4gYn07Yi5wcm90b3R5cGUuaW5pdFBhdGg9ZnVuY3Rpb24oYix3LHYpe2Z1bmN0aW9uIGYoZCxtKXtmb3IoO2QubGVuZ3RoPEo7KXt2YXIgYz1kWzBdLGc9bVtKLVxuZC5sZW5ndGhdO2cmJlwiTVwiPT09Y1swXSYmKGRbMF09XCJDXCI9PT1nWzBdP1tcIkNcIixjWzFdLGNbMl0sY1sxXSxjWzJdLGNbMV0sY1syXV06W1wiTFwiLGNbMV0sY1syXV0pO2QudW5zaGlmdChjKTtsJiYoYz1kLnBvcCgpLGQucHVzaChkW2QubGVuZ3RoLTFdLGMpKX19ZnVuY3Rpb24gZChkLG0pe2Zvcig7ZC5sZW5ndGg8SjspaWYobT1kW01hdGguZmxvb3IoZC5sZW5ndGgvTiktMV0uc2xpY2UoKSxcIkNcIj09PW1bMF0mJihtWzFdPW1bNV0sbVsyXT1tWzZdKSxsKXt2YXIgYz1kW01hdGguZmxvb3IoZC5sZW5ndGgvTildLnNsaWNlKCk7ZC5zcGxpY2UoZC5sZW5ndGgvMiwwLG0sYyl9ZWxzZSBkLnB1c2gobSl9dmFyIHE9Yi5zdGFydFgsaz1iLmVuZFg7dj12LnNsaWNlKCk7dmFyIGw9Yi5pc0FyZWEsTj1sPzI6MTt3PXcmJncuc2xpY2UoKTtpZighdylyZXR1cm5bdix2XTtpZihxJiZrJiZrLmxlbmd0aCl7Zm9yKGI9MDtiPHEubGVuZ3RoO2IrKylpZihxW2JdPT09a1swXSl7dmFyIHU9YjticmVha31lbHNlIGlmKHFbMF09PT1cbmtbay5sZW5ndGgtcS5sZW5ndGgrYl0pe3U9Yjt2YXIgbj0hMDticmVha31lbHNlIGlmKHFbcS5sZW5ndGgtMV09PT1rW2subGVuZ3RoLXEubGVuZ3RoK2JdKXt1PXEubGVuZ3RoLWI7YnJlYWt9XCJ1bmRlZmluZWRcIj09PXR5cGVvZiB1JiYodz1bXSl9aWYody5sZW5ndGgmJkcodSkpe3ZhciBKPXYubGVuZ3RoK3UqTjtuPyhmKHcsdiksZCh2LHcpKTooZih2LHcpLGQodyx2KSl9cmV0dXJuW3csdl19O2IucHJvdG90eXBlLmZpbGxTZXR0ZXI9ZnVuY3Rpb24oKXtiLnByb3RvdHlwZS5zdHJva2VTZXR0ZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtiLnByb3RvdHlwZS5zdHJva2VTZXR0ZXI9ZnVuY3Rpb24oKXt0aGlzLmVsZW0uYXR0cih0aGlzLnByb3AsRCh0aGlzLnN0YXJ0KS50d2VlblRvKEQodGhpcy5lbmQpLHRoaXMucG9zKSxudWxsLCEwKX07Yi50aW1lcnM9W107cmV0dXJuIGJ9KCl9KTtPKGUsXCJDb3JlL0FuaW1hdGlvbi9BbmltYXRpb25VdGlsaXRpZXMuanNcIixbZVtcIkNvcmUvQW5pbWF0aW9uL0Z4LmpzXCJdLFxuZVtcIkNvcmUvVXRpbGl0aWVzLmpzXCJdXSxmdW5jdGlvbihlLGIpe2Z1bmN0aW9uIEQoZCl7cmV0dXJuIHgoZCk/dyh7ZHVyYXRpb246NTAwLGRlZmVyOjB9LGQpOntkdXJhdGlvbjpkPzUwMDowLGRlZmVyOjB9fWZ1bmN0aW9uIHooZCxmKXtmb3IodmFyIHE9ZS50aW1lcnMubGVuZ3RoO3EtLTspZS50aW1lcnNbcV0uZWxlbSE9PWR8fGYmJmYhPT1lLnRpbWVyc1txXS5wcm9wfHwoZS50aW1lcnNbcV0uc3RvcHBlZD0hMCl9dmFyIEg9Yi5kZWZpbmVkLEc9Yi5nZXRTdHlsZSxDPWIuaXNBcnJheSxCPWIuaXNOdW1iZXIseD1iLmlzT2JqZWN0LHc9Yi5tZXJnZSx2PWIub2JqZWN0RWFjaCxmPWIucGljaztyZXR1cm57YW5pbWF0ZTpmdW5jdGlvbihkLGYsayl7dmFyIGwscT1cIlwiLHUsbjtpZigheChrKSl7dmFyIGI9YXJndW1lbnRzO2s9e2R1cmF0aW9uOmJbMl0sZWFzaW5nOmJbM10sY29tcGxldGU6Yls0XX19QihrLmR1cmF0aW9uKXx8KGsuZHVyYXRpb249NDAwKTtrLmVhc2luZz1cImZ1bmN0aW9uXCI9PT1cbnR5cGVvZiBrLmVhc2luZz9rLmVhc2luZzpNYXRoW2suZWFzaW5nXXx8TWF0aC5lYXNlSW5PdXRTaW5lO2suY3VyQW5pbT13KGYpO3YoZixmdW5jdGlvbihiLG0pe3ooZCxtKTtuPW5ldyBlKGQsayxtKTt1PXZvaWQgMDtcImRcIj09PW0mJkMoZi5kKT8obi5wYXRocz1uLmluaXRQYXRoKGQsZC5wYXRoQXJyYXksZi5kKSxuLnRvRD1mLmQsbD0wLHU9MSk6ZC5hdHRyP2w9ZC5hdHRyKG0pOihsPXBhcnNlRmxvYXQoRyhkLG0pKXx8MCxcIm9wYWNpdHlcIiE9PW0mJihxPVwicHhcIikpO3V8fCh1PWIpO1wic3RyaW5nXCI9PT10eXBlb2YgdSYmdS5tYXRjaChcInB4XCIpJiYodT11LnJlcGxhY2UoL3B4L2csXCJcIikpO24ucnVuKGwsdSxxKX0pfSxhbmltT2JqZWN0OkQsZ2V0RGVmZXJyZWRBbmltYXRpb246ZnVuY3Rpb24oZCxmLGIpe3ZhciBsPUQoZikscT0wLHU9MDsoYj9bYl06ZC5zZXJpZXMpLmZvckVhY2goZnVuY3Rpb24oZCl7ZD1EKGQub3B0aW9ucy5hbmltYXRpb24pO3E9ZiYmSChmLmRlZmVyKT9sLmRlZmVyOlxuTWF0aC5tYXgocSxkLmR1cmF0aW9uK2QuZGVmZXIpO3U9TWF0aC5taW4obC5kdXJhdGlvbixkLmR1cmF0aW9uKX0pO2QucmVuZGVyZXIuZm9yRXhwb3J0JiYocT0wKTtyZXR1cm57ZGVmZXI6TWF0aC5tYXgoMCxxLXUpLGR1cmF0aW9uOk1hdGgubWluKHEsdSl9fSxzZXRBbmltYXRpb246ZnVuY3Rpb24oZCxxKXtxLnJlbmRlcmVyLmdsb2JhbEFuaW1hdGlvbj1mKGQscS5vcHRpb25zLmNoYXJ0LmFuaW1hdGlvbiwhMCl9LHN0b3A6en19KTtPKGUsXCJDb3JlL1JlbmRlcmVyL0hUTUwvQVNULmpzXCIsW2VbXCJDb3JlL0dsb2JhbHMuanNcIl0sZVtcIkNvcmUvVXRpbGl0aWVzLmpzXCJdXSxmdW5jdGlvbihlLGIpe3ZhciBEPWUuU1ZHX05TLHo9Yi5hdHRyLEg9Yi5jcmVhdGVFbGVtZW50LEc9Yi5kaXNjYXJkRWxlbWVudCxDPWIuZXJyb3IsQj1iLmlzU3RyaW5nLHg9Yi5vYmplY3RFYWNoLHc9Yi5zcGxhdDtcIlwiO3ZhciB2PSExO3RyeXt2PSEhKG5ldyBET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhcIlwiLFxuXCJ0ZXh0L2h0bWxcIil9Y2F0Y2goZil7fXJldHVybiBmdW5jdGlvbigpe2Z1bmN0aW9uIGYoZCl7dGhpcy5ub2Rlcz1cInN0cmluZ1wiPT09dHlwZW9mIGQ/dGhpcy5wYXJzZU1hcmt1cChkKTpkfWYuZmlsdGVyVXNlckF0dHJpYnV0ZXM9ZnVuY3Rpb24oZCl7eChkLGZ1bmN0aW9uKHEsYil7dmFyIGw9ITA7LTE9PT1mLmFsbG93ZWRBdHRyaWJ1dGVzLmluZGV4T2YoYikmJihsPSExKTstMSE9PVtcImJhY2tncm91bmRcIixcImR5bnNyY1wiLFwiaHJlZlwiLFwibG93c3JjXCIsXCJzcmNcIl0uaW5kZXhPZihiKSYmKGw9QihxKSYmZi5hbGxvd2VkUmVmZXJlbmNlcy5zb21lKGZ1bmN0aW9uKGQpe3JldHVybiAwPT09cS5pbmRleE9mKGQpfSkpO2x8fChDKFwiSGlnaGNoYXJ0cyB3YXJuaW5nOiBJbnZhbGlkIGF0dHJpYnV0ZSAnXCIrYitcIicgaW4gY29uZmlnXCIpLGRlbGV0ZSBkW2JdKX0pO3JldHVybiBkfTtmLnNldEVsZW1lbnRIVE1MPWZ1bmN0aW9uKGQscSl7ZC5pbm5lckhUTUw9XCJcIjtxJiYobmV3IGYocSkpLmFkZFRvRE9NKGQpfTtcbmYucHJvdG90eXBlLmFkZFRvRE9NPWZ1bmN0aW9uKGQpe2Z1bmN0aW9uIHEoZCxsKXt2YXIgYjt3KGQpLmZvckVhY2goZnVuY3Rpb24oZCl7dmFyIG49ZC50YWdOYW1lLHU9ZC50ZXh0Q29udGVudD9lLmRvYy5jcmVhdGVUZXh0Tm9kZShkLnRleHRDb250ZW50KTp2b2lkIDA7aWYobilpZihcIiN0ZXh0XCI9PT1uKXZhciBrPXU7ZWxzZSBpZigtMSE9PWYuYWxsb3dlZFRhZ3MuaW5kZXhPZihuKSl7bj1lLmRvYy5jcmVhdGVFbGVtZW50TlMoXCJzdmdcIj09PW4/RDpsLm5hbWVzcGFjZVVSSXx8RCxuKTt2YXIgbT1kLmF0dHJpYnV0ZXN8fHt9O3goZCxmdW5jdGlvbihjLGcpe1widGFnTmFtZVwiIT09ZyYmXCJhdHRyaWJ1dGVzXCIhPT1nJiZcImNoaWxkcmVuXCIhPT1nJiZcInRleHRDb250ZW50XCIhPT1nJiYobVtnXT1jKX0pO3oobixmLmZpbHRlclVzZXJBdHRyaWJ1dGVzKG0pKTt1JiZuLmFwcGVuZENoaWxkKHUpO3EoZC5jaGlsZHJlbnx8W10sbik7az1ufWVsc2UgQyhcIkhpZ2hjaGFydHMgd2FybmluZzogSW52YWxpZCB0YWdOYW1lICdcIitcbm4rXCInIGluIGNvbmZpZ1wiKTtrJiZsLmFwcGVuZENoaWxkKGspO2I9a30pO3JldHVybiBifXJldHVybiBxKHRoaXMubm9kZXMsZCl9O2YucHJvdG90eXBlLnBhcnNlTWFya3VwPWZ1bmN0aW9uKGQpe3ZhciBmPVtdO2lmKHYpZD0obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGQsXCJ0ZXh0L2h0bWxcIik7ZWxzZXt2YXIgYj1IKFwiZGl2XCIpO2IuaW5uZXJIVE1MPWQ7ZD17Ym9keTpifX12YXIgbD1mdW5jdGlvbihkLGYpe3ZhciBuPWQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxiPXt0YWdOYW1lOm59O2lmKFwiI3RleHRcIj09PW4pe249ZC50ZXh0Q29udGVudHx8XCJcIjtpZigvXltcXHNdKiQvLnRlc3QobikpcmV0dXJuO2IudGV4dENvbnRlbnQ9bn1pZihuPWQuYXR0cmlidXRlcyl7dmFyIHU9e307W10uZm9yRWFjaC5jYWxsKG4sZnVuY3Rpb24oYyl7dVtjLm5hbWVdPWMudmFsdWV9KTtiLmF0dHJpYnV0ZXM9dX1pZihkLmNoaWxkTm9kZXMubGVuZ3RoKXt2YXIgbT1bXTtbXS5mb3JFYWNoLmNhbGwoZC5jaGlsZE5vZGVzLFxuZnVuY3Rpb24oYyl7bChjLG0pfSk7bS5sZW5ndGgmJihiLmNoaWxkcmVuPW0pfWYucHVzaChiKX07W10uZm9yRWFjaC5jYWxsKGQuYm9keS5jaGlsZE5vZGVzLGZ1bmN0aW9uKGQpe3JldHVybiBsKGQsZil9KTtiJiZHKGIpO3JldHVybiBmfTtmLmFsbG93ZWRUYWdzPVwiYSBiIGJyIGJ1dHRvbiBjYXB0aW9uIGNpcmNsZSBjbGlwUGF0aCBjb2RlIGRkIGRlZnMgZGl2IGRsIGR0IGVtIGZlQ29tcG9uZW50VHJhbnNmZXIgZmVGdW5jQSBmZUZ1bmNCIGZlRnVuY0cgZmVGdW5jUiBmZUdhdXNzaWFuQmx1ciBmZU9mZnNldCBmZU1lcmdlIGZlTWVyZ2VOb2RlIGZpbHRlciBoMSBoMiBoMyBoNCBoNSBoNiBociBpIGltZyBsaSBsaW5lYXJHcmFkaWVudCBtYXJrZXIgb2wgcCBwYXRoIHBhdHRlcm4gcHJlIHJlY3Qgc21hbGwgc3BhbiBzdG9wIHN0cm9uZyBzdHlsZSBzdWIgc3VwIHN2ZyB0YWJsZSB0ZXh0IHRoZWFkIHRib2R5IHRzcGFuIHRkIHRoIHRyIHUgdWwgI3RleHRcIi5zcGxpdChcIiBcIik7Zi5hbGxvd2VkQXR0cmlidXRlcz1cblwiYXJpYS1jb250cm9scyBhcmlhLWRlc2NyaWJlZGJ5IGFyaWEtZXhwYW5kZWQgYXJpYS1oYXNwb3B1cCBhcmlhLWhpZGRlbiBhcmlhLWxhYmVsIGFyaWEtbGFiZWxsZWRieSBhcmlhLWxpdmUgYXJpYS1wcmVzc2VkIGFyaWEtcmVhZG9ubHkgYXJpYS1yb2xlZGVzY3JpcHRpb24gYXJpYS1zZWxlY3RlZCBjbGFzcyBjbGlwLXBhdGggY29sb3IgY29sc3BhbiBjeCBjeSBkIGR4IGR5IGRpc2FibGVkIGZpbGwgaGVpZ2h0IGhyZWYgaWQgaW4gbWFya2VySGVpZ2h0IG1hcmtlcldpZHRoIG9mZnNldCBvcGFjaXR5IG9yaWVudCBwYWRkaW5nIHBhZGRpbmdMZWZ0IHBhdHRlcm5Vbml0cyByIHJlZlggcmVmWSByb2xlIHNjb3BlIHNsb3BlIHNyYyBzdGFydE9mZnNldCBzdGREZXZpYXRpb24gc3Ryb2tlIHN0cm9rZS1saW5lY2FwIHN0cm9rZS13aWR0aCBzdHlsZSByZXN1bHQgcm93c3BhbiBzdW1tYXJ5IHRhcmdldCB0YWJpbmRleCB0ZXh0LWFsaWduIHRleHRBbmNob3IgdGV4dExlbmd0aCB0eXBlIHZhbGlnbiB3aWR0aCB4IHgxIHgyIHkgeTEgeTIgekluZGV4XCIuc3BsaXQoXCIgXCIpO1xuZi5hbGxvd2VkUmVmZXJlbmNlcz1cImh0dHBzOi8vIGh0dHA6Ly8gbWFpbHRvOiAvIC4uLyAuLyAjXCIuc3BsaXQoXCIgXCIpO3JldHVybiBmfSgpfSk7TyhlLFwiQ29yZS9Gb3JtYXRVdGlsaXRpZXMuanNcIixbZVtcIkNvcmUvT3B0aW9ucy5qc1wiXSxlW1wiQ29yZS9VdGlsaXRpZXMuanNcIl1dLGZ1bmN0aW9uKGUsYil7ZnVuY3Rpb24gRChiLHYsZixkKXtiPStifHwwO3Y9K3Y7dmFyIHE9ei5sYW5nLGs9KGIudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV18fFwiXCIpLnNwbGl0KFwiZVwiKVswXS5sZW5ndGgsbD1iLnRvU3RyaW5nKCkuc3BsaXQoXCJlXCIpLE49djtpZigtMT09PXYpdj1NYXRoLm1pbihrLDIwKTtlbHNlIGlmKCFDKHYpKXY9MjtlbHNlIGlmKHYmJmxbMV0mJjA+bFsxXSl7dmFyIHU9disgK2xbMV07MDw9dT8obFswXT0oK2xbMF0pLnRvRXhwb25lbnRpYWwodSkuc3BsaXQoXCJlXCIpWzBdLHY9dSk6KGxbMF09bFswXS5zcGxpdChcIi5cIilbMF18fDAsYj0yMD52PyhsWzBdKk1hdGgucG93KDEwLGxbMV0pKS50b0ZpeGVkKHYpOlxuMCxsWzFdPTApfXU9KE1hdGguYWJzKGxbMV0/bFswXTpiKStNYXRoLnBvdygxMCwtTWF0aC5tYXgodixrKS0xKSkudG9GaXhlZCh2KTtrPVN0cmluZyh4KHUpKTt2YXIgbj0zPGsubGVuZ3RoP2subGVuZ3RoJTM6MDtmPUIoZixxLmRlY2ltYWxQb2ludCk7ZD1CKGQscS50aG91c2FuZHNTZXApO2I9KDA+Yj9cIi1cIjpcIlwiKSsobj9rLnN1YnN0cigwLG4pK2Q6XCJcIik7Yj0wPitsWzFdJiYhTj9cIjBcIjpiK2suc3Vic3RyKG4pLnJlcGxhY2UoLyhcXGR7M30pKD89XFxkKS9nLFwiJDFcIitkKTt2JiYoYis9Zit1LnNsaWNlKC12KSk7bFsxXSYmMCE9PStiJiYoYis9XCJlXCIrbFsxXSk7cmV0dXJuIGJ9dmFyIHo9ZS5kZWZhdWx0T3B0aW9ucyxIPWUuZGVmYXVsdFRpbWUsRz1iLmdldE5lc3RlZFByb3BlcnR5LEM9Yi5pc051bWJlcixCPWIucGljayx4PWIucEludDtyZXR1cm57ZGF0ZUZvcm1hdDpmdW5jdGlvbihiLHYsZil7cmV0dXJuIEguZGF0ZUZvcm1hdChiLHYsZil9LGZvcm1hdDpmdW5jdGlvbihiLHYsXG5mKXt2YXIgZD1cIntcIixxPSExLGs9L2YkLyxsPS9cXC4oWzAtOV0pLyxOPXoubGFuZyx1PWYmJmYudGltZXx8SDtmPWYmJmYubnVtYmVyRm9ybWF0dGVyfHxEO2Zvcih2YXIgbj1bXTtiOyl7dmFyIEo9Yi5pbmRleE9mKGQpO2lmKC0xPT09SilicmVhazt2YXIgRT1iLnNsaWNlKDAsSik7aWYocSl7RT1FLnNwbGl0KFwiOlwiKTtkPUcoRS5zaGlmdCgpfHxcIlwiLHYpO2lmKEUubGVuZ3RoJiZcIm51bWJlclwiPT09dHlwZW9mIGQpaWYoRT1FLmpvaW4oXCI6XCIpLGsudGVzdChFKSl7dmFyIG09cGFyc2VJbnQoKEUubWF0Y2gobCl8fFtcIlwiLFwiLTFcIl0pWzFdLDEwKTtudWxsIT09ZCYmKGQ9ZihkLG0sTi5kZWNpbWFsUG9pbnQsLTE8RS5pbmRleE9mKFwiLFwiKT9OLnRob3VzYW5kc1NlcDpcIlwiKSl9ZWxzZSBkPXUuZGF0ZUZvcm1hdChFLGQpO24ucHVzaChkKX1lbHNlIG4ucHVzaChFKTtiPWIuc2xpY2UoSisxKTtkPShxPSFxKT9cIn1cIjpcIntcIn1uLnB1c2goYik7cmV0dXJuIG4uam9pbihcIlwiKX0sbnVtYmVyRm9ybWF0OkR9fSk7XG5PKGUsXCJDb3JlL1JlbmRlcmVyL1NWRy9TVkdFbGVtZW50LmpzXCIsW2VbXCJDb3JlL0FuaW1hdGlvbi9BbmltYXRpb25VdGlsaXRpZXMuanNcIl0sZVtcIkNvcmUvUmVuZGVyZXIvSFRNTC9BU1QuanNcIl0sZVtcIkNvcmUvQ29sb3IvQ29sb3IuanNcIl0sZVtcIkNvcmUvR2xvYmFscy5qc1wiXSxlW1wiQ29yZS9Db2xvci9QYWxldHRlLmpzXCJdLGVbXCJDb3JlL1V0aWxpdGllcy5qc1wiXV0sZnVuY3Rpb24oZSxiLEkseixILEcpe3ZhciBEPWUuYW5pbWF0ZSxCPWUuYW5pbU9iamVjdCx4PWUuc3RvcCx3PXouZGVnMnJhZCx2PXouZG9jLGY9ei5ub29wLGQ9ei5zdmcscT16LlNWR19OUyxrPXoud2luLGw9Ry5hZGRFdmVudCxOPUcuYXR0cix1PUcuY3JlYXRlRWxlbWVudCxuPUcuY3NzLEo9Ry5kZWZpbmVkLEU9Ry5lcmFzZSxtPUcuZXh0ZW5kLGM9Ry5maXJlRXZlbnQsZz1HLmlzQXJyYXksYT1HLmlzRnVuY3Rpb24saD1HLmlzTnVtYmVyLHI9Ry5pc1N0cmluZyxBPUcubWVyZ2UseT1HLm9iamVjdEVhY2gsTD1cbkcucGljayxQPUcucEludCxSPUcuc3luY1RpbWVvdXQsVj1HLnVuaXF1ZUtleTtlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3RoaXMuZWxlbWVudD12b2lkIDA7dGhpcy5vbkV2ZW50cz17fTt0aGlzLm9wYWNpdHk9MTt0aGlzLnJlbmRlcmVyPXZvaWQgMDt0aGlzLlNWR19OUz1xO3RoaXMuc3ltYm9sQ3VzdG9tQXR0cmlicz1cInggeSB3aWR0aCBoZWlnaHQgciBzdGFydCBlbmQgaW5uZXJSIGFuY2hvclggYW5jaG9yWSByb3VuZGVkXCIuc3BsaXQoXCIgXCIpfWUucHJvdG90eXBlLl9kZWZhdWx0R2V0dGVyPWZ1bmN0aW9uKGEpe2E9TCh0aGlzW2ErXCJWYWx1ZVwiXSx0aGlzW2FdLHRoaXMuZWxlbWVudD90aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKGEpOm51bGwsMCk7L15bXFwtMC05XFwuXSskLy50ZXN0KGEpJiYoYT1wYXJzZUZsb2F0KGEpKTtyZXR1cm4gYX07ZS5wcm90b3R5cGUuX2RlZmF1bHRTZXR0ZXI9ZnVuY3Rpb24oYSx0LHApe3Auc2V0QXR0cmlidXRlKHQsYSl9O2UucHJvdG90eXBlLmFkZD1cbmZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMucmVuZGVyZXIscD10aGlzLmVsZW1lbnQ7YSYmKHRoaXMucGFyZW50R3JvdXA9YSk7dGhpcy5wYXJlbnRJbnZlcnRlZD1hJiZhLmludmVydGVkO1widW5kZWZpbmVkXCIhPT10eXBlb2YgdGhpcy50ZXh0U3RyJiZcInRleHRcIj09PXRoaXMuZWxlbWVudC5ub2RlTmFtZSYmdC5idWlsZFRleHQodGhpcyk7dGhpcy5hZGRlZD0hMDtpZighYXx8YS5oYW5kbGVafHx0aGlzLnpJbmRleCl2YXIgYz10aGlzLnpJbmRleFNldHRlcigpO2N8fChhP2EuZWxlbWVudDp0LmJveCkuYXBwZW5kQ2hpbGQocCk7aWYodGhpcy5vbkFkZCl0aGlzLm9uQWRkKCk7cmV0dXJuIHRoaXN9O2UucHJvdG90eXBlLmFkZENsYXNzPWZ1bmN0aW9uKGEsdCl7dmFyIHA9dD9cIlwiOnRoaXMuYXR0cihcImNsYXNzXCIpfHxcIlwiO2E9KGF8fFwiXCIpLnNwbGl0KC8gL2cpLnJlZHVjZShmdW5jdGlvbihhLHQpey0xPT09cC5pbmRleE9mKHQpJiZhLnB1c2godCk7cmV0dXJuIGF9LHA/W3BdOltdKS5qb2luKFwiIFwiKTtcbmEhPT1wJiZ0aGlzLmF0dHIoXCJjbGFzc1wiLGEpO3JldHVybiB0aGlzfTtlLnByb3RvdHlwZS5hZnRlclNldHRlcnM9ZnVuY3Rpb24oKXt0aGlzLmRvVHJhbnNmb3JtJiYodGhpcy51cGRhdGVUcmFuc2Zvcm0oKSx0aGlzLmRvVHJhbnNmb3JtPSExKX07ZS5wcm90b3R5cGUuYWxpZ249ZnVuY3Rpb24oYSx0LHApe3ZhciBjPXt9LGc9dGhpcy5yZW5kZXJlcixkPWcuYWxpZ25lZE9iamVjdHMsRixoLEs7aWYoYSl7aWYodGhpcy5hbGlnbk9wdGlvbnM9YSx0aGlzLmFsaWduQnlUcmFuc2xhdGU9dCwhcHx8cihwKSl0aGlzLmFsaWduVG89Rj1wfHxcInJlbmRlcmVyXCIsRShkLHRoaXMpLGQucHVzaCh0aGlzKSxwPXZvaWQgMH1lbHNlIGE9dGhpcy5hbGlnbk9wdGlvbnMsdD10aGlzLmFsaWduQnlUcmFuc2xhdGUsRj10aGlzLmFsaWduVG87cD1MKHAsZ1tGXSxcInNjcm9sbGFibGVQbG90Qm94XCI9PT1GP2cucGxvdEJveDp2b2lkIDAsZyk7Rj1hLmFsaWduO3ZhciBNPWEudmVydGljYWxBbGlnbjtnPVxuKHAueHx8MCkrKGEueHx8MCk7ZD0ocC55fHwwKSsoYS55fHwwKTtcInJpZ2h0XCI9PT1GP2g9MTpcImNlbnRlclwiPT09RiYmKGg9Mik7aCYmKGcrPShwLndpZHRoLShhLndpZHRofHwwKSkvaCk7Y1t0P1widHJhbnNsYXRlWFwiOlwieFwiXT1NYXRoLnJvdW5kKGcpO1wiYm90dG9tXCI9PT1NP0s9MTpcIm1pZGRsZVwiPT09TSYmKEs9Mik7SyYmKGQrPShwLmhlaWdodC0oYS5oZWlnaHR8fDApKS9LKTtjW3Q/XCJ0cmFuc2xhdGVZXCI6XCJ5XCJdPU1hdGgucm91bmQoZCk7dGhpc1t0aGlzLnBsYWNlZD9cImFuaW1hdGVcIjpcImF0dHJcIl0oYyk7dGhpcy5wbGFjZWQ9ITA7dGhpcy5hbGlnbkF0dHI9YztyZXR1cm4gdGhpc307ZS5wcm90b3R5cGUuYWxpZ25TZXR0ZXI9ZnVuY3Rpb24oYSl7dmFyIHQ9e2xlZnQ6XCJzdGFydFwiLGNlbnRlcjpcIm1pZGRsZVwiLHJpZ2h0OlwiZW5kXCJ9O3RbYV0mJih0aGlzLmFsaWduVmFsdWU9YSx0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKFwidGV4dC1hbmNob3JcIix0W2FdKSl9O2UucHJvdG90eXBlLmFuaW1hdGU9XG5mdW5jdGlvbihhLHQscCl7dmFyIGM9dGhpcyxnPUIoTCh0LHRoaXMucmVuZGVyZXIuZ2xvYmFsQW5pbWF0aW9uLCEwKSk7dD1nLmRlZmVyO0wodi5oaWRkZW4sdi5tc0hpZGRlbix2LndlYmtpdEhpZGRlbiwhMSkmJihnLmR1cmF0aW9uPTApOzAhPT1nLmR1cmF0aW9uPyhwJiYoZy5jb21wbGV0ZT1wKSxSKGZ1bmN0aW9uKCl7Yy5lbGVtZW50JiZEKGMsYSxnKX0sdCkpOih0aGlzLmF0dHIoYSx2b2lkIDAscCkseShhLGZ1bmN0aW9uKGEscCl7Zy5zdGVwJiZnLnN0ZXAuY2FsbCh0aGlzLGEse3Byb3A6cCxwb3M6MSxlbGVtOnRoaXN9KX0sdGhpcykpO3JldHVybiB0aGlzfTtlLnByb3RvdHlwZS5hcHBseVRleHRPdXRsaW5lPWZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuZWxlbWVudDstMSE9PWEuaW5kZXhPZihcImNvbnRyYXN0XCIpJiYoYT1hLnJlcGxhY2UoL2NvbnRyYXN0L2csdGhpcy5yZW5kZXJlci5nZXRDb250cmFzdCh0LnN0eWxlLmZpbGwpKSk7dmFyIHA9YS5zcGxpdChcIiBcIik7YT1wW3AubGVuZ3RoLVxuMV07aWYoKHA9cFswXSkmJlwibm9uZVwiIT09cCYmei5zdmcpe3RoaXMuZmFrZVRTPSEwO3RoaXMueVNldHRlcj10aGlzLnhTZXR0ZXI7cD1wLnJlcGxhY2UoLyheW1xcZFxcLl0rKSguKj8pJC9nLGZ1bmN0aW9uKGEscCx0KXtyZXR1cm4gMipOdW1iZXIocCkrdH0pO3RoaXMucmVtb3ZlVGV4dE91dGxpbmUoKTt2YXIgYz12LmNyZWF0ZUVsZW1lbnROUyhxLFwidHNwYW5cIik7TihjLHtcImNsYXNzXCI6XCJoaWdoY2hhcnRzLXRleHQtb3V0bGluZVwiLGZpbGw6YSxzdHJva2U6YSxcInN0cm9rZS13aWR0aFwiOnAsXCJzdHJva2UtbGluZWpvaW5cIjpcInJvdW5kXCJ9KTtbXS5mb3JFYWNoLmNhbGwodC5jaGlsZE5vZGVzLGZ1bmN0aW9uKGEpe3ZhciBwPWEuY2xvbmVOb2RlKCEwKTtwLnJlbW92ZUF0dHJpYnV0ZSYmW1wiZmlsbFwiLFwic3Ryb2tlXCIsXCJzdHJva2Utd2lkdGhcIixcInN0cm9rZVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBwLnJlbW92ZUF0dHJpYnV0ZShhKX0pO2MuYXBwZW5kQ2hpbGQocCl9KTt2YXIgZz1cbnYuY3JlYXRlRWxlbWVudE5TKHEsXCJ0c3BhblwiKTtnLnRleHRDb250ZW50PVwiXFx1MjAwYlwiO1tcInhcIixcInlcIl0uZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgcD10LmdldEF0dHJpYnV0ZShhKTtwJiZnLnNldEF0dHJpYnV0ZShhLHApfSk7Yy5hcHBlbmRDaGlsZChnKTt0Lmluc2VydEJlZm9yZShjLHQuZmlyc3RDaGlsZCl9fTtlLnByb3RvdHlwZS5hdHRyPWZ1bmN0aW9uKGEsdCxwLGMpe3ZhciBnPXRoaXMuZWxlbWVudCxkPXRoaXMuc3ltYm9sQ3VzdG9tQXR0cmlicyxoLHI9dGhpcyxLLG07aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBhJiZcInVuZGVmaW5lZFwiIT09dHlwZW9mIHQpe3ZhciBNPWE7YT17fTthW01dPXR9XCJzdHJpbmdcIj09PXR5cGVvZiBhP3I9KHRoaXNbYStcIkdldHRlclwiXXx8dGhpcy5fZGVmYXVsdEdldHRlcikuY2FsbCh0aGlzLGEsZyk6KHkoYSxmdW5jdGlvbihwLHQpe0s9ITE7Y3x8eCh0aGlzLHQpO3RoaXMuc3ltYm9sTmFtZSYmLTEhPT1kLmluZGV4T2YodCkmJihofHwodGhpcy5zeW1ib2xBdHRyKGEpLFxuaD0hMCksSz0hMCk7IXRoaXMucm90YXRpb258fFwieFwiIT09dCYmXCJ5XCIhPT10fHwodGhpcy5kb1RyYW5zZm9ybT0hMCk7S3x8KG09dGhpc1t0K1wiU2V0dGVyXCJdfHx0aGlzLl9kZWZhdWx0U2V0dGVyLG0uY2FsbCh0aGlzLHAsdCxnKSwhdGhpcy5zdHlsZWRNb2RlJiZ0aGlzLnNoYWRvd3MmJi9eKHdpZHRofGhlaWdodHx2aXNpYmlsaXR5fHh8eXxkfHRyYW5zZm9ybXxjeHxjeXxyKSQvLnRlc3QodCkmJnRoaXMudXBkYXRlU2hhZG93cyh0LHAsbSkpfSx0aGlzKSx0aGlzLmFmdGVyU2V0dGVycygpKTtwJiZwLmNhbGwodGhpcyk7cmV0dXJuIHJ9O2UucHJvdG90eXBlLmNsaXA9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYXR0cihcImNsaXAtcGF0aFwiLGE/XCJ1cmwoXCIrdGhpcy5yZW5kZXJlci51cmwrXCIjXCIrYS5pZCtcIilcIjpcIm5vbmVcIil9O2UucHJvdG90eXBlLmNyaXNwPWZ1bmN0aW9uKGEsdCl7dD10fHxhLnN0cm9rZVdpZHRofHwwO3ZhciBwPU1hdGgucm91bmQodCklMi8yO2EueD1NYXRoLmZsb29yKGEueHx8XG50aGlzLnh8fDApK3A7YS55PU1hdGguZmxvb3IoYS55fHx0aGlzLnl8fDApK3A7YS53aWR0aD1NYXRoLmZsb29yKChhLndpZHRofHx0aGlzLndpZHRofHwwKS0yKnApO2EuaGVpZ2h0PU1hdGguZmxvb3IoKGEuaGVpZ2h0fHx0aGlzLmhlaWdodHx8MCktMipwKTtKKGEuc3Ryb2tlV2lkdGgpJiYoYS5zdHJva2VXaWR0aD10KTtyZXR1cm4gYX07ZS5wcm90b3R5cGUuY29tcGxleENvbG9yPWZ1bmN0aW9uKGEsdCxwKXt2YXIgZD10aGlzLnJlbmRlcmVyLGgscixGLG0sSyxNLGYsYixsLG4sdT1bXSxxO2ModGhpcy5yZW5kZXJlcixcImNvbXBsZXhDb2xvclwiLHthcmdzOmFyZ3VtZW50c30sZnVuY3Rpb24oKXthLnJhZGlhbEdyYWRpZW50P3I9XCJyYWRpYWxHcmFkaWVudFwiOmEubGluZWFyR3JhZGllbnQmJihyPVwibGluZWFyR3JhZGllbnRcIik7aWYocil7Rj1hW3JdO0s9ZC5ncmFkaWVudHM7TT1hLnN0b3BzO2w9cC5yYWRpYWxSZWZlcmVuY2U7ZyhGKSYmKGFbcl09Rj17eDE6RlswXSx5MTpGWzFdLFxueDI6RlsyXSx5MjpGWzNdLGdyYWRpZW50VW5pdHM6XCJ1c2VyU3BhY2VPblVzZVwifSk7XCJyYWRpYWxHcmFkaWVudFwiPT09ciYmbCYmIUooRi5ncmFkaWVudFVuaXRzKSYmKG09RixGPUEoRixkLmdldFJhZGlhbEF0dHIobCxtKSx7Z3JhZGllbnRVbml0czpcInVzZXJTcGFjZU9uVXNlXCJ9KSk7eShGLGZ1bmN0aW9uKGEscCl7XCJpZFwiIT09cCYmdS5wdXNoKHAsYSl9KTt5KE0sZnVuY3Rpb24oYSl7dS5wdXNoKGEpfSk7dT11LmpvaW4oXCIsXCIpO2lmKEtbdV0pbj1LW3VdLmF0dHIoXCJpZFwiKTtlbHNle0YuaWQ9bj1WKCk7dmFyIGM9S1t1XT1kLmNyZWF0ZUVsZW1lbnQocikuYXR0cihGKS5hZGQoZC5kZWZzKTtjLnJhZEF0dHI9bTtjLnN0b3BzPVtdO00uZm9yRWFjaChmdW5jdGlvbihhKXswPT09YVsxXS5pbmRleE9mKFwicmdiYVwiKT8oaD1JLnBhcnNlKGFbMV0pLGY9aC5nZXQoXCJyZ2JcIiksYj1oLmdldChcImFcIikpOihmPWFbMV0sYj0xKTthPWQuY3JlYXRlRWxlbWVudChcInN0b3BcIikuYXR0cih7b2Zmc2V0OmFbMF0sXG5cInN0b3AtY29sb3JcIjpmLFwic3RvcC1vcGFjaXR5XCI6Yn0pLmFkZChjKTtjLnN0b3BzLnB1c2goYSl9KX1xPVwidXJsKFwiK2QudXJsK1wiI1wiK24rXCIpXCI7cC5zZXRBdHRyaWJ1dGUodCxxKTtwLmdyYWRpZW50PXU7YS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBxfX19KX07ZS5wcm90b3R5cGUuY3NzPWZ1bmN0aW9uKGEpe3ZhciB0PXRoaXMuc3R5bGVzLHA9e30sYz10aGlzLmVsZW1lbnQsZz1bXCJ0ZXh0T3V0bGluZVwiLFwidGV4dE92ZXJmbG93XCIsXCJ3aWR0aFwiXSxoPVwiXCIsRj0hdDthJiZhLmNvbG9yJiYoYS5maWxsPWEuY29sb3IpO3QmJnkoYSxmdW5jdGlvbihhLGMpe3QmJnRbY10hPT1hJiYocFtjXT1hLEY9ITApfSk7aWYoRil7dCYmKGE9bSh0LHApKTtpZihhKWlmKG51bGw9PT1hLndpZHRofHxcImF1dG9cIj09PWEud2lkdGgpZGVsZXRlIHRoaXMudGV4dFdpZHRoO2Vsc2UgaWYoXCJ0ZXh0XCI9PT1jLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJmEud2lkdGgpdmFyIHI9dGhpcy50ZXh0V2lkdGg9XG5QKGEud2lkdGgpO3RoaXMuc3R5bGVzPWE7ciYmIWQmJnRoaXMucmVuZGVyZXIuZm9yRXhwb3J0JiZkZWxldGUgYS53aWR0aDtpZihjLm5hbWVzcGFjZVVSST09PXRoaXMuU1ZHX05TKXt2YXIgSz1mdW5jdGlvbihhLHApe3JldHVyblwiLVwiK3AudG9Mb3dlckNhc2UoKX07eShhLGZ1bmN0aW9uKGEscCl7LTE9PT1nLmluZGV4T2YocCkmJihoKz1wLnJlcGxhY2UoLyhbQS1aXSkvZyxLKStcIjpcIithK1wiO1wiKX0pO2gmJk4oYyxcInN0eWxlXCIsaCl9ZWxzZSBuKGMsYSk7dGhpcy5hZGRlZCYmKFwidGV4dFwiPT09dGhpcy5lbGVtZW50Lm5vZGVOYW1lJiZ0aGlzLnJlbmRlcmVyLmJ1aWxkVGV4dCh0aGlzKSxhJiZhLnRleHRPdXRsaW5lJiZ0aGlzLmFwcGx5VGV4dE91dGxpbmUoYS50ZXh0T3V0bGluZSkpfXJldHVybiB0aGlzfTtlLnByb3RvdHlwZS5kYXNoc3R5bGVTZXR0ZXI9ZnVuY3Rpb24oYSl7dmFyIHQ9dGhpc1tcInN0cm9rZS13aWR0aFwiXTtcImluaGVyaXRcIj09PXQmJih0PTEpO2lmKGE9YSYmYS50b0xvd2VyQ2FzZSgpKXt2YXIgcD1cbmEucmVwbGFjZShcInNob3J0ZGFzaGRvdGRvdFwiLFwiMywxLDEsMSwxLDEsXCIpLnJlcGxhY2UoXCJzaG9ydGRhc2hkb3RcIixcIjMsMSwxLDFcIikucmVwbGFjZShcInNob3J0ZG90XCIsXCIxLDEsXCIpLnJlcGxhY2UoXCJzaG9ydGRhc2hcIixcIjMsMSxcIikucmVwbGFjZShcImxvbmdkYXNoXCIsXCI4LDMsXCIpLnJlcGxhY2UoL2RvdC9nLFwiMSwzLFwiKS5yZXBsYWNlKFwiZGFzaFwiLFwiNCwzLFwiKS5yZXBsYWNlKC8sJC8sXCJcIikuc3BsaXQoXCIsXCIpO2ZvcihhPXAubGVuZ3RoO2EtLTspcFthXT1cIlwiK1AocFthXSkqTCh0LE5hTik7YT1wLmpvaW4oXCIsXCIpLnJlcGxhY2UoL05hTi9nLFwibm9uZVwiKTt0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKFwic3Ryb2tlLWRhc2hhcnJheVwiLGEpfX07ZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsdD1hLmVsZW1lbnR8fHt9LHA9YS5yZW5kZXJlcixjPXQub3duZXJTVkdFbGVtZW50LGc9cC5pc1NWRyYmXCJTUEFOXCI9PT10Lm5vZGVOYW1lJiZhLnBhcmVudEdyb3VwfHxcbnZvaWQgMDt0Lm9uY2xpY2s9dC5vbm1vdXNlb3V0PXQub25tb3VzZW92ZXI9dC5vbm1vdXNlbW92ZT10LnBvaW50PW51bGw7eChhKTtpZihhLmNsaXBQYXRoJiZjKXt2YXIgZD1hLmNsaXBQYXRoO1tdLmZvckVhY2guY2FsbChjLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbY2xpcC1wYXRoXSxbQ0xJUC1QQVRIXVwiKSxmdW5jdGlvbihhKXstMTxhLmdldEF0dHJpYnV0ZShcImNsaXAtcGF0aFwiKS5pbmRleE9mKGQuZWxlbWVudC5pZCkmJmEucmVtb3ZlQXR0cmlidXRlKFwiY2xpcC1wYXRoXCIpfSk7YS5jbGlwUGF0aD1kLmRlc3Ryb3koKX1pZihhLnN0b3BzKXtmb3IoYz0wO2M8YS5zdG9wcy5sZW5ndGg7YysrKWEuc3RvcHNbY10uZGVzdHJveSgpO2Euc3RvcHMubGVuZ3RoPTA7YS5zdG9wcz12b2lkIDB9YS5zYWZlUmVtb3ZlQ2hpbGQodCk7Zm9yKHAuc3R5bGVkTW9kZXx8YS5kZXN0cm95U2hhZG93cygpO2cmJmcuZGl2JiYwPT09Zy5kaXYuY2hpbGROb2Rlcy5sZW5ndGg7KXQ9Zy5wYXJlbnRHcm91cCxcbmEuc2FmZVJlbW92ZUNoaWxkKGcuZGl2KSxkZWxldGUgZy5kaXYsZz10O2EuYWxpZ25UbyYmRShwLmFsaWduZWRPYmplY3RzLGEpO3koYSxmdW5jdGlvbihwLGMpe2FbY10mJmFbY10ucGFyZW50R3JvdXA9PT1hJiZhW2NdLmRlc3Ryb3kmJmFbY10uZGVzdHJveSgpO2RlbGV0ZSBhW2NdfSl9O2UucHJvdG90eXBlLmRlc3Ryb3lTaGFkb3dzPWZ1bmN0aW9uKCl7KHRoaXMuc2hhZG93c3x8W10pLmZvckVhY2goZnVuY3Rpb24oYSl7dGhpcy5zYWZlUmVtb3ZlQ2hpbGQoYSl9LHRoaXMpO3RoaXMuc2hhZG93cz12b2lkIDB9O2UucHJvdG90eXBlLmRlc3Ryb3lUZXh0UGF0aD1mdW5jdGlvbihhLGMpe3ZhciBwPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0ZXh0XCIpWzBdO2lmKHApe2lmKHAucmVtb3ZlQXR0cmlidXRlKFwiZHhcIikscC5yZW1vdmVBdHRyaWJ1dGUoXCJkeVwiKSxjLmVsZW1lbnQuc2V0QXR0cmlidXRlKFwiaWRcIixcIlwiKSx0aGlzLnRleHRQYXRoV3JhcHBlciYmcC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRleHRQYXRoXCIpLmxlbmd0aCl7Zm9yKGE9XG50aGlzLnRleHRQYXRoV3JhcHBlci5lbGVtZW50LmNoaWxkTm9kZXM7YS5sZW5ndGg7KXAuYXBwZW5kQ2hpbGQoYVswXSk7cC5yZW1vdmVDaGlsZCh0aGlzLnRleHRQYXRoV3JhcHBlci5lbGVtZW50KX19ZWxzZSBpZihhLmdldEF0dHJpYnV0ZShcImR4XCIpfHxhLmdldEF0dHJpYnV0ZShcImR5XCIpKWEucmVtb3ZlQXR0cmlidXRlKFwiZHhcIiksYS5yZW1vdmVBdHRyaWJ1dGUoXCJkeVwiKTt0aGlzLnRleHRQYXRoV3JhcHBlciYmKHRoaXMudGV4dFBhdGhXcmFwcGVyPXRoaXMudGV4dFBhdGhXcmFwcGVyLmRlc3Ryb3koKSl9O2UucHJvdG90eXBlLmRTZXR0ZXI9ZnVuY3Rpb24oYSxjLHApe2coYSkmJihcInN0cmluZ1wiPT09dHlwZW9mIGFbMF0mJihhPXRoaXMucmVuZGVyZXIucGF0aFRvU2VnbWVudHMoYSkpLHRoaXMucGF0aEFycmF5PWEsYT1hLnJlZHVjZShmdW5jdGlvbihhLHAsYyl7cmV0dXJuIHAmJnAuam9pbj8oYz9hK1wiIFwiOlwiXCIpK3Auam9pbihcIiBcIik6KHB8fFwiXCIpLnRvU3RyaW5nKCl9LFwiXCIpKTtcbi8oTmFOfCB7Mn18XiQpLy50ZXN0KGEpJiYoYT1cIk0gMCAwXCIpO3RoaXNbY10hPT1hJiYocC5zZXRBdHRyaWJ1dGUoYyxhKSx0aGlzW2NdPWEpfTtlLnByb3RvdHlwZS5mYWRlT3V0PWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXM7Yy5hbmltYXRlKHtvcGFjaXR5OjB9LHtkdXJhdGlvbjpMKGEsMTUwKSxjb21wbGV0ZTpmdW5jdGlvbigpe2MuYXR0cih7eTotOTk5OX0pLmhpZGUoKX19KX07ZS5wcm90b3R5cGUuZmlsbFNldHRlcj1mdW5jdGlvbihhLGMscCl7XCJzdHJpbmdcIj09PXR5cGVvZiBhP3Auc2V0QXR0cmlidXRlKGMsYSk6YSYmdGhpcy5jb21wbGV4Q29sb3IoYSxjLHApfTtlLnByb3RvdHlwZS5nZXRCQm94PWZ1bmN0aW9uKGMsdCl7dmFyIHA9dGhpcy5yZW5kZXJlcixnPXRoaXMuZWxlbWVudCxkPXRoaXMuc3R5bGVzLGg9dGhpcy50ZXh0U3RyLEY9cC5jYWNoZSxyPXAuY2FjaGVLZXlzLEs9Zy5uYW1lc3BhY2VVUkk9PT10aGlzLlNWR19OUzt0PUwodCx0aGlzLnJvdGF0aW9uLDApO3ZhciBBPVxucC5zdHlsZWRNb2RlP2cmJmUucHJvdG90eXBlLmdldFN0eWxlLmNhbGwoZyxcImZvbnQtc2l6ZVwiKTpkJiZkLmZvbnRTaXplLGY7aWYoSihoKSl7dmFyIGI9aC50b1N0cmluZygpOy0xPT09Yi5pbmRleE9mKFwiPFwiKSYmKGI9Yi5yZXBsYWNlKC9bMC05XS9nLFwiMFwiKSk7Yis9W1wiXCIsdCxBLHRoaXMudGV4dFdpZHRoLGQmJmQudGV4dE92ZXJmbG93LGQmJmQuZm9udFdlaWdodF0uam9pbigpfWImJiFjJiYoZj1GW2JdKTtpZighZil7aWYoS3x8cC5mb3JFeHBvcnQpe3RyeXt2YXIgeT10aGlzLmZha2VUUyYmZnVuY3Rpb24oYSl7dmFyIHA9Zy5xdWVyeVNlbGVjdG9yKFwiLmhpZ2hjaGFydHMtdGV4dC1vdXRsaW5lXCIpO3AmJm4ocCx7ZGlzcGxheTphfSl9O2EoeSkmJnkoXCJub25lXCIpO2Y9Zy5nZXRCQm94P20oe30sZy5nZXRCQm94KCkpOnt3aWR0aDpnLm9mZnNldFdpZHRoLGhlaWdodDpnLm9mZnNldEhlaWdodH07YSh5KSYmeShcIlwiKX1jYXRjaChZKXtcIlwifWlmKCFmfHwwPmYud2lkdGgpZj17d2lkdGg6MCxcbmhlaWdodDowfX1lbHNlIGY9dGhpcy5odG1sR2V0QkJveCgpO3AuaXNTVkcmJihjPWYud2lkdGgscD1mLmhlaWdodCxLJiYoZi5oZWlnaHQ9cD17XCIxMXB4LDE3XCI6MTQsXCIxM3B4LDIwXCI6MTZ9W2QmJmQuZm9udFNpemUrXCIsXCIrTWF0aC5yb3VuZChwKV18fHApLHQmJihkPXQqdyxmLndpZHRoPU1hdGguYWJzKHAqTWF0aC5zaW4oZCkpK01hdGguYWJzKGMqTWF0aC5jb3MoZCkpLGYuaGVpZ2h0PU1hdGguYWJzKHAqTWF0aC5jb3MoZCkpK01hdGguYWJzKGMqTWF0aC5zaW4oZCkpKSk7aWYoYiYmMDxmLmhlaWdodCl7Zm9yKDsyNTA8ci5sZW5ndGg7KWRlbGV0ZSBGW3Iuc2hpZnQoKV07RltiXXx8ci5wdXNoKGIpO0ZbYl09Zn19cmV0dXJuIGZ9O2UucHJvdG90eXBlLmdldFN0eWxlPWZ1bmN0aW9uKGEpe3JldHVybiBrLmdldENvbXB1dGVkU3R5bGUodGhpcy5lbGVtZW50fHx0aGlzLFwiXCIpLmdldFByb3BlcnR5VmFsdWUoYSl9O2UucHJvdG90eXBlLmhhc0NsYXNzPWZ1bmN0aW9uKGEpe3JldHVybi0xIT09XG4oXCJcIit0aGlzLmF0dHIoXCJjbGFzc1wiKSkuc3BsaXQoXCIgXCIpLmluZGV4T2YoYSl9O2UucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oYSl7YT90aGlzLmF0dHIoe3k6LTk5OTl9KTp0aGlzLmF0dHIoe3Zpc2liaWxpdHk6XCJoaWRkZW5cIn0pO3JldHVybiB0aGlzfTtlLnByb3RvdHlwZS5odG1sR2V0QkJveD1mdW5jdGlvbigpe3JldHVybntoZWlnaHQ6MCx3aWR0aDowLHg6MCx5OjB9fTtlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGEsdCl7dGhpcy5lbGVtZW50PVwic3BhblwiPT09dD91KHQpOnYuY3JlYXRlRWxlbWVudE5TKHRoaXMuU1ZHX05TLHQpO3RoaXMucmVuZGVyZXI9YTtjKHRoaXMsXCJhZnRlckluaXRcIil9O2UucHJvdG90eXBlLmludmVydD1mdW5jdGlvbihhKXt0aGlzLmludmVydGVkPWE7dGhpcy51cGRhdGVUcmFuc2Zvcm0oKTtyZXR1cm4gdGhpc307ZS5wcm90b3R5cGUub249ZnVuY3Rpb24oYSxjKXt2YXIgcD10aGlzLm9uRXZlbnRzO2lmKHBbYV0pcFthXSgpO3BbYV09bCh0aGlzLmVsZW1lbnQsXG5hLGMpO3JldHVybiB0aGlzfTtlLnByb3RvdHlwZS5vcGFjaXR5U2V0dGVyPWZ1bmN0aW9uKGEsYyxwKXt0aGlzLm9wYWNpdHk9YT1OdW1iZXIoTnVtYmVyKGEpLnRvRml4ZWQoMykpO3Auc2V0QXR0cmlidXRlKGMsYSl9O2UucHJvdG90eXBlLnJlbW92ZUNsYXNzPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF0dHIoXCJjbGFzc1wiLChcIlwiK3RoaXMuYXR0cihcImNsYXNzXCIpKS5yZXBsYWNlKHIoYSk/bmV3IFJlZ0V4cChcIihefCApXCIrYStcIiggfCQpXCIpOmEsXCIgXCIpLnJlcGxhY2UoLyArL2csXCIgXCIpLnRyaW0oKSl9O2UucHJvdG90eXBlLnJlbW92ZVRleHRPdXRsaW5lPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJ0c3Bhbi5oaWdoY2hhcnRzLXRleHQtb3V0bGluZVwiKTthJiZ0aGlzLnNhZmVSZW1vdmVDaGlsZChhKX07ZS5wcm90b3R5cGUuc2FmZVJlbW92ZUNoaWxkPWZ1bmN0aW9uKGEpe3ZhciBjPWEucGFyZW50Tm9kZTtjJiZjLnJlbW92ZUNoaWxkKGEpfTtcbmUucHJvdG90eXBlLnNldFJhZGlhbFJlZmVyZW5jZT1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmVsZW1lbnQuZ3JhZGllbnQmJnRoaXMucmVuZGVyZXIuZ3JhZGllbnRzW3RoaXMuZWxlbWVudC5ncmFkaWVudF07dGhpcy5lbGVtZW50LnJhZGlhbFJlZmVyZW5jZT1hO2MmJmMucmFkQXR0ciYmYy5hbmltYXRlKHRoaXMucmVuZGVyZXIuZ2V0UmFkaWFsQXR0cihhLGMucmFkQXR0cikpO3JldHVybiB0aGlzfTtlLnByb3RvdHlwZS5zZXRUZXh0UGF0aD1mdW5jdGlvbihhLGMpe3ZhciBwPXRoaXMuZWxlbWVudCx0PXRoaXMudGV4dD90aGlzLnRleHQuZWxlbWVudDpwLGc9e3RleHRBbmNob3I6XCJ0ZXh0LWFuY2hvclwifSxkPSExLEY9dGhpcy50ZXh0UGF0aFdyYXBwZXIscj0hRjtjPUEoITAse2VuYWJsZWQ6ITAsYXR0cmlidXRlczp7ZHk6LTUsc3RhcnRPZmZzZXQ6XCI1MCVcIix0ZXh0QW5jaG9yOlwibWlkZGxlXCJ9fSxjKTt2YXIgSz1iLmZpbHRlclVzZXJBdHRyaWJ1dGVzKGMuYXR0cmlidXRlcyk7XG5pZihhJiZjJiZjLmVuYWJsZWQpe0YmJm51bGw9PT1GLmVsZW1lbnQucGFyZW50Tm9kZT8ocj0hMCxGPUYuZGVzdHJveSgpKTpGJiZ0aGlzLnJlbW92ZVRleHRPdXRsaW5lLmNhbGwoRi5wYXJlbnRHcm91cCk7dGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMucGFkZGluZyYmKEsuZHg9LXRoaXMub3B0aW9ucy5wYWRkaW5nKTtGfHwodGhpcy50ZXh0UGF0aFdyYXBwZXI9Rj10aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0UGF0aFwiKSxkPSEwKTt2YXIgbT1GLmVsZW1lbnQ7KGM9YS5lbGVtZW50LmdldEF0dHJpYnV0ZShcImlkXCIpKXx8YS5lbGVtZW50LnNldEF0dHJpYnV0ZShcImlkXCIsYz1WKCkpO2lmKHIpZm9yKHQuc2V0QXR0cmlidXRlKFwieVwiLDApLGgoSy5keCkmJnQuc2V0QXR0cmlidXRlKFwieFwiLC1LLmR4KSxhPVtdLnNsaWNlLmNhbGwodC5jaGlsZE5vZGVzKSxyPTA7cjxhLmxlbmd0aDtyKyspe3ZhciBsPWFbcl07bC5ub2RlVHlwZSE9PU5vZGUuVEVYVF9OT0RFJiZcInRzcGFuXCIhPT1cbmwubm9kZU5hbWV8fG0uYXBwZW5kQ2hpbGQobCl9ZCYmRiYmRi5hZGQoe2VsZW1lbnQ6dH0pO20uc2V0QXR0cmlidXRlTlMoXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsXCJocmVmXCIsdGhpcy5yZW5kZXJlci51cmwrXCIjXCIrYyk7SihLLmR5KSYmKG0ucGFyZW50Tm9kZS5zZXRBdHRyaWJ1dGUoXCJkeVwiLEsuZHkpLGRlbGV0ZSBLLmR5KTtKKEsuZHgpJiYobS5wYXJlbnROb2RlLnNldEF0dHJpYnV0ZShcImR4XCIsSy5keCksZGVsZXRlIEsuZHgpO3koSyxmdW5jdGlvbihhLHApe20uc2V0QXR0cmlidXRlKGdbcF18fHAsYSl9KTtwLnJlbW92ZUF0dHJpYnV0ZShcInRyYW5zZm9ybVwiKTt0aGlzLnJlbW92ZVRleHRPdXRsaW5lLmNhbGwoRik7dGhpcy50ZXh0JiYhdGhpcy5yZW5kZXJlci5zdHlsZWRNb2RlJiZ0aGlzLmF0dHIoe2ZpbGw6XCJub25lXCIsXCJzdHJva2Utd2lkdGhcIjowfSk7dGhpcy5hcHBseVRleHRPdXRsaW5lPXRoaXMudXBkYXRlVHJhbnNmb3JtPWZ9ZWxzZSBGJiYoZGVsZXRlIHRoaXMudXBkYXRlVHJhbnNmb3JtLFxuZGVsZXRlIHRoaXMuYXBwbHlUZXh0T3V0bGluZSx0aGlzLmRlc3Ryb3lUZXh0UGF0aChwLGEpLHRoaXMudXBkYXRlVHJhbnNmb3JtKCksdGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMucm90YXRpb24mJnRoaXMuYXBwbHlUZXh0T3V0bGluZSh0aGlzLm9wdGlvbnMuc3R5bGUudGV4dE91dGxpbmUpKTtyZXR1cm4gdGhpc307ZS5wcm90b3R5cGUuc2hhZG93PWZ1bmN0aW9uKGEsYyxwKXt2YXIgdD1bXSxnPXRoaXMuZWxlbWVudCxkPXRoaXMub2xkU2hhZG93T3B0aW9ucyxoPXtjb2xvcjpILm5ldXRyYWxDb2xvcjEwMCxvZmZzZXRYOjEsb2Zmc2V0WToxLG9wYWNpdHk6LjE1LHdpZHRoOjN9LHI9ITEsSzshMD09PWE/Sz1oOlwib2JqZWN0XCI9PT10eXBlb2YgYSYmKEs9bShoLGEpKTtLJiYoSyYmZCYmeShLLGZ1bmN0aW9uKGEscCl7YSE9PWRbcF0mJihyPSEwKX0pLHImJnRoaXMuZGVzdHJveVNoYWRvd3MoKSx0aGlzLm9sZFNoYWRvd09wdGlvbnM9Syk7aWYoIUspdGhpcy5kZXN0cm95U2hhZG93cygpO1xuZWxzZSBpZighdGhpcy5zaGFkb3dzKXt2YXIgQT1LLm9wYWNpdHkvSy53aWR0aDt2YXIgZj10aGlzLnBhcmVudEludmVydGVkP1widHJhbnNsYXRlKC0xLC0xKVwiOlwidHJhbnNsYXRlKFwiK0sub2Zmc2V0WCtcIiwgXCIrSy5vZmZzZXRZK1wiKVwiO2ZvcihoPTE7aDw9Sy53aWR0aDtoKyspe3ZhciBiPWcuY2xvbmVOb2RlKCExKTt2YXIgbD0yKksud2lkdGgrMS0yKmg7TihiLHtzdHJva2U6YS5jb2xvcnx8SC5uZXV0cmFsQ29sb3IxMDAsXCJzdHJva2Utb3BhY2l0eVwiOkEqaCxcInN0cm9rZS13aWR0aFwiOmwsdHJhbnNmb3JtOmYsZmlsbDpcIm5vbmVcIn0pO2Iuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwoYi5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKXx8XCJcIikrXCIgaGlnaGNoYXJ0cy1zaGFkb3dcIik7cCYmKE4oYixcImhlaWdodFwiLE1hdGgubWF4KE4oYixcImhlaWdodFwiKS1sLDApKSxiLmN1dEhlaWdodD1sKTtjP2MuZWxlbWVudC5hcHBlbmRDaGlsZChiKTpnLnBhcmVudE5vZGUmJmcucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYixcbmcpO3QucHVzaChiKX10aGlzLnNoYWRvd3M9dH1yZXR1cm4gdGhpc307ZS5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hdHRyKHt2aXNpYmlsaXR5OmE/XCJpbmhlcml0XCI6XCJ2aXNpYmxlXCJ9KX07ZS5wcm90b3R5cGUuc3Ryb2tlU2V0dGVyPWZ1bmN0aW9uKGEsYyxwKXt0aGlzW2NdPWE7dGhpcy5zdHJva2UmJnRoaXNbXCJzdHJva2Utd2lkdGhcIl0/KGUucHJvdG90eXBlLmZpbGxTZXR0ZXIuY2FsbCh0aGlzLHRoaXMuc3Ryb2tlLFwic3Ryb2tlXCIscCkscC5zZXRBdHRyaWJ1dGUoXCJzdHJva2Utd2lkdGhcIix0aGlzW1wic3Ryb2tlLXdpZHRoXCJdKSx0aGlzLmhhc1N0cm9rZT0hMCk6XCJzdHJva2Utd2lkdGhcIj09PWMmJjA9PT1hJiZ0aGlzLmhhc1N0cm9rZT8ocC5yZW1vdmVBdHRyaWJ1dGUoXCJzdHJva2VcIiksdGhpcy5oYXNTdHJva2U9ITEpOnRoaXMucmVuZGVyZXIuc3R5bGVkTW9kZSYmdGhpc1tcInN0cm9rZS13aWR0aFwiXSYmKHAuc2V0QXR0cmlidXRlKFwic3Ryb2tlLXdpZHRoXCIsXG50aGlzW1wic3Ryb2tlLXdpZHRoXCJdKSx0aGlzLmhhc1N0cm9rZT0hMCl9O2UucHJvdG90eXBlLnN0cm9rZVdpZHRoPWZ1bmN0aW9uKCl7aWYoIXRoaXMucmVuZGVyZXIuc3R5bGVkTW9kZSlyZXR1cm4gdGhpc1tcInN0cm9rZS13aWR0aFwiXXx8MDt2YXIgYT10aGlzLmdldFN0eWxlKFwic3Ryb2tlLXdpZHRoXCIpLGM9MDtpZihhLmluZGV4T2YoXCJweFwiKT09PWEubGVuZ3RoLTIpYz1QKGEpO2Vsc2UgaWYoXCJcIiE9PWEpe3ZhciBwPXYuY3JlYXRlRWxlbWVudE5TKHEsXCJyZWN0XCIpO04ocCx7d2lkdGg6YSxcInN0cm9rZS13aWR0aFwiOjB9KTt0aGlzLmVsZW1lbnQucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChwKTtjPXAuZ2V0QkJveCgpLndpZHRoO3AucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChwKX1yZXR1cm4gY307ZS5wcm90b3R5cGUuc3ltYm9sQXR0cj1mdW5jdGlvbihhKXt2YXIgYz10aGlzO1wieCB5IHIgc3RhcnQgZW5kIHdpZHRoIGhlaWdodCBpbm5lclIgYW5jaG9yWCBhbmNob3JZIGNsb2Nrd2lzZVwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKHApe2NbcF09XG5MKGFbcF0sY1twXSl9KTtjLmF0dHIoe2Q6Yy5yZW5kZXJlci5zeW1ib2xzW2Muc3ltYm9sTmFtZV0oYy54LGMueSxjLndpZHRoLGMuaGVpZ2h0LGMpfSl9O2UucHJvdG90eXBlLnRleHRTZXR0ZXI9ZnVuY3Rpb24oYSl7YSE9PXRoaXMudGV4dFN0ciYmKGRlbGV0ZSB0aGlzLnRleHRQeExlbmd0aCx0aGlzLnRleHRTdHI9YSx0aGlzLmFkZGVkJiZ0aGlzLnJlbmRlcmVyLmJ1aWxkVGV4dCh0aGlzKSl9O2UucHJvdG90eXBlLnRpdGxlU2V0dGVyPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudCxwPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0aXRsZVwiKVswXXx8di5jcmVhdGVFbGVtZW50TlModGhpcy5TVkdfTlMsXCJ0aXRsZVwiKTtjLmluc2VydEJlZm9yZT9jLmluc2VydEJlZm9yZShwLGMuZmlyc3RDaGlsZCk6Yy5hcHBlbmRDaGlsZChwKTtwLnRleHRDb250ZW50PVN0cmluZyhMKGEsXCJcIikpLnJlcGxhY2UoLzxbXj5dKj4vZyxcIlwiKS5yZXBsYWNlKC8mbHQ7L2csXCI8XCIpLnJlcGxhY2UoLyZndDsvZyxcblwiPlwiKX07ZS5wcm90b3R5cGUudG9Gcm9udD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZWxlbWVudDthLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoYSk7cmV0dXJuIHRoaXN9O2UucHJvdG90eXBlLnRyYW5zbGF0ZT1mdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmF0dHIoe3RyYW5zbGF0ZVg6YSx0cmFuc2xhdGVZOmN9KX07ZS5wcm90b3R5cGUudXBkYXRlU2hhZG93cz1mdW5jdGlvbihhLGMscCl7dmFyIHQ9dGhpcy5zaGFkb3dzO2lmKHQpZm9yKHZhciBnPXQubGVuZ3RoO2ctLTspcC5jYWxsKHRbZ10sXCJoZWlnaHRcIj09PWE/TWF0aC5tYXgoYy0odFtnXS5jdXRIZWlnaHR8fDApLDApOlwiZFwiPT09YT90aGlzLmQ6YyxhLHRbZ10pfTtlLnByb3RvdHlwZS51cGRhdGVUcmFuc2Zvcm09ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNjYWxlWCxjPXRoaXMuc2NhbGVZLHA9dGhpcy5pbnZlcnRlZCxnPXRoaXMucm90YXRpb24sZD10aGlzLm1hdHJpeCxoPXRoaXMuZWxlbWVudCxGPXRoaXMudHJhbnNsYXRlWHx8XG4wLHI9dGhpcy50cmFuc2xhdGVZfHwwO3AmJihGKz10aGlzLndpZHRoLHIrPXRoaXMuaGVpZ2h0KTtGPVtcInRyYW5zbGF0ZShcIitGK1wiLFwiK3IrXCIpXCJdO0ooZCkmJkYucHVzaChcIm1hdHJpeChcIitkLmpvaW4oXCIsXCIpK1wiKVwiKTtwP0YucHVzaChcInJvdGF0ZSg5MCkgc2NhbGUoLTEsMSlcIik6ZyYmRi5wdXNoKFwicm90YXRlKFwiK2crXCIgXCIrTCh0aGlzLnJvdGF0aW9uT3JpZ2luWCxoLmdldEF0dHJpYnV0ZShcInhcIiksMCkrXCIgXCIrTCh0aGlzLnJvdGF0aW9uT3JpZ2luWSxoLmdldEF0dHJpYnV0ZShcInlcIil8fDApK1wiKVwiKTsoSihhKXx8SihjKSkmJkYucHVzaChcInNjYWxlKFwiK0woYSwxKStcIiBcIitMKGMsMSkrXCIpXCIpO0YubGVuZ3RoJiZoLnNldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiLEYuam9pbihcIiBcIikpfTtlLnByb3RvdHlwZS52aXNpYmlsaXR5U2V0dGVyPWZ1bmN0aW9uKGEsYyxwKXtcImluaGVyaXRcIj09PWE/cC5yZW1vdmVBdHRyaWJ1dGUoYyk6dGhpc1tjXSE9PWEmJnAuc2V0QXR0cmlidXRlKGMsXG5hKTt0aGlzW2NdPWF9O2UucHJvdG90eXBlLnhHZXR0ZXI9ZnVuY3Rpb24oYSl7XCJjaXJjbGVcIj09PXRoaXMuZWxlbWVudC5ub2RlTmFtZSYmKFwieFwiPT09YT9hPVwiY3hcIjpcInlcIj09PWEmJihhPVwiY3lcIikpO3JldHVybiB0aGlzLl9kZWZhdWx0R2V0dGVyKGEpfTtlLnByb3RvdHlwZS56SW5kZXhTZXR0ZXI9ZnVuY3Rpb24oYSxjKXt2YXIgcD10aGlzLnJlbmRlcmVyLGc9dGhpcy5wYXJlbnRHcm91cCx0PShnfHxwKS5lbGVtZW50fHxwLmJveCxkPXRoaXMuZWxlbWVudDtwPXQ9PT1wLmJveDt2YXIgaD0hMTt2YXIgcj10aGlzLmFkZGVkO3ZhciBLO0ooYSk/KGQuc2V0QXR0cmlidXRlKFwiZGF0YS16LWluZGV4XCIsYSksYT0rYSx0aGlzW2NdPT09YSYmKHI9ITEpKTpKKHRoaXNbY10pJiZkLnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtei1pbmRleFwiKTt0aGlzW2NdPWE7aWYocil7KGE9dGhpcy56SW5kZXgpJiZnJiYoZy5oYW5kbGVaPSEwKTtjPXQuY2hpbGROb2Rlcztmb3IoSz1jLmxlbmd0aC0xOzA8PVxuSyYmIWg7Sy0tKXtnPWNbS107cj1nLmdldEF0dHJpYnV0ZShcImRhdGEtei1pbmRleFwiKTt2YXIgbT0hSihyKTtpZihnIT09ZClpZigwPmEmJm0mJiFwJiYhSyl0Lmluc2VydEJlZm9yZShkLGNbS10pLGg9ITA7ZWxzZSBpZihQKHIpPD1hfHxtJiYoIUooYSl8fDA8PWEpKXQuaW5zZXJ0QmVmb3JlKGQsY1tLKzFdfHxudWxsKSxoPSEwfWh8fCh0Lmluc2VydEJlZm9yZShkLGNbcD8zOjBdfHxudWxsKSxoPSEwKX1yZXR1cm4gaH07cmV0dXJuIGV9KCk7ZS5wcm90b3R5cGVbXCJzdHJva2Utd2lkdGhTZXR0ZXJcIl09ZS5wcm90b3R5cGUuc3Ryb2tlU2V0dGVyO2UucHJvdG90eXBlLnlHZXR0ZXI9ZS5wcm90b3R5cGUueEdldHRlcjtlLnByb3RvdHlwZS5tYXRyaXhTZXR0ZXI9ZS5wcm90b3R5cGUucm90YXRpb25PcmlnaW5YU2V0dGVyPWUucHJvdG90eXBlLnJvdGF0aW9uT3JpZ2luWVNldHRlcj1lLnByb3RvdHlwZS5yb3RhdGlvblNldHRlcj1lLnByb3RvdHlwZS5zY2FsZVhTZXR0ZXI9ZS5wcm90b3R5cGUuc2NhbGVZU2V0dGVyPVxuZS5wcm90b3R5cGUudHJhbnNsYXRlWFNldHRlcj1lLnByb3RvdHlwZS50cmFuc2xhdGVZU2V0dGVyPWUucHJvdG90eXBlLnZlcnRpY2FsQWxpZ25TZXR0ZXI9ZnVuY3Rpb24oYSxjKXt0aGlzW2NdPWE7dGhpcy5kb1RyYW5zZm9ybT0hMH07XCJcIjtyZXR1cm4gZX0pO08oZSxcIkNvcmUvUmVuZGVyZXIvU1ZHL1NWR0xhYmVsLmpzXCIsW2VbXCJDb3JlL1JlbmRlcmVyL1NWRy9TVkdFbGVtZW50LmpzXCJdLGVbXCJDb3JlL1V0aWxpdGllcy5qc1wiXV0sZnVuY3Rpb24oZSxiKXtmdW5jdGlvbiBEKGIsZil7QyhiKT9iIT09dGhpc1tmXSYmKHRoaXNbZl09Yix0aGlzLnVwZGF0ZVRleHRQYWRkaW5nKCkpOnRoaXNbZl09dm9pZCAwfXZhciB6PXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbigpe3ZhciBiPWZ1bmN0aW9uKGYsZCl7Yj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oZCxiKXtkLl9fcHJvdG9fXz1ifXx8ZnVuY3Rpb24oZCxcbmIpe2Zvcih2YXIgZiBpbiBiKWIuaGFzT3duUHJvcGVydHkoZikmJihkW2ZdPWJbZl0pfTtyZXR1cm4gYihmLGQpfTtyZXR1cm4gZnVuY3Rpb24oZixkKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1mfWIoZixkKTtmLnByb3RvdHlwZT1udWxsPT09ZD9PYmplY3QuY3JlYXRlKGQpOihxLnByb3RvdHlwZT1kLnByb3RvdHlwZSxuZXcgcSl9fSgpLEg9Yi5kZWZpbmVkLEc9Yi5leHRlbmQsQz1iLmlzTnVtYmVyLEI9Yi5tZXJnZSx4PWIucGljayx3PWIucmVtb3ZlRXZlbnQ7cmV0dXJuIGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGYoZCxxLGssbCxlLHUsbix2LEUsbSl7dmFyIGM9Yi5jYWxsKHRoaXMpfHx0aGlzO2MucGFkZGluZ1NldHRlcj1EO2MucGFkZGluZ0xlZnRTZXR0ZXI9RDtjLnBhZGRpbmdSaWdodFNldHRlcj1EO2MuaW5pdChkLFwiZ1wiKTtjLnRleHRTdHI9cTtjLng9aztjLnk9bDtjLmFuY2hvclg9dTtjLmFuY2hvclk9bjtjLmJhc2VsaW5lPUU7Yy5jbGFzc05hbWU9bTtcImJ1dHRvblwiIT09XG5tJiZjLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1sYWJlbFwiKTttJiZjLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1cIittKTtjLnRleHQ9ZC50ZXh0KFwiXCIsMCwwLHYpLmF0dHIoe3pJbmRleDoxfSk7aWYoXCJzdHJpbmdcIj09PXR5cGVvZiBlKXt2YXIgZz0vXnVybFxcKCguKj8pXFwpJC8udGVzdChlKTtpZihjLnJlbmRlcmVyLnN5bWJvbHNbZV18fGcpYy5zeW1ib2xLZXk9ZX1jLmJCb3g9Zi5lbXB0eUJCb3g7Yy5wYWRkaW5nPTM7Yy5iYXNlbGluZU9mZnNldD0wO2MubmVlZHNCb3g9ZC5zdHlsZWRNb2RlfHxnO2MuZGVmZXJyZWRBdHRyPXt9O2MuYWxpZ25GYWN0b3I9MDtyZXR1cm4gY316KGYsYik7Zi5wcm90b3R5cGUuYWxpZ25TZXR0ZXI9ZnVuY3Rpb24oZCl7ZD17bGVmdDowLGNlbnRlcjouNSxyaWdodDoxfVtkXTtkIT09dGhpcy5hbGlnbkZhY3RvciYmKHRoaXMuYWxpZ25GYWN0b3I9ZCx0aGlzLmJCb3gmJkModGhpcy54U2V0dGluZykmJnRoaXMuYXR0cih7eDp0aGlzLnhTZXR0aW5nfSkpfTtmLnByb3RvdHlwZS5hbmNob3JYU2V0dGVyPVxuZnVuY3Rpb24oZCxiKXt0aGlzLmFuY2hvclg9ZDt0aGlzLmJveEF0dHIoYixNYXRoLnJvdW5kKGQpLXRoaXMuZ2V0Q3Jpc3BBZGp1c3QoKS10aGlzLnhTZXR0aW5nKX07Zi5wcm90b3R5cGUuYW5jaG9yWVNldHRlcj1mdW5jdGlvbihkLGIpe3RoaXMuYW5jaG9yWT1kO3RoaXMuYm94QXR0cihiLGQtdGhpcy55U2V0dGluZyl9O2YucHJvdG90eXBlLmJveEF0dHI9ZnVuY3Rpb24oZCxiKXt0aGlzLmJveD90aGlzLmJveC5hdHRyKGQsYik6dGhpcy5kZWZlcnJlZEF0dHJbZF09Yn07Zi5wcm90b3R5cGUuY3NzPWZ1bmN0aW9uKGQpe2lmKGQpe3ZhciBiPXt9LGs9dm9pZCAwO2Q9QihkKTtmLnRleHRQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uKGYpe1widW5kZWZpbmVkXCIhPT10eXBlb2YgZFtmXSYmKGJbZl09ZFtmXSxkZWxldGUgZFtmXSl9KTt0aGlzLnRleHQuY3NzKGIpO2s9XCJ3aWR0aFwiaW4gYjtcImZvbnRTaXplXCJpbiBifHxcImZvbnRXZWlnaHRcImluIGI/dGhpcy51cGRhdGVUZXh0UGFkZGluZygpOlxuayYmdGhpcy51cGRhdGVCb3hTaXplKCl9cmV0dXJuIGUucHJvdG90eXBlLmNzcy5jYWxsKHRoaXMsZCl9O2YucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt3KHRoaXMuZWxlbWVudCxcIm1vdXNlZW50ZXJcIik7dyh0aGlzLmVsZW1lbnQsXCJtb3VzZWxlYXZlXCIpO3RoaXMudGV4dCYmdGhpcy50ZXh0LmRlc3Ryb3koKTt0aGlzLmJveCYmKHRoaXMuYm94PXRoaXMuYm94LmRlc3Ryb3koKSk7ZS5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpfTtmLnByb3RvdHlwZS5maWxsU2V0dGVyPWZ1bmN0aW9uKGQsYil7ZCYmKHRoaXMubmVlZHNCb3g9ITApO3RoaXMuZmlsbD1kO3RoaXMuYm94QXR0cihiLGQpfTtmLnByb3RvdHlwZS5nZXRCQm94PWZ1bmN0aW9uKCl7dGhpcy50ZXh0U3RyJiYwPT09dGhpcy5iQm94LndpZHRoJiYwPT09dGhpcy5iQm94LmhlaWdodCYmdGhpcy51cGRhdGVCb3hTaXplKCk7dmFyIGQ9dGhpcy5wYWRkaW5nLGI9eCh0aGlzLnBhZGRpbmdMZWZ0LGQpO3JldHVybnt3aWR0aDp0aGlzLndpZHRoLFxuaGVpZ2h0OnRoaXMuaGVpZ2h0LHg6dGhpcy5iQm94LngtYix5OnRoaXMuYkJveC55LWR9fTtmLnByb3RvdHlwZS5nZXRDcmlzcEFkanVzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLnN0eWxlZE1vZGUmJnRoaXMuYm94P3RoaXMuYm94LnN0cm9rZVdpZHRoKCklMi8yOih0aGlzW1wic3Ryb2tlLXdpZHRoXCJdP3BhcnNlSW50KHRoaXNbXCJzdHJva2Utd2lkdGhcIl0sMTApOjApJTIvMn07Zi5wcm90b3R5cGUuaGVpZ2h0U2V0dGVyPWZ1bmN0aW9uKGQpe3RoaXMuaGVpZ2h0U2V0dGluZz1kfTtmLnByb3RvdHlwZS5vbj1mdW5jdGlvbihkLGIpe3ZhciBmPXRoaXMsbD1mLnRleHQscT1sJiZcIlNQQU5cIj09PWwuZWxlbWVudC50YWdOYW1lP2w6dm9pZCAwO2lmKHEpe3ZhciB1PWZ1bmN0aW9uKGwpeyhcIm1vdXNlZW50ZXJcIj09PWR8fFwibW91c2VsZWF2ZVwiPT09ZCkmJmwucmVsYXRlZFRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQmJihmLmVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24obC5yZWxhdGVkVGFyZ2V0KSZcbk5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZfHxxLmVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24obC5yZWxhdGVkVGFyZ2V0KSZOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWSl8fGIuY2FsbChmLmVsZW1lbnQsbCl9O3Eub24oZCx1KX1lLnByb3RvdHlwZS5vbi5jYWxsKGYsZCx1fHxiKTtyZXR1cm4gZn07Zi5wcm90b3R5cGUub25BZGQ9ZnVuY3Rpb24oKXt2YXIgZD10aGlzLnRleHRTdHI7dGhpcy50ZXh0LmFkZCh0aGlzKTt0aGlzLmF0dHIoe3RleHQ6SChkKT9kOlwiXCIseDp0aGlzLngseTp0aGlzLnl9KTt0aGlzLmJveCYmSCh0aGlzLmFuY2hvclgpJiZ0aGlzLmF0dHIoe2FuY2hvclg6dGhpcy5hbmNob3JYLGFuY2hvclk6dGhpcy5hbmNob3JZfSl9O2YucHJvdG90eXBlLnJTZXR0ZXI9ZnVuY3Rpb24oZCxiKXt0aGlzLmJveEF0dHIoYixkKX07Zi5wcm90b3R5cGUuc2hhZG93PWZ1bmN0aW9uKGQpe2QmJiF0aGlzLnJlbmRlcmVyLnN0eWxlZE1vZGUmJlxuKHRoaXMudXBkYXRlQm94U2l6ZSgpLHRoaXMuYm94JiZ0aGlzLmJveC5zaGFkb3coZCkpO3JldHVybiB0aGlzfTtmLnByb3RvdHlwZS5zdHJva2VTZXR0ZXI9ZnVuY3Rpb24oZCxiKXt0aGlzLnN0cm9rZT1kO3RoaXMuYm94QXR0cihiLGQpfTtmLnByb3RvdHlwZVtcInN0cm9rZS13aWR0aFNldHRlclwiXT1mdW5jdGlvbihkLGIpe2QmJih0aGlzLm5lZWRzQm94PSEwKTt0aGlzW1wic3Ryb2tlLXdpZHRoXCJdPWQ7dGhpcy5ib3hBdHRyKGIsZCl9O2YucHJvdG90eXBlW1widGV4dC1hbGlnblNldHRlclwiXT1mdW5jdGlvbihkKXt0aGlzLnRleHRBbGlnbj1kfTtmLnByb3RvdHlwZS50ZXh0U2V0dGVyPWZ1bmN0aW9uKGQpe1widW5kZWZpbmVkXCIhPT10eXBlb2YgZCYmdGhpcy50ZXh0LmF0dHIoe3RleHQ6ZH0pO3RoaXMudXBkYXRlVGV4dFBhZGRpbmcoKX07Zi5wcm90b3R5cGUudXBkYXRlQm94U2l6ZT1mdW5jdGlvbigpe3ZhciBkPXRoaXMudGV4dC5lbGVtZW50LnN0eWxlLGI9e30sZT10aGlzLnBhZGRpbmcsXG5sPXRoaXMuYkJveD1DKHRoaXMud2lkdGhTZXR0aW5nKSYmQyh0aGlzLmhlaWdodFNldHRpbmcpJiYhdGhpcy50ZXh0QWxpZ258fCFIKHRoaXMudGV4dC50ZXh0U3RyKT9mLmVtcHR5QkJveDp0aGlzLnRleHQuZ2V0QkJveCgpO3RoaXMud2lkdGg9dGhpcy5nZXRQYWRkZWRXaWR0aCgpO3RoaXMuaGVpZ2h0PSh0aGlzLmhlaWdodFNldHRpbmd8fGwuaGVpZ2h0fHwwKSsyKmU7dGhpcy5iYXNlbGluZU9mZnNldD1lK01hdGgubWluKHRoaXMucmVuZGVyZXIuZm9udE1ldHJpY3MoZCYmZC5mb250U2l6ZSx0aGlzLnRleHQpLmIsbC5oZWlnaHR8fEluZmluaXR5KTt0aGlzLm5lZWRzQm94JiYodGhpcy5ib3h8fChkPXRoaXMuYm94PXRoaXMuc3ltYm9sS2V5P3RoaXMucmVuZGVyZXIuc3ltYm9sKHRoaXMuc3ltYm9sS2V5KTp0aGlzLnJlbmRlcmVyLnJlY3QoKSxkLmFkZENsYXNzKChcImJ1dHRvblwiPT09dGhpcy5jbGFzc05hbWU/XCJcIjpcImhpZ2hjaGFydHMtbGFiZWwtYm94XCIpKyh0aGlzLmNsYXNzTmFtZT9cblwiIGhpZ2hjaGFydHMtXCIrdGhpcy5jbGFzc05hbWUrXCItYm94XCI6XCJcIikpLGQuYWRkKHRoaXMpKSxkPXRoaXMuZ2V0Q3Jpc3BBZGp1c3QoKSxiLng9ZCxiLnk9KHRoaXMuYmFzZWxpbmU/LXRoaXMuYmFzZWxpbmVPZmZzZXQ6MCkrZCxiLndpZHRoPU1hdGgucm91bmQodGhpcy53aWR0aCksYi5oZWlnaHQ9TWF0aC5yb3VuZCh0aGlzLmhlaWdodCksdGhpcy5ib3guYXR0cihHKGIsdGhpcy5kZWZlcnJlZEF0dHIpKSx0aGlzLmRlZmVycmVkQXR0cj17fSl9O2YucHJvdG90eXBlLnVwZGF0ZVRleHRQYWRkaW5nPWZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy50ZXh0O3RoaXMudXBkYXRlQm94U2l6ZSgpO3ZhciBiPXRoaXMuYmFzZWxpbmU/MDp0aGlzLmJhc2VsaW5lT2Zmc2V0LGY9eCh0aGlzLnBhZGRpbmdMZWZ0LHRoaXMucGFkZGluZyk7SCh0aGlzLndpZHRoU2V0dGluZykmJnRoaXMuYkJveCYmKFwiY2VudGVyXCI9PT10aGlzLnRleHRBbGlnbnx8XCJyaWdodFwiPT09dGhpcy50ZXh0QWxpZ24pJiYoZis9XG57Y2VudGVyOi41LHJpZ2h0OjF9W3RoaXMudGV4dEFsaWduXSoodGhpcy53aWR0aFNldHRpbmctdGhpcy5iQm94LndpZHRoKSk7aWYoZiE9PWQueHx8YiE9PWQueSlkLmF0dHIoXCJ4XCIsZiksZC5oYXNCb3hXaWR0aENoYW5nZWQmJih0aGlzLmJCb3g9ZC5nZXRCQm94KCEwKSksXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBiJiZkLmF0dHIoXCJ5XCIsYik7ZC54PWY7ZC55PWJ9O2YucHJvdG90eXBlLndpZHRoU2V0dGVyPWZ1bmN0aW9uKGQpe3RoaXMud2lkdGhTZXR0aW5nPUMoZCk/ZDp2b2lkIDB9O2YucHJvdG90eXBlLmdldFBhZGRlZFdpZHRoPWZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5wYWRkaW5nLGI9eCh0aGlzLnBhZGRpbmdMZWZ0LGQpO2Q9eCh0aGlzLnBhZGRpbmdSaWdodCxkKTtyZXR1cm4odGhpcy53aWR0aFNldHRpbmd8fHRoaXMuYkJveC53aWR0aHx8MCkrYitkfTtmLnByb3RvdHlwZS54U2V0dGVyPWZ1bmN0aW9uKGQpe3RoaXMueD1kO3RoaXMuYWxpZ25GYWN0b3ImJihkLT10aGlzLmFsaWduRmFjdG9yKlxudGhpcy5nZXRQYWRkZWRXaWR0aCgpLHRoaXNbXCJmb3JjZUFuaW1hdGU6eFwiXT0hMCk7dGhpcy54U2V0dGluZz1NYXRoLnJvdW5kKGQpO3RoaXMuYXR0cihcInRyYW5zbGF0ZVhcIix0aGlzLnhTZXR0aW5nKX07Zi5wcm90b3R5cGUueVNldHRlcj1mdW5jdGlvbihkKXt0aGlzLnlTZXR0aW5nPXRoaXMueT1NYXRoLnJvdW5kKGQpO3RoaXMuYXR0cihcInRyYW5zbGF0ZVlcIix0aGlzLnlTZXR0aW5nKX07Zi5lbXB0eUJCb3g9e3dpZHRoOjAsaGVpZ2h0OjAseDowLHk6MH07Zi50ZXh0UHJvcHM9XCJjb2xvciBkaXJlY3Rpb24gZm9udEZhbWlseSBmb250U2l6ZSBmb250U3R5bGUgZm9udFdlaWdodCBsaW5lSGVpZ2h0IHRleHRBbGlnbiB0ZXh0RGVjb3JhdGlvbiB0ZXh0T3V0bGluZSB0ZXh0T3ZlcmZsb3cgd2lkdGhcIi5zcGxpdChcIiBcIik7cmV0dXJuIGZ9KGUpfSk7TyhlLFwiQ29yZS9SZW5kZXJlci9TVkcvVGV4dEJ1aWxkZXIuanNcIixbZVtcIkNvcmUvR2xvYmFscy5qc1wiXSxlW1wiQ29yZS9VdGlsaXRpZXMuanNcIl0sXG5lW1wiQ29yZS9SZW5kZXJlci9IVE1ML0FTVC5qc1wiXV0sZnVuY3Rpb24oZSxiLEkpe3ZhciBEPWUuZG9jLEg9ZS5TVkdfTlMsRz1iLmF0dHIsQz1iLmlzU3RyaW5nLEI9Yi5vYmplY3RFYWNoLHg9Yi5waWNrO3JldHVybiBmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7dmFyIGY9Yi5zdHlsZXM7dGhpcy5yZW5kZXJlcj1iLnJlbmRlcmVyO3RoaXMuc3ZnRWxlbWVudD1iO3RoaXMud2lkdGg9Yi50ZXh0V2lkdGg7dGhpcy50ZXh0TGluZUhlaWdodD1mJiZmLmxpbmVIZWlnaHQ7dGhpcy50ZXh0T3V0bGluZT1mJiZmLnRleHRPdXRsaW5lO3RoaXMuZWxsaXBzaXM9ISghZnx8XCJlbGxpcHNpc1wiIT09Zi50ZXh0T3ZlcmZsb3cpO3RoaXMubm9XcmFwPSEoIWZ8fFwibm93cmFwXCIhPT1mLndoaXRlU3BhY2UpO3RoaXMuZm9udFNpemU9ZiYmZi5mb250U2l6ZX1iLnByb3RvdHlwZS5idWlsZFNWRz1mdW5jdGlvbigpe3ZhciBiPXRoaXMuc3ZnRWxlbWVudCxmPWIuZWxlbWVudCxkPWIucmVuZGVyZXIsZT1cbngoYi50ZXh0U3RyLFwiXCIpLnRvU3RyaW5nKCksaz0tMSE9PWUuaW5kZXhPZihcIjxcIiksbD1mLmNoaWxkTm9kZXMsTj1sLmxlbmd0aDtkPXRoaXMud2lkdGgmJiFiLmFkZGVkJiZkLmJveDt2YXIgdT0vPGJyLio/Pi9nO3ZhciBuPVtlLHRoaXMuZWxsaXBzaXMsdGhpcy5ub1dyYXAsdGhpcy50ZXh0TGluZUhlaWdodCx0aGlzLnRleHRPdXRsaW5lLHRoaXMuZm9udFNpemUsdGhpcy53aWR0aF0uam9pbigpO2lmKG4hPT1iLnRleHRDYWNoZSl7Yi50ZXh0Q2FjaGU9bjtmb3IoZGVsZXRlIGIuYWN0dWFsV2lkdGg7Ti0tOylmLnJlbW92ZUNoaWxkKGxbTl0pO2t8fHRoaXMuZWxsaXBzaXN8fHRoaXMud2lkdGh8fC0xIT09ZS5pbmRleE9mKFwiIFwiKSYmKCF0aGlzLm5vV3JhcHx8dS50ZXN0KGUpKT9cIlwiIT09ZSYmKGQmJmQuYXBwZW5kQ2hpbGQoZiksZT1uZXcgSShlKSx0aGlzLm1vZGlmeVRyZWUoZS5ub2RlcyksZS5hZGRUb0RPTShiLmVsZW1lbnQpLHRoaXMubW9kaWZ5RE9NKCksdGhpcy5lbGxpcHNpcyYmXG4tMSE9PShmLnRleHRDb250ZW50fHxcIlwiKS5pbmRleE9mKFwiXFx1MjAyNlwiKSYmYi5hdHRyKFwidGl0bGVcIix0aGlzLnVuZXNjYXBlRW50aXRpZXMoYi50ZXh0U3RyfHxcIlwiLFtcIiZsdDtcIixcIiZndDtcIl0pKSxkJiZkLnJlbW92ZUNoaWxkKGYpKTpmLmFwcGVuZENoaWxkKEQuY3JlYXRlVGV4dE5vZGUodGhpcy51bmVzY2FwZUVudGl0aWVzKGUpKSk7Qyh0aGlzLnRleHRPdXRsaW5lKSYmYi5hcHBseVRleHRPdXRsaW5lJiZiLmFwcGx5VGV4dE91dGxpbmUodGhpcy50ZXh0T3V0bGluZSl9fTtiLnByb3RvdHlwZS5tb2RpZnlET009ZnVuY3Rpb24oKXt2YXIgYj10aGlzLGY9dGhpcy5zdmdFbGVtZW50LGQ9RyhmLmVsZW1lbnQsXCJ4XCIpO1tdLmZvckVhY2guY2FsbChmLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcInRzcGFuLmhpZ2hjaGFydHMtYnJcIiksZnVuY3Rpb24oZil7Zi5uZXh0U2libGluZyYmZi5wcmV2aW91c1NpYmxpbmcmJkcoZix7ZHk6Yi5nZXRMaW5lSGVpZ2h0KGYubmV4dFNpYmxpbmcpLFxueDpkfSl9KTt2YXIgZT10aGlzLndpZHRofHwwO2lmKGUpe3ZhciBrPWZ1bmN0aW9uKGwsdSl7dmFyIG49bC50ZXh0Q29udGVudHx8XCJcIixrPW4ucmVwbGFjZSgvKFteXFxeXSktL2csXCIkMS0gXCIpLnNwbGl0KFwiIFwiKSxxPSFiLm5vV3JhcCYmKDE8ay5sZW5ndGh8fDE8Zi5lbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoKSxtPWIuZ2V0TGluZUhlaWdodCh1KSxjPTAsZz1mLmFjdHVhbFdpZHRoO2lmKGIuZWxsaXBzaXMpbiYmYi50cnVuY2F0ZShsLG4sdm9pZCAwLDAsTWF0aC5tYXgoMCxlLXBhcnNlSW50KGIuZm9udFNpemV8fDEyLDEwKSksZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5zdWJzdHJpbmcoMCxjKStcIlxcdTIwMjZcIn0pO2Vsc2UgaWYocSl7bj1bXTtmb3IocT1bXTt1LmZpcnN0Q2hpbGQmJnUuZmlyc3RDaGlsZCE9PWw7KXEucHVzaCh1LmZpcnN0Q2hpbGQpLHUucmVtb3ZlQ2hpbGQodS5maXJzdENoaWxkKTtmb3IoO2subGVuZ3RoOylrLmxlbmd0aCYmIWIubm9XcmFwJiYwPGMmJihuLnB1c2gobC50ZXh0Q29udGVudHx8XG5cIlwiKSxsLnRleHRDb250ZW50PWsuam9pbihcIiBcIikucmVwbGFjZSgvLSAvZyxcIi1cIikpLGIudHJ1bmNhdGUobCx2b2lkIDAsaywwPT09Yz9nfHwwOjAsZSxmdW5jdGlvbihhLGMpe3JldHVybiBrLnNsaWNlKDAsYykuam9pbihcIiBcIikucmVwbGFjZSgvLSAvZyxcIi1cIil9KSxnPWYuYWN0dWFsV2lkdGgsYysrO3EuZm9yRWFjaChmdW5jdGlvbihhKXt1Lmluc2VydEJlZm9yZShhLGwpfSk7bi5mb3JFYWNoKGZ1bmN0aW9uKGEpe3UuaW5zZXJ0QmVmb3JlKEQuY3JlYXRlVGV4dE5vZGUoYSksbCk7YT1ELmNyZWF0ZUVsZW1lbnROUyhILFwidHNwYW5cIik7YS50ZXh0Q29udGVudD1cIlxcdTIwMGJcIjtHKGEse2R5Om0seDpkfSk7dS5pbnNlcnRCZWZvcmUoYSxsKX0pfX0sbD1mdW5jdGlvbihkKXtbXS5zbGljZS5jYWxsKGQuY2hpbGROb2RlcykuZm9yRWFjaChmdW5jdGlvbihiKXtiLm5vZGVUeXBlPT09Tm9kZS5URVhUX05PREU/ayhiLGQpOigtMSE9PWIuY2xhc3NOYW1lLmJhc2VWYWwuaW5kZXhPZihcImhpZ2hjaGFydHMtYnJcIikmJlxuKGYuYWN0dWFsV2lkdGg9MCksbChiKSl9KX07bChmLmVsZW1lbnQpfX07Yi5wcm90b3R5cGUuZ2V0TGluZUhlaWdodD1mdW5jdGlvbihiKXt2YXIgZjtiPWIubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERT9iLnBhcmVudEVsZW1lbnQ6Yjt0aGlzLnJlbmRlcmVyLnN0eWxlZE1vZGV8fChmPWImJi8ocHh8ZW0pJC8udGVzdChiLnN0eWxlLmZvbnRTaXplKT9iLnN0eWxlLmZvbnRTaXplOnRoaXMuZm9udFNpemV8fHRoaXMucmVuZGVyZXIuc3R5bGUuZm9udFNpemV8fDEyKTtyZXR1cm4gdGhpcy50ZXh0TGluZUhlaWdodD9wYXJzZUludCh0aGlzLnRleHRMaW5lSGVpZ2h0LnRvU3RyaW5nKCksMTApOnRoaXMucmVuZGVyZXIuZm9udE1ldHJpY3MoZixifHx0aGlzLnN2Z0VsZW1lbnQuZWxlbWVudCkuaH07Yi5wcm90b3R5cGUubW9kaWZ5VHJlZT1mdW5jdGlvbihiKXt2YXIgZj10aGlzLGQ9ZnVuY3Rpb24oZSxrKXt2YXIgbD1lLnRhZ05hbWUscT1mLnJlbmRlcmVyLnN0eWxlZE1vZGUsdT1lLmF0dHJpYnV0ZXN8fFxue307aWYoXCJiXCI9PT1sfHxcInN0cm9uZ1wiPT09bClxP3VbXCJjbGFzc1wiXT1cImhpZ2hjaGFydHMtc3Ryb25nXCI6dS5zdHlsZT1cImZvbnQtd2VpZ2h0OmJvbGQ7XCIrKHUuc3R5bGV8fFwiXCIpO2Vsc2UgaWYoXCJpXCI9PT1sfHxcImVtXCI9PT1sKXE/dVtcImNsYXNzXCJdPVwiaGlnaGNoYXJ0cy1lbXBoYXNpemVkXCI6dS5zdHlsZT1cImZvbnQtc3R5bGU6aXRhbGljO1wiKyh1LnN0eWxlfHxcIlwiKTtDKHUuc3R5bGUpJiYodS5zdHlsZT11LnN0eWxlLnJlcGxhY2UoLyg7fCB8Xiljb2xvcihbIDpdKS8sXCIkMWZpbGwkMlwiKSk7XCJiclwiPT09bCYmKHVbXCJjbGFzc1wiXT1cImhpZ2hjaGFydHMtYnJcIixlLnRleHRDb250ZW50PVwiXFx1MjAwYlwiLChrPWJbaysxXSkmJmsudGV4dENvbnRlbnQmJihrLnRleHRDb250ZW50PWsudGV4dENvbnRlbnQucmVwbGFjZSgvXiArL2dtLFwiXCIpKSk7XCIjdGV4dFwiIT09bCYmXCJhXCIhPT1sJiYoZS50YWdOYW1lPVwidHNwYW5cIik7ZS5hdHRyaWJ1dGVzPXU7ZS5jaGlsZHJlbiYmZS5jaGlsZHJlbi5maWx0ZXIoZnVuY3Rpb24oZCl7cmV0dXJuXCIjdGV4dFwiIT09XG5kLnRhZ05hbWV9KS5mb3JFYWNoKGQpfTtmb3IoYi5mb3JFYWNoKGQpO2JbMF0mJlwidHNwYW5cIj09PWJbMF0udGFnTmFtZSYmIWJbMF0uY2hpbGRyZW47KWIuc3BsaWNlKDAsMSl9O2IucHJvdG90eXBlLnRydW5jYXRlPWZ1bmN0aW9uKGIsZixkLGUsayxsKXt2YXIgcT10aGlzLnN2Z0VsZW1lbnQsdT1xLnJlbmRlcmVyLG49cS5yb3RhdGlvbixKPVtdLEU9ZD8xOjAsbT0oZnx8ZHx8XCJcIikubGVuZ3RoLGM9bSxnLGE9ZnVuY3Rpb24oYSxjKXtjPWN8fGE7dmFyIGc9Yi5wYXJlbnROb2RlO2lmKGcmJlwidW5kZWZpbmVkXCI9PT10eXBlb2YgSltjXSlpZihnLmdldFN1YlN0cmluZ0xlbmd0aCl0cnl7SltjXT1lK2cuZ2V0U3ViU3RyaW5nTGVuZ3RoKDAsZD9jKzE6Yyl9Y2F0Y2goTCl7XCJcIn1lbHNlIHUuZ2V0U3BhbldpZHRoJiYoYi50ZXh0Q29udGVudD1sKGZ8fGQsYSksSltjXT1lK3UuZ2V0U3BhbldpZHRoKHEsYikpO3JldHVybiBKW2NdfTtxLnJvdGF0aW9uPTA7dmFyIGg9YShiLnRleHRDb250ZW50Lmxlbmd0aCk7XG5pZihlK2g+ayl7Zm9yKDtFPD1tOyljPU1hdGguY2VpbCgoRSttKS8yKSxkJiYoZz1sKGQsYykpLGg9YShjLGcmJmcubGVuZ3RoLTEpLEU9PT1tP0U9bSsxOmg+az9tPWMtMTpFPWM7MD09PW0/Yi50ZXh0Q29udGVudD1cIlwiOmYmJm09PT1mLmxlbmd0aC0xfHwoYi50ZXh0Q29udGVudD1nfHxsKGZ8fGQsYykpfWQmJmQuc3BsaWNlKDAsYyk7cS5hY3R1YWxXaWR0aD1oO3Eucm90YXRpb249bn07Yi5wcm90b3R5cGUudW5lc2NhcGVFbnRpdGllcz1mdW5jdGlvbihiLGYpe0IodGhpcy5yZW5kZXJlci5lc2NhcGVzLGZ1bmN0aW9uKGQsZSl7ZiYmLTEhPT1mLmluZGV4T2YoZCl8fChiPWIudG9TdHJpbmcoKS5yZXBsYWNlKG5ldyBSZWdFeHAoZCxcImdcIiksZSkpfSk7cmV0dXJuIGJ9O3JldHVybiBifSgpfSk7TyhlLFwiQ29yZS9SZW5kZXJlci9TVkcvU1ZHUmVuZGVyZXIuanNcIixbZVtcIkNvcmUvQ29sb3IvQ29sb3IuanNcIl0sZVtcIkNvcmUvR2xvYmFscy5qc1wiXSxlW1wiQ29yZS9Db2xvci9QYWxldHRlLmpzXCJdLFxuZVtcIkNvcmUvUmVuZGVyZXIvU1ZHL1NWR0VsZW1lbnQuanNcIl0sZVtcIkNvcmUvUmVuZGVyZXIvU1ZHL1NWR0xhYmVsLmpzXCJdLGVbXCJDb3JlL1JlbmRlcmVyL0hUTUwvQVNULmpzXCJdLGVbXCJDb3JlL1JlbmRlcmVyL1NWRy9UZXh0QnVpbGRlci5qc1wiXSxlW1wiQ29yZS9VdGlsaXRpZXMuanNcIl1dLGZ1bmN0aW9uKGUsYixJLHosSCxHLEMsQil7dmFyIHg9Qi5hZGRFdmVudCx3PUIuYXR0cix2PUIuY3JlYXRlRWxlbWVudCxmPUIuY3NzLGQ9Qi5kZWZpbmVkLHE9Qi5kZXN0cm95T2JqZWN0UHJvcGVydGllcyxrPUIuZXh0ZW5kLGw9Qi5pc0FycmF5LE49Qi5pc051bWJlcix1PUIuaXNPYmplY3Qsbj1CLmlzU3RyaW5nLEo9Qi5tZXJnZSxFPUIucGljayxtPUIucEludCxjPUIudW5pcXVlS2V5LGc9Yi5jaGFydHMsYT1iLmRlZzJyYWQsaD1iLmRvYyxyPWIuaXNGaXJlZm94LEE9Yi5pc01TLHk9Yi5pc1dlYktpdCxMPWIubm9vcCxQPWIuU1ZHX05TLFI9Yi5zeW1ib2xTaXplcyxWPWIud2luLFE7Qj1cbmZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChhLGMsZyx0LGQsaCxyKXt0aGlzLndpZHRoPXRoaXMudXJsPXRoaXMuc3R5bGU9dGhpcy5pc1NWRz10aGlzLmltZ0NvdW50PXRoaXMuaGVpZ2h0PXRoaXMuZ3JhZGllbnRzPXRoaXMuZ2xvYmFsQW5pbWF0aW9uPXRoaXMuZGVmcz10aGlzLmNoYXJ0SW5kZXg9dGhpcy5jYWNoZUtleXM9dGhpcy5jYWNoZT10aGlzLmJveFdyYXBwZXI9dGhpcy5ib3g9dGhpcy5hbGlnbmVkT2JqZWN0cz12b2lkIDA7dGhpcy5pbml0KGEsYyxnLHQsZCxoLHIpfXQucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oYSxjLGcsdCxkLGIsSyl7dmFyIHA9dGhpcy5jcmVhdGVFbGVtZW50KFwic3ZnXCIpLmF0dHIoe3ZlcnNpb246XCIxLjFcIixcImNsYXNzXCI6XCJoaWdoY2hhcnRzLXJvb3RcIn0pO0t8fHAuY3NzKHRoaXMuZ2V0U3R5bGUodCkpO3Q9cC5lbGVtZW50O2EuYXBwZW5kQ2hpbGQodCk7dyhhLFwiZGlyXCIsXCJsdHJcIik7LTE9PT1hLmlubmVySFRNTC5pbmRleE9mKFwieG1sbnNcIikmJncodCxcblwieG1sbnNcIix0aGlzLlNWR19OUyk7dGhpcy5pc1NWRz0hMDt0aGlzLmJveD10O3RoaXMuYm94V3JhcHBlcj1wO3RoaXMuYWxpZ25lZE9iamVjdHM9W107dGhpcy51cmw9dGhpcy5nZXRSZWZlcmVuY2VVUkwoKTt0aGlzLmNyZWF0ZUVsZW1lbnQoXCJkZXNjXCIpLmFkZCgpLmVsZW1lbnQuYXBwZW5kQ2hpbGQoaC5jcmVhdGVUZXh0Tm9kZShcIkNyZWF0ZWQgd2l0aCBIaWdoY2hhcnRzIDkuMS4wXCIpKTt0aGlzLmRlZnM9dGhpcy5jcmVhdGVFbGVtZW50KFwiZGVmc1wiKS5hZGQoKTt0aGlzLmFsbG93SFRNTD1iO3RoaXMuZm9yRXhwb3J0PWQ7dGhpcy5zdHlsZWRNb2RlPUs7dGhpcy5ncmFkaWVudHM9e307dGhpcy5jYWNoZT17fTt0aGlzLmNhY2hlS2V5cz1bXTt0aGlzLmltZ0NvdW50PTA7dGhpcy5zZXRTaXplKGMsZywhMSk7dmFyIEY7ciYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWZ1bmN0aW9uKCl7ZihhLHtsZWZ0OjAsdG9wOjB9KTtGPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5mKGEse2xlZnQ6TWF0aC5jZWlsKEYubGVmdCktRi5sZWZ0K1wicHhcIix0b3A6TWF0aC5jZWlsKEYudG9wKS1GLnRvcCtcInB4XCJ9KX0sYygpLHRoaXMudW5TdWJQaXhlbEZpeD14KFYsXCJyZXNpemVcIixjKSl9O3QucHJvdG90eXBlLmRlZmluaXRpb249ZnVuY3Rpb24oYSl7cmV0dXJuKG5ldyBHKFthXSkpLmFkZFRvRE9NKHRoaXMuZGVmcy5lbGVtZW50KX07dC5wcm90b3R5cGUuZ2V0UmVmZXJlbmNlVVJMPWZ1bmN0aW9uKCl7aWYoKHJ8fHkpJiZoLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiYmFzZVwiKS5sZW5ndGgpe2lmKCFkKFEpKXt2YXIgYT1jKCk7YT0obmV3IEcoW3t0YWdOYW1lOlwic3ZnXCIsYXR0cmlidXRlczp7d2lkdGg6OCxoZWlnaHQ6OH0sY2hpbGRyZW46W3t0YWdOYW1lOlwiZGVmc1wiLGNoaWxkcmVuOlt7dGFnTmFtZTpcImNsaXBQYXRoXCIsYXR0cmlidXRlczp7aWQ6YX0sY2hpbGRyZW46W3t0YWdOYW1lOlwicmVjdFwiLGF0dHJpYnV0ZXM6e3dpZHRoOjQsaGVpZ2h0OjR9fV19XX0se3RhZ05hbWU6XCJyZWN0XCIsXG5hdHRyaWJ1dGVzOntpZDpcImhpdG1lXCIsd2lkdGg6OCxoZWlnaHQ6OCxcImNsaXAtcGF0aFwiOlwidXJsKCNcIithK1wiKVwiLGZpbGw6XCJyZ2JhKDAsMCwwLDAuMDAxKVwifX1dfV0pKS5hZGRUb0RPTShoLmJvZHkpO2YoYSx7cG9zaXRpb246XCJmaXhlZFwiLHRvcDowLGxlZnQ6MCx6SW5kZXg6OUU1fSk7dmFyIGc9aC5lbGVtZW50RnJvbVBvaW50KDYsNik7UT1cImhpdG1lXCI9PT0oZyYmZy5pZCk7aC5ib2R5LnJlbW92ZUNoaWxkKGEpfWlmKFEpcmV0dXJuIFYubG9jYXRpb24uaHJlZi5zcGxpdChcIiNcIilbMF0ucmVwbGFjZSgvPFtePl0qPi9nLFwiXCIpLnJlcGxhY2UoLyhbXFwoJ1xcKV0pL2csXCJcXFxcJDFcIikucmVwbGFjZSgvIC9nLFwiJTIwXCIpfXJldHVyblwiXCJ9O3QucHJvdG90eXBlLmdldFN0eWxlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnN0eWxlPWsoe2ZvbnRGYW1pbHk6J1wiTHVjaWRhIEdyYW5kZVwiLCBcIkx1Y2lkYSBTYW5zIFVuaWNvZGVcIiwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZicsZm9udFNpemU6XCIxMnB4XCJ9LFxuYSl9O3QucHJvdG90eXBlLnNldFN0eWxlPWZ1bmN0aW9uKGEpe3RoaXMuYm94V3JhcHBlci5jc3ModGhpcy5nZXRTdHlsZShhKSl9O3QucHJvdG90eXBlLmlzSGlkZGVuPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuYm94V3JhcHBlci5nZXRCQm94KCkud2lkdGh9O3QucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRlZnM7dGhpcy5ib3g9bnVsbDt0aGlzLmJveFdyYXBwZXI9dGhpcy5ib3hXcmFwcGVyLmRlc3Ryb3koKTtxKHRoaXMuZ3JhZGllbnRzfHx7fSk7dGhpcy5ncmFkaWVudHM9bnVsbDthJiYodGhpcy5kZWZzPWEuZGVzdHJveSgpKTt0aGlzLnVuU3ViUGl4ZWxGaXgmJnRoaXMudW5TdWJQaXhlbEZpeCgpO3JldHVybiB0aGlzLmFsaWduZWRPYmplY3RzPW51bGx9O3QucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oYSl7dmFyIGM9bmV3IHRoaXMuRWxlbWVudDtjLmluaXQodGhpcyxhKTtyZXR1cm4gY307dC5wcm90b3R5cGUuZ2V0UmFkaWFsQXR0cj1cbmZ1bmN0aW9uKGEsYyl7cmV0dXJue2N4OmFbMF0tYVsyXS8yKyhjLmN4fHwwKSphWzJdLGN5OmFbMV0tYVsyXS8yKyhjLmN5fHwwKSphWzJdLHI6KGMucnx8MCkqYVsyXX19O3QucHJvdG90eXBlLmJ1aWxkVGV4dD1mdW5jdGlvbihhKXsobmV3IEMoYSkpLmJ1aWxkU1ZHKCl9O3QucHJvdG90eXBlLmdldENvbnRyYXN0PWZ1bmN0aW9uKGEpe2E9ZS5wYXJzZShhKS5yZ2JhO2FbMF0qPTE7YVsxXSo9MS4yO2FbMl0qPS41O3JldHVybiA0NTk8YVswXSthWzFdK2FbMl0/XCIjMDAwMDAwXCI6XCIjRkZGRkZGXCJ9O3QucHJvdG90eXBlLmJ1dHRvbj1mdW5jdGlvbihhLGMsZyx0LGQsaCxyLGIsbSxmKXt2YXIgcD10aGlzLmxhYmVsKGEsYyxnLG0sdm9pZCAwLHZvaWQgMCxmLHZvaWQgMCxcImJ1dHRvblwiKSxGPTAsSz10aGlzLnN0eWxlZE1vZGUseT1kP0ooZCk6e307YT15JiZ5LnN0eWxlfHx7fTt5PUcuZmlsdGVyVXNlckF0dHJpYnV0ZXMoeSk7cC5hdHRyKEooe3BhZGRpbmc6OCxyOjJ9LHkpKTtpZighSyl7eT1cbkooe2ZpbGw6SS5uZXV0cmFsQ29sb3IzLHN0cm9rZTpJLm5ldXRyYWxDb2xvcjIwLFwic3Ryb2tlLXdpZHRoXCI6MSxzdHlsZTp7Y29sb3I6SS5uZXV0cmFsQ29sb3I4MCxjdXJzb3I6XCJwb2ludGVyXCIsZm9udFdlaWdodDpcIm5vcm1hbFwifX0se3N0eWxlOmF9LHkpO3ZhciBsPXkuc3R5bGU7ZGVsZXRlIHkuc3R5bGU7aD1KKHkse2ZpbGw6SS5uZXV0cmFsQ29sb3IxMH0sRy5maWx0ZXJVc2VyQXR0cmlidXRlcyhofHx7fSkpO3ZhciBTPWguc3R5bGU7ZGVsZXRlIGguc3R5bGU7cj1KKHkse2ZpbGw6SS5oaWdobGlnaHRDb2xvcjEwLHN0eWxlOntjb2xvcjpJLm5ldXRyYWxDb2xvcjEwMCxmb250V2VpZ2h0OlwiYm9sZFwifX0sRy5maWx0ZXJVc2VyQXR0cmlidXRlcyhyfHx7fSkpO3ZhciB1PXIuc3R5bGU7ZGVsZXRlIHIuc3R5bGU7Yj1KKHkse3N0eWxlOntjb2xvcjpJLm5ldXRyYWxDb2xvcjIwfX0sRy5maWx0ZXJVc2VyQXR0cmlidXRlcyhifHx7fSkpO3ZhciBuPWIuc3R5bGU7ZGVsZXRlIGIuc3R5bGV9eChwLmVsZW1lbnQsXG5BP1wibW91c2VvdmVyXCI6XCJtb3VzZWVudGVyXCIsZnVuY3Rpb24oKXszIT09RiYmcC5zZXRTdGF0ZSgxKX0pO3gocC5lbGVtZW50LEE/XCJtb3VzZW91dFwiOlwibW91c2VsZWF2ZVwiLGZ1bmN0aW9uKCl7MyE9PUYmJnAuc2V0U3RhdGUoRil9KTtwLnNldFN0YXRlPWZ1bmN0aW9uKGEpezEhPT1hJiYocC5zdGF0ZT1GPWEpO3AucmVtb3ZlQ2xhc3MoL2hpZ2hjaGFydHMtYnV0dG9uLShub3JtYWx8aG92ZXJ8cHJlc3NlZHxkaXNhYmxlZCkvKS5hZGRDbGFzcyhcImhpZ2hjaGFydHMtYnV0dG9uLVwiK1tcIm5vcm1hbFwiLFwiaG92ZXJcIixcInByZXNzZWRcIixcImRpc2FibGVkXCJdW2F8fDBdKTtLfHxwLmF0dHIoW3ksaCxyLGJdW2F8fDBdKS5jc3MoW2wsUyx1LG5dW2F8fDBdKX07S3x8cC5hdHRyKHkpLmNzcyhrKHtjdXJzb3I6XCJkZWZhdWx0XCJ9LGwpKTtyZXR1cm4gcC5vbihcInRvdWNoc3RhcnRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5zdG9wUHJvcGFnYXRpb24oKX0pLm9uKFwiY2xpY2tcIixmdW5jdGlvbihhKXszIT09XG5GJiZ0LmNhbGwocCxhKX0pfTt0LnByb3RvdHlwZS5jcmlzcExpbmU9ZnVuY3Rpb24oYSxjLGcpe3ZvaWQgMD09PWcmJihnPVwicm91bmRcIik7dmFyIHA9YVswXSx0PWFbMV07cFsxXT09PXRbMV0mJihwWzFdPXRbMV09TWF0aFtnXShwWzFdKS1jJTIvMik7cFsyXT09PXRbMl0mJihwWzJdPXRbMl09TWF0aFtnXShwWzJdKStjJTIvMik7cmV0dXJuIGF9O3QucHJvdG90eXBlLnBhdGg9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5zdHlsZWRNb2RlP3t9OntmaWxsOlwibm9uZVwifTtsKGEpP2MuZD1hOnUoYSkmJmsoYyxhKTtyZXR1cm4gdGhpcy5jcmVhdGVFbGVtZW50KFwicGF0aFwiKS5hdHRyKGMpfTt0LnByb3RvdHlwZS5jaXJjbGU9ZnVuY3Rpb24oYSxjLGcpe2E9dShhKT9hOlwidW5kZWZpbmVkXCI9PT10eXBlb2YgYT97fTp7eDphLHk6YyxyOmd9O2M9dGhpcy5jcmVhdGVFbGVtZW50KFwiY2lyY2xlXCIpO2MueFNldHRlcj1jLnlTZXR0ZXI9ZnVuY3Rpb24oYSxjLHApe3Auc2V0QXR0cmlidXRlKFwiY1wiK1xuYyxhKX07cmV0dXJuIGMuYXR0cihhKX07dC5wcm90b3R5cGUuYXJjPWZ1bmN0aW9uKGEsYyxnLHQsZCxoKXt1KGEpPyh0PWEsYz10LnksZz10LnIsYT10LngpOnQ9e2lubmVyUjp0LHN0YXJ0OmQsZW5kOmh9O2E9dGhpcy5zeW1ib2woXCJhcmNcIixhLGMsZyxnLHQpO2Eucj1nO3JldHVybiBhfTt0LnByb3RvdHlwZS5yZWN0PWZ1bmN0aW9uKGEsYyxnLHQsZCxoKXtkPXUoYSk/YS5yOmQ7dmFyIHA9dGhpcy5jcmVhdGVFbGVtZW50KFwicmVjdFwiKTthPXUoYSk/YTpcInVuZGVmaW5lZFwiPT09dHlwZW9mIGE/e306e3g6YSx5OmMsd2lkdGg6TWF0aC5tYXgoZywwKSxoZWlnaHQ6TWF0aC5tYXgodCwwKX07dGhpcy5zdHlsZWRNb2RlfHwoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBoJiYoYVtcInN0cm9rZS13aWR0aFwiXT1oLGE9cC5jcmlzcChhKSksYS5maWxsPVwibm9uZVwiKTtkJiYoYS5yPWQpO3AuclNldHRlcj1mdW5jdGlvbihhLGMsZyl7cC5yPWE7dyhnLHtyeDphLHJ5OmF9KX07cC5yR2V0dGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHAucnx8XG4wfTtyZXR1cm4gcC5hdHRyKGEpfTt0LnByb3RvdHlwZS5zZXRTaXplPWZ1bmN0aW9uKGEsYyxnKXt0aGlzLndpZHRoPWE7dGhpcy5oZWlnaHQ9Yzt0aGlzLmJveFdyYXBwZXIuYW5pbWF0ZSh7d2lkdGg6YSxoZWlnaHQ6Y30se3N0ZXA6ZnVuY3Rpb24oKXt0aGlzLmF0dHIoe3ZpZXdCb3g6XCIwIDAgXCIrdGhpcy5hdHRyKFwid2lkdGhcIikrXCIgXCIrdGhpcy5hdHRyKFwiaGVpZ2h0XCIpfSl9LGR1cmF0aW9uOkUoZywhMCk/dm9pZCAwOjB9KTt0aGlzLmFsaWduRWxlbWVudHMoKX07dC5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmNyZWF0ZUVsZW1lbnQoXCJnXCIpO3JldHVybiBhP2MuYXR0cih7XCJjbGFzc1wiOlwiaGlnaGNoYXJ0cy1cIithfSk6Y307dC5wcm90b3R5cGUuaW1hZ2U9ZnVuY3Rpb24oYSxjLGcsdCxkLGgpe3ZhciBwPXtwcmVzZXJ2ZUFzcGVjdFJhdGlvOlwibm9uZVwifSxyPWZ1bmN0aW9uKGEsYyl7YS5zZXRBdHRyaWJ1dGVOUz9hLnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuXCJocmVmXCIsYyk6YS5zZXRBdHRyaWJ1dGUoXCJoYy1zdmctaHJlZlwiLGMpfSxGPWZ1bmN0aW9uKGMpe3IoYi5lbGVtZW50LGEpO2guY2FsbChiLGMpfTsxPGFyZ3VtZW50cy5sZW5ndGgmJmsocCx7eDpjLHk6Zyx3aWR0aDp0LGhlaWdodDpkfSk7dmFyIGI9dGhpcy5jcmVhdGVFbGVtZW50KFwiaW1hZ2VcIikuYXR0cihwKTtoPyhyKGIuZWxlbWVudCxcImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBQUFBQUNINUJBRUtBQUVBTEFBQUFBQUJBQUVBQUFJQ1RBRUFPdz09XCIpLHA9bmV3IFYuSW1hZ2UseChwLFwibG9hZFwiLEYpLHAuc3JjPWEscC5jb21wbGV0ZSYmRih7fSkpOnIoYi5lbGVtZW50LGEpO3JldHVybiBifTt0LnByb3RvdHlwZS5zeW1ib2w9ZnVuY3Rpb24oYSxjLHQscixGLGIpe3ZhciBwPXRoaXMsbT0vXnVybFxcKCguKj8pXFwpJC8sQT1tLnRlc3QoYSkseT0hQSYmKHRoaXMuc3ltYm9sc1thXT9hOlwiY2lyY2xlXCIpLGw9eSYmdGhpcy5zeW1ib2xzW3ldLHU7aWYobCl7XCJudW1iZXJcIj09PVxudHlwZW9mIGMmJih1PWwuY2FsbCh0aGlzLnN5bWJvbHMsTWF0aC5yb3VuZChjfHwwKSxNYXRoLnJvdW5kKHR8fDApLHJ8fDAsRnx8MCxiKSk7dmFyIG49dGhpcy5wYXRoKHUpO3Auc3R5bGVkTW9kZXx8bi5hdHRyKFwiZmlsbFwiLFwibm9uZVwiKTtrKG4se3N5bWJvbE5hbWU6eSx4OmMseTp0LHdpZHRoOnIsaGVpZ2h0OkZ9KTtiJiZrKG4sYil9ZWxzZSBpZihBKXt2YXIgZT1hLm1hdGNoKG0pWzFdO249dGhpcy5pbWFnZShlKTtuLmltZ3dpZHRoPUUoUltlXSYmUltlXS53aWR0aCxiJiZiLndpZHRoKTtuLmltZ2hlaWdodD1FKFJbZV0mJlJbZV0uaGVpZ2h0LGImJmIuaGVpZ2h0KTt2YXIgUz1mdW5jdGlvbigpe24uYXR0cih7d2lkdGg6bi53aWR0aCxoZWlnaHQ6bi5oZWlnaHR9KX07W1wid2lkdGhcIixcImhlaWdodFwiXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe25bYStcIlNldHRlclwiXT1mdW5jdGlvbihhLGMpe3ZhciBwPXRoaXNbXCJpbWdcIitjXTt0aGlzW2NdPWE7ZChwKSYmKGImJlwid2l0aGluXCI9PT1cbmIuYmFja2dyb3VuZFNpemUmJnRoaXMud2lkdGgmJnRoaXMuaGVpZ2h0JiYocD1NYXRoLnJvdW5kKHAqTWF0aC5taW4odGhpcy53aWR0aC90aGlzLmltZ3dpZHRoLHRoaXMuaGVpZ2h0L3RoaXMuaW1naGVpZ2h0KSkpLHRoaXMuZWxlbWVudCYmdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZShjLHApLHRoaXMuYWxpZ25CeVRyYW5zbGF0ZXx8KGE9KCh0aGlzW2NdfHwwKS1wKS8yLHRoaXMuYXR0cihcIndpZHRoXCI9PT1jP3t0cmFuc2xhdGVYOmF9Ont0cmFuc2xhdGVZOmF9KSkpfX0pO2QoYykmJm4uYXR0cih7eDpjLHk6dH0pO24uaXNJbWc9ITA7ZChuLmltZ3dpZHRoKSYmZChuLmltZ2hlaWdodCk/UygpOihuLmF0dHIoe3dpZHRoOjAsaGVpZ2h0OjB9KSx2KFwiaW1nXCIse29ubG9hZDpmdW5jdGlvbigpe3ZhciBhPWdbcC5jaGFydEluZGV4XTswPT09dGhpcy53aWR0aCYmKGYodGhpcyx7cG9zaXRpb246XCJhYnNvbHV0ZVwiLHRvcDpcIi05OTllbVwifSksaC5ib2R5LmFwcGVuZENoaWxkKHRoaXMpKTtcblJbZV09e3dpZHRoOnRoaXMud2lkdGgsaGVpZ2h0OnRoaXMuaGVpZ2h0fTtuLmltZ3dpZHRoPXRoaXMud2lkdGg7bi5pbWdoZWlnaHQ9dGhpcy5oZWlnaHQ7bi5lbGVtZW50JiZTKCk7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcyk7cC5pbWdDb3VudC0tO2lmKCFwLmltZ0NvdW50JiZhJiYhYS5oYXNMb2FkZWQpYS5vbmxvYWQoKX0sc3JjOmV9KSx0aGlzLmltZ0NvdW50KyspfXJldHVybiBufTt0LnByb3RvdHlwZS5jbGlwUmVjdD1mdW5jdGlvbihhLGcsdCxkKXt2YXIgcD1jKCkrXCItXCIsaD10aGlzLmNyZWF0ZUVsZW1lbnQoXCJjbGlwUGF0aFwiKS5hdHRyKHtpZDpwfSkuYWRkKHRoaXMuZGVmcyk7YT10aGlzLnJlY3QoYSxnLHQsZCwwKS5hZGQoaCk7YS5pZD1wO2EuY2xpcFBhdGg9aDthLmNvdW50PTA7cmV0dXJuIGF9O3QucHJvdG90eXBlLnRleHQ9ZnVuY3Rpb24oYSxjLGcsdCl7dmFyIHA9e307aWYodCYmKHRoaXMuYWxsb3dIVE1MfHwhdGhpcy5mb3JFeHBvcnQpKXJldHVybiB0aGlzLmh0bWwoYSxcbmMsZyk7cC54PU1hdGgucm91bmQoY3x8MCk7ZyYmKHAueT1NYXRoLnJvdW5kKGcpKTtkKGEpJiYocC50ZXh0PWEpO2E9dGhpcy5jcmVhdGVFbGVtZW50KFwidGV4dFwiKS5hdHRyKHApO3R8fChhLnhTZXR0ZXI9ZnVuY3Rpb24oYSxjLHApe3ZhciBnPXAuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0c3BhblwiKSx0PXAuZ2V0QXR0cmlidXRlKGMpLGQ7Zm9yKGQ9MDtkPGcubGVuZ3RoO2QrKyl7dmFyIGg9Z1tkXTtoLmdldEF0dHJpYnV0ZShjKT09PXQmJmguc2V0QXR0cmlidXRlKGMsYSl9cC5zZXRBdHRyaWJ1dGUoYyxhKX0pO3JldHVybiBhfTt0LnByb3RvdHlwZS5mb250TWV0cmljcz1mdW5jdGlvbihhLGMpe2E9IXRoaXMuc3R5bGVkTW9kZSYmL3B4Ly50ZXN0KGEpfHwhVi5nZXRDb21wdXRlZFN0eWxlP2F8fGMmJmMuc3R5bGUmJmMuc3R5bGUuZm9udFNpemV8fHRoaXMuc3R5bGUmJnRoaXMuc3R5bGUuZm9udFNpemU6YyYmei5wcm90b3R5cGUuZ2V0U3R5bGUuY2FsbChjLFwiZm9udC1zaXplXCIpO1xuYT0vcHgvLnRlc3QoYSk/bShhKToxMjtjPTI0PmE/YSszOk1hdGgucm91bmQoMS4yKmEpO3JldHVybntoOmMsYjpNYXRoLnJvdW5kKC44KmMpLGY6YX19O3QucHJvdG90eXBlLnJvdENvcnI9ZnVuY3Rpb24oYyxnLHQpe3ZhciBwPWM7ZyYmdCYmKHA9TWF0aC5tYXgocCpNYXRoLmNvcyhnKmEpLDQpKTtyZXR1cm57eDotYy8zKk1hdGguc2luKGcqYSkseTpwfX07dC5wcm90b3R5cGUucGF0aFRvU2VnbWVudHM9ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPVtdLGc9W10scD17QTo4LEM6NyxIOjIsTDozLE06MyxROjUsUzo1LFQ6MyxWOjJ9LHQ9MDt0PGEubGVuZ3RoO3QrKyluKGdbMF0pJiZOKGFbdF0pJiZnLmxlbmd0aD09PXBbZ1swXS50b1VwcGVyQ2FzZSgpXSYmYS5zcGxpY2UodCwwLGdbMF0ucmVwbGFjZShcIk1cIixcIkxcIikucmVwbGFjZShcIm1cIixcImxcIikpLFwic3RyaW5nXCI9PT10eXBlb2YgYVt0XSYmKGcubGVuZ3RoJiZjLnB1c2goZy5zbGljZSgwKSksZy5sZW5ndGg9MCksZy5wdXNoKGFbdF0pO1xuYy5wdXNoKGcuc2xpY2UoMCkpO3JldHVybiBjfTt0LnByb3RvdHlwZS5sYWJlbD1mdW5jdGlvbihhLGMsZyx0LGQsaCxyLGIsbSl7cmV0dXJuIG5ldyBIKHRoaXMsYSxjLGcsdCxkLGgscixiLG0pfTt0LnByb3RvdHlwZS5hbGlnbkVsZW1lbnRzPWZ1bmN0aW9uKCl7dGhpcy5hbGlnbmVkT2JqZWN0cy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBhLmFsaWduKCl9KX07cmV0dXJuIHR9KCk7Qi5wcm90b3R5cGUuRWxlbWVudD16O0IucHJvdG90eXBlLlNWR19OUz1QO0IucHJvdG90eXBlLmRyYXc9TDtCLnByb3RvdHlwZS5lc2NhcGVzPXtcIiZcIjpcIiZhbXA7XCIsXCI8XCI6XCImbHQ7XCIsXCI+XCI6XCImZ3Q7XCIsXCInXCI6XCImIzM5O1wiLCdcIic6XCImcXVvdDtcIn07dmFyIE09ZnVuY3Rpb24oYSxjLGcsZCxoKXtoPWgmJmgucnx8MDtyZXR1cm5bW1wiTVwiLGEraCxjXSxbXCJMXCIsYStnLWgsY10sW1wiQ1wiLGErZyxjLGErZyxjLGErZyxjK2hdLFtcIkxcIixhK2csYytkLWhdLFtcIkNcIixhK2csYytkLGErZyxjK2QsYStcbmctaCxjK2RdLFtcIkxcIixhK2gsYytkXSxbXCJDXCIsYSxjK2QsYSxjK2QsYSxjK2QtaF0sW1wiTFwiLGEsYytoXSxbXCJDXCIsYSxjLGEsYyxhK2gsY11dfTtMPWZ1bmN0aW9uKGEsYyxnLGQsaCl7cmV0dXJuIGgmJmgucj9NKGEsYyxnLGQsaCk6W1tcIk1cIixhLGNdLFtcIkxcIixhK2csY10sW1wiTFwiLGErZyxjK2RdLFtcIkxcIixhLGMrZF0sW1wiWlwiXV19O0IucHJvdG90eXBlLnN5bWJvbHM9e2NpcmNsZTpmdW5jdGlvbihhLGMsZyxkKXtyZXR1cm4gdGhpcy5hcmMoYStnLzIsYytkLzIsZy8yLGQvMix7c3RhcnQ6LjUqTWF0aC5QSSxlbmQ6Mi41Kk1hdGguUEksb3BlbjohMX0pfSxyZWN0Okwsc3F1YXJlOkwsdHJpYW5nbGU6ZnVuY3Rpb24oYSxjLGcsZCl7cmV0dXJuW1tcIk1cIixhK2cvMixjXSxbXCJMXCIsYStnLGMrZF0sW1wiTFwiLGEsYytkXSxbXCJaXCJdXX0sXCJ0cmlhbmdsZS1kb3duXCI6ZnVuY3Rpb24oYSxjLGcsZCl7cmV0dXJuW1tcIk1cIixhLGNdLFtcIkxcIixhK2csY10sW1wiTFwiLGErZy8yLGMrZF0sW1wiWlwiXV19LFxuZGlhbW9uZDpmdW5jdGlvbihhLGMsZyxkKXtyZXR1cm5bW1wiTVwiLGErZy8yLGNdLFtcIkxcIixhK2csYytkLzJdLFtcIkxcIixhK2cvMixjK2RdLFtcIkxcIixhLGMrZC8yXSxbXCJaXCJdXX0sYXJjOmZ1bmN0aW9uKGEsYyxnLGgscil7dmFyIHQ9W107aWYocil7dmFyIHA9ci5zdGFydHx8MCxiPUUoci5yLGcpO2c9RShyLnIsaHx8Zyk7dmFyIG09KHIuZW5kfHwwKS0uMDAxO2g9ci5pbm5lclI7dmFyIGY9RShyLm9wZW4sLjAwMT5NYXRoLmFicygoci5lbmR8fDApLXAtMipNYXRoLlBJKSksQT1NYXRoLmNvcyhwKSx5PU1hdGguc2luKHApLGw9TWF0aC5jb3MobSksbj1NYXRoLnNpbihtKTtwPUUoci5sb25nQXJjLC4wMDE+bS1wLU1hdGguUEk/MDoxKTt0LnB1c2goW1wiTVwiLGErYipBLGMrZyp5XSxbXCJBXCIsYixnLDAscCxFKHIuY2xvY2t3aXNlLDEpLGErYipsLGMrZypuXSk7ZChoKSYmdC5wdXNoKGY/W1wiTVwiLGEraCpsLGMraCpuXTpbXCJMXCIsYStoKmwsYytoKm5dLFtcIkFcIixoLGgsMCxwLGQoci5jbG9ja3dpc2UpP1xuMS1yLmNsb2Nrd2lzZTowLGEraCpBLGMraCp5XSk7Znx8dC5wdXNoKFtcIlpcIl0pfXJldHVybiB0fSxjYWxsb3V0OmZ1bmN0aW9uKGEsYyxnLGQsaCl7dmFyIHA9TWF0aC5taW4oaCYmaC5yfHwwLGcsZCksdD1wKzYscj1oJiZoLmFuY2hvclg7aD1oJiZoLmFuY2hvcll8fDA7dmFyIGI9TShhLGMsZyxkLHtyOnB9KTtpZighTihyKSlyZXR1cm4gYjthK3I+PWc/aD5jK3QmJmg8YytkLXQ/Yi5zcGxpY2UoMywxLFtcIkxcIixhK2csaC02XSxbXCJMXCIsYStnKzYsaF0sW1wiTFwiLGErZyxoKzZdLFtcIkxcIixhK2csYytkLXBdKTpiLnNwbGljZSgzLDEsW1wiTFwiLGErZyxkLzJdLFtcIkxcIixyLGhdLFtcIkxcIixhK2csZC8yXSxbXCJMXCIsYStnLGMrZC1wXSk6MD49YStyP2g+Yyt0JiZoPGMrZC10P2Iuc3BsaWNlKDcsMSxbXCJMXCIsYSxoKzZdLFtcIkxcIixhLTYsaF0sW1wiTFwiLGEsaC02XSxbXCJMXCIsYSxjK3BdKTpiLnNwbGljZSg3LDEsW1wiTFwiLGEsZC8yXSxbXCJMXCIscixoXSxbXCJMXCIsYSxkLzJdLFtcIkxcIixhLGMrcF0pOlxuaCYmaD5kJiZyPmErdCYmcjxhK2ctdD9iLnNwbGljZSg1LDEsW1wiTFwiLHIrNixjK2RdLFtcIkxcIixyLGMrZCs2XSxbXCJMXCIsci02LGMrZF0sW1wiTFwiLGErcCxjK2RdKTpoJiYwPmgmJnI+YSt0JiZyPGErZy10JiZiLnNwbGljZSgxLDEsW1wiTFwiLHItNixjXSxbXCJMXCIscixjLTZdLFtcIkxcIixyKzYsY10sW1wiTFwiLGctcCxjXSk7cmV0dXJuIGJ9fTtiLlNWR1JlbmRlcmVyPUI7Yi5SZW5kZXJlcj1iLlNWR1JlbmRlcmVyO3JldHVybiBiLlJlbmRlcmVyfSk7TyhlLFwiQ29yZS9SZW5kZXJlci9IVE1ML0hUTUxFbGVtZW50LmpzXCIsW2VbXCJDb3JlL0dsb2JhbHMuanNcIl0sZVtcIkNvcmUvUmVuZGVyZXIvU1ZHL1NWR0VsZW1lbnQuanNcIl0sZVtcIkNvcmUvVXRpbGl0aWVzLmpzXCJdXSxmdW5jdGlvbihlLGIsSSl7dmFyIEQ9ZS5pc0ZpcmVmb3gsSD1lLmlzTVMsRz1lLmlzV2ViS2l0LEM9ZS53aW4sQj1JLmNzcyx4PUkuZGVmaW5lZCx3PUkuZXh0ZW5kLHY9SS5waWNrLGY9SS5wSW50O3coYi5wcm90b3R5cGUsXG57aHRtbENzczpmdW5jdGlvbihkKXt2YXIgYj1cIlNQQU5cIj09PXRoaXMuZWxlbWVudC50YWdOYW1lJiZkJiZcIndpZHRoXCJpbiBkLGY9dihiJiZkLndpZHRoLHZvaWQgMCk7aWYoYil7ZGVsZXRlIGQud2lkdGg7dGhpcy50ZXh0V2lkdGg9Zjt2YXIgbD0hMH1kJiZcImVsbGlwc2lzXCI9PT1kLnRleHRPdmVyZmxvdyYmKGQud2hpdGVTcGFjZT1cIm5vd3JhcFwiLGQub3ZlcmZsb3c9XCJoaWRkZW5cIik7dGhpcy5zdHlsZXM9dyh0aGlzLnN0eWxlcyxkKTtCKHRoaXMuZWxlbWVudCxkKTtsJiZ0aGlzLmh0bWxVcGRhdGVUcmFuc2Zvcm0oKTtyZXR1cm4gdGhpc30saHRtbEdldEJCb3g6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLmVsZW1lbnQ7cmV0dXJue3g6ZC5vZmZzZXRMZWZ0LHk6ZC5vZmZzZXRUb3Asd2lkdGg6ZC5vZmZzZXRXaWR0aCxoZWlnaHQ6ZC5vZmZzZXRIZWlnaHR9fSxodG1sVXBkYXRlVHJhbnNmb3JtOmZ1bmN0aW9uKCl7aWYodGhpcy5hZGRlZCl7dmFyIGQ9dGhpcy5yZW5kZXJlcixiPXRoaXMuZWxlbWVudCxcbmU9dGhpcy50cmFuc2xhdGVYfHwwLGw9dGhpcy50cmFuc2xhdGVZfHwwLE49dGhpcy54fHwwLHU9dGhpcy55fHwwLG49dGhpcy50ZXh0QWxpZ258fFwibGVmdFwiLEo9e2xlZnQ6MCxjZW50ZXI6LjUscmlnaHQ6MX1bbl0sRT10aGlzLnN0eWxlcztFPUUmJkUud2hpdGVTcGFjZTtCKGIse21hcmdpbkxlZnQ6ZSxtYXJnaW5Ub3A6bH0pOyFkLnN0eWxlZE1vZGUmJnRoaXMuc2hhZG93cyYmdGhpcy5zaGFkb3dzLmZvckVhY2goZnVuY3Rpb24oYSl7QihhLHttYXJnaW5MZWZ0OmUrMSxtYXJnaW5Ub3A6bCsxfSl9KTt0aGlzLmludmVydGVkJiZbXS5mb3JFYWNoLmNhbGwoYi5jaGlsZE5vZGVzLGZ1bmN0aW9uKGEpe2QuaW52ZXJ0Q2hpbGQoYSxiKX0pO2lmKFwiU1BBTlwiPT09Yi50YWdOYW1lKXt2YXIgbT10aGlzLnJvdGF0aW9uLGM9dm9pZCAwO2M9dGhpcy50ZXh0V2lkdGgmJmYodGhpcy50ZXh0V2lkdGgpO3ZhciBnPVttLG4sYi5pbm5lckhUTUwsdGhpcy50ZXh0V2lkdGgsdGhpcy50ZXh0QWxpZ25dLmpvaW4oKSxcbmE7KGE9YyE9PXRoaXMub2xkVGV4dFdpZHRoKSYmIShhPWM+dGhpcy5vbGRUZXh0V2lkdGgpJiYoKGE9dGhpcy50ZXh0UHhMZW5ndGgpfHwoQihiLHt3aWR0aDpcIlwiLHdoaXRlU3BhY2U6RXx8XCJub3dyYXBcIn0pLGE9Yi5vZmZzZXRXaWR0aCksYT1hPmMpO2EmJigvWyBcXC1dLy50ZXN0KGIudGV4dENvbnRlbnR8fGIuaW5uZXJUZXh0KXx8XCJlbGxpcHNpc1wiPT09Yi5zdHlsZS50ZXh0T3ZlcmZsb3cpPyhCKGIse3dpZHRoOmMrXCJweFwiLGRpc3BsYXk6XCJibG9ja1wiLHdoaXRlU3BhY2U6RXx8XCJub3JtYWxcIn0pLHRoaXMub2xkVGV4dFdpZHRoPWMsdGhpcy5oYXNCb3hXaWR0aENoYW5nZWQ9ITApOnRoaXMuaGFzQm94V2lkdGhDaGFuZ2VkPSExO2chPT10aGlzLmNUVCYmKGM9ZC5mb250TWV0cmljcyhiLnN0eWxlLmZvbnRTaXplLGIpLmIsIXgobSl8fG09PT0odGhpcy5vbGRSb3RhdGlvbnx8MCkmJm49PT10aGlzLm9sZEFsaWdufHx0aGlzLnNldFNwYW5Sb3RhdGlvbihtLEosYyksdGhpcy5nZXRTcGFuQ29ycmVjdGlvbigheChtKSYmXG50aGlzLnRleHRQeExlbmd0aHx8Yi5vZmZzZXRXaWR0aCxjLEosbSxuKSk7QihiLHtsZWZ0Ok4rKHRoaXMueENvcnJ8fDApK1wicHhcIix0b3A6dSsodGhpcy55Q29ycnx8MCkrXCJweFwifSk7dGhpcy5jVFQ9Zzt0aGlzLm9sZFJvdGF0aW9uPW07dGhpcy5vbGRBbGlnbj1ufX1lbHNlIHRoaXMuYWxpZ25PbkFkZD0hMH0sc2V0U3BhblJvdGF0aW9uOmZ1bmN0aW9uKGQsYixmKXt2YXIgbD17fSxlPUgmJiEvRWRnZS8udGVzdChDLm5hdmlnYXRvci51c2VyQWdlbnQpP1wiLW1zLXRyYW5zZm9ybVwiOkc/XCItd2Via2l0LXRyYW5zZm9ybVwiOkQ/XCJNb3pUcmFuc2Zvcm1cIjpDLm9wZXJhP1wiLW8tdHJhbnNmb3JtXCI6dm9pZCAwO2UmJihsW2VdPWwudHJhbnNmb3JtPVwicm90YXRlKFwiK2QrXCJkZWcpXCIsbFtlKyhEP1wiT3JpZ2luXCI6XCItb3JpZ2luXCIpXT1sLnRyYW5zZm9ybU9yaWdpbj0xMDAqYitcIiUgXCIrZitcInB4XCIsQih0aGlzLmVsZW1lbnQsbCkpfSxnZXRTcGFuQ29ycmVjdGlvbjpmdW5jdGlvbihkLGIsZil7dGhpcy54Q29ycj1cbi1kKmY7dGhpcy55Q29ycj0tYn19KTtyZXR1cm4gYn0pO08oZSxcIkNvcmUvUmVuZGVyZXIvSFRNTC9IVE1MUmVuZGVyZXIuanNcIixbZVtcIkNvcmUvUmVuZGVyZXIvSFRNTC9BU1QuanNcIl0sZVtcIkNvcmUvUmVuZGVyZXIvU1ZHL1NWR0VsZW1lbnQuanNcIl0sZVtcIkNvcmUvUmVuZGVyZXIvU1ZHL1NWR1JlbmRlcmVyLmpzXCJdLGVbXCJDb3JlL1V0aWxpdGllcy5qc1wiXV0sZnVuY3Rpb24oZSxiLEkseil7dmFyIEQ9ei5hdHRyLEc9ei5jcmVhdGVFbGVtZW50LEM9ei5leHRlbmQsQj16LnBpY2s7QyhJLnByb3RvdHlwZSx7aHRtbDpmdW5jdGlvbih4LHcsdil7dmFyIGY9dGhpcy5jcmVhdGVFbGVtZW50KFwic3BhblwiKSxkPWYuZWxlbWVudCxxPWYucmVuZGVyZXIsaz1xLmlzU1ZHLGw9ZnVuY3Rpb24oZCxmKXtbXCJvcGFjaXR5XCIsXCJ2aXNpYmlsaXR5XCJdLmZvckVhY2goZnVuY3Rpb24obCl7ZFtsK1wiU2V0dGVyXCJdPWZ1bmN0aW9uKG4sZSxtKXt2YXIgYz1kLmRpdj9kLmRpdi5zdHlsZTpmO2IucHJvdG90eXBlW2wrXG5cIlNldHRlclwiXS5jYWxsKHRoaXMsbixlLG0pO2MmJihjW2VdPW4pfX0pO2QuYWRkZWRTZXR0ZXJzPSEwfTtmLnRleHRTZXR0ZXI9ZnVuY3Rpb24oZCl7ZCE9PXRoaXMudGV4dFN0ciYmKGRlbGV0ZSB0aGlzLmJCb3gsZGVsZXRlIHRoaXMub2xkVGV4dFdpZHRoLGUuc2V0RWxlbWVudEhUTUwodGhpcy5lbGVtZW50LEIoZCxcIlwiKSksdGhpcy50ZXh0U3RyPWQsZi5kb1RyYW5zZm9ybT0hMCl9O2smJmwoZixmLmVsZW1lbnQuc3R5bGUpO2YueFNldHRlcj1mLnlTZXR0ZXI9Zi5hbGlnblNldHRlcj1mLnJvdGF0aW9uU2V0dGVyPWZ1bmN0aW9uKGQsYil7XCJhbGlnblwiPT09Yj9mLmFsaWduVmFsdWU9Zi50ZXh0QWxpZ249ZDpmW2JdPWQ7Zi5kb1RyYW5zZm9ybT0hMH07Zi5hZnRlclNldHRlcnM9ZnVuY3Rpb24oKXt0aGlzLmRvVHJhbnNmb3JtJiYodGhpcy5odG1sVXBkYXRlVHJhbnNmb3JtKCksdGhpcy5kb1RyYW5zZm9ybT0hMSl9O2YuYXR0cih7dGV4dDp4LHg6TWF0aC5yb3VuZCh3KSx5Ok1hdGgucm91bmQodil9KS5jc3Moe3Bvc2l0aW9uOlwiYWJzb2x1dGVcIn0pO1xucS5zdHlsZWRNb2RlfHxmLmNzcyh7Zm9udEZhbWlseTp0aGlzLnN0eWxlLmZvbnRGYW1pbHksZm9udFNpemU6dGhpcy5zdHlsZS5mb250U2l6ZX0pO2Quc3R5bGUud2hpdGVTcGFjZT1cIm5vd3JhcFwiO2YuY3NzPWYuaHRtbENzcztrJiYoZi5hZGQ9ZnVuY3Rpb24oYil7dmFyIGU9cS5ib3gucGFyZW50Tm9kZSxuPVtdO2lmKHRoaXMucGFyZW50R3JvdXA9Yil7dmFyIGs9Yi5kaXY7aWYoIWspe2Zvcig7Yjspbi5wdXNoKGIpLGI9Yi5wYXJlbnRHcm91cDtuLnJldmVyc2UoKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGIoYyxnKXtkW2ddPWM7XCJ0cmFuc2xhdGVYXCI9PT1nP2EubGVmdD1jK1wicHhcIjphLnRvcD1jK1wicHhcIjtkLmRvVHJhbnNmb3JtPSEwfXZhciBjPUQoZC5lbGVtZW50LFwiY2xhc3NcIiksZz1kLnN0eWxlc3x8e307az1kLmRpdj1kLmRpdnx8RyhcImRpdlwiLGM/e2NsYXNzTmFtZTpjfTp2b2lkIDAse3Bvc2l0aW9uOlwiYWJzb2x1dGVcIixsZWZ0OihkLnRyYW5zbGF0ZVh8fDApK1xuXCJweFwiLHRvcDooZC50cmFuc2xhdGVZfHwwKStcInB4XCIsZGlzcGxheTpkLmRpc3BsYXksb3BhY2l0eTpkLm9wYWNpdHksY3Vyc29yOmcuY3Vyc29yLHBvaW50ZXJFdmVudHM6Zy5wb2ludGVyRXZlbnRzfSxrfHxlKTt2YXIgYT1rLnN0eWxlO0MoZCx7Y2xhc3NTZXR0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGMpe3RoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLGMpO2EuY2xhc3NOYW1lPWN9fShrKSxvbjpmdW5jdGlvbigpe25bMF0uZGl2JiZmLm9uLmFwcGx5KHtlbGVtZW50Om5bMF0uZGl2LG9uRXZlbnRzOmYub25FdmVudHN9LGFyZ3VtZW50cyk7cmV0dXJuIGR9LHRyYW5zbGF0ZVhTZXR0ZXI6Yix0cmFuc2xhdGVZU2V0dGVyOmJ9KTtkLmFkZGVkU2V0dGVyc3x8bChkKX0pfX1lbHNlIGs9ZTtrLmFwcGVuZENoaWxkKGQpO2YuYWRkZWQ9ITA7Zi5hbGlnbk9uQWRkJiZmLmh0bWxVcGRhdGVUcmFuc2Zvcm0oKTtyZXR1cm4gZn0pO3JldHVybiBmfX0pO3JldHVybiBJfSk7XG5PKGUsXCJDb3JlL0F4aXMvVGljay5qc1wiLFtlW1wiQ29yZS9Gb3JtYXRVdGlsaXRpZXMuanNcIl0sZVtcIkNvcmUvR2xvYmFscy5qc1wiXSxlW1wiQ29yZS9VdGlsaXRpZXMuanNcIl1dLGZ1bmN0aW9uKGUsYixJKXt2YXIgRD1iLmRlZzJyYWQsSD1JLmNsYW1wLEc9SS5jb3JyZWN0RmxvYXQsQz1JLmRlZmluZWQsQj1JLmRlc3Ryb3lPYmplY3RQcm9wZXJ0aWVzLHg9SS5leHRlbmQsdz1JLmZpcmVFdmVudCx2PUkuaXNOdW1iZXIsZj1JLm1lcmdlLGQ9SS5vYmplY3RFYWNoLHE9SS5waWNrO1wiXCI7ST1mdW5jdGlvbigpe2Z1bmN0aW9uIGIoZCxiLGYsZSxrKXt0aGlzLmlzTmV3TGFiZWw9dGhpcy5pc05ldz0hMDt0aGlzLmF4aXM9ZDt0aGlzLnBvcz1iO3RoaXMudHlwZT1mfHxcIlwiO3RoaXMucGFyYW1ldGVycz1rfHx7fTt0aGlzLnRpY2ttYXJrT2Zmc2V0PXRoaXMucGFyYW1ldGVycy50aWNrbWFya09mZnNldDt0aGlzLm9wdGlvbnM9dGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnM7dyh0aGlzLFwiaW5pdFwiKTtcbmZ8fGV8fHRoaXMuYWRkTGFiZWwoKX1iLnByb3RvdHlwZS5hZGRMYWJlbD1mdW5jdGlvbigpe3ZhciBkPXRoaXMsYj1kLmF4aXMsZj1iLm9wdGlvbnMsbj1iLmNoYXJ0LGs9Yi5jYXRlZ29yaWVzLEU9Yi5sb2dhcml0aG1pYyxtPWIubmFtZXMsYz1kLnBvcyxnPXEoZC5vcHRpb25zJiZkLm9wdGlvbnMubGFiZWxzLGYubGFiZWxzKSxhPWIudGlja1Bvc2l0aW9ucyxoPWM9PT1hWzBdLHI9Yz09PWFbYS5sZW5ndGgtMV0sQT1kLmxhYmVsLHk9KCFnLnN0ZXB8fDE9PT1nLnN0ZXApJiYxPT09Yi50aWNrSW50ZXJ2YWw7YT1hLmluZm87dmFyIEwsUDtrPXRoaXMucGFyYW1ldGVycy5jYXRlZ29yeXx8KGs/cShrW2NdLG1bY10sYyk6Yyk7RSYmdihrKSYmKGs9RyhFLmxpbjJsb2coaykpKTtpZihiLmRhdGVUaW1lJiZhKXt2YXIgUj1uLnRpbWUucmVzb2x2ZURUTEZvcm1hdChmLmRhdGVUaW1lTGFiZWxGb3JtYXRzWyFmLmdyaWQmJmEuaGlnaGVyUmFua3NbY118fGEudW5pdE5hbWVdKTt2YXIgVj1cblIubWFpbn1kLmlzRmlyc3Q9aDtkLmlzTGFzdD1yO3ZhciBRPXtheGlzOmIsY2hhcnQ6bixkYXRlVGltZUxhYmVsRm9ybWF0OlYsaXNGaXJzdDpoLGlzTGFzdDpyLHBvczpjLHRpY2s6ZCx0aWNrUG9zaXRpb25JbmZvOmEsdmFsdWU6a307dyh0aGlzLFwibGFiZWxGb3JtYXRcIixRKTt2YXIgTT1mdW5jdGlvbihhKXtyZXR1cm4gZy5mb3JtYXR0ZXI/Zy5mb3JtYXR0ZXIuY2FsbChhLGEpOmcuZm9ybWF0PyhhLnRleHQ9Yi5kZWZhdWx0TGFiZWxGb3JtYXR0ZXIuY2FsbChhKSxlLmZvcm1hdChnLmZvcm1hdCxhLG4pKTpiLmRlZmF1bHRMYWJlbEZvcm1hdHRlci5jYWxsKGEsYSl9O2Y9TS5jYWxsKFEsUSk7aWYoUD1SJiZSLmxpc3QpZC5zaG9ydGVuTGFiZWw9ZnVuY3Rpb24oKXtmb3IoTD0wO0w8UC5sZW5ndGg7TCsrKWlmKHgoUSx7ZGF0ZVRpbWVMYWJlbEZvcm1hdDpQW0xdfSksQS5hdHRyKHt0ZXh0Ok0uY2FsbChRLFEpfSksQS5nZXRCQm94KCkud2lkdGg8Yi5nZXRTbG90V2lkdGgoZCktXG4yKmcucGFkZGluZylyZXR1cm47QS5hdHRyKHt0ZXh0OlwiXCJ9KX07eSYmYi5fYWRkZWRQbG90TEImJmQubW92ZUxhYmVsKGYsZyk7QyhBKXx8ZC5tb3ZlZExhYmVsP0EmJkEudGV4dFN0ciE9PWYmJiF5JiYoIUEudGV4dFdpZHRofHxnLnN0eWxlLndpZHRofHxBLnN0eWxlcy53aWR0aHx8QS5jc3Moe3dpZHRoOm51bGx9KSxBLmF0dHIoe3RleHQ6Zn0pLEEudGV4dFB4TGVuZ3RoPUEuZ2V0QkJveCgpLndpZHRoKTooZC5sYWJlbD1BPWQuY3JlYXRlTGFiZWwoe3g6MCx5OjB9LGYsZyksZC5yb3RhdGlvbj0wKX07Yi5wcm90b3R5cGUuY3JlYXRlTGFiZWw9ZnVuY3Rpb24oZCxiLGUpe3ZhciBuPXRoaXMuYXhpcyxsPW4uY2hhcnQ7aWYoZD1DKGIpJiZlLmVuYWJsZWQ/bC5yZW5kZXJlci50ZXh0KGIsZC54LGQueSxlLnVzZUhUTUwpLmFkZChuLmxhYmVsR3JvdXApOm51bGwpbC5zdHlsZWRNb2RlfHxkLmNzcyhmKGUuc3R5bGUpKSxkLnRleHRQeExlbmd0aD1kLmdldEJCb3goKS53aWR0aDtyZXR1cm4gZH07XG5iLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7Qih0aGlzLHRoaXMuYXhpcyl9O2IucHJvdG90eXBlLmdldFBvc2l0aW9uPWZ1bmN0aW9uKGQsYixmLGUpe3ZhciBuPXRoaXMuYXhpcyxsPW4uY2hhcnQsbT1lJiZsLm9sZENoYXJ0SGVpZ2h0fHxsLmNoYXJ0SGVpZ2h0O2Q9e3g6ZD9HKG4udHJhbnNsYXRlKGIrZixudWxsLG51bGwsZSkrbi50cmFuc0IpOm4ubGVmdCtuLm9mZnNldCsobi5vcHBvc2l0ZT8oZSYmbC5vbGRDaGFydFdpZHRofHxsLmNoYXJ0V2lkdGgpLW4ucmlnaHQtbi5sZWZ0OjApLHk6ZD9tLW4uYm90dG9tK24ub2Zmc2V0LShuLm9wcG9zaXRlP24uaGVpZ2h0OjApOkcobS1uLnRyYW5zbGF0ZShiK2YsbnVsbCxudWxsLGUpLW4udHJhbnNCKX07ZC55PUgoZC55LC0xRTUsMUU1KTt3KHRoaXMsXCJhZnRlckdldFBvc2l0aW9uXCIse3BvczpkfSk7cmV0dXJuIGR9O2IucHJvdG90eXBlLmdldExhYmVsUG9zaXRpb249ZnVuY3Rpb24oZCxiLGYsZSxrLHEsbSxjKXt2YXIgZz1cbnRoaXMuYXhpcyxhPWcudHJhbnNBLGg9Zy5pc0xpbmtlZCYmZy5saW5rZWRQYXJlbnQ/Zy5saW5rZWRQYXJlbnQucmV2ZXJzZWQ6Zy5yZXZlcnNlZCxyPWcuc3RhZ2dlckxpbmVzLEE9Zy50aWNrUm90Q29ycnx8e3g6MCx5OjB9LHk9ay55LG49ZXx8Zy5yZXNlcnZlU3BhY2VEZWZhdWx0PzA6LWcubGFiZWxPZmZzZXQqKFwiY2VudGVyXCI9PT1nLmxhYmVsQWxpZ24/LjU6MSksbD17fTtDKHkpfHwoeT0wPT09Zy5zaWRlP2Yucm90YXRpb24/LTg6LWYuZ2V0QkJveCgpLmhlaWdodDoyPT09Zy5zaWRlP0EueSs4Ok1hdGguY29zKGYucm90YXRpb24qRCkqKEEueS1mLmdldEJCb3goITEsMCkuaGVpZ2h0LzIpKTtkPWQray54K24rQS54LShxJiZlP3EqYSooaD8tMToxKTowKTtiPWIreS0ocSYmIWU/cSphKihoPzE6LTEpOjApO3ImJihmPW0vKGN8fDEpJXIsZy5vcHBvc2l0ZSYmKGY9ci1mLTEpLGIrPWcubGFiZWxPZmZzZXQvcipmKTtsLng9ZDtsLnk9TWF0aC5yb3VuZChiKTt3KHRoaXMsXCJhZnRlckdldExhYmVsUG9zaXRpb25cIixcbntwb3M6bCx0aWNrbWFya09mZnNldDpxLGluZGV4Om19KTtyZXR1cm4gbH07Yi5wcm90b3R5cGUuZ2V0TGFiZWxTaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGFiZWw/dGhpcy5sYWJlbC5nZXRCQm94KClbdGhpcy5heGlzLmhvcml6P1wiaGVpZ2h0XCI6XCJ3aWR0aFwiXTowfTtiLnByb3RvdHlwZS5nZXRNYXJrUGF0aD1mdW5jdGlvbihkLGIsZixlLGsscSl7cmV0dXJuIHEuY3Jpc3BMaW5lKFtbXCJNXCIsZCxiXSxbXCJMXCIsZCsoaz8wOi1mKSxiKyhrP2Y6MCldXSxlKX07Yi5wcm90b3R5cGUuaGFuZGxlT3ZlcmZsb3c9ZnVuY3Rpb24oZCl7dmFyIGI9dGhpcy5heGlzLGY9Yi5vcHRpb25zLmxhYmVscyxlPWQueCxsPWIuY2hhcnQuY2hhcnRXaWR0aCxrPWIuY2hhcnQuc3BhY2luZyxtPXEoYi5sYWJlbExlZnQsTWF0aC5taW4oYi5wb3Msa1szXSkpO2s9cShiLmxhYmVsUmlnaHQsTWF0aC5tYXgoYi5pc1JhZGlhbD8wOmIucG9zK2IubGVuLGwta1sxXSkpO3ZhciBjPXRoaXMubGFiZWwsZz10aGlzLnJvdGF0aW9uLFxuYT17bGVmdDowLGNlbnRlcjouNSxyaWdodDoxfVtiLmxhYmVsQWxpZ258fGMuYXR0cihcImFsaWduXCIpXSxoPWMuZ2V0QkJveCgpLndpZHRoLHI9Yi5nZXRTbG90V2lkdGgodGhpcyksQT1yLHk9MSxMLFA9e307aWYoZ3x8XCJqdXN0aWZ5XCIhPT1mLm92ZXJmbG93KTA+ZyYmZS1hKmg8bT9MPU1hdGgucm91bmQoZS9NYXRoLmNvcyhnKkQpLW0pOjA8ZyYmZSthKmg+ayYmKEw9TWF0aC5yb3VuZCgobC1lKS9NYXRoLmNvcyhnKkQpKSk7ZWxzZSBpZihsPWUrKDEtYSkqaCxlLWEqaDxtP0E9ZC54K0EqKDEtYSktbTpsPmsmJihBPWstZC54K0EqYSx5PS0xKSxBPU1hdGgubWluKHIsQSksQTxyJiZcImNlbnRlclwiPT09Yi5sYWJlbEFsaWduJiYoZC54Kz15KihyLUEtYSooci1NYXRoLm1pbihoLEEpKSkpLGg+QXx8Yi5hdXRvUm90YXRpb24mJihjLnN0eWxlc3x8e30pLndpZHRoKUw9QTtMJiYodGhpcy5zaG9ydGVuTGFiZWw/dGhpcy5zaG9ydGVuTGFiZWwoKTooUC53aWR0aD1NYXRoLmZsb29yKEwpK1xuXCJweFwiLChmLnN0eWxlfHx7fSkudGV4dE92ZXJmbG93fHwoUC50ZXh0T3ZlcmZsb3c9XCJlbGxpcHNpc1wiKSxjLmNzcyhQKSkpfTtiLnByb3RvdHlwZS5tb3ZlTGFiZWw9ZnVuY3Rpb24oYixmKXt2YXIgZT10aGlzLG49ZS5sYWJlbCxsPSExLGs9ZS5heGlzLG09ay5yZXZlcnNlZDtuJiZuLnRleHRTdHI9PT1iPyhlLm1vdmVkTGFiZWw9bixsPSEwLGRlbGV0ZSBlLmxhYmVsKTpkKGsudGlja3MsZnVuY3Rpb24oYyl7bHx8Yy5pc05ld3x8Yz09PWV8fCFjLmxhYmVsfHxjLmxhYmVsLnRleHRTdHIhPT1ifHwoZS5tb3ZlZExhYmVsPWMubGFiZWwsbD0hMCxjLmxhYmVsUG9zPWUubW92ZWRMYWJlbC54eSxkZWxldGUgYy5sYWJlbCl9KTtpZighbCYmKGUubGFiZWxQb3N8fG4pKXt2YXIgYz1lLmxhYmVsUG9zfHxuLnh5O249ay5ob3Jpej9tPzA6ay53aWR0aCtrLmxlZnQ6Yy54O2s9ay5ob3Jpej9jLnk6bT9rLndpZHRoK2subGVmdDowO2UubW92ZWRMYWJlbD1lLmNyZWF0ZUxhYmVsKHt4Om4seTprfSxcbmIsZik7ZS5tb3ZlZExhYmVsJiZlLm1vdmVkTGFiZWwuYXR0cih7b3BhY2l0eTowfSl9fTtiLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oZCxiLGYpe3ZhciBlPXRoaXMuYXhpcyxsPWUuaG9yaXosaz10aGlzLnBvcyxtPXEodGhpcy50aWNrbWFya09mZnNldCxlLnRpY2ttYXJrT2Zmc2V0KTtrPXRoaXMuZ2V0UG9zaXRpb24obCxrLG0sYik7bT1rLng7dmFyIGM9ay55O2U9bCYmbT09PWUucG9zK2UubGVufHwhbCYmYz09PWUucG9zPy0xOjE7bD1xKGYsdGhpcy5sYWJlbCYmdGhpcy5sYWJlbC5uZXdPcGFjaXR5LDEpO2Y9cShmLDEpO3RoaXMuaXNBY3RpdmU9ITA7dGhpcy5yZW5kZXJHcmlkTGluZShiLGYsZSk7dGhpcy5yZW5kZXJNYXJrKGssZixlKTt0aGlzLnJlbmRlckxhYmVsKGssYixsLGQpO3RoaXMuaXNOZXc9ITE7dyh0aGlzLFwiYWZ0ZXJSZW5kZXJcIil9O2IucHJvdG90eXBlLnJlbmRlckdyaWRMaW5lPWZ1bmN0aW9uKGQsYixmKXt2YXIgZT10aGlzLmF4aXMsbD1lLm9wdGlvbnMsXG5rPXRoaXMuZ3JpZExpbmUsbT17fSxjPXRoaXMucG9zLGc9dGhpcy50eXBlLGE9cSh0aGlzLnRpY2ttYXJrT2Zmc2V0LGUudGlja21hcmtPZmZzZXQpLGg9ZS5jaGFydC5yZW5kZXJlcixyPWwuZ3JpZExpbmVXaWR0aCxBPWwuZ3JpZExpbmVDb2xvcix5PWwuZ3JpZExpbmVEYXNoU3R5bGU7XCJtaW5vclwiPT09dGhpcy50eXBlJiYocj1sLm1pbm9yR3JpZExpbmVXaWR0aCxBPWwubWlub3JHcmlkTGluZUNvbG9yLHk9bC5taW5vckdyaWRMaW5lRGFzaFN0eWxlKTtrfHwoZS5jaGFydC5zdHlsZWRNb2RlfHwobS5zdHJva2U9QSxtW1wic3Ryb2tlLXdpZHRoXCJdPXJ8fDAsbS5kYXNoc3R5bGU9eSksZ3x8KG0uekluZGV4PTEpLGQmJihiPTApLHRoaXMuZ3JpZExpbmU9az1oLnBhdGgoKS5hdHRyKG0pLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1cIisoZz9nK1wiLVwiOlwiXCIpK1wiZ3JpZC1saW5lXCIpLmFkZChlLmdyaWRHcm91cCkpO2lmKGsmJihmPWUuZ2V0UGxvdExpbmVQYXRoKHt2YWx1ZTpjK2EsbGluZVdpZHRoOmsuc3Ryb2tlV2lkdGgoKSpcbmYsZm9yY2U6XCJwYXNzXCIsb2xkOmR9KSkpa1tkfHx0aGlzLmlzTmV3P1wiYXR0clwiOlwiYW5pbWF0ZVwiXSh7ZDpmLG9wYWNpdHk6Yn0pfTtiLnByb3RvdHlwZS5yZW5kZXJNYXJrPWZ1bmN0aW9uKGQsYixmKXt2YXIgZT10aGlzLmF4aXMsbD1lLm9wdGlvbnMsaz1lLmNoYXJ0LnJlbmRlcmVyLG09dGhpcy50eXBlLGM9ZS50aWNrU2l6ZShtP20rXCJUaWNrXCI6XCJ0aWNrXCIpLGc9dGhpcy5tYXJrLGE9IWcsaD1kLng7ZD1kLnk7dmFyIHI9cShsW1wibWlub3JcIiE9PW0/XCJ0aWNrV2lkdGhcIjpcIm1pbm9yVGlja1dpZHRoXCJdLCFtJiZlLmlzWEF4aXM/MTowKTtsPWxbXCJtaW5vclwiIT09bT9cInRpY2tDb2xvclwiOlwibWlub3JUaWNrQ29sb3JcIl07YyYmKGUub3Bwb3NpdGUmJihjWzBdPS1jWzBdKSxhJiYodGhpcy5tYXJrPWc9ay5wYXRoKCkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLVwiKyhtP20rXCItXCI6XCJcIikrXCJ0aWNrXCIpLmFkZChlLmF4aXNHcm91cCksZS5jaGFydC5zdHlsZWRNb2RlfHxnLmF0dHIoe3N0cm9rZTpsLFxuXCJzdHJva2Utd2lkdGhcIjpyfSkpLGdbYT9cImF0dHJcIjpcImFuaW1hdGVcIl0oe2Q6dGhpcy5nZXRNYXJrUGF0aChoLGQsY1swXSxnLnN0cm9rZVdpZHRoKCkqZixlLmhvcml6LGspLG9wYWNpdHk6Yn0pKX07Yi5wcm90b3R5cGUucmVuZGVyTGFiZWw9ZnVuY3Rpb24oZCxiLGYsZSl7dmFyIGw9dGhpcy5heGlzLG49bC5ob3JpeixtPWwub3B0aW9ucyxjPXRoaXMubGFiZWwsZz1tLmxhYmVscyxhPWcuc3RlcDtsPXEodGhpcy50aWNrbWFya09mZnNldCxsLnRpY2ttYXJrT2Zmc2V0KTt2YXIgaD0hMCxyPWQueDtkPWQueTtjJiZ2KHIpJiYoYy54eT1kPXRoaXMuZ2V0TGFiZWxQb3NpdGlvbihyLGQsYyxuLGcsbCxlLGEpLHRoaXMuaXNGaXJzdCYmIXRoaXMuaXNMYXN0JiYhbS5zaG93Rmlyc3RMYWJlbHx8dGhpcy5pc0xhc3QmJiF0aGlzLmlzRmlyc3QmJiFtLnNob3dMYXN0TGFiZWw/aD0hMTohbnx8Zy5zdGVwfHxnLnJvdGF0aW9ufHxifHwwPT09Znx8dGhpcy5oYW5kbGVPdmVyZmxvdyhkKSxhJiZcbmUlYSYmKGg9ITEpLGgmJnYoZC55KT8oZC5vcGFjaXR5PWYsY1t0aGlzLmlzTmV3TGFiZWw/XCJhdHRyXCI6XCJhbmltYXRlXCJdKGQpLHRoaXMuaXNOZXdMYWJlbD0hMSk6KGMuYXR0cihcInlcIiwtOTk5OSksdGhpcy5pc05ld0xhYmVsPSEwKSl9O2IucHJvdG90eXBlLnJlcGxhY2VNb3ZlZExhYmVsPWZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy5sYWJlbCxiPXRoaXMuYXhpcyxmPWIucmV2ZXJzZWQ7aWYoZCYmIXRoaXMuaXNOZXcpe3ZhciBlPWIuaG9yaXo/Zj9iLmxlZnQ6Yi53aWR0aCtiLmxlZnQ6ZC54eS54O2Y9Yi5ob3Jpej9kLnh5Lnk6Zj9iLndpZHRoK2IudG9wOmIudG9wO2QuYW5pbWF0ZSh7eDplLHk6ZixvcGFjaXR5OjB9LHZvaWQgMCxkLmRlc3Ryb3kpO2RlbGV0ZSB0aGlzLmxhYmVsfWIuaXNEaXJ0eT0hMDt0aGlzLmxhYmVsPXRoaXMubW92ZWRMYWJlbDtkZWxldGUgdGhpcy5tb3ZlZExhYmVsfTtyZXR1cm4gYn0oKTtiLlRpY2s9STtyZXR1cm4gYi5UaWNrfSk7TyhlLFwiQ29yZS9BeGlzL0F4aXMuanNcIixcbltlW1wiQ29yZS9BbmltYXRpb24vQW5pbWF0aW9uVXRpbGl0aWVzLmpzXCJdLGVbXCJDb3JlL0NvbG9yL0NvbG9yLmpzXCJdLGVbXCJDb3JlL0dsb2JhbHMuanNcIl0sZVtcIkNvcmUvQ29sb3IvUGFsZXR0ZS5qc1wiXSxlW1wiQ29yZS9PcHRpb25zLmpzXCJdLGVbXCJDb3JlL0F4aXMvVGljay5qc1wiXSxlW1wiQ29yZS9VdGlsaXRpZXMuanNcIl1dLGZ1bmN0aW9uKGUsYixJLHosSCxHLEMpe3ZhciBCPWUuYW5pbU9iamVjdCx4PUguZGVmYXVsdE9wdGlvbnMsdz1DLmFkZEV2ZW50LHY9Qy5hcnJheU1heCxmPUMuYXJyYXlNaW4sZD1DLmNsYW1wLHE9Qy5jb3JyZWN0RmxvYXQsaz1DLmRlZmluZWQsbD1DLmRlc3Ryb3lPYmplY3RQcm9wZXJ0aWVzLE49Qy5lcmFzZSx1PUMuZXJyb3Isbj1DLmV4dGVuZCxKPUMuZmlyZUV2ZW50LEU9Qy5nZXRNYWduaXR1ZGUsbT1DLmlzQXJyYXksYz1DLmlzRnVuY3Rpb24sZz1DLmlzTnVtYmVyLGE9Qy5pc1N0cmluZyxoPUMubWVyZ2Uscj1DLm5vcm1hbGl6ZVRpY2tJbnRlcnZhbCxcbkE9Qy5vYmplY3RFYWNoLHk9Qy5waWNrLEw9Qy5yZWxhdGl2ZUxlbmd0aCxQPUMucmVtb3ZlRXZlbnQsUj1DLnNwbGF0LFY9Qy5zeW5jVGltZW91dDtcIlwiO3ZhciBRPUkuZGVnMnJhZDtlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShhLGMpe3RoaXMuem9vbUVuYWJsZWQ9dGhpcy53aWR0aD10aGlzLnZpc2libGU9dGhpcy51c2VyT3B0aW9ucz10aGlzLnRyYW5zbGF0aW9uU2xvcGU9dGhpcy50cmFuc0I9dGhpcy50cmFuc0E9dGhpcy50b3A9dGhpcy50aWNrcz10aGlzLnRpY2tSb3RDb3JyPXRoaXMudGlja1Bvc2l0aW9ucz10aGlzLnRpY2ttYXJrT2Zmc2V0PXRoaXMudGlja0ludGVydmFsPXRoaXMudGlja0Ftb3VudD10aGlzLnNpZGU9dGhpcy5zZXJpZXM9dGhpcy5yaWdodD10aGlzLnBvc2l0aXZlVmFsdWVzT25seT10aGlzLnBvcz10aGlzLnBvaW50UmFuZ2VQYWRkaW5nPXRoaXMucG9pbnRSYW5nZT10aGlzLnBsb3RMaW5lc0FuZEJhbmRzR3JvdXBzPXRoaXMucGxvdExpbmVzQW5kQmFuZHM9XG50aGlzLnBhZGRlZFRpY2tzPXRoaXMub3ZlcmxhcD10aGlzLm9wdGlvbnM9dGhpcy5vZmZzZXQ9dGhpcy5uYW1lcz10aGlzLm1pblBpeGVsUGFkZGluZz10aGlzLm1pbm9yVGlja3M9dGhpcy5taW5vclRpY2tJbnRlcnZhbD10aGlzLm1pbj10aGlzLm1heExhYmVsTGVuZ3RoPXRoaXMubWF4PXRoaXMubGVuPXRoaXMubGVmdD10aGlzLmxhYmVsRm9ybWF0dGVyPXRoaXMubGFiZWxFZGdlPXRoaXMuaXNMaW5rZWQ9dGhpcy5oZWlnaHQ9dGhpcy5oYXNWaXNpYmxlU2VyaWVzPXRoaXMuaGFzTmFtZXM9dGhpcy5jb2xsPXRoaXMuY2xvc2VzdFBvaW50UmFuZ2U9dGhpcy5jaGFydD10aGlzLmNhdGVnb3JpZXM9dGhpcy5ib3R0b209dGhpcy5hbHRlcm5hdGVCYW5kcz12b2lkIDA7dGhpcy5pbml0KGEsYyl9ZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihhLGQpe3ZhciBiPWQuaXNYLGg9dGhpcztoLmNoYXJ0PWE7aC5ob3Jpej1hLmludmVydGVkJiYhaC5pc1pBeGlzPyFiOmI7aC5pc1hBeGlzPWI7XG5oLmNvbGw9aC5jb2xsfHwoYj9cInhBeGlzXCI6XCJ5QXhpc1wiKTtKKHRoaXMsXCJpbml0XCIse3VzZXJPcHRpb25zOmR9KTtoLm9wcG9zaXRlPXkoZC5vcHBvc2l0ZSxoLm9wcG9zaXRlKTtoLnNpZGU9eShkLnNpZGUsaC5zaWRlLGguaG9yaXo/aC5vcHBvc2l0ZT8wOjI6aC5vcHBvc2l0ZT8xOjMpO2guc2V0T3B0aW9ucyhkKTt2YXIgcD10aGlzLm9wdGlvbnMsdD1wLmxhYmVscyxyPXAudHlwZTtoLnVzZXJPcHRpb25zPWQ7aC5taW5QaXhlbFBhZGRpbmc9MDtoLnJldmVyc2VkPXkocC5yZXZlcnNlZCxoLnJldmVyc2VkKTtoLnZpc2libGU9cC52aXNpYmxlO2guem9vbUVuYWJsZWQ9cC56b29tRW5hYmxlZDtoLmhhc05hbWVzPVwiY2F0ZWdvcnlcIj09PXJ8fCEwPT09cC5jYXRlZ29yaWVzO2guY2F0ZWdvcmllcz1wLmNhdGVnb3JpZXN8fGguaGFzTmFtZXM7aC5uYW1lc3x8KGgubmFtZXM9W10saC5uYW1lcy5rZXlzPXt9KTtoLnBsb3RMaW5lc0FuZEJhbmRzR3JvdXBzPXt9O2gucG9zaXRpdmVWYWx1ZXNPbmx5PVxuISFoLmxvZ2FyaXRobWljO2guaXNMaW5rZWQ9ayhwLmxpbmtlZFRvKTtoLnRpY2tzPXt9O2gubGFiZWxFZGdlPVtdO2gubWlub3JUaWNrcz17fTtoLnBsb3RMaW5lc0FuZEJhbmRzPVtdO2guYWx0ZXJuYXRlQmFuZHM9e307aC5sZW49MDtoLm1pblJhbmdlPWgudXNlck1pblJhbmdlPXAubWluUmFuZ2V8fHAubWF4Wm9vbTtoLnJhbmdlPXAucmFuZ2U7aC5vZmZzZXQ9cC5vZmZzZXR8fDA7aC5tYXg9bnVsbDtoLm1pbj1udWxsO2Q9eShwLmNyb3NzaGFpcixSKGEub3B0aW9ucy50b29sdGlwLmNyb3NzaGFpcnMpW2I/MDoxXSk7aC5jcm9zc2hhaXI9ITA9PT1kP3t9OmQ7ZD1oLm9wdGlvbnMuZXZlbnRzOy0xPT09YS5heGVzLmluZGV4T2YoaCkmJihiP2EuYXhlcy5zcGxpY2UoYS54QXhpcy5sZW5ndGgsMCxoKTphLmF4ZXMucHVzaChoKSxhW2guY29sbF0ucHVzaChoKSk7aC5zZXJpZXM9aC5zZXJpZXN8fFtdO2EuaW52ZXJ0ZWQmJiFoLmlzWkF4aXMmJmImJlwidW5kZWZpbmVkXCI9PT10eXBlb2YgaC5yZXZlcnNlZCYmXG4oaC5yZXZlcnNlZD0hMCk7aC5sYWJlbFJvdGF0aW9uPWcodC5yb3RhdGlvbik/dC5yb3RhdGlvbjp2b2lkIDA7QShkLGZ1bmN0aW9uKGEsZCl7YyhhKSYmdyhoLGQsYSl9KTtKKHRoaXMsXCJhZnRlckluaXRcIil9O2UucHJvdG90eXBlLnNldE9wdGlvbnM9ZnVuY3Rpb24oYSl7dGhpcy5vcHRpb25zPWgoZS5kZWZhdWx0T3B0aW9ucyxcInlBeGlzXCI9PT10aGlzLmNvbGwmJmUuZGVmYXVsdFlBeGlzT3B0aW9ucyxbZS5kZWZhdWx0VG9wQXhpc09wdGlvbnMsZS5kZWZhdWx0UmlnaHRBeGlzT3B0aW9ucyxlLmRlZmF1bHRCb3R0b21BeGlzT3B0aW9ucyxlLmRlZmF1bHRMZWZ0QXhpc09wdGlvbnNdW3RoaXMuc2lkZV0saCh4W3RoaXMuY29sbF0sYSkpO0oodGhpcyxcImFmdGVyU2V0T3B0aW9uc1wiLHt1c2VyT3B0aW9uczphfSl9O2UucHJvdG90eXBlLmRlZmF1bHRMYWJlbEZvcm1hdHRlcj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuYXhpcyxjPWcodGhpcy52YWx1ZSk/dGhpcy52YWx1ZTpOYU4sZD1cbmEuY2hhcnQudGltZSxoPXRoaXMuZGF0ZVRpbWVMYWJlbEZvcm1hdCxiPXgubGFuZyxyPWIubnVtZXJpY1N5bWJvbHM7Yj1iLm51bWVyaWNTeW1ib2xNYWduaXR1ZGV8fDFFMzt2YXIgZT1yJiZyLmxlbmd0aCxmPWEubG9nYXJpdGhtaWM/TWF0aC5hYnMoYyk6YS50aWNrSW50ZXJ2YWwsbT10aGlzLmNoYXJ0Lm51bWJlckZvcm1hdHRlcjtpZihhLmNhdGVnb3JpZXMpdmFyIEE9XCJcIit0aGlzLnZhbHVlO2Vsc2UgaWYoaClBPWQuZGF0ZUZvcm1hdChoLGMpO2Vsc2UgaWYoZSYmMUUzPD1mKWZvcig7ZS0tJiZcInVuZGVmaW5lZFwiPT09dHlwZW9mIEE7KWE9TWF0aC5wb3coYixlKzEpLGY+PWEmJjA9PT0xMCpjJWEmJm51bGwhPT1yW2VdJiYwIT09YyYmKEE9bShjL2EsLTEpK3JbZV0pO1widW5kZWZpbmVkXCI9PT10eXBlb2YgQSYmKEE9MUU0PD1NYXRoLmFicyhjKT9tKGMsLTEpOm0oYywtMSx2b2lkIDAsXCJcIikpO3JldHVybiBBfTtlLnByb3RvdHlwZS5nZXRTZXJpZXNFeHRyZW1lcz1mdW5jdGlvbigpe3ZhciBhPVxudGhpcyxjPWEuY2hhcnQsZDtKKHRoaXMsXCJnZXRTZXJpZXNFeHRyZW1lc1wiLG51bGwsZnVuY3Rpb24oKXthLmhhc1Zpc2libGVTZXJpZXM9ITE7YS5kYXRhTWluPWEuZGF0YU1heD1hLnRocmVzaG9sZD1udWxsO2Euc29mdFRocmVzaG9sZD0hYS5pc1hBeGlzO2Euc3RhY2tpbmcmJmEuc3RhY2tpbmcuYnVpbGRTdGFja3MoKTthLnNlcmllcy5mb3JFYWNoKGZ1bmN0aW9uKGgpe2lmKGgudmlzaWJsZXx8IWMub3B0aW9ucy5jaGFydC5pZ25vcmVIaWRkZW5TZXJpZXMpe3ZhciBiPWgub3B0aW9ucyxwPWIudGhyZXNob2xkO2EuaGFzVmlzaWJsZVNlcmllcz0hMDthLnBvc2l0aXZlVmFsdWVzT25seSYmMD49cCYmKHA9bnVsbCk7aWYoYS5pc1hBeGlzKXtpZihiPWgueERhdGEsYi5sZW5ndGgpe2I9YS5sb2dhcml0aG1pYz9iLmZpbHRlcihhLnZhbGlkYXRlUG9zaXRpdmVWYWx1ZSk6YjtkPWguZ2V0WEV4dHJlbWVzKGIpO3ZhciB0PWQubWluO3ZhciByPWQubWF4O2codCl8fHQgaW5zdGFuY2VvZlxuRGF0ZXx8KGI9Yi5maWx0ZXIoZyksZD1oLmdldFhFeHRyZW1lcyhiKSx0PWQubWluLHI9ZC5tYXgpO2IubGVuZ3RoJiYoYS5kYXRhTWluPU1hdGgubWluKHkoYS5kYXRhTWluLHQpLHQpLGEuZGF0YU1heD1NYXRoLm1heCh5KGEuZGF0YU1heCxyKSxyKSl9fWVsc2UgaWYoaD1oLmFwcGx5RXh0cmVtZXMoKSxnKGguZGF0YU1pbikmJih0PWguZGF0YU1pbixhLmRhdGFNaW49TWF0aC5taW4oeShhLmRhdGFNaW4sdCksdCkpLGcoaC5kYXRhTWF4KSYmKHI9aC5kYXRhTWF4LGEuZGF0YU1heD1NYXRoLm1heCh5KGEuZGF0YU1heCxyKSxyKSksayhwKSYmKGEudGhyZXNob2xkPXApLCFiLnNvZnRUaHJlc2hvbGR8fGEucG9zaXRpdmVWYWx1ZXNPbmx5KWEuc29mdFRocmVzaG9sZD0hMX19KX0pO0oodGhpcyxcImFmdGVyR2V0U2VyaWVzRXh0cmVtZXNcIil9O2UucHJvdG90eXBlLnRyYW5zbGF0ZT1mdW5jdGlvbihhLGMsZCxoLGIscil7dmFyIHA9dGhpcy5saW5rZWRQYXJlbnR8fHRoaXMsdD0xLGU9XG4wLGY9aCYmcC5vbGQ/cC5vbGQudHJhbnNBOnAudHJhbnNBO2g9aCYmcC5vbGQ/cC5vbGQubWluOnAubWluO3ZhciBGPXAubWluUGl4ZWxQYWRkaW5nO2I9KHAuaXNPcmRpbmFsfHxwLmJyb2tlbkF4aXMmJnAuYnJva2VuQXhpcy5oYXNCcmVha3N8fHAubG9nYXJpdGhtaWMmJmIpJiZwLmxpbjJ2YWw7Znx8KGY9cC50cmFuc0EpO2QmJih0Kj0tMSxlPXAubGVuKTtwLnJldmVyc2VkJiYodCo9LTEsZS09dCoocC5zZWN0b3J8fHAubGVuKSk7Yz8oYT0oYSp0K2UtRikvZitoLGImJihhPXAubGluMnZhbChhKSkpOihiJiYoYT1wLnZhbDJsaW4oYSkpLGE9ZyhoKT90KihhLWgpKmYrZSt0KkYrKGcocik/ZipyOjApOnZvaWQgMCk7cmV0dXJuIGF9O2UucHJvdG90eXBlLnRvUGl4ZWxzPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMudHJhbnNsYXRlKGEsITEsIXRoaXMuaG9yaXosbnVsbCwhMCkrKGM/MDp0aGlzLnBvcyl9O2UucHJvdG90eXBlLnRvVmFsdWU9ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy50cmFuc2xhdGUoYS1cbihjPzA6dGhpcy5wb3MpLCEwLCF0aGlzLmhvcml6LG51bGwsITApfTtlLnByb3RvdHlwZS5nZXRQbG90TGluZVBhdGg9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhhLGMsZyl7aWYoXCJwYXNzXCIhPT1sJiZhPGN8fGE+ZylsP2E9ZChhLGMsZyk6dj0hMDtyZXR1cm4gYX12YXIgaD10aGlzLGI9aC5jaGFydCx0PWgubGVmdCxyPWgudG9wLGU9YS5vbGQsZj1hLnZhbHVlLG09YS50cmFuc2xhdGVkVmFsdWUsQT1hLmxpbmVXaWR0aCxsPWEuZm9yY2UsbixrLHUsTCxxPWUmJmIub2xkQ2hhcnRIZWlnaHR8fGIuY2hhcnRIZWlnaHQsUD1lJiZiLm9sZENoYXJ0V2lkdGh8fGIuY2hhcnRXaWR0aCx2LGRhPWgudHJhbnNCO2E9e3ZhbHVlOmYsbGluZVdpZHRoOkEsb2xkOmUsZm9yY2U6bCxhY3Jvc3NQYW5lczphLmFjcm9zc1BhbmVzLHRyYW5zbGF0ZWRWYWx1ZTptfTtKKHRoaXMsXCJnZXRQbG90TGluZVBhdGhcIixhLGZ1bmN0aW9uKGEpe209eShtLGgudHJhbnNsYXRlKGYsbnVsbCxudWxsLGUpKTttPWQobSxcbi0xRTUsMUU1KTtuPXU9TWF0aC5yb3VuZChtK2RhKTtrPUw9TWF0aC5yb3VuZChxLW0tZGEpO2cobSk/aC5ob3Jpej8oaz1yLEw9cS1oLmJvdHRvbSxuPXU9YyhuLHQsdCtoLndpZHRoKSk6KG49dCx1PVAtaC5yaWdodCxrPUw9YyhrLHIscitoLmhlaWdodCkpOih2PSEwLGw9ITEpO2EucGF0aD12JiYhbD9udWxsOmIucmVuZGVyZXIuY3Jpc3BMaW5lKFtbXCJNXCIsbixrXSxbXCJMXCIsdSxMXV0sQXx8MSl9KTtyZXR1cm4gYS5wYXRofTtlLnByb3RvdHlwZS5nZXRMaW5lYXJUaWNrUG9zaXRpb25zPWZ1bmN0aW9uKGEsYyxkKXt2YXIgZz1xKE1hdGguZmxvb3IoYy9hKSphKTtkPXEoTWF0aC5jZWlsKGQvYSkqYSk7dmFyIGg9W10sYjtxKGcrYSk9PT1nJiYoYj0yMCk7aWYodGhpcy5zaW5nbGUpcmV0dXJuW2NdO2ZvcihjPWc7Yzw9ZDspe2gucHVzaChjKTtjPXEoYythLGIpO2lmKGM9PT1wKWJyZWFrO3ZhciBwPWN9cmV0dXJuIGh9O2UucHJvdG90eXBlLmdldE1pbm9yVGlja0ludGVydmFsPWZ1bmN0aW9uKCl7dmFyIGE9XG50aGlzLm9wdGlvbnM7cmV0dXJuITA9PT1hLm1pbm9yVGlja3M/eShhLm1pbm9yVGlja0ludGVydmFsLFwiYXV0b1wiKTohMT09PWEubWlub3JUaWNrcz9udWxsOmEubWlub3JUaWNrSW50ZXJ2YWx9O2UucHJvdG90eXBlLmdldE1pbm9yVGlja1Bvc2l0aW9ucz1mdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucyxjPXRoaXMudGlja1Bvc2l0aW9ucyxkPXRoaXMubWlub3JUaWNrSW50ZXJ2YWwsZz1bXSxoPXRoaXMucG9pbnRSYW5nZVBhZGRpbmd8fDAsYj10aGlzLm1pbi1oO2g9dGhpcy5tYXgraDt2YXIgcj1oLWI7aWYociYmci9kPHRoaXMubGVuLzMpe3ZhciBlPXRoaXMubG9nYXJpdGhtaWM7aWYoZSl0aGlzLnBhZGRlZFRpY2tzLmZvckVhY2goZnVuY3Rpb24oYSxjLGgpe2MmJmcucHVzaC5hcHBseShnLGUuZ2V0TG9nVGlja1Bvc2l0aW9ucyhkLGhbYy0xXSxoW2NdLCEwKSl9KTtlbHNlIGlmKHRoaXMuZGF0ZVRpbWUmJlwiYXV0b1wiPT09dGhpcy5nZXRNaW5vclRpY2tJbnRlcnZhbCgpKWc9XG5nLmNvbmNhdCh0aGlzLmdldFRpbWVUaWNrcyh0aGlzLmRhdGVUaW1lLm5vcm1hbGl6ZVRpbWVUaWNrSW50ZXJ2YWwoZCksYixoLGEuc3RhcnRPZldlZWspKTtlbHNlIGZvcihhPWIrKGNbMF0tYiklZDthPD1oJiZhIT09Z1swXTthKz1kKWcucHVzaChhKX0wIT09Zy5sZW5ndGgmJnRoaXMudHJpbVRpY2tzKGcpO3JldHVybiBnfTtlLnByb3RvdHlwZS5hZGp1c3RGb3JNaW5SYW5nZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucyxjPXRoaXMubWluLGQ9dGhpcy5tYXgsZz10aGlzLmxvZ2FyaXRobWljLGg9MCxiLHIsZSxtO3RoaXMuaXNYQXhpcyYmXCJ1bmRlZmluZWRcIj09PXR5cGVvZiB0aGlzLm1pblJhbmdlJiYhZyYmKGsoYS5taW4pfHxrKGEubWF4KT90aGlzLm1pblJhbmdlPW51bGw6KHRoaXMuc2VyaWVzLmZvckVhY2goZnVuY3Rpb24oYSl7ZT1hLnhEYXRhO209YS54SW5jcmVtZW50PzE6ZS5sZW5ndGgtMTtpZigxPGUubGVuZ3RoKWZvcihiPW07MDxiO2ItLSlpZihyPWVbYl0tXG5lW2ItMV0sIWh8fHI8aCloPXJ9KSx0aGlzLm1pblJhbmdlPU1hdGgubWluKDUqaCx0aGlzLmRhdGFNYXgtdGhpcy5kYXRhTWluKSkpO2lmKGQtYzx0aGlzLm1pblJhbmdlKXt2YXIgQT10aGlzLmRhdGFNYXgtdGhpcy5kYXRhTWluPj10aGlzLm1pblJhbmdlO3ZhciBsPXRoaXMubWluUmFuZ2U7dmFyIG49KGwtZCtjKS8yO249W2Mtbix5KGEubWluLGMtbildO0EmJihuWzJdPXRoaXMubG9nYXJpdGhtaWM/dGhpcy5sb2dhcml0aG1pYy5sb2cybGluKHRoaXMuZGF0YU1pbik6dGhpcy5kYXRhTWluKTtjPXYobik7ZD1bYytsLHkoYS5tYXgsYytsKV07QSYmKGRbMl09Zz9nLmxvZzJsaW4odGhpcy5kYXRhTWF4KTp0aGlzLmRhdGFNYXgpO2Q9ZihkKTtkLWM8bCYmKG5bMF09ZC1sLG5bMV09eShhLm1pbixkLWwpLGM9dihuKSl9dGhpcy5taW49Yzt0aGlzLm1heD1kfTtlLnByb3RvdHlwZS5nZXRDbG9zZXN0PWZ1bmN0aW9uKCl7dmFyIGE7dGhpcy5jYXRlZ29yaWVzP2E9MTp0aGlzLnNlcmllcy5mb3JFYWNoKGZ1bmN0aW9uKGMpe3ZhciBkPVxuYy5jbG9zZXN0UG9pbnRSYW5nZSxnPWMudmlzaWJsZXx8IWMuY2hhcnQub3B0aW9ucy5jaGFydC5pZ25vcmVIaWRkZW5TZXJpZXM7IWMubm9TaGFyZWRUb29sdGlwJiZrKGQpJiZnJiYoYT1rKGEpP01hdGgubWluKGEsZCk6ZCl9KTtyZXR1cm4gYX07ZS5wcm90b3R5cGUubmFtZVRvWD1mdW5jdGlvbihhKXt2YXIgYz1tKHRoaXMuY2F0ZWdvcmllcyksZD1jP3RoaXMuY2F0ZWdvcmllczp0aGlzLm5hbWVzLGc9YS5vcHRpb25zLng7YS5zZXJpZXMucmVxdWlyZVNvcnRpbmc9ITE7ayhnKXx8KGc9dGhpcy5vcHRpb25zLnVuaXF1ZU5hbWVzP2M/ZC5pbmRleE9mKGEubmFtZSk6eShkLmtleXNbYS5uYW1lXSwtMSk6YS5zZXJpZXMuYXV0b0luY3JlbWVudCgpKTtpZigtMT09PWcpe2lmKCFjKXZhciBoPWQubGVuZ3RofWVsc2UgaD1nO1widW5kZWZpbmVkXCIhPT10eXBlb2YgaCYmKHRoaXMubmFtZXNbaF09YS5uYW1lLHRoaXMubmFtZXMua2V5c1thLm5hbWVdPWgpO3JldHVybiBofTtlLnByb3RvdHlwZS51cGRhdGVOYW1lcz1cbmZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPXRoaXMubmFtZXM7MDxjLmxlbmd0aCYmKE9iamVjdC5rZXlzKGMua2V5cykuZm9yRWFjaChmdW5jdGlvbihhKXtkZWxldGUgYy5rZXlzW2FdfSksYy5sZW5ndGg9MCx0aGlzLm1pblJhbmdlPXRoaXMudXNlck1pblJhbmdlLCh0aGlzLnNlcmllc3x8W10pLmZvckVhY2goZnVuY3Rpb24oYyl7Yy54SW5jcmVtZW50PW51bGw7aWYoIWMucG9pbnRzfHxjLmlzRGlydHlEYXRhKWEubWF4PU1hdGgubWF4KGEubWF4LGMueERhdGEubGVuZ3RoLTEpLGMucHJvY2Vzc0RhdGEoKSxjLmdlbmVyYXRlUG9pbnRzKCk7Yy5kYXRhLmZvckVhY2goZnVuY3Rpb24oZCxnKXtpZihkJiZkLm9wdGlvbnMmJlwidW5kZWZpbmVkXCIhPT10eXBlb2YgZC5uYW1lKXt2YXIgaD1hLm5hbWVUb1goZCk7XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBoJiZoIT09ZC54JiYoZC54PWgsYy54RGF0YVtnXT1oKX19KX0pKX07ZS5wcm90b3R5cGUuc2V0QXhpc1RyYW5zbGF0aW9uPWZ1bmN0aW9uKCl7dmFyIGM9XG50aGlzLGQ9Yy5tYXgtYy5taW4sZz1jLmF4aXNQb2ludFJhbmdlfHwwLGg9MCxiPTAscj1jLmxpbmtlZFBhcmVudCxlPSEhYy5jYXRlZ29yaWVzLGY9Yy50cmFuc0EsbT1jLmlzWEF4aXM7aWYobXx8ZXx8Zyl7dmFyIEE9Yy5nZXRDbG9zZXN0KCk7cj8oaD1yLm1pblBvaW50T2Zmc2V0LGI9ci5wb2ludFJhbmdlUGFkZGluZyk6Yy5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihkKXt2YXIgcD1lPzE6bT95KGQub3B0aW9ucy5wb2ludFJhbmdlLEEsMCk6Yy5heGlzUG9pbnRSYW5nZXx8MCxyPWQub3B0aW9ucy5wb2ludFBsYWNlbWVudDtnPU1hdGgubWF4KGcscCk7aWYoIWMuc2luZ2xlfHxlKWQ9ZC5pcyhcInhyYW5nZVwiKT8hbTptLGg9TWF0aC5tYXgoaCxkJiZhKHIpPzA6cC8yKSxiPU1hdGgubWF4KGIsZCYmXCJvblwiPT09cj8wOnApfSk7cj1jLm9yZGluYWwmJmMub3JkaW5hbC5zbG9wZSYmQT9jLm9yZGluYWwuc2xvcGUvQToxO2MubWluUG9pbnRPZmZzZXQ9aCo9cjtjLnBvaW50UmFuZ2VQYWRkaW5nPVxuYio9cjtjLnBvaW50UmFuZ2U9TWF0aC5taW4oZyxjLnNpbmdsZSYmZT8xOmQpO20mJihjLmNsb3Nlc3RQb2ludFJhbmdlPUEpfWMudHJhbnNsYXRpb25TbG9wZT1jLnRyYW5zQT1mPWMuc3RhdGljU2NhbGV8fGMubGVuLyhkK2J8fDEpO2MudHJhbnNCPWMuaG9yaXo/Yy5sZWZ0OmMuYm90dG9tO2MubWluUGl4ZWxQYWRkaW5nPWYqaDtKKHRoaXMsXCJhZnRlclNldEF4aXNUcmFuc2xhdGlvblwiKX07ZS5wcm90b3R5cGUubWluRnJvbVJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF4LXRoaXMucmFuZ2V9O2UucHJvdG90eXBlLnNldFRpY2tJbnRlcnZhbD1mdW5jdGlvbihhKXt2YXIgYz10aGlzLGQ9Yy5jaGFydCxoPWMubG9nYXJpdGhtaWMsYj1jLm9wdGlvbnMsZT1jLmlzWEF4aXMsdD1jLmlzTGlua2VkLGY9Yi5tYXhQYWRkaW5nLG09Yi5taW5QYWRkaW5nLEE9Yi50aWNrSW50ZXJ2YWwsbD1iLnRpY2tQaXhlbEludGVydmFsLG49Yy5jYXRlZ29yaWVzLEw9ZyhjLnRocmVzaG9sZCk/XG5jLnRocmVzaG9sZDpudWxsLFA9Yy5zb2Z0VGhyZXNob2xkO2MuZGF0ZVRpbWV8fG58fHR8fHRoaXMuZ2V0VGlja0Ftb3VudCgpO3ZhciB2PXkoYy51c2VyTWluLGIubWluKTt2YXIgdz15KGMudXNlck1heCxiLm1heCk7aWYodCl7Yy5saW5rZWRQYXJlbnQ9ZFtjLmNvbGxdW2IubGlua2VkVG9dO3ZhciBSPWMubGlua2VkUGFyZW50LmdldEV4dHJlbWVzKCk7Yy5taW49eShSLm1pbixSLmRhdGFNaW4pO2MubWF4PXkoUi5tYXgsUi5kYXRhTWF4KTtiLnR5cGUhPT1jLmxpbmtlZFBhcmVudC5vcHRpb25zLnR5cGUmJnUoMTEsMSxkKX1lbHNle2lmKFAmJmsoTCkpaWYoYy5kYXRhTWluPj1MKVI9TCxtPTA7ZWxzZSBpZihjLmRhdGFNYXg8PUwpe3ZhciBRPUw7Zj0wfWMubWluPXkodixSLGMuZGF0YU1pbik7Yy5tYXg9eSh3LFEsYy5kYXRhTWF4KX1oJiYoYy5wb3NpdGl2ZVZhbHVlc09ubHkmJiFhJiYwPj1NYXRoLm1pbihjLm1pbix5KGMuZGF0YU1pbixjLm1pbikpJiZ1KDEwLDEsZCksYy5taW49XG5xKGgubG9nMmxpbihjLm1pbiksMTYpLGMubWF4PXEoaC5sb2cybGluKGMubWF4KSwxNikpO2MucmFuZ2UmJmsoYy5tYXgpJiYoYy51c2VyTWluPWMubWluPXY9TWF0aC5tYXgoYy5kYXRhTWluLGMubWluRnJvbVJhbmdlKCkpLGMudXNlck1heD13PWMubWF4LGMucmFuZ2U9bnVsbCk7SihjLFwiZm91bmRFeHRyZW1lc1wiKTtjLmJlZm9yZVBhZGRpbmcmJmMuYmVmb3JlUGFkZGluZygpO2MuYWRqdXN0Rm9yTWluUmFuZ2UoKTshKG58fGMuYXhpc1BvaW50UmFuZ2V8fGMuc3RhY2tpbmcmJmMuc3RhY2tpbmcudXNlUGVyY2VudGFnZXx8dCkmJmsoYy5taW4pJiZrKGMubWF4KSYmKGQ9Yy5tYXgtYy5taW4pJiYoIWsodikmJm0mJihjLm1pbi09ZCptKSwhayh3KSYmZiYmKGMubWF4Kz1kKmYpKTtnKGMudXNlck1pbil8fChnKGIuc29mdE1pbikmJmIuc29mdE1pbjxjLm1pbiYmKGMubWluPXY9Yi5zb2Z0TWluKSxnKGIuZmxvb3IpJiYoYy5taW49TWF0aC5tYXgoYy5taW4sYi5mbG9vcikpKTtnKGMudXNlck1heCl8fFxuKGcoYi5zb2Z0TWF4KSYmYi5zb2Z0TWF4PmMubWF4JiYoYy5tYXg9dz1iLnNvZnRNYXgpLGcoYi5jZWlsaW5nKSYmKGMubWF4PU1hdGgubWluKGMubWF4LGIuY2VpbGluZykpKTtQJiZrKGMuZGF0YU1pbikmJihMPUx8fDAsIWsodikmJmMubWluPEwmJmMuZGF0YU1pbj49TD9jLm1pbj1jLm9wdGlvbnMubWluUmFuZ2U/TWF0aC5taW4oTCxjLm1heC1jLm1pblJhbmdlKTpMOiFrKHcpJiZjLm1heD5MJiZjLmRhdGFNYXg8PUwmJihjLm1heD1jLm9wdGlvbnMubWluUmFuZ2U/TWF0aC5tYXgoTCxjLm1pbitjLm1pblJhbmdlKTpMKSk7ZyhjLm1pbikmJmcoYy5tYXgpJiYhdGhpcy5jaGFydC5wb2xhciYmYy5taW4+Yy5tYXgmJihrKGMub3B0aW9ucy5taW4pP2MubWF4PWMubWluOmsoYy5vcHRpb25zLm1heCkmJihjLm1pbj1jLm1heCkpO2MudGlja0ludGVydmFsPWMubWluPT09Yy5tYXh8fFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYy5taW58fFwidW5kZWZpbmVkXCI9PT10eXBlb2YgYy5tYXg/MTpcbnQmJmMubGlua2VkUGFyZW50JiYhQSYmbD09PWMubGlua2VkUGFyZW50Lm9wdGlvbnMudGlja1BpeGVsSW50ZXJ2YWw/QT1jLmxpbmtlZFBhcmVudC50aWNrSW50ZXJ2YWw6eShBLHRoaXMudGlja0Ftb3VudD8oYy5tYXgtYy5taW4pL01hdGgubWF4KHRoaXMudGlja0Ftb3VudC0xLDEpOnZvaWQgMCxuPzE6KGMubWF4LWMubWluKSpsL01hdGgubWF4KGMubGVuLGwpKTtlJiYhYSYmYy5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihhKXthLnByb2Nlc3NEYXRhKGMubWluIT09KGMub2xkJiZjLm9sZC5taW4pfHxjLm1heCE9PShjLm9sZCYmYy5vbGQubWF4KSl9KTtjLnNldEF4aXNUcmFuc2xhdGlvbigpO0oodGhpcyxcImluaXRpYWxBeGlzVHJhbnNsYXRpb25cIik7Yy5wb2ludFJhbmdlJiYhQSYmKGMudGlja0ludGVydmFsPU1hdGgubWF4KGMucG9pbnRSYW5nZSxjLnRpY2tJbnRlcnZhbCkpO2E9eShiLm1pblRpY2tJbnRlcnZhbCxjLmRhdGVUaW1lJiYhYy5zZXJpZXMuc29tZShmdW5jdGlvbihhKXtyZXR1cm4gYS5ub1NoYXJlZFRvb2x0aXB9KT9cbmMuY2xvc2VzdFBvaW50UmFuZ2U6MCk7IUEmJmMudGlja0ludGVydmFsPGEmJihjLnRpY2tJbnRlcnZhbD1hKTtjLmRhdGVUaW1lfHxjLmxvZ2FyaXRobWljfHxBfHwoYy50aWNrSW50ZXJ2YWw9cihjLnRpY2tJbnRlcnZhbCx2b2lkIDAsRShjLnRpY2tJbnRlcnZhbCkseShiLmFsbG93RGVjaW1hbHMsLjU+Yy50aWNrSW50ZXJ2YWx8fHZvaWQgMCE9PXRoaXMudGlja0Ftb3VudCksISF0aGlzLnRpY2tBbW91bnQpKTt0aGlzLnRpY2tBbW91bnR8fChjLnRpY2tJbnRlcnZhbD1jLnVuc3F1aXNoKCkpO3RoaXMuc2V0VGlja1Bvc2l0aW9ucygpfTtlLnByb3RvdHlwZS5zZXRUaWNrUG9zaXRpb25zPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHRpb25zLGM9YS50aWNrUG9zaXRpb25zO3ZhciBkPXRoaXMuZ2V0TWlub3JUaWNrSW50ZXJ2YWwoKTt2YXIgZz1hLnRpY2tQb3NpdGlvbmVyLGg9dGhpcy5oYXNWZXJ0aWNhbFBhbm5pbmcoKSxiPVwiY29sb3JBeGlzXCI9PT10aGlzLmNvbGwscj0oYnx8XG4haCkmJmEuc3RhcnRPblRpY2s7aD0oYnx8IWgpJiZhLmVuZE9uVGljazt0aGlzLnRpY2ttYXJrT2Zmc2V0PXRoaXMuY2F0ZWdvcmllcyYmXCJiZXR3ZWVuXCI9PT1hLnRpY2ttYXJrUGxhY2VtZW50JiYxPT09dGhpcy50aWNrSW50ZXJ2YWw/LjU6MDt0aGlzLm1pbm9yVGlja0ludGVydmFsPVwiYXV0b1wiPT09ZCYmdGhpcy50aWNrSW50ZXJ2YWw/dGhpcy50aWNrSW50ZXJ2YWwvNTpkO3RoaXMuc2luZ2xlPXRoaXMubWluPT09dGhpcy5tYXgmJmsodGhpcy5taW4pJiYhdGhpcy50aWNrQW1vdW50JiYocGFyc2VJbnQodGhpcy5taW4sMTApPT09dGhpcy5taW58fCExIT09YS5hbGxvd0RlY2ltYWxzKTt0aGlzLnRpY2tQb3NpdGlvbnM9ZD1jJiZjLnNsaWNlKCk7IWQmJih0aGlzLm9yZGluYWwmJnRoaXMub3JkaW5hbC5wb3NpdGlvbnN8fCEoKHRoaXMubWF4LXRoaXMubWluKS90aGlzLnRpY2tJbnRlcnZhbD5NYXRoLm1heCgyKnRoaXMubGVuLDIwMCkpP2Q9dGhpcy5kYXRlVGltZT90aGlzLmdldFRpbWVUaWNrcyh0aGlzLmRhdGVUaW1lLm5vcm1hbGl6ZVRpbWVUaWNrSW50ZXJ2YWwodGhpcy50aWNrSW50ZXJ2YWwsXG5hLnVuaXRzKSx0aGlzLm1pbix0aGlzLm1heCxhLnN0YXJ0T2ZXZWVrLHRoaXMub3JkaW5hbCYmdGhpcy5vcmRpbmFsLnBvc2l0aW9ucyx0aGlzLmNsb3Nlc3RQb2ludFJhbmdlLCEwKTp0aGlzLmxvZ2FyaXRobWljP3RoaXMubG9nYXJpdGhtaWMuZ2V0TG9nVGlja1Bvc2l0aW9ucyh0aGlzLnRpY2tJbnRlcnZhbCx0aGlzLm1pbix0aGlzLm1heCk6dGhpcy5nZXRMaW5lYXJUaWNrUG9zaXRpb25zKHRoaXMudGlja0ludGVydmFsLHRoaXMubWluLHRoaXMubWF4KTooZD1bdGhpcy5taW4sdGhpcy5tYXhdLHUoMTksITEsdGhpcy5jaGFydCkpLGQubGVuZ3RoPnRoaXMubGVuJiYoZD1bZFswXSxkLnBvcCgpXSxkWzBdPT09ZFsxXSYmKGQubGVuZ3RoPTEpKSx0aGlzLnRpY2tQb3NpdGlvbnM9ZCxnJiYoZz1nLmFwcGx5KHRoaXMsW3RoaXMubWluLHRoaXMubWF4XSkpKSYmKHRoaXMudGlja1Bvc2l0aW9ucz1kPWcpO3RoaXMucGFkZGVkVGlja3M9ZC5zbGljZSgwKTt0aGlzLnRyaW1UaWNrcyhkLFxucixoKTt0aGlzLmlzTGlua2VkfHwodGhpcy5zaW5nbGUmJjI+ZC5sZW5ndGgmJiF0aGlzLmNhdGVnb3JpZXMmJiF0aGlzLnNlcmllcy5zb21lKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlzKFwiaGVhdG1hcFwiKSYmXCJiZXR3ZWVuXCI9PT1hLm9wdGlvbnMucG9pbnRQbGFjZW1lbnR9KSYmKHRoaXMubWluLT0uNSx0aGlzLm1heCs9LjUpLGN8fGd8fHRoaXMuYWRqdXN0VGlja0Ftb3VudCgpKTtKKHRoaXMsXCJhZnRlclNldFRpY2tQb3NpdGlvbnNcIil9O2UucHJvdG90eXBlLnRyaW1UaWNrcz1mdW5jdGlvbihhLGMsZCl7dmFyIGc9YVswXSxoPWFbYS5sZW5ndGgtMV0sYj0hdGhpcy5pc09yZGluYWwmJnRoaXMubWluUG9pbnRPZmZzZXR8fDA7Sih0aGlzLFwidHJpbVRpY2tzXCIpO2lmKCF0aGlzLmlzTGlua2VkKXtpZihjJiYtSW5maW5pdHkhPT1nKXRoaXMubWluPWc7ZWxzZSBmb3IoO3RoaXMubWluLWI+YVswXTspYS5zaGlmdCgpO2lmKGQpdGhpcy5tYXg9aDtlbHNlIGZvcig7dGhpcy5tYXgrYjxcbmFbYS5sZW5ndGgtMV07KWEucG9wKCk7MD09PWEubGVuZ3RoJiZrKGcpJiYhdGhpcy5vcHRpb25zLnRpY2tQb3NpdGlvbnMmJmEucHVzaCgoaCtnKS8yKX19O2UucHJvdG90eXBlLmFsaWduVG9PdGhlcnM9ZnVuY3Rpb24oKXt2YXIgYT17fSxjLGQ9dGhpcy5vcHRpb25zOyExIT09dGhpcy5jaGFydC5vcHRpb25zLmNoYXJ0LmFsaWduVGlja3MmJmQuYWxpZ25UaWNrcyYmITEhPT1kLnN0YXJ0T25UaWNrJiYhMSE9PWQuZW5kT25UaWNrJiYhdGhpcy5sb2dhcml0aG1pYyYmdGhpcy5jaGFydFt0aGlzLmNvbGxdLmZvckVhY2goZnVuY3Rpb24oZCl7dmFyIGc9ZC5vcHRpb25zO2c9W2QuaG9yaXo/Zy5sZWZ0OmcudG9wLGcud2lkdGgsZy5oZWlnaHQsZy5wYW5lXS5qb2luKCk7ZC5zZXJpZXMubGVuZ3RoJiYoYVtnXT9jPSEwOmFbZ109MSl9KTtyZXR1cm4gY307ZS5wcm90b3R5cGUuZ2V0VGlja0Ftb3VudD1mdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucyxjPWEudGlja0Ftb3VudCxkPVxuYS50aWNrUGl4ZWxJbnRlcnZhbDshayhhLnRpY2tJbnRlcnZhbCkmJiFjJiZ0aGlzLmxlbjxkJiYhdGhpcy5pc1JhZGlhbCYmIXRoaXMubG9nYXJpdGhtaWMmJmEuc3RhcnRPblRpY2smJmEuZW5kT25UaWNrJiYoYz0yKTshYyYmdGhpcy5hbGlnblRvT3RoZXJzKCkmJihjPU1hdGguY2VpbCh0aGlzLmxlbi9kKSsxKTs0PmMmJih0aGlzLmZpbmFsVGlja0FtdD1jLGM9NSk7dGhpcy50aWNrQW1vdW50PWN9O2UucHJvdG90eXBlLmFkanVzdFRpY2tBbW91bnQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMsYz10aGlzLnRpY2tJbnRlcnZhbCxkPXRoaXMudGlja1Bvc2l0aW9ucyxoPXRoaXMudGlja0Ftb3VudCxiPXRoaXMuZmluYWxUaWNrQW10LHI9ZCYmZC5sZW5ndGgsZT15KHRoaXMudGhyZXNob2xkLHRoaXMuc29mdFRocmVzaG9sZD8wOm51bGwpO2lmKHRoaXMuaGFzRGF0YSgpJiZnKHRoaXMubWluKSYmZyh0aGlzLm1heCkpe2lmKHI8aCl7Zm9yKDtkLmxlbmd0aDxoOylkLmxlbmd0aCVcbjJ8fHRoaXMubWluPT09ZT9kLnB1c2gocShkW2QubGVuZ3RoLTFdK2MpKTpkLnVuc2hpZnQocShkWzBdLWMpKTt0aGlzLnRyYW5zQSo9KHItMSkvKGgtMSk7dGhpcy5taW49YS5zdGFydE9uVGljaz9kWzBdOk1hdGgubWluKHRoaXMubWluLGRbMF0pO3RoaXMubWF4PWEuZW5kT25UaWNrP2RbZC5sZW5ndGgtMV06TWF0aC5tYXgodGhpcy5tYXgsZFtkLmxlbmd0aC0xXSl9ZWxzZSByPmgmJih0aGlzLnRpY2tJbnRlcnZhbCo9Mix0aGlzLnNldFRpY2tQb3NpdGlvbnMoKSk7aWYoayhiKSl7Zm9yKGM9YT1kLmxlbmd0aDtjLS07KSgzPT09YiYmMT09PWMlMnx8Mj49YiYmMDxjJiZjPGEtMSkmJmQuc3BsaWNlKGMsMSk7dGhpcy5maW5hbFRpY2tBbXQ9dm9pZCAwfX19O2UucHJvdG90eXBlLnNldFNjYWxlPWZ1bmN0aW9uKCl7dmFyIGEsYz0hMSxkPSExO3RoaXMuc2VyaWVzLmZvckVhY2goZnVuY3Rpb24oYSl7Yz1jfHxhLmlzRGlydHlEYXRhfHxhLmlzRGlydHk7ZD1kfHxhLnhBeGlzJiZhLnhBeGlzLmlzRGlydHl8fFxuITF9KTt0aGlzLnNldEF4aXNTaXplKCk7KGE9dGhpcy5sZW4hPT0odGhpcy5vbGQmJnRoaXMub2xkLmxlbikpfHxjfHxkfHx0aGlzLmlzTGlua2VkfHx0aGlzLmZvcmNlUmVkcmF3fHx0aGlzLnVzZXJNaW4hPT0odGhpcy5vbGQmJnRoaXMub2xkLnVzZXJNaW4pfHx0aGlzLnVzZXJNYXghPT0odGhpcy5vbGQmJnRoaXMub2xkLnVzZXJNYXgpfHx0aGlzLmFsaWduVG9PdGhlcnMoKT8odGhpcy5zdGFja2luZyYmdGhpcy5zdGFja2luZy5yZXNldFN0YWNrcygpLHRoaXMuZm9yY2VSZWRyYXc9ITEsdGhpcy5nZXRTZXJpZXNFeHRyZW1lcygpLHRoaXMuc2V0VGlja0ludGVydmFsKCksdGhpcy5pc0RpcnR5fHwodGhpcy5pc0RpcnR5PWF8fHRoaXMubWluIT09KHRoaXMub2xkJiZ0aGlzLm9sZC5taW4pfHx0aGlzLm1heCE9PSh0aGlzLm9sZCYmdGhpcy5vbGQubWF4KSkpOnRoaXMuc3RhY2tpbmcmJnRoaXMuc3RhY2tpbmcuY2xlYW5TdGFja3MoKTtjJiZ0aGlzLnBhbm5pbmdTdGF0ZSYmKHRoaXMucGFubmluZ1N0YXRlLmlzRGlydHk9XG4hMCk7Sih0aGlzLFwiYWZ0ZXJTZXRTY2FsZVwiKX07ZS5wcm90b3R5cGUuc2V0RXh0cmVtZXM9ZnVuY3Rpb24oYSxjLGQsZyxoKXt2YXIgYj10aGlzLHI9Yi5jaGFydDtkPXkoZCwhMCk7Yi5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihhKXtkZWxldGUgYS5rZFRyZWV9KTtoPW4oaCx7bWluOmEsbWF4OmN9KTtKKGIsXCJzZXRFeHRyZW1lc1wiLGgsZnVuY3Rpb24oKXtiLnVzZXJNaW49YTtiLnVzZXJNYXg9YztiLmV2ZW50QXJncz1oO2QmJnIucmVkcmF3KGcpfSl9O2UucHJvdG90eXBlLnpvb209ZnVuY3Rpb24oYSxjKXt2YXIgZD10aGlzLGc9dGhpcy5kYXRhTWluLGg9dGhpcy5kYXRhTWF4LGI9dGhpcy5vcHRpb25zLHI9TWF0aC5taW4oZyx5KGIubWluLGcpKSxlPU1hdGgubWF4KGgseShiLm1heCxoKSk7YT17bmV3TWluOmEsbmV3TWF4OmN9O0oodGhpcyxcInpvb21cIixhLGZ1bmN0aW9uKGEpe3ZhciBjPWEubmV3TWluLGI9YS5uZXdNYXg7aWYoYyE9PWQubWlufHxiIT09ZC5tYXgpZC5hbGxvd1pvb21PdXRzaWRlfHxcbihrKGcpJiYoYzxyJiYoYz1yKSxjPmUmJihjPWUpKSxrKGgpJiYoYjxyJiYoYj1yKSxiPmUmJihiPWUpKSksZC5kaXNwbGF5QnRuPVwidW5kZWZpbmVkXCIhPT10eXBlb2YgY3x8XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBiLGQuc2V0RXh0cmVtZXMoYyxiLCExLHZvaWQgMCx7dHJpZ2dlcjpcInpvb21cIn0pO2Euem9vbWVkPSEwfSk7cmV0dXJuIGEuem9vbWVkfTtlLnByb3RvdHlwZS5zZXRBeGlzU2l6ZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuY2hhcnQsYz10aGlzLm9wdGlvbnMsZD1jLm9mZnNldHN8fFswLDAsMCwwXSxnPXRoaXMuaG9yaXosaD10aGlzLndpZHRoPU1hdGgucm91bmQoTCh5KGMud2lkdGgsYS5wbG90V2lkdGgtZFszXStkWzFdKSxhLnBsb3RXaWR0aCkpLGI9dGhpcy5oZWlnaHQ9TWF0aC5yb3VuZChMKHkoYy5oZWlnaHQsYS5wbG90SGVpZ2h0LWRbMF0rZFsyXSksYS5wbG90SGVpZ2h0KSkscj10aGlzLnRvcD1NYXRoLnJvdW5kKEwoeShjLnRvcCxhLnBsb3RUb3ArZFswXSksYS5wbG90SGVpZ2h0LFxuYS5wbG90VG9wKSk7Yz10aGlzLmxlZnQ9TWF0aC5yb3VuZChMKHkoYy5sZWZ0LGEucGxvdExlZnQrZFszXSksYS5wbG90V2lkdGgsYS5wbG90TGVmdCkpO3RoaXMuYm90dG9tPWEuY2hhcnRIZWlnaHQtYi1yO3RoaXMucmlnaHQ9YS5jaGFydFdpZHRoLWgtYzt0aGlzLmxlbj1NYXRoLm1heChnP2g6YiwwKTt0aGlzLnBvcz1nP2M6cn07ZS5wcm90b3R5cGUuZ2V0RXh0cmVtZXM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmxvZ2FyaXRobWljO3JldHVybnttaW46YT9xKGEubGluMmxvZyh0aGlzLm1pbikpOnRoaXMubWluLG1heDphP3EoYS5saW4ybG9nKHRoaXMubWF4KSk6dGhpcy5tYXgsZGF0YU1pbjp0aGlzLmRhdGFNaW4sZGF0YU1heDp0aGlzLmRhdGFNYXgsdXNlck1pbjp0aGlzLnVzZXJNaW4sdXNlck1heDp0aGlzLnVzZXJNYXh9fTtlLnByb3RvdHlwZS5nZXRUaHJlc2hvbGQ9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5sb2dhcml0aG1pYyxkPWM/Yy5saW4ybG9nKHRoaXMubWluKTp0aGlzLm1pbjtcbmM9Yz9jLmxpbjJsb2codGhpcy5tYXgpOnRoaXMubWF4O251bGw9PT1hfHwtSW5maW5pdHk9PT1hP2E9ZDpJbmZpbml0eT09PWE/YT1jOmQ+YT9hPWQ6YzxhJiYoYT1jKTtyZXR1cm4gdGhpcy50cmFuc2xhdGUoYSwwLDEsMCwxKX07ZS5wcm90b3R5cGUuYXV0b0xhYmVsQWxpZ249ZnVuY3Rpb24oYSl7dmFyIGM9KHkoYSwwKS05MCp0aGlzLnNpZGUrNzIwKSUzNjA7YT17YWxpZ246XCJjZW50ZXJcIn07Sih0aGlzLFwiYXV0b0xhYmVsQWxpZ25cIixhLGZ1bmN0aW9uKGEpezE1PGMmJjE2NT5jP2EuYWxpZ249XCJyaWdodFwiOjE5NTxjJiYzNDU+YyYmKGEuYWxpZ249XCJsZWZ0XCIpfSk7cmV0dXJuIGEuYWxpZ259O2UucHJvdG90eXBlLnRpY2tTaXplPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMub3B0aW9ucyxkPWNbXCJ0aWNrXCI9PT1hP1widGlja0xlbmd0aFwiOlwibWlub3JUaWNrTGVuZ3RoXCJdLGc9eShjW1widGlja1wiPT09YT9cInRpY2tXaWR0aFwiOlwibWlub3JUaWNrV2lkdGhcIl0sXCJ0aWNrXCI9PT1hJiZ0aGlzLmlzWEF4aXMmJlxuIXRoaXMuY2F0ZWdvcmllcz8xOjApO2lmKGcmJmQpe1wiaW5zaWRlXCI9PT1jW2ErXCJQb3NpdGlvblwiXSYmKGQ9LWQpO3ZhciBoPVtkLGddfWE9e3RpY2tTaXplOmh9O0oodGhpcyxcImFmdGVyVGlja1NpemVcIixhKTtyZXR1cm4gYS50aWNrU2l6ZX07ZS5wcm90b3R5cGUubGFiZWxNZXRyaWNzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50aWNrUG9zaXRpb25zJiZ0aGlzLnRpY2tQb3NpdGlvbnNbMF18fDA7cmV0dXJuIHRoaXMuY2hhcnQucmVuZGVyZXIuZm9udE1ldHJpY3ModGhpcy5vcHRpb25zLmxhYmVscy5zdHlsZS5mb250U2l6ZSx0aGlzLnRpY2tzW2FdJiZ0aGlzLnRpY2tzW2FdLmxhYmVsKX07ZS5wcm90b3R5cGUudW5zcXVpc2g9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMubGFiZWxzLGM9dGhpcy5ob3JpeixkPXRoaXMudGlja0ludGVydmFsLGg9ZCxiPXRoaXMubGVuLygoKHRoaXMuY2F0ZWdvcmllcz8xOjApK3RoaXMubWF4LXRoaXMubWluKS9kKSxyLGU9YS5yb3RhdGlvbixcbmY9dGhpcy5sYWJlbE1ldHJpY3MoKSxtLEE9TnVtYmVyLk1BWF9WQUxVRSxsPU1hdGgubWF4KHRoaXMubWF4LXRoaXMubWluLDApLG49ZnVuY3Rpb24oYSl7dmFyIGM9YS8oYnx8MSk7Yz0xPGM/TWF0aC5jZWlsKGMpOjE7YypkPmwmJkluZmluaXR5IT09YSYmSW5maW5pdHkhPT1iJiZsJiYoYz1NYXRoLmNlaWwobC9kKSk7cmV0dXJuIHEoYypkKX07aWYoYyl7aWYoIWEuc3RhZ2dlckxpbmVzJiYhYS5zdGVwKWlmKGcoZSkpdmFyIGs9W2VdO2Vsc2UgYjxhLmF1dG9Sb3RhdGlvbkxpbWl0JiYoaz1hLmF1dG9Sb3RhdGlvbik7ayYmay5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGE9PT1lfHxhJiYtOTA8PWEmJjkwPj1hKXttPW4oTWF0aC5hYnMoZi5oL01hdGguc2luKFEqYSkpKTt2YXIgYz1tK01hdGguYWJzKGEvMzYwKTtjPEEmJihBPWMscj1hLGg9bSl9fSl9ZWxzZSBhLnN0ZXB8fChoPW4oZi5oKSk7dGhpcy5hdXRvUm90YXRpb249azt0aGlzLmxhYmVsUm90YXRpb249eShyLGcoZSk/ZTpcbjApO3JldHVybiBofTtlLnByb3RvdHlwZS5nZXRTbG90V2lkdGg9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jaGFydCxkPXRoaXMuaG9yaXosaD10aGlzLm9wdGlvbnMubGFiZWxzLGI9TWF0aC5tYXgodGhpcy50aWNrUG9zaXRpb25zLmxlbmd0aC0odGhpcy5jYXRlZ29yaWVzPzA6MSksMSkscj1jLm1hcmdpblszXTtpZihhJiZnKGEuc2xvdFdpZHRoKSlyZXR1cm4gYS5zbG90V2lkdGg7aWYoZCYmMj5oLnN0ZXApcmV0dXJuIGgucm90YXRpb24/MDoodGhpcy5zdGFnZ2VyTGluZXN8fDEpKnRoaXMubGVuL2I7aWYoIWQpe2E9aC5zdHlsZS53aWR0aDtpZih2b2lkIDAhPT1hKXJldHVybiBwYXJzZUludChTdHJpbmcoYSksMTApO2lmKHIpcmV0dXJuIHItYy5zcGFjaW5nWzNdfXJldHVybi4zMypjLmNoYXJ0V2lkdGh9O2UucHJvdG90eXBlLnJlbmRlclVuc3F1aXNoPWZ1bmN0aW9uKCl7dmFyIGM9dGhpcy5jaGFydCxkPWMucmVuZGVyZXIsZz10aGlzLnRpY2tQb3NpdGlvbnMsaD10aGlzLnRpY2tzLFxuYj10aGlzLm9wdGlvbnMubGFiZWxzLHI9Yi5zdHlsZSxlPXRoaXMuaG9yaXosZj10aGlzLmdldFNsb3RXaWR0aCgpLG09TWF0aC5tYXgoMSxNYXRoLnJvdW5kKGYtMipiLnBhZGRpbmcpKSxBPXt9LHk9dGhpcy5sYWJlbE1ldHJpY3MoKSxsPXIudGV4dE92ZXJmbG93LG49MDthKGIucm90YXRpb24pfHwoQS5yb3RhdGlvbj1iLnJvdGF0aW9ufHwwKTtnLmZvckVhY2goZnVuY3Rpb24oYSl7YT1oW2FdO2EubW92ZWRMYWJlbCYmYS5yZXBsYWNlTW92ZWRMYWJlbCgpO2EmJmEubGFiZWwmJmEubGFiZWwudGV4dFB4TGVuZ3RoPm4mJihuPWEubGFiZWwudGV4dFB4TGVuZ3RoKX0pO3RoaXMubWF4TGFiZWxMZW5ndGg9bjtpZih0aGlzLmF1dG9Sb3RhdGlvbiluPm0mJm4+eS5oP0Eucm90YXRpb249dGhpcy5sYWJlbFJvdGF0aW9uOnRoaXMubGFiZWxSb3RhdGlvbj0wO2Vsc2UgaWYoZil7dmFyIGs9bTtpZighbCl7dmFyIEw9XCJjbGlwXCI7Zm9yKG09Zy5sZW5ndGg7IWUmJm0tLTspe3ZhciB1PWdbbV07XG5pZih1PWhbdV0ubGFiZWwpdS5zdHlsZXMmJlwiZWxsaXBzaXNcIj09PXUuc3R5bGVzLnRleHRPdmVyZmxvdz91LmNzcyh7dGV4dE92ZXJmbG93OlwiY2xpcFwifSk6dS50ZXh0UHhMZW5ndGg+ZiYmdS5jc3Moe3dpZHRoOmYrXCJweFwifSksdS5nZXRCQm94KCkuaGVpZ2h0PnRoaXMubGVuL2cubGVuZ3RoLSh5LmgteS5mKSYmKHUuc3BlY2lmaWNUZXh0T3ZlcmZsb3c9XCJlbGxpcHNpc1wiKX19fUEucm90YXRpb24mJihrPW4+LjUqYy5jaGFydEhlaWdodD8uMzMqYy5jaGFydEhlaWdodDpuLGx8fChMPVwiZWxsaXBzaXNcIikpO2lmKHRoaXMubGFiZWxBbGlnbj1iLmFsaWdufHx0aGlzLmF1dG9MYWJlbEFsaWduKHRoaXMubGFiZWxSb3RhdGlvbikpQS5hbGlnbj10aGlzLmxhYmVsQWxpZ247Zy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBjPShhPWhbYV0pJiZhLmxhYmVsLGQ9ci53aWR0aCxnPXt9O2MmJihjLmF0dHIoQSksYS5zaG9ydGVuTGFiZWw/YS5zaG9ydGVuTGFiZWwoKTprJiYhZCYmXCJub3dyYXBcIiE9PVxuci53aGl0ZVNwYWNlJiYoazxjLnRleHRQeExlbmd0aHx8XCJTUEFOXCI9PT1jLmVsZW1lbnQudGFnTmFtZSk/KGcud2lkdGg9aytcInB4XCIsbHx8KGcudGV4dE92ZXJmbG93PWMuc3BlY2lmaWNUZXh0T3ZlcmZsb3d8fEwpLGMuY3NzKGcpKTpjLnN0eWxlcyYmYy5zdHlsZXMud2lkdGgmJiFnLndpZHRoJiYhZCYmYy5jc3Moe3dpZHRoOm51bGx9KSxkZWxldGUgYy5zcGVjaWZpY1RleHRPdmVyZmxvdyxhLnJvdGF0aW9uPUEucm90YXRpb24pfSx0aGlzKTt0aGlzLnRpY2tSb3RDb3JyPWQucm90Q29ycih5LmIsdGhpcy5sYWJlbFJvdGF0aW9ufHwwLDAhPT10aGlzLnNpZGUpfTtlLnByb3RvdHlwZS5oYXNEYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VyaWVzLnNvbWUoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaGFzRGF0YSgpfSl8fHRoaXMub3B0aW9ucy5zaG93RW1wdHkmJmsodGhpcy5taW4pJiZrKHRoaXMubWF4KX07ZS5wcm90b3R5cGUuYWRkVGl0bGU9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jaGFydC5yZW5kZXJlcixcbmQ9dGhpcy5ob3JpeixnPXRoaXMub3Bwb3NpdGUsYj10aGlzLm9wdGlvbnMudGl0bGUscixlPXRoaXMuY2hhcnQuc3R5bGVkTW9kZTt0aGlzLmF4aXNUaXRsZXx8KChyPWIudGV4dEFsaWduKXx8KHI9KGQ/e2xvdzpcImxlZnRcIixtaWRkbGU6XCJjZW50ZXJcIixoaWdoOlwicmlnaHRcIn06e2xvdzpnP1wicmlnaHRcIjpcImxlZnRcIixtaWRkbGU6XCJjZW50ZXJcIixoaWdoOmc/XCJsZWZ0XCI6XCJyaWdodFwifSlbYi5hbGlnbl0pLHRoaXMuYXhpc1RpdGxlPWMudGV4dChiLnRleHR8fFwiXCIsMCwwLGIudXNlSFRNTCkuYXR0cih7ekluZGV4Ojcscm90YXRpb246Yi5yb3RhdGlvbixhbGlnbjpyfSkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLWF4aXMtdGl0bGVcIiksZXx8dGhpcy5heGlzVGl0bGUuY3NzKGgoYi5zdHlsZSkpLHRoaXMuYXhpc1RpdGxlLmFkZCh0aGlzLmF4aXNHcm91cCksdGhpcy5heGlzVGl0bGUuaXNOZXc9ITApO2V8fGIuc3R5bGUud2lkdGh8fHRoaXMuaXNSYWRpYWx8fHRoaXMuYXhpc1RpdGxlLmNzcyh7d2lkdGg6dGhpcy5sZW4rXG5cInB4XCJ9KTt0aGlzLmF4aXNUaXRsZVthP1wic2hvd1wiOlwiaGlkZVwiXShhKX07ZS5wcm90b3R5cGUuZ2VuZXJhdGVUaWNrPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudGlja3M7Y1thXT9jW2FdLmFkZExhYmVsKCk6Y1thXT1uZXcgRyh0aGlzLGEpfTtlLnByb3RvdHlwZS5nZXRPZmZzZXQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGM9dGhpcyxkPWMuY2hhcnQsZz1kLnJlbmRlcmVyLGg9Yy5vcHRpb25zLGI9Yy50aWNrUG9zaXRpb25zLHI9Yy50aWNrcyxlPWMuaG9yaXosZj1jLnNpZGUsbT1kLmludmVydGVkJiYhYy5pc1pBeGlzP1sxLDAsMywyXVtmXTpmLGwsbj0wLEw9MCx1PWgudGl0bGUsUD1oLmxhYmVscyxxPTAsdj1kLmF4aXNPZmZzZXQ7ZD1kLmNsaXBPZmZzZXQ7dmFyIHc9Wy0xLDEsMSwtMV1bZl0sZGE9aC5jbGFzc05hbWUsaWE9Yy5heGlzUGFyZW50O3ZhciBFPWMuaGFzRGF0YSgpO2Muc2hvd0F4aXM9bD1FfHxoLnNob3dFbXB0eTtjLnN0YWdnZXJMaW5lcz1jLmhvcml6JiZQLnN0YWdnZXJMaW5lc3x8XG52b2lkIDA7aWYoIWMuYXhpc0dyb3VwKXt2YXIgUj1mdW5jdGlvbihjLGQsaCl7cmV0dXJuIGcuZyhjKS5hdHRyKHt6SW5kZXg6aH0pLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1cIithLmNvbGwudG9Mb3dlckNhc2UoKStkK1wiIFwiKyhhLmlzUmFkaWFsP1wiaGlnaGNoYXJ0cy1yYWRpYWwtYXhpc1wiK2QrXCIgXCI6XCJcIikrKGRhfHxcIlwiKSkuYWRkKGlhKX07Yy5ncmlkR3JvdXA9UihcImdyaWRcIixcIi1ncmlkXCIsaC5ncmlkWkluZGV4KTtjLmF4aXNHcm91cD1SKFwiYXhpc1wiLFwiXCIsaC56SW5kZXgpO2MubGFiZWxHcm91cD1SKFwiYXhpcy1sYWJlbHNcIixcIi1sYWJlbHNcIixQLnpJbmRleCl9RXx8Yy5pc0xpbmtlZD8oYi5mb3JFYWNoKGZ1bmN0aW9uKGEsZCl7Yy5nZW5lcmF0ZVRpY2soYSxkKX0pLGMucmVuZGVyVW5zcXVpc2goKSxjLnJlc2VydmVTcGFjZURlZmF1bHQ9MD09PWZ8fDI9PT1mfHx7MTpcImxlZnRcIiwzOlwicmlnaHRcIn1bZl09PT1jLmxhYmVsQWxpZ24seShQLnJlc2VydmVTcGFjZSxcImNlbnRlclwiPT09XG5jLmxhYmVsQWxpZ24/ITA6bnVsbCxjLnJlc2VydmVTcGFjZURlZmF1bHQpJiZiLmZvckVhY2goZnVuY3Rpb24oYSl7cT1NYXRoLm1heChyW2FdLmdldExhYmVsU2l6ZSgpLHEpfSksYy5zdGFnZ2VyTGluZXMmJihxKj1jLnN0YWdnZXJMaW5lcyksYy5sYWJlbE9mZnNldD1xKihjLm9wcG9zaXRlPy0xOjEpKTpBKHIsZnVuY3Rpb24oYSxjKXthLmRlc3Ryb3koKTtkZWxldGUgcltjXX0pO2lmKHUmJnUudGV4dCYmITEhPT11LmVuYWJsZWQmJihjLmFkZFRpdGxlKGwpLGwmJiExIT09dS5yZXNlcnZlU3BhY2UpKXtjLnRpdGxlT2Zmc2V0PW49Yy5heGlzVGl0bGUuZ2V0QkJveCgpW2U/XCJoZWlnaHRcIjpcIndpZHRoXCJdO3ZhciBRPXUub2Zmc2V0O0w9ayhRKT8wOnkodS5tYXJnaW4sZT81OjEwKX1jLnJlbmRlckxpbmUoKTtjLm9mZnNldD13KnkoaC5vZmZzZXQsdltmXT92W2ZdKyhoLm1hcmdpbnx8MCk6MCk7Yy50aWNrUm90Q29ycj1jLnRpY2tSb3RDb3JyfHx7eDowLHk6MH07dT0wPT09Zj8tYy5sYWJlbE1ldHJpY3MoKS5oOlxuMj09PWY/Yy50aWNrUm90Q29yci55OjA7TD1NYXRoLmFicyhxKStMO3EmJihMPUwtdSt3KihlP3koUC55LGMudGlja1JvdENvcnIueSs4KncpOlAueCkpO2MuYXhpc1RpdGxlTWFyZ2luPXkoUSxMKTtjLmdldE1heExhYmVsRGltZW5zaW9ucyYmKGMubWF4TGFiZWxEaW1lbnNpb25zPWMuZ2V0TWF4TGFiZWxEaW1lbnNpb25zKHIsYikpO2U9dGhpcy50aWNrU2l6ZShcInRpY2tcIik7dltmXT1NYXRoLm1heCh2W2ZdLChjLmF4aXNUaXRsZU1hcmdpbnx8MCkrbit3KmMub2Zmc2V0LEwsYiYmYi5sZW5ndGgmJmU/ZVswXSt3KmMub2Zmc2V0OjApO2g9aC5vZmZzZXQ/MDoyKk1hdGguZmxvb3IoYy5heGlzTGluZS5zdHJva2VXaWR0aCgpLzIpO2RbbV09TWF0aC5tYXgoZFttXSxoKTtKKHRoaXMsXCJhZnRlckdldE9mZnNldFwiKX07ZS5wcm90b3R5cGUuZ2V0TGluZVBhdGg9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jaGFydCxkPXRoaXMub3Bwb3NpdGUsZz10aGlzLm9mZnNldCxoPXRoaXMuaG9yaXosXG5iPXRoaXMubGVmdCsoZD90aGlzLndpZHRoOjApK2c7Zz1jLmNoYXJ0SGVpZ2h0LXRoaXMuYm90dG9tLShkP3RoaXMuaGVpZ2h0OjApK2c7ZCYmKGEqPS0xKTtyZXR1cm4gYy5yZW5kZXJlci5jcmlzcExpbmUoW1tcIk1cIixoP3RoaXMubGVmdDpiLGg/Zzp0aGlzLnRvcF0sW1wiTFwiLGg/Yy5jaGFydFdpZHRoLXRoaXMucmlnaHQ6YixoP2c6Yy5jaGFydEhlaWdodC10aGlzLmJvdHRvbV1dLGEpfTtlLnByb3RvdHlwZS5yZW5kZXJMaW5lPWZ1bmN0aW9uKCl7dGhpcy5heGlzTGluZXx8KHRoaXMuYXhpc0xpbmU9dGhpcy5jaGFydC5yZW5kZXJlci5wYXRoKCkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLWF4aXMtbGluZVwiKS5hZGQodGhpcy5heGlzR3JvdXApLHRoaXMuY2hhcnQuc3R5bGVkTW9kZXx8dGhpcy5heGlzTGluZS5hdHRyKHtzdHJva2U6dGhpcy5vcHRpb25zLmxpbmVDb2xvcixcInN0cm9rZS13aWR0aFwiOnRoaXMub3B0aW9ucy5saW5lV2lkdGgsekluZGV4Ojd9KSl9O2UucHJvdG90eXBlLmdldFRpdGxlUG9zaXRpb249XG5mdW5jdGlvbigpe3ZhciBhPXRoaXMuaG9yaXosYz10aGlzLmxlZnQsZD10aGlzLnRvcCxnPXRoaXMubGVuLGg9dGhpcy5vcHRpb25zLnRpdGxlLGI9YT9jOmQscj10aGlzLm9wcG9zaXRlLGU9dGhpcy5vZmZzZXQsZj1oLngsbT1oLnksQT10aGlzLmF4aXNUaXRsZSx5PXRoaXMuY2hhcnQucmVuZGVyZXIuZm9udE1ldHJpY3MoaC5zdHlsZS5mb250U2l6ZSxBKTtBPU1hdGgubWF4KEEuZ2V0QkJveChudWxsLDApLmhlaWdodC15LmgtMSwwKTtnPXtsb3c6YisoYT8wOmcpLG1pZGRsZTpiK2cvMixoaWdoOmIrKGE/ZzowKX1baC5hbGlnbl07Yz0oYT9kK3RoaXMuaGVpZ2h0OmMpKyhhPzE6LTEpKihyPy0xOjEpKnRoaXMuYXhpc1RpdGxlTWFyZ2luK1stQSxBLHkuZiwtQV1bdGhpcy5zaWRlXTthPXt4OmE/ZytmOmMrKHI/dGhpcy53aWR0aDowKStlK2YseTphP2MrbS0ocj90aGlzLmhlaWdodDowKStlOmcrbX07Sih0aGlzLFwiYWZ0ZXJHZXRUaXRsZVBvc2l0aW9uXCIse3RpdGxlUG9zaXRpb246YX0pO1xucmV0dXJuIGF9O2UucHJvdG90eXBlLnJlbmRlck1pbm9yVGljaz1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmNoYXJ0Lmhhc1JlbmRlcmVkJiZ0aGlzLm9sZCxkPXRoaXMubWlub3JUaWNrcztkW2FdfHwoZFthXT1uZXcgRyh0aGlzLGEsXCJtaW5vclwiKSk7YyYmZFthXS5pc05ldyYmZFthXS5yZW5kZXIobnVsbCwhMCk7ZFthXS5yZW5kZXIobnVsbCwhMSwxKX07ZS5wcm90b3R5cGUucmVuZGVyVGljaz1mdW5jdGlvbihhLGMpe3ZhciBkPXRoaXMudGlja3MsZz10aGlzLmNoYXJ0Lmhhc1JlbmRlcmVkJiZ0aGlzLm9sZDtpZighdGhpcy5pc0xpbmtlZHx8YT49dGhpcy5taW4mJmE8PXRoaXMubWF4fHx0aGlzLmdyaWQmJnRoaXMuZ3JpZC5pc0NvbHVtbilkW2FdfHwoZFthXT1uZXcgRyh0aGlzLGEpKSxnJiZkW2FdLmlzTmV3JiZkW2FdLnJlbmRlcihjLCEwLC0xKSxkW2FdLnJlbmRlcihjKX07ZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPWEuY2hhcnQsZD1hLmxvZ2FyaXRobWljLFxuaD1hLm9wdGlvbnMsYj1hLmlzTGlua2VkLHI9YS50aWNrUG9zaXRpb25zLGU9YS5heGlzVGl0bGUsZj1hLnRpY2tzLG09YS5taW5vclRpY2tzLHk9YS5hbHRlcm5hdGVCYW5kcyxsPWguc3RhY2tMYWJlbHMsbj1oLmFsdGVybmF0ZUdyaWRDb2xvcixrPWEudGlja21hcmtPZmZzZXQsTD1hLmF4aXNMaW5lLHU9YS5zaG93QXhpcyxxPUIoYy5yZW5kZXJlci5nbG9iYWxBbmltYXRpb24pLFAsdjthLmxhYmVsRWRnZS5sZW5ndGg9MDthLm92ZXJsYXA9ITE7W2YsbSx5XS5mb3JFYWNoKGZ1bmN0aW9uKGEpe0EoYSxmdW5jdGlvbihhKXthLmlzQWN0aXZlPSExfSl9KTtpZihhLmhhc0RhdGEoKXx8YilhLm1pbm9yVGlja0ludGVydmFsJiYhYS5jYXRlZ29yaWVzJiZhLmdldE1pbm9yVGlja1Bvc2l0aW9ucygpLmZvckVhY2goZnVuY3Rpb24oYyl7YS5yZW5kZXJNaW5vclRpY2soYyl9KSxyLmxlbmd0aCYmKHIuZm9yRWFjaChmdW5jdGlvbihjLGQpe2EucmVuZGVyVGljayhjLGQpfSksayYmKDA9PT1cbmEubWlufHxhLnNpbmdsZSkmJihmWy0xXXx8KGZbLTFdPW5ldyBHKGEsLTEsbnVsbCwhMCkpLGZbLTFdLnJlbmRlcigtMSkpKSxuJiZyLmZvckVhY2goZnVuY3Rpb24oZyxoKXt2PVwidW5kZWZpbmVkXCIhPT10eXBlb2YgcltoKzFdP3JbaCsxXStrOmEubWF4LWs7MD09PWglMiYmZzxhLm1heCYmdjw9YS5tYXgrKGMucG9sYXI/LWs6aykmJih5W2ddfHwoeVtnXT1uZXcgSS5QbG90TGluZU9yQmFuZChhKSksUD1nK2sseVtnXS5vcHRpb25zPXtmcm9tOmQ/ZC5saW4ybG9nKFApOlAsdG86ZD9kLmxpbjJsb2codik6dixjb2xvcjpuLGNsYXNzTmFtZTpcImhpZ2hjaGFydHMtYWx0ZXJuYXRlLWdyaWRcIn0seVtnXS5yZW5kZXIoKSx5W2ddLmlzQWN0aXZlPSEwKX0pLGEuX2FkZGVkUGxvdExCfHwoYS5fYWRkZWRQbG90TEI9ITAsKGgucGxvdExpbmVzfHxbXSkuY29uY2F0KGgucGxvdEJhbmRzfHxbXSkuZm9yRWFjaChmdW5jdGlvbihjKXthLmFkZFBsb3RCYW5kT3JMaW5lKGMpfSkpO1tmLG0seV0uZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZCxcbmc9W10saD1xLmR1cmF0aW9uO0EoYSxmdW5jdGlvbihhLGMpe2EuaXNBY3RpdmV8fChhLnJlbmRlcihjLCExLDApLGEuaXNBY3RpdmU9ITEsZy5wdXNoKGMpKX0pO1YoZnVuY3Rpb24oKXtmb3IoZD1nLmxlbmd0aDtkLS07KWFbZ1tkXV0mJiFhW2dbZF1dLmlzQWN0aXZlJiYoYVtnW2RdXS5kZXN0cm95KCksZGVsZXRlIGFbZ1tkXV0pfSxhIT09eSYmYy5oYXNSZW5kZXJlZCYmaD9oOjApfSk7TCYmKExbTC5pc1BsYWNlZD9cImFuaW1hdGVcIjpcImF0dHJcIl0oe2Q6dGhpcy5nZXRMaW5lUGF0aChMLnN0cm9rZVdpZHRoKCkpfSksTC5pc1BsYWNlZD0hMCxMW3U/XCJzaG93XCI6XCJoaWRlXCJdKHUpKTtlJiZ1JiYoaD1hLmdldFRpdGxlUG9zaXRpb24oKSxnKGgueSk/KGVbZS5pc05ldz9cImF0dHJcIjpcImFuaW1hdGVcIl0oaCksZS5pc05ldz0hMSk6KGUuYXR0cihcInlcIiwtOTk5OSksZS5pc05ldz0hMCkpO2wmJmwuZW5hYmxlZCYmYS5zdGFja2luZyYmYS5zdGFja2luZy5yZW5kZXJTdGFja1RvdGFscygpO1xuYS5vbGQ9e2xlbjphLmxlbixtYXg6YS5tYXgsbWluOmEubWluLHRyYW5zQTphLnRyYW5zQSx1c2VyTWF4OmEudXNlck1heCx1c2VyTWluOmEudXNlck1pbn07YS5pc0RpcnR5PSExO0oodGhpcyxcImFmdGVyUmVuZGVyXCIpfTtlLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXt0aGlzLnZpc2libGUmJih0aGlzLnJlbmRlcigpLHRoaXMucGxvdExpbmVzQW5kQmFuZHMuZm9yRWFjaChmdW5jdGlvbihhKXthLnJlbmRlcigpfSkpO3RoaXMuc2VyaWVzLmZvckVhY2goZnVuY3Rpb24oYSl7YS5pc0RpcnR5PSEwfSl9O2UucHJvdG90eXBlLmdldEtlZXBQcm9wcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmtlZXBQcm9wc3x8ZS5rZWVwUHJvcHN9O2UucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxkPWMucGxvdExpbmVzQW5kQmFuZHMsZztKKHRoaXMsXCJkZXN0cm95XCIse2tlZXBFdmVudHM6YX0pO2F8fFAoYyk7W2MudGlja3MsYy5taW5vclRpY2tzLGMuYWx0ZXJuYXRlQmFuZHNdLmZvckVhY2goZnVuY3Rpb24oYSl7bChhKX0pO1xuaWYoZClmb3IoYT1kLmxlbmd0aDthLS07KWRbYV0uZGVzdHJveSgpO1wiYXhpc0xpbmUgYXhpc1RpdGxlIGF4aXNHcm91cCBncmlkR3JvdXAgbGFiZWxHcm91cCBjcm9zcyBzY3JvbGxiYXJcIi5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihhKXtjW2FdJiYoY1thXT1jW2FdLmRlc3Ryb3koKSl9KTtmb3IoZyBpbiBjLnBsb3RMaW5lc0FuZEJhbmRzR3JvdXBzKWMucGxvdExpbmVzQW5kQmFuZHNHcm91cHNbZ109Yy5wbG90TGluZXNBbmRCYW5kc0dyb3Vwc1tnXS5kZXN0cm95KCk7QShjLGZ1bmN0aW9uKGEsZCl7LTE9PT1jLmdldEtlZXBQcm9wcygpLmluZGV4T2YoZCkmJmRlbGV0ZSBjW2RdfSl9O2UucHJvdG90eXBlLmRyYXdDcm9zc2hhaXI9ZnVuY3Rpb24oYSxjKXt2YXIgZD10aGlzLmNyb3NzaGFpcixnPXkoZCYmZC5zbmFwLCEwKSxoLHI9dGhpcy5jcm9zcyxlPXRoaXMuY2hhcnQ7Sih0aGlzLFwiZHJhd0Nyb3NzaGFpclwiLHtlOmEscG9pbnQ6Y30pO2F8fChhPXRoaXMuY3Jvc3MmJlxudGhpcy5jcm9zcy5lKTtpZihkJiYhMSE9PShrKGMpfHwhZykpe2c/ayhjKSYmKGg9eShcImNvbG9yQXhpc1wiIT09dGhpcy5jb2xsP2MuY3Jvc3NoYWlyUG9zOm51bGwsdGhpcy5pc1hBeGlzP2MucGxvdFg6dGhpcy5sZW4tYy5wbG90WSkpOmg9YSYmKHRoaXMuaG9yaXo/YS5jaGFydFgtdGhpcy5wb3M6dGhpcy5sZW4tYS5jaGFydFkrdGhpcy5wb3MpO2lmKGsoaCkpe3ZhciBmPXt2YWx1ZTpjJiYodGhpcy5pc1hBeGlzP2MueDp5KGMuc3RhY2tZLGMueSkpLHRyYW5zbGF0ZWRWYWx1ZTpofTtlLnBvbGFyJiZuKGYse2lzQ3Jvc3NoYWlyOiEwLGNoYXJ0WDphJiZhLmNoYXJ0WCxjaGFydFk6YSYmYS5jaGFydFkscG9pbnQ6Y30pO2Y9dGhpcy5nZXRQbG90TGluZVBhdGgoZil8fG51bGx9aWYoIWsoZikpe3RoaXMuaGlkZUNyb3NzaGFpcigpO3JldHVybn1nPXRoaXMuY2F0ZWdvcmllcyYmIXRoaXMuaXNSYWRpYWw7cnx8KHRoaXMuY3Jvc3M9cj1lLnJlbmRlcmVyLnBhdGgoKS5hZGRDbGFzcyhcImhpZ2hjaGFydHMtY3Jvc3NoYWlyIGhpZ2hjaGFydHMtY3Jvc3NoYWlyLVwiK1xuKGc/XCJjYXRlZ29yeSBcIjpcInRoaW4gXCIpKyhkLmNsYXNzTmFtZXx8XCJcIikpLmF0dHIoe3pJbmRleDp5KGQuekluZGV4LDIpfSkuYWRkKCksZS5zdHlsZWRNb2RlfHwoci5hdHRyKHtzdHJva2U6ZC5jb2xvcnx8KGc/Yi5wYXJzZSh6LmhpZ2hsaWdodENvbG9yMjApLnNldE9wYWNpdHkoLjI1KS5nZXQoKTp6Lm5ldXRyYWxDb2xvcjIwKSxcInN0cm9rZS13aWR0aFwiOnkoZC53aWR0aCwxKX0pLmNzcyh7XCJwb2ludGVyLWV2ZW50c1wiOlwibm9uZVwifSksZC5kYXNoU3R5bGUmJnIuYXR0cih7ZGFzaHN0eWxlOmQuZGFzaFN0eWxlfSkpKTtyLnNob3coKS5hdHRyKHtkOmZ9KTtnJiYhZC53aWR0aCYmci5hdHRyKHtcInN0cm9rZS13aWR0aFwiOnRoaXMudHJhbnNBfSk7dGhpcy5jcm9zcy5lPWF9ZWxzZSB0aGlzLmhpZGVDcm9zc2hhaXIoKTtKKHRoaXMsXCJhZnRlckRyYXdDcm9zc2hhaXJcIix7ZTphLHBvaW50OmN9KX07ZS5wcm90b3R5cGUuaGlkZUNyb3NzaGFpcj1mdW5jdGlvbigpe3RoaXMuY3Jvc3MmJlxudGhpcy5jcm9zcy5oaWRlKCk7Sih0aGlzLFwiYWZ0ZXJIaWRlQ3Jvc3NoYWlyXCIpfTtlLnByb3RvdHlwZS5oYXNWZXJ0aWNhbFBhbm5pbmc9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNoYXJ0Lm9wdGlvbnMuY2hhcnQucGFubmluZztyZXR1cm4hIShhJiZhLmVuYWJsZWQmJi95Ly50ZXN0KGEudHlwZSkpfTtlLnByb3RvdHlwZS52YWxpZGF0ZVBvc2l0aXZlVmFsdWU9ZnVuY3Rpb24oYSl7cmV0dXJuIGcoYSkmJjA8YX07ZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9dGhpcy5jaGFydCxnPWEmJmEuZXZlbnRzfHx7fTthPWgodGhpcy51c2VyT3B0aW9ucyxhKTtBKGQub3B0aW9uc1t0aGlzLmNvbGxdLmV2ZW50cyxmdW5jdGlvbihhLGMpe1widW5kZWZpbmVkXCI9PT10eXBlb2YgZ1tjXSYmKGdbY109dm9pZCAwKX0pO3RoaXMuZGVzdHJveSghMCk7dGhpcy5pbml0KGQsbihhLHtldmVudHM6Z30pKTtkLmlzRGlydHlCb3g9ITA7eShjLCEwKSYmZC5yZWRyYXcoKX07ZS5wcm90b3R5cGUucmVtb3ZlPVxuZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXRoaXMuY2hhcnQsZD10aGlzLmNvbGwsZz10aGlzLnNlcmllcyxoPWcubGVuZ3RoO2gtLTspZ1toXSYmZ1toXS5yZW1vdmUoITEpO04oYy5heGVzLHRoaXMpO04oY1tkXSx0aGlzKTtjW2RdLmZvckVhY2goZnVuY3Rpb24oYSxjKXthLm9wdGlvbnMuaW5kZXg9YS51c2VyT3B0aW9ucy5pbmRleD1jfSk7dGhpcy5kZXN0cm95KCk7Yy5pc0RpcnR5Qm94PSEwO3koYSwhMCkmJmMucmVkcmF3KCl9O2UucHJvdG90eXBlLnNldFRpdGxlPWZ1bmN0aW9uKGEsYyl7dGhpcy51cGRhdGUoe3RpdGxlOmF9LGMpfTtlLnByb3RvdHlwZS5zZXRDYXRlZ29yaWVzPWZ1bmN0aW9uKGEsYyl7dGhpcy51cGRhdGUoe2NhdGVnb3JpZXM6YX0sYyl9O2UuZGVmYXVsdE9wdGlvbnM9e2FsaWduVGlja3M6ITAsYWxsb3dEZWNpbWFsczp2b2lkIDAsekluZGV4OjIsem9vbUVuYWJsZWQ6ITAsZGF0ZVRpbWVMYWJlbEZvcm1hdHM6e21pbGxpc2Vjb25kOnttYWluOlwiJUg6JU06JVMuJUxcIixcbnJhbmdlOiExfSxzZWNvbmQ6e21haW46XCIlSDolTTolU1wiLHJhbmdlOiExfSxtaW51dGU6e21haW46XCIlSDolTVwiLHJhbmdlOiExfSxob3VyOnttYWluOlwiJUg6JU1cIixyYW5nZTohMX0sZGF5OnttYWluOlwiJWUuICViXCJ9LHdlZWs6e21haW46XCIlZS4gJWJcIn0sbW9udGg6e21haW46XCIlYiAnJXlcIn0seWVhcjp7bWFpbjpcIiVZXCJ9fSxlbmRPblRpY2s6ITEsZ3JpZExpbmVEYXNoU3R5bGU6XCJTb2xpZFwiLGdyaWRaSW5kZXg6MSxsYWJlbHM6e2F1dG9Sb3RhdGlvbjp2b2lkIDAsYXV0b1JvdGF0aW9uTGltaXQ6ODAsZGlzdGFuY2U6dm9pZCAwLGVuYWJsZWQ6ITAsaW5kZW50YXRpb246MTAsb3ZlcmZsb3c6XCJqdXN0aWZ5XCIscGFkZGluZzo1LHJlc2VydmVTcGFjZTp2b2lkIDAscm90YXRpb246dm9pZCAwLHN0YWdnZXJMaW5lczowLHN0ZXA6MCx1c2VIVE1MOiExLHg6MCx6SW5kZXg6NyxzdHlsZTp7Y29sb3I6ei5uZXV0cmFsQ29sb3I2MCxjdXJzb3I6XCJkZWZhdWx0XCIsZm9udFNpemU6XCIxMXB4XCJ9fSxcbm1heFBhZGRpbmc6LjAxLG1pbm9yR3JpZExpbmVEYXNoU3R5bGU6XCJTb2xpZFwiLG1pbm9yVGlja0xlbmd0aDoyLG1pbm9yVGlja1Bvc2l0aW9uOlwib3V0c2lkZVwiLG1pblBhZGRpbmc6LjAxLG9mZnNldDp2b2lkIDAsb3Bwb3NpdGU6ITEscmV2ZXJzZWQ6dm9pZCAwLHJldmVyc2VkU3RhY2tzOiExLHNob3dFbXB0eTohMCxzaG93Rmlyc3RMYWJlbDohMCxzaG93TGFzdExhYmVsOiEwLHN0YXJ0T2ZXZWVrOjEsc3RhcnRPblRpY2s6ITEsdGlja0xlbmd0aDoxMCx0aWNrUGl4ZWxJbnRlcnZhbDoxMDAsdGlja21hcmtQbGFjZW1lbnQ6XCJiZXR3ZWVuXCIsdGlja1Bvc2l0aW9uOlwib3V0c2lkZVwiLHRpdGxlOnthbGlnbjpcIm1pZGRsZVwiLHJvdGF0aW9uOjAsdXNlSFRNTDohMSx4OjAseTowLHN0eWxlOntjb2xvcjp6Lm5ldXRyYWxDb2xvcjYwfX0sdHlwZTpcImxpbmVhclwiLHVuaXF1ZU5hbWVzOiEwLHZpc2libGU6ITAsbWlub3JHcmlkTGluZUNvbG9yOnoubmV1dHJhbENvbG9yNSxtaW5vckdyaWRMaW5lV2lkdGg6MSxcbm1pbm9yVGlja0NvbG9yOnoubmV1dHJhbENvbG9yNDAsbGluZUNvbG9yOnouaGlnaGxpZ2h0Q29sb3IyMCxsaW5lV2lkdGg6MSxncmlkTGluZUNvbG9yOnoubmV1dHJhbENvbG9yMTAsZ3JpZExpbmVXaWR0aDp2b2lkIDAsdGlja0NvbG9yOnouaGlnaGxpZ2h0Q29sb3IyMH07ZS5kZWZhdWx0WUF4aXNPcHRpb25zPXtyZXZlcnNlZFN0YWNrczohMCxlbmRPblRpY2s6ITAsbWF4UGFkZGluZzouMDUsbWluUGFkZGluZzouMDUsdGlja1BpeGVsSW50ZXJ2YWw6NzIsc2hvd0xhc3RMYWJlbDohMCxsYWJlbHM6e3g6LTh9LHN0YXJ0T25UaWNrOiEwLHRpdGxlOntyb3RhdGlvbjoyNzAsdGV4dDpcIlZhbHVlc1wifSxzdGFja0xhYmVsczp7YW5pbWF0aW9uOnt9LGFsbG93T3ZlcmxhcDohMSxlbmFibGVkOiExLGNyb3A6ITAsb3ZlcmZsb3c6XCJqdXN0aWZ5XCIsZm9ybWF0dGVyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5heGlzLmNoYXJ0Lm51bWJlckZvcm1hdHRlcjtyZXR1cm4gYSh0aGlzLnRvdGFsLC0xKX0sXG5zdHlsZTp7Y29sb3I6ei5uZXV0cmFsQ29sb3IxMDAsZm9udFNpemU6XCIxMXB4XCIsZm9udFdlaWdodDpcImJvbGRcIix0ZXh0T3V0bGluZTpcIjFweCBjb250cmFzdFwifX0sZ3JpZExpbmVXaWR0aDoxLGxpbmVXaWR0aDowfTtlLmRlZmF1bHRMZWZ0QXhpc09wdGlvbnM9e2xhYmVsczp7eDotMTV9LHRpdGxlOntyb3RhdGlvbjoyNzB9fTtlLmRlZmF1bHRSaWdodEF4aXNPcHRpb25zPXtsYWJlbHM6e3g6MTV9LHRpdGxlOntyb3RhdGlvbjo5MH19O2UuZGVmYXVsdEJvdHRvbUF4aXNPcHRpb25zPXtsYWJlbHM6e2F1dG9Sb3RhdGlvbjpbLTQ1XSx4OjB9LG1hcmdpbjoxNSx0aXRsZTp7cm90YXRpb246MH19O2UuZGVmYXVsdFRvcEF4aXNPcHRpb25zPXtsYWJlbHM6e2F1dG9Sb3RhdGlvbjpbLTQ1XSx4OjB9LG1hcmdpbjoxNSx0aXRsZTp7cm90YXRpb246MH19O2Uua2VlcFByb3BzPVwiZXh0S2V5IGhjRXZlbnRzIG5hbWVzIHNlcmllcyB1c2VyTWF4IHVzZXJNaW5cIi5zcGxpdChcIiBcIik7cmV0dXJuIGV9KCk7XG5JLkF4aXM9ZTtyZXR1cm4gSS5BeGlzfSk7TyhlLFwiQ29yZS9BeGlzL0RhdGVUaW1lQXhpcy5qc1wiLFtlW1wiQ29yZS9BeGlzL0F4aXMuanNcIl0sZVtcIkNvcmUvVXRpbGl0aWVzLmpzXCJdXSxmdW5jdGlvbihlLGIpe3ZhciBEPWIuYWRkRXZlbnQsej1iLmdldE1hZ25pdHVkZSxIPWIubm9ybWFsaXplVGlja0ludGVydmFsLEc9Yi50aW1lVW5pdHMsQz1mdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7dGhpcy5heGlzPWJ9Yi5wcm90b3R5cGUubm9ybWFsaXplVGltZVRpY2tJbnRlcnZhbD1mdW5jdGlvbihiLGUpe3ZhciB2PWV8fFtbXCJtaWxsaXNlY29uZFwiLFsxLDIsNSwxMCwyMCwyNSw1MCwxMDAsMjAwLDUwMF1dLFtcInNlY29uZFwiLFsxLDIsNSwxMCwxNSwzMF1dLFtcIm1pbnV0ZVwiLFsxLDIsNSwxMCwxNSwzMF1dLFtcImhvdXJcIixbMSwyLDMsNCw2LDgsMTJdXSxbXCJkYXlcIixbMSwyXV0sW1wid2Vla1wiLFsxLDJdXSxbXCJtb250aFwiLFsxLDIsMyw0LDZdXSxbXCJ5ZWFyXCIsbnVsbF1dO2U9dlt2Lmxlbmd0aC1cbjFdO3ZhciBmPUdbZVswXV0sZD1lWzFdLHE7Zm9yKHE9MDtxPHYubGVuZ3RoJiYhKGU9dltxXSxmPUdbZVswXV0sZD1lWzFdLHZbcSsxXSYmYjw9KGYqZFtkLmxlbmd0aC0xXStHW3ZbcSsxXVswXV0pLzIpO3ErKyk7Zj09PUcueWVhciYmYjw1KmYmJihkPVsxLDIsNV0pO2I9SChiL2YsZCxcInllYXJcIj09PWVbMF0/TWF0aC5tYXgoeihiL2YpLDEpOjEpO3JldHVybnt1bml0UmFuZ2U6Zixjb3VudDpiLHVuaXROYW1lOmVbMF19fTtyZXR1cm4gYn0oKTtiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe31iLmNvbXBvc2U9ZnVuY3Rpb24oYil7Yi5rZWVwUHJvcHMucHVzaChcImRhdGVUaW1lXCIpO2IucHJvdG90eXBlLmdldFRpbWVUaWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNoYXJ0LnRpbWUuZ2V0VGltZVRpY2tzLmFwcGx5KHRoaXMuY2hhcnQudGltZSxhcmd1bWVudHMpfTtEKGIsXCJpbml0XCIsZnVuY3Rpb24oYil7XCJkYXRldGltZVwiIT09Yi51c2VyT3B0aW9ucy50eXBlP3RoaXMuZGF0ZVRpbWU9XG52b2lkIDA6dGhpcy5kYXRlVGltZXx8KHRoaXMuZGF0ZVRpbWU9bmV3IEModGhpcykpfSl9O2IuQWRkaXRpb25zQ2xhc3M9QztyZXR1cm4gYn0oKTtiLmNvbXBvc2UoZSk7cmV0dXJuIGJ9KTtPKGUsXCJDb3JlL0F4aXMvTG9nYXJpdGhtaWNBeGlzLmpzXCIsW2VbXCJDb3JlL0F4aXMvQXhpcy5qc1wiXSxlW1wiQ29yZS9VdGlsaXRpZXMuanNcIl1dLGZ1bmN0aW9uKGUsYil7dmFyIEQ9Yi5hZGRFdmVudCx6PWIuZ2V0TWFnbml0dWRlLEg9Yi5ub3JtYWxpemVUaWNrSW50ZXJ2YWwsRz1iLnBpY2ssQz1mdW5jdGlvbigpe2Z1bmN0aW9uIGIoYil7dGhpcy5heGlzPWJ9Yi5wcm90b3R5cGUuZ2V0TG9nVGlja1Bvc2l0aW9ucz1mdW5jdGlvbihiLGUsdixmKXt2YXIgZD10aGlzLmF4aXMscT1kLmxlbixrPWQub3B0aW9ucyxsPVtdO2Z8fCh0aGlzLm1pbm9yQXV0b0ludGVydmFsPXZvaWQgMCk7aWYoLjU8PWIpYj1NYXRoLnJvdW5kKGIpLGw9ZC5nZXRMaW5lYXJUaWNrUG9zaXRpb25zKGIsZSx2KTtlbHNlIGlmKC4wODw9XG5iKXt2YXIgdz1NYXRoLmZsb29yKGUpLHUsbj1rPXZvaWQgMDtmb3IocT0uMzxiP1sxLDIsNF06LjE1PGI/WzEsMiw0LDYsOF06WzEsMiwzLDQsNSw2LDcsOCw5XTt3PHYrMSYmIW47dysrKXt2YXIgSj1xLmxlbmd0aDtmb3IodT0wO3U8SiYmIW47dSsrKXt2YXIgRT10aGlzLmxvZzJsaW4odGhpcy5saW4ybG9nKHcpKnFbdV0pO0U+ZSYmKCFmfHxrPD12KSYmXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBrJiZsLnB1c2goayk7az52JiYobj0hMCk7az1FfX19ZWxzZSBlPXRoaXMubGluMmxvZyhlKSx2PXRoaXMubGluMmxvZyh2KSxiPWY/ZC5nZXRNaW5vclRpY2tJbnRlcnZhbCgpOmsudGlja0ludGVydmFsLGI9RyhcImF1dG9cIj09PWI/bnVsbDpiLHRoaXMubWlub3JBdXRvSW50ZXJ2YWwsay50aWNrUGl4ZWxJbnRlcnZhbC8oZj81OjEpKih2LWUpLygoZj9xL2QudGlja1Bvc2l0aW9ucy5sZW5ndGg6cSl8fDEpKSxiPUgoYix2b2lkIDAseihiKSksbD1kLmdldExpbmVhclRpY2tQb3NpdGlvbnMoYixcbmUsdikubWFwKHRoaXMubG9nMmxpbiksZnx8KHRoaXMubWlub3JBdXRvSW50ZXJ2YWw9Yi81KTtmfHwoZC50aWNrSW50ZXJ2YWw9Yik7cmV0dXJuIGx9O2IucHJvdG90eXBlLmxpbjJsb2c9ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucG93KDEwLGIpfTtiLnByb3RvdHlwZS5sb2cybGluPWZ1bmN0aW9uKGIpe3JldHVybiBNYXRoLmxvZyhiKS9NYXRoLkxOMTB9O3JldHVybiBifSgpO2I9ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7fWIuY29tcG9zZT1mdW5jdGlvbihiKXtiLmtlZXBQcm9wcy5wdXNoKFwibG9nYXJpdGhtaWNcIik7RChiLFwiaW5pdFwiLGZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMubG9nYXJpdGhtaWM7XCJsb2dhcml0aG1pY1wiIT09Yi51c2VyT3B0aW9ucy50eXBlP3RoaXMubG9nYXJpdGhtaWM9dm9pZCAwOmV8fCh0aGlzLmxvZ2FyaXRobWljPW5ldyBDKHRoaXMpKX0pO0QoYixcImFmdGVySW5pdFwiLGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5sb2dhcml0aG1pYztiJiYodGhpcy5saW4ydmFsPVxuZnVuY3Rpb24oZSl7cmV0dXJuIGIubGluMmxvZyhlKX0sdGhpcy52YWwybGluPWZ1bmN0aW9uKGUpe3JldHVybiBiLmxvZzJsaW4oZSl9KX0pfTtyZXR1cm4gYn0oKTtiLmNvbXBvc2UoZSk7cmV0dXJuIGJ9KTtPKGUsXCJDb3JlL0F4aXMvUGxvdExpbmVPckJhbmQuanNcIixbZVtcIkNvcmUvQXhpcy9BeGlzLmpzXCJdLGVbXCJDb3JlL0dsb2JhbHMuanNcIl0sZVtcIkNvcmUvQ29sb3IvUGFsZXR0ZS5qc1wiXSxlW1wiQ29yZS9VdGlsaXRpZXMuanNcIl1dLGZ1bmN0aW9uKGUsYixJLHope3ZhciBEPXouYXJyYXlNYXgsRz16LmFycmF5TWluLEM9ei5kZWZpbmVkLEI9ei5kZXN0cm95T2JqZWN0UHJvcGVydGllcyx4PXouZXJhc2Usdz16LmV4dGVuZCx2PXouZmlyZUV2ZW50LGY9ei5pc051bWJlcixkPXoubWVyZ2UscT16Lm9iamVjdEVhY2gsaz16LnBpY2s7ej1mdW5jdGlvbigpe2Z1bmN0aW9uIGIoZCxiKXt0aGlzLmF4aXM9ZDtiJiYodGhpcy5vcHRpb25zPWIsdGhpcy5pZD1iLmlkKX1iLnByb3RvdHlwZS5yZW5kZXI9XG5mdW5jdGlvbigpe3YodGhpcyxcInJlbmRlclwiKTt2YXIgYj10aGlzLGU9Yi5heGlzLGY9ZS5ob3JpeixsPWUubG9nYXJpdGhtaWMsRT1iLm9wdGlvbnMsbT1FLmxhYmVsLGM9Yi5sYWJlbCxnPUUudG8sYT1FLmZyb20saD1FLnZhbHVlLHI9QyhhKSYmQyhnKSxBPUMoaCkseT1iLnN2Z0VsZW0sTD0heSxQPVtdLFI9RS5jb2xvcix3PWsoRS56SW5kZXgsMCksUT1FLmV2ZW50cztQPXtcImNsYXNzXCI6XCJoaWdoY2hhcnRzLXBsb3QtXCIrKHI/XCJiYW5kIFwiOlwibGluZSBcIikrKEUuY2xhc3NOYW1lfHxcIlwiKX07dmFyIE09e30sdD1lLmNoYXJ0LnJlbmRlcmVyLHA9cj9cImJhbmRzXCI6XCJsaW5lc1wiO2wmJihhPWwubG9nMmxpbihhKSxnPWwubG9nMmxpbihnKSxoPWwubG9nMmxpbihoKSk7ZS5jaGFydC5zdHlsZWRNb2RlfHwoQT8oUC5zdHJva2U9Unx8SS5uZXV0cmFsQ29sb3I0MCxQW1wic3Ryb2tlLXdpZHRoXCJdPWsoRS53aWR0aCwxKSxFLmRhc2hTdHlsZSYmKFAuZGFzaHN0eWxlPUUuZGFzaFN0eWxlKSk6XG5yJiYoUC5maWxsPVJ8fEkuaGlnaGxpZ2h0Q29sb3IxMCxFLmJvcmRlcldpZHRoJiYoUC5zdHJva2U9RS5ib3JkZXJDb2xvcixQW1wic3Ryb2tlLXdpZHRoXCJdPUUuYm9yZGVyV2lkdGgpKSk7TS56SW5kZXg9dztwKz1cIi1cIit3OyhsPWUucGxvdExpbmVzQW5kQmFuZHNHcm91cHNbcF0pfHwoZS5wbG90TGluZXNBbmRCYW5kc0dyb3Vwc1twXT1sPXQuZyhcInBsb3QtXCIrcCkuYXR0cihNKS5hZGQoKSk7TCYmKGIuc3ZnRWxlbT15PXQucGF0aCgpLmF0dHIoUCkuYWRkKGwpKTtpZihBKVA9ZS5nZXRQbG90TGluZVBhdGgoe3ZhbHVlOmgsbGluZVdpZHRoOnkuc3Ryb2tlV2lkdGgoKSxhY3Jvc3NQYW5lczpFLmFjcm9zc1BhbmVzfSk7ZWxzZSBpZihyKVA9ZS5nZXRQbG90QmFuZFBhdGgoYSxnLEUpO2Vsc2UgcmV0dXJuOyFiLmV2ZW50c0FkZGVkJiZRJiYocShRLGZ1bmN0aW9uKGEsYyl7eS5vbihjLGZ1bmN0aW9uKGEpe1FbY10uYXBwbHkoYixbYV0pfSl9KSxiLmV2ZW50c0FkZGVkPSEwKTsoTHx8XG4heS5kKSYmUCYmUC5sZW5ndGg/eS5hdHRyKHtkOlB9KTp5JiYoUD8oeS5zaG93KCEwKSx5LmFuaW1hdGUoe2Q6UH0pKTp5LmQmJih5LmhpZGUoKSxjJiYoYi5sYWJlbD1jPWMuZGVzdHJveSgpKSkpO20mJihDKG0udGV4dCl8fEMobS5mb3JtYXR0ZXIpKSYmUCYmUC5sZW5ndGgmJjA8ZS53aWR0aCYmMDxlLmhlaWdodCYmIVAuaXNGbGF0PyhtPWQoe2FsaWduOmYmJnImJlwiY2VudGVyXCIseDpmPyFyJiY0OjEwLHZlcnRpY2FsQWxpZ246IWYmJnImJlwibWlkZGxlXCIseTpmP3I/MTY6MTA6cj82Oi00LHJvdGF0aW9uOmYmJiFyJiY5MH0sbSksdGhpcy5yZW5kZXJMYWJlbChtLFAscix3KSk6YyYmYy5oaWRlKCk7cmV0dXJuIGJ9O2IucHJvdG90eXBlLnJlbmRlckxhYmVsPWZ1bmN0aW9uKGQsYixlLGYpe3ZhciBsPXRoaXMubGFiZWwsbT10aGlzLmF4aXMuY2hhcnQucmVuZGVyZXI7bHx8KGw9e2FsaWduOmQudGV4dEFsaWdufHxkLmFsaWduLHJvdGF0aW9uOmQucm90YXRpb24sXCJjbGFzc1wiOlwiaGlnaGNoYXJ0cy1wbG90LVwiK1xuKGU/XCJiYW5kXCI6XCJsaW5lXCIpK1wiLWxhYmVsIFwiKyhkLmNsYXNzTmFtZXx8XCJcIil9LGwuekluZGV4PWYsZj10aGlzLmdldExhYmVsVGV4dChkKSx0aGlzLmxhYmVsPWw9bS50ZXh0KGYsMCwwLGQudXNlSFRNTCkuYXR0cihsKS5hZGQoKSx0aGlzLmF4aXMuY2hhcnQuc3R5bGVkTW9kZXx8bC5jc3MoZC5zdHlsZSkpO209Yi54Qm91bmRzfHxbYlswXVsxXSxiWzFdWzFdLGU/YlsyXVsxXTpiWzBdWzFdXTtiPWIueUJvdW5kc3x8W2JbMF1bMl0sYlsxXVsyXSxlP2JbMl1bMl06YlswXVsyXV07ZT1HKG0pO2Y9RyhiKTtsLmFsaWduKGQsITEse3g6ZSx5OmYsd2lkdGg6RChtKS1lLGhlaWdodDpEKGIpLWZ9KTtsLnNob3coITApfTtiLnByb3RvdHlwZS5nZXRMYWJlbFRleHQ9ZnVuY3Rpb24oZCl7cmV0dXJuIEMoZC5mb3JtYXR0ZXIpP2QuZm9ybWF0dGVyLmNhbGwodGhpcyk6ZC50ZXh0fTtiLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7eCh0aGlzLmF4aXMucGxvdExpbmVzQW5kQmFuZHMsXG50aGlzKTtkZWxldGUgdGhpcy5heGlzO0IodGhpcyl9O3JldHVybiBifSgpO3coZS5wcm90b3R5cGUse2dldFBsb3RCYW5kUGF0aDpmdW5jdGlvbihkLGIsZSl7dm9pZCAwPT09ZSYmKGU9dGhpcy5vcHRpb25zKTt2YXIgbD10aGlzLmdldFBsb3RMaW5lUGF0aCh7dmFsdWU6Yixmb3JjZTohMCxhY3Jvc3NQYW5lczplLmFjcm9zc1BhbmVzfSk7ZT10aGlzLmdldFBsb3RMaW5lUGF0aCh7dmFsdWU6ZCxmb3JjZTohMCxhY3Jvc3NQYW5lczplLmFjcm9zc1BhbmVzfSk7dmFyIGs9W10scT10aGlzLmhvcml6LG09MTtkPSFmKHRoaXMubWluKXx8IWYodGhpcy5tYXgpfHxkPHRoaXMubWluJiZiPHRoaXMubWlufHxkPnRoaXMubWF4JiZiPnRoaXMubWF4O2lmKGUmJmwpe2lmKGQpe3ZhciBjPWUudG9TdHJpbmcoKT09PWwudG9TdHJpbmcoKTttPTB9Zm9yKGQ9MDtkPGUubGVuZ3RoO2QrPTIpe2I9ZVtkXTt2YXIgZz1lW2QrMV0sYT1sW2RdLGg9bFtkKzFdO1wiTVwiIT09YlswXSYmXCJMXCIhPT1iWzBdfHxcblwiTVwiIT09Z1swXSYmXCJMXCIhPT1nWzBdfHxcIk1cIiE9PWFbMF0mJlwiTFwiIT09YVswXXx8XCJNXCIhPT1oWzBdJiZcIkxcIiE9PWhbMF18fChxJiZhWzFdPT09YlsxXT8oYVsxXSs9bSxoWzFdKz1tKTpxfHxhWzJdIT09YlsyXXx8KGFbMl0rPW0saFsyXSs9bSksay5wdXNoKFtcIk1cIixiWzFdLGJbMl1dLFtcIkxcIixnWzFdLGdbMl1dLFtcIkxcIixoWzFdLGhbMl1dLFtcIkxcIixhWzFdLGFbMl1dLFtcIlpcIl0pKTtrLmlzRmxhdD1jfX1yZXR1cm4ga30sYWRkUGxvdEJhbmQ6ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMuYWRkUGxvdEJhbmRPckxpbmUoZCxcInBsb3RCYW5kc1wiKX0sYWRkUGxvdExpbmU6ZnVuY3Rpb24oZCl7cmV0dXJuIHRoaXMuYWRkUGxvdEJhbmRPckxpbmUoZCxcInBsb3RMaW5lc1wiKX0sYWRkUGxvdEJhbmRPckxpbmU6ZnVuY3Rpb24oZCxlKXt2YXIgZj10aGlzLGw9bmV3IGIuUGxvdExpbmVPckJhbmQodGhpcyxkKSxrPXRoaXMudXNlck9wdGlvbnM7dGhpcy52aXNpYmxlJiYobD1sLnJlbmRlcigpKTtcbmlmKGwpe3RoaXMuX2FkZGVkUGxvdExCfHwodGhpcy5fYWRkZWRQbG90TEI9ITAsKGsucGxvdExpbmVzfHxbXSkuY29uY2F0KGsucGxvdEJhbmRzfHxbXSkuZm9yRWFjaChmdW5jdGlvbihkKXtmLmFkZFBsb3RCYW5kT3JMaW5lKGQpfSkpO2lmKGUpe3ZhciBxPWtbZV18fFtdO3EucHVzaChkKTtrW2VdPXF9dGhpcy5wbG90TGluZXNBbmRCYW5kcy5wdXNoKGwpfXJldHVybiBsfSxyZW1vdmVQbG90QmFuZE9yTGluZTpmdW5jdGlvbihkKXtmb3IodmFyIGI9dGhpcy5wbG90TGluZXNBbmRCYW5kcyxlPXRoaXMub3B0aW9ucyxmPXRoaXMudXNlck9wdGlvbnMsbD1iLmxlbmd0aDtsLS07KWJbbF0uaWQ9PT1kJiZiW2xdLmRlc3Ryb3koKTtbZS5wbG90TGluZXN8fFtdLGYucGxvdExpbmVzfHxbXSxlLnBsb3RCYW5kc3x8W10sZi5wbG90QmFuZHN8fFtdXS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2ZvcihsPWIubGVuZ3RoO2wtLTspKGJbbF18fHt9KS5pZD09PWQmJngoYixiW2xdKX0pfSxyZW1vdmVQbG90QmFuZDpmdW5jdGlvbihkKXt0aGlzLnJlbW92ZVBsb3RCYW5kT3JMaW5lKGQpfSxcbnJlbW92ZVBsb3RMaW5lOmZ1bmN0aW9uKGQpe3RoaXMucmVtb3ZlUGxvdEJhbmRPckxpbmUoZCl9fSk7Yi5QbG90TGluZU9yQmFuZD16O3JldHVybiBiLlBsb3RMaW5lT3JCYW5kfSk7TyhlLFwiQ29yZS9Ub29sdGlwLmpzXCIsW2VbXCJDb3JlL0Zvcm1hdFV0aWxpdGllcy5qc1wiXSxlW1wiQ29yZS9HbG9iYWxzLmpzXCJdLGVbXCJDb3JlL0NvbG9yL1BhbGV0dGUuanNcIl0sZVtcIkNvcmUvVXRpbGl0aWVzLmpzXCJdXSxmdW5jdGlvbihlLGIsSSx6KXt2YXIgRD1lLmZvcm1hdCxHPWIuZG9jLEM9ei5jbGFtcCxCPXouY3NzLHg9ei5kZWZpbmVkLHc9ei5kaXNjYXJkRWxlbWVudCx2PXouZXh0ZW5kLGY9ei5maXJlRXZlbnQsZD16LmlzQXJyYXkscT16LmlzTnVtYmVyLGs9ei5pc1N0cmluZyxsPXoubWVyZ2UsTj16LnBpY2ssdT16LnNwbGF0LG49ei5zeW5jVGltZW91dCxKPXoudGltZVVuaXRzO1wiXCI7ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZCxjKXt0aGlzLmNvbnRhaW5lcj12b2lkIDA7dGhpcy5jcm9zc2hhaXJzPVxuW107dGhpcy5kaXN0YW5jZT0wO3RoaXMuaXNIaWRkZW49ITA7dGhpcy5pc1N0aWNreT0hMTt0aGlzLm5vdz17fTt0aGlzLm9wdGlvbnM9e307dGhpcy5vdXRzaWRlPSExO3RoaXMuY2hhcnQ9ZDt0aGlzLmluaXQoZCxjKX1lLnByb3RvdHlwZS5hcHBseUZpbHRlcj1mdW5jdGlvbigpe3ZhciBkPXRoaXMuY2hhcnQ7ZC5yZW5kZXJlci5kZWZpbml0aW9uKHt0YWdOYW1lOlwiZmlsdGVyXCIsYXR0cmlidXRlczp7aWQ6XCJkcm9wLXNoYWRvdy1cIitkLmluZGV4LG9wYWNpdHk6LjV9LGNoaWxkcmVuOlt7dGFnTmFtZTpcImZlR2F1c3NpYW5CbHVyXCIsYXR0cmlidXRlczp7XCJpblwiOlwiU291cmNlQWxwaGFcIixzdGREZXZpYXRpb246MX19LHt0YWdOYW1lOlwiZmVPZmZzZXRcIixhdHRyaWJ1dGVzOntkeDoxLGR5OjF9fSx7dGFnTmFtZTpcImZlQ29tcG9uZW50VHJhbnNmZXJcIixjaGlsZHJlbjpbe3RhZ05hbWU6XCJmZUZ1bmNBXCIsYXR0cmlidXRlczp7dHlwZTpcImxpbmVhclwiLHNsb3BlOi4zfX1dfSx7dGFnTmFtZTpcImZlTWVyZ2VcIixcbmNoaWxkcmVuOlt7dGFnTmFtZTpcImZlTWVyZ2VOb2RlXCJ9LHt0YWdOYW1lOlwiZmVNZXJnZU5vZGVcIixhdHRyaWJ1dGVzOntcImluXCI6XCJTb3VyY2VHcmFwaGljXCJ9fV19XX0pO2QucmVuZGVyZXIuZGVmaW5pdGlvbih7dGFnTmFtZTpcInN0eWxlXCIsdGV4dENvbnRlbnQ6XCIuaGlnaGNoYXJ0cy10b29sdGlwLVwiK2QuaW5kZXgrXCJ7ZmlsdGVyOnVybCgjZHJvcC1zaGFkb3ctXCIrZC5pbmRleCtcIil9XCJ9KX07ZS5wcm90b3R5cGUuYm9keUZvcm1hdHRlcj1mdW5jdGlvbihkKXtyZXR1cm4gZC5tYXAoZnVuY3Rpb24oYyl7dmFyIGQ9Yy5zZXJpZXMudG9vbHRpcE9wdGlvbnM7cmV0dXJuKGRbKGMucG9pbnQuZm9ybWF0UHJlZml4fHxcInBvaW50XCIpK1wiRm9ybWF0dGVyXCJdfHxjLnBvaW50LnRvb2x0aXBGb3JtYXR0ZXIpLmNhbGwoYy5wb2ludCxkWyhjLnBvaW50LmZvcm1hdFByZWZpeHx8XCJwb2ludFwiKStcIkZvcm1hdFwiXXx8XCJcIil9KX07ZS5wcm90b3R5cGUuY2xlYW5TcGxpdD1mdW5jdGlvbihkKXt0aGlzLmNoYXJ0LnNlcmllcy5mb3JFYWNoKGZ1bmN0aW9uKGMpe3ZhciBiPVxuYyYmYy50dDtiJiYoIWIuaXNBY3RpdmV8fGQ/Yy50dD1iLmRlc3Ryb3koKTpiLmlzQWN0aXZlPSExKX0pfTtlLnByb3RvdHlwZS5kZWZhdWx0Rm9ybWF0dGVyPWZ1bmN0aW9uKGQpe3ZhciBjPXRoaXMucG9pbnRzfHx1KHRoaXMpO3ZhciBiPVtkLnRvb2x0aXBGb290ZXJIZWFkZXJGb3JtYXR0ZXIoY1swXSldO2I9Yi5jb25jYXQoZC5ib2R5Rm9ybWF0dGVyKGMpKTtiLnB1c2goZC50b29sdGlwRm9vdGVySGVhZGVyRm9ybWF0dGVyKGNbMF0sITApKTtyZXR1cm4gYn07ZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMubGFiZWwmJih0aGlzLmxhYmVsPXRoaXMubGFiZWwuZGVzdHJveSgpKTt0aGlzLnNwbGl0JiZ0aGlzLnR0JiYodGhpcy5jbGVhblNwbGl0KHRoaXMuY2hhcnQsITApLHRoaXMudHQ9dGhpcy50dC5kZXN0cm95KCkpO3RoaXMucmVuZGVyZXImJih0aGlzLnJlbmRlcmVyPXRoaXMucmVuZGVyZXIuZGVzdHJveSgpLHcodGhpcy5jb250YWluZXIpKTt6LmNsZWFyVGltZW91dCh0aGlzLmhpZGVUaW1lcik7XG56LmNsZWFyVGltZW91dCh0aGlzLnRvb2x0aXBUaW1lb3V0KX07ZS5wcm90b3R5cGUuZ2V0QW5jaG9yPWZ1bmN0aW9uKGQsYyl7dmFyIGI9dGhpcy5jaGFydDt2YXIgYT1iLnBvaW50ZXI7dmFyIGg9Yi5pbnZlcnRlZCxlPWIucGxvdFRvcCxmPWIucGxvdExlZnQsbT0wLGw9MCxrLG47ZD11KGQpO3RoaXMuZm9sbG93UG9pbnRlciYmYz8oXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBjLmNoYXJ0WCYmKGM9YS5ub3JtYWxpemUoYykpLGE9W2MuY2hhcnRYLWYsYy5jaGFydFktZV0pOmRbMF0udG9vbHRpcFBvcz9hPWRbMF0udG9vbHRpcFBvczooZC5mb3JFYWNoKGZ1bmN0aW9uKGEpe2s9YS5zZXJpZXMueUF4aXM7bj1hLnNlcmllcy54QXhpczttKz1hLnBsb3RYfHwwO2wrPWEucGxvdExvdz8oYS5wbG90TG93KyhhLnBsb3RIaWdofHwwKSkvMjphLnBsb3RZfHwwO24mJmsmJihoPyhtKz1lK2IucGxvdEhlaWdodC1uLmxlbi1uLnBvcyxsKz1mK2IucGxvdFdpZHRoLWsubGVuLWsucG9zKToobSs9bi5wb3MtXG5mLGwrPWsucG9zLWUpKX0pLG0vPWQubGVuZ3RoLGwvPWQubGVuZ3RoLGE9W2g/Yi5wbG90V2lkdGgtbDptLGg/Yi5wbG90SGVpZ2h0LW06bF0sdGhpcy5zaGFyZWQmJjE8ZC5sZW5ndGgmJmMmJihoP2FbMF09Yy5jaGFydFgtZjphWzFdPWMuY2hhcnRZLWUpKTtyZXR1cm4gYS5tYXAoTWF0aC5yb3VuZCl9O2UucHJvdG90eXBlLmdldERhdGVGb3JtYXQ9ZnVuY3Rpb24oZCxjLGIsYSl7dmFyIGg9dGhpcy5jaGFydC50aW1lLGc9aC5kYXRlRm9ybWF0KFwiJW0tJWQgJUg6JU06JVMuJUxcIixjKSxlPXttaWxsaXNlY29uZDoxNSxzZWNvbmQ6MTIsbWludXRlOjksaG91cjo2LGRheTozfSxmPVwibWlsbGlzZWNvbmRcIjtmb3IobSBpbiBKKXtpZihkPT09Si53ZWVrJiYraC5kYXRlRm9ybWF0KFwiJXdcIixjKT09PWImJlwiMDA6MDA6MDAuMDAwXCI9PT1nLnN1YnN0cig2KSl7dmFyIG09XCJ3ZWVrXCI7YnJlYWt9aWYoSlttXT5kKXttPWY7YnJlYWt9aWYoZVttXSYmZy5zdWJzdHIoZVttXSkhPT1cIjAxLTAxIDAwOjAwOjAwLjAwMFwiLnN1YnN0cihlW21dKSlicmVhaztcblwid2Vla1wiIT09bSYmKGY9bSl9aWYobSl2YXIgbD1oLnJlc29sdmVEVExGb3JtYXQoYVttXSkubWFpbjtyZXR1cm4gbH07ZS5wcm90b3R5cGUuZ2V0TGFiZWw9ZnVuY3Rpb24oKXt2YXIgZD10aGlzLGM9dGhpcy5jaGFydC5yZW5kZXJlcixnPXRoaXMuY2hhcnQuc3R5bGVkTW9kZSxhPXRoaXMub3B0aW9ucyxoPVwidG9vbHRpcFwiKyh4KGEuY2xhc3NOYW1lKT9cIiBcIithLmNsYXNzTmFtZTpcIlwiKSxlPWEuc3R5bGUmJmEuc3R5bGUucG9pbnRlckV2ZW50c3x8KCF0aGlzLmZvbGxvd1BvaW50ZXImJmEuc3RpY2tPbkNvbnRhY3Q/XCJhdXRvXCI6XCJub25lXCIpLGYseT1mdW5jdGlvbigpe2QuaW5Db250YWN0PSEwfSxsPWZ1bmN0aW9uKCl7dmFyIGE9ZC5jaGFydC5ob3ZlclNlcmllcztkLmluQ29udGFjdD0hMTtpZihhJiZhLm9uTW91c2VPdXQpYS5vbk1vdXNlT3V0KCl9O2lmKCF0aGlzLmxhYmVsKXtpZih0aGlzLm91dHNpZGUpe3ZhciBrPXRoaXMuY2hhcnQub3B0aW9ucy5jaGFydC5zdHlsZTt0aGlzLmNvbnRhaW5lcj1cbmY9Yi5kb2MuY3JlYXRlRWxlbWVudChcImRpdlwiKTtmLmNsYXNzTmFtZT1cImhpZ2hjaGFydHMtdG9vbHRpcC1jb250YWluZXJcIjtCKGYse3Bvc2l0aW9uOlwiYWJzb2x1dGVcIix0b3A6XCIxcHhcIixwb2ludGVyRXZlbnRzOmUsekluZGV4Ok1hdGgubWF4KHRoaXMub3B0aW9ucy5zdHlsZSYmdGhpcy5vcHRpb25zLnN0eWxlLnpJbmRleHx8MCwoayYmay56SW5kZXh8fDApKzMpfSk7Yi5kb2MuYm9keS5hcHBlbmRDaGlsZChmKTt0aGlzLnJlbmRlcmVyPWM9bmV3IGIuUmVuZGVyZXIoZiwwLDAsayx2b2lkIDAsdm9pZCAwLGMuc3R5bGVkTW9kZSl9dGhpcy5zcGxpdD90aGlzLmxhYmVsPWMuZyhoKToodGhpcy5sYWJlbD1jLmxhYmVsKFwiXCIsMCwwLGEuc2hhcGV8fFwiY2FsbG91dFwiLG51bGwsbnVsbCxhLnVzZUhUTUwsbnVsbCxoKS5hdHRyKHtwYWRkaW5nOmEucGFkZGluZyxyOmEuYm9yZGVyUmFkaXVzfSksZ3x8dGhpcy5sYWJlbC5hdHRyKHtmaWxsOmEuYmFja2dyb3VuZENvbG9yLFwic3Ryb2tlLXdpZHRoXCI6YS5ib3JkZXJXaWR0aH0pLmNzcyhhLnN0eWxlKS5jc3Moe3BvaW50ZXJFdmVudHM6ZX0pLnNoYWRvdyhhLnNoYWRvdykpO1xuZyYmKHRoaXMuYXBwbHlGaWx0ZXIoKSx0aGlzLmxhYmVsLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy10b29sdGlwLVwiK3RoaXMuY2hhcnQuaW5kZXgpKTtpZihkLm91dHNpZGUmJiFkLnNwbGl0KXt2YXIgbj10aGlzLmxhYmVsLHE9bi54U2V0dGVyLHU9bi55U2V0dGVyO24ueFNldHRlcj1mdW5jdGlvbihhKXtxLmNhbGwobixkLmRpc3RhbmNlKTtmLnN0eWxlLmxlZnQ9YStcInB4XCJ9O24ueVNldHRlcj1mdW5jdGlvbihhKXt1LmNhbGwobixkLmRpc3RhbmNlKTtmLnN0eWxlLnRvcD1hK1wicHhcIn19dGhpcy5sYWJlbC5vbihcIm1vdXNlZW50ZXJcIix5KS5vbihcIm1vdXNlbGVhdmVcIixsKS5hdHRyKHt6SW5kZXg6OH0pLmFkZCgpfXJldHVybiB0aGlzLmxhYmVsfTtlLnByb3RvdHlwZS5nZXRQb3NpdGlvbj1mdW5jdGlvbihkLGMsYil7dmFyIGE9dGhpcy5jaGFydCxoPXRoaXMuZGlzdGFuY2UsZz17fSxlPWEuaW52ZXJ0ZWQmJmIuaHx8MCxmLG09dGhpcy5vdXRzaWRlLGw9bT9HLmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aC1cbjIqaDphLmNoYXJ0V2lkdGgsaz1tP01hdGgubWF4KEcuYm9keS5zY3JvbGxIZWlnaHQsRy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LEcuYm9keS5vZmZzZXRIZWlnaHQsRy5kb2N1bWVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0LEcuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCk6YS5jaGFydEhlaWdodCxuPWEucG9pbnRlci5nZXRDaGFydFBvc2l0aW9uKCkscT1mdW5jdGlvbihnKXt2YXIgZT1cInhcIj09PWc7cmV0dXJuW2csZT9sOmssZT9kOmNdLmNvbmNhdChtP1tlP2Qqbi5zY2FsZVg6YypuLnNjYWxlWSxlP24ubGVmdC1oKyhiLnBsb3RYK2EucGxvdExlZnQpKm4uc2NhbGVYOm4udG9wLWgrKGIucGxvdFkrYS5wbG90VG9wKSpuLnNjYWxlWSwwLGU/bDprXTpbZT9kOmMsZT9iLnBsb3RYK2EucGxvdExlZnQ6Yi5wbG90WSthLnBsb3RUb3AsZT9hLnBsb3RMZWZ0OmEucGxvdFRvcCxlP2EucGxvdExlZnQrYS5wbG90V2lkdGg6YS5wbG90VG9wK2EucGxvdEhlaWdodF0pfSx1PVxucShcInlcIiksdD1xKFwieFwiKSxwPSF0aGlzLmZvbGxvd1BvaW50ZXImJk4oYi50dEJlbG93LCFhLmludmVydGVkPT09ISFiLm5lZ2F0aXZlKSx2PWZ1bmN0aW9uKGEsYyxkLGIscixmLEEpe3ZhciB5PW0/XCJ5XCI9PT1hP2gqbi5zY2FsZVk6aCpuLnNjYWxlWDpoLGw9KGQtYikvMixGPWI8ci1oLGs9citoK2I8YyxLPXIteS1kK2w7cj1yK3ktbDtpZihwJiZrKWdbYV09cjtlbHNlIGlmKCFwJiZGKWdbYV09SztlbHNlIGlmKEYpZ1thXT1NYXRoLm1pbihBLWIsMD5LLWU/SzpLLWUpO2Vsc2UgaWYoaylnW2FdPU1hdGgubWF4KGYscitlK2Q+Yz9yOnIrZSk7ZWxzZSByZXR1cm4hMX0sdz1mdW5jdGlvbihhLGMsZCxiLGUpe3ZhciByO2U8aHx8ZT5jLWg/cj0hMTpnW2FdPWU8ZC8yPzE6ZT5jLWIvMj9jLWItMjplLWQvMjtyZXR1cm4gcn0sRT1mdW5jdGlvbihhKXt2YXIgYz11O3U9dDt0PWM7Zj1hfSxGPWZ1bmN0aW9uKCl7ITEhPT12LmFwcGx5KDAsdSk/ITEhPT13LmFwcGx5KDAsdCl8fGZ8fChFKCEwKSxcbkYoKSk6Zj9nLng9Zy55PTA6KEUoITApLEYoKSl9OyhhLmludmVydGVkfHwxPHRoaXMubGVuKSYmRSgpO0YoKTtyZXR1cm4gZ307ZS5wcm90b3R5cGUuZ2V0WERhdGVGb3JtYXQ9ZnVuY3Rpb24oZCxjLGIpe2M9Yy5kYXRlVGltZUxhYmVsRm9ybWF0czt2YXIgYT1iJiZiLmNsb3Nlc3RQb2ludFJhbmdlO3JldHVybihhP3RoaXMuZ2V0RGF0ZUZvcm1hdChhLGQueCxiLm9wdGlvbnMuc3RhcnRPZldlZWssYyk6Yy5kYXkpfHxjLnllYXJ9O2UucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oZCl7dmFyIGM9dGhpczt6LmNsZWFyVGltZW91dCh0aGlzLmhpZGVUaW1lcik7ZD1OKGQsdGhpcy5vcHRpb25zLmhpZGVEZWxheSw1MDApO3RoaXMuaXNIaWRkZW58fCh0aGlzLmhpZGVUaW1lcj1uKGZ1bmN0aW9uKCl7Yy5nZXRMYWJlbCgpLmZhZGVPdXQoZD92b2lkIDA6ZCk7Yy5pc0hpZGRlbj0hMH0sZCkpfTtlLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGQsYyl7dGhpcy5jaGFydD1kO3RoaXMub3B0aW9ucz1cbmM7dGhpcy5jcm9zc2hhaXJzPVtdO3RoaXMubm93PXt4OjAseTowfTt0aGlzLmlzSGlkZGVuPSEwO3RoaXMuc3BsaXQ9Yy5zcGxpdCYmIWQuaW52ZXJ0ZWQmJiFkLnBvbGFyO3RoaXMuc2hhcmVkPWMuc2hhcmVkfHx0aGlzLnNwbGl0O3RoaXMub3V0c2lkZT1OKGMub3V0c2lkZSwhKCFkLnNjcm9sbGFibGVQaXhlbHNYJiYhZC5zY3JvbGxhYmxlUGl4ZWxzWSkpfTtlLnByb3RvdHlwZS5pc1N0aWNreU9uQ29udGFjdD1mdW5jdGlvbigpe3JldHVybiEodGhpcy5mb2xsb3dQb2ludGVyfHwhdGhpcy5vcHRpb25zLnN0aWNrT25Db250YWN0fHwhdGhpcy5pbkNvbnRhY3QpfTtlLnByb3RvdHlwZS5tb3ZlPWZ1bmN0aW9uKGQsYyxiLGEpe3ZhciBoPXRoaXMsZz1oLm5vdyxlPSExIT09aC5vcHRpb25zLmFuaW1hdGlvbiYmIWguaXNIaWRkZW4mJigxPE1hdGguYWJzKGQtZy54KXx8MTxNYXRoLmFicyhjLWcueSkpLGY9aC5mb2xsb3dQb2ludGVyfHwxPGgubGVuO3YoZyx7eDplPygyKmcueCtkKS9cbjM6ZCx5OmU/KGcueStjKS8yOmMsYW5jaG9yWDpmP3ZvaWQgMDplPygyKmcuYW5jaG9yWCtiKS8zOmIsYW5jaG9yWTpmP3ZvaWQgMDplPyhnLmFuY2hvclkrYSkvMjphfSk7aC5nZXRMYWJlbCgpLmF0dHIoZyk7aC5kcmF3VHJhY2tlcigpO2UmJih6LmNsZWFyVGltZW91dCh0aGlzLnRvb2x0aXBUaW1lb3V0KSx0aGlzLnRvb2x0aXBUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtoJiZoLm1vdmUoZCxjLGIsYSl9LDMyKSl9O2UucHJvdG90eXBlLnJlZnJlc2g9ZnVuY3Rpb24oYixjKXt2YXIgZz10aGlzLmNoYXJ0LGE9dGhpcy5vcHRpb25zLGg9dShiKSxlPWhbMF0sbT17fSx5PVtdLGw9YS5mb3JtYXR0ZXJ8fHRoaXMuZGVmYXVsdEZvcm1hdHRlcjttPXRoaXMuc2hhcmVkO3ZhciBrPWcuc3R5bGVkTW9kZTtpZihhLmVuYWJsZWQpe3ouY2xlYXJUaW1lb3V0KHRoaXMuaGlkZVRpbWVyKTt0aGlzLmZvbGxvd1BvaW50ZXI9IXRoaXMuc3BsaXQmJmUuc2VyaWVzLnRvb2x0aXBPcHRpb25zLmZvbGxvd1BvaW50ZXI7XG52YXIgbj10aGlzLmdldEFuY2hvcihiLGMpO3ZhciBxPW5bMF07dmFyIHY9blsxXTshbXx8IWQoYikmJmIuc2VyaWVzJiZiLnNlcmllcy5ub1NoYXJlZFRvb2x0aXA/bT1lLmdldExhYmVsQ29uZmlnKCk6KGcucG9pbnRlci5hcHBseUluYWN0aXZlU3RhdGUoaCksaC5mb3JFYWNoKGZ1bmN0aW9uKGEpe2Euc2V0U3RhdGUoXCJob3ZlclwiKTt5LnB1c2goYS5nZXRMYWJlbENvbmZpZygpKX0pLG09e3g6ZS5jYXRlZ29yeSx5OmUueX0sbS5wb2ludHM9eSk7dGhpcy5sZW49eS5sZW5ndGg7Yj1sLmNhbGwobSx0aGlzKTtsPWUuc2VyaWVzO3RoaXMuZGlzdGFuY2U9TihsLnRvb2x0aXBPcHRpb25zLmRpc3RhbmNlLDE2KTtpZighMT09PWIpdGhpcy5oaWRlKCk7ZWxzZXtpZih0aGlzLnNwbGl0KXRoaXMucmVuZGVyU3BsaXQoYixoKTtlbHNlIGlmKGg9cSxtPXYsYyYmZy5wb2ludGVyLmlzRGlyZWN0VG91Y2gmJihoPWMuY2hhcnRYLWcucGxvdExlZnQsbT1jLmNoYXJ0WS1nLnBsb3RUb3ApLGcucG9sYXJ8fFxuITE9PT1sLm9wdGlvbnMuY2xpcHx8bC5zaG91bGRTaG93VG9vbHRpcChoLG0pKWM9dGhpcy5nZXRMYWJlbCgpLGEuc3R5bGUud2lkdGgmJiFrfHxjLmNzcyh7d2lkdGg6dGhpcy5jaGFydC5zcGFjaW5nQm94LndpZHRoK1wicHhcIn0pLGMuYXR0cih7dGV4dDpiJiZiLmpvaW4/Yi5qb2luKFwiXCIpOmJ9KSxjLnJlbW92ZUNsYXNzKC9oaWdoY2hhcnRzLWNvbG9yLVtcXGRdKy9nKS5hZGRDbGFzcyhcImhpZ2hjaGFydHMtY29sb3ItXCIrTihlLmNvbG9ySW5kZXgsbC5jb2xvckluZGV4KSksa3x8Yy5hdHRyKHtzdHJva2U6YS5ib3JkZXJDb2xvcnx8ZS5jb2xvcnx8bC5jb2xvcnx8SS5uZXV0cmFsQ29sb3I2MH0pLHRoaXMudXBkYXRlUG9zaXRpb24oe3Bsb3RYOnEscGxvdFk6dixuZWdhdGl2ZTplLm5lZ2F0aXZlLHR0QmVsb3c6ZS50dEJlbG93LGg6blsyXXx8MH0pO2Vsc2V7dGhpcy5oaWRlKCk7cmV0dXJufXRoaXMuaXNIaWRkZW4mJnRoaXMubGFiZWwmJnRoaXMubGFiZWwuYXR0cih7b3BhY2l0eToxfSkuc2hvdygpO1xudGhpcy5pc0hpZGRlbj0hMX1mKHRoaXMsXCJyZWZyZXNoXCIpfX07ZS5wcm90b3R5cGUucmVuZGVyU3BsaXQ9ZnVuY3Rpb24oZCxjKXtmdW5jdGlvbiBnKGMsZCxiLGcsaCl7dm9pZCAwPT09aCYmKGg9ITApO2I/KGQ9WD8wOmJhLGM9QyhjLWcvMixTLmxlZnQsUy5yaWdodC1nLShhLm91dHNpZGU/VTowKSkpOihkLT1CLGM9aD9jLWctSjpjK0osYz1DKGMsaD9jOlMubGVmdCxTLnJpZ2h0KSk7cmV0dXJue3g6Yyx5OmR9fXZhciBhPXRoaXMsaD1hLmNoYXJ0LGU9YS5jaGFydCxmPWUuY2hhcnRXaWR0aCxtPWUuY2hhcnRIZWlnaHQsbD1lLnBsb3RIZWlnaHQsbj1lLnBsb3RMZWZ0LHE9ZS5wbG90VG9wLHU9ZS5wb2ludGVyLHc9ZS5zY3JvbGxhYmxlUGl4ZWxzWTt3PXZvaWQgMD09PXc/MDp3O3ZhciBFPWUuc2Nyb2xsYWJsZVBpeGVsc1gsdD1lLnNjcm9sbGluZ0NvbnRhaW5lcjt0PXZvaWQgMD09PXQ/e3Njcm9sbExlZnQ6MCxzY3JvbGxUb3A6MH06dDt2YXIgcD10LnNjcm9sbExlZnQ7dD1cbnQuc2Nyb2xsVG9wO3ZhciB4PWUuc3R5bGVkTW9kZSxKPWEuZGlzdGFuY2UsRD1hLm9wdGlvbnMsRj1hLm9wdGlvbnMucG9zaXRpb25lcixTPWEub3V0c2lkZSYmXCJudW1iZXJcIiE9PXR5cGVvZiBFP0cuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOntsZWZ0OnAscmlnaHQ6cCtmLHRvcDp0LGJvdHRvbTp0K219LEs9YS5nZXRMYWJlbCgpLFQ9dGhpcy5yZW5kZXJlcnx8aC5yZW5kZXJlcixYPSEoIWgueEF4aXNbMF18fCFoLnhBeGlzWzBdLm9wcG9zaXRlKTtoPXUuZ2V0Q2hhcnRQb3NpdGlvbigpO3ZhciBVPWgubGVmdDtoPWgudG9wO3ZhciBCPXErdCx6PTAsYmE9bC13O2soZCkmJihkPVshMSxkXSk7ZD1kLnNsaWNlKDAsYy5sZW5ndGgrMSkucmVkdWNlKGZ1bmN0aW9uKGQsYixoKXtpZighMSE9PWImJlwiXCIhPT1iKXtoPWNbaC0xXXx8e2lzSGVhZGVyOiEwLHBsb3RYOmNbMF0ucGxvdFgscGxvdFk6bCxzZXJpZXM6e319O3ZhciBlPWguaXNIZWFkZXIscj1lP2E6XG5oLnNlcmllcztiPWIudG9TdHJpbmcoKTt2YXIgZj1yLnR0LG09aC5pc0hlYWRlcjt2YXIgQT1oLnNlcmllczt2YXIgeT1cImhpZ2hjaGFydHMtY29sb3ItXCIrTihoLmNvbG9ySW5kZXgsQS5jb2xvckluZGV4LFwibm9uZVwiKTtmfHwoZj17cGFkZGluZzpELnBhZGRpbmcscjpELmJvcmRlclJhZGl1c30seHx8KGYuZmlsbD1ELmJhY2tncm91bmRDb2xvcixmW1wic3Ryb2tlLXdpZHRoXCJdPUQuYm9yZGVyV2lkdGgpLGY9VC5sYWJlbChcIlwiLDAsMCxEW20/XCJoZWFkZXJTaGFwZVwiOlwic2hhcGVcIl18fFwiY2FsbG91dFwiLHZvaWQgMCx2b2lkIDAsRC51c2VIVE1MKS5hZGRDbGFzcygobT9cImhpZ2hjaGFydHMtdG9vbHRpcC1oZWFkZXIgXCI6XCJcIikrXCJoaWdoY2hhcnRzLXRvb2x0aXAtYm94IFwiK3kpLmF0dHIoZikuYWRkKEspKTtmLmlzQWN0aXZlPSEwO2YuYXR0cih7dGV4dDpifSk7eHx8Zi5jc3MoRC5zdHlsZSkuc2hhZG93KEQuc2hhZG93KS5hdHRyKHtzdHJva2U6RC5ib3JkZXJDb2xvcnx8aC5jb2xvcnx8XG5BLmNvbG9yfHxJLm5ldXRyYWxDb2xvcjgwfSk7cj1yLnR0PWY7bT1yLmdldEJCb3goKTtiPW0ud2lkdGgrci5zdHJva2VXaWR0aCgpO2UmJih6PW0uaGVpZ2h0LGJhKz16LFgmJihCLT16KSk7QT1oLnBsb3RYO0E9dm9pZCAwPT09QT8wOkE7eT1oLnBsb3RZO3k9dm9pZCAwPT09eT8wOnk7Zj1oLnNlcmllcztpZihoLmlzSGVhZGVyKXtBPW4rQTt2YXIgaz1xK2wvMn1lbHNle3ZhciBwPWYueEF4aXMsdD1mLnlBeGlzO0E9cC5wb3MrQyhBLC1KLHAubGVuK0opO2Yuc2hvdWxkU2hvd1Rvb2x0aXAoMCx0LnBvcy1xK3kse2lnbm9yZVg6ITB9KSYmKGs9dC5wb3MreSl9QT1DKEEsUy5sZWZ0LUosUy5yaWdodCtKKTtcIm51bWJlclwiPT09dHlwZW9mIGs/KG09bS5oZWlnaHQrMSx5PUY/Ri5jYWxsKGEsYixtLGgpOmcoQSxrLGUsYiksZC5wdXNoKHthbGlnbjpGPzA6dm9pZCAwLGFuY2hvclg6QSxhbmNob3JZOmssYm94V2lkdGg6Yixwb2ludDpoLHJhbms6Tih5LnJhbmssZT8xOjApLHNpemU6bSxcbnRhcmdldDp5LnksdHQ6cix4OnkueH0pKTpyLmlzQWN0aXZlPSExfXJldHVybiBkfSxbXSk7IUYmJmQuc29tZShmdW5jdGlvbihjKXt2YXIgZD0oYS5vdXRzaWRlP1U6MCkrYy5hbmNob3JYO3JldHVybiBkPFMubGVmdCYmZCtjLmJveFdpZHRoPFMucmlnaHQ/ITA6ZDxVLVMubGVmdCtjLmJveFdpZHRoJiZTLnJpZ2h0LWQ+ZH0pJiYoZD1kLm1hcChmdW5jdGlvbihhKXt2YXIgYz1nKGEuYW5jaG9yWCxhLmFuY2hvclksYS5wb2ludC5pc0hlYWRlcixhLmJveFdpZHRoLCExKTtyZXR1cm4gdihhLHt0YXJnZXQ6Yy55LHg6Yy54fSl9KSk7YS5jbGVhblNwbGl0KCk7Yi5kaXN0cmlidXRlKGQsYmEpO3ZhciBIPVUsY2E9VTtkLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9Yy54LGI9Yy5ib3hXaWR0aDtjPWMuaXNIZWFkZXI7Y3x8KGEub3V0c2lkZSYmVStkPEgmJihIPVUrZCksIWMmJmEub3V0c2lkZSYmSCtiPmNhJiYoY2E9VStkKSl9KTtkLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9Yy54LFxuYj1jLmFuY2hvclgsaD1jLnBvcyxnPWMucG9pbnQuaXNIZWFkZXI7aD17dmlzaWJpbGl0eTpcInVuZGVmaW5lZFwiPT09dHlwZW9mIGg/XCJoaWRkZW5cIjpcImluaGVyaXRcIix4OmQseTpoK0IsYW5jaG9yWDpiLGFuY2hvclk6Yy5hbmNob3JZfTtpZihhLm91dHNpZGUmJmQ8Yil7dmFyIGU9VS1IOzA8ZSYmKGd8fChoLng9ZCtlLGguYW5jaG9yWD1iK2UpLGcmJihoLng9KGNhLUgpLzIsaC5hbmNob3JYPWIrZSkpfWMudHQuYXR0cihoKX0pO2Q9YS5jb250YWluZXI7dz1hLnJlbmRlcmVyO2Eub3V0c2lkZSYmZCYmdyYmKGU9Sy5nZXRCQm94KCksdy5zZXRTaXplKGUud2lkdGgrZS54LGUuaGVpZ2h0K2UueSwhMSksZC5zdHlsZS5sZWZ0PUgrXCJweFwiLGQuc3R5bGUudG9wPWgrXCJweFwiKX07ZS5wcm90b3R5cGUuZHJhd1RyYWNrZXI9ZnVuY3Rpb24oKXtpZih0aGlzLmZvbGxvd1BvaW50ZXJ8fCF0aGlzLm9wdGlvbnMuc3RpY2tPbkNvbnRhY3QpdGhpcy50cmFja2VyJiZ0aGlzLnRyYWNrZXIuZGVzdHJveSgpO1xuZWxzZXt2YXIgZD10aGlzLmNoYXJ0LGM9dGhpcy5sYWJlbCxiPWQuaG92ZXJQb2ludDtpZihjJiZiKXt2YXIgYT17eDowLHk6MCx3aWR0aDowLGhlaWdodDowfTtiPXRoaXMuZ2V0QW5jaG9yKGIpO3ZhciBoPWMuZ2V0QkJveCgpO2JbMF0rPWQucGxvdExlZnQtYy50cmFuc2xhdGVYO2JbMV0rPWQucGxvdFRvcC1jLnRyYW5zbGF0ZVk7YS54PU1hdGgubWluKDAsYlswXSk7YS55PU1hdGgubWluKDAsYlsxXSk7YS53aWR0aD0wPmJbMF0/TWF0aC5tYXgoTWF0aC5hYnMoYlswXSksaC53aWR0aC1iWzBdKTpNYXRoLm1heChNYXRoLmFicyhiWzBdKSxoLndpZHRoKTthLmhlaWdodD0wPmJbMV0/TWF0aC5tYXgoTWF0aC5hYnMoYlsxXSksaC5oZWlnaHQtTWF0aC5hYnMoYlsxXSkpOk1hdGgubWF4KE1hdGguYWJzKGJbMV0pLGguaGVpZ2h0KTt0aGlzLnRyYWNrZXI/dGhpcy50cmFja2VyLmF0dHIoYSk6KHRoaXMudHJhY2tlcj1jLnJlbmRlcmVyLnJlY3QoYSkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLXRyYWNrZXJcIikuYWRkKGMpLFxuZC5zdHlsZWRNb2RlfHx0aGlzLnRyYWNrZXIuYXR0cih7ZmlsbDpcInJnYmEoMCwwLDAsMClcIn0pKX19fTtlLnByb3RvdHlwZS5zdHlsZWRNb2RlRm9ybWF0PWZ1bmN0aW9uKGQpe3JldHVybiBkLnJlcGxhY2UoJ3N0eWxlPVwiZm9udC1zaXplOiAxMHB4XCInLCdjbGFzcz1cImhpZ2hjaGFydHMtaGVhZGVyXCInKS5yZXBsYWNlKC9zdHlsZT1cImNvbG9yOnsocG9pbnR8c2VyaWVzKVxcLmNvbG9yfVwiL2csJ2NsYXNzPVwiaGlnaGNoYXJ0cy1jb2xvci17JDEuY29sb3JJbmRleH1cIicpfTtlLnByb3RvdHlwZS50b29sdGlwRm9vdGVySGVhZGVyRm9ybWF0dGVyPWZ1bmN0aW9uKGQsYyl7dmFyIGI9Yz9cImZvb3RlclwiOlwiaGVhZGVyXCIsYT1kLnNlcmllcyxoPWEudG9vbHRpcE9wdGlvbnMsZT1oLnhEYXRlRm9ybWF0LG09YS54QXhpcyxsPW0mJlwiZGF0ZXRpbWVcIj09PW0ub3B0aW9ucy50eXBlJiZxKGQua2V5KSxrPWhbYitcIkZvcm1hdFwiXTtjPXtpc0Zvb3RlcjpjLGxhYmVsQ29uZmlnOmR9O2YodGhpcyxcImhlYWRlckZvcm1hdHRlclwiLFxuYyxmdW5jdGlvbihjKXtsJiYhZSYmKGU9dGhpcy5nZXRYRGF0ZUZvcm1hdChkLGgsbSkpO2wmJmUmJihkLnBvaW50JiZkLnBvaW50LnRvb2x0aXBEYXRlS2V5c3x8W1wia2V5XCJdKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2s9ay5yZXBsYWNlKFwie3BvaW50LlwiK2ErXCJ9XCIsXCJ7cG9pbnQuXCIrYStcIjpcIitlK1wifVwiKX0pO2EuY2hhcnQuc3R5bGVkTW9kZSYmKGs9dGhpcy5zdHlsZWRNb2RlRm9ybWF0KGspKTtjLnRleHQ9RChrLHtwb2ludDpkLHNlcmllczphfSx0aGlzLmNoYXJ0KX0pO3JldHVybiBjLnRleHR9O2UucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihkKXt0aGlzLmRlc3Ryb3koKTtsKCEwLHRoaXMuY2hhcnQub3B0aW9ucy50b29sdGlwLnVzZXJPcHRpb25zLGQpO3RoaXMuaW5pdCh0aGlzLmNoYXJ0LGwoITAsdGhpcy5vcHRpb25zLGQpKX07ZS5wcm90b3R5cGUudXBkYXRlUG9zaXRpb249ZnVuY3Rpb24oZCl7dmFyIGM9dGhpcy5jaGFydCxiPWMucG9pbnRlcixhPXRoaXMuZ2V0TGFiZWwoKSxcbmg9ZC5wbG90WCtjLnBsb3RMZWZ0O2M9ZC5wbG90WStjLnBsb3RUb3A7Yj1iLmdldENoYXJ0UG9zaXRpb24oKTtkPSh0aGlzLm9wdGlvbnMucG9zaXRpb25lcnx8dGhpcy5nZXRQb3NpdGlvbikuY2FsbCh0aGlzLGEud2lkdGgsYS5oZWlnaHQsZCk7aWYodGhpcy5vdXRzaWRlKXt2YXIgZT0odGhpcy5vcHRpb25zLmJvcmRlcldpZHRofHwwKSsyKnRoaXMuZGlzdGFuY2U7dGhpcy5yZW5kZXJlci5zZXRTaXplKGEud2lkdGgrZSxhLmhlaWdodCtlLCExKTtpZigxIT09Yi5zY2FsZVh8fDEhPT1iLnNjYWxlWSlCKHRoaXMuY29udGFpbmVyLHt0cmFuc2Zvcm06XCJzY2FsZShcIitiLnNjYWxlWCtcIiwgXCIrYi5zY2FsZVkrXCIpXCJ9KSxoKj1iLnNjYWxlWCxjKj1iLnNjYWxlWTtoKz1iLmxlZnQtZC54O2MrPWIudG9wLWQueX10aGlzLm1vdmUoTWF0aC5yb3VuZChkLngpLE1hdGgucm91bmQoZC55fHwwKSxoLGMpfTtyZXR1cm4gZX0oKTtiLlRvb2x0aXA9ZTtyZXR1cm4gYi5Ub29sdGlwfSk7TyhlLFxuXCJDb3JlL1BvaW50ZXIuanNcIixbZVtcIkNvcmUvQ29sb3IvQ29sb3IuanNcIl0sZVtcIkNvcmUvR2xvYmFscy5qc1wiXSxlW1wiQ29yZS9Db2xvci9QYWxldHRlLmpzXCJdLGVbXCJDb3JlL1Rvb2x0aXAuanNcIl0sZVtcIkNvcmUvVXRpbGl0aWVzLmpzXCJdXSxmdW5jdGlvbihlLGIsSSx6LEgpe3ZhciBEPWUucGFyc2UsQz1iLmNoYXJ0cyxCPWIubm9vcCx4PUguYWRkRXZlbnQsdz1ILmF0dHIsdj1ILmNzcyxmPUguZGVmaW5lZCxkPUguZXh0ZW5kLHE9SC5maW5kLGs9SC5maXJlRXZlbnQsbD1ILmlzTnVtYmVyLE49SC5pc09iamVjdCx1PUgub2JqZWN0RWFjaCxuPUgub2Zmc2V0LEo9SC5waWNrLEU9SC5zcGxhdDtcIlwiO2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGMsZCl7dGhpcy5sYXN0VmFsaWRUb3VjaD17fTt0aGlzLnBpbmNoRG93bj1bXTt0aGlzLnJ1bkNoYXJ0Q2xpY2s9ITE7dGhpcy5ldmVudHNUb1VuYmluZD1bXTt0aGlzLmNoYXJ0PWM7dGhpcy5oYXNEcmFnZ2VkPSExO3RoaXMub3B0aW9ucz1cbmQ7dGhpcy5pbml0KGMsZCl9ZS5wcm90b3R5cGUuYXBwbHlJbmFjdGl2ZVN0YXRlPWZ1bmN0aW9uKGMpe3ZhciBkPVtdLGE7KGN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2E9Yy5zZXJpZXM7ZC5wdXNoKGEpO2EubGlua2VkUGFyZW50JiZkLnB1c2goYS5saW5rZWRQYXJlbnQpO2EubGlua2VkU2VyaWVzJiYoZD1kLmNvbmNhdChhLmxpbmtlZFNlcmllcykpO2EubmF2aWdhdG9yU2VyaWVzJiZkLnB1c2goYS5uYXZpZ2F0b3JTZXJpZXMpfSk7dGhpcy5jaGFydC5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihhKXstMT09PWQuaW5kZXhPZihhKT9hLnNldFN0YXRlKFwiaW5hY3RpdmVcIiwhMCk6YS5vcHRpb25zLmluYWN0aXZlT3RoZXJQb2ludHMmJmEuc2V0QWxsUG9pbnRzVG9TdGF0ZShcImluYWN0aXZlXCIpfSl9O2UucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgYz10aGlzO3RoaXMuZXZlbnRzVG9VbmJpbmQuZm9yRWFjaChmdW5jdGlvbihjKXtyZXR1cm4gYygpfSk7dGhpcy5ldmVudHNUb1VuYmluZD1cbltdO2IuY2hhcnRDb3VudHx8KGIudW5iaW5kRG9jdW1lbnRNb3VzZVVwJiYoYi51bmJpbmREb2N1bWVudE1vdXNlVXA9Yi51bmJpbmREb2N1bWVudE1vdXNlVXAoKSksYi51bmJpbmREb2N1bWVudFRvdWNoRW5kJiYoYi51bmJpbmREb2N1bWVudFRvdWNoRW5kPWIudW5iaW5kRG9jdW1lbnRUb3VjaEVuZCgpKSk7Y2xlYXJJbnRlcnZhbChjLnRvb2x0aXBUaW1lb3V0KTt1KGMsZnVuY3Rpb24oZCxhKXtjW2FdPXZvaWQgMH0pfTtlLnByb3RvdHlwZS5kcmFnPWZ1bmN0aW9uKGMpe3ZhciBkPXRoaXMuY2hhcnQsYT1kLm9wdGlvbnMuY2hhcnQsYj1jLmNoYXJ0WCxlPWMuY2hhcnRZLGY9dGhpcy56b29tSG9yLGw9dGhpcy56b29tVmVydCxtPWQucGxvdExlZnQsaz1kLnBsb3RUb3Asbj1kLnBsb3RXaWR0aCxxPWQucGxvdEhlaWdodCx1PXRoaXMuc2VsZWN0aW9uTWFya2VyLHY9dGhpcy5tb3VzZURvd25YfHwwLHQ9dGhpcy5tb3VzZURvd25ZfHwwLHA9TihhLnBhbm5pbmcpP2EucGFubmluZyYmXG5hLnBhbm5pbmcuZW5hYmxlZDphLnBhbm5pbmcsdz1hLnBhbktleSYmY1thLnBhbktleStcIktleVwiXTtpZighdXx8IXUudG91Y2gpaWYoYjxtP2I9bTpiPm0rbiYmKGI9bStuKSxlPGs/ZT1rOmU+aytxJiYoZT1rK3EpLHRoaXMuaGFzRHJhZ2dlZD1NYXRoLnNxcnQoTWF0aC5wb3codi1iLDIpK01hdGgucG93KHQtZSwyKSksMTA8dGhpcy5oYXNEcmFnZ2VkKXt2YXIgRT1kLmlzSW5zaWRlUGxvdCh2LW0sdC1rLHt2aXNpYmxlUGxvdE9ubHk6ITB9KTtkLmhhc0NhcnRlc2lhblNlcmllcyYmKHRoaXMuem9vbVh8fHRoaXMuem9vbVkpJiZFJiYhdyYmIXUmJih0aGlzLnNlbGVjdGlvbk1hcmtlcj11PWQucmVuZGVyZXIucmVjdChtLGssZj8xOm4sbD8xOnEsMCkuYXR0cih7XCJjbGFzc1wiOlwiaGlnaGNoYXJ0cy1zZWxlY3Rpb24tbWFya2VyXCIsekluZGV4Ojd9KS5hZGQoKSxkLnN0eWxlZE1vZGV8fHUuYXR0cih7ZmlsbDphLnNlbGVjdGlvbk1hcmtlckZpbGx8fEQoSS5oaWdobGlnaHRDb2xvcjgwKS5zZXRPcGFjaXR5KC4yNSkuZ2V0KCl9KSk7XG51JiZmJiYoYi09dix1LmF0dHIoe3dpZHRoOk1hdGguYWJzKGIpLHg6KDA8Yj8wOmIpK3Z9KSk7dSYmbCYmKGI9ZS10LHUuYXR0cih7aGVpZ2h0Ok1hdGguYWJzKGIpLHk6KDA8Yj8wOmIpK3R9KSk7RSYmIXUmJnAmJmQucGFuKGMsYS5wYW5uaW5nKX19O2UucHJvdG90eXBlLmRyYWdTdGFydD1mdW5jdGlvbihjKXt2YXIgZD10aGlzLmNoYXJ0O2QubW91c2VJc0Rvd249Yy50eXBlO2QuY2FuY2VsQ2xpY2s9ITE7ZC5tb3VzZURvd25YPXRoaXMubW91c2VEb3duWD1jLmNoYXJ0WDtkLm1vdXNlRG93blk9dGhpcy5tb3VzZURvd25ZPWMuY2hhcnRZfTtlLnByb3RvdHlwZS5kcm9wPWZ1bmN0aW9uKGMpe3ZhciBiPXRoaXMsYT10aGlzLmNoYXJ0LGg9dGhpcy5oYXNQaW5jaGVkO2lmKHRoaXMuc2VsZWN0aW9uTWFya2VyKXt2YXIgZT17b3JpZ2luYWxFdmVudDpjLHhBeGlzOltdLHlBeGlzOltdfSxBPXRoaXMuc2VsZWN0aW9uTWFya2VyLG09QS5hdHRyP0EuYXR0cihcInhcIik6QS54LG49QS5hdHRyP1xuQS5hdHRyKFwieVwiKTpBLnkscT1BLmF0dHI/QS5hdHRyKFwid2lkdGhcIik6QS53aWR0aCx1PUEuYXR0cj9BLmF0dHIoXCJoZWlnaHRcIik6QS5oZWlnaHQsdztpZih0aGlzLmhhc0RyYWdnZWR8fGgpYS5heGVzLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYS56b29tRW5hYmxlZCYmZihhLm1pbikmJihofHxiW3t4QXhpczpcInpvb21YXCIseUF4aXM6XCJ6b29tWVwifVthLmNvbGxdXSkmJmwobSkmJmwobikpe3ZhciBkPWEuaG9yaXosZz1cInRvdWNoZW5kXCI9PT1jLnR5cGU/YS5taW5QaXhlbFBhZGRpbmc6MCxyPWEudG9WYWx1ZSgoZD9tOm4pK2cpO2Q9YS50b1ZhbHVlKChkP20rcTpuK3UpLWcpO2VbYS5jb2xsXS5wdXNoKHtheGlzOmEsbWluOk1hdGgubWluKHIsZCksbWF4Ok1hdGgubWF4KHIsZCl9KTt3PSEwfX0pLHcmJmsoYSxcInNlbGVjdGlvblwiLGUsZnVuY3Rpb24oYyl7YS56b29tKGQoYyxoP3thbmltYXRpb246ITF9Om51bGwpKX0pO2woYS5pbmRleCkmJih0aGlzLnNlbGVjdGlvbk1hcmtlcj1cbnRoaXMuc2VsZWN0aW9uTWFya2VyLmRlc3Ryb3koKSk7aCYmdGhpcy5zY2FsZUdyb3VwcygpfWEmJmwoYS5pbmRleCkmJih2KGEuY29udGFpbmVyLHtjdXJzb3I6YS5fY3Vyc29yfSksYS5jYW5jZWxDbGljaz0xMDx0aGlzLmhhc0RyYWdnZWQsYS5tb3VzZUlzRG93bj10aGlzLmhhc0RyYWdnZWQ9dGhpcy5oYXNQaW5jaGVkPSExLHRoaXMucGluY2hEb3duPVtdKX07ZS5wcm90b3R5cGUuZmluZE5lYXJlc3RLRFBvaW50PWZ1bmN0aW9uKGMsZCxhKXt2YXIgYj10aGlzLmNoYXJ0LGc9Yi5ob3ZlclBvaW50O2I9Yi50b29sdGlwO2lmKGcmJmImJmIuaXNTdGlja3lPbkNvbnRhY3QoKSlyZXR1cm4gZzt2YXIgZTtjLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGI9IShjLm5vU2hhcmVkVG9vbHRpcCYmZCkmJjA+Yy5vcHRpb25zLmZpbmROZWFyZXN0UG9pbnRCeS5pbmRleE9mKFwieVwiKTtjPWMuc2VhcmNoUG9pbnQoYSxiKTtpZigoYj1OKGMsITApJiZjLnNlcmllcykmJiEoYj0hTihlLCEwKSkpe2I9XG5lLmRpc3RYLWMuZGlzdFg7dmFyIGg9ZS5kaXN0LWMuZGlzdCxnPShjLnNlcmllcy5ncm91cCYmYy5zZXJpZXMuZ3JvdXAuekluZGV4KS0oZS5zZXJpZXMuZ3JvdXAmJmUuc2VyaWVzLmdyb3VwLnpJbmRleCk7Yj0wPCgwIT09YiYmZD9iOjAhPT1oP2g6MCE9PWc/ZzplLnNlcmllcy5pbmRleD5jLnNlcmllcy5pbmRleD8tMToxKX1iJiYoZT1jKX0pO3JldHVybiBlfTtlLnByb3RvdHlwZS5nZXRDaGFydENvb3JkaW5hdGVzRnJvbVBvaW50PWZ1bmN0aW9uKGMsZCl7dmFyIGE9Yy5zZXJpZXMsYj1hLnhBeGlzO2E9YS55QXhpczt2YXIgZz1jLnNoYXBlQXJncztpZihiJiZhKXt2YXIgZT1KKGMuY2xpZW50WCxjLnBsb3RYKSxmPWMucGxvdFl8fDA7Yy5pc05vZGUmJmcmJmwoZy54KSYmbChnLnkpJiYoZT1nLngsZj1nLnkpO3JldHVybiBkP3tjaGFydFg6YS5sZW4rYS5wb3MtZixjaGFydFk6Yi5sZW4rYi5wb3MtZX06e2NoYXJ0WDplK2IucG9zLGNoYXJ0WTpmK2EucG9zfX1pZihnJiZnLngmJlxuZy55KXJldHVybntjaGFydFg6Zy54LGNoYXJ0WTpnLnl9fTtlLnByb3RvdHlwZS5nZXRDaGFydFBvc2l0aW9uPWZ1bmN0aW9uKCl7aWYodGhpcy5jaGFydFBvc2l0aW9uKXJldHVybiB0aGlzLmNoYXJ0UG9zaXRpb247dmFyIGM9dGhpcy5jaGFydC5jb250YWluZXIsZD1uKGMpO3RoaXMuY2hhcnRQb3NpdGlvbj17bGVmdDpkLmxlZnQsdG9wOmQudG9wLHNjYWxlWDoxLHNjYWxlWToxfTt2YXIgYT1jLm9mZnNldFdpZHRoO2M9Yy5vZmZzZXRIZWlnaHQ7MjxhJiYyPGMmJih0aGlzLmNoYXJ0UG9zaXRpb24uc2NhbGVYPWQud2lkdGgvYSx0aGlzLmNoYXJ0UG9zaXRpb24uc2NhbGVZPWQuaGVpZ2h0L2MpO3JldHVybiB0aGlzLmNoYXJ0UG9zaXRpb259O2UucHJvdG90eXBlLmdldENvb3JkaW5hdGVzPWZ1bmN0aW9uKGMpe3ZhciBkPXt4QXhpczpbXSx5QXhpczpbXX07dGhpcy5jaGFydC5heGVzLmZvckVhY2goZnVuY3Rpb24oYSl7ZFthLmlzWEF4aXM/XCJ4QXhpc1wiOlwieUF4aXNcIl0ucHVzaCh7YXhpczphLFxudmFsdWU6YS50b1ZhbHVlKGNbYS5ob3Jpej9cImNoYXJ0WFwiOlwiY2hhcnRZXCJdKX0pfSk7cmV0dXJuIGR9O2UucHJvdG90eXBlLmdldEhvdmVyRGF0YT1mdW5jdGlvbihjLGQsYSxiLGUsZil7dmFyIGgsZz1bXTtiPSEoIWJ8fCFjKTt2YXIgcj1kJiYhZC5zdGlja3lUcmFja2luZyxsPXtjaGFydFg6Zj9mLmNoYXJ0WDp2b2lkIDAsY2hhcnRZOmY/Zi5jaGFydFk6dm9pZCAwLHNoYXJlZDplfTtrKHRoaXMsXCJiZWZvcmVHZXRIb3ZlckRhdGFcIixsKTtyPXI/W2RdOmEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBsLmZpbHRlcj9sLmZpbHRlcihhKTphLnZpc2libGUmJiEoIWUmJmEuZGlyZWN0VG91Y2gpJiZKKGEub3B0aW9ucy5lbmFibGVNb3VzZVRyYWNraW5nLCEwKSYmYS5zdGlja3lUcmFja2luZ30pO2Q9KGg9Ynx8IWY/Yzp0aGlzLmZpbmROZWFyZXN0S0RQb2ludChyLGUsZikpJiZoLnNlcmllcztoJiYoZSYmIWQubm9TaGFyZWRUb29sdGlwPyhyPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBsLmZpbHRlcj9cbmwuZmlsdGVyKGEpOmEudmlzaWJsZSYmISghZSYmYS5kaXJlY3RUb3VjaCkmJkooYS5vcHRpb25zLmVuYWJsZU1vdXNlVHJhY2tpbmcsITApJiYhYS5ub1NoYXJlZFRvb2x0aXB9KSxyLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGM9cShhLnBvaW50cyxmdW5jdGlvbihhKXtyZXR1cm4gYS54PT09aC54JiYhYS5pc051bGx9KTtOKGMpJiYoYS5jaGFydC5pc0Jvb3N0aW5nJiYoYz1hLmdldFBvaW50KGMpKSxnLnB1c2goYykpfSkpOmcucHVzaChoKSk7bD17aG92ZXJQb2ludDpofTtrKHRoaXMsXCJhZnRlckdldEhvdmVyRGF0YVwiLGwpO3JldHVybntob3ZlclBvaW50OmwuaG92ZXJQb2ludCxob3ZlclNlcmllczpkLGhvdmVyUG9pbnRzOmd9fTtlLnByb3RvdHlwZS5nZXRQb2ludEZyb21FdmVudD1mdW5jdGlvbihjKXtjPWMudGFyZ2V0O2Zvcih2YXIgZDtjJiYhZDspZD1jLnBvaW50LGM9Yy5wYXJlbnROb2RlO3JldHVybiBkfTtlLnByb3RvdHlwZS5vblRyYWNrZXJNb3VzZU91dD1mdW5jdGlvbihjKXtjPVxuYy5yZWxhdGVkVGFyZ2V0fHxjLnRvRWxlbWVudDt2YXIgZD10aGlzLmNoYXJ0LmhvdmVyU2VyaWVzO3RoaXMuaXNEaXJlY3RUb3VjaD0hMTtpZighKCFkfHwhY3x8ZC5zdGlja3lUcmFja2luZ3x8dGhpcy5pbkNsYXNzKGMsXCJoaWdoY2hhcnRzLXRvb2x0aXBcIil8fHRoaXMuaW5DbGFzcyhjLFwiaGlnaGNoYXJ0cy1zZXJpZXMtXCIrZC5pbmRleCkmJnRoaXMuaW5DbGFzcyhjLFwiaGlnaGNoYXJ0cy10cmFja2VyXCIpKSlkLm9uTW91c2VPdXQoKX07ZS5wcm90b3R5cGUuaW5DbGFzcz1mdW5jdGlvbihjLGQpe2Zvcih2YXIgYTtjOyl7aWYoYT13KGMsXCJjbGFzc1wiKSl7aWYoLTEhPT1hLmluZGV4T2YoZCkpcmV0dXJuITA7aWYoLTEhPT1hLmluZGV4T2YoXCJoaWdoY2hhcnRzLWNvbnRhaW5lclwiKSlyZXR1cm4hMX1jPWMucGFyZW50Tm9kZX19O2UucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oYyxkKXt0aGlzLm9wdGlvbnM9ZDt0aGlzLmNoYXJ0PWM7dGhpcy5ydW5DaGFydENsaWNrPSEoIWQuY2hhcnQuZXZlbnRzfHxcbiFkLmNoYXJ0LmV2ZW50cy5jbGljayk7dGhpcy5waW5jaERvd249W107dGhpcy5sYXN0VmFsaWRUb3VjaD17fTt6JiYoYy50b29sdGlwPW5ldyB6KGMsZC50b29sdGlwKSx0aGlzLmZvbGxvd1RvdWNoTW92ZT1KKGQudG9vbHRpcC5mb2xsb3dUb3VjaE1vdmUsITApKTt0aGlzLnNldERPTUV2ZW50cygpfTtlLnByb3RvdHlwZS5ub3JtYWxpemU9ZnVuY3Rpb24oYyxiKXt2YXIgYT1jLnRvdWNoZXMsaD1hP2EubGVuZ3RoP2EuaXRlbSgwKTpKKGEuY2hhbmdlZFRvdWNoZXMsYy5jaGFuZ2VkVG91Y2hlcylbMF06YztifHwoYj10aGlzLmdldENoYXJ0UG9zaXRpb24oKSk7YT1oLnBhZ2VYLWIubGVmdDtoPWgucGFnZVktYi50b3A7YS89Yi5zY2FsZVg7aC89Yi5zY2FsZVk7cmV0dXJuIGQoYyx7Y2hhcnRYOk1hdGgucm91bmQoYSksY2hhcnRZOk1hdGgucm91bmQoaCl9KX07ZS5wcm90b3R5cGUub25Db250YWluZXJDbGljaz1mdW5jdGlvbihjKXt2YXIgYj10aGlzLmNoYXJ0LGE9Yi5ob3ZlclBvaW50O1xuYz10aGlzLm5vcm1hbGl6ZShjKTt2YXIgaD1iLnBsb3RMZWZ0LGU9Yi5wbG90VG9wO2IuY2FuY2VsQ2xpY2t8fChhJiZ0aGlzLmluQ2xhc3MoYy50YXJnZXQsXCJoaWdoY2hhcnRzLXRyYWNrZXJcIik/KGsoYS5zZXJpZXMsXCJjbGlja1wiLGQoYyx7cG9pbnQ6YX0pKSxiLmhvdmVyUG9pbnQmJmEuZmlyZVBvaW50RXZlbnQoXCJjbGlja1wiLGMpKTooZChjLHRoaXMuZ2V0Q29vcmRpbmF0ZXMoYykpLGIuaXNJbnNpZGVQbG90KGMuY2hhcnRYLWgsYy5jaGFydFktZSx7dmlzaWJsZVBsb3RPbmx5OiEwfSkmJmsoYixcImNsaWNrXCIsYykpKX07ZS5wcm90b3R5cGUub25Db250YWluZXJNb3VzZURvd249ZnVuY3Rpb24oYyl7dmFyIGQ9MT09PSgoYy5idXR0b25zfHxjLmJ1dHRvbikmMSk7Yz10aGlzLm5vcm1hbGl6ZShjKTtpZihiLmlzRmlyZWZveCYmMCE9PWMuYnV0dG9uKXRoaXMub25Db250YWluZXJNb3VzZU1vdmUoYyk7aWYoXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBjLmJ1dHRvbnx8ZCl0aGlzLnpvb21PcHRpb24oYyksXG5kJiZjLnByZXZlbnREZWZhdWx0JiZjLnByZXZlbnREZWZhdWx0KCksdGhpcy5kcmFnU3RhcnQoYyl9O2UucHJvdG90eXBlLm9uQ29udGFpbmVyTW91c2VMZWF2ZT1mdW5jdGlvbihjKXt2YXIgZD1DW0ooYi5ob3ZlckNoYXJ0SW5kZXgsLTEpXSxhPXRoaXMuY2hhcnQudG9vbHRpcDtjPXRoaXMubm9ybWFsaXplKGMpO2QmJihjLnJlbGF0ZWRUYXJnZXR8fGMudG9FbGVtZW50KSYmKGQucG9pbnRlci5yZXNldCgpLGQucG9pbnRlci5jaGFydFBvc2l0aW9uPXZvaWQgMCk7YSYmIWEuaXNIaWRkZW4mJnRoaXMucmVzZXQoKX07ZS5wcm90b3R5cGUub25Db250YWluZXJNb3VzZUVudGVyPWZ1bmN0aW9uKGMpe2RlbGV0ZSB0aGlzLmNoYXJ0UG9zaXRpb259O2UucHJvdG90eXBlLm9uQ29udGFpbmVyTW91c2VNb3ZlPWZ1bmN0aW9uKGMpe3ZhciBkPXRoaXMuY2hhcnQ7Yz10aGlzLm5vcm1hbGl6ZShjKTt0aGlzLnNldEhvdmVyQ2hhcnRJbmRleCgpO2MucHJldmVudERlZmF1bHR8fChjLnJldHVyblZhbHVlPVxuITEpOyhcIm1vdXNlZG93blwiPT09ZC5tb3VzZUlzRG93bnx8dGhpcy50b3VjaFNlbGVjdChjKSkmJnRoaXMuZHJhZyhjKTtkLm9wZW5NZW51fHwhdGhpcy5pbkNsYXNzKGMudGFyZ2V0LFwiaGlnaGNoYXJ0cy10cmFja2VyXCIpJiYhZC5pc0luc2lkZVBsb3QoYy5jaGFydFgtZC5wbG90TGVmdCxjLmNoYXJ0WS1kLnBsb3RUb3Ase3Zpc2libGVQbG90T25seTohMH0pfHx0aGlzLnJ1blBvaW50QWN0aW9ucyhjKX07ZS5wcm90b3R5cGUub25Eb2N1bWVudFRvdWNoRW5kPWZ1bmN0aW9uKGMpe0NbYi5ob3ZlckNoYXJ0SW5kZXhdJiZDW2IuaG92ZXJDaGFydEluZGV4XS5wb2ludGVyLmRyb3AoYyl9O2UucHJvdG90eXBlLm9uQ29udGFpbmVyVG91Y2hNb3ZlPWZ1bmN0aW9uKGMpe2lmKHRoaXMudG91Y2hTZWxlY3QoYykpdGhpcy5vbkNvbnRhaW5lck1vdXNlTW92ZShjKTtlbHNlIHRoaXMudG91Y2goYyl9O2UucHJvdG90eXBlLm9uQ29udGFpbmVyVG91Y2hTdGFydD1mdW5jdGlvbihjKXtpZih0aGlzLnRvdWNoU2VsZWN0KGMpKXRoaXMub25Db250YWluZXJNb3VzZURvd24oYyk7XG5lbHNlIHRoaXMuem9vbU9wdGlvbihjKSx0aGlzLnRvdWNoKGMsITApfTtlLnByb3RvdHlwZS5vbkRvY3VtZW50TW91c2VNb3ZlPWZ1bmN0aW9uKGMpe3ZhciBkPXRoaXMuY2hhcnQsYT10aGlzLmNoYXJ0UG9zaXRpb247Yz10aGlzLm5vcm1hbGl6ZShjLGEpO3ZhciBiPWQudG9vbHRpcDshYXx8YiYmYi5pc1N0aWNreU9uQ29udGFjdCgpfHxkLmlzSW5zaWRlUGxvdChjLmNoYXJ0WC1kLnBsb3RMZWZ0LGMuY2hhcnRZLWQucGxvdFRvcCx7dmlzaWJsZVBsb3RPbmx5OiEwfSl8fHRoaXMuaW5DbGFzcyhjLnRhcmdldCxcImhpZ2hjaGFydHMtdHJhY2tlclwiKXx8dGhpcy5yZXNldCgpfTtlLnByb3RvdHlwZS5vbkRvY3VtZW50TW91c2VVcD1mdW5jdGlvbihjKXt2YXIgZD1DW0ooYi5ob3ZlckNoYXJ0SW5kZXgsLTEpXTtkJiZkLnBvaW50ZXIuZHJvcChjKX07ZS5wcm90b3R5cGUucGluY2g9ZnVuY3Rpb24oYyl7dmFyIGI9dGhpcyxhPWIuY2hhcnQsaD1iLnBpbmNoRG93bixlPWMudG91Y2hlc3x8XG5bXSxmPWUubGVuZ3RoLGw9Yi5sYXN0VmFsaWRUb3VjaCxtPWIuaGFzWm9vbSxrPWIuc2VsZWN0aW9uTWFya2VyLG49e30scT0xPT09ZiYmKGIuaW5DbGFzcyhjLnRhcmdldCxcImhpZ2hjaGFydHMtdHJhY2tlclwiKSYmYS5ydW5UcmFja2VyQ2xpY2t8fGIucnVuQ2hhcnRDbGljayksdT17fTsxPGYmJihiLmluaXRpYXRlZD0hMCk7bSYmYi5pbml0aWF0ZWQmJiFxJiYhMSE9PWMuY2FuY2VsYWJsZSYmYy5wcmV2ZW50RGVmYXVsdCgpO1tdLm1hcC5jYWxsKGUsZnVuY3Rpb24oYSl7cmV0dXJuIGIubm9ybWFsaXplKGEpfSk7XCJ0b3VjaHN0YXJ0XCI9PT1jLnR5cGU/KFtdLmZvckVhY2guY2FsbChlLGZ1bmN0aW9uKGEsYyl7aFtjXT17Y2hhcnRYOmEuY2hhcnRYLGNoYXJ0WTphLmNoYXJ0WX19KSxsLng9W2hbMF0uY2hhcnRYLGhbMV0mJmhbMV0uY2hhcnRYXSxsLnk9W2hbMF0uY2hhcnRZLGhbMV0mJmhbMV0uY2hhcnRZXSxhLmF4ZXMuZm9yRWFjaChmdW5jdGlvbihjKXtpZihjLnpvb21FbmFibGVkKXt2YXIgZD1cbmEuYm91bmRzW2MuaG9yaXo/XCJoXCI6XCJ2XCJdLGI9Yy5taW5QaXhlbFBhZGRpbmcsaD1jLnRvUGl4ZWxzKE1hdGgubWluKEooYy5vcHRpb25zLm1pbixjLmRhdGFNaW4pLGMuZGF0YU1pbikpLGU9Yy50b1BpeGVscyhNYXRoLm1heChKKGMub3B0aW9ucy5tYXgsYy5kYXRhTWF4KSxjLmRhdGFNYXgpKSxnPU1hdGgubWF4KGgsZSk7ZC5taW49TWF0aC5taW4oYy5wb3MsTWF0aC5taW4oaCxlKS1iKTtkLm1heD1NYXRoLm1heChjLnBvcytjLmxlbixnK2IpfX0pLGIucmVzPSEwKTpiLmZvbGxvd1RvdWNoTW92ZSYmMT09PWY/dGhpcy5ydW5Qb2ludEFjdGlvbnMoYi5ub3JtYWxpemUoYykpOmgubGVuZ3RoJiYoa3x8KGIuc2VsZWN0aW9uTWFya2VyPWs9ZCh7ZGVzdHJveTpCLHRvdWNoOiEwfSxhLnBsb3RCb3gpKSxiLnBpbmNoVHJhbnNsYXRlKGgsZSxuLGssdSxsKSxiLmhhc1BpbmNoZWQ9bSxiLnNjYWxlR3JvdXBzKG4sdSksYi5yZXMmJihiLnJlcz0hMSx0aGlzLnJlc2V0KCExLDApKSl9O2UucHJvdG90eXBlLnBpbmNoVHJhbnNsYXRlPVxuZnVuY3Rpb24oYyxkLGEsYixlLGYpe3RoaXMuem9vbUhvciYmdGhpcy5waW5jaFRyYW5zbGF0ZURpcmVjdGlvbighMCxjLGQsYSxiLGUsZik7dGhpcy56b29tVmVydCYmdGhpcy5waW5jaFRyYW5zbGF0ZURpcmVjdGlvbighMSxjLGQsYSxiLGUsZil9O2UucHJvdG90eXBlLnBpbmNoVHJhbnNsYXRlRGlyZWN0aW9uPWZ1bmN0aW9uKGMsZCxhLGIsZSxmLGwsbSl7dmFyIGg9dGhpcy5jaGFydCxnPWM/XCJ4XCI6XCJ5XCIscj1jP1wiWFwiOlwiWVwiLGs9XCJjaGFydFwiK3Isbj1jP1wid2lkdGhcIjpcImhlaWdodFwiLEE9aFtcInBsb3RcIisoYz9cIkxlZnRcIjpcIlRvcFwiKV0seSxxLHU9bXx8MSxMPWguaW52ZXJ0ZWQsRj1oLmJvdW5kc1tjP1wiaFwiOlwidlwiXSx2PTE9PT1kLmxlbmd0aCxLPWRbMF1ba10sdz1hWzBdW2tdLEU9IXYmJmRbMV1ba10seD0hdiYmYVsxXVtrXTthPWZ1bmN0aW9uKCl7XCJudW1iZXJcIj09PXR5cGVvZiB4JiYyMDxNYXRoLmFicyhLLUUpJiYodT1tfHxNYXRoLmFicyh3LXgpL01hdGguYWJzKEstRSkpO1xucT0oQS13KS91K0s7eT1oW1wicGxvdFwiKyhjP1wiV2lkdGhcIjpcIkhlaWdodFwiKV0vdX07YSgpO2Q9cTtpZihkPEYubWluKXtkPUYubWluO3ZhciBKPSEwfWVsc2UgZCt5PkYubWF4JiYoZD1GLm1heC15LEo9ITApO0o/KHctPS44Kih3LWxbZ11bMF0pLFwibnVtYmVyXCI9PT10eXBlb2YgeCYmKHgtPS44Kih4LWxbZ11bMV0pKSxhKCkpOmxbZ109W3cseF07THx8KGZbZ109cS1BLGZbbl09eSk7Zj1MPzEvdTp1O2Vbbl09eTtlW2ddPWQ7YltMP2M/XCJzY2FsZVlcIjpcInNjYWxlWFwiOlwic2NhbGVcIityXT11O2JbXCJ0cmFuc2xhdGVcIityXT1mKkErKHctZipLKX07ZS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oYyxkKXt2YXIgYT10aGlzLmNoYXJ0LGI9YS5ob3ZlclNlcmllcyxlPWEuaG92ZXJQb2ludCxnPWEuaG92ZXJQb2ludHMsZj1hLnRvb2x0aXAsbD1mJiZmLnNoYXJlZD9nOmU7YyYmbCYmRShsKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2Euc2VyaWVzLmlzQ2FydGVzaWFuJiZcInVuZGVmaW5lZFwiPT09XG50eXBlb2YgYS5wbG90WCYmKGM9ITEpfSk7aWYoYylmJiZsJiZFKGwpLmxlbmd0aCYmKGYucmVmcmVzaChsKSxmLnNoYXJlZCYmZz9nLmZvckVhY2goZnVuY3Rpb24oYSl7YS5zZXRTdGF0ZShhLnN0YXRlLCEwKTthLnNlcmllcy5pc0NhcnRlc2lhbiYmKGEuc2VyaWVzLnhBeGlzLmNyb3NzaGFpciYmYS5zZXJpZXMueEF4aXMuZHJhd0Nyb3NzaGFpcihudWxsLGEpLGEuc2VyaWVzLnlBeGlzLmNyb3NzaGFpciYmYS5zZXJpZXMueUF4aXMuZHJhd0Nyb3NzaGFpcihudWxsLGEpKX0pOmUmJihlLnNldFN0YXRlKGUuc3RhdGUsITApLGEuYXhlcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY3Jvc3NoYWlyJiZlLnNlcmllc1thLmNvbGxdPT09YSYmYS5kcmF3Q3Jvc3NoYWlyKG51bGwsZSl9KSkpO2Vsc2V7aWYoZSllLm9uTW91c2VPdXQoKTtnJiZnLmZvckVhY2goZnVuY3Rpb24oYSl7YS5zZXRTdGF0ZSgpfSk7aWYoYiliLm9uTW91c2VPdXQoKTtmJiZmLmhpZGUoZCk7dGhpcy51bkRvY01vdXNlTW92ZSYmXG4odGhpcy51bkRvY01vdXNlTW92ZT10aGlzLnVuRG9jTW91c2VNb3ZlKCkpO2EuYXhlcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuaGlkZUNyb3NzaGFpcigpfSk7dGhpcy5ob3Zlclg9YS5ob3ZlclBvaW50cz1hLmhvdmVyUG9pbnQ9bnVsbH19O2UucHJvdG90eXBlLnJ1blBvaW50QWN0aW9ucz1mdW5jdGlvbihjLGQpe3ZhciBhPXRoaXMuY2hhcnQsaD1hLnRvb2x0aXAmJmEudG9vbHRpcC5vcHRpb25zLmVuYWJsZWQ/YS50b29sdGlwOnZvaWQgMCxlPWg/aC5zaGFyZWQ6ITEsZz1kfHxhLmhvdmVyUG9pbnQsZj1nJiZnLnNlcmllc3x8YS5ob3ZlclNlcmllcztmPXRoaXMuZ2V0SG92ZXJEYXRhKGcsZixhLnNlcmllcywoIWN8fFwidG91Y2htb3ZlXCIhPT1jLnR5cGUpJiYoISFkfHxmJiZmLmRpcmVjdFRvdWNoJiZ0aGlzLmlzRGlyZWN0VG91Y2gpLGUsYyk7Zz1mLmhvdmVyUG9pbnQ7dmFyIGw9Zi5ob3ZlclBvaW50cztkPShmPWYuaG92ZXJTZXJpZXMpJiZmLnRvb2x0aXBPcHRpb25zLmZvbGxvd1BvaW50ZXImJlxuIWYudG9vbHRpcE9wdGlvbnMuc3BsaXQ7ZT1lJiZmJiYhZi5ub1NoYXJlZFRvb2x0aXA7aWYoZyYmKGchPT1hLmhvdmVyUG9pbnR8fGgmJmguaXNIaWRkZW4pKXsoYS5ob3ZlclBvaW50c3x8W10pLmZvckVhY2goZnVuY3Rpb24oYSl7LTE9PT1sLmluZGV4T2YoYSkmJmEuc2V0U3RhdGUoKX0pO2lmKGEuaG92ZXJTZXJpZXMhPT1mKWYub25Nb3VzZU92ZXIoKTt0aGlzLmFwcGx5SW5hY3RpdmVTdGF0ZShsKTsobHx8W10pLmZvckVhY2goZnVuY3Rpb24oYSl7YS5zZXRTdGF0ZShcImhvdmVyXCIpfSk7YS5ob3ZlclBvaW50JiZhLmhvdmVyUG9pbnQuZmlyZVBvaW50RXZlbnQoXCJtb3VzZU91dFwiKTtpZighZy5zZXJpZXMpcmV0dXJuO2EuaG92ZXJQb2ludHM9bDthLmhvdmVyUG9pbnQ9ZztnLmZpcmVQb2ludEV2ZW50KFwibW91c2VPdmVyXCIpO2gmJmgucmVmcmVzaChlP2w6ZyxjKX1lbHNlIGQmJmgmJiFoLmlzSGlkZGVuJiYoZz1oLmdldEFuY2hvcihbe31dLGMpLGEuaXNJbnNpZGVQbG90KGdbMF0sXG5nWzFdLHt2aXNpYmxlUGxvdE9ubHk6ITB9KSYmaC51cGRhdGVQb3NpdGlvbih7cGxvdFg6Z1swXSxwbG90WTpnWzFdfSkpO3RoaXMudW5Eb2NNb3VzZU1vdmV8fCh0aGlzLnVuRG9jTW91c2VNb3ZlPXgoYS5jb250YWluZXIub3duZXJEb2N1bWVudCxcIm1vdXNlbW92ZVwiLGZ1bmN0aW9uKGEpe3ZhciBjPUNbYi5ob3ZlckNoYXJ0SW5kZXhdO2lmKGMpYy5wb2ludGVyLm9uRG9jdW1lbnRNb3VzZU1vdmUoYSl9KSx0aGlzLmV2ZW50c1RvVW5iaW5kLnB1c2godGhpcy51bkRvY01vdXNlTW92ZSkpO2EuYXhlcy5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBiPUooKGQuY3Jvc3NoYWlyfHx7fSkuc25hcCwhMCksaDtiJiYoKGg9YS5ob3ZlclBvaW50KSYmaC5zZXJpZXNbZC5jb2xsXT09PWR8fChoPXEobCxmdW5jdGlvbihhKXtyZXR1cm4gYS5zZXJpZXNbZC5jb2xsXT09PWR9KSkpO2h8fCFiP2QuZHJhd0Nyb3NzaGFpcihjLGgpOmQuaGlkZUNyb3NzaGFpcigpfSl9O2UucHJvdG90eXBlLnNjYWxlR3JvdXBzPVxuZnVuY3Rpb24oYyxkKXt2YXIgYT10aGlzLmNoYXJ0LGI7YS5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihoKXtiPWN8fGguZ2V0UGxvdEJveCgpO2gueEF4aXMmJmgueEF4aXMuem9vbUVuYWJsZWQmJmguZ3JvdXAmJihoLmdyb3VwLmF0dHIoYiksaC5tYXJrZXJHcm91cCYmKGgubWFya2VyR3JvdXAuYXR0cihiKSxoLm1hcmtlckdyb3VwLmNsaXAoZD9hLmNsaXBSZWN0Om51bGwpKSxoLmRhdGFMYWJlbHNHcm91cCYmaC5kYXRhTGFiZWxzR3JvdXAuYXR0cihiKSl9KTthLmNsaXBSZWN0LmF0dHIoZHx8YS5jbGlwQm94KX07ZS5wcm90b3R5cGUuc2V0RE9NRXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGM9dGhpcyxkPXRoaXMuY2hhcnQuY29udGFpbmVyLGE9ZC5vd25lckRvY3VtZW50O2Qub25tb3VzZWRvd249dGhpcy5vbkNvbnRhaW5lck1vdXNlRG93bi5iaW5kKHRoaXMpO2Qub25tb3VzZW1vdmU9dGhpcy5vbkNvbnRhaW5lck1vdXNlTW92ZS5iaW5kKHRoaXMpO2Qub25jbGljaz10aGlzLm9uQ29udGFpbmVyQ2xpY2suYmluZCh0aGlzKTtcbnRoaXMuZXZlbnRzVG9VbmJpbmQucHVzaCh4KGQsXCJtb3VzZWVudGVyXCIsdGhpcy5vbkNvbnRhaW5lck1vdXNlRW50ZXIuYmluZCh0aGlzKSkpO3RoaXMuZXZlbnRzVG9VbmJpbmQucHVzaCh4KGQsXCJtb3VzZWxlYXZlXCIsdGhpcy5vbkNvbnRhaW5lck1vdXNlTGVhdmUuYmluZCh0aGlzKSkpO2IudW5iaW5kRG9jdW1lbnRNb3VzZVVwfHwoYi51bmJpbmREb2N1bWVudE1vdXNlVXA9eChhLFwibW91c2V1cFwiLHRoaXMub25Eb2N1bWVudE1vdXNlVXAuYmluZCh0aGlzKSkpO2Zvcih2YXIgaD10aGlzLmNoYXJ0LnJlbmRlclRvLnBhcmVudEVsZW1lbnQ7aCYmXCJCT0RZXCIhPT1oLnRhZ05hbWU7KXRoaXMuZXZlbnRzVG9VbmJpbmQucHVzaCh4KGgsXCJzY3JvbGxcIixmdW5jdGlvbigpe2RlbGV0ZSBjLmNoYXJ0UG9zaXRpb259KSksaD1oLnBhcmVudEVsZW1lbnQ7Yi5oYXNUb3VjaCYmKHRoaXMuZXZlbnRzVG9VbmJpbmQucHVzaCh4KGQsXCJ0b3VjaHN0YXJ0XCIsdGhpcy5vbkNvbnRhaW5lclRvdWNoU3RhcnQuYmluZCh0aGlzKSxcbntwYXNzaXZlOiExfSkpLHRoaXMuZXZlbnRzVG9VbmJpbmQucHVzaCh4KGQsXCJ0b3VjaG1vdmVcIix0aGlzLm9uQ29udGFpbmVyVG91Y2hNb3ZlLmJpbmQodGhpcykse3Bhc3NpdmU6ITF9KSksYi51bmJpbmREb2N1bWVudFRvdWNoRW5kfHwoYi51bmJpbmREb2N1bWVudFRvdWNoRW5kPXgoYSxcInRvdWNoZW5kXCIsdGhpcy5vbkRvY3VtZW50VG91Y2hFbmQuYmluZCh0aGlzKSx7cGFzc2l2ZTohMX0pKSl9O2UucHJvdG90eXBlLnNldEhvdmVyQ2hhcnRJbmRleD1mdW5jdGlvbigpe3ZhciBjPXRoaXMuY2hhcnQsZD1iLmNoYXJ0c1tKKGIuaG92ZXJDaGFydEluZGV4LC0xKV07aWYoZCYmZCE9PWMpZC5wb2ludGVyLm9uQ29udGFpbmVyTW91c2VMZWF2ZSh7cmVsYXRlZFRhcmdldDohMH0pO2QmJmQubW91c2VJc0Rvd258fChiLmhvdmVyQ2hhcnRJbmRleD1jLmluZGV4KX07ZS5wcm90b3R5cGUudG91Y2g9ZnVuY3Rpb24oYyxkKXt2YXIgYT10aGlzLmNoYXJ0LGI7dGhpcy5zZXRIb3ZlckNoYXJ0SW5kZXgoKTtcbmlmKDE9PT1jLnRvdWNoZXMubGVuZ3RoKWlmKGM9dGhpcy5ub3JtYWxpemUoYyksKGI9YS5pc0luc2lkZVBsb3QoYy5jaGFydFgtYS5wbG90TGVmdCxjLmNoYXJ0WS1hLnBsb3RUb3Ase3Zpc2libGVQbG90T25seTohMH0pKSYmIWEub3Blbk1lbnUpe2QmJnRoaXMucnVuUG9pbnRBY3Rpb25zKGMpO2lmKFwidG91Y2htb3ZlXCI9PT1jLnR5cGUpe2Q9dGhpcy5waW5jaERvd247dmFyIGU9ZFswXT80PD1NYXRoLnNxcnQoTWF0aC5wb3coZFswXS5jaGFydFgtYy5jaGFydFgsMikrTWF0aC5wb3coZFswXS5jaGFydFktYy5jaGFydFksMikpOiExfUooZSwhMCkmJnRoaXMucGluY2goYyl9ZWxzZSBkJiZ0aGlzLnJlc2V0KCk7ZWxzZSAyPT09Yy50b3VjaGVzLmxlbmd0aCYmdGhpcy5waW5jaChjKX07ZS5wcm90b3R5cGUudG91Y2hTZWxlY3Q9ZnVuY3Rpb24oYyl7cmV0dXJuISghdGhpcy5jaGFydC5vcHRpb25zLmNoYXJ0Lnpvb21CeVNpbmdsZVRvdWNofHwhYy50b3VjaGVzfHwxIT09Yy50b3VjaGVzLmxlbmd0aCl9O1xuZS5wcm90b3R5cGUuem9vbU9wdGlvbj1mdW5jdGlvbihjKXt2YXIgZD10aGlzLmNoYXJ0LGE9ZC5vcHRpb25zLmNoYXJ0LGI9YS56b29tVHlwZXx8XCJcIjtkPWQuaW52ZXJ0ZWQ7L3RvdWNoLy50ZXN0KGMudHlwZSkmJihiPUooYS5waW5jaFR5cGUsYikpO3RoaXMuem9vbVg9Yz0veC8udGVzdChiKTt0aGlzLnpvb21ZPWI9L3kvLnRlc3QoYik7dGhpcy56b29tSG9yPWMmJiFkfHxiJiZkO3RoaXMuem9vbVZlcnQ9YiYmIWR8fGMmJmQ7dGhpcy5oYXNab29tPWN8fGJ9O3JldHVybiBlfSgpO3JldHVybiBiLlBvaW50ZXI9ZX0pO08oZSxcIkNvcmUvTVNQb2ludGVyLmpzXCIsW2VbXCJDb3JlL0dsb2JhbHMuanNcIl0sZVtcIkNvcmUvUG9pbnRlci5qc1wiXSxlW1wiQ29yZS9VdGlsaXRpZXMuanNcIl1dLGZ1bmN0aW9uKGUsYixJKXtmdW5jdGlvbiBEKCl7dmFyIGQ9W107ZC5pdGVtPWZ1bmN0aW9uKGQpe3JldHVybiB0aGlzW2RdfTtmKHEsZnVuY3Rpb24oYil7ZC5wdXNoKHtwYWdlWDpiLnBhZ2VYLHBhZ2VZOmIucGFnZVksXG50YXJnZXQ6Yi50YXJnZXR9KX0pO3JldHVybiBkfWZ1bmN0aW9uIEgoZCxiLGYsayl7XCJ0b3VjaFwiIT09ZC5wb2ludGVyVHlwZSYmZC5wb2ludGVyVHlwZSE9PWQuTVNQT0lOVEVSX1RZUEVfVE9VQ0h8fCFDW2UuaG92ZXJDaGFydEluZGV4XXx8KGsoZCksaz1DW2UuaG92ZXJDaGFydEluZGV4XS5wb2ludGVyLGtbYl0oe3R5cGU6Zix0YXJnZXQ6ZC5jdXJyZW50VGFyZ2V0LHByZXZlbnREZWZhdWx0OngsdG91Y2hlczpEKCl9KSl9dmFyIEc9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKCl7dmFyIGQ9ZnVuY3Rpb24oYixlKXtkPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihkLGIpe2QuX19wcm90b19fPWJ9fHxmdW5jdGlvbihkLGIpe2Zvcih2YXIgZSBpbiBiKWIuaGFzT3duUHJvcGVydHkoZSkmJihkW2VdPWJbZV0pfTtyZXR1cm4gZChiLGUpfTtyZXR1cm4gZnVuY3Rpb24oYixlKXtmdW5jdGlvbiBmKCl7dGhpcy5jb25zdHJ1Y3Rvcj1cbmJ9ZChiLGUpO2IucHJvdG90eXBlPW51bGw9PT1lP09iamVjdC5jcmVhdGUoZSk6KGYucHJvdG90eXBlPWUucHJvdG90eXBlLG5ldyBmKX19KCksQz1lLmNoYXJ0cyxCPWUuZG9jLHg9ZS5ub29wLHc9SS5hZGRFdmVudCx2PUkuY3NzLGY9SS5vYmplY3RFYWNoLGQ9SS5yZW1vdmVFdmVudCxxPXt9LGs9ISFlLndpbi5Qb2ludGVyRXZlbnQ7cmV0dXJuIGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PWImJmIuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfUcoZSxiKTtlLnByb3RvdHlwZS5iYXRjaE1TRXZlbnRzPWZ1bmN0aW9uKGQpe2QodGhpcy5jaGFydC5jb250YWluZXIsaz9cInBvaW50ZXJkb3duXCI6XCJNU1BvaW50ZXJEb3duXCIsdGhpcy5vbkNvbnRhaW5lclBvaW50ZXJEb3duKTtkKHRoaXMuY2hhcnQuY29udGFpbmVyLGs/XCJwb2ludGVybW92ZVwiOlwiTVNQb2ludGVyTW92ZVwiLHRoaXMub25Db250YWluZXJQb2ludGVyTW92ZSk7ZChCLGs/XCJwb2ludGVydXBcIjpcblwiTVNQb2ludGVyVXBcIix0aGlzLm9uRG9jdW1lbnRQb2ludGVyVXApfTtlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5iYXRjaE1TRXZlbnRzKGQpO2IucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKX07ZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihkLGUpe2IucHJvdG90eXBlLmluaXQuY2FsbCh0aGlzLGQsZSk7dGhpcy5oYXNab29tJiZ2KGQuY29udGFpbmVyLHtcIi1tcy10b3VjaC1hY3Rpb25cIjpcIm5vbmVcIixcInRvdWNoLWFjdGlvblwiOlwibm9uZVwifSl9O2UucHJvdG90eXBlLm9uQ29udGFpbmVyUG9pbnRlckRvd249ZnVuY3Rpb24oZCl7SChkLFwib25Db250YWluZXJUb3VjaFN0YXJ0XCIsXCJ0b3VjaHN0YXJ0XCIsZnVuY3Rpb24oZCl7cVtkLnBvaW50ZXJJZF09e3BhZ2VYOmQucGFnZVgscGFnZVk6ZC5wYWdlWSx0YXJnZXQ6ZC5jdXJyZW50VGFyZ2V0fX0pfTtlLnByb3RvdHlwZS5vbkNvbnRhaW5lclBvaW50ZXJNb3ZlPWZ1bmN0aW9uKGQpe0goZCxcIm9uQ29udGFpbmVyVG91Y2hNb3ZlXCIsXG5cInRvdWNobW92ZVwiLGZ1bmN0aW9uKGQpe3FbZC5wb2ludGVySWRdPXtwYWdlWDpkLnBhZ2VYLHBhZ2VZOmQucGFnZVl9O3FbZC5wb2ludGVySWRdLnRhcmdldHx8KHFbZC5wb2ludGVySWRdLnRhcmdldD1kLmN1cnJlbnRUYXJnZXQpfSl9O2UucHJvdG90eXBlLm9uRG9jdW1lbnRQb2ludGVyVXA9ZnVuY3Rpb24oZCl7SChkLFwib25Eb2N1bWVudFRvdWNoRW5kXCIsXCJ0b3VjaGVuZFwiLGZ1bmN0aW9uKGQpe2RlbGV0ZSBxW2QucG9pbnRlcklkXX0pfTtlLnByb3RvdHlwZS5zZXRET01FdmVudHM9ZnVuY3Rpb24oKXtiLnByb3RvdHlwZS5zZXRET01FdmVudHMuY2FsbCh0aGlzKTsodGhpcy5oYXNab29tfHx0aGlzLmZvbGxvd1RvdWNoTW92ZSkmJnRoaXMuYmF0Y2hNU0V2ZW50cyh3KX07cmV0dXJuIGV9KGIpfSk7TyhlLFwiQ29yZS9TZXJpZXMvUG9pbnQuanNcIixbZVtcIkNvcmUvUmVuZGVyZXIvSFRNTC9BU1QuanNcIl0sZVtcIkNvcmUvQW5pbWF0aW9uL0FuaW1hdGlvblV0aWxpdGllcy5qc1wiXSxcbmVbXCJDb3JlL0Zvcm1hdFV0aWxpdGllcy5qc1wiXSxlW1wiQ29yZS9HbG9iYWxzLmpzXCJdLGVbXCJDb3JlL09wdGlvbnMuanNcIl0sZVtcIkNvcmUvVXRpbGl0aWVzLmpzXCJdXSxmdW5jdGlvbihlLGIsSSx6LEgsRyl7dmFyIEQ9Yi5hbmltT2JqZWN0LEI9SS5mb3JtYXQseD1ILmRlZmF1bHRPcHRpb25zLHc9Ry5hZGRFdmVudCx2PUcuZGVmaW5lZCxmPUcuZXJhc2UsZD1HLmV4dGVuZCxxPUcuZmlyZUV2ZW50LGs9Ry5nZXROZXN0ZWRQcm9wZXJ0eSxsPUcuaXNBcnJheSxOPUcuaXNGdW5jdGlvbix1PUcuaXNOdW1iZXIsbj1HLmlzT2JqZWN0LEo9Ry5tZXJnZSxFPUcub2JqZWN0RWFjaCxtPUcucGljayxjPUcuc3luY1RpbWVvdXQsZz1HLnJlbW92ZUV2ZW50LGE9Ry51bmlxdWVLZXk7XCJcIjtiPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe3RoaXMuY29sb3JJbmRleD10aGlzLmNhdGVnb3J5PXZvaWQgMDt0aGlzLmZvcm1hdFByZWZpeD1cInBvaW50XCI7dGhpcy5pZD12b2lkIDA7dGhpcy5pc051bGw9ITE7XG50aGlzLnBlcmNlbnRhZ2U9dGhpcy5vcHRpb25zPXRoaXMubmFtZT12b2lkIDA7dGhpcy5zZWxlY3RlZD0hMTt0aGlzLnRvdGFsPXRoaXMuc2VyaWVzPXZvaWQgMDt0aGlzLnZpc2libGU9ITA7dGhpcy54PXZvaWQgMH1iLnByb3RvdHlwZS5hbmltYXRlQmVmb3JlRGVzdHJveT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYz17eDphLnN0YXJ0WFBvcyxvcGFjaXR5OjB9LGIsZT1hLmdldEdyYXBoaWNhbFByb3BzKCk7ZS5zaW5ndWxhci5mb3JFYWNoKGZ1bmN0aW9uKGQpe2I9XCJkYXRhTGFiZWxcIj09PWQ7YVtkXT1hW2RdLmFuaW1hdGUoYj97eDphW2RdLnN0YXJ0WFBvcyx5OmFbZF0uc3RhcnRZUG9zLG9wYWNpdHk6MH06Yyl9KTtlLnBsdXJhbC5mb3JFYWNoKGZ1bmN0aW9uKGMpe2FbY10uZm9yRWFjaChmdW5jdGlvbihjKXtjLmVsZW1lbnQmJmMuYW5pbWF0ZShkKHt4OmEuc3RhcnRYUG9zfSxjLnN0YXJ0WVBvcz97eDpjLnN0YXJ0WFBvcyx5OmMuc3RhcnRZUG9zfTp7fSkpfSl9KX07Yi5wcm90b3R5cGUuYXBwbHlPcHRpb25zPVxuZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLnNlcmllcyxoPWUub3B0aW9ucy5wb2ludFZhbEtleXx8ZS5wb2ludFZhbEtleTthPWIucHJvdG90eXBlLm9wdGlvbnNUb09iamVjdC5jYWxsKHRoaXMsYSk7ZCh0aGlzLGEpO3RoaXMub3B0aW9ucz10aGlzLm9wdGlvbnM/ZCh0aGlzLm9wdGlvbnMsYSk6YTthLmdyb3VwJiZkZWxldGUgdGhpcy5ncm91cDthLmRhdGFMYWJlbHMmJmRlbGV0ZSB0aGlzLmRhdGFMYWJlbHM7aCYmKHRoaXMueT1iLnByb3RvdHlwZS5nZXROZXN0ZWRQcm9wZXJ0eS5jYWxsKHRoaXMsaCkpO3RoaXMuZm9ybWF0UHJlZml4PSh0aGlzLmlzTnVsbD1tKHRoaXMuaXNWYWxpZCYmIXRoaXMuaXNWYWxpZCgpLG51bGw9PT10aGlzLnh8fCF1KHRoaXMueSkpKT9cIm51bGxcIjpcInBvaW50XCI7dGhpcy5zZWxlY3RlZCYmKHRoaXMuc3RhdGU9XCJzZWxlY3RcIik7XCJuYW1lXCJpbiB0aGlzJiZcInVuZGVmaW5lZFwiPT09dHlwZW9mIGMmJmUueEF4aXMmJmUueEF4aXMuaGFzTmFtZXMmJih0aGlzLng9XG5lLnhBeGlzLm5hbWVUb1godGhpcykpO1widW5kZWZpbmVkXCI9PT10eXBlb2YgdGhpcy54JiZlJiYodGhpcy54PVwidW5kZWZpbmVkXCI9PT10eXBlb2YgYz9lLmF1dG9JbmNyZW1lbnQodGhpcyk6Yyk7cmV0dXJuIHRoaXN9O2IucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7aWYoZC5ncmFwaGljfHxkLmRhdGFMYWJlbHx8ZC5kYXRhTGFiZWxzKWcoZCksZC5kZXN0cm95RWxlbWVudHMoKTtmb3IobSBpbiBkKWRbbV09bnVsbH12YXIgZD10aGlzLGI9ZC5zZXJpZXMsZT1iLmNoYXJ0O2I9Yi5vcHRpb25zLmRhdGFTb3J0aW5nO3ZhciBoPWUuaG92ZXJQb2ludHMsbD1EKGQuc2VyaWVzLmNoYXJ0LnJlbmRlcmVyLmdsb2JhbEFuaW1hdGlvbiksbTtkLmxlZ2VuZEl0ZW0mJmUubGVnZW5kLmRlc3Ryb3lJdGVtKGQpO2gmJihkLnNldFN0YXRlKCksZihoLGQpLGgubGVuZ3RofHwoZS5ob3ZlclBvaW50cz1udWxsKSk7aWYoZD09PWUuaG92ZXJQb2ludClkLm9uTW91c2VPdXQoKTtcbmImJmIuZW5hYmxlZD8odGhpcy5hbmltYXRlQmVmb3JlRGVzdHJveSgpLGMoYSxsLmR1cmF0aW9uKSk6YSgpO2UucG9pbnRDb3VudC0tfTtiLnByb3RvdHlwZS5kZXN0cm95RWxlbWVudHM9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpczthPWMuZ2V0R3JhcGhpY2FsUHJvcHMoYSk7YS5zaW5ndWxhci5mb3JFYWNoKGZ1bmN0aW9uKGEpe2NbYV09Y1thXS5kZXN0cm95KCl9KTthLnBsdXJhbC5mb3JFYWNoKGZ1bmN0aW9uKGEpe2NbYV0uZm9yRWFjaChmdW5jdGlvbihhKXthLmVsZW1lbnQmJmEuZGVzdHJveSgpfSk7ZGVsZXRlIGNbYV19KX07Yi5wcm90b3R5cGUuZmlyZVBvaW50RXZlbnQ9ZnVuY3Rpb24oYSxjLGQpe3ZhciBiPXRoaXMsZT10aGlzLnNlcmllcy5vcHRpb25zOyhlLnBvaW50LmV2ZW50c1thXXx8Yi5vcHRpb25zJiZiLm9wdGlvbnMuZXZlbnRzJiZiLm9wdGlvbnMuZXZlbnRzW2FdKSYmYi5pbXBvcnRFdmVudHMoKTtcImNsaWNrXCI9PT1hJiZlLmFsbG93UG9pbnRTZWxlY3QmJihkPVxuZnVuY3Rpb24oYSl7Yi5zZWxlY3QmJmIuc2VsZWN0KG51bGwsYS5jdHJsS2V5fHxhLm1ldGFLZXl8fGEuc2hpZnRLZXkpfSk7cShiLGEsYyxkKX07Yi5wcm90b3R5cGUuZ2V0Q2xhc3NOYW1lPWZ1bmN0aW9uKCl7cmV0dXJuXCJoaWdoY2hhcnRzLXBvaW50XCIrKHRoaXMuc2VsZWN0ZWQ/XCIgaGlnaGNoYXJ0cy1wb2ludC1zZWxlY3RcIjpcIlwiKSsodGhpcy5uZWdhdGl2ZT9cIiBoaWdoY2hhcnRzLW5lZ2F0aXZlXCI6XCJcIikrKHRoaXMuaXNOdWxsP1wiIGhpZ2hjaGFydHMtbnVsbC1wb2ludFwiOlwiXCIpKyhcInVuZGVmaW5lZFwiIT09dHlwZW9mIHRoaXMuY29sb3JJbmRleD9cIiBoaWdoY2hhcnRzLWNvbG9yLVwiK3RoaXMuY29sb3JJbmRleDpcIlwiKSsodGhpcy5vcHRpb25zLmNsYXNzTmFtZT9cIiBcIit0aGlzLm9wdGlvbnMuY2xhc3NOYW1lOlwiXCIpKyh0aGlzLnpvbmUmJnRoaXMuem9uZS5jbGFzc05hbWU/XCIgXCIrdGhpcy56b25lLmNsYXNzTmFtZS5yZXBsYWNlKFwiaGlnaGNoYXJ0cy1uZWdhdGl2ZVwiLFwiXCIpOlwiXCIpfTtcbmIucHJvdG90eXBlLmdldEdyYXBoaWNhbFByb3BzPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMsZD1bXSxiLGU9e3Npbmd1bGFyOltdLHBsdXJhbDpbXX07YT1hfHx7Z3JhcGhpYzoxLGRhdGFMYWJlbDoxfTthLmdyYXBoaWMmJmQucHVzaChcImdyYXBoaWNcIixcInVwcGVyR3JhcGhpY1wiLFwic2hhZG93R3JvdXBcIik7YS5kYXRhTGFiZWwmJmQucHVzaChcImRhdGFMYWJlbFwiLFwiZGF0YUxhYmVsVXBwZXJcIixcImNvbm5lY3RvclwiKTtmb3IoYj1kLmxlbmd0aDtiLS07KXt2YXIgaD1kW2JdO2NbaF0mJmUuc2luZ3VsYXIucHVzaChoKX1bXCJkYXRhTGFiZWxcIixcImNvbm5lY3RvclwiXS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBiPWQrXCJzXCI7YVtkXSYmY1tiXSYmZS5wbHVyYWwucHVzaChiKX0pO3JldHVybiBlfTtiLnByb3RvdHlwZS5nZXRMYWJlbENvbmZpZz1mdW5jdGlvbigpe3JldHVybnt4OnRoaXMuY2F0ZWdvcnkseTp0aGlzLnksY29sb3I6dGhpcy5jb2xvcixjb2xvckluZGV4OnRoaXMuY29sb3JJbmRleCxcbmtleTp0aGlzLm5hbWV8fHRoaXMuY2F0ZWdvcnksc2VyaWVzOnRoaXMuc2VyaWVzLHBvaW50OnRoaXMscGVyY2VudGFnZTp0aGlzLnBlcmNlbnRhZ2UsdG90YWw6dGhpcy50b3RhbHx8dGhpcy5zdGFja1RvdGFsfX07Yi5wcm90b3R5cGUuZ2V0TmVzdGVkUHJvcGVydHk9ZnVuY3Rpb24oYSl7aWYoYSlyZXR1cm4gMD09PWEuaW5kZXhPZihcImN1c3RvbS5cIik/ayhhLHRoaXMub3B0aW9ucyk6dGhpc1thXX07Yi5wcm90b3R5cGUuZ2V0Wm9uZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuc2VyaWVzLGM9YS56b25lczthPWEuem9uZUF4aXN8fFwieVwiO3ZhciBkPTAsYjtmb3IoYj1jW2RdO3RoaXNbYV0+PWIudmFsdWU7KWI9Y1srK2RdO3RoaXMubm9uWm9uZWRDb2xvcnx8KHRoaXMubm9uWm9uZWRDb2xvcj10aGlzLmNvbG9yKTt0aGlzLmNvbG9yPWImJmIuY29sb3ImJiF0aGlzLm9wdGlvbnMuY29sb3I/Yi5jb2xvcjp0aGlzLm5vblpvbmVkQ29sb3I7cmV0dXJuIGJ9O2IucHJvdG90eXBlLmhhc05ld1NoYXBlVHlwZT1cbmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuZ3JhcGhpYyYmKHRoaXMuZ3JhcGhpYy5zeW1ib2xOYW1lfHx0aGlzLmdyYXBoaWMuZWxlbWVudC5ub2RlTmFtZSkpIT09dGhpcy5zaGFwZVR5cGV9O2IucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oYyxkLGIpe3RoaXMuc2VyaWVzPWM7dGhpcy5hcHBseU9wdGlvbnMoZCxiKTt0aGlzLmlkPXYodGhpcy5pZCk/dGhpcy5pZDphKCk7dGhpcy5yZXNvbHZlQ29sb3IoKTtjLmNoYXJ0LnBvaW50Q291bnQrKztxKHRoaXMsXCJhZnRlckluaXRcIik7cmV0dXJuIHRoaXN9O2IucHJvdG90eXBlLm9wdGlvbnNUb09iamVjdD1mdW5jdGlvbihhKXt2YXIgYz17fSxkPXRoaXMuc2VyaWVzLGU9ZC5vcHRpb25zLmtleXMsaD1lfHxkLnBvaW50QXJyYXlNYXB8fFtcInlcIl0sZz1oLmxlbmd0aCxmPTAscj0wO2lmKHUoYSl8fG51bGw9PT1hKWNbaFswXV09YTtlbHNlIGlmKGwoYSkpZm9yKCFlJiZhLmxlbmd0aD5nJiYoZD10eXBlb2YgYVswXSxcInN0cmluZ1wiPT09ZD9jLm5hbWU9XG5hWzBdOlwibnVtYmVyXCI9PT1kJiYoYy54PWFbMF0pLGYrKyk7cjxnOyllJiZcInVuZGVmaW5lZFwiPT09dHlwZW9mIGFbZl18fCgwPGhbcl0uaW5kZXhPZihcIi5cIik/Yi5wcm90b3R5cGUuc2V0TmVzdGVkUHJvcGVydHkoYyxhW2ZdLGhbcl0pOmNbaFtyXV09YVtmXSksZisrLHIrKztlbHNlXCJvYmplY3RcIj09PXR5cGVvZiBhJiYoYz1hLGEuZGF0YUxhYmVscyYmKGQuX2hhc1BvaW50TGFiZWxzPSEwKSxhLm1hcmtlciYmKGQuX2hhc1BvaW50TWFya2Vycz0hMCkpO3JldHVybiBjfTtiLnByb3RvdHlwZS5yZXNvbHZlQ29sb3I9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNlcmllczt2YXIgYz1hLmNoYXJ0Lm9wdGlvbnMuY2hhcnQuY29sb3JDb3VudDt2YXIgZD1hLmNoYXJ0LnN0eWxlZE1vZGU7ZGVsZXRlIHRoaXMubm9uWm9uZWRDb2xvcjtpZihhLm9wdGlvbnMuY29sb3JCeVBvaW50KXtpZighZCl7Yz1hLm9wdGlvbnMuY29sb3JzfHxhLmNoYXJ0Lm9wdGlvbnMuY29sb3JzO3ZhciBiPWNbYS5jb2xvckNvdW50ZXJdO1xuYz1jLmxlbmd0aH1kPWEuY29sb3JDb3VudGVyO2EuY29sb3JDb3VudGVyKys7YS5jb2xvckNvdW50ZXI9PT1jJiYoYS5jb2xvckNvdW50ZXI9MCl9ZWxzZSBkfHwoYj1hLmNvbG9yKSxkPWEuY29sb3JJbmRleDt0aGlzLmNvbG9ySW5kZXg9bSh0aGlzLm9wdGlvbnMuY29sb3JJbmRleCxkKTt0aGlzLmNvbG9yPW0odGhpcy5vcHRpb25zLmNvbG9yLGIpfTtiLnByb3RvdHlwZS5zZXROZXN0ZWRQcm9wZXJ0eT1mdW5jdGlvbihhLGMsZCl7ZC5zcGxpdChcIi5cIikucmVkdWNlKGZ1bmN0aW9uKGEsZCxiLGUpe2FbZF09ZS5sZW5ndGgtMT09PWI/YzpuKGFbZF0sITApP2FbZF06e307cmV0dXJuIGFbZF19LGEpO3JldHVybiBhfTtiLnByb3RvdHlwZS50b29sdGlwRm9ybWF0dGVyPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuc2VyaWVzLGQ9Yy50b29sdGlwT3B0aW9ucyxiPW0oZC52YWx1ZURlY2ltYWxzLFwiXCIpLGU9ZC52YWx1ZVByZWZpeHx8XCJcIixoPWQudmFsdWVTdWZmaXh8fFwiXCI7Yy5jaGFydC5zdHlsZWRNb2RlJiZcbihhPWMuY2hhcnQudG9vbHRpcC5zdHlsZWRNb2RlRm9ybWF0KGEpKTsoYy5wb2ludEFycmF5TWFwfHxbXCJ5XCJdKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2M9XCJ7cG9pbnQuXCIrYztpZihlfHxoKWE9YS5yZXBsYWNlKFJlZ0V4cChjK1wifVwiLFwiZ1wiKSxlK2MrXCJ9XCIraCk7YT1hLnJlcGxhY2UoUmVnRXhwKGMrXCJ9XCIsXCJnXCIpLGMrXCI6LC5cIitiK1wiZn1cIil9KTtyZXR1cm4gQihhLHtwb2ludDp0aGlzLHNlcmllczp0aGlzLnNlcmllc30sYy5jaGFydCl9O2IucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihhLGMsZCxiKXtmdW5jdGlvbiBlKCl7aC5hcHBseU9wdGlvbnMoYSk7dmFyIGI9ZiYmaC5oYXNEdW1teUdyYXBoaWM7Yj1udWxsPT09aC55PyFiOmI7ZiYmYiYmKGguZ3JhcGhpYz1mLmRlc3Ryb3koKSxkZWxldGUgaC5oYXNEdW1teUdyYXBoaWMpO24oYSwhMCkmJihmJiZmLmVsZW1lbnQmJmEmJmEubWFya2VyJiZcInVuZGVmaW5lZFwiIT09dHlwZW9mIGEubWFya2VyLnN5bWJvbCYmKGguZ3JhcGhpYz1cbmYuZGVzdHJveSgpKSxhJiZhLmRhdGFMYWJlbHMmJmguZGF0YUxhYmVsJiYoaC5kYXRhTGFiZWw9aC5kYXRhTGFiZWwuZGVzdHJveSgpKSxoLmNvbm5lY3RvciYmKGguY29ubmVjdG9yPWguY29ubmVjdG9yLmRlc3Ryb3koKSkpO3I9aC5pbmRleDtnLnVwZGF0ZVBhcmFsbGVsQXJyYXlzKGgscik7ay5kYXRhW3JdPW4oay5kYXRhW3JdLCEwKXx8bihhLCEwKT9oLm9wdGlvbnM6bShhLGsuZGF0YVtyXSk7Zy5pc0RpcnR5PWcuaXNEaXJ0eURhdGE9ITA7IWcuZml4ZWRCb3gmJmcuaGFzQ2FydGVzaWFuU2VyaWVzJiYobC5pc0RpcnR5Qm94PSEwKTtcInBvaW50XCI9PT1rLmxlZ2VuZFR5cGUmJihsLmlzRGlydHlMZWdlbmQ9ITApO2MmJmwucmVkcmF3KGQpfXZhciBoPXRoaXMsZz1oLnNlcmllcyxmPWguZ3JhcGhpYyxyLGw9Zy5jaGFydCxrPWcub3B0aW9ucztjPW0oYywhMCk7ITE9PT1iP2UoKTpoLmZpcmVQb2ludEV2ZW50KFwidXBkYXRlXCIse29wdGlvbnM6YX0sZSl9O2IucHJvdG90eXBlLnJlbW92ZT1cbmZ1bmN0aW9uKGEsYyl7dGhpcy5zZXJpZXMucmVtb3ZlUG9pbnQodGhpcy5zZXJpZXMuZGF0YS5pbmRleE9mKHRoaXMpLGEsYyl9O2IucHJvdG90eXBlLnNlbGVjdD1mdW5jdGlvbihhLGMpe3ZhciBkPXRoaXMsYj1kLnNlcmllcyxlPWIuY2hhcnQ7dGhpcy5zZWxlY3RlZFN0YWdpbmc9YT1tKGEsIWQuc2VsZWN0ZWQpO2QuZmlyZVBvaW50RXZlbnQoYT9cInNlbGVjdFwiOlwidW5zZWxlY3RcIix7YWNjdW11bGF0ZTpjfSxmdW5jdGlvbigpe2Quc2VsZWN0ZWQ9ZC5vcHRpb25zLnNlbGVjdGVkPWE7Yi5vcHRpb25zLmRhdGFbYi5kYXRhLmluZGV4T2YoZCldPWQub3B0aW9ucztkLnNldFN0YXRlKGEmJlwic2VsZWN0XCIpO2N8fGUuZ2V0U2VsZWN0ZWRQb2ludHMoKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBjPWEuc2VyaWVzO2Euc2VsZWN0ZWQmJmEhPT1kJiYoYS5zZWxlY3RlZD1hLm9wdGlvbnMuc2VsZWN0ZWQ9ITEsYy5vcHRpb25zLmRhdGFbYy5kYXRhLmluZGV4T2YoYSldPWEub3B0aW9ucyxcbmEuc2V0U3RhdGUoZS5ob3ZlclBvaW50cyYmYy5vcHRpb25zLmluYWN0aXZlT3RoZXJQb2ludHM/XCJpbmFjdGl2ZVwiOlwiXCIpLGEuZmlyZVBvaW50RXZlbnQoXCJ1bnNlbGVjdFwiKSl9KX0pO2RlbGV0ZSB0aGlzLnNlbGVjdGVkU3RhZ2luZ307Yi5wcm90b3R5cGUub25Nb3VzZU92ZXI9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5zZXJpZXMuY2hhcnQsZD1jLnBvaW50ZXI7YT1hP2Qubm9ybWFsaXplKGEpOmQuZ2V0Q2hhcnRDb29yZGluYXRlc0Zyb21Qb2ludCh0aGlzLGMuaW52ZXJ0ZWQpO2QucnVuUG9pbnRBY3Rpb25zKGEsdGhpcyl9O2IucHJvdG90eXBlLm9uTW91c2VPdXQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnNlcmllcy5jaGFydDt0aGlzLmZpcmVQb2ludEV2ZW50KFwibW91c2VPdXRcIik7dGhpcy5zZXJpZXMub3B0aW9ucy5pbmFjdGl2ZU90aGVyUG9pbnRzfHwoYS5ob3ZlclBvaW50c3x8W10pLmZvckVhY2goZnVuY3Rpb24oYSl7YS5zZXRTdGF0ZSgpfSk7YS5ob3ZlclBvaW50cz1hLmhvdmVyUG9pbnQ9XG5udWxsfTtiLnByb3RvdHlwZS5pbXBvcnRFdmVudHM9ZnVuY3Rpb24oKXtpZighdGhpcy5oYXNJbXBvcnRlZEV2ZW50cyl7dmFyIGE9dGhpcyxjPUooYS5zZXJpZXMub3B0aW9ucy5wb2ludCxhLm9wdGlvbnMpLmV2ZW50czthLmV2ZW50cz1jO0UoYyxmdW5jdGlvbihjLGQpe04oYykmJncoYSxkLGMpfSk7dGhpcy5oYXNJbXBvcnRlZEV2ZW50cz0hMH19O2IucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKGEsYyl7dmFyIGI9dGhpcy5zZXJpZXMsaD10aGlzLnN0YXRlLGc9Yi5vcHRpb25zLnN0YXRlc1thfHxcIm5vcm1hbFwiXXx8e30sZj14LnBsb3RPcHRpb25zW2IudHlwZV0ubWFya2VyJiZiLm9wdGlvbnMubWFya2VyLHI9ZiYmITE9PT1mLmVuYWJsZWQsbD1mJiZmLnN0YXRlcyYmZi5zdGF0ZXNbYXx8XCJub3JtYWxcIl18fHt9LGs9ITE9PT1sLmVuYWJsZWQsbj1iLnN0YXRlTWFya2VyR3JhcGhpYyxwPXRoaXMubWFya2VyfHx7fSxBPWIuY2hhcnQsdj1iLmhhbG8sdyxGPWYmJmIubWFya2VyQXR0cmlicztcbmE9YXx8XCJcIjtpZighKGE9PT10aGlzLnN0YXRlJiYhY3x8dGhpcy5zZWxlY3RlZCYmXCJzZWxlY3RcIiE9PWF8fCExPT09Zy5lbmFibGVkfHxhJiYoa3x8ciYmITE9PT1sLmVuYWJsZWQpfHxhJiZwLnN0YXRlcyYmcC5zdGF0ZXNbYV0mJiExPT09cC5zdGF0ZXNbYV0uZW5hYmxlZCkpe3RoaXMuc3RhdGU9YTtGJiYodz1iLm1hcmtlckF0dHJpYnModGhpcyxhKSk7aWYodGhpcy5ncmFwaGljJiYhdGhpcy5oYXNEdW1teUdyYXBoaWMpe2gmJnRoaXMuZ3JhcGhpYy5yZW1vdmVDbGFzcyhcImhpZ2hjaGFydHMtcG9pbnQtXCIraCk7YSYmdGhpcy5ncmFwaGljLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1wb2ludC1cIithKTtpZighQS5zdHlsZWRNb2RlKXt2YXIgUz1iLnBvaW50QXR0cmlicyh0aGlzLGEpO3ZhciBLPW0oQS5vcHRpb25zLmNoYXJ0LmFuaW1hdGlvbixnLmFuaW1hdGlvbik7Yi5vcHRpb25zLmluYWN0aXZlT3RoZXJQb2ludHMmJnUoUy5vcGFjaXR5KSYmKCh0aGlzLmRhdGFMYWJlbHN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EmJlxuYS5hbmltYXRlKHtvcGFjaXR5OlMub3BhY2l0eX0sSyl9KSx0aGlzLmNvbm5lY3RvciYmdGhpcy5jb25uZWN0b3IuYW5pbWF0ZSh7b3BhY2l0eTpTLm9wYWNpdHl9LEspKTt0aGlzLmdyYXBoaWMuYW5pbWF0ZShTLEspfXcmJnRoaXMuZ3JhcGhpYy5hbmltYXRlKHcsbShBLm9wdGlvbnMuY2hhcnQuYW5pbWF0aW9uLGwuYW5pbWF0aW9uLGYuYW5pbWF0aW9uKSk7biYmbi5oaWRlKCl9ZWxzZXtpZihhJiZsKXtoPXAuc3ltYm9sfHxiLnN5bWJvbDtuJiZuLmN1cnJlbnRTeW1ib2whPT1oJiYobj1uLmRlc3Ryb3koKSk7aWYodylpZihuKW5bYz9cImFuaW1hdGVcIjpcImF0dHJcIl0oe3g6dy54LHk6dy55fSk7ZWxzZSBoJiYoYi5zdGF0ZU1hcmtlckdyYXBoaWM9bj1BLnJlbmRlcmVyLnN5bWJvbChoLHcueCx3Lnksdy53aWR0aCx3LmhlaWdodCkuYWRkKGIubWFya2VyR3JvdXApLG4uY3VycmVudFN5bWJvbD1oKTshQS5zdHlsZWRNb2RlJiZuJiZuLmF0dHIoYi5wb2ludEF0dHJpYnModGhpcyxhKSl9biYmXG4oblthJiZ0aGlzLmlzSW5zaWRlP1wic2hvd1wiOlwiaGlkZVwiXSgpLG4uZWxlbWVudC5wb2ludD10aGlzKX1nPWcuaGFsbzt3PShuPXRoaXMuZ3JhcGhpY3x8bikmJm4udmlzaWJpbGl0eXx8XCJpbmhlcml0XCI7ZyYmZy5zaXplJiZuJiZcImhpZGRlblwiIT09dyYmIXRoaXMuaXNDbHVzdGVyPyh2fHwoYi5oYWxvPXY9QS5yZW5kZXJlci5wYXRoKCkuYWRkKG4ucGFyZW50R3JvdXApKSx2LnNob3coKVtjP1wiYW5pbWF0ZVwiOlwiYXR0clwiXSh7ZDp0aGlzLmhhbG9QYXRoKGcuc2l6ZSl9KSx2LmF0dHIoe1wiY2xhc3NcIjpcImhpZ2hjaGFydHMtaGFsbyBoaWdoY2hhcnRzLWNvbG9yLVwiK20odGhpcy5jb2xvckluZGV4LGIuY29sb3JJbmRleCkrKHRoaXMuY2xhc3NOYW1lP1wiIFwiK3RoaXMuY2xhc3NOYW1lOlwiXCIpLHZpc2liaWxpdHk6dyx6SW5kZXg6LTF9KSx2LnBvaW50PXRoaXMsQS5zdHlsZWRNb2RlfHx2LmF0dHIoZCh7ZmlsbDp0aGlzLmNvbG9yfHxiLmNvbG9yLFwiZmlsbC1vcGFjaXR5XCI6Zy5vcGFjaXR5fSxcbmUuZmlsdGVyVXNlckF0dHJpYnV0ZXMoZy5hdHRyaWJ1dGVzfHx7fSkpKSk6diYmdi5wb2ludCYmdi5wb2ludC5oYWxvUGF0aCYmdi5hbmltYXRlKHtkOnYucG9pbnQuaGFsb1BhdGgoMCl9LG51bGwsdi5oaWRlKTtxKHRoaXMsXCJhZnRlclNldFN0YXRlXCIse3N0YXRlOmF9KX19O2IucHJvdG90eXBlLmhhbG9QYXRoPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNlcmllcy5jaGFydC5yZW5kZXJlci5zeW1ib2xzLmNpcmNsZShNYXRoLmZsb29yKHRoaXMucGxvdFgpLWEsdGhpcy5wbG90WS1hLDIqYSwyKmEpfTtyZXR1cm4gYn0oKTtyZXR1cm4gei5Qb2ludD1ifSk7TyhlLFwiQ29yZS9MZWdlbmQuanNcIixbZVtcIkNvcmUvQW5pbWF0aW9uL0FuaW1hdGlvblV0aWxpdGllcy5qc1wiXSxlW1wiQ29yZS9Gb3JtYXRVdGlsaXRpZXMuanNcIl0sZVtcIkNvcmUvR2xvYmFscy5qc1wiXSxlW1wiQ29yZS9TZXJpZXMvUG9pbnQuanNcIl0sZVtcIkNvcmUvVXRpbGl0aWVzLmpzXCJdXSxmdW5jdGlvbihlLGIsSSx6LEgpe3ZhciBEPVxuZS5hbmltT2JqZWN0LEM9ZS5zZXRBbmltYXRpb24sQj1iLmZvcm1hdDtlPUkuaXNGaXJlZm94O3ZhciB4PUkubWFyZ2luTmFtZXM7Yj1JLndpbjt2YXIgdz1ILmFkZEV2ZW50LHY9SC5jcmVhdGVFbGVtZW50LGY9SC5jc3MsZD1ILmRlZmluZWQscT1ILmRpc2NhcmRFbGVtZW50LGs9SC5maW5kLGw9SC5maXJlRXZlbnQsTj1ILmlzTnVtYmVyLHU9SC5tZXJnZSxuPUgucGljayxKPUgucmVsYXRpdmVMZW5ndGgsRT1ILnN0YWJsZVNvcnQsbT1ILnN5bmNUaW1lb3V0O0g9SC53cmFwO3ZhciBjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYyhhLGMpe3RoaXMuYWxsSXRlbXM9W107dGhpcy5jb250ZW50R3JvdXA9dGhpcy5ib3g9dm9pZCAwO3RoaXMuZGlzcGxheT0hMTt0aGlzLmdyb3VwPXZvaWQgMDt0aGlzLm9mZnNldFdpZHRoPXRoaXMubWF4TGVnZW5kV2lkdGg9dGhpcy5tYXhJdGVtV2lkdGg9dGhpcy5sZWdlbmRXaWR0aD10aGlzLmxlZ2VuZEhlaWdodD10aGlzLmxhc3RMaW5lSGVpZ2h0PXRoaXMubGFzdEl0ZW1ZPVxudGhpcy5pdGVtWT10aGlzLml0ZW1YPXRoaXMuaXRlbU1hcmdpblRvcD10aGlzLml0ZW1NYXJnaW5Cb3R0b209dGhpcy5pdGVtSGVpZ2h0PXRoaXMuaW5pdGlhbEl0ZW1ZPTA7dGhpcy5vcHRpb25zPXt9O3RoaXMucGFkZGluZz0wO3RoaXMucGFnZXM9W107dGhpcy5wcm94aW1hdGU9ITE7dGhpcy5zY3JvbGxHcm91cD12b2lkIDA7dGhpcy53aWR0aE9wdGlvbj10aGlzLnRvdGFsSXRlbVdpZHRoPXRoaXMudGl0bGVIZWlnaHQ9dGhpcy5zeW1ib2xXaWR0aD10aGlzLnN5bWJvbEhlaWdodD0wO3RoaXMuY2hhcnQ9YTt0aGlzLmluaXQoYSxjKX1jLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKGEsYyl7dGhpcy5jaGFydD1hO3RoaXMuc2V0T3B0aW9ucyhjKTtjLmVuYWJsZWQmJih0aGlzLnJlbmRlcigpLHcodGhpcy5jaGFydCxcImVuZFJlc2l6ZVwiLGZ1bmN0aW9uKCl7dGhpcy5sZWdlbmQucG9zaXRpb25DaGVja2JveGVzKCl9KSx0aGlzLnByb3hpbWF0ZT90aGlzLnVuY2hhcnRyZW5kZXI9dyh0aGlzLmNoYXJ0LFxuXCJyZW5kZXJcIixmdW5jdGlvbigpe3RoaXMubGVnZW5kLnByb3hpbWF0ZVBvc2l0aW9ucygpO3RoaXMubGVnZW5kLnBvc2l0aW9uSXRlbXMoKX0pOnRoaXMudW5jaGFydHJlbmRlciYmdGhpcy51bmNoYXJ0cmVuZGVyKCkpfTtjLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKGEpe3ZhciBjPW4oYS5wYWRkaW5nLDgpO3RoaXMub3B0aW9ucz1hO3RoaXMuY2hhcnQuc3R5bGVkTW9kZXx8KHRoaXMuaXRlbVN0eWxlPWEuaXRlbVN0eWxlLHRoaXMuaXRlbUhpZGRlblN0eWxlPXUodGhpcy5pdGVtU3R5bGUsYS5pdGVtSGlkZGVuU3R5bGUpKTt0aGlzLml0ZW1NYXJnaW5Ub3A9YS5pdGVtTWFyZ2luVG9wfHwwO3RoaXMuaXRlbU1hcmdpbkJvdHRvbT1hLml0ZW1NYXJnaW5Cb3R0b218fDA7dGhpcy5wYWRkaW5nPWM7dGhpcy5pbml0aWFsSXRlbVk9Yy01O3RoaXMuc3ltYm9sV2lkdGg9bihhLnN5bWJvbFdpZHRoLDE2KTt0aGlzLnBhZ2VzPVtdO3RoaXMucHJveGltYXRlPVwicHJveGltYXRlXCI9PT1cbmEubGF5b3V0JiYhdGhpcy5jaGFydC5pbnZlcnRlZDt0aGlzLmJhc2VsaW5lPXZvaWQgMH07Yy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9dGhpcy5jaGFydDt0aGlzLnNldE9wdGlvbnModSghMCx0aGlzLm9wdGlvbnMsYSkpO3RoaXMuZGVzdHJveSgpO2QuaXNEaXJ0eUxlZ2VuZD1kLmlzRGlydHlCb3g9ITA7bihjLCEwKSYmZC5yZWRyYXcoKTtsKHRoaXMsXCJhZnRlclVwZGF0ZVwiKX07Yy5wcm90b3R5cGUuY29sb3JpemVJdGVtPWZ1bmN0aW9uKGEsYyl7YS5sZWdlbmRHcm91cFtjP1wicmVtb3ZlQ2xhc3NcIjpcImFkZENsYXNzXCJdKFwiaGlnaGNoYXJ0cy1sZWdlbmQtaXRlbS1oaWRkZW5cIik7aWYoIXRoaXMuY2hhcnQuc3R5bGVkTW9kZSl7dmFyIGQ9dGhpcy5vcHRpb25zLGI9YS5sZWdlbmRJdGVtLGU9YS5sZWdlbmRMaW5lLGg9YS5sZWdlbmRTeW1ib2wsZz10aGlzLml0ZW1IaWRkZW5TdHlsZS5jb2xvcjtkPWM/ZC5pdGVtU3R5bGUuY29sb3I6Zzt2YXIgZj1jP2EuY29sb3J8fFxuZzpnLG09YS5vcHRpb25zJiZhLm9wdGlvbnMubWFya2VyLGs9e2ZpbGw6Zn07YiYmYi5jc3Moe2ZpbGw6ZCxjb2xvcjpkfSk7ZSYmZS5hdHRyKHtzdHJva2U6Zn0pO2gmJihtJiZoLmlzTWFya2VyJiYoaz1hLnBvaW50QXR0cmlicygpLGN8fChrLnN0cm9rZT1rLmZpbGw9ZykpLGguYXR0cihrKSl9bCh0aGlzLFwiYWZ0ZXJDb2xvcml6ZUl0ZW1cIix7aXRlbTphLHZpc2libGU6Y30pfTtjLnByb3RvdHlwZS5wb3NpdGlvbkl0ZW1zPWZ1bmN0aW9uKCl7dGhpcy5hbGxJdGVtcy5mb3JFYWNoKHRoaXMucG9zaXRpb25JdGVtLHRoaXMpO3RoaXMuY2hhcnQuaXNSZXNpemluZ3x8dGhpcy5wb3NpdGlvbkNoZWNrYm94ZXMoKX07Yy5wcm90b3R5cGUucG9zaXRpb25JdGVtPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMsYj10aGlzLm9wdGlvbnMsZT1iLnN5bWJvbFBhZGRpbmcsZz0hYi5ydGwsZj1hLl9sZWdlbmRJdGVtUG9zO2I9ZlswXTtmPWZbMV07dmFyIGs9YS5jaGVja2JveCxtPWEubGVnZW5kR3JvdXA7XG5tJiZtLmVsZW1lbnQmJihlPXt0cmFuc2xhdGVYOmc/Yjp0aGlzLmxlZ2VuZFdpZHRoLWItMiplLTQsdHJhbnNsYXRlWTpmfSxnPWZ1bmN0aW9uKCl7bChjLFwiYWZ0ZXJQb3NpdGlvbkl0ZW1cIix7aXRlbTphfSl9LGQobS50cmFuc2xhdGVZKT9tLmFuaW1hdGUoZSx2b2lkIDAsZyk6KG0uYXR0cihlKSxnKCkpKTtrJiYoay54PWIsay55PWYpfTtjLnByb3RvdHlwZS5kZXN0cm95SXRlbT1mdW5jdGlvbihhKXt2YXIgYz1hLmNoZWNrYm94O1tcImxlZ2VuZEl0ZW1cIixcImxlZ2VuZExpbmVcIixcImxlZ2VuZFN5bWJvbFwiLFwibGVnZW5kR3JvdXBcIl0uZm9yRWFjaChmdW5jdGlvbihjKXthW2NdJiYoYVtjXT1hW2NdLmRlc3Ryb3koKSl9KTtjJiZxKGEuY2hlY2tib3gpfTtjLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXt0aGlzW2FdJiYodGhpc1thXT10aGlzW2FdLmRlc3Ryb3koKSl9dGhpcy5nZXRBbGxJdGVtcygpLmZvckVhY2goZnVuY3Rpb24oYyl7W1wibGVnZW5kSXRlbVwiLFxuXCJsZWdlbmRHcm91cFwiXS5mb3JFYWNoKGEsYyl9KTtcImNsaXBSZWN0IHVwIGRvd24gcGFnZXIgbmF2IGJveCB0aXRsZSBncm91cFwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGEsdGhpcyk7dGhpcy5kaXNwbGF5PW51bGx9O2MucHJvdG90eXBlLnBvc2l0aW9uQ2hlY2tib3hlcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ3JvdXAmJnRoaXMuZ3JvdXAuYWxpZ25BdHRyLGM9dGhpcy5jbGlwSGVpZ2h0fHx0aGlzLmxlZ2VuZEhlaWdodCxkPXRoaXMudGl0bGVIZWlnaHQ7aWYoYSl7dmFyIGI9YS50cmFuc2xhdGVZO3RoaXMuYWxsSXRlbXMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgaD1lLmNoZWNrYm94O2lmKGgpe3ZhciBnPWIrZCtoLnkrKHRoaXMuc2Nyb2xsT2Zmc2V0fHwwKSszO2YoaCx7bGVmdDphLnRyYW5zbGF0ZVgrZS5jaGVja2JveE9mZnNldCtoLngtMjArXCJweFwiLHRvcDpnK1wicHhcIixkaXNwbGF5OnRoaXMucHJveGltYXRlfHxnPmItNiYmZzxiK2MtNj9cIlwiOlwibm9uZVwifSl9fSx0aGlzKX19O1xuYy5wcm90b3R5cGUucmVuZGVyVGl0bGU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMsYz10aGlzLnBhZGRpbmcsZD1hLnRpdGxlLGI9MDtkLnRleHQmJih0aGlzLnRpdGxlfHwodGhpcy50aXRsZT10aGlzLmNoYXJ0LnJlbmRlcmVyLmxhYmVsKGQudGV4dCxjLTMsYy00LG51bGwsbnVsbCxudWxsLGEudXNlSFRNTCxudWxsLFwibGVnZW5kLXRpdGxlXCIpLmF0dHIoe3pJbmRleDoxfSksdGhpcy5jaGFydC5zdHlsZWRNb2RlfHx0aGlzLnRpdGxlLmNzcyhkLnN0eWxlKSx0aGlzLnRpdGxlLmFkZCh0aGlzLmdyb3VwKSksZC53aWR0aHx8dGhpcy50aXRsZS5jc3Moe3dpZHRoOnRoaXMubWF4TGVnZW5kV2lkdGgrXCJweFwifSksYT10aGlzLnRpdGxlLmdldEJCb3goKSxiPWEuaGVpZ2h0LHRoaXMub2Zmc2V0V2lkdGg9YS53aWR0aCx0aGlzLmNvbnRlbnRHcm91cC5hdHRyKHt0cmFuc2xhdGVZOmJ9KSk7dGhpcy50aXRsZUhlaWdodD1ifTtjLnByb3RvdHlwZS5zZXRUZXh0PWZ1bmN0aW9uKGEpe3ZhciBjPVxudGhpcy5vcHRpb25zO2EubGVnZW5kSXRlbS5hdHRyKHt0ZXh0OmMubGFiZWxGb3JtYXQ/QihjLmxhYmVsRm9ybWF0LGEsdGhpcy5jaGFydCk6Yy5sYWJlbEZvcm1hdHRlci5jYWxsKGEpfSl9O2MucHJvdG90eXBlLnJlbmRlckl0ZW09ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jaGFydCxkPWMucmVuZGVyZXIsYj10aGlzLm9wdGlvbnMsZT10aGlzLnN5bWJvbFdpZHRoLGc9Yi5zeW1ib2xQYWRkaW5nfHwwLGY9dGhpcy5pdGVtU3R5bGUsbD10aGlzLml0ZW1IaWRkZW5TdHlsZSxrPVwiaG9yaXpvbnRhbFwiPT09Yi5sYXlvdXQ/bihiLml0ZW1EaXN0YW5jZSwyMCk6MCxtPSFiLnJ0bCxxPWEubGVnZW5kSXRlbSx0PSFhLnNlcmllcyxwPSF0JiZhLnNlcmllcy5kcmF3TGVnZW5kU3ltYm9sP2Euc2VyaWVzOmEsdj1wLm9wdGlvbnMsdz10aGlzLmNyZWF0ZUNoZWNrYm94Rm9ySXRlbSYmdiYmdi5zaG93Q2hlY2tib3g7dj1lK2craysodz8yMDowKTt2YXIgRT1iLnVzZUhUTUwsRj1hLm9wdGlvbnMuY2xhc3NOYW1lO1xucXx8KGEubGVnZW5kR3JvdXA9ZC5nKFwibGVnZW5kLWl0ZW1cIikuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLVwiK3AudHlwZStcIi1zZXJpZXMgaGlnaGNoYXJ0cy1jb2xvci1cIithLmNvbG9ySW5kZXgrKEY/XCIgXCIrRjpcIlwiKSsodD9cIiBoaWdoY2hhcnRzLXNlcmllcy1cIithLmluZGV4OlwiXCIpKS5hdHRyKHt6SW5kZXg6MX0pLmFkZCh0aGlzLnNjcm9sbEdyb3VwKSxhLmxlZ2VuZEl0ZW09cT1kLnRleHQoXCJcIixtP2UrZzotZyx0aGlzLmJhc2VsaW5lfHwwLEUpLGMuc3R5bGVkTW9kZXx8cS5jc3ModShhLnZpc2libGU/ZjpsKSkscS5hdHRyKHthbGlnbjptP1wibGVmdFwiOlwicmlnaHRcIix6SW5kZXg6Mn0pLmFkZChhLmxlZ2VuZEdyb3VwKSx0aGlzLmJhc2VsaW5lfHwodGhpcy5mb250TWV0cmljcz1kLmZvbnRNZXRyaWNzKGMuc3R5bGVkTW9kZT8xMjpmLmZvbnRTaXplLHEpLHRoaXMuYmFzZWxpbmU9dGhpcy5mb250TWV0cmljcy5mKzMrdGhpcy5pdGVtTWFyZ2luVG9wLHEuYXR0cihcInlcIix0aGlzLmJhc2VsaW5lKSxcbnRoaXMuc3ltYm9sSGVpZ2h0PWIuc3ltYm9sSGVpZ2h0fHx0aGlzLmZvbnRNZXRyaWNzLmYsYi5zcXVhcmVTeW1ib2wmJih0aGlzLnN5bWJvbFdpZHRoPW4oYi5zeW1ib2xXaWR0aCxNYXRoLm1heCh0aGlzLnN5bWJvbEhlaWdodCwxNikpLHY9dGhpcy5zeW1ib2xXaWR0aCtnK2srKHc/MjA6MCksbSYmcS5hdHRyKFwieFwiLHRoaXMuc3ltYm9sV2lkdGgrZykpKSxwLmRyYXdMZWdlbmRTeW1ib2wodGhpcyxhKSx0aGlzLnNldEl0ZW1FdmVudHMmJnRoaXMuc2V0SXRlbUV2ZW50cyhhLHEsRSkpO3cmJiFhLmNoZWNrYm94JiZ0aGlzLmNyZWF0ZUNoZWNrYm94Rm9ySXRlbSYmdGhpcy5jcmVhdGVDaGVja2JveEZvckl0ZW0oYSk7dGhpcy5jb2xvcml6ZUl0ZW0oYSxhLnZpc2libGUpOyFjLnN0eWxlZE1vZGUmJmYud2lkdGh8fHEuY3NzKHt3aWR0aDooYi5pdGVtV2lkdGh8fHRoaXMud2lkdGhPcHRpb258fGMuc3BhY2luZ0JveC53aWR0aCktditcInB4XCJ9KTt0aGlzLnNldFRleHQoYSk7Yz1xLmdldEJCb3goKTtcbmEuaXRlbVdpZHRoPWEuY2hlY2tib3hPZmZzZXQ9Yi5pdGVtV2lkdGh8fGEubGVnZW5kSXRlbVdpZHRofHxjLndpZHRoK3Y7dGhpcy5tYXhJdGVtV2lkdGg9TWF0aC5tYXgodGhpcy5tYXhJdGVtV2lkdGgsYS5pdGVtV2lkdGgpO3RoaXMudG90YWxJdGVtV2lkdGgrPWEuaXRlbVdpZHRoO3RoaXMuaXRlbUhlaWdodD1hLml0ZW1IZWlnaHQ9TWF0aC5yb3VuZChhLmxlZ2VuZEl0ZW1IZWlnaHR8fGMuaGVpZ2h0fHx0aGlzLnN5bWJvbEhlaWdodCl9O2MucHJvdG90eXBlLmxheW91dEl0ZW09ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5vcHRpb25zLGQ9dGhpcy5wYWRkaW5nLGI9XCJob3Jpem9udGFsXCI9PT1jLmxheW91dCxlPWEuaXRlbUhlaWdodCxnPXRoaXMuaXRlbU1hcmdpbkJvdHRvbSxmPXRoaXMuaXRlbU1hcmdpblRvcCxsPWI/bihjLml0ZW1EaXN0YW5jZSwyMCk6MCxtPXRoaXMubWF4TGVnZW5kV2lkdGg7Yz1jLmFsaWduQ29sdW1ucyYmdGhpcy50b3RhbEl0ZW1XaWR0aD5tP3RoaXMubWF4SXRlbVdpZHRoOlxuYS5pdGVtV2lkdGg7YiYmdGhpcy5pdGVtWC1kK2M+bSYmKHRoaXMuaXRlbVg9ZCx0aGlzLmxhc3RMaW5lSGVpZ2h0JiYodGhpcy5pdGVtWSs9Zit0aGlzLmxhc3RMaW5lSGVpZ2h0K2cpLHRoaXMubGFzdExpbmVIZWlnaHQ9MCk7dGhpcy5sYXN0SXRlbVk9Zit0aGlzLml0ZW1ZK2c7dGhpcy5sYXN0TGluZUhlaWdodD1NYXRoLm1heChlLHRoaXMubGFzdExpbmVIZWlnaHQpO2EuX2xlZ2VuZEl0ZW1Qb3M9W3RoaXMuaXRlbVgsdGhpcy5pdGVtWV07Yj90aGlzLml0ZW1YKz1jOih0aGlzLml0ZW1ZKz1mK2UrZyx0aGlzLmxhc3RMaW5lSGVpZ2h0PWUpO3RoaXMub2Zmc2V0V2lkdGg9dGhpcy53aWR0aE9wdGlvbnx8TWF0aC5tYXgoKGI/dGhpcy5pdGVtWC1kLShhLmNoZWNrYm94PzA6bCk6YykrZCx0aGlzLm9mZnNldFdpZHRoKX07Yy5wcm90b3R5cGUuZ2V0QWxsSXRlbXM9ZnVuY3Rpb24oKXt2YXIgYT1bXTt0aGlzLmNoYXJ0LnNlcmllcy5mb3JFYWNoKGZ1bmN0aW9uKGMpe3ZhciBiPWMmJlxuYy5vcHRpb25zO2MmJm4oYi5zaG93SW5MZWdlbmQsZChiLmxpbmtlZFRvKT8hMTp2b2lkIDAsITApJiYoYT1hLmNvbmNhdChjLmxlZ2VuZEl0ZW1zfHwoXCJwb2ludFwiPT09Yi5sZWdlbmRUeXBlP2MuZGF0YTpjKSkpfSk7bCh0aGlzLFwiYWZ0ZXJHZXRBbGxJdGVtc1wiLHthbGxJdGVtczphfSk7cmV0dXJuIGF9O2MucHJvdG90eXBlLmdldEFsaWdubWVudD1mdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucztyZXR1cm4gdGhpcy5wcm94aW1hdGU/YS5hbGlnbi5jaGFyQXQoMCkrXCJ0dlwiOmEuZmxvYXRpbmc/XCJcIjphLmFsaWduLmNoYXJBdCgwKSthLnZlcnRpY2FsQWxpZ24uY2hhckF0KDApK2EubGF5b3V0LmNoYXJBdCgwKX07Yy5wcm90b3R5cGUuYWRqdXN0TWFyZ2lucz1mdW5jdGlvbihhLGMpe3ZhciBiPXRoaXMuY2hhcnQsZT10aGlzLm9wdGlvbnMsaD10aGlzLmdldEFsaWdubWVudCgpO2gmJlsvKGx0aHxjdHxydGgpLywvKHJ0dnxybXxyYnYpLywvKHJiaHxjYnxsYmgpLywvKGxidnxsbXxsdHYpL10uZm9yRWFjaChmdW5jdGlvbihnLFxuZil7Zy50ZXN0KGgpJiYhZChhW2ZdKSYmKGJbeFtmXV09TWF0aC5tYXgoYlt4W2ZdXSxiLmxlZ2VuZFsoZisxKSUyP1wibGVnZW5kSGVpZ2h0XCI6XCJsZWdlbmRXaWR0aFwiXStbMSwtMSwtMSwxXVtmXSplW2YlMj9cInhcIjpcInlcIl0rbihlLm1hcmdpbiwxMikrY1tmXSsoYi50aXRsZU9mZnNldFtmXXx8MCkpKX0pfTtjLnByb3RvdHlwZS5wcm94aW1hdGVQb3NpdGlvbnM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNoYXJ0LGM9W10sZD1cImxlZnRcIj09PXRoaXMub3B0aW9ucy5hbGlnbjt0aGlzLmFsbEl0ZW1zLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGU7dmFyIGg9ZDtpZihiLnlBeGlzKXtiLnhBeGlzLm9wdGlvbnMucmV2ZXJzZWQmJihoPSFoKTtiLnBvaW50cyYmKGU9ayhoP2IucG9pbnRzOmIucG9pbnRzLnNsaWNlKDApLnJldmVyc2UoKSxmdW5jdGlvbihhKXtyZXR1cm4gTihhLnBsb3RZKX0pKTtoPXRoaXMuaXRlbU1hcmdpblRvcCtiLmxlZ2VuZEl0ZW0uZ2V0QkJveCgpLmhlaWdodCt0aGlzLml0ZW1NYXJnaW5Cb3R0b207XG52YXIgZz1iLnlBeGlzLnRvcC1hLnBsb3RUb3A7Yi52aXNpYmxlPyhlPWU/ZS5wbG90WTpiLnlBeGlzLmhlaWdodCxlKz1nLS4zKmgpOmU9ZytiLnlBeGlzLmhlaWdodDtjLnB1c2goe3RhcmdldDplLHNpemU6aCxpdGVtOmJ9KX19LHRoaXMpO0kuZGlzdHJpYnV0ZShjLGEucGxvdEhlaWdodCk7Yy5mb3JFYWNoKGZ1bmN0aW9uKGMpe2MuaXRlbS5fbGVnZW5kSXRlbVBvc1sxXT1hLnBsb3RUb3AtYS5zcGFjaW5nWzBdK2MucG9zfSl9O2MucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBhPXRoaXMuY2hhcnQsYz1hLnJlbmRlcmVyLGQ9dGhpcy5ncm91cCxiPXRoaXMuYm94LGU9dGhpcy5vcHRpb25zLGc9dGhpcy5wYWRkaW5nO3RoaXMuaXRlbVg9Zzt0aGlzLml0ZW1ZPXRoaXMuaW5pdGlhbEl0ZW1ZO3RoaXMubGFzdEl0ZW1ZPXRoaXMub2Zmc2V0V2lkdGg9MDt0aGlzLndpZHRoT3B0aW9uPUooZS53aWR0aCxhLnNwYWNpbmdCb3gud2lkdGgtZyk7dmFyIGY9YS5zcGFjaW5nQm94LndpZHRoLVxuMipnLWUueDstMTxbXCJybVwiLFwibG1cIl0uaW5kZXhPZih0aGlzLmdldEFsaWdubWVudCgpLnN1YnN0cmluZygwLDIpKSYmKGYvPTIpO3RoaXMubWF4TGVnZW5kV2lkdGg9dGhpcy53aWR0aE9wdGlvbnx8ZjtkfHwodGhpcy5ncm91cD1kPWMuZyhcImxlZ2VuZFwiKS5hdHRyKHt6SW5kZXg6N30pLmFkZCgpLHRoaXMuY29udGVudEdyb3VwPWMuZygpLmF0dHIoe3pJbmRleDoxfSkuYWRkKGQpLHRoaXMuc2Nyb2xsR3JvdXA9Yy5nKCkuYWRkKHRoaXMuY29udGVudEdyb3VwKSk7dGhpcy5yZW5kZXJUaXRsZSgpO3ZhciBtPXRoaXMuZ2V0QWxsSXRlbXMoKTtFKG0sZnVuY3Rpb24oYSxjKXtyZXR1cm4oYS5vcHRpb25zJiZhLm9wdGlvbnMubGVnZW5kSW5kZXh8fDApLShjLm9wdGlvbnMmJmMub3B0aW9ucy5sZWdlbmRJbmRleHx8MCl9KTtlLnJldmVyc2VkJiZtLnJldmVyc2UoKTt0aGlzLmFsbEl0ZW1zPW07dGhpcy5kaXNwbGF5PWY9ISFtLmxlbmd0aDt0aGlzLml0ZW1IZWlnaHQ9dGhpcy50b3RhbEl0ZW1XaWR0aD1cbnRoaXMubWF4SXRlbVdpZHRoPXRoaXMubGFzdExpbmVIZWlnaHQ9MDttLmZvckVhY2godGhpcy5yZW5kZXJJdGVtLHRoaXMpO20uZm9yRWFjaCh0aGlzLmxheW91dEl0ZW0sdGhpcyk7bT0odGhpcy53aWR0aE9wdGlvbnx8dGhpcy5vZmZzZXRXaWR0aCkrZzt2YXIgaz10aGlzLmxhc3RJdGVtWSt0aGlzLmxhc3RMaW5lSGVpZ2h0K3RoaXMudGl0bGVIZWlnaHQ7az10aGlzLmhhbmRsZU92ZXJmbG93KGspO2srPWc7Ynx8KHRoaXMuYm94PWI9Yy5yZWN0KCkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLWxlZ2VuZC1ib3hcIikuYXR0cih7cjplLmJvcmRlclJhZGl1c30pLmFkZChkKSxiLmlzTmV3PSEwKTthLnN0eWxlZE1vZGV8fGIuYXR0cih7c3Ryb2tlOmUuYm9yZGVyQ29sb3IsXCJzdHJva2Utd2lkdGhcIjplLmJvcmRlcldpZHRofHwwLGZpbGw6ZS5iYWNrZ3JvdW5kQ29sb3J8fFwibm9uZVwifSkuc2hhZG93KGUuc2hhZG93KTswPG0mJjA8ayYmKGJbYi5pc05ldz9cImF0dHJcIjpcImFuaW1hdGVcIl0oYi5jcmlzcC5jYWxsKHt9LFxue3g6MCx5OjAsd2lkdGg6bSxoZWlnaHQ6a30sYi5zdHJva2VXaWR0aCgpKSksYi5pc05ldz0hMSk7YltmP1wic2hvd1wiOlwiaGlkZVwiXSgpO2Euc3R5bGVkTW9kZSYmXCJub25lXCI9PT1kLmdldFN0eWxlKFwiZGlzcGxheVwiKSYmKG09az0wKTt0aGlzLmxlZ2VuZFdpZHRoPW07dGhpcy5sZWdlbmRIZWlnaHQ9aztmJiZ0aGlzLmFsaWduKCk7dGhpcy5wcm94aW1hdGV8fHRoaXMucG9zaXRpb25JdGVtcygpO2wodGhpcyxcImFmdGVyUmVuZGVyXCIpfTtjLnByb3RvdHlwZS5hbGlnbj1mdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT10aGlzLmNoYXJ0LnNwYWNpbmdCb3gpO3ZhciBjPXRoaXMuY2hhcnQsZD10aGlzLm9wdGlvbnMsYj1hLnk7LyhsdGh8Y3R8cnRoKS8udGVzdCh0aGlzLmdldEFsaWdubWVudCgpKSYmMDxjLnRpdGxlT2Zmc2V0WzBdP2IrPWMudGl0bGVPZmZzZXRbMF06LyhsYmh8Y2J8cmJoKS8udGVzdCh0aGlzLmdldEFsaWdubWVudCgpKSYmMDxjLnRpdGxlT2Zmc2V0WzJdJiYoYi09Yy50aXRsZU9mZnNldFsyXSk7XG5iIT09YS55JiYoYT11KGEse3k6Yn0pKTt0aGlzLmdyb3VwLmFsaWduKHUoZCx7d2lkdGg6dGhpcy5sZWdlbmRXaWR0aCxoZWlnaHQ6dGhpcy5sZWdlbmRIZWlnaHQsdmVydGljYWxBbGlnbjp0aGlzLnByb3hpbWF0ZT9cInRvcFwiOmQudmVydGljYWxBbGlnbn0pLCEwLGEpfTtjLnByb3RvdHlwZS5oYW5kbGVPdmVyZmxvdz1mdW5jdGlvbihhKXt2YXIgYz10aGlzLGQ9dGhpcy5jaGFydCxiPWQucmVuZGVyZXIsZT10aGlzLm9wdGlvbnMsZz1lLnksZj10aGlzLnBhZGRpbmc7Zz1kLnNwYWNpbmdCb3guaGVpZ2h0KyhcInRvcFwiPT09ZS52ZXJ0aWNhbEFsaWduPy1nOmcpLWY7dmFyIG09ZS5tYXhIZWlnaHQsayxsPXRoaXMuY2xpcFJlY3QscT1lLm5hdmlnYXRpb24sdD1uKHEuYW5pbWF0aW9uLCEwKSxwPXEuYXJyb3dTaXplfHwxMix1PXRoaXMubmF2LHY9dGhpcy5wYWdlcyx3LEY9dGhpcy5hbGxJdGVtcyxTPWZ1bmN0aW9uKGEpe1wibnVtYmVyXCI9PT10eXBlb2YgYT9sLmF0dHIoe2hlaWdodDphfSk6XG5sJiYoYy5jbGlwUmVjdD1sLmRlc3Ryb3koKSxjLmNvbnRlbnRHcm91cC5jbGlwKCkpO2MuY29udGVudEdyb3VwLmRpdiYmKGMuY29udGVudEdyb3VwLmRpdi5zdHlsZS5jbGlwPWE/XCJyZWN0KFwiK2YrXCJweCw5OTk5cHgsXCIrKGYrYSkrXCJweCwwKVwiOlwiYXV0b1wiKX0sSz1mdW5jdGlvbihhKXtjW2FdPWIuY2lyY2xlKDAsMCwxLjMqcCkudHJhbnNsYXRlKHAvMixwLzIpLmFkZCh1KTtkLnN0eWxlZE1vZGV8fGNbYV0uYXR0cihcImZpbGxcIixcInJnYmEoMCwwLDAsMC4wMDAxKVwiKTtyZXR1cm4gY1thXX07XCJob3Jpem9udGFsXCIhPT1lLmxheW91dHx8XCJtaWRkbGVcIj09PWUudmVydGljYWxBbGlnbnx8ZS5mbG9hdGluZ3x8KGcvPTIpO20mJihnPU1hdGgubWluKGcsbSkpO3YubGVuZ3RoPTA7YSYmMDxnJiZhPmcmJiExIT09cS5lbmFibGVkPyh0aGlzLmNsaXBIZWlnaHQ9az1NYXRoLm1heChnLTIwLXRoaXMudGl0bGVIZWlnaHQtZiwwKSx0aGlzLmN1cnJlbnRQYWdlPW4odGhpcy5jdXJyZW50UGFnZSxcbjEpLHRoaXMuZnVsbEhlaWdodD1hLEYuZm9yRWFjaChmdW5jdGlvbihhLGMpe3ZhciBkPWEuX2xlZ2VuZEl0ZW1Qb3NbMV0sYj1NYXRoLnJvdW5kKGEubGVnZW5kSXRlbS5nZXRCQm94KCkuaGVpZ2h0KSxlPXYubGVuZ3RoO2lmKCFlfHxkLXZbZS0xXT5rJiYod3x8ZCkhPT12W2UtMV0pdi5wdXNoKHd8fGQpLGUrKzthLnBhZ2VJeD1lLTE7dyYmKEZbYy0xXS5wYWdlSXg9ZS0xKTtjPT09Ri5sZW5ndGgtMSYmZCtiLXZbZS0xXT5rJiZkIT09dyYmKHYucHVzaChkKSxhLnBhZ2VJeD1lKTtkIT09dyYmKHc9ZCl9KSxsfHwobD1jLmNsaXBSZWN0PWIuY2xpcFJlY3QoMCxmLDk5OTksMCksYy5jb250ZW50R3JvdXAuY2xpcChsKSksUyhrKSx1fHwodGhpcy5uYXY9dT1iLmcoKS5hdHRyKHt6SW5kZXg6MX0pLmFkZCh0aGlzLmdyb3VwKSx0aGlzLnVwPWIuc3ltYm9sKFwidHJpYW5nbGVcIiwwLDAscCxwKS5hZGQodSksSyhcInVwVHJhY2tlclwiKS5vbihcImNsaWNrXCIsZnVuY3Rpb24oKXtjLnNjcm9sbCgtMSxcbnQpfSksdGhpcy5wYWdlcj1iLnRleHQoXCJcIiwxNSwxMCkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLWxlZ2VuZC1uYXZpZ2F0aW9uXCIpLGQuc3R5bGVkTW9kZXx8dGhpcy5wYWdlci5jc3MocS5zdHlsZSksdGhpcy5wYWdlci5hZGQodSksdGhpcy5kb3duPWIuc3ltYm9sKFwidHJpYW5nbGUtZG93blwiLDAsMCxwLHApLmFkZCh1KSxLKFwiZG93blRyYWNrZXJcIikub24oXCJjbGlja1wiLGZ1bmN0aW9uKCl7Yy5zY3JvbGwoMSx0KX0pKSxjLnNjcm9sbCgwKSxhPWcpOnUmJihTKCksdGhpcy5uYXY9dS5kZXN0cm95KCksdGhpcy5zY3JvbGxHcm91cC5hdHRyKHt0cmFuc2xhdGVZOjF9KSx0aGlzLmNsaXBIZWlnaHQ9MCk7cmV0dXJuIGF9O2MucHJvdG90eXBlLnNjcm9sbD1mdW5jdGlvbihhLGMpe3ZhciBkPXRoaXMsYj10aGlzLmNoYXJ0LGU9dGhpcy5wYWdlcyxoPWUubGVuZ3RoLGc9dGhpcy5jdXJyZW50UGFnZSthO2E9dGhpcy5jbGlwSGVpZ2h0O3ZhciBmPXRoaXMub3B0aW9ucy5uYXZpZ2F0aW9uLGs9XG50aGlzLnBhZ2VyLHE9dGhpcy5wYWRkaW5nO2c+aCYmKGc9aCk7MDxnJiYoXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBjJiZDKGMsYiksdGhpcy5uYXYuYXR0cih7dHJhbnNsYXRlWDpxLHRyYW5zbGF0ZVk6YSt0aGlzLnBhZGRpbmcrNyt0aGlzLnRpdGxlSGVpZ2h0LHZpc2liaWxpdHk6XCJ2aXNpYmxlXCJ9KSxbdGhpcy51cCx0aGlzLnVwVHJhY2tlcl0uZm9yRWFjaChmdW5jdGlvbihhKXthLmF0dHIoe1wiY2xhc3NcIjoxPT09Zz9cImhpZ2hjaGFydHMtbGVnZW5kLW5hdi1pbmFjdGl2ZVwiOlwiaGlnaGNoYXJ0cy1sZWdlbmQtbmF2LWFjdGl2ZVwifSl9KSxrLmF0dHIoe3RleHQ6ZytcIi9cIitofSksW3RoaXMuZG93bix0aGlzLmRvd25UcmFja2VyXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuYXR0cih7eDoxOCt0aGlzLnBhZ2VyLmdldEJCb3goKS53aWR0aCxcImNsYXNzXCI6Zz09PWg/XCJoaWdoY2hhcnRzLWxlZ2VuZC1uYXYtaW5hY3RpdmVcIjpcImhpZ2hjaGFydHMtbGVnZW5kLW5hdi1hY3RpdmVcIn0pfSx0aGlzKSxcbmIuc3R5bGVkTW9kZXx8KHRoaXMudXAuYXR0cih7ZmlsbDoxPT09Zz9mLmluYWN0aXZlQ29sb3I6Zi5hY3RpdmVDb2xvcn0pLHRoaXMudXBUcmFja2VyLmNzcyh7Y3Vyc29yOjE9PT1nP1wiZGVmYXVsdFwiOlwicG9pbnRlclwifSksdGhpcy5kb3duLmF0dHIoe2ZpbGw6Zz09PWg/Zi5pbmFjdGl2ZUNvbG9yOmYuYWN0aXZlQ29sb3J9KSx0aGlzLmRvd25UcmFja2VyLmNzcyh7Y3Vyc29yOmc9PT1oP1wiZGVmYXVsdFwiOlwicG9pbnRlclwifSkpLHRoaXMuc2Nyb2xsT2Zmc2V0PS1lW2ctMV0rdGhpcy5pbml0aWFsSXRlbVksdGhpcy5zY3JvbGxHcm91cC5hbmltYXRlKHt0cmFuc2xhdGVZOnRoaXMuc2Nyb2xsT2Zmc2V0fSksdGhpcy5jdXJyZW50UGFnZT1nLHRoaXMucG9zaXRpb25DaGVja2JveGVzKCksYz1EKG4oYyxiLnJlbmRlcmVyLmdsb2JhbEFuaW1hdGlvbiwhMCkpLG0oZnVuY3Rpb24oKXtsKGQsXCJhZnRlclNjcm9sbFwiLHtjdXJyZW50UGFnZTpnfSl9LGMuZHVyYXRpb24pKX07Yy5wcm90b3R5cGUuc2V0SXRlbUV2ZW50cz1cbmZ1bmN0aW9uKGEsYyxkKXt2YXIgYj10aGlzLGU9Yi5jaGFydC5yZW5kZXJlci5ib3hXcmFwcGVyLGg9YSBpbnN0YW5jZW9mIHosZz1cImhpZ2hjaGFydHMtbGVnZW5kLVwiKyhoP1wicG9pbnRcIjpcInNlcmllc1wiKStcIi1hY3RpdmVcIixmPWIuY2hhcnQuc3R5bGVkTW9kZTsoZD9bYyxhLmxlZ2VuZFN5bWJvbF06W2EubGVnZW5kR3JvdXBdKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2lmKGQpZC5vbihcIm1vdXNlb3ZlclwiLGZ1bmN0aW9uKCl7YS52aXNpYmxlJiZiLmFsbEl0ZW1zLmZvckVhY2goZnVuY3Rpb24oYyl7YSE9PWMmJmMuc2V0U3RhdGUoXCJpbmFjdGl2ZVwiLCFoKX0pO2Euc2V0U3RhdGUoXCJob3ZlclwiKTthLnZpc2libGUmJmUuYWRkQ2xhc3MoZyk7Znx8Yy5jc3MoYi5vcHRpb25zLml0ZW1Ib3ZlclN0eWxlKX0pLm9uKFwibW91c2VvdXRcIixmdW5jdGlvbigpe2IuY2hhcnQuc3R5bGVkTW9kZXx8Yy5jc3ModShhLnZpc2libGU/Yi5pdGVtU3R5bGU6Yi5pdGVtSGlkZGVuU3R5bGUpKTtiLmFsbEl0ZW1zLmZvckVhY2goZnVuY3Rpb24oYyl7YSE9PVxuYyYmYy5zZXRTdGF0ZShcIlwiLCFoKX0pO2UucmVtb3ZlQ2xhc3MoZyk7YS5zZXRTdGF0ZSgpfSkub24oXCJjbGlja1wiLGZ1bmN0aW9uKGMpe3ZhciBkPWZ1bmN0aW9uKCl7YS5zZXRWaXNpYmxlJiZhLnNldFZpc2libGUoKTtiLmFsbEl0ZW1zLmZvckVhY2goZnVuY3Rpb24oYyl7YSE9PWMmJmMuc2V0U3RhdGUoYS52aXNpYmxlP1wiaW5hY3RpdmVcIjpcIlwiLCFoKX0pfTtlLnJlbW92ZUNsYXNzKGcpO2M9e2Jyb3dzZXJFdmVudDpjfTthLmZpcmVQb2ludEV2ZW50P2EuZmlyZVBvaW50RXZlbnQoXCJsZWdlbmRJdGVtQ2xpY2tcIixjLGQpOmwoYSxcImxlZ2VuZEl0ZW1DbGlja1wiLGMsZCl9KX0pfTtjLnByb3RvdHlwZS5jcmVhdGVDaGVja2JveEZvckl0ZW09ZnVuY3Rpb24oYSl7YS5jaGVja2JveD12KFwiaW5wdXRcIix7dHlwZTpcImNoZWNrYm94XCIsY2xhc3NOYW1lOlwiaGlnaGNoYXJ0cy1sZWdlbmQtY2hlY2tib3hcIixjaGVja2VkOmEuc2VsZWN0ZWQsZGVmYXVsdENoZWNrZWQ6YS5zZWxlY3RlZH0sdGhpcy5vcHRpb25zLml0ZW1DaGVja2JveFN0eWxlLFxudGhpcy5jaGFydC5jb250YWluZXIpO3coYS5jaGVja2JveCxcImNsaWNrXCIsZnVuY3Rpb24oYyl7bChhLnNlcmllc3x8YSxcImNoZWNrYm94Q2xpY2tcIix7Y2hlY2tlZDpjLnRhcmdldC5jaGVja2VkLGl0ZW06YX0sZnVuY3Rpb24oKXthLnNlbGVjdCgpfSl9KX07cmV0dXJuIGN9KCk7KC9UcmlkZW50XFwvN1xcLjAvLnRlc3QoYi5uYXZpZ2F0b3ImJmIubmF2aWdhdG9yLnVzZXJBZ2VudCl8fGUpJiZIKGMucHJvdG90eXBlLFwicG9zaXRpb25JdGVtXCIsZnVuY3Rpb24oYyxhKXt2YXIgZD10aGlzLGI9ZnVuY3Rpb24oKXthLl9sZWdlbmRJdGVtUG9zJiZjLmNhbGwoZCxhKX07YigpO2QuYnViYmxlTGVnZW5kfHxzZXRUaW1lb3V0KGIpfSk7SS5MZWdlbmQ9YztyZXR1cm4gSS5MZWdlbmR9KTtPKGUsXCJDb3JlL1Nlcmllcy9TZXJpZXNSZWdpc3RyeS5qc1wiLFtlW1wiQ29yZS9HbG9iYWxzLmpzXCJdLGVbXCJDb3JlL09wdGlvbnMuanNcIl0sZVtcIkNvcmUvU2VyaWVzL1BvaW50LmpzXCJdLGVbXCJDb3JlL1V0aWxpdGllcy5qc1wiXV0sXG5mdW5jdGlvbihlLGIsSSx6KXt2YXIgRD1iLmRlZmF1bHRPcHRpb25zLEc9ei5lcnJvcixDPXouZXh0ZW5kQ2xhc3MsQj16Lm1lcmdlLHg7KGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIHYoZSxkKXt2YXIgZj1ELnBsb3RPcHRpb25zfHx7fSxrPWQuZGVmYXVsdE9wdGlvbnM7ZC5wcm90b3R5cGUucG9pbnRDbGFzc3x8KGQucHJvdG90eXBlLnBvaW50Q2xhc3M9SSk7ZC5wcm90b3R5cGUudHlwZT1lO2smJihmW2VdPWspO2Iuc2VyaWVzVHlwZXNbZV09ZH1iLnNlcmllc1R5cGVzPWUuc2VyaWVzVHlwZXM7Yi5nZXRTZXJpZXM9ZnVuY3Rpb24oZSxkKXt2b2lkIDA9PT1kJiYoZD17fSk7dmFyIGY9ZS5vcHRpb25zLmNoYXJ0O2Y9ZC50eXBlfHxmLnR5cGV8fGYuZGVmYXVsdFNlcmllc1R5cGV8fFwiXCI7dmFyIGs9Yi5zZXJpZXNUeXBlc1tmXTtifHxHKDE3LCEwLGUse21pc3NpbmdNb2R1bGVGb3I6Zn0pO2Y9bmV3IGs7XCJmdW5jdGlvblwiPT09dHlwZW9mIGYuaW5pdCYmZi5pbml0KGUsZCk7cmV0dXJuIGZ9O1xuYi5yZWdpc3RlclNlcmllc1R5cGU9djtiLnNlcmllc1R5cGU9ZnVuY3Rpb24oZSxkLHEsayxsKXt2YXIgZj1ELnBsb3RPcHRpb25zfHx7fTtkPWR8fFwiXCI7ZltlXT1CKGZbZF0scSk7dihlLEMoYi5zZXJpZXNUeXBlc1tkXXx8ZnVuY3Rpb24oKXt9LGspKTtiLnNlcmllc1R5cGVzW2VdLnByb3RvdHlwZS50eXBlPWU7bCYmKGIuc2VyaWVzVHlwZXNbZV0ucHJvdG90eXBlLnBvaW50Q2xhc3M9QyhJLGwpKTtyZXR1cm4gYi5zZXJpZXNUeXBlc1tlXX19KSh4fHwoeD17fSkpO2Uuc2VyaWVzVHlwZT14LnNlcmllc1R5cGU7cmV0dXJuIHh9KTtPKGUsXCJDb3JlL0NoYXJ0L0NoYXJ0LmpzXCIsW2VbXCJDb3JlL0FuaW1hdGlvbi9BbmltYXRpb25VdGlsaXRpZXMuanNcIl0sZVtcIkNvcmUvQXhpcy9BeGlzLmpzXCJdLGVbXCJDb3JlL0Zvcm1hdFV0aWxpdGllcy5qc1wiXSxlW1wiQ29yZS9HbG9iYWxzLmpzXCJdLGVbXCJDb3JlL0xlZ2VuZC5qc1wiXSxlW1wiQ29yZS9NU1BvaW50ZXIuanNcIl0sZVtcIkNvcmUvT3B0aW9ucy5qc1wiXSxcbmVbXCJDb3JlL0NvbG9yL1BhbGV0dGUuanNcIl0sZVtcIkNvcmUvUG9pbnRlci5qc1wiXSxlW1wiQ29yZS9TZXJpZXMvU2VyaWVzUmVnaXN0cnkuanNcIl0sZVtcIkNvcmUvVGltZS5qc1wiXSxlW1wiQ29yZS9VdGlsaXRpZXMuanNcIl0sZVtcIkNvcmUvUmVuZGVyZXIvSFRNTC9BU1QuanNcIl1dLGZ1bmN0aW9uKGUsYixJLHosSCxHLEMsQix4LHcsdixmLGQpe3ZhciBxPWUuYW5pbWF0ZSxrPWUuYW5pbU9iamVjdCxsPWUuc2V0QW5pbWF0aW9uLEQ9SS5udW1iZXJGb3JtYXQsdT16LmNoYXJ0cyxuPXouZG9jLEo9ei53aW4sRT1DLmRlZmF1bHRPcHRpb25zLG09Qy5kZWZhdWx0VGltZSxjPXcuc2VyaWVzVHlwZXMsZz1mLmFkZEV2ZW50LGE9Zi5hdHRyLGg9Zi5jbGVhblJlY3Vyc2l2ZWx5LHI9Zi5jcmVhdGVFbGVtZW50LEE9Zi5jc3MseT1mLmRlZmluZWQsTD1mLmRpc2NhcmRFbGVtZW50LFA9Zi5lcmFzZSxSPWYuZXJyb3IsVj1mLmV4dGVuZCxRPWYuZmluZCxNPWYuZmlyZUV2ZW50LHQ9Zi5nZXRTdHlsZSxcbnA9Zi5pc0FycmF5LE89Zi5pc0Z1bmN0aW9uLFo9Zi5pc051bWJlcixlYT1mLmlzT2JqZWN0LEY9Zi5pc1N0cmluZyxTPWYubWVyZ2UsSz1mLm9iamVjdEVhY2gsVD1mLnBpY2ssWD1mLnBJbnQsVT1mLnJlbGF0aXZlTGVuZ3RoLGZhPWYucmVtb3ZlRXZlbnQsWT1mLnNwbGF0LGJhPWYuc3luY1RpbWVvdXQsaGE9Zi51bmlxdWVLZXksY2E9ei5tYXJnaW5OYW1lcyxhYT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoYSxjLGQpe3RoaXMuc2VyaWVzPXRoaXMucmVuZGVyVG89dGhpcy5yZW5kZXJlcj10aGlzLnBvaW50ZXI9dGhpcy5wb2ludENvdW50PXRoaXMucGxvdFdpZHRoPXRoaXMucGxvdFRvcD10aGlzLnBsb3RMZWZ0PXRoaXMucGxvdEhlaWdodD10aGlzLnBsb3RCb3g9dGhpcy5vcHRpb25zPXRoaXMubnVtYmVyRm9ybWF0dGVyPXRoaXMubWFyZ2luPXRoaXMubGVnZW5kPXRoaXMubGFiZWxDb2xsZWN0b3JzPXRoaXMuaXNSZXNpemluZz10aGlzLmluZGV4PXRoaXMuY29udGFpbmVyPXRoaXMuY29sb3JDb3VudGVyPVxudGhpcy5jbGlwQm94PXRoaXMuY2hhcnRXaWR0aD10aGlzLmNoYXJ0SGVpZ2h0PXRoaXMuYm91bmRzPXRoaXMuYXhpc09mZnNldD10aGlzLmF4ZXM9dm9pZCAwO3RoaXMuc2hhcmVkQ2xpcHM9e307dGhpcy55QXhpcz10aGlzLnhBeGlzPXRoaXMudXNlck9wdGlvbnM9dGhpcy50aXRsZU9mZnNldD10aGlzLnRpbWU9dGhpcy5zeW1ib2xDb3VudGVyPXRoaXMuc3BhY2luZ0JveD10aGlzLnNwYWNpbmc9dm9pZCAwO3RoaXMuZ2V0QXJncyhhLGMsZCl9ZS5wcm90b3R5cGUuZ2V0QXJncz1mdW5jdGlvbihhLGMsZCl7RihhKXx8YS5ub2RlTmFtZT8odGhpcy5yZW5kZXJUbz1hLHRoaXMuaW5pdChjLGQpKTp0aGlzLmluaXQoYSxjKX07ZS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihhLGMpe3ZhciBkPWEucGxvdE9wdGlvbnN8fHt9O00odGhpcyxcImluaXRcIix7YXJnczphcmd1bWVudHN9LGZ1bmN0aW9uKCl7dmFyIGI9UyhFLGEpLGU9Yi5jaGFydDtLKGIucGxvdE9wdGlvbnMsZnVuY3Rpb24oYSxcbmMpe2VhKGEpJiYoYS50b29sdGlwPWRbY10mJlMoZFtjXS50b29sdGlwKXx8dm9pZCAwKX0pO2IudG9vbHRpcC51c2VyT3B0aW9ucz1hLmNoYXJ0JiZhLmNoYXJ0LmZvckV4cG9ydCYmYS50b29sdGlwLnVzZXJPcHRpb25zfHxhLnRvb2x0aXA7dGhpcy51c2VyT3B0aW9ucz1hO3ZhciBoPWUuZXZlbnRzO3RoaXMubWFyZ2luPVtdO3RoaXMuc3BhY2luZz1bXTt0aGlzLmJvdW5kcz17aDp7fSx2Ont9fTt0aGlzLmxhYmVsQ29sbGVjdG9ycz1bXTt0aGlzLmNhbGxiYWNrPWM7dGhpcy5pc1Jlc2l6aW5nPTA7dGhpcy5vcHRpb25zPWI7dGhpcy5heGVzPVtdO3RoaXMuc2VyaWVzPVtdO3RoaXMudGltZT1hLnRpbWUmJk9iamVjdC5rZXlzKGEudGltZSkubGVuZ3RoP25ldyB2KGEudGltZSk6ei50aW1lO3RoaXMubnVtYmVyRm9ybWF0dGVyPWUubnVtYmVyRm9ybWF0dGVyfHxEO3RoaXMuc3R5bGVkTW9kZT1lLnN0eWxlZE1vZGU7dGhpcy5oYXNDYXJ0ZXNpYW5TZXJpZXM9ZS5zaG93QXhlczt2YXIgZj1cbnRoaXM7Zi5pbmRleD11Lmxlbmd0aDt1LnB1c2goZik7ei5jaGFydENvdW50Kys7aCYmSyhoLGZ1bmN0aW9uKGEsYyl7TyhhKSYmZyhmLGMsYSl9KTtmLnhBeGlzPVtdO2YueUF4aXM9W107Zi5wb2ludENvdW50PWYuY29sb3JDb3VudGVyPWYuc3ltYm9sQ291bnRlcj0wO00oZixcImFmdGVySW5pdFwiKTtmLmZpcnN0UmVuZGVyKCl9KX07ZS5wcm90b3R5cGUuaW5pdFNlcmllcz1mdW5jdGlvbihhKXt2YXIgZD10aGlzLm9wdGlvbnMuY2hhcnQ7ZD1hLnR5cGV8fGQudHlwZXx8ZC5kZWZhdWx0U2VyaWVzVHlwZTt2YXIgYj1jW2RdO2J8fFIoMTcsITAsdGhpcyx7bWlzc2luZ01vZHVsZUZvcjpkfSk7ZD1uZXcgYjtcImZ1bmN0aW9uXCI9PT10eXBlb2YgZC5pbml0JiZkLmluaXQodGhpcyxhKTtyZXR1cm4gZH07ZS5wcm90b3R5cGUuc2V0U2VyaWVzRGF0YT1mdW5jdGlvbigpe3RoaXMuZ2V0U2VyaWVzT3JkZXJCeUxpbmtzKCkuZm9yRWFjaChmdW5jdGlvbihhKXthLnBvaW50c3x8YS5kYXRhfHxcbiFhLmVuYWJsZWREYXRhU29ydGluZ3x8YS5zZXREYXRhKGEub3B0aW9ucy5kYXRhLCExKX0pfTtlLnByb3RvdHlwZS5nZXRTZXJpZXNPcmRlckJ5TGlua3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXJpZXMuY29uY2F0KCkuc29ydChmdW5jdGlvbihhLGMpe3JldHVybiBhLmxpbmtlZFNlcmllcy5sZW5ndGh8fGMubGlua2VkU2VyaWVzLmxlbmd0aD9jLmxpbmtlZFNlcmllcy5sZW5ndGgtYS5saW5rZWRTZXJpZXMubGVuZ3RoOjB9KX07ZS5wcm90b3R5cGUub3JkZXJTZXJpZXM9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5zZXJpZXM7Zm9yKGE9YXx8MDthPGMubGVuZ3RoO2ErKyljW2FdJiYoY1thXS5pbmRleD1hLGNbYV0ubmFtZT1jW2FdLmdldE5hbWUoKSl9O2UucHJvdG90eXBlLmlzSW5zaWRlUGxvdD1mdW5jdGlvbihhLGMsZCl7dm9pZCAwPT09ZCYmKGQ9e30pO3ZhciBiPXRoaXMuaW52ZXJ0ZWQsZT10aGlzLnBsb3RCb3gsaD10aGlzLnBsb3RMZWZ0LGc9dGhpcy5wbG90VG9wLFxuZj10aGlzLnNjcm9sbGFibGVQbG90Qm94LG09dGhpcy5zY3JvbGxpbmdDb250YWluZXI7bT12b2lkIDA9PT1tP3tzY3JvbGxMZWZ0OjAsc2Nyb2xsVG9wOjB9Om07dmFyIGs9bS5zY3JvbGxMZWZ0O209bS5zY3JvbGxUb3A7dmFyIGw9ZC5zZXJpZXM7ZT1kLnZpc2libGVQbG90T25seSYmZnx8ZTtmPWQuaW52ZXJ0ZWQ/YzphO2M9ZC5pbnZlcnRlZD9hOmM7YT17eDpmLHk6Yyxpc0luc2lkZVBsb3Q6ITB9O2lmKCFkLmlnbm9yZVgpe3ZhciBGPWwmJihiP2wueUF4aXM6bC54QXhpcyl8fHtwb3M6aCxsZW46SW5maW5pdHl9O2Y9ZC5wYW5lQ29vcmRpbmF0ZXM/Ri5wb3MrZjpoK2Y7Zj49TWF0aC5tYXgoaytoLEYucG9zKSYmZjw9TWF0aC5taW4oaytoK2Uud2lkdGgsRi5wb3MrRi5sZW4pfHwoYS5pc0luc2lkZVBsb3Q9ITEpfSFkLmlnbm9yZVkmJmEuaXNJbnNpZGVQbG90JiYoYj1sJiYoYj9sLnhBeGlzOmwueUF4aXMpfHx7cG9zOmcsbGVuOkluZmluaXR5fSxkPWQucGFuZUNvb3JkaW5hdGVzP1xuYi5wb3MrYzpnK2MsZD49TWF0aC5tYXgobStnLGIucG9zKSYmZDw9TWF0aC5taW4obStnK2UuaGVpZ2h0LGIucG9zK2IubGVuKXx8KGEuaXNJbnNpZGVQbG90PSExKSk7TSh0aGlzLFwiYWZ0ZXJJc0luc2lkZVBsb3RcIixhKTtyZXR1cm4gYS5pc0luc2lkZVBsb3R9O2UucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbihhKXtNKHRoaXMsXCJiZWZvcmVSZWRyYXdcIik7dmFyIGM9dGhpcy5oYXNDYXJ0ZXNpYW5TZXJpZXM/dGhpcy5heGVzOnRoaXMuY29sb3JBeGlzfHxbXSxkPXRoaXMuc2VyaWVzLGI9dGhpcy5wb2ludGVyLGU9dGhpcy5sZWdlbmQsaD10aGlzLnVzZXJPcHRpb25zLmxlZ2VuZCxnPXRoaXMuaXNEaXJ0eUxlZ2VuZCxmPXRoaXMuaXNEaXJ0eUJveCxtPXRoaXMucmVuZGVyZXIsaz1tLmlzSGlkZGVuKCksRj1bXTt0aGlzLnNldFJlc3BvbnNpdmUmJnRoaXMuc2V0UmVzcG9uc2l2ZSghMSk7bCh0aGlzLmhhc1JlbmRlcmVkP2E6ITEsdGhpcyk7ayYmdGhpcy50ZW1wb3JhcnlEaXNwbGF5KCk7XG50aGlzLmxheU91dFRpdGxlcygpO2ZvcihhPWQubGVuZ3RoO2EtLTspe3ZhciBuPWRbYV07aWYobi5vcHRpb25zLnN0YWNraW5nfHxuLm9wdGlvbnMuY2VudGVySW5DYXRlZ29yeSl7dmFyIHI9ITA7aWYobi5pc0RpcnR5KXt2YXIgSz0hMDticmVha319fWlmKEspZm9yKGE9ZC5sZW5ndGg7YS0tOyluPWRbYV0sbi5vcHRpb25zLnN0YWNraW5nJiYobi5pc0RpcnR5PSEwKTtkLmZvckVhY2goZnVuY3Rpb24oYSl7YS5pc0RpcnR5JiYoXCJwb2ludFwiPT09YS5vcHRpb25zLmxlZ2VuZFR5cGU/KFwiZnVuY3Rpb25cIj09PXR5cGVvZiBhLnVwZGF0ZVRvdGFscyYmYS51cGRhdGVUb3RhbHMoKSxnPSEwKTpoJiYoaC5sYWJlbEZvcm1hdHRlcnx8aC5sYWJlbEZvcm1hdCkmJihnPSEwKSk7YS5pc0RpcnR5RGF0YSYmTShhLFwidXBkYXRlZERhdGFcIil9KTtnJiZlJiZlLm9wdGlvbnMuZW5hYmxlZCYmKGUucmVuZGVyKCksdGhpcy5pc0RpcnR5TGVnZW5kPSExKTtyJiZ0aGlzLmdldFN0YWNrcygpO2MuZm9yRWFjaChmdW5jdGlvbihhKXthLnVwZGF0ZU5hbWVzKCk7XG5hLnNldFNjYWxlKCl9KTt0aGlzLmdldE1hcmdpbnMoKTtjLmZvckVhY2goZnVuY3Rpb24oYSl7YS5pc0RpcnR5JiYoZj0hMCl9KTtjLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGM9YS5taW4rXCIsXCIrYS5tYXg7YS5leHRLZXkhPT1jJiYoYS5leHRLZXk9YyxGLnB1c2goZnVuY3Rpb24oKXtNKGEsXCJhZnRlclNldEV4dHJlbWVzXCIsVihhLmV2ZW50QXJncyxhLmdldEV4dHJlbWVzKCkpKTtkZWxldGUgYS5ldmVudEFyZ3N9KSk7KGZ8fHIpJiZhLnJlZHJhdygpfSk7ZiYmdGhpcy5kcmF3Q2hhcnRCb3goKTtNKHRoaXMsXCJwcmVkcmF3XCIpO2QuZm9yRWFjaChmdW5jdGlvbihhKXsoZnx8YS5pc0RpcnR5KSYmYS52aXNpYmxlJiZhLnJlZHJhdygpO2EuaXNEaXJ0eURhdGE9ITF9KTtiJiZiLnJlc2V0KCEwKTttLmRyYXcoKTtNKHRoaXMsXCJyZWRyYXdcIik7TSh0aGlzLFwicmVuZGVyXCIpO2smJnRoaXMudGVtcG9yYXJ5RGlzcGxheSghMCk7Ri5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2FsbCgpfSl9O1xuZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoYyl7cmV0dXJuIGMuaWQ9PT1hfHxjLm9wdGlvbnMmJmMub3B0aW9ucy5pZD09PWF9dmFyIGQ9dGhpcy5zZXJpZXMsYjt2YXIgZT1RKHRoaXMuYXhlcyxjKXx8USh0aGlzLnNlcmllcyxjKTtmb3IoYj0wOyFlJiZiPGQubGVuZ3RoO2IrKyllPVEoZFtiXS5wb2ludHN8fFtdLGMpO3JldHVybiBlfTtlLnByb3RvdHlwZS5nZXRBeGVzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPXRoaXMub3B0aW9ucyxkPWMueEF4aXM9WShjLnhBeGlzfHx7fSk7Yz1jLnlBeGlzPVkoYy55QXhpc3x8e30pO00odGhpcyxcImdldEF4ZXNcIik7ZC5mb3JFYWNoKGZ1bmN0aW9uKGEsYyl7YS5pbmRleD1jO2EuaXNYPSEwfSk7Yy5mb3JFYWNoKGZ1bmN0aW9uKGEsYyl7YS5pbmRleD1jfSk7ZC5jb25jYXQoYykuZm9yRWFjaChmdW5jdGlvbihjKXtuZXcgYihhLGMpfSk7TSh0aGlzLFwiYWZ0ZXJHZXRBeGVzXCIpfTtlLnByb3RvdHlwZS5nZXRTZWxlY3RlZFBvaW50cz1cbmZ1bmN0aW9uKCl7dmFyIGE9W107dGhpcy5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihjKXthPWEuY29uY2F0KGMuZ2V0UG9pbnRzQ29sbGVjdGlvbigpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gVChhLnNlbGVjdGVkU3RhZ2luZyxhLnNlbGVjdGVkKX0pKX0pO3JldHVybiBhfTtlLnByb3RvdHlwZS5nZXRTZWxlY3RlZFNlcmllcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlcmllcy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuc2VsZWN0ZWR9KX07ZS5wcm90b3R5cGUuc2V0VGl0bGU9ZnVuY3Rpb24oYSxjLGQpe3RoaXMuYXBwbHlEZXNjcmlwdGlvbihcInRpdGxlXCIsYSk7dGhpcy5hcHBseURlc2NyaXB0aW9uKFwic3VidGl0bGVcIixjKTt0aGlzLmFwcGx5RGVzY3JpcHRpb24oXCJjYXB0aW9uXCIsdm9pZCAwKTt0aGlzLmxheU91dFRpdGxlcyhkKX07ZS5wcm90b3R5cGUuYXBwbHlEZXNjcmlwdGlvbj1mdW5jdGlvbihhLGMpe3ZhciBkPXRoaXMsYj1cInRpdGxlXCI9PT1hP3tjb2xvcjpCLm5ldXRyYWxDb2xvcjgwLFxuZm9udFNpemU6dGhpcy5vcHRpb25zLmlzU3RvY2s/XCIxNnB4XCI6XCIxOHB4XCJ9Ontjb2xvcjpCLm5ldXRyYWxDb2xvcjYwfTtiPXRoaXMub3B0aW9uc1thXT1TKCF0aGlzLnN0eWxlZE1vZGUmJntzdHlsZTpifSx0aGlzLm9wdGlvbnNbYV0sYyk7dmFyIGU9dGhpc1thXTtlJiZjJiYodGhpc1thXT1lPWUuZGVzdHJveSgpKTtiJiYhZSYmKGU9dGhpcy5yZW5kZXJlci50ZXh0KGIudGV4dCwwLDAsYi51c2VIVE1MKS5hdHRyKHthbGlnbjpiLmFsaWduLFwiY2xhc3NcIjpcImhpZ2hjaGFydHMtXCIrYSx6SW5kZXg6Yi56SW5kZXh8fDR9KS5hZGQoKSxlLnVwZGF0ZT1mdW5jdGlvbihjKXtkW3t0aXRsZTpcInNldFRpdGxlXCIsc3VidGl0bGU6XCJzZXRTdWJ0aXRsZVwiLGNhcHRpb246XCJzZXRDYXB0aW9uXCJ9W2FdXShjKX0sdGhpcy5zdHlsZWRNb2RlfHxlLmNzcyhiLnN0eWxlKSx0aGlzW2FdPWUpfTtlLnByb3RvdHlwZS5sYXlPdXRUaXRsZXM9ZnVuY3Rpb24oYSl7dmFyIGM9WzAsMCwwXSxkPXRoaXMucmVuZGVyZXIsXG5iPXRoaXMuc3BhY2luZ0JveDtbXCJ0aXRsZVwiLFwic3VidGl0bGVcIixcImNhcHRpb25cIl0uZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgZT10aGlzW2FdLGg9dGhpcy5vcHRpb25zW2FdLGc9aC52ZXJ0aWNhbEFsaWdufHxcInRvcFwiO2E9XCJ0aXRsZVwiPT09YT8tMzpcInRvcFwiPT09Zz9jWzBdKzI6MDtpZihlKXtpZighdGhpcy5zdHlsZWRNb2RlKXZhciBmPWguc3R5bGUuZm9udFNpemU7Zj1kLmZvbnRNZXRyaWNzKGYsZSkuYjtlLmNzcyh7d2lkdGg6KGgud2lkdGh8fGIud2lkdGgrKGgud2lkdGhBZGp1c3R8fDApKStcInB4XCJ9KTt2YXIgbT1NYXRoLnJvdW5kKGUuZ2V0QkJveChoLnVzZUhUTUwpLmhlaWdodCk7ZS5hbGlnbihWKHt5OlwiYm90dG9tXCI9PT1nP2Y6YStmLGhlaWdodDptfSxoKSwhMSxcInNwYWNpbmdCb3hcIik7aC5mbG9hdGluZ3x8KFwidG9wXCI9PT1nP2NbMF09TWF0aC5jZWlsKGNbMF0rbSk6XCJib3R0b21cIj09PWcmJihjWzJdPU1hdGguY2VpbChjWzJdK20pKSl9fSx0aGlzKTtjWzBdJiZcInRvcFwiPT09XG4odGhpcy5vcHRpb25zLnRpdGxlLnZlcnRpY2FsQWxpZ258fFwidG9wXCIpJiYoY1swXSs9dGhpcy5vcHRpb25zLnRpdGxlLm1hcmdpbik7Y1syXSYmXCJib3R0b21cIj09PXRoaXMub3B0aW9ucy5jYXB0aW9uLnZlcnRpY2FsQWxpZ24mJihjWzJdKz10aGlzLm9wdGlvbnMuY2FwdGlvbi5tYXJnaW4pO3ZhciBlPSF0aGlzLnRpdGxlT2Zmc2V0fHx0aGlzLnRpdGxlT2Zmc2V0LmpvaW4oXCIsXCIpIT09Yy5qb2luKFwiLFwiKTt0aGlzLnRpdGxlT2Zmc2V0PWM7TSh0aGlzLFwiYWZ0ZXJMYXlPdXRUaXRsZXNcIik7IXRoaXMuaXNEaXJ0eUJveCYmZSYmKHRoaXMuaXNEaXJ0eUJveD10aGlzLmlzRGlydHlMZWdlbmQ9ZSx0aGlzLmhhc1JlbmRlcmVkJiZUKGEsITApJiZ0aGlzLmlzRGlydHlCb3gmJnRoaXMucmVkcmF3KCkpfTtlLnByb3RvdHlwZS5nZXRDaGFydFNpemU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMuY2hhcnQsYz1hLndpZHRoO2E9YS5oZWlnaHQ7dmFyIGQ9dGhpcy5yZW5kZXJUbzt5KGMpfHxcbih0aGlzLmNvbnRhaW5lcldpZHRoPXQoZCxcIndpZHRoXCIpKTt5KGEpfHwodGhpcy5jb250YWluZXJIZWlnaHQ9dChkLFwiaGVpZ2h0XCIpKTt0aGlzLmNoYXJ0V2lkdGg9TWF0aC5tYXgoMCxjfHx0aGlzLmNvbnRhaW5lcldpZHRofHw2MDApO3RoaXMuY2hhcnRIZWlnaHQ9TWF0aC5tYXgoMCxVKGEsdGhpcy5jaGFydFdpZHRoKXx8KDE8dGhpcy5jb250YWluZXJIZWlnaHQ/dGhpcy5jb250YWluZXJIZWlnaHQ6NDAwKSl9O2UucHJvdG90eXBlLnRlbXBvcmFyeURpc3BsYXk9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5yZW5kZXJUbztpZihhKWZvcig7YyYmYy5zdHlsZTspYy5oY09yaWdTdHlsZSYmKEEoYyxjLmhjT3JpZ1N0eWxlKSxkZWxldGUgYy5oY09yaWdTdHlsZSksYy5oY09yaWdEZXRhY2hlZCYmKG4uYm9keS5yZW1vdmVDaGlsZChjKSxjLmhjT3JpZ0RldGFjaGVkPSExKSxjPWMucGFyZW50Tm9kZTtlbHNlIGZvcig7YyYmYy5zdHlsZTspe24uYm9keS5jb250YWlucyhjKXx8Yy5wYXJlbnROb2RlfHxcbihjLmhjT3JpZ0RldGFjaGVkPSEwLG4uYm9keS5hcHBlbmRDaGlsZChjKSk7aWYoXCJub25lXCI9PT10KGMsXCJkaXNwbGF5XCIsITEpfHxjLmhjT3JpY0RldGFjaGVkKWMuaGNPcmlnU3R5bGU9e2Rpc3BsYXk6Yy5zdHlsZS5kaXNwbGF5LGhlaWdodDpjLnN0eWxlLmhlaWdodCxvdmVyZmxvdzpjLnN0eWxlLm92ZXJmbG93fSxhPXtkaXNwbGF5OlwiYmxvY2tcIixvdmVyZmxvdzpcImhpZGRlblwifSxjIT09dGhpcy5yZW5kZXJUbyYmKGEuaGVpZ2h0PTApLEEoYyxhKSxjLm9mZnNldFdpZHRofHxjLnN0eWxlLnNldFByb3BlcnR5KFwiZGlzcGxheVwiLFwiYmxvY2tcIixcImltcG9ydGFudFwiKTtjPWMucGFyZW50Tm9kZTtpZihjPT09bi5ib2R5KWJyZWFrfX07ZS5wcm90b3R5cGUuc2V0Q2xhc3NOYW1lPWZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyLmNsYXNzTmFtZT1cImhpZ2hjaGFydHMtY29udGFpbmVyIFwiKyhhfHxcIlwiKX07ZS5wcm90b3R5cGUuZ2V0Q29udGFpbmVyPWZ1bmN0aW9uKCl7dmFyIGM9dGhpcy5vcHRpb25zLFxuZD1jLmNoYXJ0O3ZhciBiPXRoaXMucmVuZGVyVG87dmFyIGU9aGEoKSxoLGc7Ynx8KHRoaXMucmVuZGVyVG89Yj1kLnJlbmRlclRvKTtGKGIpJiYodGhpcy5yZW5kZXJUbz1iPW4uZ2V0RWxlbWVudEJ5SWQoYikpO2J8fFIoMTMsITAsdGhpcyk7dmFyIGY9WChhKGIsXCJkYXRhLWhpZ2hjaGFydHMtY2hhcnRcIikpO1ooZikmJnVbZl0mJnVbZl0uaGFzUmVuZGVyZWQmJnVbZl0uZGVzdHJveSgpO2EoYixcImRhdGEtaGlnaGNoYXJ0cy1jaGFydFwiLHRoaXMuaW5kZXgpO2IuaW5uZXJIVE1MPVwiXCI7ZC5za2lwQ2xvbmV8fGIub2Zmc2V0V2lkdGh8fHRoaXMudGVtcG9yYXJ5RGlzcGxheSgpO3RoaXMuZ2V0Q2hhcnRTaXplKCk7Zj10aGlzLmNoYXJ0V2lkdGg7dmFyIG09dGhpcy5jaGFydEhlaWdodDtBKGIse292ZXJmbG93OlwiaGlkZGVuXCJ9KTt0aGlzLnN0eWxlZE1vZGV8fChoPVYoe3Bvc2l0aW9uOlwicmVsYXRpdmVcIixvdmVyZmxvdzpcImhpZGRlblwiLHdpZHRoOmYrXCJweFwiLGhlaWdodDptK1wicHhcIixcbnRleHRBbGlnbjpcImxlZnRcIixsaW5lSGVpZ2h0Olwibm9ybWFsXCIsekluZGV4OjAsXCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3JcIjpcInJnYmEoMCwwLDAsMClcIix1c2VyU2VsZWN0Olwibm9uZVwiLFwidG91Y2gtYWN0aW9uXCI6XCJtYW5pcHVsYXRpb25cIixvdXRsaW5lOlwibm9uZVwifSxkLnN0eWxlfHx7fSkpO3RoaXMuY29udGFpbmVyPWI9cihcImRpdlwiLHtpZDplfSxoLGIpO3RoaXMuX2N1cnNvcj1iLnN0eWxlLmN1cnNvcjt0aGlzLnJlbmRlcmVyPW5ldyAoeltkLnJlbmRlcmVyXXx8ei5SZW5kZXJlcikoYixmLG0sbnVsbCxkLmZvckV4cG9ydCxjLmV4cG9ydGluZyYmYy5leHBvcnRpbmcuYWxsb3dIVE1MLHRoaXMuc3R5bGVkTW9kZSk7bCh2b2lkIDAsdGhpcyk7dGhpcy5zZXRDbGFzc05hbWUoZC5jbGFzc05hbWUpO2lmKHRoaXMuc3R5bGVkTW9kZSlmb3IoZyBpbiBjLmRlZnMpdGhpcy5yZW5kZXJlci5kZWZpbml0aW9uKGMuZGVmc1tnXSk7ZWxzZSB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGQuc3R5bGUpO1xudGhpcy5yZW5kZXJlci5jaGFydEluZGV4PXRoaXMuaW5kZXg7TSh0aGlzLFwiYWZ0ZXJHZXRDb250YWluZXJcIil9O2UucHJvdG90eXBlLmdldE1hcmdpbnM9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5zcGFjaW5nLGQ9dGhpcy5tYXJnaW4sYj10aGlzLnRpdGxlT2Zmc2V0O3RoaXMucmVzZXRNYXJnaW5zKCk7YlswXSYmIXkoZFswXSkmJih0aGlzLnBsb3RUb3A9TWF0aC5tYXgodGhpcy5wbG90VG9wLGJbMF0rY1swXSkpO2JbMl0mJiF5KGRbMl0pJiYodGhpcy5tYXJnaW5Cb3R0b209TWF0aC5tYXgodGhpcy5tYXJnaW5Cb3R0b20sYlsyXStjWzJdKSk7dGhpcy5sZWdlbmQmJnRoaXMubGVnZW5kLmRpc3BsYXkmJnRoaXMubGVnZW5kLmFkanVzdE1hcmdpbnMoZCxjKTtNKHRoaXMsXCJnZXRNYXJnaW5zXCIpO2F8fHRoaXMuZ2V0QXhpc01hcmdpbnMoKX07ZS5wcm90b3R5cGUuZ2V0QXhpc01hcmdpbnM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGM9YS5heGlzT2Zmc2V0PVswLDAsMCwwXSxkPWEuY29sb3JBeGlzLFxuYj1hLm1hcmdpbixlPWZ1bmN0aW9uKGEpe2EuZm9yRWFjaChmdW5jdGlvbihhKXthLnZpc2libGUmJmEuZ2V0T2Zmc2V0KCl9KX07YS5oYXNDYXJ0ZXNpYW5TZXJpZXM/ZShhLmF4ZXMpOmQmJmQubGVuZ3RoJiZlKGQpO2NhLmZvckVhY2goZnVuY3Rpb24oZCxlKXt5KGJbZV0pfHwoYVtkXSs9Y1tlXSl9KTthLnNldENoYXJ0U2l6ZSgpfTtlLnByb3RvdHlwZS5yZWZsb3c9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxkPWMub3B0aW9ucy5jaGFydCxiPWMucmVuZGVyVG8sZT15KGQud2lkdGgpJiZ5KGQuaGVpZ2h0KSxoPWQud2lkdGh8fHQoYixcIndpZHRoXCIpO2Q9ZC5oZWlnaHR8fHQoYixcImhlaWdodFwiKTtiPWE/YS50YXJnZXQ6SjtkZWxldGUgYy5wb2ludGVyLmNoYXJ0UG9zaXRpb247aWYoIWUmJiFjLmlzUHJpbnRpbmcmJmgmJmQmJihiPT09Snx8Yj09PW4pKXtpZihoIT09Yy5jb250YWluZXJXaWR0aHx8ZCE9PWMuY29udGFpbmVySGVpZ2h0KWYuY2xlYXJUaW1lb3V0KGMucmVmbG93VGltZW91dCksXG5jLnJlZmxvd1RpbWVvdXQ9YmEoZnVuY3Rpb24oKXtjLmNvbnRhaW5lciYmYy5zZXRTaXplKHZvaWQgMCx2b2lkIDAsITEpfSxhPzEwMDowKTtjLmNvbnRhaW5lcldpZHRoPWg7Yy5jb250YWluZXJIZWlnaHQ9ZH19O2UucHJvdG90eXBlLnNldFJlZmxvdz1mdW5jdGlvbihhKXt2YXIgYz10aGlzOyExPT09YXx8dGhpcy51bmJpbmRSZWZsb3c/ITE9PT1hJiZ0aGlzLnVuYmluZFJlZmxvdyYmKHRoaXMudW5iaW5kUmVmbG93PXRoaXMudW5iaW5kUmVmbG93KCkpOih0aGlzLnVuYmluZFJlZmxvdz1nKEosXCJyZXNpemVcIixmdW5jdGlvbihhKXtjLm9wdGlvbnMmJmMucmVmbG93KGEpfSksZyh0aGlzLFwiZGVzdHJveVwiLHRoaXMudW5iaW5kUmVmbG93KSl9O2UucHJvdG90eXBlLnNldFNpemU9ZnVuY3Rpb24oYSxjLGQpe3ZhciBiPXRoaXMsZT1iLnJlbmRlcmVyO2IuaXNSZXNpemluZys9MTtsKGQsYik7ZD1lLmdsb2JhbEFuaW1hdGlvbjtiLm9sZENoYXJ0SGVpZ2h0PWIuY2hhcnRIZWlnaHQ7XG5iLm9sZENoYXJ0V2lkdGg9Yi5jaGFydFdpZHRoO1widW5kZWZpbmVkXCIhPT10eXBlb2YgYSYmKGIub3B0aW9ucy5jaGFydC53aWR0aD1hKTtcInVuZGVmaW5lZFwiIT09dHlwZW9mIGMmJihiLm9wdGlvbnMuY2hhcnQuaGVpZ2h0PWMpO2IuZ2V0Q2hhcnRTaXplKCk7Yi5zdHlsZWRNb2RlfHwoZD9xOkEpKGIuY29udGFpbmVyLHt3aWR0aDpiLmNoYXJ0V2lkdGgrXCJweFwiLGhlaWdodDpiLmNoYXJ0SGVpZ2h0K1wicHhcIn0sZCk7Yi5zZXRDaGFydFNpemUoITApO2Uuc2V0U2l6ZShiLmNoYXJ0V2lkdGgsYi5jaGFydEhlaWdodCxkKTtiLmF4ZXMuZm9yRWFjaChmdW5jdGlvbihhKXthLmlzRGlydHk9ITA7YS5zZXRTY2FsZSgpfSk7Yi5pc0RpcnR5TGVnZW5kPSEwO2IuaXNEaXJ0eUJveD0hMDtiLmxheU91dFRpdGxlcygpO2IuZ2V0TWFyZ2lucygpO2IucmVkcmF3KGQpO2Iub2xkQ2hhcnRIZWlnaHQ9bnVsbDtNKGIsXCJyZXNpemVcIik7YmEoZnVuY3Rpb24oKXtiJiZNKGIsXCJlbmRSZXNpemVcIixudWxsLFxuZnVuY3Rpb24oKXstLWIuaXNSZXNpemluZ30pfSxrKGQpLmR1cmF0aW9uKX07ZS5wcm90b3R5cGUuc2V0Q2hhcnRTaXplPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuaW52ZXJ0ZWQsZD10aGlzLnJlbmRlcmVyLGI9dGhpcy5jaGFydFdpZHRoLGU9dGhpcy5jaGFydEhlaWdodCxoPXRoaXMub3B0aW9ucy5jaGFydCxnPXRoaXMuc3BhY2luZyxmPXRoaXMuY2xpcE9mZnNldCxtLGwsayxGO3RoaXMucGxvdExlZnQ9bT1NYXRoLnJvdW5kKHRoaXMucGxvdExlZnQpO3RoaXMucGxvdFRvcD1sPU1hdGgucm91bmQodGhpcy5wbG90VG9wKTt0aGlzLnBsb3RXaWR0aD1rPU1hdGgubWF4KDAsTWF0aC5yb3VuZChiLW0tdGhpcy5tYXJnaW5SaWdodCkpO3RoaXMucGxvdEhlaWdodD1GPU1hdGgubWF4KDAsTWF0aC5yb3VuZChlLWwtdGhpcy5tYXJnaW5Cb3R0b20pKTt0aGlzLnBsb3RTaXplWD1jP0Y6azt0aGlzLnBsb3RTaXplWT1jP2s6Rjt0aGlzLnBsb3RCb3JkZXJXaWR0aD1oLnBsb3RCb3JkZXJXaWR0aHx8XG4wO3RoaXMuc3BhY2luZ0JveD1kLnNwYWNpbmdCb3g9e3g6Z1szXSx5OmdbMF0sd2lkdGg6Yi1nWzNdLWdbMV0saGVpZ2h0OmUtZ1swXS1nWzJdfTt0aGlzLnBsb3RCb3g9ZC5wbG90Qm94PXt4Om0seTpsLHdpZHRoOmssaGVpZ2h0OkZ9O2U9MipNYXRoLmZsb29yKHRoaXMucGxvdEJvcmRlcldpZHRoLzIpO2M9TWF0aC5jZWlsKE1hdGgubWF4KGUsZlszXSkvMik7Yj1NYXRoLmNlaWwoTWF0aC5tYXgoZSxmWzBdKS8yKTt0aGlzLmNsaXBCb3g9e3g6Yyx5OmIsd2lkdGg6TWF0aC5mbG9vcih0aGlzLnBsb3RTaXplWC1NYXRoLm1heChlLGZbMV0pLzItYyksaGVpZ2h0Ok1hdGgubWF4KDAsTWF0aC5mbG9vcih0aGlzLnBsb3RTaXplWS1NYXRoLm1heChlLGZbMl0pLzItYikpfTthfHwodGhpcy5heGVzLmZvckVhY2goZnVuY3Rpb24oYSl7YS5zZXRBeGlzU2l6ZSgpO2Euc2V0QXhpc1RyYW5zbGF0aW9uKCl9KSxkLmFsaWduRWxlbWVudHMoKSk7TSh0aGlzLFwiYWZ0ZXJTZXRDaGFydFNpemVcIixcbntza2lwQXhlczphfSl9O2UucHJvdG90eXBlLnJlc2V0TWFyZ2lucz1mdW5jdGlvbigpe00odGhpcyxcInJlc2V0TWFyZ2luc1wiKTt2YXIgYT10aGlzLGM9YS5vcHRpb25zLmNoYXJ0O1tcIm1hcmdpblwiLFwic3BhY2luZ1wiXS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBiPWNbZF0sZT1lYShiKT9iOltiLGIsYixiXTtbXCJUb3BcIixcIlJpZ2h0XCIsXCJCb3R0b21cIixcIkxlZnRcIl0uZm9yRWFjaChmdW5jdGlvbihiLGgpe2FbZF1baF09VChjW2QrYl0sZVtoXSl9KX0pO2NhLmZvckVhY2goZnVuY3Rpb24oYyxkKXthW2NdPVQoYS5tYXJnaW5bZF0sYS5zcGFjaW5nW2RdKX0pO2EuYXhpc09mZnNldD1bMCwwLDAsMF07YS5jbGlwT2Zmc2V0PVswLDAsMCwwXX07ZS5wcm90b3R5cGUuZHJhd0NoYXJ0Qm94PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHRpb25zLmNoYXJ0LGM9dGhpcy5yZW5kZXJlcixkPXRoaXMuY2hhcnRXaWR0aCxiPXRoaXMuY2hhcnRIZWlnaHQsZT10aGlzLmNoYXJ0QmFja2dyb3VuZCxoPVxudGhpcy5wbG90QmFja2dyb3VuZCxnPXRoaXMucGxvdEJvcmRlcixmPXRoaXMuc3R5bGVkTW9kZSxtPXRoaXMucGxvdEJHSW1hZ2Usaz1hLmJhY2tncm91bmRDb2xvcixsPWEucGxvdEJhY2tncm91bmRDb2xvcixGPWEucGxvdEJhY2tncm91bmRJbWFnZSxuLHI9dGhpcy5wbG90TGVmdCxLPXRoaXMucGxvdFRvcCxxPXRoaXMucGxvdFdpZHRoLHA9dGhpcy5wbG90SGVpZ2h0LHU9dGhpcy5wbG90Qm94LHY9dGhpcy5jbGlwUmVjdCx0PXRoaXMuY2xpcEJveCx3PVwiYW5pbWF0ZVwiO2V8fCh0aGlzLmNoYXJ0QmFja2dyb3VuZD1lPWMucmVjdCgpLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1iYWNrZ3JvdW5kXCIpLmFkZCgpLHc9XCJhdHRyXCIpO2lmKGYpdmFyIHk9bj1lLnN0cm9rZVdpZHRoKCk7ZWxzZXt5PWEuYm9yZGVyV2lkdGh8fDA7bj15KyhhLnNoYWRvdz84OjApO2s9e2ZpbGw6a3x8XCJub25lXCJ9O2lmKHl8fGVbXCJzdHJva2Utd2lkdGhcIl0pay5zdHJva2U9YS5ib3JkZXJDb2xvcixrW1wic3Ryb2tlLXdpZHRoXCJdPVxueTtlLmF0dHIoaykuc2hhZG93KGEuc2hhZG93KX1lW3ddKHt4Om4vMix5Om4vMix3aWR0aDpkLW4teSUyLGhlaWdodDpiLW4teSUyLHI6YS5ib3JkZXJSYWRpdXN9KTt3PVwiYW5pbWF0ZVwiO2h8fCh3PVwiYXR0clwiLHRoaXMucGxvdEJhY2tncm91bmQ9aD1jLnJlY3QoKS5hZGRDbGFzcyhcImhpZ2hjaGFydHMtcGxvdC1iYWNrZ3JvdW5kXCIpLmFkZCgpKTtoW3ddKHUpO2Z8fChoLmF0dHIoe2ZpbGw6bHx8XCJub25lXCJ9KS5zaGFkb3coYS5wbG90U2hhZG93KSxGJiYobT8oRiE9PW0uYXR0cihcImhyZWZcIikmJm0uYXR0cihcImhyZWZcIixGKSxtLmFuaW1hdGUodSkpOnRoaXMucGxvdEJHSW1hZ2U9Yy5pbWFnZShGLHIsSyxxLHApLmFkZCgpKSk7dj92LmFuaW1hdGUoe3dpZHRoOnQud2lkdGgsaGVpZ2h0OnQuaGVpZ2h0fSk6dGhpcy5jbGlwUmVjdD1jLmNsaXBSZWN0KHQpO3c9XCJhbmltYXRlXCI7Z3x8KHc9XCJhdHRyXCIsdGhpcy5wbG90Qm9yZGVyPWc9Yy5yZWN0KCkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLXBsb3QtYm9yZGVyXCIpLmF0dHIoe3pJbmRleDoxfSkuYWRkKCkpO1xuZnx8Zy5hdHRyKHtzdHJva2U6YS5wbG90Qm9yZGVyQ29sb3IsXCJzdHJva2Utd2lkdGhcIjphLnBsb3RCb3JkZXJXaWR0aHx8MCxmaWxsOlwibm9uZVwifSk7Z1t3XShnLmNyaXNwKHt4OnIseTpLLHdpZHRoOnEsaGVpZ2h0OnB9LC1nLnN0cm9rZVdpZHRoKCkpKTt0aGlzLmlzRGlydHlCb3g9ITE7TSh0aGlzLFwiYWZ0ZXJEcmF3Q2hhcnRCb3hcIil9O2UucHJvdG90eXBlLnByb3BGcm9tU2VyaWVzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxkPWEub3B0aW9ucy5jaGFydCxiLGU9YS5vcHRpb25zLnNlcmllcyxoLGc7W1wiaW52ZXJ0ZWRcIixcImFuZ3VsYXJcIixcInBvbGFyXCJdLmZvckVhY2goZnVuY3Rpb24oZil7Yj1jW2QudHlwZXx8ZC5kZWZhdWx0U2VyaWVzVHlwZV07Zz1kW2ZdfHxiJiZiLnByb3RvdHlwZVtmXTtmb3IoaD1lJiZlLmxlbmd0aDshZyYmaC0tOykoYj1jW2VbaF0udHlwZV0pJiZiLnByb3RvdHlwZVtmXSYmKGc9ITApO2FbZl09Z30pfTtlLnByb3RvdHlwZS5saW5rU2VyaWVzPWZ1bmN0aW9uKCl7dmFyIGE9XG50aGlzLGM9YS5zZXJpZXM7Yy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EubGlua2VkU2VyaWVzLmxlbmd0aD0wfSk7Yy5mb3JFYWNoKGZ1bmN0aW9uKGMpe3ZhciBkPWMub3B0aW9ucy5saW5rZWRUbztGKGQpJiYoZD1cIjpwcmV2aW91c1wiPT09ZD9hLnNlcmllc1tjLmluZGV4LTFdOmEuZ2V0KGQpKSYmZC5saW5rZWRQYXJlbnQhPT1jJiYoZC5saW5rZWRTZXJpZXMucHVzaChjKSxjLmxpbmtlZFBhcmVudD1kLGQuZW5hYmxlZERhdGFTb3J0aW5nJiZjLnNldERhdGFTb3J0aW5nT3B0aW9ucygpLGMudmlzaWJsZT1UKGMub3B0aW9ucy52aXNpYmxlLGQub3B0aW9ucy52aXNpYmxlLGMudmlzaWJsZSkpfSk7TSh0aGlzLFwiYWZ0ZXJMaW5rU2VyaWVzXCIpfTtlLnByb3RvdHlwZS5yZW5kZXJTZXJpZXM9ZnVuY3Rpb24oKXt0aGlzLnNlcmllcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EudHJhbnNsYXRlKCk7YS5yZW5kZXIoKX0pfTtlLnByb3RvdHlwZS5yZW5kZXJMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgYT1cbnRoaXMsYz1hLm9wdGlvbnMubGFiZWxzO2MuaXRlbXMmJmMuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihkKXt2YXIgYj1WKGMuc3R5bGUsZC5zdHlsZSksZT1YKGIubGVmdCkrYS5wbG90TGVmdCxoPVgoYi50b3ApK2EucGxvdFRvcCsxMjtkZWxldGUgYi5sZWZ0O2RlbGV0ZSBiLnRvcDthLnJlbmRlcmVyLnRleHQoZC5odG1sLGUsaCkuYXR0cih7ekluZGV4OjJ9KS5jc3MoYikuYWRkKCl9KX07ZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5heGVzLGM9dGhpcy5jb2xvckF4aXMsZD10aGlzLnJlbmRlcmVyLGI9dGhpcy5vcHRpb25zLGU9MCxoPWZ1bmN0aW9uKGEpe2EuZm9yRWFjaChmdW5jdGlvbihhKXthLnZpc2libGUmJmEucmVuZGVyKCl9KX07dGhpcy5zZXRUaXRsZSgpO3RoaXMubGVnZW5kPW5ldyBIKHRoaXMsYi5sZWdlbmQpO3RoaXMuZ2V0U3RhY2tzJiZ0aGlzLmdldFN0YWNrcygpO3RoaXMuZ2V0TWFyZ2lucyghMCk7dGhpcy5zZXRDaGFydFNpemUoKTtcbmI9dGhpcy5wbG90V2lkdGg7YS5zb21lKGZ1bmN0aW9uKGEpe2lmKGEuaG9yaXomJmEudmlzaWJsZSYmYS5vcHRpb25zLmxhYmVscy5lbmFibGVkJiZhLnNlcmllcy5sZW5ndGgpcmV0dXJuIGU9MjEsITB9KTt2YXIgZz10aGlzLnBsb3RIZWlnaHQ9TWF0aC5tYXgodGhpcy5wbG90SGVpZ2h0LWUsMCk7YS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2Euc2V0U2NhbGUoKX0pO3RoaXMuZ2V0QXhpc01hcmdpbnMoKTt2YXIgZj0xLjE8Yi90aGlzLnBsb3RXaWR0aDt2YXIgbT0xLjA1PGcvdGhpcy5wbG90SGVpZ2h0O2lmKGZ8fG0pYS5mb3JFYWNoKGZ1bmN0aW9uKGEpeyhhLmhvcml6JiZmfHwhYS5ob3JpeiYmbSkmJmEuc2V0VGlja0ludGVydmFsKCEwKX0pLHRoaXMuZ2V0TWFyZ2lucygpO3RoaXMuZHJhd0NoYXJ0Qm94KCk7dGhpcy5oYXNDYXJ0ZXNpYW5TZXJpZXM/aChhKTpjJiZjLmxlbmd0aCYmaChjKTt0aGlzLnNlcmllc0dyb3VwfHwodGhpcy5zZXJpZXNHcm91cD1kLmcoXCJzZXJpZXMtZ3JvdXBcIikuYXR0cih7ekluZGV4OjN9KS5hZGQoKSk7XG50aGlzLnJlbmRlclNlcmllcygpO3RoaXMucmVuZGVyTGFiZWxzKCk7dGhpcy5hZGRDcmVkaXRzKCk7dGhpcy5zZXRSZXNwb25zaXZlJiZ0aGlzLnNldFJlc3BvbnNpdmUoKTt0aGlzLmhhc1JlbmRlcmVkPSEwfTtlLnByb3RvdHlwZS5hZGRDcmVkaXRzPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMsZD1TKCEwLHRoaXMub3B0aW9ucy5jcmVkaXRzLGEpO2QuZW5hYmxlZCYmIXRoaXMuY3JlZGl0cyYmKHRoaXMuY3JlZGl0cz10aGlzLnJlbmRlcmVyLnRleHQoZC50ZXh0Kyh0aGlzLm1hcENyZWRpdHN8fFwiXCIpLDAsMCkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLWNyZWRpdHNcIikub24oXCJjbGlja1wiLGZ1bmN0aW9uKCl7ZC5ocmVmJiYoSi5sb2NhdGlvbi5ocmVmPWQuaHJlZil9KS5hdHRyKHthbGlnbjpkLnBvc2l0aW9uLmFsaWduLHpJbmRleDo4fSksYy5zdHlsZWRNb2RlfHx0aGlzLmNyZWRpdHMuY3NzKGQuc3R5bGUpLHRoaXMuY3JlZGl0cy5hZGQoKS5hbGlnbihkLnBvc2l0aW9uKSx0aGlzLmNyZWRpdHMudXBkYXRlPVxuZnVuY3Rpb24oYSl7Yy5jcmVkaXRzPWMuY3JlZGl0cy5kZXN0cm95KCk7Yy5hZGRDcmVkaXRzKGEpfSl9O2UucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGM9YS5heGVzLGQ9YS5zZXJpZXMsYj1hLmNvbnRhaW5lcixlLGg9YiYmYi5wYXJlbnROb2RlO00oYSxcImRlc3Ryb3lcIik7YS5yZW5kZXJlci5mb3JFeHBvcnQ/UCh1LGEpOnVbYS5pbmRleF09dm9pZCAwO3ouY2hhcnRDb3VudC0tO2EucmVuZGVyVG8ucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1oaWdoY2hhcnRzLWNoYXJ0XCIpO2ZhKGEpO2ZvcihlPWMubGVuZ3RoO2UtLTspY1tlXT1jW2VdLmRlc3Ryb3koKTt0aGlzLnNjcm9sbGVyJiZ0aGlzLnNjcm9sbGVyLmRlc3Ryb3kmJnRoaXMuc2Nyb2xsZXIuZGVzdHJveSgpO2ZvcihlPWQubGVuZ3RoO2UtLTspZFtlXT1kW2VdLmRlc3Ryb3koKTtcInRpdGxlIHN1YnRpdGxlIGNoYXJ0QmFja2dyb3VuZCBwbG90QmFja2dyb3VuZCBwbG90QkdJbWFnZSBwbG90Qm9yZGVyIHNlcmllc0dyb3VwIGNsaXBSZWN0IGNyZWRpdHMgcG9pbnRlciByYW5nZVNlbGVjdG9yIGxlZ2VuZCByZXNldFpvb21CdXR0b24gdG9vbHRpcCByZW5kZXJlclwiLnNwbGl0KFwiIFwiKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe3ZhciBkPVxuYVtjXTtkJiZkLmRlc3Ryb3kmJihhW2NdPWQuZGVzdHJveSgpKX0pO2ImJihiLmlubmVySFRNTD1cIlwiLGZhKGIpLGgmJkwoYikpO0soYSxmdW5jdGlvbihjLGQpe2RlbGV0ZSBhW2RdfSl9O2UucHJvdG90eXBlLmZpcnN0UmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPWEub3B0aW9ucztpZighYS5pc1JlYWR5VG9SZW5kZXJ8fGEuaXNSZWFkeVRvUmVuZGVyKCkpe2EuZ2V0Q29udGFpbmVyKCk7YS5yZXNldE1hcmdpbnMoKTthLnNldENoYXJ0U2l6ZSgpO2EucHJvcEZyb21TZXJpZXMoKTthLmdldEF4ZXMoKTsocChjLnNlcmllcyk/Yy5zZXJpZXM6W10pLmZvckVhY2goZnVuY3Rpb24oYyl7YS5pbml0U2VyaWVzKGMpfSk7YS5saW5rU2VyaWVzKCk7YS5zZXRTZXJpZXNEYXRhKCk7TShhLFwiYmVmb3JlUmVuZGVyXCIpO3gmJihhLnBvaW50ZXI9ei5oYXNUb3VjaHx8IUouUG9pbnRlckV2ZW50JiYhSi5NU1BvaW50ZXJFdmVudD9uZXcgeChhLGMpOm5ldyBHKGEsYykpO2EucmVuZGVyKCk7XG5hLnBvaW50ZXIuZ2V0Q2hhcnRQb3NpdGlvbigpO2lmKCFhLnJlbmRlcmVyLmltZ0NvdW50JiYhYS5oYXNMb2FkZWQpYS5vbmxvYWQoKTthLnRlbXBvcmFyeURpc3BsYXkoITApfX07ZS5wcm90b3R5cGUub25sb2FkPWZ1bmN0aW9uKCl7dGhpcy5jYWxsYmFja3MuY29uY2F0KFt0aGlzLmNhbGxiYWNrXSkuZm9yRWFjaChmdW5jdGlvbihhKXthJiZcInVuZGVmaW5lZFwiIT09dHlwZW9mIHRoaXMuaW5kZXgmJmEuYXBwbHkodGhpcyxbdGhpc10pfSx0aGlzKTtNKHRoaXMsXCJsb2FkXCIpO00odGhpcyxcInJlbmRlclwiKTt5KHRoaXMuaW5kZXgpJiZ0aGlzLnNldFJlZmxvdyh0aGlzLm9wdGlvbnMuY2hhcnQucmVmbG93KTt0aGlzLmhhc0xvYWRlZD0hMH07ZS5wcm90b3R5cGUuYWRkU2VyaWVzPWZ1bmN0aW9uKGEsYyxkKXt2YXIgYixlPXRoaXM7YSYmKGM9VChjLCEwKSxNKGUsXCJhZGRTZXJpZXNcIix7b3B0aW9uczphfSxmdW5jdGlvbigpe2I9ZS5pbml0U2VyaWVzKGEpO2UuaXNEaXJ0eUxlZ2VuZD1cbiEwO2UubGlua1NlcmllcygpO2IuZW5hYmxlZERhdGFTb3J0aW5nJiZiLnNldERhdGEoYS5kYXRhLCExKTtNKGUsXCJhZnRlckFkZFNlcmllc1wiLHtzZXJpZXM6Yn0pO2MmJmUucmVkcmF3KGQpfSkpO3JldHVybiBifTtlLnByb3RvdHlwZS5hZGRBeGlzPWZ1bmN0aW9uKGEsYyxkLGIpe3JldHVybiB0aGlzLmNyZWF0ZUF4aXMoYz9cInhBeGlzXCI6XCJ5QXhpc1wiLHtheGlzOmEscmVkcmF3OmQsYW5pbWF0aW9uOmJ9KX07ZS5wcm90b3R5cGUuYWRkQ29sb3JBeGlzPWZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gdGhpcy5jcmVhdGVBeGlzKFwiY29sb3JBeGlzXCIse2F4aXM6YSxyZWRyYXc6YyxhbmltYXRpb246ZH0pfTtlLnByb3RvdHlwZS5jcmVhdGVBeGlzPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9XCJjb2xvckF4aXNcIj09PWEsZT1jLnJlZHJhdyxoPWMuYW5pbWF0aW9uO2E9UyhjLmF4aXMse2luZGV4OnRoaXNbYV0ubGVuZ3RoLGlzWDpcInhBeGlzXCI9PT1hfSk7YT1kP25ldyB6LkNvbG9yQXhpcyh0aGlzLFxuYSk6bmV3IGIodGhpcyxhKTtkJiYodGhpcy5pc0RpcnR5TGVnZW5kPSEwLHRoaXMuYXhlcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2Euc2VyaWVzPVtdfSksdGhpcy5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihhKXthLmJpbmRBeGVzKCk7YS5pc0RpcnR5RGF0YT0hMH0pKTtUKGUsITApJiZ0aGlzLnJlZHJhdyhoKTtyZXR1cm4gYX07ZS5wcm90b3R5cGUuc2hvd0xvYWRpbmc9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxiPWMub3B0aW9ucyxlPWMubG9hZGluZ0RpdixoPWMubG9hZGluZ1NwYW4sZj1iLmxvYWRpbmcsbT1mdW5jdGlvbigpe2UmJkEoZSx7bGVmdDpjLnBsb3RMZWZ0K1wicHhcIix0b3A6Yy5wbG90VG9wK1wicHhcIix3aWR0aDpjLnBsb3RXaWR0aCtcInB4XCIsaGVpZ2h0OmMucGxvdEhlaWdodCtcInB4XCJ9KX07ZXx8KGMubG9hZGluZ0Rpdj1lPXIoXCJkaXZcIix7Y2xhc3NOYW1lOlwiaGlnaGNoYXJ0cy1sb2FkaW5nIGhpZ2hjaGFydHMtbG9hZGluZy1oaWRkZW5cIn0sbnVsbCxjLmNvbnRhaW5lcikpO1xuaHx8KGMubG9hZGluZ1NwYW49aD1yKFwic3BhblwiLHtjbGFzc05hbWU6XCJoaWdoY2hhcnRzLWxvYWRpbmctaW5uZXJcIn0sbnVsbCxlKSxnKGMsXCJyZWRyYXdcIixtKSk7ZS5jbGFzc05hbWU9XCJoaWdoY2hhcnRzLWxvYWRpbmdcIjtkLnNldEVsZW1lbnRIVE1MKGgsVChhLGIubGFuZy5sb2FkaW5nLFwiXCIpKTtjLnN0eWxlZE1vZGV8fChBKGUsVihmLnN0eWxlLHt6SW5kZXg6MTB9KSksQShoLGYubGFiZWxTdHlsZSksYy5sb2FkaW5nU2hvd258fChBKGUse29wYWNpdHk6MCxkaXNwbGF5OlwiXCJ9KSxxKGUse29wYWNpdHk6Zi5zdHlsZS5vcGFjaXR5fHwuNX0se2R1cmF0aW9uOmYuc2hvd0R1cmF0aW9ufHwwfSkpKTtjLmxvYWRpbmdTaG93bj0hMDttKCl9O2UucHJvdG90eXBlLmhpZGVMb2FkaW5nPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHRpb25zLGM9dGhpcy5sb2FkaW5nRGl2O2MmJihjLmNsYXNzTmFtZT1cImhpZ2hjaGFydHMtbG9hZGluZyBoaWdoY2hhcnRzLWxvYWRpbmctaGlkZGVuXCIsdGhpcy5zdHlsZWRNb2RlfHxcbnEoYyx7b3BhY2l0eTowfSx7ZHVyYXRpb246YS5sb2FkaW5nLmhpZGVEdXJhdGlvbnx8MTAwLGNvbXBsZXRlOmZ1bmN0aW9uKCl7QShjLHtkaXNwbGF5Olwibm9uZVwifSl9fSkpO3RoaXMubG9hZGluZ1Nob3duPSExfTtlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oYSxjLGQsYil7dmFyIGU9dGhpcyxnPXtjcmVkaXRzOlwiYWRkQ3JlZGl0c1wiLHRpdGxlOlwic2V0VGl0bGVcIixzdWJ0aXRsZTpcInNldFN1YnRpdGxlXCIsY2FwdGlvbjpcInNldENhcHRpb25cIn0sZixrLGwsbj1hLmlzUmVzcG9uc2l2ZU9wdGlvbnMscj1bXTtNKGUsXCJ1cGRhdGVcIix7b3B0aW9uczphfSk7bnx8ZS5zZXRSZXNwb25zaXZlKCExLCEwKTthPWgoYSxlLm9wdGlvbnMpO2UudXNlck9wdGlvbnM9UyhlLnVzZXJPcHRpb25zLGEpO2lmKGY9YS5jaGFydCl7UyghMCxlLm9wdGlvbnMuY2hhcnQsZik7XCJjbGFzc05hbWVcImluIGYmJmUuc2V0Q2xhc3NOYW1lKGYuY2xhc3NOYW1lKTtcInJlZmxvd1wiaW4gZiYmZS5zZXRSZWZsb3coZi5yZWZsb3cpO1xuaWYoXCJpbnZlcnRlZFwiaW4gZnx8XCJwb2xhclwiaW4gZnx8XCJ0eXBlXCJpbiBmKXtlLnByb3BGcm9tU2VyaWVzKCk7dmFyIHE9ITB9XCJhbGlnblRpY2tzXCJpbiBmJiYocT0hMCk7SyhmLGZ1bmN0aW9uKGEsYyl7LTEhPT1lLnByb3BzUmVxdWlyZVVwZGF0ZVNlcmllcy5pbmRleE9mKFwiY2hhcnQuXCIrYykmJihrPSEwKTstMSE9PWUucHJvcHNSZXF1aXJlRGlydHlCb3guaW5kZXhPZihjKSYmKGUuaXNEaXJ0eUJveD0hMCk7LTEhPT1lLnByb3BzUmVxdWlyZVJlZmxvdy5pbmRleE9mKGMpJiYobj9lLmlzRGlydHlCb3g9ITA6bD0hMCl9KTshZS5zdHlsZWRNb2RlJiZcInN0eWxlXCJpbiBmJiZlLnJlbmRlcmVyLnNldFN0eWxlKGYuc3R5bGUpfSFlLnN0eWxlZE1vZGUmJmEuY29sb3JzJiYodGhpcy5vcHRpb25zLmNvbG9ycz1hLmNvbG9ycyk7YS50aW1lJiYodGhpcy50aW1lPT09bSYmKHRoaXMudGltZT1uZXcgdihhLnRpbWUpKSxTKCEwLGUub3B0aW9ucy50aW1lLGEudGltZSkpO0soYSxmdW5jdGlvbihjLFxuZCl7aWYoZVtkXSYmXCJmdW5jdGlvblwiPT09dHlwZW9mIGVbZF0udXBkYXRlKWVbZF0udXBkYXRlKGMsITEpO2Vsc2UgaWYoXCJmdW5jdGlvblwiPT09dHlwZW9mIGVbZ1tkXV0pZVtnW2RdXShjKTtlbHNlXCJjb2xvcnNcIiE9PWQmJi0xPT09ZS5jb2xsZWN0aW9uc1dpdGhVcGRhdGUuaW5kZXhPZihkKSYmUyghMCxlLm9wdGlvbnNbZF0sYVtkXSk7XCJjaGFydFwiIT09ZCYmLTEhPT1lLnByb3BzUmVxdWlyZVVwZGF0ZVNlcmllcy5pbmRleE9mKGQpJiYoaz0hMCl9KTt0aGlzLmNvbGxlY3Rpb25zV2l0aFVwZGF0ZS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2lmKGFbY10pe3ZhciBiPVtdO2VbY10uZm9yRWFjaChmdW5jdGlvbihhLGMpe2Eub3B0aW9ucy5pc0ludGVybmFsfHxiLnB1c2goVChhLm9wdGlvbnMuaW5kZXgsYykpfSk7WShhW2NdKS5mb3JFYWNoKGZ1bmN0aW9uKGEsaCl7dmFyIGc9eShhLmlkKSxmO2cmJihmPWUuZ2V0KGEuaWQpKTshZiYmZVtjXSYmKGY9ZVtjXVtiP2JbaF06aF0pJiZnJiZcbnkoZi5vcHRpb25zLmlkKSYmKGY9dm9pZCAwKTtmJiZmLmNvbGw9PT1jJiYoZi51cGRhdGUoYSwhMSksZCYmKGYudG91Y2hlZD0hMCkpOyFmJiZkJiZlLmNvbGxlY3Rpb25zV2l0aEluaXRbY10mJihlLmNvbGxlY3Rpb25zV2l0aEluaXRbY11bMF0uYXBwbHkoZSxbYV0uY29uY2F0KGUuY29sbGVjdGlvbnNXaXRoSW5pdFtjXVsxXXx8W10pLmNvbmNhdChbITFdKSkudG91Y2hlZD0hMCl9KTtkJiZlW2NdLmZvckVhY2goZnVuY3Rpb24oYSl7YS50b3VjaGVkfHxhLm9wdGlvbnMuaXNJbnRlcm5hbD9kZWxldGUgYS50b3VjaGVkOnIucHVzaChhKX0pfX0pO3IuZm9yRWFjaChmdW5jdGlvbihhKXthLmNoYXJ0JiZhLnJlbW92ZSghMSl9KTtxJiZlLmF4ZXMuZm9yRWFjaChmdW5jdGlvbihhKXthLnVwZGF0ZSh7fSwhMSl9KTtrJiZlLmdldFNlcmllc09yZGVyQnlMaW5rcygpLmZvckVhY2goZnVuY3Rpb24oYSl7YS5jaGFydCYmYS51cGRhdGUoe30sITEpfSx0aGlzKTtxPWYmJmYud2lkdGg7Zj1cbmYmJmYuaGVpZ2h0O0YoZikmJihmPVUoZixxfHxlLmNoYXJ0V2lkdGgpKTtsfHxaKHEpJiZxIT09ZS5jaGFydFdpZHRofHxaKGYpJiZmIT09ZS5jaGFydEhlaWdodD9lLnNldFNpemUocSxmLGIpOlQoYywhMCkmJmUucmVkcmF3KGIpO00oZSxcImFmdGVyVXBkYXRlXCIse29wdGlvbnM6YSxyZWRyYXc6YyxhbmltYXRpb246Yn0pfTtlLnByb3RvdHlwZS5zZXRTdWJ0aXRsZT1mdW5jdGlvbihhLGMpe3RoaXMuYXBwbHlEZXNjcmlwdGlvbihcInN1YnRpdGxlXCIsYSk7dGhpcy5sYXlPdXRUaXRsZXMoYyl9O2UucHJvdG90eXBlLnNldENhcHRpb249ZnVuY3Rpb24oYSxjKXt0aGlzLmFwcGx5RGVzY3JpcHRpb24oXCJjYXB0aW9uXCIsYSk7dGhpcy5sYXlPdXRUaXRsZXMoYyl9O2UucHJvdG90eXBlLnNob3dSZXNldFpvb209ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Yy56b29tT3V0KCl9dmFyIGM9dGhpcyxkPUUubGFuZyxiPWMub3B0aW9ucy5jaGFydC5yZXNldFpvb21CdXR0b24sZT1iLnRoZW1lLFxuaD1lLnN0YXRlcyxnPVwiY2hhcnRcIj09PWIucmVsYXRpdmVUb3x8XCJzcGFjaW5nQm94XCI9PT1iLnJlbGF0aXZlVG8/bnVsbDpcInNjcm9sbGFibGVQbG90Qm94XCI7TSh0aGlzLFwiYmVmb3JlU2hvd1Jlc2V0Wm9vbVwiLG51bGwsZnVuY3Rpb24oKXtjLnJlc2V0Wm9vbUJ1dHRvbj1jLnJlbmRlcmVyLmJ1dHRvbihkLnJlc2V0Wm9vbSxudWxsLG51bGwsYSxlLGgmJmguaG92ZXIpLmF0dHIoe2FsaWduOmIucG9zaXRpb24uYWxpZ24sdGl0bGU6ZC5yZXNldFpvb21UaXRsZX0pLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1yZXNldC16b29tXCIpLmFkZCgpLmFsaWduKGIucG9zaXRpb24sITEsZyl9KTtNKHRoaXMsXCJhZnRlclNob3dSZXNldFpvb21cIil9O2UucHJvdG90eXBlLnpvb21PdXQ9ZnVuY3Rpb24oKXtNKHRoaXMsXCJzZWxlY3Rpb25cIix7cmVzZXRTZWxlY3Rpb246ITB9LHRoaXMuem9vbSl9O2UucHJvdG90eXBlLnpvb209ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxkLGI9Yy5wb2ludGVyLGU9ITEsaD1cbmMuaW52ZXJ0ZWQ/Yi5tb3VzZURvd25YOmIubW91c2VEb3duWTshYXx8YS5yZXNldFNlbGVjdGlvbj8oYy5heGVzLmZvckVhY2goZnVuY3Rpb24oYSl7ZD1hLnpvb20oKX0pLGIuaW5pdGlhdGVkPSExKTphLnhBeGlzLmNvbmNhdChhLnlBeGlzKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBnPWEuYXhpcyxmPWMuaW52ZXJ0ZWQ/Zy5sZWZ0OmcudG9wLG09Yy5pbnZlcnRlZD9mK2cud2lkdGg6ZitnLmhlaWdodCxrPWcuaXNYQXhpcyxsPSExO2lmKCFrJiZoPj1mJiZoPD1tfHxrfHwheShoKSlsPSEwO2Jbaz9cInpvb21YXCI6XCJ6b29tWVwiXSYmbCYmKGQ9Zy56b29tKGEubWluLGEubWF4KSxnLmRpc3BsYXlCdG4mJihlPSEwKSl9KTt2YXIgZz1jLnJlc2V0Wm9vbUJ1dHRvbjtlJiYhZz9jLnNob3dSZXNldFpvb20oKTohZSYmZWEoZykmJihjLnJlc2V0Wm9vbUJ1dHRvbj1nLmRlc3Ryb3koKSk7ZCYmYy5yZWRyYXcoVChjLm9wdGlvbnMuY2hhcnQuYW5pbWF0aW9uLGEmJmEuYW5pbWF0aW9uLDEwMD5cbmMucG9pbnRDb3VudCkpfTtlLnByb3RvdHlwZS5wYW49ZnVuY3Rpb24oYSxjKXt2YXIgZD10aGlzLGI9ZC5ob3ZlclBvaW50cyxlPWQub3B0aW9ucy5jaGFydCxoPWQub3B0aW9ucy5tYXBOYXZpZ2F0aW9uJiZkLm9wdGlvbnMubWFwTmF2aWdhdGlvbi5lbmFibGVkLGc7Yz1cIm9iamVjdFwiPT09dHlwZW9mIGM/Yzp7ZW5hYmxlZDpjLHR5cGU6XCJ4XCJ9O2UmJmUucGFubmluZyYmKGUucGFubmluZz1jKTt2YXIgZj1jLnR5cGU7TSh0aGlzLFwicGFuXCIse29yaWdpbmFsRXZlbnQ6YX0sZnVuY3Rpb24oKXtiJiZiLmZvckVhY2goZnVuY3Rpb24oYSl7YS5zZXRTdGF0ZSgpfSk7dmFyIGM9WzFdO1wieHlcIj09PWY/Yz1bMSwwXTpcInlcIj09PWYmJihjPVswXSk7Yy5mb3JFYWNoKGZ1bmN0aW9uKGMpe3ZhciBiPWRbYz9cInhBeGlzXCI6XCJ5QXhpc1wiXVswXSxlPWIuaG9yaXosbT1hW2U/XCJjaGFydFhcIjpcImNoYXJ0WVwiXTtlPWU/XCJtb3VzZURvd25YXCI6XCJtb3VzZURvd25ZXCI7dmFyIGs9ZFtlXSxsPShiLnBvaW50UmFuZ2V8fFxuMCkvMixGPWIucmV2ZXJzZWQmJiFkLmludmVydGVkfHwhYi5yZXZlcnNlZCYmZC5pbnZlcnRlZD8tMToxLG49Yi5nZXRFeHRyZW1lcygpLHI9Yi50b1ZhbHVlKGstbSwhMCkrbCpGO0Y9Yi50b1ZhbHVlKGsrYi5sZW4tbSwhMCktbCpGO3ZhciBLPUY8cjtrPUs/RjpyO3I9Sz9yOkY7Rj1iLmhhc1ZlcnRpY2FsUGFubmluZygpO3ZhciBxPWIucGFubmluZ1N0YXRlOyFGfHxjfHxxJiYhcS5pc0RpcnR5fHxiLnNlcmllcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2V0UHJvY2Vzc2VkRGF0YSghMCk7Yz1hLmdldEV4dHJlbWVzKGMueURhdGEsITApO3F8fChxPXtzdGFydE1pbjpOdW1iZXIuTUFYX1ZBTFVFLHN0YXJ0TWF4Oi1OdW1iZXIuTUFYX1ZBTFVFfSk7WihjLmRhdGFNaW4pJiZaKGMuZGF0YU1heCkmJihxLnN0YXJ0TWluPU1hdGgubWluKFQoYS5vcHRpb25zLnRocmVzaG9sZCxJbmZpbml0eSksYy5kYXRhTWluLHEuc3RhcnRNaW4pLHEuc3RhcnRNYXg9TWF0aC5tYXgoVChhLm9wdGlvbnMudGhyZXNob2xkLFxuLUluZmluaXR5KSxjLmRhdGFNYXgscS5zdGFydE1heCkpfSk7Yz1NYXRoLm1pbihUKHEmJnEuc3RhcnRNaW4sbi5kYXRhTWluKSxsP24ubWluOmIudG9WYWx1ZShiLnRvUGl4ZWxzKG4ubWluKS1iLm1pblBpeGVsUGFkZGluZykpO2w9TWF0aC5tYXgoVChxJiZxLnN0YXJ0TWF4LG4uZGF0YU1heCksbD9uLm1heDpiLnRvVmFsdWUoYi50b1BpeGVscyhuLm1heCkrYi5taW5QaXhlbFBhZGRpbmcpKTtiLnBhbm5pbmdTdGF0ZT1xO2IuaXNPcmRpbmFsfHwoRj1jLWssMDxGJiYocis9RixrPWMpLEY9ci1sLDA8RiYmKHI9bCxrLT1GKSxiLnNlcmllcy5sZW5ndGgmJmshPT1uLm1pbiYmciE9PW4ubWF4JiZrPj1jJiZyPD1sJiYoYi5zZXRFeHRyZW1lcyhrLHIsITEsITEse3RyaWdnZXI6XCJwYW5cIn0pLGQucmVzZXRab29tQnV0dG9ufHxofHxrPT09Y3x8cj09PWx8fCFmLm1hdGNoKFwieVwiKXx8KGQuc2hvd1Jlc2V0Wm9vbSgpLGIuZGlzcGxheUJ0bj0hMSksZz0hMCksZFtlXT1tKX0pO2cmJmQucmVkcmF3KCExKTtcbkEoZC5jb250YWluZXIse2N1cnNvcjpcIm1vdmVcIn0pfSl9O3JldHVybiBlfSgpO1YoYWEucHJvdG90eXBlLHtjYWxsYmFja3M6W10sY29sbGVjdGlvbnNXaXRoSW5pdDp7eEF4aXM6W2FhLnByb3RvdHlwZS5hZGRBeGlzLFshMF1dLHlBeGlzOlthYS5wcm90b3R5cGUuYWRkQXhpcyxbITFdXSxzZXJpZXM6W2FhLnByb3RvdHlwZS5hZGRTZXJpZXNdfSxjb2xsZWN0aW9uc1dpdGhVcGRhdGU6W1wieEF4aXNcIixcInlBeGlzXCIsXCJ6QXhpc1wiLFwic2VyaWVzXCJdLHByb3BzUmVxdWlyZURpcnR5Qm94OlwiYmFja2dyb3VuZENvbG9yIGJvcmRlckNvbG9yIGJvcmRlcldpZHRoIGJvcmRlclJhZGl1cyBwbG90QmFja2dyb3VuZENvbG9yIHBsb3RCYWNrZ3JvdW5kSW1hZ2UgcGxvdEJvcmRlckNvbG9yIHBsb3RCb3JkZXJXaWR0aCBwbG90U2hhZG93IHNoYWRvd1wiLnNwbGl0KFwiIFwiKSxwcm9wc1JlcXVpcmVSZWZsb3c6XCJtYXJnaW4gbWFyZ2luVG9wIG1hcmdpblJpZ2h0IG1hcmdpbkJvdHRvbSBtYXJnaW5MZWZ0IHNwYWNpbmcgc3BhY2luZ1RvcCBzcGFjaW5nUmlnaHQgc3BhY2luZ0JvdHRvbSBzcGFjaW5nTGVmdFwiLnNwbGl0KFwiIFwiKSxcbnByb3BzUmVxdWlyZVVwZGF0ZVNlcmllczpcImNoYXJ0LmludmVydGVkIGNoYXJ0LnBvbGFyIGNoYXJ0Lmlnbm9yZUhpZGRlblNlcmllcyBjaGFydC50eXBlIGNvbG9ycyBwbG90T3B0aW9ucyB0aW1lIHRvb2x0aXBcIi5zcGxpdChcIiBcIil9KTt6LmNoYXJ0PWZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gbmV3IGFhKGEsYyxkKX07ei5DaGFydD1hYTtcIlwiO3JldHVybiBhYX0pO08oZSxcIk1peGlucy9MZWdlbmRTeW1ib2wuanNcIixbZVtcIkNvcmUvR2xvYmFscy5qc1wiXSxlW1wiQ29yZS9VdGlsaXRpZXMuanNcIl1dLGZ1bmN0aW9uKGUsYil7dmFyIEQ9Yi5tZXJnZSx6PWIucGljaztyZXR1cm4gZS5MZWdlbmRTeW1ib2xNaXhpbj17ZHJhd1JlY3RhbmdsZTpmdW5jdGlvbihiLGUpe3ZhciBEPWIuc3ltYm9sSGVpZ2h0LEI9Yi5vcHRpb25zLnNxdWFyZVN5bWJvbDtlLmxlZ2VuZFN5bWJvbD10aGlzLmNoYXJ0LnJlbmRlcmVyLnJlY3QoQj8oYi5zeW1ib2xXaWR0aC1EKS8yOjAsYi5iYXNlbGluZS1EKzEsQj9cbkQ6Yi5zeW1ib2xXaWR0aCxELHooYi5vcHRpb25zLnN5bWJvbFJhZGl1cyxELzIpKS5hZGRDbGFzcyhcImhpZ2hjaGFydHMtcG9pbnRcIikuYXR0cih7ekluZGV4OjN9KS5hZGQoZS5sZWdlbmRHcm91cCl9LGRyYXdMaW5lTWFya2VyOmZ1bmN0aW9uKGIpe3ZhciBlPXRoaXMub3B0aW9ucyxDPWUubWFya2VyLEI9Yi5zeW1ib2xXaWR0aCx4PWIuc3ltYm9sSGVpZ2h0LHc9eC8yLHY9dGhpcy5jaGFydC5yZW5kZXJlcixmPXRoaXMubGVnZW5kR3JvdXA7Yj1iLmJhc2VsaW5lLU1hdGgucm91bmQoLjMqYi5mb250TWV0cmljcy5iKTt2YXIgZD17fTt0aGlzLmNoYXJ0LnN0eWxlZE1vZGV8fChkPXtcInN0cm9rZS13aWR0aFwiOmUubGluZVdpZHRofHwwfSxlLmRhc2hTdHlsZSYmKGQuZGFzaHN0eWxlPWUuZGFzaFN0eWxlKSk7dGhpcy5sZWdlbmRMaW5lPXYucGF0aChbW1wiTVwiLDAsYl0sW1wiTFwiLEIsYl1dKS5hZGRDbGFzcyhcImhpZ2hjaGFydHMtZ3JhcGhcIikuYXR0cihkKS5hZGQoZik7QyYmITEhPT1cbkMuZW5hYmxlZCYmQiYmKGU9TWF0aC5taW4oeihDLnJhZGl1cyx3KSx3KSwwPT09dGhpcy5zeW1ib2wuaW5kZXhPZihcInVybFwiKSYmKEM9RChDLHt3aWR0aDp4LGhlaWdodDp4fSksZT0wKSx0aGlzLmxlZ2VuZFN5bWJvbD1DPXYuc3ltYm9sKHRoaXMuc3ltYm9sLEIvMi1lLGItZSwyKmUsMiplLEMpLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1wb2ludFwiKS5hZGQoZiksQy5pc01hcmtlcj0hMCl9fX0pO08oZSxcIkNvcmUvU2VyaWVzL1Nlcmllcy5qc1wiLFtlW1wiQ29yZS9BbmltYXRpb24vQW5pbWF0aW9uVXRpbGl0aWVzLmpzXCJdLGVbXCJDb3JlL0dsb2JhbHMuanNcIl0sZVtcIk1peGlucy9MZWdlbmRTeW1ib2wuanNcIl0sZVtcIkNvcmUvT3B0aW9ucy5qc1wiXSxlW1wiQ29yZS9Db2xvci9QYWxldHRlLmpzXCJdLGVbXCJDb3JlL1Nlcmllcy9Qb2ludC5qc1wiXSxlW1wiQ29yZS9TZXJpZXMvU2VyaWVzUmVnaXN0cnkuanNcIl0sZVtcIkNvcmUvUmVuZGVyZXIvU1ZHL1NWR0VsZW1lbnQuanNcIl0sZVtcIkNvcmUvVXRpbGl0aWVzLmpzXCJdXSxcbmZ1bmN0aW9uKGUsYixJLHosSCxHLEMsQix4KXt2YXIgdz1lLmFuaW1PYmplY3Qsdj1lLnNldEFuaW1hdGlvbixmPWIuaGFzVG91Y2gsZD1iLnN2ZyxxPWIud2luLGs9ei5kZWZhdWx0T3B0aW9ucyxsPUMuc2VyaWVzVHlwZXMsRD14LmFkZEV2ZW50LHU9eC5hcnJheU1heCxuPXguYXJyYXlNaW4sSj14LmNsYW1wLEU9eC5jbGVhblJlY3Vyc2l2ZWx5LG09eC5jb3JyZWN0RmxvYXQsYz14LmRlZmluZWQsZz14LmVyYXNlLGE9eC5lcnJvcixoPXguZXh0ZW5kLHI9eC5maW5kLEE9eC5maXJlRXZlbnQseT14LmdldE5lc3RlZFByb3BlcnR5LEw9eC5pc0FycmF5LFA9eC5pc0Z1bmN0aW9uLFI9eC5pc051bWJlcixWPXguaXNTdHJpbmcsUT14Lm1lcmdlLE09eC5vYmplY3RFYWNoLHQ9eC5waWNrLHA9eC5yZW1vdmVFdmVudCxPPXguc3BsYXQsWj14LnN5bmNUaW1lb3V0O2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dGhpcy56b25lcz10aGlzLnlBeGlzPXRoaXMueEF4aXM9dGhpcy51c2VyT3B0aW9ucz1cbnRoaXMudG9vbHRpcE9wdGlvbnM9dGhpcy5wcm9jZXNzZWRZRGF0YT10aGlzLnByb2Nlc3NlZFhEYXRhPXRoaXMucG9pbnRzPXRoaXMub3B0aW9ucz10aGlzLmxpbmtlZFNlcmllcz10aGlzLmluZGV4PXRoaXMuZXZlbnRzVG9VbmJpbmQ9dGhpcy5ldmVudE9wdGlvbnM9dGhpcy5kYXRhPXRoaXMuY2hhcnQ9dGhpcy5faT12b2lkIDB9Yi5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihhLGMpe0EodGhpcyxcImluaXRcIix7b3B0aW9uczpjfSk7dmFyIGQ9dGhpcyxiPWEuc2VyaWVzLGU7dGhpcy5ldmVudE9wdGlvbnM9dGhpcy5ldmVudE9wdGlvbnN8fHt9O3RoaXMuZXZlbnRzVG9VbmJpbmQ9W107ZC5jaGFydD1hO2Qub3B0aW9ucz1kLnNldE9wdGlvbnMoYyk7dmFyIGc9ZC5vcHRpb25zO2QubGlua2VkU2VyaWVzPVtdO2QuYmluZEF4ZXMoKTtoKGQse25hbWU6Zy5uYW1lLHN0YXRlOlwiXCIsdmlzaWJsZTohMSE9PWcudmlzaWJsZSxzZWxlY3RlZDohMD09PWcuc2VsZWN0ZWR9KTtjPWcuZXZlbnRzO1xuTShjLGZ1bmN0aW9uKGEsYyl7UChhKSYmZC5ldmVudE9wdGlvbnNbY10hPT1hJiYoUChkLmV2ZW50T3B0aW9uc1tjXSkmJnAoZCxjLGQuZXZlbnRPcHRpb25zW2NdKSxkLmV2ZW50T3B0aW9uc1tjXT1hLEQoZCxjLGEpKX0pO2lmKGMmJmMuY2xpY2t8fGcucG9pbnQmJmcucG9pbnQuZXZlbnRzJiZnLnBvaW50LmV2ZW50cy5jbGlja3x8Zy5hbGxvd1BvaW50U2VsZWN0KWEucnVuVHJhY2tlckNsaWNrPSEwO2QuZ2V0Q29sb3IoKTtkLmdldFN5bWJvbCgpO2QucGFyYWxsZWxBcnJheXMuZm9yRWFjaChmdW5jdGlvbihhKXtkW2ErXCJEYXRhXCJdfHwoZFthK1wiRGF0YVwiXT1bXSl9KTtkLmlzQ2FydGVzaWFuJiYoYS5oYXNDYXJ0ZXNpYW5TZXJpZXM9ITApO2IubGVuZ3RoJiYoZT1iW2IubGVuZ3RoLTFdKTtkLl9pPXQoZSYmZS5faSwtMSkrMTtkLm9wYWNpdHk9ZC5vcHRpb25zLm9wYWNpdHk7YS5vcmRlclNlcmllcyh0aGlzLmluc2VydChiKSk7Zy5kYXRhU29ydGluZyYmZy5kYXRhU29ydGluZy5lbmFibGVkP1xuZC5zZXREYXRhU29ydGluZ09wdGlvbnMoKTpkLnBvaW50c3x8ZC5kYXRhfHxkLnNldERhdGEoZy5kYXRhLCExKTtBKHRoaXMsXCJhZnRlckluaXRcIil9O2IucHJvdG90eXBlLmlzPWZ1bmN0aW9uKGEpe3JldHVybiBsW2FdJiZ0aGlzIGluc3RhbmNlb2YgbFthXX07Yi5wcm90b3R5cGUuaW5zZXJ0PWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMub3B0aW9ucy5pbmRleCxkO2lmKFIoYykpe2ZvcihkPWEubGVuZ3RoO2QtLTspaWYoYz49dChhW2RdLm9wdGlvbnMuaW5kZXgsYVtkXS5faSkpe2Euc3BsaWNlKGQrMSwwLHRoaXMpO2JyZWFrfS0xPT09ZCYmYS51bnNoaWZ0KHRoaXMpO2QrPTF9ZWxzZSBhLnB1c2godGhpcyk7cmV0dXJuIHQoZCxhLmxlbmd0aC0xKX07Yi5wcm90b3R5cGUuYmluZEF4ZXM9ZnVuY3Rpb24oKXt2YXIgYz10aGlzLGQ9Yy5vcHRpb25zLGI9Yy5jaGFydCxlO0EodGhpcyxcImJpbmRBeGVzXCIsbnVsbCxmdW5jdGlvbigpeyhjLmF4aXNUeXBlc3x8W10pLmZvckVhY2goZnVuY3Rpb24oaCl7dmFyIGc9XG4wO2JbaF0uZm9yRWFjaChmdW5jdGlvbihhKXtlPWEub3B0aW9ucztpZihkW2hdPT09ZyYmIWUuaXNJbnRlcm5hbHx8XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBkW2hdJiZkW2hdPT09ZS5pZHx8XCJ1bmRlZmluZWRcIj09PXR5cGVvZiBkW2hdJiYwPT09ZS5pbmRleCljLmluc2VydChhLnNlcmllcyksY1toXT1hLGEuaXNEaXJ0eT0hMDtlLmlzSW50ZXJuYWx8fGcrK30pO2NbaF18fGMub3B0aW9uYWxBeGlzPT09aHx8YSgxOCwhMCxiKX0pfSk7QSh0aGlzLFwiYWZ0ZXJCaW5kQXhlc1wiKX07Yi5wcm90b3R5cGUudXBkYXRlUGFyYWxsZWxBcnJheXM9ZnVuY3Rpb24oYSxjKXt2YXIgZD1hLnNlcmllcyxiPWFyZ3VtZW50cyxlPVIoYyk/ZnVuY3Rpb24oYil7dmFyIGU9XCJ5XCI9PT1iJiZkLnRvWURhdGE/ZC50b1lEYXRhKGEpOmFbYl07ZFtiK1wiRGF0YVwiXVtjXT1lfTpmdW5jdGlvbihhKXtBcnJheS5wcm90b3R5cGVbY10uYXBwbHkoZFthK1wiRGF0YVwiXSxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChiLFxuMikpfTtkLnBhcmFsbGVsQXJyYXlzLmZvckVhY2goZSl9O2IucHJvdG90eXBlLmhhc0RhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aXNpYmxlJiZcInVuZGVmaW5lZFwiIT09dHlwZW9mIHRoaXMuZGF0YU1heCYmXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiB0aGlzLmRhdGFNaW58fHRoaXMudmlzaWJsZSYmdGhpcy55RGF0YSYmMDx0aGlzLnlEYXRhLmxlbmd0aH07Yi5wcm90b3R5cGUuYXV0b0luY3JlbWVudD1mdW5jdGlvbigpe3ZhciBhPXRoaXMub3B0aW9ucyxjPXRoaXMueEluY3JlbWVudCxkLGI9YS5wb2ludEludGVydmFsVW5pdCxlPXRoaXMuY2hhcnQudGltZTtjPXQoYyxhLnBvaW50U3RhcnQsMCk7dGhpcy5wb2ludEludGVydmFsPWQ9dCh0aGlzLnBvaW50SW50ZXJ2YWwsYS5wb2ludEludGVydmFsLDEpO2ImJihhPW5ldyBlLkRhdGUoYyksXCJkYXlcIj09PWI/ZS5zZXQoXCJEYXRlXCIsYSxlLmdldChcIkRhdGVcIixhKStkKTpcIm1vbnRoXCI9PT1iP2Uuc2V0KFwiTW9udGhcIixhLGUuZ2V0KFwiTW9udGhcIixcbmEpK2QpOlwieWVhclwiPT09YiYmZS5zZXQoXCJGdWxsWWVhclwiLGEsZS5nZXQoXCJGdWxsWWVhclwiLGEpK2QpLGQ9YS5nZXRUaW1lKCktYyk7dGhpcy54SW5jcmVtZW50PWMrZDtyZXR1cm4gY307Yi5wcm90b3R5cGUuc2V0RGF0YVNvcnRpbmdPcHRpb25zPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHRpb25zO2godGhpcyx7cmVxdWlyZVNvcnRpbmc6ITEsc29ydGVkOiExLGVuYWJsZWREYXRhU29ydGluZzohMCxhbGxvd0RHOiExfSk7YyhhLnBvaW50UmFuZ2UpfHwoYS5wb2ludFJhbmdlPTEpfTtiLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMuY2hhcnQsYj1kLm9wdGlvbnMsZT1iLnBsb3RPcHRpb25zLGg9ZC51c2VyT3B0aW9uc3x8e307YT1RKGEpO2Q9ZC5zdHlsZWRNb2RlO3ZhciBnPXtwbG90T3B0aW9uczplLHVzZXJPcHRpb25zOmF9O0EodGhpcyxcInNldE9wdGlvbnNcIixnKTt2YXIgZj1nLnBsb3RPcHRpb25zW3RoaXMudHlwZV0sbT1oLnBsb3RPcHRpb25zfHxcbnt9O3RoaXMudXNlck9wdGlvbnM9Zy51c2VyT3B0aW9ucztoPVEoZixlLnNlcmllcyxoLnBsb3RPcHRpb25zJiZoLnBsb3RPcHRpb25zW3RoaXMudHlwZV0sYSk7dGhpcy50b29sdGlwT3B0aW9ucz1RKGsudG9vbHRpcCxrLnBsb3RPcHRpb25zLnNlcmllcyYmay5wbG90T3B0aW9ucy5zZXJpZXMudG9vbHRpcCxrLnBsb3RPcHRpb25zW3RoaXMudHlwZV0udG9vbHRpcCxiLnRvb2x0aXAudXNlck9wdGlvbnMsZS5zZXJpZXMmJmUuc2VyaWVzLnRvb2x0aXAsZVt0aGlzLnR5cGVdLnRvb2x0aXAsYS50b29sdGlwKTt0aGlzLnN0aWNreVRyYWNraW5nPXQoYS5zdGlja3lUcmFja2luZyxtW3RoaXMudHlwZV0mJm1bdGhpcy50eXBlXS5zdGlja3lUcmFja2luZyxtLnNlcmllcyYmbS5zZXJpZXMuc3RpY2t5VHJhY2tpbmcsdGhpcy50b29sdGlwT3B0aW9ucy5zaGFyZWQmJiF0aGlzLm5vU2hhcmVkVG9vbHRpcD8hMDpoLnN0aWNreVRyYWNraW5nKTtudWxsPT09Zi5tYXJrZXImJmRlbGV0ZSBoLm1hcmtlcjtcbnRoaXMuem9uZUF4aXM9aC56b25lQXhpcztiPXRoaXMuem9uZXM9KGguem9uZXN8fFtdKS5zbGljZSgpOyFoLm5lZ2F0aXZlQ29sb3ImJiFoLm5lZ2F0aXZlRmlsbENvbG9yfHxoLnpvbmVzfHwoZT17dmFsdWU6aFt0aGlzLnpvbmVBeGlzK1wiVGhyZXNob2xkXCJdfHxoLnRocmVzaG9sZHx8MCxjbGFzc05hbWU6XCJoaWdoY2hhcnRzLW5lZ2F0aXZlXCJ9LGR8fChlLmNvbG9yPWgubmVnYXRpdmVDb2xvcixlLmZpbGxDb2xvcj1oLm5lZ2F0aXZlRmlsbENvbG9yKSxiLnB1c2goZSkpO2IubGVuZ3RoJiZjKGJbYi5sZW5ndGgtMV0udmFsdWUpJiZiLnB1c2goZD97fTp7Y29sb3I6dGhpcy5jb2xvcixmaWxsQ29sb3I6dGhpcy5maWxsQ29sb3J9KTtBKHRoaXMsXCJhZnRlclNldE9wdGlvbnNcIix7b3B0aW9uczpofSk7cmV0dXJuIGh9O2IucHJvdG90eXBlLmdldE5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdCh0aGlzLm9wdGlvbnMubmFtZSxcIlNlcmllcyBcIisodGhpcy5pbmRleCsxKSl9O2IucHJvdG90eXBlLmdldEN5Y2xpYz1cbmZ1bmN0aW9uKGEsZCxiKXt2YXIgZT10aGlzLmNoYXJ0LGg9dGhpcy51c2VyT3B0aW9ucyxnPWErXCJJbmRleFwiLGY9YStcIkNvdW50ZXJcIixtPWI/Yi5sZW5ndGg6dChlLm9wdGlvbnMuY2hhcnRbYStcIkNvdW50XCJdLGVbYStcIkNvdW50XCJdKTtpZighZCl7dmFyIGs9dChoW2ddLGhbXCJfXCIrZ10pO2Moayl8fChlLnNlcmllcy5sZW5ndGh8fChlW2ZdPTApLGhbXCJfXCIrZ109az1lW2ZdJW0sZVtmXSs9MSk7YiYmKGQ9YltrXSl9XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBrJiYodGhpc1tnXT1rKTt0aGlzW2FdPWR9O2IucHJvdG90eXBlLmdldENvbG9yPWZ1bmN0aW9uKCl7dGhpcy5jaGFydC5zdHlsZWRNb2RlP3RoaXMuZ2V0Q3ljbGljKFwiY29sb3JcIik6dGhpcy5vcHRpb25zLmNvbG9yQnlQb2ludD90aGlzLmNvbG9yPUgubmV1dHJhbENvbG9yMjA6dGhpcy5nZXRDeWNsaWMoXCJjb2xvclwiLHRoaXMub3B0aW9ucy5jb2xvcnx8ay5wbG90T3B0aW9uc1t0aGlzLnR5cGVdLmNvbG9yLHRoaXMuY2hhcnQub3B0aW9ucy5jb2xvcnMpfTtcbmIucHJvdG90eXBlLmdldFBvaW50c0NvbGxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5oYXNHcm91cGVkRGF0YT90aGlzLnBvaW50czp0aGlzLmRhdGEpfHxbXX07Yi5wcm90b3R5cGUuZ2V0U3ltYm9sPWZ1bmN0aW9uKCl7dGhpcy5nZXRDeWNsaWMoXCJzeW1ib2xcIix0aGlzLm9wdGlvbnMubWFya2VyLnN5bWJvbCx0aGlzLmNoYXJ0Lm9wdGlvbnMuc3ltYm9scyl9O2IucHJvdG90eXBlLmZpbmRQb2ludEluZGV4PWZ1bmN0aW9uKGEsYyl7dmFyIGQ9YS5pZCxiPWEueCxlPXRoaXMucG9pbnRzLGgsZz10aGlzLm9wdGlvbnMuZGF0YVNvcnRpbmc7aWYoZCl2YXIgZj10aGlzLmNoYXJ0LmdldChkKTtlbHNlIGlmKHRoaXMubGlua2VkUGFyZW50fHx0aGlzLmVuYWJsZWREYXRhU29ydGluZyl7dmFyIG09ZyYmZy5tYXRjaEJ5TmFtZT9cIm5hbWVcIjpcImluZGV4XCI7Zj1yKGUsZnVuY3Rpb24oYyl7cmV0dXJuIWMudG91Y2hlZCYmY1ttXT09PWFbbV19KTtpZighZilyZXR1cm59aWYoZil7dmFyIGs9XG5mJiZmLmluZGV4O1widW5kZWZpbmVkXCIhPT10eXBlb2YgayYmKGg9ITApfVwidW5kZWZpbmVkXCI9PT10eXBlb2YgayYmUihiKSYmKGs9dGhpcy54RGF0YS5pbmRleE9mKGIsYykpOy0xIT09ayYmXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBrJiZ0aGlzLmNyb3BwZWQmJihrPWs+PXRoaXMuY3JvcFN0YXJ0P2stdGhpcy5jcm9wU3RhcnQ6ayk7IWgmJmVba10mJmVba10udG91Y2hlZCYmKGs9dm9pZCAwKTtyZXR1cm4ga307Yi5wcm90b3R5cGUudXBkYXRlRGF0YT1mdW5jdGlvbihhLGQpe3ZhciBiPXRoaXMub3B0aW9ucyxlPWIuZGF0YVNvcnRpbmcsaD10aGlzLnBvaW50cyxnPVtdLGYsayxtLGw9dGhpcy5yZXF1aXJlU29ydGluZyxuPWEubGVuZ3RoPT09aC5sZW5ndGgscj0hMDt0aGlzLnhJbmNyZW1lbnQ9bnVsbDthLmZvckVhY2goZnVuY3Rpb24oYSxkKXt2YXIgaz1jKGEpJiZ0aGlzLnBvaW50Q2xhc3MucHJvdG90eXBlLm9wdGlvbnNUb09iamVjdC5jYWxsKHtzZXJpZXM6dGhpc30sYSl8fHt9O1xudmFyIHI9ay54O2lmKGsuaWR8fFIocikpe2lmKHI9dGhpcy5maW5kUG9pbnRJbmRleChrLG0pLC0xPT09cnx8XCJ1bmRlZmluZWRcIj09PXR5cGVvZiByP2cucHVzaChhKTpoW3JdJiZhIT09Yi5kYXRhW3JdPyhoW3JdLnVwZGF0ZShhLCExLG51bGwsITEpLGhbcl0udG91Y2hlZD0hMCxsJiYobT1yKzEpKTpoW3JdJiYoaFtyXS50b3VjaGVkPSEwKSwhbnx8ZCE9PXJ8fGUmJmUuZW5hYmxlZHx8dGhpcy5oYXNEZXJpdmVkRGF0YSlmPSEwfWVsc2UgZy5wdXNoKGEpfSx0aGlzKTtpZihmKWZvcihhPWgubGVuZ3RoO2EtLTspKGs9aFthXSkmJiFrLnRvdWNoZWQmJmsucmVtb3ZlJiZrLnJlbW92ZSghMSxkKTtlbHNlIW58fGUmJmUuZW5hYmxlZD9yPSExOihhLmZvckVhY2goZnVuY3Rpb24oYSxjKXtoW2NdLnVwZGF0ZSYmYSE9PWhbY10ueSYmaFtjXS51cGRhdGUoYSwhMSxudWxsLCExKX0pLGcubGVuZ3RoPTApO2guZm9yRWFjaChmdW5jdGlvbihhKXthJiYoYS50b3VjaGVkPSExKX0pO2lmKCFyKXJldHVybiExO1xuZy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RoaXMuYWRkUG9pbnQoYSwhMSxudWxsLG51bGwsITEpfSx0aGlzKTtudWxsPT09dGhpcy54SW5jcmVtZW50JiZ0aGlzLnhEYXRhJiZ0aGlzLnhEYXRhLmxlbmd0aCYmKHRoaXMueEluY3JlbWVudD11KHRoaXMueERhdGEpLHRoaXMuYXV0b0luY3JlbWVudCgpKTtyZXR1cm4hMH07Yi5wcm90b3R5cGUuc2V0RGF0YT1mdW5jdGlvbihjLGQsYixlKXt2YXIgaD10aGlzLGc9aC5wb2ludHMsZj1nJiZnLmxlbmd0aHx8MCxrLG09aC5vcHRpb25zLGw9aC5jaGFydCxyPW0uZGF0YVNvcnRpbmcsbj1udWxsLHE9aC54QXhpcztuPW0udHVyYm9UaHJlc2hvbGQ7dmFyIEY9dGhpcy54RGF0YSxwPXRoaXMueURhdGEsdT0oaz1oLnBvaW50QXJyYXlNYXApJiZrLmxlbmd0aCx2PW0ua2V5cyxLPTAsdz0xLHk7Yz1jfHxbXTtrPWMubGVuZ3RoO2Q9dChkLCEwKTtyJiZyLmVuYWJsZWQmJihjPXRoaXMuc29ydERhdGEoYykpOyExIT09ZSYmayYmZiYmIWguY3JvcHBlZCYmXG4haC5oYXNHcm91cGVkRGF0YSYmaC52aXNpYmxlJiYhaC5pc1Nlcmllc0Jvb3N0aW5nJiYoeT10aGlzLnVwZGF0ZURhdGEoYyxiKSk7aWYoIXkpe2gueEluY3JlbWVudD1udWxsO2guY29sb3JDb3VudGVyPTA7dGhpcy5wYXJhbGxlbEFycmF5cy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2hbYStcIkRhdGFcIl0ubGVuZ3RoPTB9KTtpZihuJiZrPm4paWYobj1oLmdldEZpcnN0VmFsaWRQb2ludChjKSxSKG4pKWZvcihiPTA7YjxrO2IrKylGW2JdPXRoaXMuYXV0b0luY3JlbWVudCgpLHBbYl09Y1tiXTtlbHNlIGlmKEwobikpaWYodSlmb3IoYj0wO2I8aztiKyspZT1jW2JdLEZbYl09ZVswXSxwW2JdPWUuc2xpY2UoMSx1KzEpO2Vsc2UgZm9yKHYmJihLPXYuaW5kZXhPZihcInhcIiksdz12LmluZGV4T2YoXCJ5XCIpLEs9MDw9Sz9LOjAsdz0wPD13P3c6MSksYj0wO2I8aztiKyspZT1jW2JdLEZbYl09ZVtLXSxwW2JdPWVbd107ZWxzZSBhKDEyLCExLGwpO2Vsc2UgZm9yKGI9MDtiPGs7YisrKVwidW5kZWZpbmVkXCIhPT1cbnR5cGVvZiBjW2JdJiYoZT17c2VyaWVzOmh9LGgucG9pbnRDbGFzcy5wcm90b3R5cGUuYXBwbHlPcHRpb25zLmFwcGx5KGUsW2NbYl1dKSxoLnVwZGF0ZVBhcmFsbGVsQXJyYXlzKGUsYikpO3AmJlYocFswXSkmJmEoMTQsITAsbCk7aC5kYXRhPVtdO2gub3B0aW9ucy5kYXRhPWgudXNlck9wdGlvbnMuZGF0YT1jO2ZvcihiPWY7Yi0tOylnW2JdJiZnW2JdLmRlc3Ryb3kmJmdbYl0uZGVzdHJveSgpO3EmJihxLm1pblJhbmdlPXEudXNlck1pblJhbmdlKTtoLmlzRGlydHk9bC5pc0RpcnR5Qm94PSEwO2guaXNEaXJ0eURhdGE9ISFnO2I9ITF9XCJwb2ludFwiPT09bS5sZWdlbmRUeXBlJiYodGhpcy5wcm9jZXNzRGF0YSgpLHRoaXMuZ2VuZXJhdGVQb2ludHMoKSk7ZCYmbC5yZWRyYXcoYil9O2IucHJvdG90eXBlLnNvcnREYXRhPWZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMsYj1kLm9wdGlvbnMuZGF0YVNvcnRpbmcuc29ydEtleXx8XCJ5XCIsZT1mdW5jdGlvbihhLGQpe3JldHVybiBjKGQpJiZhLnBvaW50Q2xhc3MucHJvdG90eXBlLm9wdGlvbnNUb09iamVjdC5jYWxsKHtzZXJpZXM6YX0sXG5kKXx8e319O2EuZm9yRWFjaChmdW5jdGlvbihjLGIpe2FbYl09ZShkLGMpO2FbYl0uaW5kZXg9Yn0sdGhpcyk7YS5jb25jYXQoKS5zb3J0KGZ1bmN0aW9uKGEsYyl7YT15KGIsYSk7Yz15KGIsYyk7cmV0dXJuIGM8YT8tMTpjPmE/MTowfSkuZm9yRWFjaChmdW5jdGlvbihhLGMpe2EueD1jfSx0aGlzKTtkLmxpbmtlZFNlcmllcyYmZC5saW5rZWRTZXJpZXMuZm9yRWFjaChmdW5jdGlvbihjKXt2YXIgZD1jLm9wdGlvbnMsYj1kLmRhdGE7ZC5kYXRhU29ydGluZyYmZC5kYXRhU29ydGluZy5lbmFibGVkfHwhYnx8KGIuZm9yRWFjaChmdW5jdGlvbihkLGgpe2JbaF09ZShjLGQpO2FbaF0mJihiW2hdLng9YVtoXS54LGJbaF0uaW5kZXg9aCl9KSxjLnNldERhdGEoYiwhMSkpfSk7cmV0dXJuIGF9O2IucHJvdG90eXBlLmdldFByb2Nlc3NlZERhdGE9ZnVuY3Rpb24oYyl7dmFyIGQ9dGhpcy54RGF0YSxiPXRoaXMueURhdGEsZT1kLmxlbmd0aDt2YXIgaD0wO3ZhciBnPXRoaXMueEF4aXMsZj1cbnRoaXMub3B0aW9uczt2YXIgaz1mLmNyb3BUaHJlc2hvbGQ7dmFyIG09Y3x8dGhpcy5nZXRFeHRyZW1lc0Zyb21BbGx8fGYuZ2V0RXh0cmVtZXNGcm9tQWxsLGw9dGhpcy5pc0NhcnRlc2lhbjtjPWcmJmcudmFsMmxpbjtmPSEoIWd8fCFnLmxvZ2FyaXRobWljKTt2YXIgbj10aGlzLnJlcXVpcmVTb3J0aW5nO2lmKGcpe2c9Zy5nZXRFeHRyZW1lcygpO3ZhciByPWcubWluO3ZhciBxPWcubWF4fWlmKGwmJnRoaXMuc29ydGVkJiYhbSYmKCFrfHxlPmt8fHRoaXMuZm9yY2VDcm9wKSlpZihkW2UtMV08cnx8ZFswXT5xKWQ9W10sYj1bXTtlbHNlIGlmKHRoaXMueURhdGEmJihkWzBdPHJ8fGRbZS0xXT5xKSl7aD10aGlzLmNyb3BEYXRhKHRoaXMueERhdGEsdGhpcy55RGF0YSxyLHEpO2Q9aC54RGF0YTtiPWgueURhdGE7aD1oLnN0YXJ0O3ZhciBGPSEwfWZvcihrPWQubGVuZ3RofHwxOy0tazspaWYoZT1mP2MoZFtrXSktYyhkW2stMV0pOmRba10tZFtrLTFdLDA8ZSYmKFwidW5kZWZpbmVkXCI9PT1cbnR5cGVvZiBwfHxlPHApKXZhciBwPWU7ZWxzZSAwPmUmJm4mJihhKDE1LCExLHRoaXMuY2hhcnQpLG49ITEpO3JldHVybnt4RGF0YTpkLHlEYXRhOmIsY3JvcHBlZDpGLGNyb3BTdGFydDpoLGNsb3Nlc3RQb2ludFJhbmdlOnB9fTtiLnByb3RvdHlwZS5wcm9jZXNzRGF0YT1mdW5jdGlvbihhKXt2YXIgYz10aGlzLnhBeGlzO2lmKHRoaXMuaXNDYXJ0ZXNpYW4mJiF0aGlzLmlzRGlydHkmJiFjLmlzRGlydHkmJiF0aGlzLnlBeGlzLmlzRGlydHkmJiFhKXJldHVybiExO2E9dGhpcy5nZXRQcm9jZXNzZWREYXRhKCk7dGhpcy5jcm9wcGVkPWEuY3JvcHBlZDt0aGlzLmNyb3BTdGFydD1hLmNyb3BTdGFydDt0aGlzLnByb2Nlc3NlZFhEYXRhPWEueERhdGE7dGhpcy5wcm9jZXNzZWRZRGF0YT1hLnlEYXRhO3RoaXMuY2xvc2VzdFBvaW50UmFuZ2U9dGhpcy5iYXNlUG9pbnRSYW5nZT1hLmNsb3Nlc3RQb2ludFJhbmdlfTtiLnByb3RvdHlwZS5jcm9wRGF0YT1mdW5jdGlvbihhLGMsZCxiLGUpe3ZhciBoPVxuYS5sZW5ndGgsZz0wLGY9aCxrO2U9dChlLHRoaXMuY3JvcFNob3VsZGVyKTtmb3Ioaz0wO2s8aDtrKyspaWYoYVtrXT49ZCl7Zz1NYXRoLm1heCgwLGstZSk7YnJlYWt9Zm9yKGQ9aztkPGg7ZCsrKWlmKGFbZF0+Yil7Zj1kK2U7YnJlYWt9cmV0dXJue3hEYXRhOmEuc2xpY2UoZyxmKSx5RGF0YTpjLnNsaWNlKGcsZiksc3RhcnQ6ZyxlbmQ6Zn19O2IucHJvdG90eXBlLmdlbmVyYXRlUG9pbnRzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcHRpb25zLGM9YS5kYXRhLGQ9dGhpcy5kYXRhLGIsZT10aGlzLnByb2Nlc3NlZFhEYXRhLGc9dGhpcy5wcm9jZXNzZWRZRGF0YSxmPXRoaXMucG9pbnRDbGFzcyxrPWUubGVuZ3RoLG09dGhpcy5jcm9wU3RhcnR8fDAsbD10aGlzLmhhc0dyb3VwZWREYXRhLG49YS5rZXlzLHI9W10scTthPWEuZGF0YUdyb3VwaW5nJiZhLmRhdGFHcm91cGluZy5ncm91cEFsbD9tOjA7ZHx8bHx8KGQ9W10sZC5sZW5ndGg9Yy5sZW5ndGgsZD10aGlzLmRhdGE9ZCk7biYmXG5sJiYodGhpcy5vcHRpb25zLmtleXM9ITEpO2ZvcihxPTA7cTxrO3ErKyl7dmFyIHA9bStxO2lmKGwpe3ZhciB1PShuZXcgZikuaW5pdCh0aGlzLFtlW3FdXS5jb25jYXQoTyhnW3FdKSkpO3UuZGF0YUdyb3VwPXRoaXMuZ3JvdXBNYXBbYStxXTt1LmRhdGFHcm91cC5vcHRpb25zJiYodS5vcHRpb25zPXUuZGF0YUdyb3VwLm9wdGlvbnMsaCh1LHUuZGF0YUdyb3VwLm9wdGlvbnMpLGRlbGV0ZSB1LmRhdGFMYWJlbHMpfWVsc2UodT1kW3BdKXx8XCJ1bmRlZmluZWRcIj09PXR5cGVvZiBjW3BdfHwoZFtwXT11PShuZXcgZikuaW5pdCh0aGlzLGNbcF0sZVtxXSkpO3UmJih1LmluZGV4PWw/YStxOnAscltxXT11KX10aGlzLm9wdGlvbnMua2V5cz1uO2lmKGQmJihrIT09KGI9ZC5sZW5ndGgpfHxsKSlmb3IocT0wO3E8YjtxKyspcSE9PW18fGx8fChxKz1rKSxkW3FdJiYoZFtxXS5kZXN0cm95RWxlbWVudHMoKSxkW3FdLnBsb3RYPXZvaWQgMCk7dGhpcy5kYXRhPWQ7dGhpcy5wb2ludHM9cjtBKHRoaXMsXG5cImFmdGVyR2VuZXJhdGVQb2ludHNcIil9O2IucHJvdG90eXBlLmdldFhFeHRyZW1lcz1mdW5jdGlvbihhKXtyZXR1cm57bWluOm4oYSksbWF4OnUoYSl9fTtiLnByb3RvdHlwZS5nZXRFeHRyZW1lcz1mdW5jdGlvbihhLGMpe3ZhciBkPXRoaXMueEF4aXMsYj10aGlzLnlBeGlzLGU9dGhpcy5wcm9jZXNzZWRYRGF0YXx8dGhpcy54RGF0YSxoPVtdLGc9MCxmPTA7dmFyIGs9MDt2YXIgbT10aGlzLnJlcXVpcmVTb3J0aW5nP3RoaXMuY3JvcFNob3VsZGVyOjAsbD1iP2IucG9zaXRpdmVWYWx1ZXNPbmx5OiExLHI7YT1hfHx0aGlzLnN0YWNrZWRZRGF0YXx8dGhpcy5wcm9jZXNzZWRZRGF0YXx8W107Yj1hLmxlbmd0aDtkJiYoaz1kLmdldEV4dHJlbWVzKCksZj1rLm1pbixrPWsubWF4KTtmb3Iocj0wO3I8YjtyKyspe3ZhciBxPWVbcl07dmFyIHA9YVtyXTt2YXIgRj0oUihwKXx8TChwKSkmJihwLmxlbmd0aHx8MDxwfHwhbCk7cT1jfHx0aGlzLmdldEV4dHJlbWVzRnJvbUFsbHx8dGhpcy5vcHRpb25zLmdldEV4dHJlbWVzRnJvbUFsbHx8XG50aGlzLmNyb3BwZWR8fCFkfHwoZVtyK21dfHxxKT49ZiYmKGVbci1tXXx8cSk8PWs7aWYoRiYmcSlpZihGPXAubGVuZ3RoKWZvcig7Ri0tOylSKHBbRl0pJiYoaFtnKytdPXBbRl0pO2Vsc2UgaFtnKytdPXB9YT17ZGF0YU1pbjpuKGgpLGRhdGFNYXg6dShoKX07QSh0aGlzLFwiYWZ0ZXJHZXRFeHRyZW1lc1wiLHtkYXRhRXh0cmVtZXM6YX0pO3JldHVybiBhfTtiLnByb3RvdHlwZS5hcHBseUV4dHJlbWVzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRFeHRyZW1lcygpO3RoaXMuZGF0YU1pbj1hLmRhdGFNaW47dGhpcy5kYXRhTWF4PWEuZGF0YU1heDtyZXR1cm4gYX07Yi5wcm90b3R5cGUuZ2V0Rmlyc3RWYWxpZFBvaW50PWZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1udWxsLGQ9YS5sZW5ndGgsYj0wO251bGw9PT1jJiZiPGQ7KWM9YVtiXSxiKys7cmV0dXJuIGN9O2IucHJvdG90eXBlLnRyYW5zbGF0ZT1mdW5jdGlvbigpe3RoaXMucHJvY2Vzc2VkWERhdGF8fHRoaXMucHJvY2Vzc0RhdGEoKTtcbnRoaXMuZ2VuZXJhdGVQb2ludHMoKTt2YXIgYT10aGlzLm9wdGlvbnMsZD1hLnN0YWNraW5nLGI9dGhpcy54QXhpcyxlPWIuY2F0ZWdvcmllcyxoPXRoaXMuZW5hYmxlZERhdGFTb3J0aW5nLGc9dGhpcy55QXhpcyxmPXRoaXMucG9pbnRzLGs9Zi5sZW5ndGgsbD0hIXRoaXMubW9kaWZ5VmFsdWUscixuPXRoaXMucG9pbnRQbGFjZW1lbnRUb1hWYWx1ZSgpLHE9ISFuLHA9YS50aHJlc2hvbGQsdT1hLnN0YXJ0RnJvbVRocmVzaG9sZD9wOjAsdix3PXRoaXMuem9uZUF4aXN8fFwieVwiLHk9TnVtYmVyLk1BWF9WQUxVRTtmb3Iocj0wO3I8aztyKyspe3ZhciBFPWZbcl0seD1FLngsRD1FLnksQj1FLmxvdyxQPWQmJmcuc3RhY2tpbmcmJmcuc3RhY2tpbmcuc3RhY2tzWyh0aGlzLm5lZ1N0YWNrcyYmRDwodT8wOnApP1wiLVwiOlwiXCIpK3RoaXMuc3RhY2tLZXldLE49dm9pZCAwLEM9dm9pZCAwO2lmKGcucG9zaXRpdmVWYWx1ZXNPbmx5JiYhZy52YWxpZGF0ZVBvc2l0aXZlVmFsdWUoRCl8fGIucG9zaXRpdmVWYWx1ZXNPbmx5JiZcbiFiLnZhbGlkYXRlUG9zaXRpdmVWYWx1ZSh4KSlFLmlzTnVsbD0hMDtFLnBsb3RYPXY9bShKKGIudHJhbnNsYXRlKHgsMCwwLDAsMSxuLFwiZmxhZ3NcIj09PXRoaXMudHlwZSksLTFFNSwxRTUpKTtpZihkJiZ0aGlzLnZpc2libGUmJlAmJlBbeF0pe3ZhciB6PXRoaXMuZ2V0U3RhY2tJbmRpY2F0b3Ioeix4LHRoaXMuaW5kZXgpO0UuaXNOdWxsfHwoTj1QW3hdLEM9Ti5wb2ludHNbei5rZXldKX1MKEMpJiYoQj1DWzBdLEQ9Q1sxXSxCPT09dSYmei5rZXk9PT1QW3hdLmJhc2UmJihCPXQoUihwKSYmcCxnLm1pbikpLGcucG9zaXRpdmVWYWx1ZXNPbmx5JiYwPj1CJiYoQj1udWxsKSxFLnRvdGFsPUUuc3RhY2tUb3RhbD1OLnRvdGFsLEUucGVyY2VudGFnZT1OLnRvdGFsJiZFLnkvTi50b3RhbCoxMDAsRS5zdGFja1k9RCx0aGlzLmlycmVndWxhcldpZHRoc3x8Ti5zZXRPZmZzZXQodGhpcy5wb2ludFhPZmZzZXR8fDAsdGhpcy5iYXJXfHwwKSk7RS55Qm90dG9tPWMoQik/SihnLnRyYW5zbGF0ZShCLFxuMCwxLDAsMSksLTFFNSwxRTUpOm51bGw7bCYmKEQ9dGhpcy5tb2RpZnlWYWx1ZShELEUpKTtFLnBsb3RZPXZvaWQgMDtSKEQpJiYoRD1nLnRyYW5zbGF0ZShELCExLCEwLCExLCEwKSxcInVuZGVmaW5lZFwiIT09dHlwZW9mIEQmJihFLnBsb3RZPUooRCwtMUU1LDFFNSkpKTtFLmlzSW5zaWRlPXRoaXMuaXNQb2ludEluc2lkZShFKTtFLmNsaWVudFg9cT9tKGIudHJhbnNsYXRlKHgsMCwwLDAsMSxuKSk6djtFLm5lZ2F0aXZlPUVbd108KGFbdytcIlRocmVzaG9sZFwiXXx8cHx8MCk7RS5jYXRlZ29yeT1lJiZcInVuZGVmaW5lZFwiIT09dHlwZW9mIGVbRS54XT9lW0UueF06RS54O2lmKCFFLmlzTnVsbCYmITEhPT1FLnZpc2libGUpe1widW5kZWZpbmVkXCIhPT10eXBlb2YgTSYmKHk9TWF0aC5taW4oeSxNYXRoLmFicyh2LU0pKSk7dmFyIE09dn1FLnpvbmU9dGhpcy56b25lcy5sZW5ndGgmJkUuZ2V0Wm9uZSgpOyFFLmdyYXBoaWMmJnRoaXMuZ3JvdXAmJmgmJihFLmlzTmV3PSEwKX10aGlzLmNsb3Nlc3RQb2ludFJhbmdlUHg9XG55O0EodGhpcyxcImFmdGVyVHJhbnNsYXRlXCIpfTtiLnByb3RvdHlwZS5nZXRWYWxpZFBvaW50cz1mdW5jdGlvbihhLGMsZCl7dmFyIGI9dGhpcy5jaGFydDtyZXR1cm4oYXx8dGhpcy5wb2ludHN8fFtdKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGMmJiFiLmlzSW5zaWRlUGxvdChhLnBsb3RYLGEucGxvdFkse2ludmVydGVkOmIuaW52ZXJ0ZWR9KT8hMTohMSE9PWEudmlzaWJsZSYmKGR8fCFhLmlzTnVsbCl9KX07Yi5wcm90b3R5cGUuZ2V0Q2xpcEJveD1mdW5jdGlvbihhLGMpe3ZhciBkPXRoaXMub3B0aW9ucyxiPXRoaXMuY2hhcnQsZT1iLmludmVydGVkLGg9dGhpcy54QXhpcyxnPWgmJnRoaXMueUF4aXMsZj1iLm9wdGlvbnMuY2hhcnQuc2Nyb2xsYWJsZVBsb3RBcmVhfHx7fTthJiYhMT09PWQuY2xpcCYmZz9hPWU/e3k6LWIuY2hhcnRXaWR0aCtnLmxlbitnLnBvcyxoZWlnaHQ6Yi5jaGFydFdpZHRoLHdpZHRoOmIuY2hhcnRIZWlnaHQseDotYi5jaGFydEhlaWdodCtoLmxlbitcbmgucG9zfTp7eTotZy5wb3MsaGVpZ2h0OmIuY2hhcnRIZWlnaHQsd2lkdGg6Yi5jaGFydFdpZHRoLHg6LWgucG9zfTooYT10aGlzLmNsaXBCb3h8fGIuY2xpcEJveCxjJiYoYS53aWR0aD1iLnBsb3RTaXplWCxhLng9KGIuc2Nyb2xsYWJsZVBpeGVsc1h8fDApKihmLnNjcm9sbFBvc2l0aW9uWHx8MCkpKTtyZXR1cm4gYz97d2lkdGg6YS53aWR0aCx4OmEueH06YX07Yi5wcm90b3R5cGUuZ2V0U2hhcmVkQ2xpcEtleT1mdW5jdGlvbihhKXtpZih0aGlzLnNoYXJlZENsaXBLZXkpcmV0dXJuIHRoaXMuc2hhcmVkQ2xpcEtleTt2YXIgYz1bYSYmYS5kdXJhdGlvbixhJiZhLmVhc2luZyxhJiZhLmRlZmVyLHRoaXMuZ2V0Q2xpcEJveChhKS5oZWlnaHQsdGhpcy5vcHRpb25zLnhBeGlzLHRoaXMub3B0aW9ucy55QXhpc10uam9pbigpO2lmKCExIT09dGhpcy5vcHRpb25zLmNsaXB8fGEpdGhpcy5zaGFyZWRDbGlwS2V5PWM7cmV0dXJuIGN9O2IucHJvdG90eXBlLnNldENsaXA9ZnVuY3Rpb24oYSl7dmFyIGM9XG50aGlzLmNoYXJ0LGQ9dGhpcy5vcHRpb25zLGI9Yy5yZW5kZXJlcixlPWMuaW52ZXJ0ZWQsaD10aGlzLmNsaXBCb3gsZz10aGlzLmdldENsaXBCb3goYSksZj10aGlzLmdldFNoYXJlZENsaXBLZXkoYSksaz1jLnNoYXJlZENsaXBzW2ZdLG09Yy5zaGFyZWRDbGlwc1tmK1wibVwiXTthJiYoZy53aWR0aD0wLGUmJihnLng9Yy5wbG90SGVpZ2h0KyghMSE9PWQuY2xpcD8wOmMucGxvdFRvcCkpKTtrP2MuaGFzTG9hZGVkfHxrLmF0dHIoZyk6KGEmJihjLnNoYXJlZENsaXBzW2YrXCJtXCJdPW09Yi5jbGlwUmVjdChlPyhjLnBsb3RTaXplWHx8MCkrOTk6LTk5LGU/LWMucGxvdExlZnQ6LWMucGxvdFRvcCw5OSxlP2MuY2hhcnRXaWR0aDpjLmNoYXJ0SGVpZ2h0KSksYy5zaGFyZWRDbGlwc1tmXT1rPWIuY2xpcFJlY3QoZyksay5jb3VudD17bGVuZ3RoOjB9KTthJiYhay5jb3VudFt0aGlzLmluZGV4XSYmKGsuY291bnRbdGhpcy5pbmRleF09ITAsay5jb3VudC5sZW5ndGgrPTEpO2lmKCExIT09ZC5jbGlwfHxcbmEpdGhpcy5ncm91cC5jbGlwKGF8fGg/azpjLmNsaXBSZWN0KSx0aGlzLm1hcmtlckdyb3VwLmNsaXAobSk7YXx8KGsuY291bnRbdGhpcy5pbmRleF0mJihkZWxldGUgay5jb3VudFt0aGlzLmluZGV4XSwtLWsuY291bnQubGVuZ3RoKSwwPT09ay5jb3VudC5sZW5ndGgmJihofHwoYy5zaGFyZWRDbGlwc1tmXT1rLmRlc3Ryb3koKSksbSYmKGMuc2hhcmVkQ2xpcHNbZitcIm1cIl09bS5kZXN0cm95KCkpKSl9O2IucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jaGFydCxkPXcodGhpcy5vcHRpb25zLmFuaW1hdGlvbiksYj10aGlzLnNoYXJlZENsaXBLZXk7aWYoYSl0aGlzLnNldENsaXAoZCk7ZWxzZSBpZihiKXthPWMuc2hhcmVkQ2xpcHNbYl07Yj1jLnNoYXJlZENsaXBzW2IrXCJtXCJdO3ZhciBlPXRoaXMuZ2V0Q2xpcEJveChkLCEwKTthJiZhLmFuaW1hdGUoZSxkKTtiJiZiLmFuaW1hdGUoe3dpZHRoOmUud2lkdGgrOTkseDplLngtKGMuaW52ZXJ0ZWQ/MDo5OSl9LFxuZCl9fTtiLnByb3RvdHlwZS5hZnRlckFuaW1hdGU9ZnVuY3Rpb24oKXt0aGlzLnNldENsaXAoKTtBKHRoaXMsXCJhZnRlckFuaW1hdGVcIik7dGhpcy5maW5pc2hlZEFuaW1hdGluZz0hMH07Yi5wcm90b3R5cGUuZHJhd1BvaW50cz1mdW5jdGlvbigpe3ZhciBhPXRoaXMucG9pbnRzLGM9dGhpcy5jaGFydCxkLGIsZT10aGlzLm9wdGlvbnMubWFya2VyLGg9dGhpc1t0aGlzLnNwZWNpYWxHcm91cF18fHRoaXMubWFya2VyR3JvdXAsZz10aGlzLnhBeGlzLGY9dChlLmVuYWJsZWQsIWd8fGcuaXNSYWRpYWw/ITA6bnVsbCx0aGlzLmNsb3Nlc3RQb2ludFJhbmdlUHg+PWUuZW5hYmxlZFRocmVzaG9sZCplLnJhZGl1cyk7aWYoITEhPT1lLmVuYWJsZWR8fHRoaXMuX2hhc1BvaW50TWFya2Vycylmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgaz1hW2RdO3ZhciBtPShiPWsuZ3JhcGhpYyk/XCJhbmltYXRlXCI6XCJhdHRyXCI7dmFyIGw9ay5tYXJrZXJ8fHt9O3ZhciByPSEhay5tYXJrZXI7aWYoKGYmJlxuXCJ1bmRlZmluZWRcIj09PXR5cGVvZiBsLmVuYWJsZWR8fGwuZW5hYmxlZCkmJiFrLmlzTnVsbCYmITEhPT1rLnZpc2libGUpe3ZhciBuPXQobC5zeW1ib2wsdGhpcy5zeW1ib2wpO3ZhciBxPXRoaXMubWFya2VyQXR0cmlicyhrLGsuc2VsZWN0ZWQmJlwic2VsZWN0XCIpO3RoaXMuZW5hYmxlZERhdGFTb3J0aW5nJiYoay5zdGFydFhQb3M9Zy5yZXZlcnNlZD8tKHEud2lkdGh8fDApOmcud2lkdGgpO3ZhciBwPSExIT09ay5pc0luc2lkZTtiP2JbcD9cInNob3dcIjpcImhpZGVcIl0ocCkuYW5pbWF0ZShxKTpwJiYoMDwocS53aWR0aHx8MCl8fGsuaGFzSW1hZ2UpJiYoay5ncmFwaGljPWI9Yy5yZW5kZXJlci5zeW1ib2wobixxLngscS55LHEud2lkdGgscS5oZWlnaHQscj9sOmUpLmFkZChoKSx0aGlzLmVuYWJsZWREYXRhU29ydGluZyYmYy5oYXNSZW5kZXJlZCYmKGIuYXR0cih7eDprLnN0YXJ0WFBvc30pLG09XCJhbmltYXRlXCIpKTtiJiZcImFuaW1hdGVcIj09PW0mJmJbcD9cInNob3dcIjpcImhpZGVcIl0ocCkuYW5pbWF0ZShxKTtcbmlmKGImJiFjLnN0eWxlZE1vZGUpYlttXSh0aGlzLnBvaW50QXR0cmlicyhrLGsuc2VsZWN0ZWQmJlwic2VsZWN0XCIpKTtiJiZiLmFkZENsYXNzKGsuZ2V0Q2xhc3NOYW1lKCksITApfWVsc2UgYiYmKGsuZ3JhcGhpYz1iLmRlc3Ryb3koKSl9fTtiLnByb3RvdHlwZS5tYXJrZXJBdHRyaWJzPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9dGhpcy5vcHRpb25zLGI9ZC5tYXJrZXIsZT1hLm1hcmtlcnx8e30saD1lLnN5bWJvbHx8Yi5zeW1ib2wsZz10KGUucmFkaXVzLGIucmFkaXVzKTtjJiYoYj1iLnN0YXRlc1tjXSxjPWUuc3RhdGVzJiZlLnN0YXRlc1tjXSxnPXQoYyYmYy5yYWRpdXMsYiYmYi5yYWRpdXMsZysoYiYmYi5yYWRpdXNQbHVzfHwwKSkpO2EuaGFzSW1hZ2U9aCYmMD09PWguaW5kZXhPZihcInVybFwiKTthLmhhc0ltYWdlJiYoZz0wKTthPXt4OmQuY3Jpc3A/TWF0aC5mbG9vcihhLnBsb3RYLWcpOmEucGxvdFgtZyx5OmEucGxvdFktZ307ZyYmKGEud2lkdGg9YS5oZWlnaHQ9MipnKTtyZXR1cm4gYX07XG5iLnByb3RvdHlwZS5wb2ludEF0dHJpYnM9ZnVuY3Rpb24oYSxjKXt2YXIgZD10aGlzLm9wdGlvbnMubWFya2VyLGI9YSYmYS5vcHRpb25zLGU9YiYmYi5tYXJrZXJ8fHt9LGg9dGhpcy5jb2xvcixnPWImJmIuY29sb3IsZj1hJiZhLmNvbG9yO2I9dChlLmxpbmVXaWR0aCxkLmxpbmVXaWR0aCk7dmFyIGs9YSYmYS56b25lJiZhLnpvbmUuY29sb3I7YT0xO2g9Z3x8a3x8Znx8aDtnPWUuZmlsbENvbG9yfHxkLmZpbGxDb2xvcnx8aDtoPWUubGluZUNvbG9yfHxkLmxpbmVDb2xvcnx8aDtjPWN8fFwibm9ybWFsXCI7ZD1kLnN0YXRlc1tjXTtjPWUuc3RhdGVzJiZlLnN0YXRlc1tjXXx8e307Yj10KGMubGluZVdpZHRoLGQubGluZVdpZHRoLGIrdChjLmxpbmVXaWR0aFBsdXMsZC5saW5lV2lkdGhQbHVzLDApKTtnPWMuZmlsbENvbG9yfHxkLmZpbGxDb2xvcnx8ZztoPWMubGluZUNvbG9yfHxkLmxpbmVDb2xvcnx8aDthPXQoYy5vcGFjaXR5LGQub3BhY2l0eSxhKTtyZXR1cm57c3Ryb2tlOmgsXCJzdHJva2Utd2lkdGhcIjpiLFxuZmlsbDpnLG9wYWNpdHk6YX19O2IucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxkPWMuY2hhcnQsYj0vQXBwbGVXZWJLaXRcXC81MzMvLnRlc3QocS5uYXZpZ2F0b3IudXNlckFnZW50KSxlLGgsZj1jLmRhdGF8fFtdLGssbTtBKGMsXCJkZXN0cm95XCIpO3RoaXMucmVtb3ZlRXZlbnRzKGEpOyhjLmF4aXNUeXBlc3x8W10pLmZvckVhY2goZnVuY3Rpb24oYSl7KG09Y1thXSkmJm0uc2VyaWVzJiYoZyhtLnNlcmllcyxjKSxtLmlzRGlydHk9bS5mb3JjZVJlZHJhdz0hMCl9KTtjLmxlZ2VuZEl0ZW0mJmMuY2hhcnQubGVnZW5kLmRlc3Ryb3lJdGVtKGMpO2ZvcihoPWYubGVuZ3RoO2gtLTspKGs9ZltoXSkmJmsuZGVzdHJveSYmay5kZXN0cm95KCk7Yy5jbGlwcyYmYy5jbGlwcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBhLmRlc3Ryb3koKX0pO3guY2xlYXJUaW1lb3V0KGMuYW5pbWF0aW9uVGltZW91dCk7TShjLGZ1bmN0aW9uKGEsYyl7YSBpbnN0YW5jZW9mXG5CJiYhYS5zdXJ2aXZlJiYoZT1iJiZcImdyb3VwXCI9PT1jP1wiaGlkZVwiOlwiZGVzdHJveVwiLGFbZV0oKSl9KTtkLmhvdmVyU2VyaWVzPT09YyYmKGQuaG92ZXJTZXJpZXM9dm9pZCAwKTtnKGQuc2VyaWVzLGMpO2Qub3JkZXJTZXJpZXMoKTtNKGMsZnVuY3Rpb24oZCxiKXthJiZcImhjRXZlbnRzXCI9PT1ifHxkZWxldGUgY1tiXX0pfTtiLnByb3RvdHlwZS5hcHBseVpvbmVzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPXRoaXMuY2hhcnQsZD1jLnJlbmRlcmVyLGI9dGhpcy56b25lcyxlLGgsZz10aGlzLmNsaXBzfHxbXSxmLGs9dGhpcy5ncmFwaCxtPXRoaXMuYXJlYSxsPU1hdGgubWF4KGMuY2hhcnRXaWR0aCxjLmNoYXJ0SGVpZ2h0KSxyPXRoaXNbKHRoaXMuem9uZUF4aXN8fFwieVwiKStcIkF4aXNcIl0sbj1jLmludmVydGVkLHEscCx1LHY9ITEsdyx5O2lmKGIubGVuZ3RoJiYoa3x8bSkmJnImJlwidW5kZWZpbmVkXCIhPT10eXBlb2Ygci5taW4pe3ZhciBFPXIucmV2ZXJzZWQ7dmFyIEE9ci5ob3JpejtcbmsmJiF0aGlzLnNob3dMaW5lJiZrLmhpZGUoKTttJiZtLmhpZGUoKTt2YXIgeD1yLmdldEV4dHJlbWVzKCk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGIsRil7ZT1FP0E/Yy5wbG90V2lkdGg6MDpBPzA6ci50b1BpeGVscyh4Lm1pbil8fDA7ZT1KKHQoaCxlKSwwLGwpO2g9SihNYXRoLnJvdW5kKHIudG9QaXhlbHModChiLnZhbHVlLHgubWF4KSwhMCl8fDApLDAsbCk7diYmKGU9aD1yLnRvUGl4ZWxzKHgubWF4KSk7cT1NYXRoLmFicyhlLWgpO3A9TWF0aC5taW4oZSxoKTt1PU1hdGgubWF4KGUsaCk7ci5pc1hBeGlzPyhmPXt4Om4/dTpwLHk6MCx3aWR0aDpxLGhlaWdodDpsfSxBfHwoZi54PWMucGxvdEhlaWdodC1mLngpKTooZj17eDowLHk6bj91OnAsd2lkdGg6bCxoZWlnaHQ6cX0sQSYmKGYueT1jLnBsb3RXaWR0aC1mLnkpKTtuJiZkLmlzVk1MJiYoZj1yLmlzWEF4aXM/e3g6MCx5OkU/cDp1LGhlaWdodDpmLndpZHRoLHdpZHRoOmMuY2hhcnRXaWR0aH06e3g6Zi55LWMucGxvdExlZnQtYy5zcGFjaW5nQm94LngsXG55OjAsd2lkdGg6Zi5oZWlnaHQsaGVpZ2h0OmMuY2hhcnRIZWlnaHR9KTtnW0ZdP2dbRl0uYW5pbWF0ZShmKTpnW0ZdPWQuY2xpcFJlY3QoZik7dz1hW1wiem9uZS1hcmVhLVwiK0ZdO3k9YVtcInpvbmUtZ3JhcGgtXCIrRl07ayYmeSYmeS5jbGlwKGdbRl0pO20mJncmJncuY2xpcChnW0ZdKTt2PWIudmFsdWU+eC5tYXg7YS5yZXNldFpvbmVzJiYwPT09aCYmKGg9dm9pZCAwKX0pO3RoaXMuY2xpcHM9Z31lbHNlIGEudmlzaWJsZSYmKGsmJmsuc2hvdyghMCksbSYmbS5zaG93KCEwKSl9O2IucHJvdG90eXBlLmludmVydEdyb3Vwcz1mdW5jdGlvbihhKXtmdW5jdGlvbiBjKCl7W1wiZ3JvdXBcIixcIm1hcmtlckdyb3VwXCJdLmZvckVhY2goZnVuY3Rpb24oYyl7ZFtjXSYmKGIucmVuZGVyZXIuaXNWTUwmJmRbY10uYXR0cih7d2lkdGg6ZC55QXhpcy5sZW4saGVpZ2h0OmQueEF4aXMubGVufSksZFtjXS53aWR0aD1kLnlBeGlzLmxlbixkW2NdLmhlaWdodD1kLnhBeGlzLmxlbixkW2NdLmludmVydChkLmlzUmFkaWFsU2VyaWVzP1xuITE6YSkpfSl9dmFyIGQ9dGhpcyxiPWQuY2hhcnQ7ZC54QXhpcyYmKGQuZXZlbnRzVG9VbmJpbmQucHVzaChEKGIsXCJyZXNpemVcIixjKSksYygpLGQuaW52ZXJ0R3JvdXBzPWMpfTtiLnByb3RvdHlwZS5wbG90R3JvdXA9ZnVuY3Rpb24oYSxkLGIsZSxoKXt2YXIgZz10aGlzW2FdLGY9IWc7Yj17dmlzaWJpbGl0eTpiLHpJbmRleDplfHwuMX07XCJ1bmRlZmluZWRcIj09PXR5cGVvZiB0aGlzLm9wYWNpdHl8fHRoaXMuY2hhcnQuc3R5bGVkTW9kZXx8XCJpbmFjdGl2ZVwiPT09dGhpcy5zdGF0ZXx8KGIub3BhY2l0eT10aGlzLm9wYWNpdHkpO2YmJih0aGlzW2FdPWc9dGhpcy5jaGFydC5yZW5kZXJlci5nKCkuYWRkKGgpKTtnLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1cIitkK1wiIGhpZ2hjaGFydHMtc2VyaWVzLVwiK3RoaXMuaW5kZXgrXCIgaGlnaGNoYXJ0cy1cIit0aGlzLnR5cGUrXCItc2VyaWVzIFwiKyhjKHRoaXMuY29sb3JJbmRleCk/XCJoaWdoY2hhcnRzLWNvbG9yLVwiK3RoaXMuY29sb3JJbmRleCtcIiBcIjpcblwiXCIpKyh0aGlzLm9wdGlvbnMuY2xhc3NOYW1lfHxcIlwiKSsoZy5oYXNDbGFzcyhcImhpZ2hjaGFydHMtdHJhY2tlclwiKT9cIiBoaWdoY2hhcnRzLXRyYWNrZXJcIjpcIlwiKSwhMCk7Zy5hdHRyKGIpW2Y/XCJhdHRyXCI6XCJhbmltYXRlXCJdKHRoaXMuZ2V0UGxvdEJveCgpKTtyZXR1cm4gZ307Yi5wcm90b3R5cGUuZ2V0UGxvdEJveD1mdW5jdGlvbigpe3ZhciBhPXRoaXMuY2hhcnQsYz10aGlzLnhBeGlzLGQ9dGhpcy55QXhpczthLmludmVydGVkJiYoYz1kLGQ9dGhpcy54QXhpcyk7cmV0dXJue3RyYW5zbGF0ZVg6Yz9jLmxlZnQ6YS5wbG90TGVmdCx0cmFuc2xhdGVZOmQ/ZC50b3A6YS5wbG90VG9wLHNjYWxlWDoxLHNjYWxlWToxfX07Yi5wcm90b3R5cGUucmVtb3ZlRXZlbnRzPWZ1bmN0aW9uKGEpe2F8fHAodGhpcyk7dGhpcy5ldmVudHNUb1VuYmluZC5sZW5ndGgmJih0aGlzLmV2ZW50c1RvVW5iaW5kLmZvckVhY2goZnVuY3Rpb24oYSl7YSgpfSksdGhpcy5ldmVudHNUb1VuYmluZC5sZW5ndGg9XG4wKX07Yi5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPWEuY2hhcnQsZD1hLm9wdGlvbnMsYj13KGQuYW5pbWF0aW9uKSxlPSFhLmZpbmlzaGVkQW5pbWF0aW5nJiZjLnJlbmRlcmVyLmlzU1ZHJiZiLmR1cmF0aW9uLGg9YS52aXNpYmxlP1wiaW5oZXJpdFwiOlwiaGlkZGVuXCIsZz1kLnpJbmRleCxmPWEuaGFzUmVuZGVyZWQsaz1jLnNlcmllc0dyb3VwLG09Yy5pbnZlcnRlZDtBKHRoaXMsXCJyZW5kZXJcIik7dmFyIGw9YS5wbG90R3JvdXAoXCJncm91cFwiLFwic2VyaWVzXCIsaCxnLGspO2EubWFya2VyR3JvdXA9YS5wbG90R3JvdXAoXCJtYXJrZXJHcm91cFwiLFwibWFya2Vyc1wiLGgsZyxrKTtlJiZhLmFuaW1hdGUmJmEuYW5pbWF0ZSghMCk7bC5pbnZlcnRlZD10KGEuaW52ZXJ0aWJsZSxhLmlzQ2FydGVzaWFuKT9tOiExO2EuZHJhd0dyYXBoJiYoYS5kcmF3R3JhcGgoKSxhLmFwcGx5Wm9uZXMoKSk7YS52aXNpYmxlJiZhLmRyYXdQb2ludHMoKTthLmRyYXdEYXRhTGFiZWxzJiZcbmEuZHJhd0RhdGFMYWJlbHMoKTthLnJlZHJhd1BvaW50cyYmYS5yZWRyYXdQb2ludHMoKTthLmRyYXdUcmFja2VyJiYhMSE9PWEub3B0aW9ucy5lbmFibGVNb3VzZVRyYWNraW5nJiZhLmRyYXdUcmFja2VyKCk7YS5pbnZlcnRHcm91cHMobSk7ITE9PT1kLmNsaXB8fGEuc2hhcmVkQ2xpcEtleXx8Znx8bC5jbGlwKGMuY2xpcFJlY3QpO2UmJmEuYW5pbWF0ZSYmYS5hbmltYXRlKCk7Znx8KGUmJmIuZGVmZXImJihlKz1iLmRlZmVyKSxhLmFuaW1hdGlvblRpbWVvdXQ9WihmdW5jdGlvbigpe2EuYWZ0ZXJBbmltYXRlKCl9LGV8fDApKTthLmlzRGlydHk9ITE7YS5oYXNSZW5kZXJlZD0hMDtBKGEsXCJhZnRlclJlbmRlclwiKX07Yi5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jaGFydCxjPXRoaXMuaXNEaXJ0eXx8dGhpcy5pc0RpcnR5RGF0YSxkPXRoaXMuZ3JvdXAsYj10aGlzLnhBeGlzLGU9dGhpcy55QXhpcztkJiYoYS5pbnZlcnRlZCYmZC5hdHRyKHt3aWR0aDphLnBsb3RXaWR0aCxcbmhlaWdodDphLnBsb3RIZWlnaHR9KSxkLmFuaW1hdGUoe3RyYW5zbGF0ZVg6dChiJiZiLmxlZnQsYS5wbG90TGVmdCksdHJhbnNsYXRlWTp0KGUmJmUudG9wLGEucGxvdFRvcCl9KSk7dGhpcy50cmFuc2xhdGUoKTt0aGlzLnJlbmRlcigpO2MmJmRlbGV0ZSB0aGlzLmtkVHJlZX07Yi5wcm90b3R5cGUuc2VhcmNoUG9pbnQ9ZnVuY3Rpb24oYSxjKXt2YXIgZD10aGlzLnhBeGlzLGI9dGhpcy55QXhpcyxlPXRoaXMuY2hhcnQuaW52ZXJ0ZWQ7cmV0dXJuIHRoaXMuc2VhcmNoS0RUcmVlKHtjbGllbnRYOmU/ZC5sZW4tYS5jaGFydFkrZC5wb3M6YS5jaGFydFgtZC5wb3MscGxvdFk6ZT9iLmxlbi1hLmNoYXJ0WCtiLnBvczphLmNoYXJ0WS1iLnBvc30sYyxhKX07Yi5wcm90b3R5cGUuYnVpbGRLRFRyZWU9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhhLGIsZSl7dmFyIGg7aWYoaD1hJiZhLmxlbmd0aCl7dmFyIGc9ZC5rZEF4aXNBcnJheVtiJWVdO2Euc29ydChmdW5jdGlvbihhLGMpe3JldHVybiBhW2ddLVxuY1tnXX0pO2g9TWF0aC5mbG9vcihoLzIpO3JldHVybntwb2ludDphW2hdLGxlZnQ6YyhhLnNsaWNlKDAsaCksYisxLGUpLHJpZ2h0OmMoYS5zbGljZShoKzEpLGIrMSxlKX19fXRoaXMuYnVpbGRpbmdLZFRyZWU9ITA7dmFyIGQ9dGhpcyxiPS0xPGQub3B0aW9ucy5maW5kTmVhcmVzdFBvaW50QnkuaW5kZXhPZihcInlcIik/MjoxO2RlbGV0ZSBkLmtkVHJlZTtaKGZ1bmN0aW9uKCl7ZC5rZFRyZWU9YyhkLmdldFZhbGlkUG9pbnRzKG51bGwsIWQuZGlyZWN0VG91Y2gpLGIsYik7ZC5idWlsZGluZ0tkVHJlZT0hMX0sZC5vcHRpb25zLmtkTm93fHxhJiZcInRvdWNoc3RhcnRcIj09PWEudHlwZT8wOjEpfTtiLnByb3RvdHlwZS5zZWFyY2hLRFRyZWU9ZnVuY3Rpb24oYSxkLGIpe2Z1bmN0aW9uIGUoYSxkLGIsbSl7dmFyIGw9ZC5wb2ludCxyPWgua2RBeGlzQXJyYXlbYiVtXSxuPWw7dmFyIHE9YyhhW2ddKSYmYyhsW2ddKT9NYXRoLnBvdyhhW2ddLWxbZ10sMik6bnVsbDt2YXIgcD1jKGFbZl0pJiZcbmMobFtmXSk/TWF0aC5wb3coYVtmXS1sW2ZdLDIpOm51bGw7cD0ocXx8MCkrKHB8fDApO2wuZGlzdD1jKHApP01hdGguc3FydChwKTpOdW1iZXIuTUFYX1ZBTFVFO2wuZGlzdFg9YyhxKT9NYXRoLnNxcnQocSk6TnVtYmVyLk1BWF9WQUxVRTtyPWFbcl0tbFtyXTtwPTA+cj9cImxlZnRcIjpcInJpZ2h0XCI7cT0wPnI/XCJyaWdodFwiOlwibGVmdFwiO2RbcF0mJihwPWUoYSxkW3BdLGIrMSxtKSxuPXBba108bltrXT9wOmwpO2RbcV0mJk1hdGguc3FydChyKnIpPG5ba10mJihhPWUoYSxkW3FdLGIrMSxtKSxuPWFba108bltrXT9hOm4pO3JldHVybiBufXZhciBoPXRoaXMsZz10aGlzLmtkQXhpc0FycmF5WzBdLGY9dGhpcy5rZEF4aXNBcnJheVsxXSxrPWQ/XCJkaXN0WFwiOlwiZGlzdFwiO2Q9LTE8aC5vcHRpb25zLmZpbmROZWFyZXN0UG9pbnRCeS5pbmRleE9mKFwieVwiKT8yOjE7dGhpcy5rZFRyZWV8fHRoaXMuYnVpbGRpbmdLZFRyZWV8fHRoaXMuYnVpbGRLRFRyZWUoYik7aWYodGhpcy5rZFRyZWUpcmV0dXJuIGUoYSxcbnRoaXMua2RUcmVlLGQsZCl9O2IucHJvdG90eXBlLnBvaW50UGxhY2VtZW50VG9YVmFsdWU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMsYz1hLnBvaW50UmFuZ2UsZD10aGlzLnhBeGlzO2E9YS5wb2ludFBsYWNlbWVudDtcImJldHdlZW5cIj09PWEmJihhPWQucmV2ZXJzZWQ/LS41Oi41KTtyZXR1cm4gUihhKT9hKihjfHxkLnBvaW50UmFuZ2UpOjB9O2IucHJvdG90eXBlLmlzUG9pbnRJbnNpZGU9ZnVuY3Rpb24oYSl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBhLnBsb3RZJiZcInVuZGVmaW5lZFwiIT09dHlwZW9mIGEucGxvdFgmJjA8PWEucGxvdFkmJmEucGxvdFk8PXRoaXMueUF4aXMubGVuJiYwPD1hLnBsb3RYJiZhLnBsb3RYPD10aGlzLnhBeGlzLmxlbn07Yi5wcm90b3R5cGUuZHJhd1RyYWNrZXI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGM9YS5vcHRpb25zLGI9Yy50cmFja0J5QXJlYSxlPVtdLmNvbmNhdChiP2EuYXJlYVBhdGg6YS5ncmFwaFBhdGgpLGg9YS5jaGFydCxcbmc9aC5wb2ludGVyLGs9aC5yZW5kZXJlcixtPWgub3B0aW9ucy50b29sdGlwLnNuYXAsbD1hLnRyYWNrZXIscj1mdW5jdGlvbihjKXtpZihoLmhvdmVyU2VyaWVzIT09YSlhLm9uTW91c2VPdmVyKCl9LG49XCJyZ2JhKDE5MiwxOTIsMTkyLFwiKyhkPy4wMDAxOi4wMDIpK1wiKVwiO2w/bC5hdHRyKHtkOmV9KTphLmdyYXBoJiYoYS50cmFja2VyPWsucGF0aChlKS5hdHRyKHt2aXNpYmlsaXR5OmEudmlzaWJsZT9cInZpc2libGVcIjpcImhpZGRlblwiLHpJbmRleDoyfSkuYWRkQ2xhc3MoYj9cImhpZ2hjaGFydHMtdHJhY2tlci1hcmVhXCI6XCJoaWdoY2hhcnRzLXRyYWNrZXItbGluZVwiKS5hZGQoYS5ncm91cCksaC5zdHlsZWRNb2RlfHxhLnRyYWNrZXIuYXR0cih7XCJzdHJva2UtbGluZWNhcFwiOlwicm91bmRcIixcInN0cm9rZS1saW5lam9pblwiOlwicm91bmRcIixzdHJva2U6bixmaWxsOmI/bjpcIm5vbmVcIixcInN0cm9rZS13aWR0aFwiOmEuZ3JhcGguc3Ryb2tlV2lkdGgoKSsoYj8wOjIqbSl9KSxbYS50cmFja2VyLFxuYS5tYXJrZXJHcm91cCxhLmRhdGFMYWJlbHNHcm91cF0uZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYoYS5hZGRDbGFzcyhcImhpZ2hjaGFydHMtdHJhY2tlclwiKS5vbihcIm1vdXNlb3ZlclwiLHIpLm9uKFwibW91c2VvdXRcIixmdW5jdGlvbihhKXtnLm9uVHJhY2tlck1vdXNlT3V0KGEpfSksYy5jdXJzb3ImJiFoLnN0eWxlZE1vZGUmJmEuY3NzKHtjdXJzb3I6Yy5jdXJzb3J9KSxmKSlhLm9uKFwidG91Y2hzdGFydFwiLHIpfSkpO0EodGhpcyxcImFmdGVyRHJhd1RyYWNrZXJcIil9O2IucHJvdG90eXBlLmFkZFBvaW50PWZ1bmN0aW9uKGEsYyxkLGIsZSl7dmFyIGg9dGhpcy5vcHRpb25zLGc9dGhpcy5kYXRhLGY9dGhpcy5jaGFydCxrPXRoaXMueEF4aXM7az1rJiZrLmhhc05hbWVzJiZrLm5hbWVzO3ZhciBtPWguZGF0YSxsPXRoaXMueERhdGEscjtjPXQoYywhMCk7dmFyIG49e3Nlcmllczp0aGlzfTt0aGlzLnBvaW50Q2xhc3MucHJvdG90eXBlLmFwcGx5T3B0aW9ucy5hcHBseShuLFthXSk7dmFyIHE9XG5uLng7dmFyIHA9bC5sZW5ndGg7aWYodGhpcy5yZXF1aXJlU29ydGluZyYmcTxsW3AtMV0pZm9yKHI9ITA7cCYmbFtwLTFdPnE7KXAtLTt0aGlzLnVwZGF0ZVBhcmFsbGVsQXJyYXlzKG4sXCJzcGxpY2VcIixwLDAsMCk7dGhpcy51cGRhdGVQYXJhbGxlbEFycmF5cyhuLHApO2smJm4ubmFtZSYmKGtbcV09bi5uYW1lKTttLnNwbGljZShwLDAsYSk7ciYmKHRoaXMuZGF0YS5zcGxpY2UocCwwLG51bGwpLHRoaXMucHJvY2Vzc0RhdGEoKSk7XCJwb2ludFwiPT09aC5sZWdlbmRUeXBlJiZ0aGlzLmdlbmVyYXRlUG9pbnRzKCk7ZCYmKGdbMF0mJmdbMF0ucmVtb3ZlP2dbMF0ucmVtb3ZlKCExKTooZy5zaGlmdCgpLHRoaXMudXBkYXRlUGFyYWxsZWxBcnJheXMobixcInNoaWZ0XCIpLG0uc2hpZnQoKSkpOyExIT09ZSYmQSh0aGlzLFwiYWRkUG9pbnRcIix7cG9pbnQ6bn0pO3RoaXMuaXNEaXJ0eURhdGE9dGhpcy5pc0RpcnR5PSEwO2MmJmYucmVkcmF3KGIpfTtiLnByb3RvdHlwZS5yZW1vdmVQb2ludD1mdW5jdGlvbihhLFxuYyxkKXt2YXIgYj10aGlzLGU9Yi5kYXRhLGg9ZVthXSxnPWIucG9pbnRzLGY9Yi5jaGFydCxrPWZ1bmN0aW9uKCl7ZyYmZy5sZW5ndGg9PT1lLmxlbmd0aCYmZy5zcGxpY2UoYSwxKTtlLnNwbGljZShhLDEpO2Iub3B0aW9ucy5kYXRhLnNwbGljZShhLDEpO2IudXBkYXRlUGFyYWxsZWxBcnJheXMoaHx8e3NlcmllczpifSxcInNwbGljZVwiLGEsMSk7aCYmaC5kZXN0cm95KCk7Yi5pc0RpcnR5PSEwO2IuaXNEaXJ0eURhdGE9ITA7YyYmZi5yZWRyYXcoKX07dihkLGYpO2M9dChjLCEwKTtoP2guZmlyZVBvaW50RXZlbnQoXCJyZW1vdmVcIixudWxsLGspOmsoKX07Yi5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKGEsYyxkLGIpe2Z1bmN0aW9uIGUoKXtoLmRlc3Ryb3koYik7Zy5pc0RpcnR5TGVnZW5kPWcuaXNEaXJ0eUJveD0hMDtnLmxpbmtTZXJpZXMoKTt0KGEsITApJiZnLnJlZHJhdyhjKX12YXIgaD10aGlzLGc9aC5jaGFydDshMSE9PWQ/QShoLFwicmVtb3ZlXCIsbnVsbCxlKTplKCl9O2IucHJvdG90eXBlLnVwZGF0ZT1cbmZ1bmN0aW9uKGMsZCl7Yz1FKGMsdGhpcy51c2VyT3B0aW9ucyk7QSh0aGlzLFwidXBkYXRlXCIse29wdGlvbnM6Y30pO3ZhciBiPXRoaXMsZT1iLmNoYXJ0LGc9Yi51c2VyT3B0aW9ucyxmPWIuaW5pdGlhbFR5cGV8fGIudHlwZSxrPWUub3B0aW9ucy5wbG90T3B0aW9ucyxtPWMudHlwZXx8Zy50eXBlfHxlLm9wdGlvbnMuY2hhcnQudHlwZSxyPSEodGhpcy5oYXNEZXJpdmVkRGF0YXx8bSYmbSE9PXRoaXMudHlwZXx8XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBjLnBvaW50U3RhcnR8fFwidW5kZWZpbmVkXCIhPT10eXBlb2YgYy5wb2ludEludGVydmFsfHxiLmhhc09wdGlvbkNoYW5nZWQoXCJkYXRhR3JvdXBpbmdcIil8fGIuaGFzT3B0aW9uQ2hhbmdlZChcInBvaW50U3RhcnRcIil8fGIuaGFzT3B0aW9uQ2hhbmdlZChcInBvaW50SW50ZXJ2YWxcIil8fGIuaGFzT3B0aW9uQ2hhbmdlZChcInBvaW50SW50ZXJ2YWxVbml0XCIpfHxiLmhhc09wdGlvbkNoYW5nZWQoXCJrZXlzXCIpKSxuPWxbZl0ucHJvdG90eXBlLHEsXG5wPVtcImV2ZW50T3B0aW9uc1wiLFwibmF2aWdhdG9yU2VyaWVzXCIsXCJiYXNlU2VyaWVzXCJdLHU9Yi5maW5pc2hlZEFuaW1hdGluZyYme2FuaW1hdGlvbjohMX0sdj17fTttPW18fGY7ciYmKHAucHVzaChcImRhdGFcIixcImlzRGlydHlEYXRhXCIsXCJwb2ludHNcIixcInByb2Nlc3NlZFhEYXRhXCIsXCJwcm9jZXNzZWRZRGF0YVwiLFwieEluY3JlbWVudFwiLFwiY3JvcHBlZFwiLFwiX2hhc1BvaW50TWFya2Vyc1wiLFwiX2hhc1BvaW50TGFiZWxzXCIsXCJjbGlwc1wiLFwibm9kZXNcIixcImxheW91dFwiLFwibWFwTWFwXCIsXCJtYXBEYXRhXCIsXCJtaW5ZXCIsXCJtYXhZXCIsXCJtaW5YXCIsXCJtYXhYXCIpLCExIT09Yy52aXNpYmxlJiZwLnB1c2goXCJhcmVhXCIsXCJncmFwaFwiKSxiLnBhcmFsbGVsQXJyYXlzLmZvckVhY2goZnVuY3Rpb24oYSl7cC5wdXNoKGErXCJEYXRhXCIpfSksYy5kYXRhJiYoYy5kYXRhU29ydGluZyYmaChiLm9wdGlvbnMuZGF0YVNvcnRpbmcsYy5kYXRhU29ydGluZyksdGhpcy5zZXREYXRhKGMuZGF0YSwhMSkpKTtjPVEoZyx1LHtpbmRleDpcInVuZGVmaW5lZFwiPT09XG50eXBlb2YgZy5pbmRleD9iLmluZGV4OmcuaW5kZXgscG9pbnRTdGFydDp0KGsmJmsuc2VyaWVzJiZrLnNlcmllcy5wb2ludFN0YXJ0LGcucG9pbnRTdGFydCxiLnhEYXRhWzBdKX0sIXImJntkYXRhOmIub3B0aW9ucy5kYXRhfSxjKTtyJiZjLmRhdGEmJihjLmRhdGE9Yi5vcHRpb25zLmRhdGEpO3A9W1wiZ3JvdXBcIixcIm1hcmtlckdyb3VwXCIsXCJkYXRhTGFiZWxzR3JvdXBcIixcInRyYW5zZm9ybUdyb3VwXCJdLmNvbmNhdChwKTtwLmZvckVhY2goZnVuY3Rpb24oYSl7cFthXT1iW2FdO2RlbGV0ZSBiW2FdfSk7Zz0hMTtpZihsW21dKXtpZihnPW0hPT1iLnR5cGUsYi5yZW1vdmUoITEsITEsITEsITApLGcpaWYoT2JqZWN0LnNldFByb3RvdHlwZU9mKU9iamVjdC5zZXRQcm90b3R5cGVPZihiLGxbbV0ucHJvdG90eXBlKTtlbHNle2s9T2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoYixcImhjRXZlbnRzXCIpJiZiLmhjRXZlbnRzO2ZvcihxIGluIG4pYltxXT12b2lkIDA7aChiLGxbbV0ucHJvdG90eXBlKTtcbms/Yi5oY0V2ZW50cz1rOmRlbGV0ZSBiLmhjRXZlbnRzfX1lbHNlIGEoMTcsITAsZSx7bWlzc2luZ01vZHVsZUZvcjptfSk7cC5mb3JFYWNoKGZ1bmN0aW9uKGEpe2JbYV09cFthXX0pO2IuaW5pdChlLGMpO2lmKHImJnRoaXMucG9pbnRzKXt2YXIgdz1iLm9wdGlvbnM7ITE9PT13LnZpc2libGU/KHYuZ3JhcGhpYz0xLHYuZGF0YUxhYmVsPTEpOmIuX2hhc1BvaW50TGFiZWxzfHwoYz13Lm1hcmtlcixtPXcuZGF0YUxhYmVscyxjJiYoITE9PT1jLmVuYWJsZWR8fFwic3ltYm9sXCJpbiBjKSYmKHYuZ3JhcGhpYz0xKSxtJiYhMT09PW0uZW5hYmxlZCYmKHYuZGF0YUxhYmVsPTEpKTt0aGlzLnBvaW50cy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EmJmEuc2VyaWVzJiYoYS5yZXNvbHZlQ29sb3IoKSxPYmplY3Qua2V5cyh2KS5sZW5ndGgmJmEuZGVzdHJveUVsZW1lbnRzKHYpLCExPT09dy5zaG93SW5MZWdlbmQmJmEubGVnZW5kSXRlbSYmZS5sZWdlbmQuZGVzdHJveUl0ZW0oYSkpfSx0aGlzKX1iLmluaXRpYWxUeXBlPVxuZjtlLmxpbmtTZXJpZXMoKTtnJiZiLmxpbmtlZFNlcmllcy5sZW5ndGgmJihiLmlzRGlydHlEYXRhPSEwKTtBKHRoaXMsXCJhZnRlclVwZGF0ZVwiKTt0KGQsITApJiZlLnJlZHJhdyhyP3ZvaWQgMDohMSl9O2IucHJvdG90eXBlLnNldE5hbWU9ZnVuY3Rpb24oYSl7dGhpcy5uYW1lPXRoaXMub3B0aW9ucy5uYW1lPXRoaXMudXNlck9wdGlvbnMubmFtZT1hO3RoaXMuY2hhcnQuaXNEaXJ0eUxlZ2VuZD0hMH07Yi5wcm90b3R5cGUuaGFzT3B0aW9uQ2hhbmdlZD1mdW5jdGlvbihhKXt2YXIgYz10aGlzLm9wdGlvbnNbYV0sZD10aGlzLmNoYXJ0Lm9wdGlvbnMucGxvdE9wdGlvbnMsYj10aGlzLnVzZXJPcHRpb25zW2FdO3JldHVybiBiP2MhPT1iOmMhPT10KGQmJmRbdGhpcy50eXBlXSYmZFt0aGlzLnR5cGVdW2FdLGQmJmQuc2VyaWVzJiZkLnNlcmllc1thXSxjKX07Yi5wcm90b3R5cGUub25Nb3VzZU92ZXI9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNoYXJ0LGM9YS5ob3ZlclNlcmllczthLnBvaW50ZXIuc2V0SG92ZXJDaGFydEluZGV4KCk7XG5pZihjJiZjIT09dGhpcyljLm9uTW91c2VPdXQoKTt0aGlzLm9wdGlvbnMuZXZlbnRzLm1vdXNlT3ZlciYmQSh0aGlzLFwibW91c2VPdmVyXCIpO3RoaXMuc2V0U3RhdGUoXCJob3ZlclwiKTthLmhvdmVyU2VyaWVzPXRoaXN9O2IucHJvdG90eXBlLm9uTW91c2VPdXQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9wdGlvbnMsYz10aGlzLmNoYXJ0LGQ9Yy50b29sdGlwLGI9Yy5ob3ZlclBvaW50O2MuaG92ZXJTZXJpZXM9bnVsbDtpZihiKWIub25Nb3VzZU91dCgpO3RoaXMmJmEuZXZlbnRzLm1vdXNlT3V0JiZBKHRoaXMsXCJtb3VzZU91dFwiKTshZHx8dGhpcy5zdGlja3lUcmFja2luZ3x8ZC5zaGFyZWQmJiF0aGlzLm5vU2hhcmVkVG9vbHRpcHx8ZC5oaWRlKCk7Yy5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihhKXthLnNldFN0YXRlKFwiXCIsITApfSl9O2IucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9dGhpcyxiPWQub3B0aW9ucyxlPWQuZ3JhcGgsaD1iLmluYWN0aXZlT3RoZXJQb2ludHMsXG5nPWIuc3RhdGVzLGY9Yi5saW5lV2lkdGgsaz1iLm9wYWNpdHksbT10KGdbYXx8XCJub3JtYWxcIl0mJmdbYXx8XCJub3JtYWxcIl0uYW5pbWF0aW9uLGQuY2hhcnQub3B0aW9ucy5jaGFydC5hbmltYXRpb24pO2I9MDthPWF8fFwiXCI7aWYoZC5zdGF0ZSE9PWEmJihbZC5ncm91cCxkLm1hcmtlckdyb3VwLGQuZGF0YUxhYmVsc0dyb3VwXS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2MmJihkLnN0YXRlJiZjLnJlbW92ZUNsYXNzKFwiaGlnaGNoYXJ0cy1zZXJpZXMtXCIrZC5zdGF0ZSksYSYmYy5hZGRDbGFzcyhcImhpZ2hjaGFydHMtc2VyaWVzLVwiK2EpKX0pLGQuc3RhdGU9YSwhZC5jaGFydC5zdHlsZWRNb2RlKSl7aWYoZ1thXSYmITE9PT1nW2FdLmVuYWJsZWQpcmV0dXJuO2EmJihmPWdbYV0ubGluZVdpZHRofHxmKyhnW2FdLmxpbmVXaWR0aFBsdXN8fDApLGs9dChnW2FdLm9wYWNpdHksaykpO2lmKGUmJiFlLmRhc2hzdHlsZSlmb3IoZz17XCJzdHJva2Utd2lkdGhcIjpmfSxlLmFuaW1hdGUoZyxtKTtkW1wiem9uZS1ncmFwaC1cIitcbmJdOylkW1wiem9uZS1ncmFwaC1cIitiXS5hbmltYXRlKGcsbSksYis9MTtofHxbZC5ncm91cCxkLm1hcmtlckdyb3VwLGQuZGF0YUxhYmVsc0dyb3VwLGQubGFiZWxCeVNlcmllc10uZm9yRWFjaChmdW5jdGlvbihhKXthJiZhLmFuaW1hdGUoe29wYWNpdHk6a30sbSl9KX1jJiZoJiZkLnBvaW50cyYmZC5zZXRBbGxQb2ludHNUb1N0YXRlKGF8fHZvaWQgMCl9O2IucHJvdG90eXBlLnNldEFsbFBvaW50c1RvU3RhdGU9ZnVuY3Rpb24oYSl7dGhpcy5wb2ludHMuZm9yRWFjaChmdW5jdGlvbihjKXtjLnNldFN0YXRlJiZjLnNldFN0YXRlKGEpfSl9O2IucHJvdG90eXBlLnNldFZpc2libGU9ZnVuY3Rpb24oYSxjKXt2YXIgZD10aGlzLGI9ZC5jaGFydCxlPWQubGVnZW5kSXRlbSxoPWIub3B0aW9ucy5jaGFydC5pZ25vcmVIaWRkZW5TZXJpZXMsZz1kLnZpc2libGU7dmFyIGY9KGQudmlzaWJsZT1hPWQub3B0aW9ucy52aXNpYmxlPWQudXNlck9wdGlvbnMudmlzaWJsZT1cInVuZGVmaW5lZFwiPT09XG50eXBlb2YgYT8hZzphKT9cInNob3dcIjpcImhpZGVcIjtbXCJncm91cFwiLFwiZGF0YUxhYmVsc0dyb3VwXCIsXCJtYXJrZXJHcm91cFwiLFwidHJhY2tlclwiLFwidHRcIl0uZm9yRWFjaChmdW5jdGlvbihhKXtpZihkW2FdKWRbYV1bZl0oKX0pO2lmKGIuaG92ZXJTZXJpZXM9PT1kfHwoYi5ob3ZlclBvaW50JiZiLmhvdmVyUG9pbnQuc2VyaWVzKT09PWQpZC5vbk1vdXNlT3V0KCk7ZSYmYi5sZWdlbmQuY29sb3JpemVJdGVtKGQsYSk7ZC5pc0RpcnR5PSEwO2Qub3B0aW9ucy5zdGFja2luZyYmYi5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihhKXthLm9wdGlvbnMuc3RhY2tpbmcmJmEudmlzaWJsZSYmKGEuaXNEaXJ0eT0hMCl9KTtkLmxpbmtlZFNlcmllcy5mb3JFYWNoKGZ1bmN0aW9uKGMpe2Muc2V0VmlzaWJsZShhLCExKX0pO2gmJihiLmlzRGlydHlCb3g9ITApO0EoZCxmKTshMSE9PWMmJmIucmVkcmF3KCl9O2IucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXt0aGlzLnNldFZpc2libGUoITApfTtiLnByb3RvdHlwZS5oaWRlPVxuZnVuY3Rpb24oKXt0aGlzLnNldFZpc2libGUoITEpfTtiLnByb3RvdHlwZS5zZWxlY3Q9ZnVuY3Rpb24oYSl7dGhpcy5zZWxlY3RlZD1hPXRoaXMub3B0aW9ucy5zZWxlY3RlZD1cInVuZGVmaW5lZFwiPT09dHlwZW9mIGE/IXRoaXMuc2VsZWN0ZWQ6YTt0aGlzLmNoZWNrYm94JiYodGhpcy5jaGVja2JveC5jaGVja2VkPWEpO0EodGhpcyxhP1wic2VsZWN0XCI6XCJ1bnNlbGVjdFwiKX07Yi5wcm90b3R5cGUuc2hvdWxkU2hvd1Rvb2x0aXA9ZnVuY3Rpb24oYSxjLGQpe3ZvaWQgMD09PWQmJihkPXt9KTtkLnNlcmllcz10aGlzO2QudmlzaWJsZVBsb3RPbmx5PSEwO3JldHVybiB0aGlzLmNoYXJ0LmlzSW5zaWRlUGxvdChhLGMsZCl9O2IuZGVmYXVsdE9wdGlvbnM9e2xpbmVXaWR0aDoyLGFsbG93UG9pbnRTZWxlY3Q6ITEsY3Jpc3A6ITAsc2hvd0NoZWNrYm94OiExLGFuaW1hdGlvbjp7ZHVyYXRpb246MUUzfSxldmVudHM6e30sbWFya2VyOntlbmFibGVkVGhyZXNob2xkOjIsbGluZUNvbG9yOkguYmFja2dyb3VuZENvbG9yLFxubGluZVdpZHRoOjAscmFkaXVzOjQsc3RhdGVzOntub3JtYWw6e2FuaW1hdGlvbjohMH0saG92ZXI6e2FuaW1hdGlvbjp7ZHVyYXRpb246NTB9LGVuYWJsZWQ6ITAscmFkaXVzUGx1czoyLGxpbmVXaWR0aFBsdXM6MX0sc2VsZWN0OntmaWxsQ29sb3I6SC5uZXV0cmFsQ29sb3IyMCxsaW5lQ29sb3I6SC5uZXV0cmFsQ29sb3IxMDAsbGluZVdpZHRoOjJ9fX0scG9pbnQ6e2V2ZW50czp7fX0sZGF0YUxhYmVsczp7YW5pbWF0aW9uOnt9LGFsaWduOlwiY2VudGVyXCIsZGVmZXI6ITAsZm9ybWF0dGVyOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5zZXJpZXMuY2hhcnQubnVtYmVyRm9ybWF0dGVyO3JldHVyblwibnVtYmVyXCIhPT10eXBlb2YgdGhpcy55P1wiXCI6YSh0aGlzLnksLTEpfSxwYWRkaW5nOjUsc3R5bGU6e2ZvbnRTaXplOlwiMTFweFwiLGZvbnRXZWlnaHQ6XCJib2xkXCIsY29sb3I6XCJjb250cmFzdFwiLHRleHRPdXRsaW5lOlwiMXB4IGNvbnRyYXN0XCJ9LHZlcnRpY2FsQWxpZ246XCJib3R0b21cIix4OjAseTowfSxcbmNyb3BUaHJlc2hvbGQ6MzAwLG9wYWNpdHk6MSxwb2ludFJhbmdlOjAsc29mdFRocmVzaG9sZDohMCxzdGF0ZXM6e25vcm1hbDp7YW5pbWF0aW9uOiEwfSxob3Zlcjp7YW5pbWF0aW9uOntkdXJhdGlvbjo1MH0sbGluZVdpZHRoUGx1czoxLG1hcmtlcjp7fSxoYWxvOntzaXplOjEwLG9wYWNpdHk6LjI1fX0sc2VsZWN0OnthbmltYXRpb246e2R1cmF0aW9uOjB9fSxpbmFjdGl2ZTp7YW5pbWF0aW9uOntkdXJhdGlvbjo1MH0sb3BhY2l0eTouMn19LHN0aWNreVRyYWNraW5nOiEwLHR1cmJvVGhyZXNob2xkOjFFMyxmaW5kTmVhcmVzdFBvaW50Qnk6XCJ4XCJ9O3JldHVybiBifSgpO2goZS5wcm90b3R5cGUse2F4aXNUeXBlczpbXCJ4QXhpc1wiLFwieUF4aXNcIl0sY29sbDpcInNlcmllc1wiLGNvbG9yQ291bnRlcjowLGNyb3BTaG91bGRlcjoxLGRpcmVjdFRvdWNoOiExLGRyYXdMZWdlbmRTeW1ib2w6SS5kcmF3TGluZU1hcmtlcixpc0NhcnRlc2lhbjohMCxrZEF4aXNBcnJheTpbXCJjbGllbnRYXCIsXCJwbG90WVwiXSxcbnBhcmFsbGVsQXJyYXlzOltcInhcIixcInlcIl0scG9pbnRDbGFzczpHLHJlcXVpcmVTb3J0aW5nOiEwLHNvcnRlZDohMH0pO0Muc2VyaWVzPWU7XCJcIjtcIlwiO3JldHVybiBlfSk7TyhlLFwiRXh0ZW5zaW9ucy9TY3JvbGxhYmxlUGxvdEFyZWEuanNcIixbZVtcIkNvcmUvQW5pbWF0aW9uL0FuaW1hdGlvblV0aWxpdGllcy5qc1wiXSxlW1wiQ29yZS9BeGlzL0F4aXMuanNcIl0sZVtcIkNvcmUvQ2hhcnQvQ2hhcnQuanNcIl0sZVtcIkNvcmUvU2VyaWVzL1Nlcmllcy5qc1wiXSxlW1wiQ29yZS9HbG9iYWxzLmpzXCJdLGVbXCJDb3JlL1V0aWxpdGllcy5qc1wiXV0sZnVuY3Rpb24oZSxiLEkseixILEcpe3ZhciBEPWUuc3RvcCxCPUcuYWRkRXZlbnQseD1HLmNyZWF0ZUVsZW1lbnQsdz1HLm1lcmdlLHY9Ry5waWNrO1wiXCI7QihJLFwiYWZ0ZXJTZXRDaGFydFNpemVcIixmdW5jdGlvbihiKXt2YXIgZD10aGlzLm9wdGlvbnMuY2hhcnQuc2Nyb2xsYWJsZVBsb3RBcmVhLGU9ZCYmZC5taW5XaWR0aDtkPWQmJmQubWluSGVpZ2h0O2lmKCF0aGlzLnJlbmRlcmVyLmZvckV4cG9ydCl7aWYoZSl7aWYodGhpcy5zY3JvbGxhYmxlUGl4ZWxzWD1cbmU9TWF0aC5tYXgoMCxlLXRoaXMuY2hhcnRXaWR0aCkpe3RoaXMuc2Nyb2xsYWJsZVBsb3RCb3g9dGhpcy5yZW5kZXJlci5zY3JvbGxhYmxlUGxvdEJveD13KHRoaXMucGxvdEJveCk7dGhpcy5wbG90Qm94LndpZHRoPXRoaXMucGxvdFdpZHRoKz1lO3RoaXMuaW52ZXJ0ZWQ/dGhpcy5jbGlwQm94LmhlaWdodCs9ZTp0aGlzLmNsaXBCb3gud2lkdGgrPWU7dmFyIGY9ezE6e25hbWU6XCJyaWdodFwiLHZhbHVlOmV9fX19ZWxzZSBkJiYodGhpcy5zY3JvbGxhYmxlUGl4ZWxzWT1lPU1hdGgubWF4KDAsZC10aGlzLmNoYXJ0SGVpZ2h0KSkmJih0aGlzLnNjcm9sbGFibGVQbG90Qm94PXRoaXMucmVuZGVyZXIuc2Nyb2xsYWJsZVBsb3RCb3g9dyh0aGlzLnBsb3RCb3gpLHRoaXMucGxvdEJveC5oZWlnaHQ9dGhpcy5wbG90SGVpZ2h0Kz1lLHRoaXMuaW52ZXJ0ZWQ/dGhpcy5jbGlwQm94LndpZHRoKz1lOnRoaXMuY2xpcEJveC5oZWlnaHQrPWUsZj17Mjp7bmFtZTpcImJvdHRvbVwiLHZhbHVlOmV9fSk7XG5mJiYhYi5za2lwQXhlcyYmdGhpcy5heGVzLmZvckVhY2goZnVuY3Rpb24oZCl7ZltkLnNpZGVdP2QuZ2V0UGxvdExpbmVQYXRoPWZ1bmN0aW9uKCl7dmFyIGI9ZltkLnNpZGVdLm5hbWUsZT10aGlzW2JdO3RoaXNbYl09ZS1mW2Quc2lkZV0udmFsdWU7dmFyIGs9SC5BeGlzLnByb3RvdHlwZS5nZXRQbG90TGluZVBhdGguYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXNbYl09ZTtyZXR1cm4ga306KGQuc2V0QXhpc1NpemUoKSxkLnNldEF4aXNUcmFuc2xhdGlvbigpKX0pfX0pO0IoSSxcInJlbmRlclwiLGZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxhYmxlUGl4ZWxzWHx8dGhpcy5zY3JvbGxhYmxlUGl4ZWxzWT8odGhpcy5zZXRVcFNjcm9sbGluZyYmdGhpcy5zZXRVcFNjcm9sbGluZygpLHRoaXMuYXBwbHlGaXhlZCgpKTp0aGlzLmZpeGVkRGl2JiZ0aGlzLmFwcGx5Rml4ZWQoKX0pO0kucHJvdG90eXBlLnNldFVwU2Nyb2xsaW5nPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxkPXtXZWJraXRPdmVyZmxvd1Njcm9sbGluZzpcInRvdWNoXCIsXG5vdmVyZmxvd1g6XCJoaWRkZW5cIixvdmVyZmxvd1k6XCJoaWRkZW5cIn07dGhpcy5zY3JvbGxhYmxlUGl4ZWxzWCYmKGQub3ZlcmZsb3dYPVwiYXV0b1wiKTt0aGlzLnNjcm9sbGFibGVQaXhlbHNZJiYoZC5vdmVyZmxvd1k9XCJhdXRvXCIpO3RoaXMuc2Nyb2xsaW5nUGFyZW50PXgoXCJkaXZcIix7Y2xhc3NOYW1lOlwiaGlnaGNoYXJ0cy1zY3JvbGxpbmctcGFyZW50XCJ9LHtwb3NpdGlvbjpcInJlbGF0aXZlXCJ9LHRoaXMucmVuZGVyVG8pO3RoaXMuc2Nyb2xsaW5nQ29udGFpbmVyPXgoXCJkaXZcIix7Y2xhc3NOYW1lOlwiaGlnaGNoYXJ0cy1zY3JvbGxpbmdcIn0sZCx0aGlzLnNjcm9sbGluZ1BhcmVudCk7Qih0aGlzLnNjcm9sbGluZ0NvbnRhaW5lcixcInNjcm9sbFwiLGZ1bmN0aW9uKCl7Yi5wb2ludGVyJiZkZWxldGUgYi5wb2ludGVyLmNoYXJ0UG9zaXRpb259KTt0aGlzLmlubmVyQ29udGFpbmVyPXgoXCJkaXZcIix7Y2xhc3NOYW1lOlwiaGlnaGNoYXJ0cy1pbm5lci1jb250YWluZXJcIn0sbnVsbCx0aGlzLnNjcm9sbGluZ0NvbnRhaW5lcik7XG50aGlzLmlubmVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTt0aGlzLnNldFVwU2Nyb2xsaW5nPW51bGx9O0kucHJvdG90eXBlLm1vdmVGaXhlZEVsZW1lbnRzPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jb250YWluZXIsZD10aGlzLmZpeGVkUmVuZGVyZXIsZT1cIi5oaWdoY2hhcnRzLWNvbnRleHRidXR0b24gLmhpZ2hjaGFydHMtY3JlZGl0cyAuaGlnaGNoYXJ0cy1sZWdlbmQgLmhpZ2hjaGFydHMtbGVnZW5kLWNoZWNrYm94IC5oaWdoY2hhcnRzLW5hdmlnYXRvci1zZXJpZXMgLmhpZ2hjaGFydHMtbmF2aWdhdG9yLXhheGlzIC5oaWdoY2hhcnRzLW5hdmlnYXRvci15YXhpcyAuaGlnaGNoYXJ0cy1uYXZpZ2F0b3IgLmhpZ2hjaGFydHMtcmVzZXQtem9vbSAuaGlnaGNoYXJ0cy1kcmlsbHVwLWJ1dHRvbiAuaGlnaGNoYXJ0cy1zY3JvbGxiYXIgLmhpZ2hjaGFydHMtc3VidGl0bGUgLmhpZ2hjaGFydHMtdGl0bGVcIi5zcGxpdChcIiBcIiksazt0aGlzLnNjcm9sbGFibGVQaXhlbHNYJiZcbiF0aGlzLmludmVydGVkP2s9XCIuaGlnaGNoYXJ0cy15YXhpc1wiOnRoaXMuc2Nyb2xsYWJsZVBpeGVsc1gmJnRoaXMuaW52ZXJ0ZWQ/az1cIi5oaWdoY2hhcnRzLXhheGlzXCI6dGhpcy5zY3JvbGxhYmxlUGl4ZWxzWSYmIXRoaXMuaW52ZXJ0ZWQ/az1cIi5oaWdoY2hhcnRzLXhheGlzXCI6dGhpcy5zY3JvbGxhYmxlUGl4ZWxzWSYmdGhpcy5pbnZlcnRlZCYmKGs9XCIuaGlnaGNoYXJ0cy15YXhpc1wiKTtrJiZlLnB1c2goaytcIjpub3QoLmhpZ2hjaGFydHMtcmFkaWFsLWF4aXMpXCIsaytcIi1sYWJlbHM6bm90KC5oaWdoY2hhcnRzLXJhZGlhbC1heGlzLWxhYmVscylcIik7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1tdLmZvckVhY2guY2FsbChiLnF1ZXJ5U2VsZWN0b3JBbGwoZSksZnVuY3Rpb24oYil7KGIubmFtZXNwYWNlVVJJPT09ZC5TVkdfTlM/ZC5ib3g6ZC5ib3gucGFyZW50Tm9kZSkuYXBwZW5kQ2hpbGQoYik7Yi5zdHlsZS5wb2ludGVyRXZlbnRzPVwiYXV0b1wifSl9KX07SS5wcm90b3R5cGUuYXBwbHlGaXhlZD1cbmZ1bmN0aW9uKCl7dmFyIGI9IXRoaXMuZml4ZWREaXY7dmFyIGQ9dGhpcy5vcHRpb25zLmNoYXJ0O3ZhciBlPWQuc2Nyb2xsYWJsZVBsb3RBcmVhO2I/KHRoaXMuZml4ZWREaXY9eChcImRpdlwiLHtjbGFzc05hbWU6XCJoaWdoY2hhcnRzLWZpeGVkXCJ9LHtwb3NpdGlvbjpcImFic29sdXRlXCIsb3ZlcmZsb3c6XCJoaWRkZW5cIixwb2ludGVyRXZlbnRzOlwibm9uZVwiLHpJbmRleDooZC5zdHlsZSYmZC5zdHlsZS56SW5kZXh8fDApKzIsdG9wOjB9LG51bGwsITApLHRoaXMuc2Nyb2xsaW5nQ29udGFpbmVyJiZ0aGlzLnNjcm9sbGluZ0NvbnRhaW5lci5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmZpeGVkRGl2LHRoaXMuc2Nyb2xsaW5nQ29udGFpbmVyKSx0aGlzLnJlbmRlclRvLnN0eWxlLm92ZXJmbG93PVwidmlzaWJsZVwiLHRoaXMuZml4ZWRSZW5kZXJlcj1kPW5ldyBILlJlbmRlcmVyKHRoaXMuZml4ZWREaXYsdGhpcy5jaGFydFdpZHRoLHRoaXMuY2hhcnRIZWlnaHQsdGhpcy5vcHRpb25zLmNoYXJ0LnN0eWxlKSxcbnRoaXMuc2Nyb2xsYWJsZU1hc2s9ZC5wYXRoKCkuYXR0cih7ZmlsbDp0aGlzLm9wdGlvbnMuY2hhcnQuYmFja2dyb3VuZENvbG9yfHxcIiNmZmZcIixcImZpbGwtb3BhY2l0eVwiOnYoZS5vcGFjaXR5LC44NSksekluZGV4Oi0xfSkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLXNjcm9sbGFibGUtbWFza1wiKS5hZGQoKSxCKHRoaXMsXCJhZnRlclNob3dSZXNldFpvb21cIix0aGlzLm1vdmVGaXhlZEVsZW1lbnRzKSxCKHRoaXMsXCJhZnRlckRyaWxsZG93blwiLHRoaXMubW92ZUZpeGVkRWxlbWVudHMpLEIodGhpcyxcImFmdGVyTGF5T3V0VGl0bGVzXCIsdGhpcy5tb3ZlRml4ZWRFbGVtZW50cykpOnRoaXMuZml4ZWRSZW5kZXJlci5zZXRTaXplKHRoaXMuY2hhcnRXaWR0aCx0aGlzLmNoYXJ0SGVpZ2h0KTtpZih0aGlzLnNjcm9sbGFibGVEaXJ0eXx8Yil0aGlzLnNjcm9sbGFibGVEaXJ0eT0hMSx0aGlzLm1vdmVGaXhlZEVsZW1lbnRzKCk7ZD10aGlzLmNoYXJ0V2lkdGgrKHRoaXMuc2Nyb2xsYWJsZVBpeGVsc1h8fFxuMCk7dmFyIGs9dGhpcy5jaGFydEhlaWdodCsodGhpcy5zY3JvbGxhYmxlUGl4ZWxzWXx8MCk7RCh0aGlzLmNvbnRhaW5lcik7dGhpcy5jb250YWluZXIuc3R5bGUud2lkdGg9ZCtcInB4XCI7dGhpcy5jb250YWluZXIuc3R5bGUuaGVpZ2h0PWsrXCJweFwiO3RoaXMucmVuZGVyZXIuYm94V3JhcHBlci5hdHRyKHt3aWR0aDpkLGhlaWdodDprLHZpZXdCb3g6WzAsMCxkLGtdLmpvaW4oXCIgXCIpfSk7dGhpcy5jaGFydEJhY2tncm91bmQuYXR0cih7d2lkdGg6ZCxoZWlnaHQ6a30pO3RoaXMuc2Nyb2xsaW5nQ29udGFpbmVyLnN0eWxlLmhlaWdodD10aGlzLmNoYXJ0SGVpZ2h0K1wicHhcIjtiJiYoZS5zY3JvbGxQb3NpdGlvblgmJih0aGlzLnNjcm9sbGluZ0NvbnRhaW5lci5zY3JvbGxMZWZ0PXRoaXMuc2Nyb2xsYWJsZVBpeGVsc1gqZS5zY3JvbGxQb3NpdGlvblgpLGUuc2Nyb2xsUG9zaXRpb25ZJiYodGhpcy5zY3JvbGxpbmdDb250YWluZXIuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsYWJsZVBpeGVsc1kqXG5lLnNjcm9sbFBvc2l0aW9uWSkpO2s9dGhpcy5heGlzT2Zmc2V0O2I9dGhpcy5wbG90VG9wLWtbMF0tMTtlPXRoaXMucGxvdExlZnQta1szXS0xO2Q9dGhpcy5wbG90VG9wK3RoaXMucGxvdEhlaWdodCtrWzJdKzE7az10aGlzLnBsb3RMZWZ0K3RoaXMucGxvdFdpZHRoK2tbMV0rMTt2YXIgbD10aGlzLnBsb3RMZWZ0K3RoaXMucGxvdFdpZHRoLSh0aGlzLnNjcm9sbGFibGVQaXhlbHNYfHwwKSx3PXRoaXMucGxvdFRvcCt0aGlzLnBsb3RIZWlnaHQtKHRoaXMuc2Nyb2xsYWJsZVBpeGVsc1l8fDApO2I9dGhpcy5zY3JvbGxhYmxlUGl4ZWxzWD9bW1wiTVwiLDAsYl0sW1wiTFwiLHRoaXMucGxvdExlZnQtMSxiXSxbXCJMXCIsdGhpcy5wbG90TGVmdC0xLGRdLFtcIkxcIiwwLGRdLFtcIlpcIl0sW1wiTVwiLGwsYl0sW1wiTFwiLHRoaXMuY2hhcnRXaWR0aCxiXSxbXCJMXCIsdGhpcy5jaGFydFdpZHRoLGRdLFtcIkxcIixsLGRdLFtcIlpcIl1dOnRoaXMuc2Nyb2xsYWJsZVBpeGVsc1k/W1tcIk1cIixlLDBdLFtcIkxcIixlLHRoaXMucGxvdFRvcC1cbjFdLFtcIkxcIixrLHRoaXMucGxvdFRvcC0xXSxbXCJMXCIsaywwXSxbXCJaXCJdLFtcIk1cIixlLHddLFtcIkxcIixlLHRoaXMuY2hhcnRIZWlnaHRdLFtcIkxcIixrLHRoaXMuY2hhcnRIZWlnaHRdLFtcIkxcIixrLHddLFtcIlpcIl1dOltbXCJNXCIsMCwwXV07XCJhZGp1c3RIZWlnaHRcIiE9PXRoaXMucmVkcmF3VHJpZ2dlciYmdGhpcy5zY3JvbGxhYmxlTWFzay5hdHRyKHtkOmJ9KX07QihiLFwiYWZ0ZXJJbml0XCIsZnVuY3Rpb24oKXt0aGlzLmNoYXJ0LnNjcm9sbGFibGVEaXJ0eT0hMH0pO0IoeixcInNob3dcIixmdW5jdGlvbigpe3RoaXMuY2hhcnQuc2Nyb2xsYWJsZURpcnR5PSEwfSl9KTtPKGUsXCJDb3JlL0F4aXMvU3RhY2tpbmdBeGlzLmpzXCIsW2VbXCJDb3JlL0FuaW1hdGlvbi9BbmltYXRpb25VdGlsaXRpZXMuanNcIl0sZVtcIkNvcmUvVXRpbGl0aWVzLmpzXCJdXSxmdW5jdGlvbihlLGIpe3ZhciBEPWUuZ2V0RGVmZXJyZWRBbmltYXRpb24sej1iLmFkZEV2ZW50LEg9Yi5kZXN0cm95T2JqZWN0UHJvcGVydGllcyxHPVxuYi5maXJlRXZlbnQsQz1iLmlzTnVtYmVyLEI9Yi5vYmplY3RFYWNoLHg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3RoaXMub2xkU3RhY2tzPXt9O3RoaXMuc3RhY2tzPXt9O3RoaXMuc3RhY2tzVG91Y2hlZD0wO3RoaXMuYXhpcz1ifWIucHJvdG90eXBlLmJ1aWxkU3RhY2tzPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5heGlzLGU9Yi5zZXJpZXMsZD1iLm9wdGlvbnMucmV2ZXJzZWRTdGFja3MscT1lLmxlbmd0aCxrO2lmKCFiLmlzWEF4aXMpe3RoaXMudXNlUGVyY2VudGFnZT0hMTtmb3Ioaz1xO2stLTspe3ZhciBsPWVbZD9rOnEtay0xXTtsLnNldFN0YWNrZWRQb2ludHMoKTtsLnNldEdyb3VwZWRQb2ludHMoKX1mb3Ioaz0wO2s8cTtrKyspZVtrXS5tb2RpZnlTdGFja3MoKTtHKGIsXCJhZnRlckJ1aWxkU3RhY2tzXCIpfX07Yi5wcm90b3R5cGUuY2xlYW5TdGFja3M9ZnVuY3Rpb24oKXtpZighdGhpcy5heGlzLmlzWEF4aXMpe2lmKHRoaXMub2xkU3RhY2tzKXZhciBiPXRoaXMuc3RhY2tzPVxudGhpcy5vbGRTdGFja3M7QihiLGZ1bmN0aW9uKGIpe0IoYixmdW5jdGlvbihkKXtkLmN1bXVsYXRpdmU9ZC50b3RhbH0pfSl9fTtiLnByb3RvdHlwZS5yZXNldFN0YWNrcz1mdW5jdGlvbigpe3ZhciBiPXRoaXMsZT10aGlzLnN0YWNrczt0aGlzLmF4aXMuaXNYQXhpc3x8QihlLGZ1bmN0aW9uKGQpe0IoZCxmdW5jdGlvbihlLGYpe0MoZS50b3VjaGVkKSYmZS50b3VjaGVkPGIuc3RhY2tzVG91Y2hlZD8oZS5kZXN0cm95KCksZGVsZXRlIGRbZl0pOihlLnRvdGFsPW51bGwsZS5jdW11bGF0aXZlPW51bGwpfSl9KX07Yi5wcm90b3R5cGUucmVuZGVyU3RhY2tUb3RhbHM9ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmF4aXMsZT1iLmNoYXJ0LGQ9ZS5yZW5kZXJlcixxPXRoaXMuc3RhY2tzO2I9RChlLGIub3B0aW9ucy5zdGFja0xhYmVscyYmYi5vcHRpb25zLnN0YWNrTGFiZWxzLmFuaW1hdGlvbnx8ITEpO3ZhciBrPXRoaXMuc3RhY2tUb3RhbEdyb3VwPXRoaXMuc3RhY2tUb3RhbEdyb3VwfHxkLmcoXCJzdGFjay1sYWJlbHNcIikuYXR0cih7dmlzaWJpbGl0eTpcInZpc2libGVcIixcbnpJbmRleDo2LG9wYWNpdHk6MH0pLmFkZCgpO2sudHJhbnNsYXRlKGUucGxvdExlZnQsZS5wbG90VG9wKTtCKHEsZnVuY3Rpb24oZCl7QihkLGZ1bmN0aW9uKGQpe2QucmVuZGVyKGspfSl9KTtrLmFuaW1hdGUoe29wYWNpdHk6MX0sYil9O3JldHVybiBifSgpO3JldHVybiBmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt9Yi5jb21wb3NlPWZ1bmN0aW9uKGUpe3ooZSxcImluaXRcIixiLm9uSW5pdCk7eihlLFwiZGVzdHJveVwiLGIub25EZXN0cm95KX07Yi5vbkRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnN0YWNraW5nO2lmKGIpe3ZhciBlPWIuc3RhY2tzO0IoZSxmdW5jdGlvbihkLGIpe0goZCk7ZVtiXT1udWxsfSk7YiYmYi5zdGFja1RvdGFsR3JvdXAmJmIuc3RhY2tUb3RhbEdyb3VwLmRlc3Ryb3koKX19O2Iub25Jbml0PWZ1bmN0aW9uKCl7dGhpcy5zdGFja2luZ3x8KHRoaXMuc3RhY2tpbmc9bmV3IHgodGhpcykpfTtyZXR1cm4gYn0oKX0pO08oZSxcIkV4dGVuc2lvbnMvU3RhY2tpbmcuanNcIixcbltlW1wiQ29yZS9BeGlzL0F4aXMuanNcIl0sZVtcIkNvcmUvQ2hhcnQvQ2hhcnQuanNcIl0sZVtcIkNvcmUvRm9ybWF0VXRpbGl0aWVzLmpzXCJdLGVbXCJDb3JlL0dsb2JhbHMuanNcIl0sZVtcIkNvcmUvU2VyaWVzL1Nlcmllcy5qc1wiXSxlW1wiQ29yZS9BeGlzL1N0YWNraW5nQXhpcy5qc1wiXSxlW1wiQ29yZS9VdGlsaXRpZXMuanNcIl1dLGZ1bmN0aW9uKGUsYixJLHosSCxHLEMpe3ZhciBEPUkuZm9ybWF0LHg9Qy5jb3JyZWN0RmxvYXQsdz1DLmRlZmluZWQsdj1DLmRlc3Ryb3lPYmplY3RQcm9wZXJ0aWVzLGY9Qy5pc0FycmF5LGQ9Qy5pc051bWJlcixxPUMub2JqZWN0RWFjaCxrPUMucGljaztcIlwiO3ZhciBsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihkLGIsZSxmLGspe3ZhciBjPWQuY2hhcnQuaW52ZXJ0ZWQ7dGhpcy5heGlzPWQ7dGhpcy5pc05lZ2F0aXZlPWU7dGhpcy5vcHRpb25zPWI9Ynx8e307dGhpcy54PWY7dGhpcy50b3RhbD1udWxsO3RoaXMucG9pbnRzPXt9O3RoaXMuaGFzVmFsaWRQb2ludHM9XG4hMTt0aGlzLnN0YWNrPWs7dGhpcy5yaWdodENsaWZmPXRoaXMubGVmdENsaWZmPTA7dGhpcy5hbGlnbk9wdGlvbnM9e2FsaWduOmIuYWxpZ258fChjP2U/XCJsZWZ0XCI6XCJyaWdodFwiOlwiY2VudGVyXCIpLHZlcnRpY2FsQWxpZ246Yi52ZXJ0aWNhbEFsaWdufHwoYz9cIm1pZGRsZVwiOmU/XCJib3R0b21cIjpcInRvcFwiKSx5OmIueSx4OmIueH07dGhpcy50ZXh0QWxpZ249Yi50ZXh0QWxpZ258fChjP2U/XCJyaWdodFwiOlwibGVmdFwiOlwiY2VudGVyXCIpfWIucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2KHRoaXMsdGhpcy5heGlzKX07Yi5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKGQpe3ZhciBiPXRoaXMuYXhpcy5jaGFydCxlPXRoaXMub3B0aW9ucyxmPWUuZm9ybWF0O2Y9Zj9EKGYsdGhpcyxiKTplLmZvcm1hdHRlci5jYWxsKHRoaXMpO3RoaXMubGFiZWw/dGhpcy5sYWJlbC5hdHRyKHt0ZXh0OmYsdmlzaWJpbGl0eTpcImhpZGRlblwifSk6KHRoaXMubGFiZWw9Yi5yZW5kZXJlci5sYWJlbChmLFxubnVsbCxudWxsLGUuc2hhcGUsbnVsbCxudWxsLGUudXNlSFRNTCwhMSxcInN0YWNrLWxhYmVsc1wiKSxmPXtyOmUuYm9yZGVyUmFkaXVzfHwwLHRleHQ6Zixyb3RhdGlvbjplLnJvdGF0aW9uLHBhZGRpbmc6ayhlLnBhZGRpbmcsNSksdmlzaWJpbGl0eTpcImhpZGRlblwifSxiLnN0eWxlZE1vZGV8fChmLmZpbGw9ZS5iYWNrZ3JvdW5kQ29sb3IsZi5zdHJva2U9ZS5ib3JkZXJDb2xvcixmW1wic3Ryb2tlLXdpZHRoXCJdPWUuYm9yZGVyV2lkdGgsdGhpcy5sYWJlbC5jc3MoZS5zdHlsZSkpLHRoaXMubGFiZWwuYXR0cihmKSx0aGlzLmxhYmVsLmFkZGVkfHx0aGlzLmxhYmVsLmFkZChkKSk7dGhpcy5sYWJlbC5sYWJlbHJhbms9Yi5wbG90U2l6ZVl9O2IucHJvdG90eXBlLnNldE9mZnNldD1mdW5jdGlvbihiLGUsZixsLG0pe3ZhciBjPXRoaXMuYXhpcyxnPWMuY2hhcnQ7bD1jLnRyYW5zbGF0ZShjLnN0YWNraW5nLnVzZVBlcmNlbnRhZ2U/MTAwOmw/bDp0aGlzLnRvdGFsLDAsMCwwLDEpO2Y9Yy50cmFuc2xhdGUoZj9cbmY6MCk7Zj13KGwpJiZNYXRoLmFicyhsLWYpO2I9ayhtLGcueEF4aXNbMF0udHJhbnNsYXRlKHRoaXMueCkpK2I7Yz13KGwpJiZ0aGlzLmdldFN0YWNrQm94KGcsdGhpcyxiLGwsZSxmLGMpO2U9dGhpcy5sYWJlbDtmPXRoaXMuaXNOZWdhdGl2ZTtiPVwianVzdGlmeVwiPT09ayh0aGlzLm9wdGlvbnMub3ZlcmZsb3csXCJqdXN0aWZ5XCIpO3ZhciBhPXRoaXMudGV4dEFsaWduO2UmJmMmJihtPWUuZ2V0QkJveCgpLGw9ZS5wYWRkaW5nLGE9XCJsZWZ0XCI9PT1hP2cuaW52ZXJ0ZWQ/LWw6bDpcInJpZ2h0XCI9PT1hP20ud2lkdGg6Zy5pbnZlcnRlZCYmXCJjZW50ZXJcIj09PWE/bS53aWR0aC8yOmcuaW52ZXJ0ZWQ/Zj9tLndpZHRoK2w6LWw6bS53aWR0aC8yLGY9Zy5pbnZlcnRlZD9tLmhlaWdodC8yOmY/LWw6bS5oZWlnaHQsdGhpcy5hbGlnbk9wdGlvbnMueD1rKHRoaXMub3B0aW9ucy54LDApLHRoaXMuYWxpZ25PcHRpb25zLnk9ayh0aGlzLm9wdGlvbnMueSwwKSxjLngtPWEsYy55LT1mLGUuYWxpZ24odGhpcy5hbGlnbk9wdGlvbnMsXG5udWxsLGMpLGcuaXNJbnNpZGVQbG90KGUuYWxpZ25BdHRyLngrYS10aGlzLmFsaWduT3B0aW9ucy54LGUuYWxpZ25BdHRyLnkrZi10aGlzLmFsaWduT3B0aW9ucy55KT9lLnNob3coKTooZS5hbGlnbkF0dHIueT0tOTk5OSxiPSExKSxiJiZILnByb3RvdHlwZS5qdXN0aWZ5RGF0YUxhYmVsLmNhbGwodGhpcy5heGlzLGUsdGhpcy5hbGlnbk9wdGlvbnMsZS5hbGlnbkF0dHIsbSxjKSxlLmF0dHIoe3g6ZS5hbGlnbkF0dHIueCx5OmUuYWxpZ25BdHRyLnl9KSxrKCFiJiZ0aGlzLm9wdGlvbnMuY3JvcCwhMCkmJigoZz1kKGUueCkmJmQoZS55KSYmZy5pc0luc2lkZVBsb3QoZS54LWwrZS53aWR0aCxlLnkpJiZnLmlzSW5zaWRlUGxvdChlLngrbCxlLnkpKXx8ZS5oaWRlKCkpKX07Yi5wcm90b3R5cGUuZ2V0U3RhY2tCb3g9ZnVuY3Rpb24oZCxiLGUsZixrLGMsZyl7dmFyIGE9Yi5heGlzLnJldmVyc2VkLGg9ZC5pbnZlcnRlZCxtPWcuaGVpZ2h0K2cucG9zLShoP2QucGxvdExlZnQ6ZC5wbG90VG9wKTtcbmI9Yi5pc05lZ2F0aXZlJiYhYXx8IWIuaXNOZWdhdGl2ZSYmYTtyZXR1cm57eDpoP2I/Zi1nLnJpZ2h0OmYtYytnLnBvcy1kLnBsb3RMZWZ0OmUrZC54QXhpc1swXS50cmFuc0ItZC5wbG90TGVmdCx5Omg/Zy5oZWlnaHQtZS1rOmI/bS1mLWM6bS1mLHdpZHRoOmg/YzprLGhlaWdodDpoP2s6Y319O3JldHVybiBifSgpO2IucHJvdG90eXBlLmdldFN0YWNrcz1mdW5jdGlvbigpe3ZhciBkPXRoaXMsYj1kLmludmVydGVkO2QueUF4aXMuZm9yRWFjaChmdW5jdGlvbihkKXtkLnN0YWNraW5nJiZkLnN0YWNraW5nLnN0YWNrcyYmZC5oYXNWaXNpYmxlU2VyaWVzJiYoZC5zdGFja2luZy5vbGRTdGFja3M9ZC5zdGFja2luZy5zdGFja3MpfSk7ZC5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgZj1lLnhBeGlzJiZlLnhBeGlzLm9wdGlvbnN8fHt9OyFlLm9wdGlvbnMuc3RhY2tpbmd8fCEwIT09ZS52aXNpYmxlJiYhMSE9PWQub3B0aW9ucy5jaGFydC5pZ25vcmVIaWRkZW5TZXJpZXN8fFxuKGUuc3RhY2tLZXk9W2UudHlwZSxrKGUub3B0aW9ucy5zdGFjayxcIlwiKSxiP2YudG9wOmYubGVmdCxiP2YuaGVpZ2h0OmYud2lkdGhdLmpvaW4oKSl9KX07Ry5jb21wb3NlKGUpO0gucHJvdG90eXBlLnNldEdyb3VwZWRQb2ludHM9ZnVuY3Rpb24oKXt2YXIgZD10aGlzLnlBeGlzLnN0YWNraW5nO3RoaXMub3B0aW9ucy5jZW50ZXJJbkNhdGVnb3J5JiYodGhpcy5pcyhcImNvbHVtblwiKXx8dGhpcy5pcyhcImNvbHVtbnJhbmdlXCIpKSYmIXRoaXMub3B0aW9ucy5zdGFja2luZyYmMTx0aGlzLmNoYXJ0LnNlcmllcy5sZW5ndGg/SC5wcm90b3R5cGUuc2V0U3RhY2tlZFBvaW50cy5jYWxsKHRoaXMsXCJncm91cFwiKTpkJiZxKGQuc3RhY2tzLGZ1bmN0aW9uKGIsZSl7XCJncm91cFwiPT09ZS5zbGljZSgtNSkmJihxKGIsZnVuY3Rpb24oZCl7cmV0dXJuIGQuZGVzdHJveSgpfSksZGVsZXRlIGQuc3RhY2tzW2VdKX0pfTtILnByb3RvdHlwZS5zZXRTdGFja2VkUG9pbnRzPWZ1bmN0aW9uKGQpe3ZhciBiPVxuZHx8dGhpcy5vcHRpb25zLnN0YWNraW5nO2lmKGImJighMD09PXRoaXMudmlzaWJsZXx8ITE9PT10aGlzLmNoYXJ0Lm9wdGlvbnMuY2hhcnQuaWdub3JlSGlkZGVuU2VyaWVzKSl7dmFyIGU9dGhpcy5wcm9jZXNzZWRYRGF0YSxxPXRoaXMucHJvY2Vzc2VkWURhdGEsdj1bXSxtPXEubGVuZ3RoLGM9dGhpcy5vcHRpb25zLGc9Yy50aHJlc2hvbGQsYT1rKGMuc3RhcnRGcm9tVGhyZXNob2xkJiZnLDApO2M9Yy5zdGFjaztkPWQ/dGhpcy50eXBlK1wiLFwiK2I6dGhpcy5zdGFja0tleTt2YXIgaD1cIi1cIitkLHI9dGhpcy5uZWdTdGFja3MsQT10aGlzLnlBeGlzLHk9QS5zdGFja2luZy5zdGFja3MsRD1BLnN0YWNraW5nLm9sZFN0YWNrcyxCLEM7QS5zdGFja2luZy5zdGFja3NUb3VjaGVkKz0xO2ZvcihDPTA7QzxtO0MrKyl7dmFyIHo9ZVtDXTt2YXIgUT1xW0NdO3ZhciBNPXRoaXMuZ2V0U3RhY2tJbmRpY2F0b3IoTSx6LHRoaXMuaW5kZXgpO3ZhciB0PU0ua2V5O3ZhciBwPShCPXImJlE8KGE/MDpcbmcpKT9oOmQ7eVtwXXx8KHlbcF09e30pO3lbcF1bel18fChEW3BdJiZEW3BdW3pdPyh5W3BdW3pdPURbcF1bel0seVtwXVt6XS50b3RhbD1udWxsKTp5W3BdW3pdPW5ldyBsKEEsQS5vcHRpb25zLnN0YWNrTGFiZWxzLEIseixjKSk7cD15W3BdW3pdO251bGwhPT1RPyhwLnBvaW50c1t0XT1wLnBvaW50c1t0aGlzLmluZGV4XT1bayhwLmN1bXVsYXRpdmUsYSldLHcocC5jdW11bGF0aXZlKXx8KHAuYmFzZT10KSxwLnRvdWNoZWQ9QS5zdGFja2luZy5zdGFja3NUb3VjaGVkLDA8TS5pbmRleCYmITE9PT10aGlzLnNpbmdsZVN0YWNrcyYmKHAucG9pbnRzW3RdWzBdPXAucG9pbnRzW3RoaXMuaW5kZXgrXCIsXCIreitcIiwwXCJdWzBdKSk6cC5wb2ludHNbdF09cC5wb2ludHNbdGhpcy5pbmRleF09bnVsbDtcInBlcmNlbnRcIj09PWI/KEI9Qj9kOmgsciYmeVtCXSYmeVtCXVt6XT8oQj15W0JdW3pdLHAudG90YWw9Qi50b3RhbD1NYXRoLm1heChCLnRvdGFsLHAudG90YWwpK01hdGguYWJzKFEpfHwwKTpcbnAudG90YWw9eChwLnRvdGFsKyhNYXRoLmFicyhRKXx8MCkpKTpcImdyb3VwXCI9PT1iPyhmKFEpJiYoUT1RWzBdKSxudWxsIT09USYmKHAudG90YWw9KHAudG90YWx8fDApKzEpKTpwLnRvdGFsPXgocC50b3RhbCsoUXx8MCkpO3AuY3VtdWxhdGl2ZT1cImdyb3VwXCI9PT1iPyhwLnRvdGFsfHwxKS0xOmsocC5jdW11bGF0aXZlLGEpKyhRfHwwKTtudWxsIT09USYmKHAucG9pbnRzW3RdLnB1c2gocC5jdW11bGF0aXZlKSx2W0NdPXAuY3VtdWxhdGl2ZSxwLmhhc1ZhbGlkUG9pbnRzPSEwKX1cInBlcmNlbnRcIj09PWImJihBLnN0YWNraW5nLnVzZVBlcmNlbnRhZ2U9ITApO1wiZ3JvdXBcIiE9PWImJih0aGlzLnN0YWNrZWRZRGF0YT12KTtBLnN0YWNraW5nLm9sZFN0YWNrcz17fX19O0gucHJvdG90eXBlLm1vZGlmeVN0YWNrcz1mdW5jdGlvbigpe3ZhciBkPXRoaXMsYj1kLnN0YWNrS2V5LGU9ZC55QXhpcy5zdGFja2luZy5zdGFja3MsZj1kLnByb2Nlc3NlZFhEYXRhLGssbT1kLm9wdGlvbnMuc3RhY2tpbmc7XG5kW20rXCJTdGFja2VyXCJdJiZbYixcIi1cIitiXS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2Zvcih2YXIgYj1mLmxlbmd0aCxhLGg7Yi0tOylpZihhPWZbYl0saz1kLmdldFN0YWNrSW5kaWNhdG9yKGssYSxkLmluZGV4LGMpLGg9KGE9ZVtjXSYmZVtjXVthXSkmJmEucG9pbnRzW2sua2V5XSlkW20rXCJTdGFja2VyXCJdKGgsYSxiKX0pfTtILnByb3RvdHlwZS5wZXJjZW50U3RhY2tlcj1mdW5jdGlvbihkLGIsZSl7Yj1iLnRvdGFsPzEwMC9iLnRvdGFsOjA7ZFswXT14KGRbMF0qYik7ZFsxXT14KGRbMV0qYik7dGhpcy5zdGFja2VkWURhdGFbZV09ZFsxXX07SC5wcm90b3R5cGUuZ2V0U3RhY2tJbmRpY2F0b3I9ZnVuY3Rpb24oZCxiLGUsZil7IXcoZCl8fGQueCE9PWJ8fGYmJmQua2V5IT09Zj9kPXt4OmIsaW5kZXg6MCxrZXk6Zn06ZC5pbmRleCsrO2Qua2V5PVtlLGIsZC5pbmRleF0uam9pbigpO3JldHVybiBkfTt6LlN0YWNrSXRlbT1sO3JldHVybiB6LlN0YWNrSXRlbX0pO08oZSxcIlNlcmllcy9MaW5lL0xpbmVTZXJpZXMuanNcIixcbltlW1wiQ29yZS9Db2xvci9QYWxldHRlLmpzXCJdLGVbXCJDb3JlL1Nlcmllcy9TZXJpZXMuanNcIl0sZVtcIkNvcmUvU2VyaWVzL1Nlcmllc1JlZ2lzdHJ5LmpzXCJdLGVbXCJDb3JlL1V0aWxpdGllcy5qc1wiXV0sZnVuY3Rpb24oZSxiLEkseil7dmFyIEQ9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKCl7dmFyIGI9ZnVuY3Rpb24oZSx3KXtiPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihiLGUpe2IuX19wcm90b19fPWV9fHxmdW5jdGlvbihiLGUpe2Zvcih2YXIgZCBpbiBlKWUuaGFzT3duUHJvcGVydHkoZCkmJihiW2RdPWVbZF0pfTtyZXR1cm4gYihlLHcpfTtyZXR1cm4gZnVuY3Rpb24oZSx3KXtmdW5jdGlvbiB2KCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfWIoZSx3KTtlLnByb3RvdHlwZT1udWxsPT09dz9PYmplY3QuY3JlYXRlKHcpOih2LnByb3RvdHlwZT13LnByb3RvdHlwZSxuZXcgdil9fSgpLEc9ei5kZWZpbmVkLFxuQz16Lm1lcmdlO3o9ZnVuY3Rpb24oQil7ZnVuY3Rpb24geCgpe3ZhciBiPW51bGwhPT1CJiZCLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztiLmRhdGE9dm9pZCAwO2Iub3B0aW9ucz12b2lkIDA7Yi5wb2ludHM9dm9pZCAwO3JldHVybiBifUQoeCxCKTt4LnByb3RvdHlwZS5kcmF3R3JhcGg9ZnVuY3Rpb24oKXt2YXIgYj10aGlzLHY9dGhpcy5vcHRpb25zLGY9KHRoaXMuZ2FwcGVkUGF0aHx8dGhpcy5nZXRHcmFwaFBhdGgpLmNhbGwodGhpcyksZD10aGlzLmNoYXJ0LnN0eWxlZE1vZGUscT1bW1wiZ3JhcGhcIixcImhpZ2hjaGFydHMtZ3JhcGhcIl1dO2R8fHFbMF0ucHVzaCh2LmxpbmVDb2xvcnx8dGhpcy5jb2xvcnx8ZS5uZXV0cmFsQ29sb3IyMCx2LmRhc2hTdHlsZSk7cT1iLmdldFpvbmVzR3JhcGhzKHEpO3EuZm9yRWFjaChmdW5jdGlvbihlLGwpe3ZhciBrPWVbMF0scT1iW2tdLG49cT9cImFuaW1hdGVcIjpcImF0dHJcIjtxPyhxLmVuZFg9Yi5wcmV2ZW50R3JhcGhBbmltYXRpb24/bnVsbDpcbmYueE1hcCxxLmFuaW1hdGUoe2Q6Zn0pKTpmLmxlbmd0aCYmKGJba109cT1iLmNoYXJ0LnJlbmRlcmVyLnBhdGgoZikuYWRkQ2xhc3MoZVsxXSkuYXR0cih7ekluZGV4OjF9KS5hZGQoYi5ncm91cCkpO3EmJiFkJiYoaz17c3Ryb2tlOmVbMl0sXCJzdHJva2Utd2lkdGhcIjp2LmxpbmVXaWR0aCxmaWxsOmIuZmlsbEdyYXBoJiZiLmNvbG9yfHxcIm5vbmVcIn0sZVszXT9rLmRhc2hzdHlsZT1lWzNdOlwic3F1YXJlXCIhPT12LmxpbmVjYXAmJihrW1wic3Ryb2tlLWxpbmVjYXBcIl09a1tcInN0cm9rZS1saW5lam9pblwiXT1cInJvdW5kXCIpLHFbbl0oaykuc2hhZG93KDI+bCYmdi5zaGFkb3cpKTtxJiYocS5zdGFydFg9Zi54TWFwLHEuaXNBcmVhPWYuaXNBcmVhKX0pfTt4LnByb3RvdHlwZS5nZXRHcmFwaFBhdGg9ZnVuY3Rpb24oYixlLGYpe3ZhciBkPXRoaXMscT1kLm9wdGlvbnMsaz1xLnN0ZXAsbCx2PVtdLHU9W10sbjtiPWJ8fGQucG9pbnRzOyhsPWIucmV2ZXJzZWQpJiZiLnJldmVyc2UoKTsoaz17cmlnaHQ6MSxcbmNlbnRlcjoyfVtrXXx8ayYmMykmJmwmJihrPTQtayk7Yj10aGlzLmdldFZhbGlkUG9pbnRzKGIsITEsIShxLmNvbm5lY3ROdWxscyYmIWUmJiFmKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGwsdyl7dmFyIG09bC5wbG90WCxjPWwucGxvdFksZz1iW3ctMV07KGwubGVmdENsaWZmfHxnJiZnLnJpZ2h0Q2xpZmYpJiYhZiYmKG49ITApO2wuaXNOdWxsJiYhRyhlKSYmMDx3P249IXEuY29ubmVjdE51bGxzOmwuaXNOdWxsJiYhZT9uPSEwOigwPT09d3x8bj93PVtbXCJNXCIsbC5wbG90WCxsLnBsb3RZXV06ZC5nZXRQb2ludFNwbGluZT93PVtkLmdldFBvaW50U3BsaW5lKGIsbCx3KV06az8odz0xPT09az9bW1wiTFwiLGcucGxvdFgsY11dOjI9PT1rP1tbXCJMXCIsKGcucGxvdFgrbSkvMixnLnBsb3RZXSxbXCJMXCIsKGcucGxvdFgrbSkvMixjXV06W1tcIkxcIixtLGcucGxvdFldXSx3LnB1c2goW1wiTFwiLG0sY10pKTp3PVtbXCJMXCIsbSxjXV0sdS5wdXNoKGwueCksayYmKHUucHVzaChsLngpLDI9PT1rJiZ1LnB1c2gobC54KSksXG52LnB1c2guYXBwbHkodix3KSxuPSExKX0pO3YueE1hcD11O3JldHVybiBkLmdyYXBoUGF0aD12fTt4LnByb3RvdHlwZS5nZXRab25lc0dyYXBocz1mdW5jdGlvbihiKXt0aGlzLnpvbmVzLmZvckVhY2goZnVuY3Rpb24oZSxmKXtmPVtcInpvbmUtZ3JhcGgtXCIrZixcImhpZ2hjaGFydHMtZ3JhcGggaGlnaGNoYXJ0cy16b25lLWdyYXBoLVwiK2YrXCIgXCIrKGUuY2xhc3NOYW1lfHxcIlwiKV07dGhpcy5jaGFydC5zdHlsZWRNb2RlfHxmLnB1c2goZS5jb2xvcnx8dGhpcy5jb2xvcixlLmRhc2hTdHlsZXx8dGhpcy5vcHRpb25zLmRhc2hTdHlsZSk7Yi5wdXNoKGYpfSx0aGlzKTtyZXR1cm4gYn07eC5kZWZhdWx0T3B0aW9ucz1DKGIuZGVmYXVsdE9wdGlvbnMse30pO3JldHVybiB4fShiKTtJLnJlZ2lzdGVyU2VyaWVzVHlwZShcImxpbmVcIix6KTtcIlwiO3JldHVybiB6fSk7TyhlLFwiU2VyaWVzL0FyZWEvQXJlYVNlcmllcy5qc1wiLFtlW1wiQ29yZS9Db2xvci9Db2xvci5qc1wiXSxlW1wiTWl4aW5zL0xlZ2VuZFN5bWJvbC5qc1wiXSxcbmVbXCJDb3JlL1Nlcmllcy9TZXJpZXNSZWdpc3RyeS5qc1wiXSxlW1wiQ29yZS9VdGlsaXRpZXMuanNcIl1dLGZ1bmN0aW9uKGUsYixJLHope3ZhciBEPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbigpe3ZhciBiPWZ1bmN0aW9uKGUsZCl7Yj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oYixkKXtiLl9fcHJvdG9fXz1kfXx8ZnVuY3Rpb24oYixkKXtmb3IodmFyIGUgaW4gZClkLmhhc093blByb3BlcnR5KGUpJiYoYltlXT1kW2VdKX07cmV0dXJuIGIoZSxkKX07cmV0dXJuIGZ1bmN0aW9uKGUsZCl7ZnVuY3Rpb24gZigpe3RoaXMuY29uc3RydWN0b3I9ZX1iKGUsZCk7ZS5wcm90b3R5cGU9bnVsbD09PWQ/T2JqZWN0LmNyZWF0ZShkKTooZi5wcm90b3R5cGU9ZC5wcm90b3R5cGUsbmV3IGYpfX0oKSxHPWUucGFyc2UsQz1JLnNlcmllc1R5cGVzLmxpbmU7ZT16LmV4dGVuZDt2YXIgQj16Lm1lcmdlLHg9ei5vYmplY3RFYWNoLFxudz16LnBpY2s7ej1mdW5jdGlvbihiKXtmdW5jdGlvbiBlKCl7dmFyIGQ9bnVsbCE9PWImJmIuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO2QuZGF0YT12b2lkIDA7ZC5vcHRpb25zPXZvaWQgMDtkLnBvaW50cz12b2lkIDA7cmV0dXJuIGR9RChlLGIpO2UucHJvdG90eXBlLmRyYXdHcmFwaD1mdW5jdGlvbigpe3RoaXMuYXJlYVBhdGg9W107Yi5wcm90b3R5cGUuZHJhd0dyYXBoLmFwcGx5KHRoaXMpO3ZhciBkPXRoaXMsZT10aGlzLmFyZWFQYXRoLGY9dGhpcy5vcHRpb25zLGw9W1tcImFyZWFcIixcImhpZ2hjaGFydHMtYXJlYVwiLHRoaXMuY29sb3IsZi5maWxsQ29sb3JdXTt0aGlzLnpvbmVzLmZvckVhY2goZnVuY3Rpb24oYixlKXtsLnB1c2goW1wiem9uZS1hcmVhLVwiK2UsXCJoaWdoY2hhcnRzLWFyZWEgaGlnaGNoYXJ0cy16b25lLWFyZWEtXCIrZStcIiBcIitiLmNsYXNzTmFtZSxiLmNvbG9yfHxkLmNvbG9yLGIuZmlsbENvbG9yfHxmLmZpbGxDb2xvcl0pfSk7bC5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBrPVxuYlswXSxsPWRba10scT1sP1wiYW5pbWF0ZVwiOlwiYXR0clwiLHY9e307bD8obC5lbmRYPWQucHJldmVudEdyYXBoQW5pbWF0aW9uP251bGw6ZS54TWFwLGwuYW5pbWF0ZSh7ZDplfSkpOih2LnpJbmRleD0wLGw9ZFtrXT1kLmNoYXJ0LnJlbmRlcmVyLnBhdGgoZSkuYWRkQ2xhc3MoYlsxXSkuYWRkKGQuZ3JvdXApLGwuaXNBcmVhPSEwKTtkLmNoYXJ0LnN0eWxlZE1vZGV8fCh2LmZpbGw9dyhiWzNdLEcoYlsyXSkuc2V0T3BhY2l0eSh3KGYuZmlsbE9wYWNpdHksLjc1KSkuZ2V0KCkpKTtsW3FdKHYpO2wuc3RhcnRYPWUueE1hcDtsLnNoaWZ0VW5pdD1mLnN0ZXA/MjoxfSl9O2UucHJvdG90eXBlLmdldEdyYXBoUGF0aD1mdW5jdGlvbihiKXt2YXIgZD1DLnByb3RvdHlwZS5nZXRHcmFwaFBhdGgsZT10aGlzLm9wdGlvbnMsZj1lLnN0YWNraW5nLHY9dGhpcy55QXhpcyx1LG49W10seD1bXSxFPXRoaXMuaW5kZXgsbT12LnN0YWNraW5nLnN0YWNrc1t0aGlzLnN0YWNrS2V5XSxjPWUudGhyZXNob2xkLFxuZz1NYXRoLnJvdW5kKHYuZ2V0VGhyZXNob2xkKGUudGhyZXNob2xkKSk7ZT13KGUuY29ubmVjdE51bGxzLFwicGVyY2VudFwiPT09Zik7dmFyIGE9ZnVuY3Rpb24oYSxkLGUpe3ZhciBoPWJbYV07YT1mJiZtW2gueF0ucG9pbnRzW0VdO3ZhciBrPWhbZStcIk51bGxcIl18fDA7ZT1oW2UrXCJDbGlmZlwiXXx8MDtoPSEwO2lmKGV8fGspe3ZhciBsPShrP2FbMF06YVsxXSkrZTt2YXIgcT1hWzBdK2U7aD0hIWt9ZWxzZSFmJiZiW2RdJiZiW2RdLmlzTnVsbCYmKGw9cT1jKTtcInVuZGVmaW5lZFwiIT09dHlwZW9mIGwmJih4LnB1c2goe3Bsb3RYOnIscGxvdFk6bnVsbD09PWw/Zzp2LmdldFRocmVzaG9sZChsKSxpc051bGw6aCxpc0NsaWZmOiEwfSksbi5wdXNoKHtwbG90WDpyLHBsb3RZOm51bGw9PT1xP2c6di5nZXRUaHJlc2hvbGQocSksZG9DdXJ2ZTohMX0pKX07Yj1ifHx0aGlzLnBvaW50cztmJiYoYj10aGlzLmdldFN0YWNrUG9pbnRzKGIpKTtmb3IodT0wO3U8Yi5sZW5ndGg7dSsrKXtmfHwoYlt1XS5sZWZ0Q2xpZmY9XG5iW3VdLnJpZ2h0Q2xpZmY9Ylt1XS5sZWZ0TnVsbD1iW3VdLnJpZ2h0TnVsbD12b2lkIDApO3ZhciBoPWJbdV0uaXNOdWxsO3ZhciByPXcoYlt1XS5yZWN0UGxvdFgsYlt1XS5wbG90WCk7dmFyIEE9Zj93KGJbdV0ueUJvdHRvbSxnKTpnO2lmKCFofHxlKWV8fGEodSx1LTEsXCJsZWZ0XCIpLGgmJiFmJiZlfHwoeC5wdXNoKGJbdV0pLG4ucHVzaCh7eDp1LHBsb3RYOnIscGxvdFk6QX0pKSxlfHxhKHUsdSsxLFwicmlnaHRcIil9dT1kLmNhbGwodGhpcyx4LCEwLCEwKTtuLnJldmVyc2VkPSEwO2g9ZC5jYWxsKHRoaXMsbiwhMCwhMCk7KEE9aFswXSkmJlwiTVwiPT09QVswXSYmKGhbMF09W1wiTFwiLEFbMV0sQVsyXV0pO2g9dS5jb25jYXQoaCk7aC5sZW5ndGgmJmgucHVzaChbXCJaXCJdKTtkPWQuY2FsbCh0aGlzLHgsITEsZSk7aC54TWFwPXUueE1hcDt0aGlzLmFyZWFQYXRoPWg7cmV0dXJuIGR9O2UucHJvdG90eXBlLmdldFN0YWNrUG9pbnRzPWZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMsZT1bXSxmPVtdLFxudj10aGlzLnhBeGlzLHU9dGhpcy55QXhpcyxuPXUuc3RhY2tpbmcuc3RhY2tzW3RoaXMuc3RhY2tLZXldLEQ9e30sRT11LnNlcmllcyxtPUUubGVuZ3RoLGM9dS5vcHRpb25zLnJldmVyc2VkU3RhY2tzPzE6LTEsZz1FLmluZGV4T2YoZCk7Yj1ifHx0aGlzLnBvaW50cztpZih0aGlzLm9wdGlvbnMuc3RhY2tpbmcpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0ubGVmdE51bGw9YlthXS5yaWdodE51bGw9dm9pZCAwLERbYlthXS54XT1iW2FdO3gobixmdW5jdGlvbihhLGMpe251bGwhPT1hLnRvdGFsJiZmLnB1c2goYyl9KTtmLnNvcnQoZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS1jfSk7dmFyIGg9RS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGEudmlzaWJsZX0pO2YuZm9yRWFjaChmdW5jdGlvbihhLGIpe3ZhciBrPTAsbCxyO2lmKERbYV0mJiFEW2FdLmlzTnVsbCllLnB1c2goRFthXSksWy0xLDFdLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIGs9MT09PWU/XCJyaWdodE51bGxcIjpcblwibGVmdE51bGxcIixxPTAsdD1uW2ZbYitlXV07aWYodClmb3IodmFyIHA9ZzswPD1wJiZwPG07KXt2YXIgdj1FW3BdLmluZGV4O2w9dC5wb2ludHNbdl07bHx8KHY9PT1kLmluZGV4P0RbYV1ba109ITA6aFtwXSYmKHI9blthXS5wb2ludHNbdl0pJiYocS09clsxXS1yWzBdKSk7cCs9Y31EW2FdWzE9PT1lP1wicmlnaHRDbGlmZlwiOlwibGVmdENsaWZmXCJdPXF9KTtlbHNle2Zvcih2YXIgcT1nOzA8PXEmJnE8bTspe2lmKGw9blthXS5wb2ludHNbRVtxXS5pbmRleF0pe2s9bFsxXTticmVha31xKz1jfWs9dyhrLDApO2s9dS50cmFuc2xhdGUoaywwLDEsMCwxKTtlLnB1c2goe2lzTnVsbDohMCxwbG90WDp2LnRyYW5zbGF0ZShhLDAsMCwwLDEpLHg6YSxwbG90WTprLHlCb3R0b206a30pfX0pfXJldHVybiBlfTtlLmRlZmF1bHRPcHRpb25zPUIoQy5kZWZhdWx0T3B0aW9ucyx7dGhyZXNob2xkOjB9KTtyZXR1cm4gZX0oQyk7ZSh6LnByb3RvdHlwZSx7c2luZ2xlU3RhY2tzOiExLGRyYXdMZWdlbmRTeW1ib2w6Yi5kcmF3UmVjdGFuZ2xlfSk7XG5JLnJlZ2lzdGVyU2VyaWVzVHlwZShcImFyZWFcIix6KTtcIlwiO3JldHVybiB6fSk7TyhlLFwiU2VyaWVzL1NwbGluZS9TcGxpbmVTZXJpZXMuanNcIixbZVtcIkNvcmUvU2VyaWVzL1Nlcmllc1JlZ2lzdHJ5LmpzXCJdLGVbXCJDb3JlL1V0aWxpdGllcy5qc1wiXV0sZnVuY3Rpb24oZSxiKXt2YXIgRD10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgYj1mdW5jdGlvbihlLHgpe2I9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKGIsZSl7Yi5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKGIsZSl7Zm9yKHZhciBmIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShmKSYmKGJbZl09ZVtmXSl9O3JldHVybiBiKGUseCl9O3JldHVybiBmdW5jdGlvbihlLHgpe2Z1bmN0aW9uIHcoKXt0aGlzLmNvbnN0cnVjdG9yPWV9YihlLHgpO2UucHJvdG90eXBlPW51bGw9PT14P09iamVjdC5jcmVhdGUoeCk6KHcucHJvdG90eXBlPXgucHJvdG90eXBlLFxubmV3IHcpfX0oKSx6PWUuc2VyaWVzVHlwZXMubGluZSxIPWIubWVyZ2UsRz1iLnBpY2s7Yj1mdW5jdGlvbihiKXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PWImJmIuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO2UuZGF0YT12b2lkIDA7ZS5vcHRpb25zPXZvaWQgMDtlLnBvaW50cz12b2lkIDA7cmV0dXJuIGV9RChlLGIpO2UucHJvdG90eXBlLmdldFBvaW50U3BsaW5lPWZ1bmN0aW9uKGIsZSx2KXt2YXIgZj1lLnBsb3RYfHwwLGQ9ZS5wbG90WXx8MCxxPWJbdi0xXTt2PWJbdisxXTtpZihxJiYhcS5pc051bGwmJiExIT09cS5kb0N1cnZlJiYhZS5pc0NsaWZmJiZ2JiYhdi5pc051bGwmJiExIT09di5kb0N1cnZlJiYhZS5pc0NsaWZmKXtiPXEucGxvdFl8fDA7dmFyIGs9di5wbG90WHx8MDt2PXYucGxvdFl8fDA7dmFyIGw9MDt2YXIgdz0oMS41KmYrKHEucGxvdFh8fDApKS8yLjU7dmFyIHU9KDEuNSpkK2IpLzIuNTtrPSgxLjUqZitrKS8yLjU7dmFyIG49KDEuNSpkK3YpLzIuNTtcbmshPT13JiYobD0obi11KSooay1mKS8oay13KStkLW4pO3UrPWw7bis9bDt1PmImJnU+ZD8odT1NYXRoLm1heChiLGQpLG49MipkLXUpOnU8YiYmdTxkJiYodT1NYXRoLm1pbihiLGQpLG49MipkLXUpO24+diYmbj5kPyhuPU1hdGgubWF4KHYsZCksdT0yKmQtbik6bjx2JiZuPGQmJihuPU1hdGgubWluKHYsZCksdT0yKmQtbik7ZS5yaWdodENvbnRYPWs7ZS5yaWdodENvbnRZPW59ZT1bXCJDXCIsRyhxLnJpZ2h0Q29udFgscS5wbG90WCwwKSxHKHEucmlnaHRDb250WSxxLnBsb3RZLDApLEcodyxmLDApLEcodSxkLDApLGYsZF07cS5yaWdodENvbnRYPXEucmlnaHRDb250WT12b2lkIDA7cmV0dXJuIGV9O2UuZGVmYXVsdE9wdGlvbnM9SCh6LmRlZmF1bHRPcHRpb25zKTtyZXR1cm4gZX0oeik7ZS5yZWdpc3RlclNlcmllc1R5cGUoXCJzcGxpbmVcIixiKTtcIlwiO3JldHVybiBifSk7TyhlLFwiU2VyaWVzL0FyZWFTcGxpbmUvQXJlYVNwbGluZVNlcmllcy5qc1wiLFtlW1wiU2VyaWVzL0FyZWEvQXJlYVNlcmllcy5qc1wiXSxcbmVbXCJTZXJpZXMvU3BsaW5lL1NwbGluZVNlcmllcy5qc1wiXSxlW1wiTWl4aW5zL0xlZ2VuZFN5bWJvbC5qc1wiXSxlW1wiQ29yZS9TZXJpZXMvU2VyaWVzUmVnaXN0cnkuanNcIl0sZVtcIkNvcmUvVXRpbGl0aWVzLmpzXCJdXSxmdW5jdGlvbihlLGIsSSx6LEgpe3ZhciBEPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbigpe3ZhciBiPWZ1bmN0aW9uKGUsZil7Yj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oYixlKXtiLl9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24oYixlKXtmb3IodmFyIGQgaW4gZSllLmhhc093blByb3BlcnR5KGQpJiYoYltkXT1lW2RdKX07cmV0dXJuIGIoZSxmKX07cmV0dXJuIGZ1bmN0aW9uKGUsZil7ZnVuY3Rpb24gZCgpe3RoaXMuY29uc3RydWN0b3I9ZX1iKGUsZik7ZS5wcm90b3R5cGU9bnVsbD09PWY/T2JqZWN0LmNyZWF0ZShmKTooZC5wcm90b3R5cGU9Zi5wcm90b3R5cGUsbmV3IGQpfX0oKSxDPVxuZS5wcm90b3R5cGUsQj1ILmV4dGVuZCx4PUgubWVyZ2U7SD1mdW5jdGlvbih3KXtmdW5jdGlvbiB2KCl7dmFyIGI9bnVsbCE9PXcmJncuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO2IuZGF0YT12b2lkIDA7Yi5wb2ludHM9dm9pZCAwO2Iub3B0aW9ucz12b2lkIDA7cmV0dXJuIGJ9RCh2LHcpO3YuZGVmYXVsdE9wdGlvbnM9eChiLmRlZmF1bHRPcHRpb25zLGUuZGVmYXVsdE9wdGlvbnMpO3JldHVybiB2fShiKTtCKEgucHJvdG90eXBlLHtnZXRHcmFwaFBhdGg6Qy5nZXRHcmFwaFBhdGgsZ2V0U3RhY2tQb2ludHM6Qy5nZXRTdGFja1BvaW50cyxkcmF3R3JhcGg6Qy5kcmF3R3JhcGgsZHJhd0xlZ2VuZFN5bWJvbDpJLmRyYXdSZWN0YW5nbGV9KTt6LnJlZ2lzdGVyU2VyaWVzVHlwZShcImFyZWFzcGxpbmVcIixIKTtcIlwiO3JldHVybiBIfSk7TyhlLFwiU2VyaWVzL0NvbHVtbi9Db2x1bW5TZXJpZXMuanNcIixbZVtcIkNvcmUvQW5pbWF0aW9uL0FuaW1hdGlvblV0aWxpdGllcy5qc1wiXSxlW1wiQ29yZS9Db2xvci9Db2xvci5qc1wiXSxcbmVbXCJDb3JlL0dsb2JhbHMuanNcIl0sZVtcIk1peGlucy9MZWdlbmRTeW1ib2wuanNcIl0sZVtcIkNvcmUvQ29sb3IvUGFsZXR0ZS5qc1wiXSxlW1wiQ29yZS9TZXJpZXMvU2VyaWVzLmpzXCJdLGVbXCJDb3JlL1Nlcmllcy9TZXJpZXNSZWdpc3RyeS5qc1wiXSxlW1wiQ29yZS9VdGlsaXRpZXMuanNcIl1dLGZ1bmN0aW9uKGUsYixJLHosSCxHLEMsQil7dmFyIHg9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKCl7dmFyIGM9ZnVuY3Rpb24oYixhKXtjPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihhLGMpe2EuX19wcm90b19fPWN9fHxmdW5jdGlvbihhLGMpe2Zvcih2YXIgYiBpbiBjKWMuaGFzT3duUHJvcGVydHkoYikmJihhW2JdPWNbYl0pfTtyZXR1cm4gYyhiLGEpfTtyZXR1cm4gZnVuY3Rpb24oYixhKXtmdW5jdGlvbiBkKCl7dGhpcy5jb25zdHJ1Y3Rvcj1ifWMoYixhKTtiLnByb3RvdHlwZT1udWxsPT09YT9PYmplY3QuY3JlYXRlKGEpOlxuKGQucHJvdG90eXBlPWEucHJvdG90eXBlLG5ldyBkKX19KCksdz1lLmFuaW1PYmplY3Qsdj1iLnBhcnNlLGY9SS5oYXNUb3VjaDtlPUkubm9vcDt2YXIgZD1CLmNsYW1wLHE9Qi5jc3Msaz1CLmRlZmluZWQsbD1CLmV4dGVuZCxEPUIuZmlyZUV2ZW50LHU9Qi5pc0FycmF5LG49Qi5pc051bWJlcixKPUIubWVyZ2UsRT1CLnBpY2ssbT1CLm9iamVjdEVhY2g7Qj1mdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dmFyIGE9bnVsbCE9PWMmJmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO2EuYm9yZGVyV2lkdGg9dm9pZCAwO2EuZGF0YT12b2lkIDA7YS5ncm91cD12b2lkIDA7YS5vcHRpb25zPXZvaWQgMDthLnBvaW50cz12b2lkIDA7cmV0dXJuIGF9eChiLGMpO2IucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxiPXRoaXMueUF4aXMsZT1jLm9wdGlvbnMsZz10aGlzLmNoYXJ0LmludmVydGVkLGY9e30saz1nP1widHJhbnNsYXRlWFwiOlwidHJhbnNsYXRlWVwiO2lmKGEpZi5zY2FsZVk9XG4uMDAxLGE9ZChiLnRvUGl4ZWxzKGUudGhyZXNob2xkKSxiLnBvcyxiLnBvcytiLmxlbiksZz9mLnRyYW5zbGF0ZVg9YS1iLmxlbjpmLnRyYW5zbGF0ZVk9YSxjLmNsaXBCb3gmJmMuc2V0Q2xpcCgpLGMuZ3JvdXAuYXR0cihmKTtlbHNle3ZhciBtPU51bWJlcihjLmdyb3VwLmF0dHIoaykpO2MuZ3JvdXAuYW5pbWF0ZSh7c2NhbGVZOjF9LGwodyhjLm9wdGlvbnMuYW5pbWF0aW9uKSx7c3RlcDpmdW5jdGlvbihhLGQpe2MuZ3JvdXAmJihmW2tdPW0rZC5wb3MqKGIucG9zLW0pLGMuZ3JvdXAuYXR0cihmKSl9fSkpfX07Yi5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihhLGIpe2MucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBkPXRoaXM7YT1kLmNoYXJ0O2EuaGFzUmVuZGVyZWQmJmEuc2VyaWVzLmZvckVhY2goZnVuY3Rpb24oYSl7YS50eXBlPT09ZC50eXBlJiYoYS5pc0RpcnR5PSEwKX0pfTtiLnByb3RvdHlwZS5nZXRDb2x1bW5NZXRyaWNzPWZ1bmN0aW9uKCl7dmFyIGE9XG50aGlzLGM9YS5vcHRpb25zLGI9YS54QXhpcyxkPWEueUF4aXMsZT1iLm9wdGlvbnMucmV2ZXJzZWRTdGFja3M7ZT1iLnJldmVyc2VkJiYhZXx8IWIucmV2ZXJzZWQmJmU7dmFyIGcsZj17fSxrPTA7ITE9PT1jLmdyb3VwaW5nP2s9MTphLmNoYXJ0LnNlcmllcy5mb3JFYWNoKGZ1bmN0aW9uKGMpe3ZhciBiPWMueUF4aXMsZT1jLm9wdGlvbnM7aWYoYy50eXBlPT09YS50eXBlJiYoYy52aXNpYmxlfHwhYS5jaGFydC5vcHRpb25zLmNoYXJ0Lmlnbm9yZUhpZGRlblNlcmllcykmJmQubGVuPT09Yi5sZW4mJmQucG9zPT09Yi5wb3Mpe2lmKGUuc3RhY2tpbmcmJlwiZ3JvdXBcIiE9PWUuc3RhY2tpbmcpe2c9Yy5zdGFja0tleTtcInVuZGVmaW5lZFwiPT09dHlwZW9mIGZbZ10mJihmW2ddPWsrKyk7dmFyIGg9ZltnXX1lbHNlITEhPT1lLmdyb3VwaW5nJiYoaD1rKyspO2MuY29sdW1uSW5kZXg9aH19KTt2YXIgbT1NYXRoLm1pbihNYXRoLmFicyhiLnRyYW5zQSkqKGIub3JkaW5hbCYmYi5vcmRpbmFsLnNsb3BlfHxcbmMucG9pbnRSYW5nZXx8Yi5jbG9zZXN0UG9pbnRSYW5nZXx8Yi50aWNrSW50ZXJ2YWx8fDEpLGIubGVuKSxsPW0qYy5ncm91cFBhZGRpbmcsbj0obS0yKmwpLyhrfHwxKTtjPU1hdGgubWluKGMubWF4UG9pbnRXaWR0aHx8Yi5sZW4sRShjLnBvaW50V2lkdGgsbiooMS0yKmMucG9pbnRQYWRkaW5nKSkpO2EuY29sdW1uTWV0cmljcz17d2lkdGg6YyxvZmZzZXQ6KG4tYykvMisobCsoKGEuY29sdW1uSW5kZXh8fDApKyhlPzE6MCkpKm4tbS8yKSooZT8tMToxKSxwYWRkZWRXaWR0aDpuLGNvbHVtbkNvdW50Omt9O3JldHVybiBhLmNvbHVtbk1ldHJpY3N9O2IucHJvdG90eXBlLmNyaXNwQ29sPWZ1bmN0aW9uKGEsYyxiLGQpe3ZhciBlPXRoaXMuY2hhcnQsaD10aGlzLmJvcmRlcldpZHRoLGc9LShoJTI/LjU6MCk7aD1oJTI/LjU6MTtlLmludmVydGVkJiZlLnJlbmRlcmVyLmlzVk1MJiYoaCs9MSk7dGhpcy5vcHRpb25zLmNyaXNwJiYoYj1NYXRoLnJvdW5kKGErYikrZyxhPU1hdGgucm91bmQoYSkrXG5nLGItPWEpO2Q9TWF0aC5yb3VuZChjK2QpK2g7Zz0uNT49TWF0aC5hYnMoYykmJi41PGQ7Yz1NYXRoLnJvdW5kKGMpK2g7ZC09YztnJiZkJiYoLS1jLGQrPTEpO3JldHVybnt4OmEseTpjLHdpZHRoOmIsaGVpZ2h0OmR9fTtiLnByb3RvdHlwZS5hZGp1c3RGb3JNaXNzaW5nQ29sdW1ucz1mdW5jdGlvbihhLGMsYixkKXt2YXIgZT10aGlzLGg9dGhpcy5vcHRpb25zLnN0YWNraW5nO2lmKCFiLmlzTnVsbCYmMTxkLmNvbHVtbkNvdW50KXt2YXIgZz0wLGY9MDttKHRoaXMueUF4aXMuc3RhY2tpbmcmJnRoaXMueUF4aXMuc3RhY2tpbmcuc3RhY2tzLGZ1bmN0aW9uKGEpe2lmKFwibnVtYmVyXCI9PT10eXBlb2YgYi54JiYoYT1hW2IueC50b1N0cmluZygpXSkpe3ZhciBjPWEucG9pbnRzW2UuaW5kZXhdLGQ9YS50b3RhbDtoPyhjJiYoZz1mKSxhLmhhc1ZhbGlkUG9pbnRzJiZmKyspOnUoYykmJihnPWNbMV0sZj1kfHwwKX19KTthPShiLnBsb3RYfHwwKSsoKGYtMSkqZC5wYWRkZWRXaWR0aCtjKS9cbjItYy1nKmQucGFkZGVkV2lkdGh9cmV0dXJuIGF9O2IucHJvdG90eXBlLnRyYW5zbGF0ZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYz1hLmNoYXJ0LGI9YS5vcHRpb25zLGU9YS5kZW5zZT0yPmEuY2xvc2VzdFBvaW50UmFuZ2UqYS54QXhpcy50cmFuc0E7ZT1hLmJvcmRlcldpZHRoPUUoYi5ib3JkZXJXaWR0aCxlPzA6MSk7dmFyIGc9YS54QXhpcyxmPWEueUF4aXMsbT1iLnRocmVzaG9sZCxsPWEudHJhbnNsYXRlZFRocmVzaG9sZD1mLmdldFRocmVzaG9sZChtKSxxPUUoYi5taW5Qb2ludExlbmd0aCw1KSx2PWEuZ2V0Q29sdW1uTWV0cmljcygpLHU9di53aWR0aCx0PWEuYmFyVz1NYXRoLm1heCh1LDErMiplKSxwPWEucG9pbnRYT2Zmc2V0PXYub2Zmc2V0LHc9YS5kYXRhTWluLHg9YS5kYXRhTWF4O2MuaW52ZXJ0ZWQmJihsLT0uNSk7Yi5wb2ludFBhZGRpbmcmJih0PU1hdGguY2VpbCh0KSk7Ry5wcm90b3R5cGUudHJhbnNsYXRlLmFwcGx5KGEpO2EucG9pbnRzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIGg9XG5FKGUueUJvdHRvbSxsKSxyPTk5OStNYXRoLmFicyhoKSx5PXUsQT1lLnBsb3RYfHwwO3I9ZChlLnBsb3RZLC1yLGYubGVuK3IpO0ErPXA7dmFyIEQ9dCxCPU1hdGgubWluKHIsaCksej1NYXRoLm1heChyLGgpLUI7aWYocSYmTWF0aC5hYnMoeik8cSl7ej1xO3ZhciBDPSFmLnJldmVyc2VkJiYhZS5uZWdhdGl2ZXx8Zi5yZXZlcnNlZCYmZS5uZWdhdGl2ZTtuKG0pJiZuKHgpJiZlLnk9PT1tJiZ4PD1tJiYoZi5taW58fDApPG0mJih3IT09eHx8KGYubWF4fHwwKTw9bSkmJihDPSFDKTtCPU1hdGguYWJzKEItbCk+cT9oLXE6bC0oQz9xOjApfWsoZS5vcHRpb25zLnBvaW50V2lkdGgpJiYoeT1EPU1hdGguY2VpbChlLm9wdGlvbnMucG9pbnRXaWR0aCksQS09TWF0aC5yb3VuZCgoeS11KS8yKSk7Yi5jZW50ZXJJbkNhdGVnb3J5JiYoQT1hLmFkanVzdEZvck1pc3NpbmdDb2x1bW5zKEEseSxlLHYpKTtlLmJhclg9QTtlLnBvaW50V2lkdGg9eTtlLnRvb2x0aXBQb3M9Yy5pbnZlcnRlZD9bZChmLmxlbitcbmYucG9zLWMucGxvdExlZnQtcixmLnBvcy1jLnBsb3RMZWZ0LGYubGVuK2YucG9zLWMucGxvdExlZnQpLGcubGVuK2cucG9zLWMucGxvdFRvcC1BLUQvMix6XTpbZy5sZWZ0LWMucGxvdExlZnQrQStELzIsZChyK2YucG9zLWMucGxvdFRvcCxmLnBvcy1jLnBsb3RUb3AsZi5sZW4rZi5wb3MtYy5wbG90VG9wKSx6XTtlLnNoYXBlVHlwZT1hLnBvaW50Q2xhc3MucHJvdG90eXBlLnNoYXBlVHlwZXx8XCJyZWN0XCI7ZS5zaGFwZUFyZ3M9YS5jcmlzcENvbC5hcHBseShhLGUuaXNOdWxsP1tBLGwsRCwwXTpbQSxCLEQsel0pfSl9O2IucHJvdG90eXBlLmRyYXdHcmFwaD1mdW5jdGlvbigpe3RoaXMuZ3JvdXBbdGhpcy5kZW5zZT9cImFkZENsYXNzXCI6XCJyZW1vdmVDbGFzc1wiXShcImhpZ2hjaGFydHMtZGVuc2UtZGF0YVwiKX07Yi5wcm90b3R5cGUucG9pbnRBdHRyaWJzPWZ1bmN0aW9uKGEsYyl7dmFyIGI9dGhpcy5vcHRpb25zLGQ9dGhpcy5wb2ludEF0dHJUb09wdGlvbnN8fHt9O3ZhciBlPWQuc3Ryb2tlfHxcblwiYm9yZGVyQ29sb3JcIjt2YXIgaD1kW1wic3Ryb2tlLXdpZHRoXCJdfHxcImJvcmRlcldpZHRoXCIsZz1hJiZhLmNvbG9yfHx0aGlzLmNvbG9yLGY9YSYmYVtlXXx8YltlXXx8ZyxrPWEmJmFbaF18fGJbaF18fHRoaXNbaF18fDA7ZD1hJiZhLm9wdGlvbnMuZGFzaFN0eWxlfHxiLmRhc2hTdHlsZTt2YXIgbT1FKGEmJmEub3BhY2l0eSxiLm9wYWNpdHksMSk7aWYoYSYmdGhpcy56b25lcy5sZW5ndGgpe3ZhciBsPWEuZ2V0Wm9uZSgpO2c9YS5vcHRpb25zLmNvbG9yfHxsJiYobC5jb2xvcnx8YS5ub25ab25lZENvbG9yKXx8dGhpcy5jb2xvcjtsJiYoZj1sLmJvcmRlckNvbG9yfHxmLGQ9bC5kYXNoU3R5bGV8fGQsaz1sLmJvcmRlcldpZHRofHxrKX1jJiZhJiYoYT1KKGIuc3RhdGVzW2NdLGEub3B0aW9ucy5zdGF0ZXMmJmEub3B0aW9ucy5zdGF0ZXNbY118fHt9KSxjPWEuYnJpZ2h0bmVzcyxnPWEuY29sb3J8fFwidW5kZWZpbmVkXCIhPT10eXBlb2YgYyYmdihnKS5icmlnaHRlbihhLmJyaWdodG5lc3MpLmdldCgpfHxcbmcsZj1hW2VdfHxmLGs9YVtoXXx8ayxkPWEuZGFzaFN0eWxlfHxkLG09RShhLm9wYWNpdHksbSkpO2U9e2ZpbGw6ZyxzdHJva2U6ZixcInN0cm9rZS13aWR0aFwiOmssb3BhY2l0eTptfTtkJiYoZS5kYXNoc3R5bGU9ZCk7cmV0dXJuIGV9O2IucHJvdG90eXBlLmRyYXdQb2ludHM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGM9dGhpcy5jaGFydCxiPWEub3B0aW9ucyxkPWMucmVuZGVyZXIsZT1iLmFuaW1hdGlvbkxpbWl0fHwyNTAsZzthLnBvaW50cy5mb3JFYWNoKGZ1bmN0aW9uKGgpe3ZhciBmPWguZ3JhcGhpYyxrPSEhZixtPWYmJmMucG9pbnRDb3VudDxlP1wiYW5pbWF0ZVwiOlwiYXR0clwiO2lmKG4oaC5wbG90WSkmJm51bGwhPT1oLnkpe2c9aC5zaGFwZUFyZ3M7ZiYmaC5oYXNOZXdTaGFwZVR5cGUoKSYmKGY9Zi5kZXN0cm95KCkpO2EuZW5hYmxlZERhdGFTb3J0aW5nJiYoaC5zdGFydFhQb3M9YS54QXhpcy5yZXZlcnNlZD8tKGc/Zy53aWR0aHx8MDowKTphLnhBeGlzLndpZHRoKTtmfHwoaC5ncmFwaGljPVxuZj1kW2guc2hhcGVUeXBlXShnKS5hZGQoaC5ncm91cHx8YS5ncm91cCkpJiZhLmVuYWJsZWREYXRhU29ydGluZyYmYy5oYXNSZW5kZXJlZCYmYy5wb2ludENvdW50PGUmJihmLmF0dHIoe3g6aC5zdGFydFhQb3N9KSxrPSEwLG09XCJhbmltYXRlXCIpO2lmKGYmJmspZlttXShKKGcpKTtpZihiLmJvcmRlclJhZGl1cylmW21dKHtyOmIuYm9yZGVyUmFkaXVzfSk7Yy5zdHlsZWRNb2RlfHxmW21dKGEucG9pbnRBdHRyaWJzKGgsaC5zZWxlY3RlZCYmXCJzZWxlY3RcIikpLnNoYWRvdyghMSE9PWguYWxsb3dTaGFkb3cmJmIuc2hhZG93LG51bGwsYi5zdGFja2luZyYmIWIuYm9yZGVyUmFkaXVzKTtmJiYoZi5hZGRDbGFzcyhoLmdldENsYXNzTmFtZSgpLCEwKSxmLmF0dHIoe3Zpc2liaWxpdHk6aC52aXNpYmxlP1wiaW5oZXJpdFwiOlwiaGlkZGVuXCJ9KSl9ZWxzZSBmJiYoaC5ncmFwaGljPWYuZGVzdHJveSgpKX0pfTtiLnByb3RvdHlwZS5kcmF3VHJhY2tlcj1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYz1cbmEuY2hhcnQsYj1jLnBvaW50ZXIsZD1mdW5jdGlvbihhKXt2YXIgYz1iLmdldFBvaW50RnJvbUV2ZW50KGEpO1widW5kZWZpbmVkXCIhPT10eXBlb2YgYyYmKGIuaXNEaXJlY3RUb3VjaD0hMCxjLm9uTW91c2VPdmVyKGEpKX0sZTthLnBvaW50cy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2U9dShhLmRhdGFMYWJlbHMpP2EuZGF0YUxhYmVsczphLmRhdGFMYWJlbD9bYS5kYXRhTGFiZWxdOltdO2EuZ3JhcGhpYyYmKGEuZ3JhcGhpYy5lbGVtZW50LnBvaW50PWEpO2UuZm9yRWFjaChmdW5jdGlvbihjKXtjLmRpdj9jLmRpdi5wb2ludD1hOmMuZWxlbWVudC5wb2ludD1hfSl9KTthLl9oYXNUcmFja2luZ3x8KGEudHJhY2tlckdyb3Vwcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKGFbZV0pe2FbZV0uYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLXRyYWNrZXJcIikub24oXCJtb3VzZW92ZXJcIixkKS5vbihcIm1vdXNlb3V0XCIsZnVuY3Rpb24oYSl7Yi5vblRyYWNrZXJNb3VzZU91dChhKX0pO2lmKGYpYVtlXS5vbihcInRvdWNoc3RhcnRcIixcbmQpOyFjLnN0eWxlZE1vZGUmJmEub3B0aW9ucy5jdXJzb3ImJmFbZV0uY3NzKHEpLmNzcyh7Y3Vyc29yOmEub3B0aW9ucy5jdXJzb3J9KX19KSxhLl9oYXNUcmFja2luZz0hMCk7RCh0aGlzLFwiYWZ0ZXJEcmF3VHJhY2tlclwiKX07Yi5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcyxjPWEuY2hhcnQ7Yy5oYXNSZW5kZXJlZCYmYy5zZXJpZXMuZm9yRWFjaChmdW5jdGlvbihjKXtjLnR5cGU9PT1hLnR5cGUmJihjLmlzRGlydHk9ITApfSk7Ry5wcm90b3R5cGUucmVtb3ZlLmFwcGx5KGEsYXJndW1lbnRzKX07Yi5kZWZhdWx0T3B0aW9ucz1KKEcuZGVmYXVsdE9wdGlvbnMse2JvcmRlclJhZGl1czowLGNlbnRlckluQ2F0ZWdvcnk6ITEsZ3JvdXBQYWRkaW5nOi4yLG1hcmtlcjpudWxsLHBvaW50UGFkZGluZzouMSxtaW5Qb2ludExlbmd0aDowLGNyb3BUaHJlc2hvbGQ6NTAscG9pbnRSYW5nZTpudWxsLHN0YXRlczp7aG92ZXI6e2hhbG86ITEsYnJpZ2h0bmVzczouMX0sXG5zZWxlY3Q6e2NvbG9yOkgubmV1dHJhbENvbG9yMjAsYm9yZGVyQ29sb3I6SC5uZXV0cmFsQ29sb3IxMDB9fSxkYXRhTGFiZWxzOnthbGlnbjp2b2lkIDAsdmVydGljYWxBbGlnbjp2b2lkIDAseTp2b2lkIDB9LHN0YXJ0RnJvbVRocmVzaG9sZDohMCxzdGlja3lUcmFja2luZzohMSx0b29sdGlwOntkaXN0YW5jZTo2fSx0aHJlc2hvbGQ6MCxib3JkZXJDb2xvcjpILmJhY2tncm91bmRDb2xvcn0pO3JldHVybiBifShHKTtsKEIucHJvdG90eXBlLHtjcm9wU2hvdWxkZXI6MCxkaXJlY3RUb3VjaDohMCxkcmF3TGVnZW5kU3ltYm9sOnouZHJhd1JlY3RhbmdsZSxnZXRTeW1ib2w6ZSxuZWdTdGFja3M6ITAsdHJhY2tlckdyb3VwczpbXCJncm91cFwiLFwiZGF0YUxhYmVsc0dyb3VwXCJdfSk7Qy5yZWdpc3RlclNlcmllc1R5cGUoXCJjb2x1bW5cIixCKTtcIlwiO1wiXCI7cmV0dXJuIEJ9KTtPKGUsXCJTZXJpZXMvQmFyL0JhclNlcmllcy5qc1wiLFtlW1wiU2VyaWVzL0NvbHVtbi9Db2x1bW5TZXJpZXMuanNcIl0sZVtcIkNvcmUvU2VyaWVzL1Nlcmllc1JlZ2lzdHJ5LmpzXCJdLFxuZVtcIkNvcmUvVXRpbGl0aWVzLmpzXCJdXSxmdW5jdGlvbihlLGIsSSl7dmFyIEQ9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKCl7dmFyIGI9ZnVuY3Rpb24oZSx4KXtiPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihiLGUpe2IuX19wcm90b19fPWV9fHxmdW5jdGlvbihiLGUpe2Zvcih2YXIgZiBpbiBlKWUuaGFzT3duUHJvcGVydHkoZikmJihiW2ZdPWVbZl0pfTtyZXR1cm4gYihlLHgpfTtyZXR1cm4gZnVuY3Rpb24oZSx4KXtmdW5jdGlvbiB3KCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfWIoZSx4KTtlLnByb3RvdHlwZT1udWxsPT09eD9PYmplY3QuY3JlYXRlKHgpOih3LnByb3RvdHlwZT14LnByb3RvdHlwZSxuZXcgdyl9fSgpLEg9SS5leHRlbmQsRz1JLm1lcmdlO0k9ZnVuY3Rpb24oYil7ZnVuY3Rpb24gQigpe3ZhciBlPW51bGwhPT1iJiZiLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztlLmRhdGE9dm9pZCAwO1xuZS5vcHRpb25zPXZvaWQgMDtlLnBvaW50cz12b2lkIDA7cmV0dXJuIGV9RChCLGIpO0IuZGVmYXVsdE9wdGlvbnM9RyhlLmRlZmF1bHRPcHRpb25zLHt9KTtyZXR1cm4gQn0oZSk7SChJLnByb3RvdHlwZSx7aW52ZXJ0ZWQ6ITB9KTtiLnJlZ2lzdGVyU2VyaWVzVHlwZShcImJhclwiLEkpO1wiXCI7cmV0dXJuIEl9KTtPKGUsXCJTZXJpZXMvU2NhdHRlci9TY2F0dGVyU2VyaWVzLmpzXCIsW2VbXCJTZXJpZXMvQ29sdW1uL0NvbHVtblNlcmllcy5qc1wiXSxlW1wiU2VyaWVzL0xpbmUvTGluZVNlcmllcy5qc1wiXSxlW1wiQ29yZS9TZXJpZXMvU2VyaWVzUmVnaXN0cnkuanNcIl0sZVtcIkNvcmUvVXRpbGl0aWVzLmpzXCJdXSxmdW5jdGlvbihlLGIsSSx6KXt2YXIgRD10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgYj1mdW5jdGlvbihlLHYpe2I9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKGIsZCl7Yi5fX3Byb3RvX189ZH18fFxuZnVuY3Rpb24oYixkKXtmb3IodmFyIGUgaW4gZClkLmhhc093blByb3BlcnR5KGUpJiYoYltlXT1kW2VdKX07cmV0dXJuIGIoZSx2KX07cmV0dXJuIGZ1bmN0aW9uKGUsdil7ZnVuY3Rpb24gZigpe3RoaXMuY29uc3RydWN0b3I9ZX1iKGUsdik7ZS5wcm90b3R5cGU9bnVsbD09PXY/T2JqZWN0LmNyZWF0ZSh2KTooZi5wcm90b3R5cGU9di5wcm90b3R5cGUsbmV3IGYpfX0oKSxHPXouYWRkRXZlbnQsQz16LmV4dGVuZCxCPXoubWVyZ2U7ej1mdW5jdGlvbihlKXtmdW5jdGlvbiB3KCl7dmFyIGI9bnVsbCE9PWUmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO2IuZGF0YT12b2lkIDA7Yi5vcHRpb25zPXZvaWQgMDtiLnBvaW50cz12b2lkIDA7cmV0dXJuIGJ9RCh3LGUpO3cucHJvdG90eXBlLmFwcGx5Sml0dGVyPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxlPXRoaXMub3B0aW9ucy5qaXR0ZXIsZD10aGlzLnBvaW50cy5sZW5ndGg7ZSYmdGhpcy5wb2ludHMuZm9yRWFjaChmdW5jdGlvbihmLFxuayl7W1wieFwiLFwieVwiXS5mb3JFYWNoKGZ1bmN0aW9uKGwscSl7dmFyIHY9XCJwbG90XCIrbC50b1VwcGVyQ2FzZSgpO2lmKGVbbF0mJiFmLmlzTnVsbCl7dmFyIG49YltsK1wiQXhpc1wiXTt2YXIgdz1lW2xdKm4udHJhbnNBO2lmKG4mJiFuLmlzTG9nKXt2YXIgRT1NYXRoLm1heCgwLGZbdl0tdyk7bj1NYXRoLm1pbihuLmxlbixmW3ZdK3cpO3E9MUU0Kk1hdGguc2luKGsrcSpkKTtmW3ZdPUUrKG4tRSkqKHEtTWF0aC5mbG9vcihxKSk7XCJ4XCI9PT1sJiYoZi5jbGllbnRYPWYucGxvdFgpfX19KX0pfTt3LnByb3RvdHlwZS5kcmF3R3JhcGg9ZnVuY3Rpb24oKXsodGhpcy5vcHRpb25zLmxpbmVXaWR0aHx8MD09PXRoaXMub3B0aW9ucy5saW5lV2lkdGgmJnRoaXMuZ3JhcGgmJnRoaXMuZ3JhcGguc3Ryb2tlV2lkdGgoKSkmJmUucHJvdG90eXBlLmRyYXdHcmFwaC5jYWxsKHRoaXMpfTt3LmRlZmF1bHRPcHRpb25zPUIoYi5kZWZhdWx0T3B0aW9ucyx7bGluZVdpZHRoOjAsZmluZE5lYXJlc3RQb2ludEJ5OlwieHlcIixcbmppdHRlcjp7eDowLHk6MH0sbWFya2VyOntlbmFibGVkOiEwfSx0b29sdGlwOntoZWFkZXJGb3JtYXQ6JzxzcGFuIHN0eWxlPVwiY29sb3I6e3BvaW50LmNvbG9yfVwiPlxcdTI1Y2Y8L3NwYW4+IDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxMHB4XCI+IHtzZXJpZXMubmFtZX08L3NwYW4+PGJyLz4nLHBvaW50Rm9ybWF0OlwieDogPGI+e3BvaW50Lnh9PC9iPjxici8+eTogPGI+e3BvaW50Lnl9PC9iPjxici8+XCJ9fSk7cmV0dXJuIHd9KGIpO0Moei5wcm90b3R5cGUse2RyYXdUcmFja2VyOmUucHJvdG90eXBlLmRyYXdUcmFja2VyLHNvcnRlZDohMSxyZXF1aXJlU29ydGluZzohMSxub1NoYXJlZFRvb2x0aXA6ITAsdHJhY2tlckdyb3VwczpbXCJncm91cFwiLFwibWFya2VyR3JvdXBcIixcImRhdGFMYWJlbHNHcm91cFwiXSx0YWtlT3JkaW5hbFBvc2l0aW9uOiExfSk7Ryh6LFwiYWZ0ZXJUcmFuc2xhdGVcIixmdW5jdGlvbigpe3RoaXMuYXBwbHlKaXR0ZXIoKX0pO0kucmVnaXN0ZXJTZXJpZXNUeXBlKFwic2NhdHRlclwiLFxueik7XCJcIjtyZXR1cm4gen0pO08oZSxcIk1peGlucy9DZW50ZXJlZFNlcmllcy5qc1wiLFtlW1wiQ29yZS9HbG9iYWxzLmpzXCJdLGVbXCJDb3JlL1Nlcmllcy9TZXJpZXMuanNcIl0sZVtcIkNvcmUvVXRpbGl0aWVzLmpzXCJdXSxmdW5jdGlvbihlLGIsSSl7dmFyIEQ9SS5pc051bWJlcixIPUkucGljayxHPUkucmVsYXRpdmVMZW5ndGgsQz1lLmRlZzJyYWQ7cmV0dXJuIGUuQ2VudGVyZWRTZXJpZXNNaXhpbj17Z2V0Q2VudGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zLEQ9dGhpcy5jaGFydCx3PTIqKGUuc2xpY2VkT2Zmc2V0fHwwKSx2PUQucGxvdFdpZHRoLTIqdyxmPUQucGxvdEhlaWdodC0yKncsZD1lLmNlbnRlcixxPU1hdGgubWluKHYsZiksaz1lLnNpemUsbD1lLmlubmVyU2l6ZXx8MDtcInN0cmluZ1wiPT09dHlwZW9mIGsmJihrPXBhcnNlRmxvYXQoaykpO1wic3RyaW5nXCI9PT10eXBlb2YgbCYmKGw9cGFyc2VGbG9hdChsKSk7ZT1bSChkWzBdLFwiNTAlXCIpLEgoZFsxXSxcIjUwJVwiKSxIKGsmJlxuMD5rP3ZvaWQgMDplLnNpemUsXCIxMDAlXCIpLEgobCYmMD5sP3ZvaWQgMDplLmlubmVyU2l6ZXx8MCxcIjAlXCIpXTshRC5hbmd1bGFyfHx0aGlzIGluc3RhbmNlb2YgYnx8KGVbM109MCk7Zm9yKGQ9MDs0PmQ7KytkKWs9ZVtkXSxEPTI+ZHx8Mj09PWQmJi8lJC8udGVzdChrKSxlW2RdPUcoayxbdixmLHEsZVsyXV1bZF0pKyhEP3c6MCk7ZVszXT5lWzJdJiYoZVszXT1lWzJdKTtyZXR1cm4gZX0sZ2V0U3RhcnRBbmRFbmRSYWRpYW5zOmZ1bmN0aW9uKGIsZSl7Yj1EKGIpP2I6MDtlPUQoZSkmJmU+YiYmMzYwPmUtYj9lOmIrMzYwO3JldHVybntzdGFydDpDKihiKy05MCksZW5kOkMqKGUrLTkwKX19fX0pO08oZSxcIlNlcmllcy9QaWUvUGllUG9pbnQuanNcIixbZVtcIkNvcmUvQW5pbWF0aW9uL0FuaW1hdGlvblV0aWxpdGllcy5qc1wiXSxlW1wiQ29yZS9TZXJpZXMvUG9pbnQuanNcIl0sZVtcIkNvcmUvVXRpbGl0aWVzLmpzXCJdXSxmdW5jdGlvbihlLGIsSSl7dmFyIEQ9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fFxuZnVuY3Rpb24oKXt2YXIgYj1mdW5jdGlvbihlLGQpe2I9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKGIsZCl7Yi5fX3Byb3RvX189ZH18fGZ1bmN0aW9uKGIsZCl7Zm9yKHZhciBlIGluIGQpZC5oYXNPd25Qcm9wZXJ0eShlKSYmKGJbZV09ZFtlXSl9O3JldHVybiBiKGUsZCl9O3JldHVybiBmdW5jdGlvbihlLGQpe2Z1bmN0aW9uIGYoKXt0aGlzLmNvbnN0cnVjdG9yPWV9YihlLGQpO2UucHJvdG90eXBlPW51bGw9PT1kP09iamVjdC5jcmVhdGUoZCk6KGYucHJvdG90eXBlPWQucHJvdG90eXBlLG5ldyBmKX19KCksSD1lLnNldEFuaW1hdGlvbixHPUkuYWRkRXZlbnQsQz1JLmRlZmluZWQ7ZT1JLmV4dGVuZDt2YXIgQj1JLmlzTnVtYmVyLHg9SS5waWNrLHc9SS5yZWxhdGl2ZUxlbmd0aDtJPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGYoKXt2YXIgYj1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7XG5iLmxhYmVsRGlzdGFuY2U9dm9pZCAwO2Iub3B0aW9ucz12b2lkIDA7Yi5zZXJpZXM9dm9pZCAwO3JldHVybiBifUQoZixlKTtmLnByb3RvdHlwZS5nZXRDb25uZWN0b3JQYXRoPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5sYWJlbFBvc2l0aW9uLGU9dGhpcy5zZXJpZXMub3B0aW9ucy5kYXRhTGFiZWxzLGY9ZS5jb25uZWN0b3JTaGFwZSxsPXRoaXMuY29ubmVjdG9yU2hhcGVzO2xbZl0mJihmPWxbZl0pO3JldHVybiBmLmNhbGwodGhpcyx7eDpiLmZpbmFsLngseTpiLmZpbmFsLnksYWxpZ25tZW50OmIuYWxpZ25tZW50fSxiLmNvbm5lY3RvclBvc2l0aW9uLGUpfTtmLnByb3RvdHlwZS5nZXRUcmFuc2xhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zbGljZWQ/dGhpcy5zbGljZWRUcmFuc2xhdGlvbjp7dHJhbnNsYXRlWDowLHRyYW5zbGF0ZVk6MH19O2YucHJvdG90eXBlLmhhbG9QYXRoPWZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuc2hhcGVBcmdzO3JldHVybiB0aGlzLnNsaWNlZHx8IXRoaXMudmlzaWJsZT9cbltdOnRoaXMuc2VyaWVzLmNoYXJ0LnJlbmRlcmVyLnN5bWJvbHMuYXJjKGQueCxkLnksZC5yK2IsZC5yK2Ise2lubmVyUjpkLnItMSxzdGFydDpkLnN0YXJ0LGVuZDpkLmVuZH0pfTtmLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7Yi5wcm90b3R5cGUuaW5pdC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGQ9dGhpcztkLm5hbWU9eChkLm5hbWUsXCJTbGljZVwiKTt2YXIgZT1mdW5jdGlvbihiKXtkLnNsaWNlKFwic2VsZWN0XCI9PT1iLnR5cGUpfTtHKGQsXCJzZWxlY3RcIixlKTtHKGQsXCJ1bnNlbGVjdFwiLGUpO3JldHVybiBkfTtmLnByb3RvdHlwZS5pc1ZhbGlkPWZ1bmN0aW9uKCl7cmV0dXJuIEIodGhpcy55KSYmMDw9dGhpcy55fTtmLnByb3RvdHlwZS5zZXRWaXNpYmxlPWZ1bmN0aW9uKGIsZSl7dmFyIGQ9dGhpcyxmPWQuc2VyaWVzLHE9Zi5jaGFydCx2PWYub3B0aW9ucy5pZ25vcmVIaWRkZW5Qb2ludDtlPXgoZSx2KTtiIT09ZC52aXNpYmxlJiYoZC52aXNpYmxlPWQub3B0aW9ucy52aXNpYmxlPVxuYj1cInVuZGVmaW5lZFwiPT09dHlwZW9mIGI/IWQudmlzaWJsZTpiLGYub3B0aW9ucy5kYXRhW2YuZGF0YS5pbmRleE9mKGQpXT1kLm9wdGlvbnMsW1wiZ3JhcGhpY1wiLFwiZGF0YUxhYmVsXCIsXCJjb25uZWN0b3JcIixcInNoYWRvd0dyb3VwXCJdLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZFtlXSlkW2VdW2I/XCJzaG93XCI6XCJoaWRlXCJdKGIpfSksZC5sZWdlbmRJdGVtJiZxLmxlZ2VuZC5jb2xvcml6ZUl0ZW0oZCxiKSxifHxcImhvdmVyXCIhPT1kLnN0YXRlfHxkLnNldFN0YXRlKFwiXCIpLHYmJihmLmlzRGlydHk9ITApLGUmJnEucmVkcmF3KCkpfTtmLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbihiLGUsZil7dmFyIGQ9dGhpcy5zZXJpZXM7SChmLGQuY2hhcnQpO3goZSwhMCk7dGhpcy5zbGljZWQ9dGhpcy5vcHRpb25zLnNsaWNlZD1DKGIpP2I6IXRoaXMuc2xpY2VkO2Qub3B0aW9ucy5kYXRhW2QuZGF0YS5pbmRleE9mKHRoaXMpXT10aGlzLm9wdGlvbnM7dGhpcy5ncmFwaGljJiZ0aGlzLmdyYXBoaWMuYW5pbWF0ZSh0aGlzLmdldFRyYW5zbGF0ZSgpKTtcbnRoaXMuc2hhZG93R3JvdXAmJnRoaXMuc2hhZG93R3JvdXAuYW5pbWF0ZSh0aGlzLmdldFRyYW5zbGF0ZSgpKX07cmV0dXJuIGZ9KGIpO2UoSS5wcm90b3R5cGUse2Nvbm5lY3RvclNoYXBlczp7Zml4ZWRPZmZzZXQ6ZnVuY3Rpb24oYixlLGQpe3ZhciBmPWUuYnJlYWtBdDtlPWUudG91Y2hpbmdTbGljZUF0O3JldHVybltbXCJNXCIsYi54LGIueV0sZC5zb2Z0Q29ubmVjdG9yP1tcIkNcIixiLngrKFwibGVmdFwiPT09Yi5hbGlnbm1lbnQ/LTU6NSksYi55LDIqZi54LWUueCwyKmYueS1lLnksZi54LGYueV06W1wiTFwiLGYueCxmLnldLFtcIkxcIixlLngsZS55XV19LHN0cmFpZ2h0OmZ1bmN0aW9uKGIsZSl7ZT1lLnRvdWNoaW5nU2xpY2VBdDtyZXR1cm5bW1wiTVwiLGIueCxiLnldLFtcIkxcIixlLngsZS55XV19LGNyb29rZWRMaW5lOmZ1bmN0aW9uKGIsZSxkKXtlPWUudG91Y2hpbmdTbGljZUF0O3ZhciBmPXRoaXMuc2VyaWVzLGs9Zi5jZW50ZXJbMF0sbD1mLmNoYXJ0LnBsb3RXaWR0aCx2PWYuY2hhcnQucGxvdExlZnQ7XG5mPWIuYWxpZ25tZW50O3ZhciB1PXRoaXMuc2hhcGVBcmdzLnI7ZD13KGQuY3Jvb2tEaXN0YW5jZSwxKTtsPVwibGVmdFwiPT09Zj9rK3UrKGwrdi1rLXUpKigxLWQpOnYrKGstdSkqZDtkPVtcIkxcIixsLGIueV07az0hMDtpZihcImxlZnRcIj09PWY/bD5iLnh8fGw8ZS54Omw8Yi54fHxsPmUueClrPSExO2I9W1tcIk1cIixiLngsYi55XV07ayYmYi5wdXNoKGQpO2IucHVzaChbXCJMXCIsZS54LGUueV0pO3JldHVybiBifX19KTtyZXR1cm4gSX0pO08oZSxcIlNlcmllcy9QaWUvUGllU2VyaWVzLmpzXCIsW2VbXCJNaXhpbnMvQ2VudGVyZWRTZXJpZXMuanNcIl0sZVtcIlNlcmllcy9Db2x1bW4vQ29sdW1uU2VyaWVzLmpzXCJdLGVbXCJDb3JlL0dsb2JhbHMuanNcIl0sZVtcIk1peGlucy9MZWdlbmRTeW1ib2wuanNcIl0sZVtcIkNvcmUvQ29sb3IvUGFsZXR0ZS5qc1wiXSxlW1wiU2VyaWVzL1BpZS9QaWVQb2ludC5qc1wiXSxlW1wiQ29yZS9TZXJpZXMvU2VyaWVzLmpzXCJdLGVbXCJDb3JlL1Nlcmllcy9TZXJpZXNSZWdpc3RyeS5qc1wiXSxcbmVbXCJDb3JlL1JlbmRlcmVyL1NWRy9TVkdSZW5kZXJlci5qc1wiXSxlW1wiQ29yZS9VdGlsaXRpZXMuanNcIl1dLGZ1bmN0aW9uKGUsYixJLHosSCxHLEMsQix4LHcpe3ZhciB2PXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbigpe3ZhciBiPWZ1bmN0aW9uKGQsZSl7Yj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oYixjKXtiLl9fcHJvdG9fXz1jfXx8ZnVuY3Rpb24oYixjKXtmb3IodmFyIGQgaW4gYyljLmhhc093blByb3BlcnR5KGQpJiYoYltkXT1jW2RdKX07cmV0dXJuIGIoZCxlKX07cmV0dXJuIGZ1bmN0aW9uKGQsZSl7ZnVuY3Rpb24gZigpe3RoaXMuY29uc3RydWN0b3I9ZH1iKGQsZSk7ZC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKTooZi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IGYpfX0oKSxmPWUuZ2V0U3RhcnRBbmRFbmRSYWRpYW5zO0k9SS5ub29wO3ZhciBkPXcuY2xhbXAscT1cbncuZXh0ZW5kLGs9dy5maXJlRXZlbnQsbD13Lm1lcmdlLEQ9dy5waWNrLHU9dy5yZWxhdGl2ZUxlbmd0aDt3PWZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGUoKXt2YXIgZD1udWxsIT09YiYmYi5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7ZC5jZW50ZXI9dm9pZCAwO2QuZGF0YT12b2lkIDA7ZC5tYXhMYWJlbERpc3RhbmNlPXZvaWQgMDtkLm9wdGlvbnM9dm9pZCAwO2QucG9pbnRzPXZvaWQgMDtyZXR1cm4gZH12KGUsYik7ZS5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihiKXt2YXIgZD10aGlzLGM9ZC5wb2ludHMsZT1kLnN0YXJ0QW5nbGVSYWQ7Ynx8Yy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBjPWEuZ3JhcGhpYyxiPWEuc2hhcGVBcmdzO2MmJmImJihjLmF0dHIoe3I6RChhLnN0YXJ0UixkLmNlbnRlciYmZC5jZW50ZXJbM10vMiksc3RhcnQ6ZSxlbmQ6ZX0pLGMuYW5pbWF0ZSh7cjpiLnIsc3RhcnQ6Yi5zdGFydCxlbmQ6Yi5lbmR9LGQub3B0aW9ucy5hbmltYXRpb24pKX0pfTtcbmUucHJvdG90eXBlLmRyYXdFbXB0eT1mdW5jdGlvbigpe3ZhciBiPXRoaXMuc3RhcnRBbmdsZVJhZCxkPXRoaXMuZW5kQW5nbGVSYWQsYz10aGlzLm9wdGlvbnM7aWYoMD09PXRoaXMudG90YWwmJnRoaXMuY2VudGVyKXt2YXIgZT10aGlzLmNlbnRlclswXTt2YXIgYT10aGlzLmNlbnRlclsxXTt0aGlzLmdyYXBofHwodGhpcy5ncmFwaD10aGlzLmNoYXJ0LnJlbmRlcmVyLmFyYyhlLGEsdGhpcy5jZW50ZXJbMV0vMiwwLGIsZCkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLWVtcHR5LXNlcmllc1wiKS5hZGQodGhpcy5ncm91cCkpO3RoaXMuZ3JhcGguYXR0cih7ZDp4LnByb3RvdHlwZS5zeW1ib2xzLmFyYyhlLGEsdGhpcy5jZW50ZXJbMl0vMiwwLHtzdGFydDpiLGVuZDpkLGlubmVyUjp0aGlzLmNlbnRlclszXS8yfSl9KTt0aGlzLmNoYXJ0LnN0eWxlZE1vZGV8fHRoaXMuZ3JhcGguYXR0cih7XCJzdHJva2Utd2lkdGhcIjpjLmJvcmRlcldpZHRoLGZpbGw6Yy5maWxsQ29sb3J8fFwibm9uZVwiLHN0cm9rZTpjLmNvbG9yfHxcbkgubmV1dHJhbENvbG9yMjB9KX1lbHNlIHRoaXMuZ3JhcGgmJih0aGlzLmdyYXBoPXRoaXMuZ3JhcGguZGVzdHJveSgpKX07ZS5wcm90b3R5cGUuZHJhd1BvaW50cz1mdW5jdGlvbigpe3ZhciBiPXRoaXMuY2hhcnQucmVuZGVyZXI7dGhpcy5wb2ludHMuZm9yRWFjaChmdW5jdGlvbihkKXtkLmdyYXBoaWMmJmQuaGFzTmV3U2hhcGVUeXBlKCkmJihkLmdyYXBoaWM9ZC5ncmFwaGljLmRlc3Ryb3koKSk7ZC5ncmFwaGljfHwoZC5ncmFwaGljPWJbZC5zaGFwZVR5cGVdKGQuc2hhcGVBcmdzKS5hZGQoZC5zZXJpZXMuZ3JvdXApLGQuZGVsYXllZFJlbmRlcmluZz0hMCl9KX07ZS5wcm90b3R5cGUuZ2VuZXJhdGVQb2ludHM9ZnVuY3Rpb24oKXtiLnByb3RvdHlwZS5nZW5lcmF0ZVBvaW50cy5jYWxsKHRoaXMpO3RoaXMudXBkYXRlVG90YWxzKCl9O2UucHJvdG90eXBlLmdldFg9ZnVuY3Rpb24oYixlLGMpe3ZhciBnPXRoaXMuY2VudGVyLGE9dGhpcy5yYWRpaT90aGlzLnJhZGlpW2MuaW5kZXhdfHxcbjA6Z1syXS8yO2I9TWF0aC5hc2luKGQoKGItZ1sxXSkvKGErYy5sYWJlbERpc3RhbmNlKSwtMSwxKSk7cmV0dXJuIGdbMF0rKGU/LTE6MSkqTWF0aC5jb3MoYikqKGErYy5sYWJlbERpc3RhbmNlKSsoMDxjLmxhYmVsRGlzdGFuY2U/KGU/LTE6MSkqdGhpcy5vcHRpb25zLmRhdGFMYWJlbHMucGFkZGluZzowKX07ZS5wcm90b3R5cGUuaGFzRGF0YT1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5wcm9jZXNzZWRYRGF0YS5sZW5ndGh9O2UucHJvdG90eXBlLnJlZHJhd1BvaW50cz1mdW5jdGlvbigpe3ZhciBiPXRoaXMsZD1iLmNoYXJ0LGM9ZC5yZW5kZXJlcixlLGEsaCxmLGs9Yi5vcHRpb25zLnNoYWRvdzt0aGlzLmRyYXdFbXB0eSgpOyFrfHxiLnNoYWRvd0dyb3VwfHxkLnN0eWxlZE1vZGV8fChiLnNoYWRvd0dyb3VwPWMuZyhcInNoYWRvd1wiKS5hdHRyKHt6SW5kZXg6LTF9KS5hZGQoYi5ncm91cCkpO2IucG9pbnRzLmZvckVhY2goZnVuY3Rpb24oZyl7dmFyIG09e307YT1nLmdyYXBoaWM7XG5pZighZy5pc051bGwmJmEpe3ZhciByPXZvaWQgMDtmPWcuc2hhcGVBcmdzO2U9Zy5nZXRUcmFuc2xhdGUoKTtkLnN0eWxlZE1vZGV8fChyPWcuc2hhZG93R3JvdXAsayYmIXImJihyPWcuc2hhZG93R3JvdXA9Yy5nKFwic2hhZG93XCIpLmFkZChiLnNoYWRvd0dyb3VwKSksciYmci5hdHRyKGUpLGg9Yi5wb2ludEF0dHJpYnMoZyxnLnNlbGVjdGVkJiZcInNlbGVjdFwiKSk7Zy5kZWxheWVkUmVuZGVyaW5nPyhhLnNldFJhZGlhbFJlZmVyZW5jZShiLmNlbnRlcikuYXR0cihmKS5hdHRyKGUpLGQuc3R5bGVkTW9kZXx8YS5hdHRyKGgpLmF0dHIoe1wic3Ryb2tlLWxpbmVqb2luXCI6XCJyb3VuZFwifSkuc2hhZG93KGssciksZy5kZWxheWVkUmVuZGVyaW5nPSExKTooYS5zZXRSYWRpYWxSZWZlcmVuY2UoYi5jZW50ZXIpLGQuc3R5bGVkTW9kZXx8bCghMCxtLGgpLGwoITAsbSxmLGUpLGEuYW5pbWF0ZShtKSk7YS5hdHRyKHt2aXNpYmlsaXR5OmcudmlzaWJsZT9cImluaGVyaXRcIjpcImhpZGRlblwifSk7YS5hZGRDbGFzcyhnLmdldENsYXNzTmFtZSgpLFxuITApfWVsc2UgYSYmKGcuZ3JhcGhpYz1hLmRlc3Ryb3koKSl9KX07ZS5wcm90b3R5cGUuc29ydEJ5QW5nbGU9ZnVuY3Rpb24oYixkKXtiLnNvcnQoZnVuY3Rpb24oYyxiKXtyZXR1cm5cInVuZGVmaW5lZFwiIT09dHlwZW9mIGMuYW5nbGUmJihiLmFuZ2xlLWMuYW5nbGUpKmR9KX07ZS5wcm90b3R5cGUudHJhbnNsYXRlPWZ1bmN0aW9uKGIpe3RoaXMuZ2VuZXJhdGVQb2ludHMoKTt2YXIgZD0wLGM9dGhpcy5vcHRpb25zLGU9Yy5zbGljZWRPZmZzZXQsYT1lKyhjLmJvcmRlcldpZHRofHwwKSxoPWYoYy5zdGFydEFuZ2xlLGMuZW5kQW5nbGUpLGw9dGhpcy5zdGFydEFuZ2xlUmFkPWguc3RhcnQ7aD0odGhpcy5lbmRBbmdsZVJhZD1oLmVuZCktbDt2YXIgbj10aGlzLnBvaW50cyxxPWMuZGF0YUxhYmVscy5kaXN0YW5jZTtjPWMuaWdub3JlSGlkZGVuUG9pbnQ7dmFyIHYsdz1uLmxlbmd0aDtifHwodGhpcy5jZW50ZXI9Yj10aGlzLmdldENlbnRlcigpKTtmb3Iodj0wO3Y8dzt2Kyspe3ZhciB4PVxublt2XTt2YXIgRT1sK2QqaDsheC5pc1ZhbGlkKCl8fGMmJiF4LnZpc2libGV8fChkKz14LnBlcmNlbnRhZ2UvMTAwKTt2YXIgej1sK2QqaDt2YXIgQj17eDpiWzBdLHk6YlsxXSxyOmJbMl0vMixpbm5lclI6YlszXS8yLHN0YXJ0Ok1hdGgucm91bmQoMUUzKkUpLzFFMyxlbmQ6TWF0aC5yb3VuZCgxRTMqeikvMUUzfTt4LnNoYXBlVHlwZT1cImFyY1wiO3guc2hhcGVBcmdzPUI7eC5sYWJlbERpc3RhbmNlPUQoeC5vcHRpb25zLmRhdGFMYWJlbHMmJngub3B0aW9ucy5kYXRhTGFiZWxzLmRpc3RhbmNlLHEpO3gubGFiZWxEaXN0YW5jZT11KHgubGFiZWxEaXN0YW5jZSxCLnIpO3RoaXMubWF4TGFiZWxEaXN0YW5jZT1NYXRoLm1heCh0aGlzLm1heExhYmVsRGlzdGFuY2V8fDAseC5sYWJlbERpc3RhbmNlKTt6PSh6K0UpLzI7ej4xLjUqTWF0aC5QST96LT0yKk1hdGguUEk6ejwtTWF0aC5QSS8yJiYoeis9MipNYXRoLlBJKTt4LnNsaWNlZFRyYW5zbGF0aW9uPXt0cmFuc2xhdGVYOk1hdGgucm91bmQoTWF0aC5jb3MoeikqXG5lKSx0cmFuc2xhdGVZOk1hdGgucm91bmQoTWF0aC5zaW4oeikqZSl9O0I9TWF0aC5jb3MoeikqYlsyXS8yO3ZhciB0PU1hdGguc2luKHopKmJbMl0vMjt4LnRvb2x0aXBQb3M9W2JbMF0rLjcqQixiWzFdKy43KnRdO3guaGFsZj16PC1NYXRoLlBJLzJ8fHo+TWF0aC5QSS8yPzE6MDt4LmFuZ2xlPXo7RT1NYXRoLm1pbihhLHgubGFiZWxEaXN0YW5jZS81KTt4LmxhYmVsUG9zaXRpb249e25hdHVyYWw6e3g6YlswXStCK01hdGguY29zKHopKngubGFiZWxEaXN0YW5jZSx5OmJbMV0rdCtNYXRoLnNpbih6KSp4LmxhYmVsRGlzdGFuY2V9LFwiZmluYWxcIjp7fSxhbGlnbm1lbnQ6MD54LmxhYmVsRGlzdGFuY2U/XCJjZW50ZXJcIjp4LmhhbGY/XCJyaWdodFwiOlwibGVmdFwiLGNvbm5lY3RvclBvc2l0aW9uOnticmVha0F0Ont4OmJbMF0rQitNYXRoLmNvcyh6KSpFLHk6YlsxXSt0K01hdGguc2luKHopKkV9LHRvdWNoaW5nU2xpY2VBdDp7eDpiWzBdK0IseTpiWzFdK3R9fX19ayh0aGlzLFwiYWZ0ZXJUcmFuc2xhdGVcIil9O1xuZS5wcm90b3R5cGUudXBkYXRlVG90YWxzPWZ1bmN0aW9uKCl7dmFyIGIsZD0wLGM9dGhpcy5wb2ludHMsZT1jLmxlbmd0aCxhPXRoaXMub3B0aW9ucy5pZ25vcmVIaWRkZW5Qb2ludDtmb3IoYj0wO2I8ZTtiKyspe3ZhciBoPWNbYl07IWguaXNWYWxpZCgpfHxhJiYhaC52aXNpYmxlfHwoZCs9aC55KX10aGlzLnRvdGFsPWQ7Zm9yKGI9MDtiPGU7YisrKWg9Y1tiXSxoLnBlcmNlbnRhZ2U9MDxkJiYoaC52aXNpYmxlfHwhYSk/aC55L2QqMTAwOjAsaC50b3RhbD1kfTtlLmRlZmF1bHRPcHRpb25zPWwoQy5kZWZhdWx0T3B0aW9ucyx7Y2VudGVyOltudWxsLG51bGxdLGNsaXA6ITEsY29sb3JCeVBvaW50OiEwLGRhdGFMYWJlbHM6e2FsbG93T3ZlcmxhcDohMCxjb25uZWN0b3JQYWRkaW5nOjUsY29ubmVjdG9yU2hhcGU6XCJmaXhlZE9mZnNldFwiLGNyb29rRGlzdGFuY2U6XCI3MCVcIixkaXN0YW5jZTozMCxlbmFibGVkOiEwLGZvcm1hdHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBvaW50LmlzTnVsbD9cbnZvaWQgMDp0aGlzLnBvaW50Lm5hbWV9LHNvZnRDb25uZWN0b3I6ITAseDowfSxmaWxsQ29sb3I6dm9pZCAwLGlnbm9yZUhpZGRlblBvaW50OiEwLGluYWN0aXZlT3RoZXJQb2ludHM6ITAsbGVnZW5kVHlwZTpcInBvaW50XCIsbWFya2VyOm51bGwsc2l6ZTpudWxsLHNob3dJbkxlZ2VuZDohMSxzbGljZWRPZmZzZXQ6MTAsc3RpY2t5VHJhY2tpbmc6ITEsdG9vbHRpcDp7Zm9sbG93UG9pbnRlcjohMH0sYm9yZGVyQ29sb3I6SC5iYWNrZ3JvdW5kQ29sb3IsYm9yZGVyV2lkdGg6MSxsaW5lV2lkdGg6dm9pZCAwLHN0YXRlczp7aG92ZXI6e2JyaWdodG5lc3M6LjF9fX0pO3JldHVybiBlfShDKTtxKHcucHJvdG90eXBlLHtheGlzVHlwZXM6W10sZGlyZWN0VG91Y2g6ITAsZHJhd0dyYXBoOnZvaWQgMCxkcmF3TGVnZW5kU3ltYm9sOnouZHJhd1JlY3RhbmdsZSxkcmF3VHJhY2tlcjpiLnByb3RvdHlwZS5kcmF3VHJhY2tlcixnZXRDZW50ZXI6ZS5nZXRDZW50ZXIsZ2V0U3ltYm9sOkksaXNDYXJ0ZXNpYW46ITEsXG5ub1NoYXJlZFRvb2x0aXA6ITAscG9pbnRBdHRyaWJzOmIucHJvdG90eXBlLnBvaW50QXR0cmlicyxwb2ludENsYXNzOkcscmVxdWlyZVNvcnRpbmc6ITEsc2VhcmNoUG9pbnQ6SSx0cmFja2VyR3JvdXBzOltcImdyb3VwXCIsXCJkYXRhTGFiZWxzR3JvdXBcIl19KTtCLnJlZ2lzdGVyU2VyaWVzVHlwZShcInBpZVwiLHcpO1wiXCI7cmV0dXJuIHd9KTtPKGUsXCJDb3JlL1Nlcmllcy9EYXRhTGFiZWxzLmpzXCIsW2VbXCJDb3JlL0FuaW1hdGlvbi9BbmltYXRpb25VdGlsaXRpZXMuanNcIl0sZVtcIkNvcmUvRm9ybWF0VXRpbGl0aWVzLmpzXCJdLGVbXCJDb3JlL0dsb2JhbHMuanNcIl0sZVtcIkNvcmUvQ29sb3IvUGFsZXR0ZS5qc1wiXSxlW1wiQ29yZS9TZXJpZXMvU2VyaWVzLmpzXCJdLGVbXCJDb3JlL1Nlcmllcy9TZXJpZXNSZWdpc3RyeS5qc1wiXSxlW1wiQ29yZS9VdGlsaXRpZXMuanNcIl1dLGZ1bmN0aW9uKGUsYixJLHosSCxHLEMpe3ZhciBEPWUuZ2V0RGVmZXJyZWRBbmltYXRpb24seD1iLmZvcm1hdDtlPUkubm9vcDtcbkc9Ry5zZXJpZXNUeXBlczt2YXIgdz1DLmFycmF5TWF4LHY9Qy5jbGFtcCxmPUMuZGVmaW5lZCxkPUMuZXh0ZW5kLHE9Qy5maXJlRXZlbnQsaz1DLmlzQXJyYXksbD1DLm1lcmdlLE49Qy5vYmplY3RFYWNoLHU9Qy5waWNrLG49Qy5yZWxhdGl2ZUxlbmd0aCxKPUMuc3BsYXQsRT1DLnN0YWJsZVNvcnQ7XCJcIjtJLmRpc3RyaWJ1dGU9ZnVuY3Rpb24oYixjLGQpe2Z1bmN0aW9uIGEoYSxjKXtyZXR1cm4gYS50YXJnZXQtYy50YXJnZXR9dmFyIGUsZz0hMCxmPWIsaz1bXTt2YXIgbD0wO3ZhciBtPWYucmVkdWNlZExlbnx8Yztmb3IoZT1iLmxlbmd0aDtlLS07KWwrPWJbZV0uc2l6ZTtpZihsPm0pe0UoYixmdW5jdGlvbihhLGMpe3JldHVybihjLnJhbmt8fDApLShhLnJhbmt8fDApfSk7Zm9yKGw9ZT0wO2w8PW07KWwrPWJbZV0uc2l6ZSxlKys7az1iLnNwbGljZShlLTEsYi5sZW5ndGgpfUUoYixhKTtmb3IoYj1iLm1hcChmdW5jdGlvbihhKXtyZXR1cm57c2l6ZTphLnNpemUsdGFyZ2V0czpbYS50YXJnZXRdLFxuYWxpZ246dShhLmFsaWduLC41KX19KTtnOyl7Zm9yKGU9Yi5sZW5ndGg7ZS0tOylnPWJbZV0sbD0oTWF0aC5taW4uYXBwbHkoMCxnLnRhcmdldHMpK01hdGgubWF4LmFwcGx5KDAsZy50YXJnZXRzKSkvMixnLnBvcz12KGwtZy5zaXplKmcuYWxpZ24sMCxjLWcuc2l6ZSk7ZT1iLmxlbmd0aDtmb3IoZz0hMTtlLS07KTA8ZSYmYltlLTFdLnBvcytiW2UtMV0uc2l6ZT5iW2VdLnBvcyYmKGJbZS0xXS5zaXplKz1iW2VdLnNpemUsYltlLTFdLnRhcmdldHM9YltlLTFdLnRhcmdldHMuY29uY2F0KGJbZV0udGFyZ2V0cyksYltlLTFdLmFsaWduPS41LGJbZS0xXS5wb3MrYltlLTFdLnNpemU+YyYmKGJbZS0xXS5wb3M9Yy1iW2UtMV0uc2l6ZSksYi5zcGxpY2UoZSwxKSxnPSEwKX1mLnB1c2guYXBwbHkoZixrKTtlPTA7Yi5zb21lKGZ1bmN0aW9uKGEpe3ZhciBiPTA7aWYoYS50YXJnZXRzLnNvbWUoZnVuY3Rpb24oKXtmW2VdLnBvcz1hLnBvcytiO2lmKFwidW5kZWZpbmVkXCIhPT10eXBlb2YgZCYmXG5NYXRoLmFicyhmW2VdLnBvcy1mW2VdLnRhcmdldCk+ZClyZXR1cm4gZi5zbGljZSgwLGUrMSkuZm9yRWFjaChmdW5jdGlvbihhKXtkZWxldGUgYS5wb3N9KSxmLnJlZHVjZWRMZW49KGYucmVkdWNlZExlbnx8YyktLjEqYyxmLnJlZHVjZWRMZW4+LjEqYyYmSS5kaXN0cmlidXRlKGYsYyxkKSwhMDtiKz1mW2VdLnNpemU7ZSsrfSkpcmV0dXJuITB9KTtFKGYsYSl9O0gucHJvdG90eXBlLmRyYXdEYXRhTGFiZWxzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYihhLGMpe3ZhciBiPWMuZmlsdGVyO3JldHVybiBiPyhjPWIub3BlcmF0b3IsYT1hW2IucHJvcGVydHldLGI9Yi52YWx1ZSxcIj5cIj09PWMmJmE+Ynx8XCI8XCI9PT1jJiZhPGJ8fFwiPj1cIj09PWMmJmE+PWJ8fFwiPD1cIj09PWMmJmE8PWJ8fFwiPT1cIj09PWMmJmE9PWJ8fFwiPT09XCI9PT1jJiZhPT09Yj8hMDohMSk6ITB9ZnVuY3Rpb24gYyhhLGMpe3ZhciBiPVtdLGQ7aWYoayhhKSYmIWsoYykpYj1hLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gbChhLGMpfSk7XG5lbHNlIGlmKGsoYykmJiFrKGEpKWI9Yy5tYXAoZnVuY3Rpb24oYyl7cmV0dXJuIGwoYSxjKX0pO2Vsc2UgaWYoayhhKXx8ayhjKSlmb3IoZD1NYXRoLm1heChhLmxlbmd0aCxjLmxlbmd0aCk7ZC0tOyliW2RdPWwoYVtkXSxjW2RdKTtlbHNlIGI9bChhLGMpO3JldHVybiBifXZhciBkPXRoaXMsYT1kLmNoYXJ0LGU9ZC5vcHRpb25zLHI9ZS5kYXRhTGFiZWxzLG49ZC5wb2ludHMsdix3PWQuaGFzUmVuZGVyZWR8fDAsRT1yLmFuaW1hdGlvbjtFPXIuZGVmZXI/RChhLEUsZCk6e2RlZmVyOjAsZHVyYXRpb246MH07dmFyIEI9YS5yZW5kZXJlcjtyPWMoYyhhLm9wdGlvbnMucGxvdE9wdGlvbnMmJmEub3B0aW9ucy5wbG90T3B0aW9ucy5zZXJpZXMmJmEub3B0aW9ucy5wbG90T3B0aW9ucy5zZXJpZXMuZGF0YUxhYmVscyxhLm9wdGlvbnMucGxvdE9wdGlvbnMmJmEub3B0aW9ucy5wbG90T3B0aW9uc1tkLnR5cGVdJiZhLm9wdGlvbnMucGxvdE9wdGlvbnNbZC50eXBlXS5kYXRhTGFiZWxzKSxcbnIpO3EodGhpcyxcImRyYXdEYXRhTGFiZWxzXCIpO2lmKGsocil8fHIuZW5hYmxlZHx8ZC5faGFzUG9pbnRMYWJlbHMpe3ZhciBDPWQucGxvdEdyb3VwKFwiZGF0YUxhYmVsc0dyb3VwXCIsXCJkYXRhLWxhYmVsc1wiLHc/XCJpbmhlcml0XCI6XCJoaWRkZW5cIixyLnpJbmRleHx8Nik7Qy5hdHRyKHtvcGFjaXR5Oit3fSk7IXcmJih3PWQuZGF0YUxhYmVsc0dyb3VwKSYmKGQudmlzaWJsZSYmQy5zaG93KCEwKSx3W2UuYW5pbWF0aW9uP1wiYW5pbWF0ZVwiOlwiYXR0clwiXSh7b3BhY2l0eToxfSxFKSk7bi5mb3JFYWNoKGZ1bmN0aW9uKGcpe3Y9SihjKHIsZy5kbE9wdGlvbnN8fGcub3B0aW9ucyYmZy5vcHRpb25zLmRhdGFMYWJlbHMpKTt2LmZvckVhY2goZnVuY3Rpb24oYyxoKXt2YXIgaz1jLmVuYWJsZWQmJighZy5pc051bGx8fGcuZGF0YUxhYmVsT25OdWxsKSYmYihnLGMpLGw9Zy5kYXRhTGFiZWxzP2cuZGF0YUxhYmVsc1toXTpnLmRhdGFMYWJlbCxtPWcuY29ubmVjdG9ycz9nLmNvbm5lY3RvcnNbaF06XG5nLmNvbm5lY3RvcixyPXUoYy5kaXN0YW5jZSxnLmxhYmVsRGlzdGFuY2UpLG49IWw7aWYoayl7dmFyIHE9Zy5nZXRMYWJlbENvbmZpZygpO3ZhciB0PXUoY1tnLmZvcm1hdFByZWZpeCtcIkZvcm1hdFwiXSxjLmZvcm1hdCk7cT1mKHQpP3godCxxLGEpOihjW2cuZm9ybWF0UHJlZml4K1wiRm9ybWF0dGVyXCJdfHxjLmZvcm1hdHRlcikuY2FsbChxLGMpO3Q9Yy5zdHlsZTt2YXIgdj1jLnJvdGF0aW9uO2Euc3R5bGVkTW9kZXx8KHQuY29sb3I9dShjLmNvbG9yLHQuY29sb3IsZC5jb2xvcix6Lm5ldXRyYWxDb2xvcjEwMCksXCJjb250cmFzdFwiPT09dC5jb2xvcj8oZy5jb250cmFzdENvbG9yPUIuZ2V0Q29udHJhc3QoZy5jb2xvcnx8ZC5jb2xvciksdC5jb2xvcj0hZihyKSYmYy5pbnNpZGV8fDA+cnx8ZS5zdGFja2luZz9nLmNvbnRyYXN0Q29sb3I6ei5uZXV0cmFsQ29sb3IxMDApOmRlbGV0ZSBnLmNvbnRyYXN0Q29sb3IsZS5jdXJzb3ImJih0LmN1cnNvcj1lLmN1cnNvcikpO3ZhciB3PXtyOmMuYm9yZGVyUmFkaXVzfHxcbjAscm90YXRpb246dixwYWRkaW5nOmMucGFkZGluZyx6SW5kZXg6MX07YS5zdHlsZWRNb2RlfHwody5maWxsPWMuYmFja2dyb3VuZENvbG9yLHcuc3Ryb2tlPWMuYm9yZGVyQ29sb3Isd1tcInN0cm9rZS13aWR0aFwiXT1jLmJvcmRlcldpZHRoKTtOKHcsZnVuY3Rpb24oYSxjKXtcInVuZGVmaW5lZFwiPT09dHlwZW9mIGEmJmRlbGV0ZSB3W2NdfSl9IWx8fGsmJmYocSk/ayYmZihxKSYmKGw/dy50ZXh0PXE6KGcuZGF0YUxhYmVscz1nLmRhdGFMYWJlbHN8fFtdLGw9Zy5kYXRhTGFiZWxzW2hdPXY/Qi50ZXh0KHEsMCwtOTk5OSxjLnVzZUhUTUwpLmFkZENsYXNzKFwiaGlnaGNoYXJ0cy1kYXRhLWxhYmVsXCIpOkIubGFiZWwocSwwLC05OTk5LGMuc2hhcGUsbnVsbCxudWxsLGMudXNlSFRNTCxudWxsLFwiZGF0YS1sYWJlbFwiKSxofHwoZy5kYXRhTGFiZWw9bCksbC5hZGRDbGFzcyhcIiBoaWdoY2hhcnRzLWRhdGEtbGFiZWwtY29sb3ItXCIrZy5jb2xvckluZGV4K1wiIFwiKyhjLmNsYXNzTmFtZXx8XCJcIikrXG4oYy51c2VIVE1MP1wiIGhpZ2hjaGFydHMtdHJhY2tlclwiOlwiXCIpKSksbC5vcHRpb25zPWMsbC5hdHRyKHcpLGEuc3R5bGVkTW9kZXx8bC5jc3ModCkuc2hhZG93KGMuc2hhZG93KSxsLmFkZGVkfHxsLmFkZChDKSxjLnRleHRQYXRoJiYhYy51c2VIVE1MJiYobC5zZXRUZXh0UGF0aChnLmdldERhdGFMYWJlbFBhdGgmJmcuZ2V0RGF0YUxhYmVsUGF0aChsKXx8Zy5ncmFwaGljLGMudGV4dFBhdGgpLGcuZGF0YUxhYmVsUGF0aCYmIWMudGV4dFBhdGguZW5hYmxlZCYmKGcuZGF0YUxhYmVsUGF0aD1nLmRhdGFMYWJlbFBhdGguZGVzdHJveSgpKSksZC5hbGlnbkRhdGFMYWJlbChnLGwsYyxudWxsLG4pKTooZy5kYXRhTGFiZWw9Zy5kYXRhTGFiZWwmJmcuZGF0YUxhYmVsLmRlc3Ryb3koKSxnLmRhdGFMYWJlbHMmJigxPT09Zy5kYXRhTGFiZWxzLmxlbmd0aD9kZWxldGUgZy5kYXRhTGFiZWxzOmRlbGV0ZSBnLmRhdGFMYWJlbHNbaF0pLGh8fGRlbGV0ZSBnLmRhdGFMYWJlbCxtJiYoZy5jb25uZWN0b3I9XG5nLmNvbm5lY3Rvci5kZXN0cm95KCksZy5jb25uZWN0b3JzJiYoMT09PWcuY29ubmVjdG9ycy5sZW5ndGg/ZGVsZXRlIGcuY29ubmVjdG9yczpkZWxldGUgZy5jb25uZWN0b3JzW2hdKSkpfSl9KX1xKHRoaXMsXCJhZnRlckRyYXdEYXRhTGFiZWxzXCIpfTtILnByb3RvdHlwZS5hbGlnbkRhdGFMYWJlbD1mdW5jdGlvbihiLGMsZSxhLGYpe3ZhciBnPXRoaXMsaD10aGlzLmNoYXJ0LGs9dGhpcy5pc0NhcnRlc2lhbiYmaC5pbnZlcnRlZCxsPXRoaXMuZW5hYmxlZERhdGFTb3J0aW5nLG09dShiLmRsQm94JiZiLmRsQm94LmNlbnRlclgsYi5wbG90WCwtOTk5OSksbj11KGIucGxvdFksLTk5OTkpLHE9Yy5nZXRCQm94KCksdj1lLnJvdGF0aW9uLHc9ZS5hbGlnbix0PWguaXNJbnNpZGVQbG90KG0sTWF0aC5yb3VuZChuKSx7aW52ZXJ0ZWQ6ayxwYW5lQ29vcmRpbmF0ZXM6ITAsc2VyaWVzOmd9KSxwPVwianVzdGlmeVwiPT09dShlLm92ZXJmbG93LGw/XCJub25lXCI6XCJqdXN0aWZ5XCIpLEQ9dGhpcy52aXNpYmxlJiZcbiExIT09Yi52aXNpYmxlJiYoYi5zZXJpZXMuZm9yY2VETHx8bCYmIXB8fHR8fHUoZS5pbnNpZGUsISF0aGlzLm9wdGlvbnMuc3RhY2tpbmcpJiZhJiZoLmlzSW5zaWRlUGxvdChtLGs/YS54KzE6YS55K2EuaGVpZ2h0LTEse2ludmVydGVkOmsscGFuZUNvb3JkaW5hdGVzOiEwLHNlcmllczpnfSkpO3ZhciB4PWZ1bmN0aW9uKGEpe2wmJmcueEF4aXMmJiFwJiZnLnNldERhdGFMYWJlbFN0YXJ0UG9zKGIsYyxmLHQsYSl9O2lmKEQpe3ZhciB6PWgucmVuZGVyZXIuZm9udE1ldHJpY3MoaC5zdHlsZWRNb2RlP3ZvaWQgMDplLnN0eWxlLmZvbnRTaXplLGMpLmI7YT1kKHt4Oms/dGhpcy55QXhpcy5sZW4tbjptLHk6TWF0aC5yb3VuZChrP3RoaXMueEF4aXMubGVuLW06biksd2lkdGg6MCxoZWlnaHQ6MH0sYSk7ZChlLHt3aWR0aDpxLndpZHRoLGhlaWdodDpxLmhlaWdodH0pO3Y/KHA9ITEsbT1oLnJlbmRlcmVyLnJvdENvcnIoeix2KSxtPXt4OmEueCsoZS54fHwwKSthLndpZHRoLzIrbS54LFxueTphLnkrKGUueXx8MCkre3RvcDowLG1pZGRsZTouNSxib3R0b206MX1bZS52ZXJ0aWNhbEFsaWduXSphLmhlaWdodH0seChtKSxjW2Y/XCJhdHRyXCI6XCJhbmltYXRlXCJdKG0pLmF0dHIoe2FsaWduOnd9KSx4PSh2KzcyMCklMzYwLHg9MTgwPHgmJjM2MD54LFwibGVmdFwiPT09dz9tLnktPXg/cS5oZWlnaHQ6MDpcImNlbnRlclwiPT09dz8obS54LT1xLndpZHRoLzIsbS55LT1xLmhlaWdodC8yKTpcInJpZ2h0XCI9PT13JiYobS54LT1xLndpZHRoLG0ueS09eD8wOnEuaGVpZ2h0KSxjLnBsYWNlZD0hMCxjLmFsaWduQXR0cj1tKTooeChhKSxjLmFsaWduKGUsdm9pZCAwLGEpLG09Yy5hbGlnbkF0dHIpO3AmJjA8PWEuaGVpZ2h0P3RoaXMuanVzdGlmeURhdGFMYWJlbChjLGUsbSxxLGEsZik6dShlLmNyb3AsITApJiYoRD1oLmlzSW5zaWRlUGxvdChtLngsbS55LHtwYW5lQ29vcmRpbmF0ZXM6ITAsc2VyaWVzOmd9KSYmaC5pc0luc2lkZVBsb3QobS54K3Eud2lkdGgsbS55K3EuaGVpZ2h0LHtwYW5lQ29vcmRpbmF0ZXM6ITAsXG5zZXJpZXM6Z30pKTtpZihlLnNoYXBlJiYhdiljW2Y/XCJhdHRyXCI6XCJhbmltYXRlXCJdKHthbmNob3JYOms/aC5wbG90V2lkdGgtYi5wbG90WTpiLnBsb3RYLGFuY2hvclk6az9oLnBsb3RIZWlnaHQtYi5wbG90WDpiLnBsb3RZfSl9ZiYmbCYmKGMucGxhY2VkPSExKTtEfHxsJiYhcHx8KGMuaGlkZSghMCksYy5wbGFjZWQ9ITEpfTtILnByb3RvdHlwZS5zZXREYXRhTGFiZWxTdGFydFBvcz1mdW5jdGlvbihiLGMsZCxhLGUpe3ZhciBnPXRoaXMuY2hhcnQsZj1nLmludmVydGVkLGg9dGhpcy54QXhpcyxrPWgucmV2ZXJzZWQsbD1mP2MuaGVpZ2h0LzI6Yy53aWR0aC8yO2I9KGI9Yi5wb2ludFdpZHRoKT9iLzI6MDtoPWY/ZS54Oms/LWwtYjpoLndpZHRoLWwrYjtlPWY/az90aGlzLnlBeGlzLmhlaWdodC1sK2I6LWwtYjplLnk7Yy5zdGFydFhQb3M9aDtjLnN0YXJ0WVBvcz1lO2E/XCJoaWRkZW5cIj09PWMudmlzaWJpbGl0eSYmKGMuc2hvdygpLGMuYXR0cih7b3BhY2l0eTowfSkuYW5pbWF0ZSh7b3BhY2l0eToxfSkpOlxuYy5hdHRyKHtvcGFjaXR5OjF9KS5hbmltYXRlKHtvcGFjaXR5OjB9LHZvaWQgMCxjLmhpZGUpO2cuaGFzUmVuZGVyZWQmJihkJiZjLmF0dHIoe3g6Yy5zdGFydFhQb3MseTpjLnN0YXJ0WVBvc30pLGMucGxhY2VkPSEwKX07SC5wcm90b3R5cGUuanVzdGlmeURhdGFMYWJlbD1mdW5jdGlvbihiLGMsZCxhLGUsZil7dmFyIGc9dGhpcy5jaGFydCxoPWMuYWxpZ24saz1jLnZlcnRpY2FsQWxpZ24sbD1iLmJveD8wOmIucGFkZGluZ3x8MCxtPWMueDttPXZvaWQgMD09PW0/MDptO3ZhciBuPWMueTt2YXIgcj12b2lkIDA9PT1uPzA6bjtuPShkLnh8fDApK2w7aWYoMD5uKXtcInJpZ2h0XCI9PT1oJiYwPD1tPyhjLmFsaWduPVwibGVmdFwiLGMuaW5zaWRlPSEwKTptLT1uO3ZhciBxPSEwfW49KGQueHx8MCkrYS53aWR0aC1sO24+Zy5wbG90V2lkdGgmJihcImxlZnRcIj09PWgmJjA+PW0/KGMuYWxpZ249XCJyaWdodFwiLGMuaW5zaWRlPSEwKTptKz1nLnBsb3RXaWR0aC1uLHE9ITApO249ZC55K2w7MD5uJiZcbihcImJvdHRvbVwiPT09ayYmMDw9cj8oYy52ZXJ0aWNhbEFsaWduPVwidG9wXCIsYy5pbnNpZGU9ITApOnItPW4scT0hMCk7bj0oZC55fHwwKSthLmhlaWdodC1sO24+Zy5wbG90SGVpZ2h0JiYoXCJ0b3BcIj09PWsmJjA+PXI/KGMudmVydGljYWxBbGlnbj1cImJvdHRvbVwiLGMuaW5zaWRlPSEwKTpyKz1nLnBsb3RIZWlnaHQtbixxPSEwKTtxJiYoYy54PW0sYy55PXIsYi5wbGFjZWQ9IWYsYi5hbGlnbihjLHZvaWQgMCxlKSk7cmV0dXJuIHF9O0cucGllJiYoRy5waWUucHJvdG90eXBlLmRhdGFMYWJlbFBvc2l0aW9uZXJzPXtyYWRpYWxEaXN0cmlidXRpb25ZOmZ1bmN0aW9uKGIpe3JldHVybiBiLnRvcCtiLmRpc3RyaWJ1dGVCb3gucG9zfSxyYWRpYWxEaXN0cmlidXRpb25YOmZ1bmN0aW9uKGIsYyxkLGEpe3JldHVybiBiLmdldFgoZDxjLnRvcCsyfHxkPmMuYm90dG9tLTI/YTpkLGMuaGFsZixjKX0sanVzdGlmeTpmdW5jdGlvbihiLGMsZCl7cmV0dXJuIGRbMF0rKGIuaGFsZj8tMToxKSooYytiLmxhYmVsRGlzdGFuY2UpfSxcbmFsaWduVG9QbG90RWRnZXM6ZnVuY3Rpb24oYixjLGQsYSl7Yj1iLmdldEJCb3goKS53aWR0aDtyZXR1cm4gYz9iK2E6ZC1iLWF9LGFsaWduVG9Db25uZWN0b3JzOmZ1bmN0aW9uKGIsYyxkLGEpe3ZhciBlPTAsZztiLmZvckVhY2goZnVuY3Rpb24oYSl7Zz1hLmRhdGFMYWJlbC5nZXRCQm94KCkud2lkdGg7Zz5lJiYoZT1nKX0pO3JldHVybiBjP2UrYTpkLWUtYX19LEcucGllLnByb3RvdHlwZS5kcmF3RGF0YUxhYmVscz1mdW5jdGlvbigpe3ZhciBiPXRoaXMsYz1iLmRhdGEsZCxhPWIuY2hhcnQsZT1iLm9wdGlvbnMuZGF0YUxhYmVsc3x8e30saz1lLmNvbm5lY3RvclBhZGRpbmcsbixxPWEucGxvdFdpZHRoLHY9YS5wbG90SGVpZ2h0LHg9YS5wbG90TGVmdCxEPU1hdGgucm91bmQoYS5jaGFydFdpZHRoLzMpLEUsQj1iLmNlbnRlcixDPUJbMl0vMix0PUJbMV0scCxHLEosTixGPVtbXSxbXV0sTyxLLFQsWCxVPVswLDAsMCwwXSxXPWIuZGF0YUxhYmVsUG9zaXRpb25lcnMsWTtiLnZpc2libGUmJlxuKGUuZW5hYmxlZHx8Yi5faGFzUG9pbnRMYWJlbHMpJiYoYy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuZGF0YUxhYmVsJiZhLnZpc2libGUmJmEuZGF0YUxhYmVsLnNob3J0ZW5lZCYmKGEuZGF0YUxhYmVsLmF0dHIoe3dpZHRoOlwiYXV0b1wifSkuY3NzKHt3aWR0aDpcImF1dG9cIix0ZXh0T3ZlcmZsb3c6XCJjbGlwXCJ9KSxhLmRhdGFMYWJlbC5zaG9ydGVuZWQ9ITEpfSksSC5wcm90b3R5cGUuZHJhd0RhdGFMYWJlbHMuYXBwbHkoYiksYy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuZGF0YUxhYmVsJiYoYS52aXNpYmxlPyhGW2EuaGFsZl0ucHVzaChhKSxhLmRhdGFMYWJlbC5fcG9zPW51bGwsIWYoZS5zdHlsZS53aWR0aCkmJiFmKGEub3B0aW9ucy5kYXRhTGFiZWxzJiZhLm9wdGlvbnMuZGF0YUxhYmVscy5zdHlsZSYmYS5vcHRpb25zLmRhdGFMYWJlbHMuc3R5bGUud2lkdGgpJiZhLmRhdGFMYWJlbC5nZXRCQm94KCkud2lkdGg+RCYmKGEuZGF0YUxhYmVsLmNzcyh7d2lkdGg6TWF0aC5yb3VuZCguNypcbkQpK1wicHhcIn0pLGEuZGF0YUxhYmVsLnNob3J0ZW5lZD0hMCkpOihhLmRhdGFMYWJlbD1hLmRhdGFMYWJlbC5kZXN0cm95KCksYS5kYXRhTGFiZWxzJiYxPT09YS5kYXRhTGFiZWxzLmxlbmd0aCYmZGVsZXRlIGEuZGF0YUxhYmVscykpfSksRi5mb3JFYWNoKGZ1bmN0aW9uKGMsZyl7dmFyIGg9Yy5sZW5ndGgsbD1bXSxtO2lmKGgpe2Iuc29ydEJ5QW5nbGUoYyxnLS41KTtpZigwPGIubWF4TGFiZWxEaXN0YW5jZSl7dmFyIG49TWF0aC5tYXgoMCx0LUMtYi5tYXhMYWJlbERpc3RhbmNlKTt2YXIgcj1NYXRoLm1pbih0K0MrYi5tYXhMYWJlbERpc3RhbmNlLGEucGxvdEhlaWdodCk7Yy5mb3JFYWNoKGZ1bmN0aW9uKGIpezA8Yi5sYWJlbERpc3RhbmNlJiZiLmRhdGFMYWJlbCYmKGIudG9wPU1hdGgubWF4KDAsdC1DLWIubGFiZWxEaXN0YW5jZSksYi5ib3R0b209TWF0aC5taW4odCtDK2IubGFiZWxEaXN0YW5jZSxhLnBsb3RIZWlnaHQpLG09Yi5kYXRhTGFiZWwuZ2V0QkJveCgpLmhlaWdodHx8XG4yMSxiLmRpc3RyaWJ1dGVCb3g9e3RhcmdldDpiLmxhYmVsUG9zaXRpb24ubmF0dXJhbC55LWIudG9wK20vMixzaXplOm0scmFuazpiLnl9LGwucHVzaChiLmRpc3RyaWJ1dGVCb3gpKX0pO249cittLW47SS5kaXN0cmlidXRlKGwsbixuLzUpfWZvcihYPTA7WDxoO1grKyl7ZD1jW1hdO0o9ZC5sYWJlbFBvc2l0aW9uO3A9ZC5kYXRhTGFiZWw7VD0hMT09PWQudmlzaWJsZT9cImhpZGRlblwiOlwiaW5oZXJpdFwiO0s9bj1KLm5hdHVyYWwueTtsJiZmKGQuZGlzdHJpYnV0ZUJveCkmJihcInVuZGVmaW5lZFwiPT09dHlwZW9mIGQuZGlzdHJpYnV0ZUJveC5wb3M/VD1cImhpZGRlblwiOihOPWQuZGlzdHJpYnV0ZUJveC5zaXplLEs9Vy5yYWRpYWxEaXN0cmlidXRpb25ZKGQpKSk7ZGVsZXRlIGQucG9zaXRpb25JbmRleDtpZihlLmp1c3RpZnkpTz1XLmp1c3RpZnkoZCxDLEIpO2Vsc2Ugc3dpdGNoKGUuYWxpZ25Ubyl7Y2FzZSBcImNvbm5lY3RvcnNcIjpPPVcuYWxpZ25Ub0Nvbm5lY3RvcnMoYyxnLHEseCk7XG5icmVhaztjYXNlIFwicGxvdEVkZ2VzXCI6Tz1XLmFsaWduVG9QbG90RWRnZXMocCxnLHEseCk7YnJlYWs7ZGVmYXVsdDpPPVcucmFkaWFsRGlzdHJpYnV0aW9uWChiLGQsSyxuKX1wLl9hdHRyPXt2aXNpYmlsaXR5OlQsYWxpZ246Si5hbGlnbm1lbnR9O1k9ZC5vcHRpb25zLmRhdGFMYWJlbHN8fHt9O3AuX3Bvcz17eDpPK3UoWS54LGUueCkrKHtsZWZ0OmsscmlnaHQ6LWt9W0ouYWxpZ25tZW50XXx8MCkseTpLK3UoWS55LGUueSktMTB9O0ouZmluYWwueD1PO0ouZmluYWwueT1LO3UoZS5jcm9wLCEwKSYmKEc9cC5nZXRCQm94KCkud2lkdGgsbj1udWxsLE8tRzxrJiYxPT09Zz8obj1NYXRoLnJvdW5kKEctTytrKSxVWzNdPU1hdGgubWF4KG4sVVszXSkpOk8rRz5xLWsmJjA9PT1nJiYobj1NYXRoLnJvdW5kKE8rRy1xK2spLFVbMV09TWF0aC5tYXgobixVWzFdKSksMD5LLU4vMj9VWzBdPU1hdGgubWF4KE1hdGgucm91bmQoLUsrTi8yKSxVWzBdKTpLK04vMj52JiYoVVsyXT1NYXRoLm1heChNYXRoLnJvdW5kKEsrXG5OLzItdiksVVsyXSkpLHAuc2lkZU92ZXJmbG93PW4pfX19KSwwPT09dyhVKXx8dGhpcy52ZXJpZnlEYXRhTGFiZWxPdmVyZmxvdyhVKSkmJih0aGlzLnBsYWNlRGF0YUxhYmVscygpLHRoaXMucG9pbnRzLmZvckVhY2goZnVuY3Rpb24oYyl7WT1sKGUsYy5vcHRpb25zLmRhdGFMYWJlbHMpO2lmKG49dShZLmNvbm5lY3RvcldpZHRoLDEpKXt2YXIgZDtFPWMuY29ubmVjdG9yO2lmKChwPWMuZGF0YUxhYmVsKSYmcC5fcG9zJiZjLnZpc2libGUmJjA8Yy5sYWJlbERpc3RhbmNlKXtUPXAuX2F0dHIudmlzaWJpbGl0eTtpZihkPSFFKWMuY29ubmVjdG9yPUU9YS5yZW5kZXJlci5wYXRoKCkuYWRkQ2xhc3MoXCJoaWdoY2hhcnRzLWRhdGEtbGFiZWwtY29ubmVjdG9yICBoaWdoY2hhcnRzLWNvbG9yLVwiK2MuY29sb3JJbmRleCsoYy5jbGFzc05hbWU/XCIgXCIrYy5jbGFzc05hbWU6XCJcIikpLmFkZChiLmRhdGFMYWJlbHNHcm91cCksYS5zdHlsZWRNb2RlfHxFLmF0dHIoe1wic3Ryb2tlLXdpZHRoXCI6bixcbnN0cm9rZTpZLmNvbm5lY3RvckNvbG9yfHxjLmNvbG9yfHx6Lm5ldXRyYWxDb2xvcjYwfSk7RVtkP1wiYXR0clwiOlwiYW5pbWF0ZVwiXSh7ZDpjLmdldENvbm5lY3RvclBhdGgoKX0pO0UuYXR0cihcInZpc2liaWxpdHlcIixUKX1lbHNlIEUmJihjLmNvbm5lY3Rvcj1FLmRlc3Ryb3koKSl9fSkpfSxHLnBpZS5wcm90b3R5cGUucGxhY2VEYXRhTGFiZWxzPWZ1bmN0aW9uKCl7dGhpcy5wb2ludHMuZm9yRWFjaChmdW5jdGlvbihiKXt2YXIgYz1iLmRhdGFMYWJlbCxkO2MmJmIudmlzaWJsZSYmKChkPWMuX3Bvcyk/KGMuc2lkZU92ZXJmbG93JiYoYy5fYXR0ci53aWR0aD1NYXRoLm1heChjLmdldEJCb3goKS53aWR0aC1jLnNpZGVPdmVyZmxvdywwKSxjLmNzcyh7d2lkdGg6Yy5fYXR0ci53aWR0aCtcInB4XCIsdGV4dE92ZXJmbG93Oih0aGlzLm9wdGlvbnMuZGF0YUxhYmVscy5zdHlsZXx8e30pLnRleHRPdmVyZmxvd3x8XCJlbGxpcHNpc1wifSksYy5zaG9ydGVuZWQ9ITApLGMuYXR0cihjLl9hdHRyKSxcbmNbYy5tb3ZlZD9cImFuaW1hdGVcIjpcImF0dHJcIl0oZCksYy5tb3ZlZD0hMCk6YyYmYy5hdHRyKHt5Oi05OTk5fSkpO2RlbGV0ZSBiLmRpc3RyaWJ1dGVCb3h9LHRoaXMpfSxHLnBpZS5wcm90b3R5cGUuYWxpZ25EYXRhTGFiZWw9ZSxHLnBpZS5wcm90b3R5cGUudmVyaWZ5RGF0YUxhYmVsT3ZlcmZsb3c9ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5jZW50ZXIsZD10aGlzLm9wdGlvbnMsYT1kLmNlbnRlcixlPWQubWluU2l6ZXx8ODAsZj1udWxsIT09ZC5zaXplO2lmKCFmKXtpZihudWxsIT09YVswXSl2YXIgaz1NYXRoLm1heChjWzJdLU1hdGgubWF4KGJbMV0sYlszXSksZSk7ZWxzZSBrPU1hdGgubWF4KGNbMl0tYlsxXS1iWzNdLGUpLGNbMF0rPShiWzNdLWJbMV0pLzI7bnVsbCE9PWFbMV0/az12KGssZSxjWzJdLU1hdGgubWF4KGJbMF0sYlsyXSkpOihrPXYoayxlLGNbMl0tYlswXS1iWzJdKSxjWzFdKz0oYlswXS1iWzJdKS8yKTtrPGNbMl0/KGNbMl09ayxjWzNdPU1hdGgubWluKG4oZC5pbm5lclNpemV8fFxuMCxrKSxrKSx0aGlzLnRyYW5zbGF0ZShjKSx0aGlzLmRyYXdEYXRhTGFiZWxzJiZ0aGlzLmRyYXdEYXRhTGFiZWxzKCkpOmY9ITB9cmV0dXJuIGZ9KTtHLmNvbHVtbiYmKEcuY29sdW1uLnByb3RvdHlwZS5hbGlnbkRhdGFMYWJlbD1mdW5jdGlvbihiLGMsZCxhLGUpe3ZhciBmPXRoaXMuY2hhcnQuaW52ZXJ0ZWQsZz1iLnNlcmllcyxoPWIuZGxCb3h8fGIuc2hhcGVBcmdzLGs9dShiLmJlbG93LGIucGxvdFk+dSh0aGlzLnRyYW5zbGF0ZWRUaHJlc2hvbGQsZy55QXhpcy5sZW4pKSxtPXUoZC5pbnNpZGUsISF0aGlzLm9wdGlvbnMuc3RhY2tpbmcpO2gmJihhPWwoaCksMD5hLnkmJihhLmhlaWdodCs9YS55LGEueT0wKSxoPWEueSthLmhlaWdodC1nLnlBeGlzLmxlbiwwPGgmJmg8YS5oZWlnaHQmJihhLmhlaWdodC09aCksZiYmKGE9e3g6Zy55QXhpcy5sZW4tYS55LWEuaGVpZ2h0LHk6Zy54QXhpcy5sZW4tYS54LWEud2lkdGgsd2lkdGg6YS5oZWlnaHQsaGVpZ2h0OmEud2lkdGh9KSxtfHxcbihmPyhhLngrPWs/MDphLndpZHRoLGEud2lkdGg9MCk6KGEueSs9az9hLmhlaWdodDowLGEuaGVpZ2h0PTApKSk7ZC5hbGlnbj11KGQuYWxpZ24sIWZ8fG0/XCJjZW50ZXJcIjprP1wicmlnaHRcIjpcImxlZnRcIik7ZC52ZXJ0aWNhbEFsaWduPXUoZC52ZXJ0aWNhbEFsaWduLGZ8fG0/XCJtaWRkbGVcIjprP1widG9wXCI6XCJib3R0b21cIik7SC5wcm90b3R5cGUuYWxpZ25EYXRhTGFiZWwuY2FsbCh0aGlzLGIsYyxkLGEsZSk7ZC5pbnNpZGUmJmIuY29udHJhc3RDb2xvciYmYy5jc3Moe2NvbG9yOmIuY29udHJhc3RDb2xvcn0pfSl9KTtPKGUsXCJFeHRlbnNpb25zL092ZXJsYXBwaW5nRGF0YUxhYmVscy5qc1wiLFtlW1wiQ29yZS9DaGFydC9DaGFydC5qc1wiXSxlW1wiQ29yZS9VdGlsaXRpZXMuanNcIl1dLGZ1bmN0aW9uKGUsYil7ZnVuY3Rpb24gRChiLGUpe3ZhciBmPSExO2lmKGIpe3ZhciBkPWIubmV3T3BhY2l0eTtiLm9sZE9wYWNpdHkhPT1kJiYoYi5hbGlnbkF0dHImJmIucGxhY2VkPyhiW2Q/XCJyZW1vdmVDbGFzc1wiOlxuXCJhZGRDbGFzc1wiXShcImhpZ2hjaGFydHMtZGF0YS1sYWJlbC1oaWRkZW5cIiksZj0hMCxiLmFsaWduQXR0ci5vcGFjaXR5PWQsYltiLmlzT2xkP1wiYW5pbWF0ZVwiOlwiYXR0clwiXShiLmFsaWduQXR0cixudWxsLGZ1bmN0aW9uKCl7ZS5zdHlsZWRNb2RlfHxiLmNzcyh7cG9pbnRlckV2ZW50czpkP1wiYXV0b1wiOlwibm9uZVwifSk7Yi52aXNpYmlsaXR5PWQ/XCJpbmhlcml0XCI6XCJoaWRkZW5cIn0pLEgoZSxcImFmdGVySGlkZU92ZXJsYXBwaW5nTGFiZWxcIikpOmIuYXR0cih7b3BhY2l0eTpkfSkpO2IuaXNPbGQ9ITB9cmV0dXJuIGZ9dmFyIHo9Yi5hZGRFdmVudCxIPWIuZmlyZUV2ZW50LEc9Yi5pc0FycmF5LEM9Yi5pc051bWJlcixCPWIub2JqZWN0RWFjaCx4PWIucGljazt6KGUsXCJyZW5kZXJcIixmdW5jdGlvbigpe3ZhciBiPXRoaXMsZT1bXTsodGhpcy5sYWJlbENvbGxlY3RvcnN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2U9ZS5jb25jYXQoYigpKX0pOyh0aGlzLnlBeGlzfHxbXSkuZm9yRWFjaChmdW5jdGlvbihiKXtiLnN0YWNraW5nJiZcbmIub3B0aW9ucy5zdGFja0xhYmVscyYmIWIub3B0aW9ucy5zdGFja0xhYmVscy5hbGxvd092ZXJsYXAmJkIoYi5zdGFja2luZy5zdGFja3MsZnVuY3Rpb24oYil7QihiLGZ1bmN0aW9uKGIpe2UucHVzaChiLmxhYmVsKX0pfSl9KTsodGhpcy5zZXJpZXN8fFtdKS5mb3JFYWNoKGZ1bmN0aW9uKGYpe3ZhciBkPWYub3B0aW9ucy5kYXRhTGFiZWxzO2YudmlzaWJsZSYmKCExIT09ZC5lbmFibGVkfHxmLl9oYXNQb2ludExhYmVscykmJihkPWZ1bmN0aW9uKGQpe3JldHVybiBkLmZvckVhY2goZnVuY3Rpb24oZCl7ZC52aXNpYmxlJiYoRyhkLmRhdGFMYWJlbHMpP2QuZGF0YUxhYmVsczpkLmRhdGFMYWJlbD9bZC5kYXRhTGFiZWxdOltdKS5mb3JFYWNoKGZ1bmN0aW9uKGYpe3ZhciBrPWYub3B0aW9ucztmLmxhYmVscmFuaz14KGsubGFiZWxyYW5rLGQubGFiZWxyYW5rLGQuc2hhcGVBcmdzJiZkLnNoYXBlQXJncy5oZWlnaHQpO2suYWxsb3dPdmVybGFwPyhmLm9sZE9wYWNpdHk9Zi5vcGFjaXR5LFxuZi5uZXdPcGFjaXR5PTEsRChmLGIpKTplLnB1c2goZil9KX0pfSxkKGYubm9kZXN8fFtdKSxkKGYucG9pbnRzKSl9KTt0aGlzLmhpZGVPdmVybGFwcGluZ0xhYmVscyhlKX0pO2UucHJvdG90eXBlLmhpZGVPdmVybGFwcGluZ0xhYmVscz1mdW5jdGlvbihiKXt2YXIgZT10aGlzLGY9Yi5sZW5ndGgsZD1lLnJlbmRlcmVyLHEsayxsLHc9ITE7dmFyIHU9ZnVuY3Rpb24oYil7dmFyIGUsYz1iLmJveD8wOmIucGFkZGluZ3x8MCxmPWU9MCxhO2lmKGImJighYi5hbGlnbkF0dHJ8fGIucGxhY2VkKSl7dmFyIGg9Yi5hbGlnbkF0dHJ8fHt4OmIuYXR0cihcInhcIikseTpiLmF0dHIoXCJ5XCIpfTt2YXIgaz1iLnBhcmVudEdyb3VwO2Iud2lkdGh8fChlPWIuZ2V0QkJveCgpLGIud2lkdGg9ZS53aWR0aCxiLmhlaWdodD1lLmhlaWdodCxlPWQuZm9udE1ldHJpY3MobnVsbCxiLmVsZW1lbnQpLmgpO3ZhciBsPWIud2lkdGgtMipjOyhhPXtsZWZ0OlwiMFwiLGNlbnRlcjpcIjAuNVwiLHJpZ2h0OlwiMVwifVtiLmFsaWduVmFsdWVdKT9cbmY9K2EqbDpDKGIueCkmJk1hdGgucm91bmQoYi54KSE9PWIudHJhbnNsYXRlWCYmKGY9Yi54LWIudHJhbnNsYXRlWCk7cmV0dXJue3g6aC54KyhrLnRyYW5zbGF0ZVh8fDApK2MtKGZ8fDApLHk6aC55KyhrLnRyYW5zbGF0ZVl8fDApK2MtZSx3aWR0aDpiLndpZHRoLTIqYyxoZWlnaHQ6Yi5oZWlnaHQtMipjfX19O2ZvcihrPTA7azxmO2srKylpZihxPWJba10pcS5vbGRPcGFjaXR5PXEub3BhY2l0eSxxLm5ld09wYWNpdHk9MSxxLmFic29sdXRlQm94PXUocSk7Yi5zb3J0KGZ1bmN0aW9uKGIsZCl7cmV0dXJuKGQubGFiZWxyYW5rfHwwKS0oYi5sYWJlbHJhbmt8fDApfSk7Zm9yKGs9MDtrPGY7aysrKXt2YXIgbj0odT1iW2tdKSYmdS5hYnNvbHV0ZUJveDtmb3IocT1rKzE7cTxmOysrcSl7dmFyIHg9KGw9YltxXSkmJmwuYWJzb2x1dGVCb3g7IW58fCF4fHx1PT09bHx8MD09PXUubmV3T3BhY2l0eXx8MD09PWwubmV3T3BhY2l0eXx8eC54Pj1uLngrbi53aWR0aHx8eC54K3gud2lkdGg8PVxubi54fHx4Lnk+PW4ueStuLmhlaWdodHx8eC55K3guaGVpZ2h0PD1uLnl8fCgodS5sYWJlbHJhbms8bC5sYWJlbHJhbms/dTpsKS5uZXdPcGFjaXR5PTApfX1iLmZvckVhY2goZnVuY3Rpb24oYil7RChiLGUpJiYodz0hMCl9KTt3JiZIKGUsXCJhZnRlckhpZGVBbGxPdmVybGFwcGluZ0xhYmVsc1wiKX19KTtPKGUsXCJDb3JlL1Jlc3BvbnNpdmUuanNcIixbZVtcIkNvcmUvQ2hhcnQvQ2hhcnQuanNcIl0sZVtcIkNvcmUvVXRpbGl0aWVzLmpzXCJdXSxmdW5jdGlvbihlLGIpe3ZhciBEPWIuZmluZCx6PWIuaXNBcnJheSxIPWIuaXNPYmplY3QsRz1iLm1lcmdlLEM9Yi5vYmplY3RFYWNoLEI9Yi5waWNrLHg9Yi5zcGxhdCx3PWIudW5pcXVlS2V5O2UucHJvdG90eXBlLnNldFJlc3BvbnNpdmU9ZnVuY3Rpb24oYixlKXt2YXIgZD10aGlzLm9wdGlvbnMucmVzcG9uc2l2ZSxmPVtdLGs9dGhpcy5jdXJyZW50UmVzcG9uc2l2ZTshZSYmZCYmZC5ydWxlcyYmZC5ydWxlcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe1widW5kZWZpbmVkXCI9PT1cbnR5cGVvZiBiLl9pZCYmKGIuX2lkPXcoKSk7dGhpcy5tYXRjaFJlc3BvbnNpdmVSdWxlKGIsZil9LHRoaXMpO2U9Ry5hcHBseSgwLGYubWFwKGZ1bmN0aW9uKGIpe3JldHVybiBEKGQucnVsZXMsZnVuY3Rpb24oZCl7cmV0dXJuIGQuX2lkPT09Yn0pLmNoYXJ0T3B0aW9uc30pKTtlLmlzUmVzcG9uc2l2ZU9wdGlvbnM9ITA7Zj1mLnRvU3RyaW5nKCl8fHZvaWQgMDtmIT09KGsmJmsucnVsZUlkcykmJihrJiZ0aGlzLnVwZGF0ZShrLnVuZG9PcHRpb25zLGIsITApLGY/KGs9dGhpcy5jdXJyZW50T3B0aW9ucyhlKSxrLmlzUmVzcG9uc2l2ZU9wdGlvbnM9ITAsdGhpcy5jdXJyZW50UmVzcG9uc2l2ZT17cnVsZUlkczpmLG1lcmdlZE9wdGlvbnM6ZSx1bmRvT3B0aW9uczprfSx0aGlzLnVwZGF0ZShlLGIsITApKTp0aGlzLmN1cnJlbnRSZXNwb25zaXZlPXZvaWQgMCl9O2UucHJvdG90eXBlLm1hdGNoUmVzcG9uc2l2ZVJ1bGU9ZnVuY3Rpb24oYixlKXt2YXIgZD1iLmNvbmRpdGlvbjsoZC5jYWxsYmFja3x8XG5mdW5jdGlvbigpe3JldHVybiB0aGlzLmNoYXJ0V2lkdGg8PUIoZC5tYXhXaWR0aCxOdW1iZXIuTUFYX1ZBTFVFKSYmdGhpcy5jaGFydEhlaWdodDw9QihkLm1heEhlaWdodCxOdW1iZXIuTUFYX1ZBTFVFKSYmdGhpcy5jaGFydFdpZHRoPj1CKGQubWluV2lkdGgsMCkmJnRoaXMuY2hhcnRIZWlnaHQ+PUIoZC5taW5IZWlnaHQsMCl9KS5jYWxsKHRoaXMpJiZlLnB1c2goYi5faWQpfTtlLnByb3RvdHlwZS5jdXJyZW50T3B0aW9ucz1mdW5jdGlvbihiKXtmdW5jdGlvbiBlKGIsZixxLHUpe3ZhciBrO0MoYixmdW5jdGlvbihiLGwpe2lmKCF1JiYtMTxkLmNvbGxlY3Rpb25zV2l0aFVwZGF0ZS5pbmRleE9mKGwpJiZmW2xdKWZvcihiPXgoYikscVtsXT1bXSxrPTA7azxNYXRoLm1heChiLmxlbmd0aCxmW2xdLmxlbmd0aCk7aysrKWZbbF1ba10mJih2b2lkIDA9PT1iW2tdP3FbbF1ba109ZltsXVtrXToocVtsXVtrXT17fSxlKGJba10sZltsXVtrXSxxW2xdW2tdLHUrMSkpKTtlbHNlIEgoYik/XG4ocVtsXT16KGIpP1tdOnt9LGUoYixmW2xdfHx7fSxxW2xdLHUrMSkpOnFbbF09XCJ1bmRlZmluZWRcIj09PXR5cGVvZiBmW2xdP251bGw6ZltsXX0pfXZhciBkPXRoaXMscT17fTtlKGIsdGhpcy5vcHRpb25zLHEsMCk7cmV0dXJuIHF9fSk7TyhlLFwibWFzdGVycy9oaWdoY2hhcnRzLnNyYy5qc1wiLFtlW1wiQ29yZS9HbG9iYWxzLmpzXCJdLGVbXCJDb3JlL1V0aWxpdGllcy5qc1wiXSxlW1wiQ29yZS9PcHRpb25zLmpzXCJdLGVbXCJDb3JlL0FuaW1hdGlvbi9GeC5qc1wiXSxlW1wiQ29yZS9BbmltYXRpb24vQW5pbWF0aW9uVXRpbGl0aWVzLmpzXCJdLGVbXCJDb3JlL1JlbmRlcmVyL0hUTUwvQVNULmpzXCJdLGVbXCJDb3JlL0Zvcm1hdFV0aWxpdGllcy5qc1wiXSxlW1wiQ29yZS9SZW5kZXJlci9TVkcvU1ZHRWxlbWVudC5qc1wiXSxlW1wiQ29yZS9TZXJpZXMvU2VyaWVzLmpzXCJdXSxmdW5jdGlvbihlLGIsSSx6LEgsRyxDLEIseCl7ZS5hbmltYXRlPUguYW5pbWF0ZTtlLmFuaW1PYmplY3Q9SC5hbmltT2JqZWN0O2UuZ2V0RGVmZXJyZWRBbmltYXRpb249XG5ILmdldERlZmVycmVkQW5pbWF0aW9uO2Uuc2V0QW5pbWF0aW9uPUguc2V0QW5pbWF0aW9uO2Uuc3RvcD1ILnN0b3A7ZS50aW1lcnM9ei50aW1lcnM7ZS5BU1Q9RztlLkZ4PXo7ZS5TZXJpZXM9eDtlLlNWR0VsZW1lbnQ9QjtlLmRhdGVGb3JtYXQ9Qy5kYXRlRm9ybWF0O2UuZm9ybWF0PUMuZm9ybWF0O2UubnVtYmVyRm9ybWF0PUMubnVtYmVyRm9ybWF0O2UuZGVmYXVsdE9wdGlvbnM9SS5kZWZhdWx0T3B0aW9ucztlLmdldE9wdGlvbnM9SS5nZXRPcHRpb25zO2UudGltZT1JLmRlZmF1bHRUaW1lO2Uuc2V0T3B0aW9ucz1JLnNldE9wdGlvbnM7ZS5hZGRFdmVudD1iLmFkZEV2ZW50O2UuYXJyYXlNYXg9Yi5hcnJheU1heDtlLmFycmF5TWluPWIuYXJyYXlNaW47ZS5hdHRyPWIuYXR0cjtlLmNsZWFyVGltZW91dD1iLmNsZWFyVGltZW91dDtlLmNvcnJlY3RGbG9hdD1iLmNvcnJlY3RGbG9hdDtlLmNyZWF0ZUVsZW1lbnQ9Yi5jcmVhdGVFbGVtZW50O2UuY3NzPWIuY3NzO2UuZGVmaW5lZD1cbmIuZGVmaW5lZDtlLmRlc3Ryb3lPYmplY3RQcm9wZXJ0aWVzPWIuZGVzdHJveU9iamVjdFByb3BlcnRpZXM7ZS5kaXNjYXJkRWxlbWVudD1iLmRpc2NhcmRFbGVtZW50O2UuZXJhc2U9Yi5lcmFzZTtlLmVycm9yPWIuZXJyb3I7ZS5leHRlbmQ9Yi5leHRlbmQ7ZS5leHRlbmRDbGFzcz1iLmV4dGVuZENsYXNzO2UuZmluZD1iLmZpbmQ7ZS5maXJlRXZlbnQ9Yi5maXJlRXZlbnQ7ZS5nZXRNYWduaXR1ZGU9Yi5nZXRNYWduaXR1ZGU7ZS5nZXRTdHlsZT1iLmdldFN0eWxlO2UuaW5BcnJheT1iLmluQXJyYXk7ZS5pc0FycmF5PWIuaXNBcnJheTtlLmlzQ2xhc3M9Yi5pc0NsYXNzO2UuaXNET01FbGVtZW50PWIuaXNET01FbGVtZW50O2UuaXNGdW5jdGlvbj1iLmlzRnVuY3Rpb247ZS5pc051bWJlcj1iLmlzTnVtYmVyO2UuaXNPYmplY3Q9Yi5pc09iamVjdDtlLmlzU3RyaW5nPWIuaXNTdHJpbmc7ZS5rZXlzPWIua2V5cztlLm1lcmdlPWIubWVyZ2U7ZS5ub3JtYWxpemVUaWNrSW50ZXJ2YWw9Yi5ub3JtYWxpemVUaWNrSW50ZXJ2YWw7XG5lLm9iamVjdEVhY2g9Yi5vYmplY3RFYWNoO2Uub2Zmc2V0PWIub2Zmc2V0O2UucGFkPWIucGFkO2UucGljaz1iLnBpY2s7ZS5wSW50PWIucEludDtlLnJlbGF0aXZlTGVuZ3RoPWIucmVsYXRpdmVMZW5ndGg7ZS5yZW1vdmVFdmVudD1iLnJlbW92ZUV2ZW50O2Uuc3BsYXQ9Yi5zcGxhdDtlLnN0YWJsZVNvcnQ9Yi5zdGFibGVTb3J0O2Uuc3luY1RpbWVvdXQ9Yi5zeW5jVGltZW91dDtlLnRpbWVVbml0cz1iLnRpbWVVbml0cztlLnVuaXF1ZUtleT1iLnVuaXF1ZUtleTtlLnVzZVNlcmlhbElkcz1iLnVzZVNlcmlhbElkcztlLndyYXA9Yi53cmFwO3JldHVybiBlfSk7ZVtcIm1hc3RlcnMvaGlnaGNoYXJ0cy5zcmMuanNcIl0uX21vZHVsZXM9ZTtyZXR1cm4gZVtcIm1hc3RlcnMvaGlnaGNoYXJ0cy5zcmMuanNcIl19KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhpZ2hjaGFydHMuanMubWFwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/highcharts/highcharts.js\n");
14
+
15
+ /***/ })
16
+
17
+ }]);