diff --git a/dist/index.umd.js b/dist/index.umd.js index dca9958..cbfb883 100644 --- a/dist/index.umd.js +++ b/dist/index.umd.js @@ -1 +1 @@ -!function(I,g){if("object"==typeof exports&&"object"==typeof module)module.exports=g();else if("function"==typeof define&&define.amd)define([],g);else{var t=g();for(var C in t)("object"==typeof exports?exports:I)[C]=t[C]}}(window,(function(){return function(I){var g={};function t(C){if(g[C])return g[C].exports;var A=g[C]={i:C,l:!1,exports:{}};return I[C].call(A.exports,A,A.exports,t),A.l=!0,A.exports}return t.m=I,t.c=g,t.d=function(I,g,C){t.o(I,g)||Object.defineProperty(I,g,{enumerable:!0,get:C})},t.r=function(I){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(I,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(I,"__esModule",{value:!0})},t.t=function(I,g){if(1&g&&(I=t(I)),8&g)return I;if(4&g&&"object"==typeof I&&I&&I.__esModule)return I;var C=Object.create(null);if(t.r(C),Object.defineProperty(C,"default",{enumerable:!0,value:I}),2&g&&"string"!=typeof I)for(var A in I)t.d(C,A,function(g){return I[g]}.bind(null,A));return C},t.n=function(I){var g=I&&I.__esModule?function(){return I.default}:function(){return I};return t.d(g,"a",g),g},t.o=function(I,g){return Object.prototype.hasOwnProperty.call(I,g)},t.p="",t(t.s=2)}([function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n "use strict";\n Object.defineProperty(exports, "__esModule", { value: true });\n exports.TypeColor = exports.MonthColor = exports.SeasonColor = exports.SVG_HEIGHT = exports.SVG_WIDTH = exports.MINIMAP_RESOLUTION_WIDTH = exports.CHART_RESOLUTION_HEIGHT = exports.CHART_RESOLUTION_WIDTH = exports.MINIMAP_HEIGHT = exports.CONTAINER_RATIO = void 0;\n /**\n * Line Chart constants\n */\n exports.CONTAINER_RATIO = 3 / 4;\n exports.MINIMAP_HEIGHT = 200;\n exports.CHART_RESOLUTION_WIDTH = 1920;\n exports.CHART_RESOLUTION_HEIGHT = 1080;\n exports.MINIMAP_RESOLUTION_WIDTH = 1920;\n /**\n * Pie Chart constants\n */\n exports.SVG_WIDTH = 500;\n exports.SVG_HEIGHT = 500;\n /**\n * Color\n */\n var SeasonColor;\n (function (SeasonColor) {\n SeasonColor["SPRING"] = "#ffc7c7";\n SeasonColor["SUMMER"] = "#bdd687";\n SeasonColor["FALL"] = "#e9b296";\n SeasonColor["WINTER"] = "#c7fdff";\n })(SeasonColor = exports.SeasonColor || (exports.SeasonColor = {}));\n exports.MonthColor = {\n "3": "#fa9494",\n "4": "#f15e5e",\n "5": "#c25050",\n "6": "#a0d430",\n "7": "#81b214",\n "8": "#567c02",\n "9": "#e6895b",\n "10": "#df6f38",\n "11": "#ac4b1c",\n "12": "#82ecf0",\n "1": "#30bbc0",\n "2": "#0d7377",\n };\n var TypeColor;\n (function (TypeColor) {\n TypeColor["INCOME"] = "#2a3d66";\n TypeColor["OUTLAY"] = "#d789d7";\n })(TypeColor = exports.TypeColor || (exports.TypeColor = {}));\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9jb25zdGFudHMvaW5kZXgudHM/NTEwYiJdLCJzb3VyY2VzQ29udGVudCI6WyJkZWZpbmUoW1wicmVxdWlyZVwiLCBcImV4cG9ydHNcIl0sIGZ1bmN0aW9uIChyZXF1aXJlLCBleHBvcnRzKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuICAgIGV4cG9ydHMuVHlwZUNvbG9yID0gZXhwb3J0cy5Nb250aENvbG9yID0gZXhwb3J0cy5TZWFzb25Db2xvciA9IGV4cG9ydHMuU1ZHX0hFSUdIVCA9IGV4cG9ydHMuU1ZHX1dJRFRIID0gZXhwb3J0cy5NSU5JTUFQX1JFU09MVVRJT05fV0lEVEggPSBleHBvcnRzLkNIQVJUX1JFU09MVVRJT05fSEVJR0hUID0gZXhwb3J0cy5DSEFSVF9SRVNPTFVUSU9OX1dJRFRIID0gZXhwb3J0cy5NSU5JTUFQX0hFSUdIVCA9IGV4cG9ydHMuQ09OVEFJTkVSX1JBVElPID0gdm9pZCAwO1xuICAgIC8qKlxuICAgICAqIExpbmUgQ2hhcnQgY29uc3RhbnRzXG4gICAgICovXG4gICAgZXhwb3J0cy5DT05UQUlORVJfUkFUSU8gPSAzIC8gNDtcbiAgICBleHBvcnRzLk1JTklNQVBfSEVJR0hUID0gMjAwO1xuICAgIGV4cG9ydHMuQ0hBUlRfUkVTT0xVVElPTl9XSURUSCA9IDE5MjA7XG4gICAgZXhwb3J0cy5DSEFSVF9SRVNPTFVUSU9OX0hFSUdIVCA9IDEwODA7XG4gICAgZXhwb3J0cy5NSU5JTUFQX1JFU09MVVRJT05fV0lEVEggPSAxOTIwO1xuICAgIC8qKlxuICAgICAqIFBpZSBDaGFydCBjb25zdGFudHNcbiAgICAgKi9cbiAgICBleHBvcnRzLlNWR19XSURUSCA9IDUwMDtcbiAgICBleHBvcnRzLlNWR19IRUlHSFQgPSA1MDA7XG4gICAgLyoqXG4gICAgICogQ29sb3JcbiAgICAgKi9cbiAgICB2YXIgU2Vhc29uQ29sb3I7XG4gICAgKGZ1bmN0aW9uIChTZWFzb25Db2xvcikge1xuICAgICAgICBTZWFzb25Db2xvcltcIlNQUklOR1wiXSA9IFwiI2ZmYzdjN1wiO1xuICAgICAgICBTZWFzb25Db2xvcltcIlNVTU1FUlwiXSA9IFwiI2JkZDY4N1wiO1xuICAgICAgICBTZWFzb25Db2xvcltcIkZBTExcIl0gPSBcIiNlOWIyOTZcIjtcbiAgICAgICAgU2Vhc29uQ29sb3JbXCJXSU5URVJcIl0gPSBcIiNjN2ZkZmZcIjtcbiAgICB9KShTZWFzb25Db2xvciA9IGV4cG9ydHMuU2Vhc29uQ29sb3IgfHwgKGV4cG9ydHMuU2Vhc29uQ29sb3IgPSB7fSkpO1xuICAgIGV4cG9ydHMuTW9udGhDb2xvciA9IHtcbiAgICAgICAgXCIzXCI6IFwiI2ZhOTQ5NFwiLFxuICAgICAgICBcIjRcIjogXCIjZjE1ZTVlXCIsXG4gICAgICAgIFwiNVwiOiBcIiNjMjUwNTBcIixcbiAgICAgICAgXCI2XCI6IFwiI2EwZDQzMFwiLFxuICAgICAgICBcIjdcIjogXCIjODFiMjE0XCIsXG4gICAgICAgIFwiOFwiOiBcIiM1NjdjMDJcIixcbiAgICAgICAgXCI5XCI6IFwiI2U2ODk1YlwiLFxuICAgICAgICBcIjEwXCI6IFwiI2RmNmYzOFwiLFxuICAgICAgICBcIjExXCI6IFwiI2FjNGIxY1wiLFxuICAgICAgICBcIjEyXCI6IFwiIzgyZWNmMFwiLFxuICAgICAgICBcIjFcIjogXCIjMzBiYmMwXCIsXG4gICAgICAgIFwiMlwiOiBcIiMwZDczNzdcIixcbiAgICB9O1xuICAgIHZhciBUeXBlQ29sb3I7XG4gICAgKGZ1bmN0aW9uIChUeXBlQ29sb3IpIHtcbiAgICAgICAgVHlwZUNvbG9yW1wiSU5DT01FXCJdID0gXCIjMmEzZDY2XCI7XG4gICAgICAgIFR5cGVDb2xvcltcIk9VVExBWVwiXSA9IFwiI2Q3ODlkN1wiO1xuICAgIH0pKFR5cGVDb2xvciA9IGV4cG9ydHMuVHlwZUNvbG9yIHx8IChleHBvcnRzLlR5cGVDb2xvciA9IHt9KSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///0\n')},function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n "use strict";\n Object.defineProperty(exports, "__esModule", { value: true });\n exports.$style = void 0;\n var $style = function (elem, obj) {\n for (var prop in obj) {\n elem.style[prop] = obj[prop];\n }\n };\n exports.$style = $style;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy91dGlscy9kb21BUEkudHM/NDYxMCJdLCJzb3VyY2VzQ29udGVudCI6WyJkZWZpbmUoW1wicmVxdWlyZVwiLCBcImV4cG9ydHNcIl0sIGZ1bmN0aW9uIChyZXF1aXJlLCBleHBvcnRzKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuICAgIGV4cG9ydHMuJHN0eWxlID0gdm9pZCAwO1xuICAgIHZhciAkc3R5bGUgPSBmdW5jdGlvbiAoZWxlbSwgb2JqKSB7XG4gICAgICAgIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgICAgICAgICBlbGVtLnN0eWxlW3Byb3BdID0gb2JqW3Byb3BdO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBleHBvcnRzLiRzdHlsZSA9ICRzdHlsZTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1\n')},function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(3), __webpack_require__(6)], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, Line_1, Pie_1) {\n "use strict";\n Object.defineProperty(exports, "__esModule", { value: true });\n exports.Pie = exports.Line = void 0;\n exports.Line = Line_1.default;\n exports.Pie = Pie_1.default;\n var dummy = __webpack_require__(8);\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9pbmRleC50cz8wMGU5Il0sInNvdXJjZXNDb250ZW50IjpbImRlZmluZShbXCJyZXF1aXJlXCIsIFwiZXhwb3J0c1wiLCBcIi4vTGluZVwiLCBcIi4vUGllXCJdLCBmdW5jdGlvbiAocmVxdWlyZSwgZXhwb3J0cywgTGluZV8xLCBQaWVfMSkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbiAgICBleHBvcnRzLlBpZSA9IGV4cG9ydHMuTGluZSA9IHZvaWQgMDtcbiAgICBleHBvcnRzLkxpbmUgPSBMaW5lXzEuZGVmYXVsdDtcbiAgICBleHBvcnRzLlBpZSA9IFBpZV8xLmRlZmF1bHQ7XG4gICAgdmFyIGR1bW15ID0gcmVxdWlyZShcIi4vZGF0YS9kYXRhLmpzb25cIik7XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2\n')},function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(4), __webpack_require__(1), __webpack_require__(0), __webpack_require__(5)], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, types_1, domAPI_1, index_1, resize_1) {\n "use strict";\n Object.defineProperty(exports, "__esModule", { value: true });\n var del = 0;\n types_1.tempFunction("bug");\n var Line = /** @class */ (function () {\n function Line(chartProps) {\n this.initProps(chartProps);\n this.insertHTML();\n this.initElement();\n this.initStyle();\n this.initChart();\n this.initMinimap();\n this.drawChart(this.moveX);\n this.drawMinimap(this.moveX);\n this.addEventListener();\n }\n Line.prototype.initProps = function (chartProps) {\n this.containerName = chartProps.selector;\n this.elements = {\n container: undefined,\n chartContainer: undefined,\n chart: undefined,\n chartTitle: undefined,\n chartVerticalTooltip: undefined,\n chartHorizontalTooltip: undefined,\n chartHorizontalValue: undefined,\n chartInformation: undefined,\n minimapContainer: undefined,\n minimap: undefined,\n minimapTitle: undefined,\n minimapTooltip: undefined,\n };\n this.chartTitle = chartProps.chartTitle;\n var makeData = function (datas) {\n var data = {};\n datas.forEach(function (monthItem) {\n monthItem.data.forEach(function (dateItem) {\n var amount = 0;\n dateItem.data.forEach(function (data) {\n amount += data.amount;\n });\n data[monthItem.month + "/" + dateItem.date] = amount;\n });\n });\n return data;\n };\n var makeDataContents = function (datas) {\n var data = [];\n datas.forEach(function (monthItem) {\n monthItem.data.forEach(function (dateItem) {\n var contents = dateItem.data;\n data.push(contents);\n });\n });\n return data;\n };\n this.dataContents = makeDataContents(chartProps.data);\n this.data = makeData(chartProps.data);\n this.minMax = [Math.min.apply(Math, Object.values(this.data)), Math.max.apply(Math, Object.values(this.data))];\n this.abs = Math.max.apply(Math, this.minMax.map(function (item) { return Math.abs(item); }));\n };\n Line.prototype.insertHTML = function () {\n this.elements.container = document.getElementById(this.containerName);\n this.elements.container.innerHTML = "\\n
" + this.chartTitle + "
\\n
\\n
\\n
\\n
\\n
\\n
\\n \\n
\\n
\\n \\n
\\n
\\n
\\n ";\n };\n Line.prototype.initElement = function () {\n this.elements.chartContainer = document.querySelector("#" + this.containerName + "-chart-container");\n this.elements.chart = document.querySelector("#" + this.containerName + "-chart");\n this.elements.chartTitle = document.querySelector("#" + this.containerName + "-chart-title");\n this.elements.chartHorizontalTooltip = document.querySelector("#" + this.containerName + "-chart-horizontal-tooltip");\n this.elements.chartVerticalTooltip = document.querySelector("#" + this.containerName + "-chart-vertical-tooltip");\n this.elements.chartHorizontalValue = document.querySelector("#" + this.containerName + "-chart-horizontal-value");\n this.elements.chartInformation = document.querySelector("#" + this.containerName + "-chart-information");\n this.elements.minimapContainer = document.querySelector("#" + this.containerName + "-minimap-container");\n this.elements.minimap = document.querySelector("#" + this.containerName + "-minimap");\n this.elements.minimapTooltip = document.querySelector("#" + this.containerName + "-minimap-tooltip");\n };\n Line.prototype.initStyle = function () {\n var container = this.elements.container;\n var chartContainer = this.elements.chartContainer;\n var chart = this.elements.chart;\n var chartTitle = this.elements.chartTitle;\n var chartVerticalTooltip = this.elements.chartVerticalTooltip;\n var chartHorizontalTooltip = this.elements.chartHorizontalTooltip;\n var chartHorizontalValue = this.elements.chartHorizontalValue;\n var chartInformation = this.elements.chartInformation;\n var minimapContainer = this.elements.minimapContainer;\n var minimap = this.elements.minimap;\n var minimapTooltip = this.elements.minimapTooltip;\n domAPI_1.$style(container, {\n display: "flex",\n flexDirection: "column",\n justifyContent: "space-between",\n });\n domAPI_1.$style(chartContainer, {\n position: "relative",\n width: "inherit",\n height: container.clientWidth * (index_1.CHART_RESOLUTION_HEIGHT / index_1.CHART_RESOLUTION_WIDTH) + "px",\n userSelect: "none",\n });\n domAPI_1.$style(chart, {\n width: "100%",\n height: "100%",\n userSelect: "none",\n zIndex: 100,\n });\n domAPI_1.$style(chartTitle, {\n width: "inherit",\n height: "100%",\n fontSize: "32px",\n display: "flex",\n justifyContent: "center",\n alignItems: "center",\n fontWeight: "bold",\n color: "black",\n textShadow: "2px 2px 4px grey",\n userSelect: "none",\n padding: "6px 0px 6px 0px",\n });\n domAPI_1.$style(chartVerticalTooltip, {\n display: "none",\n width: "1px",\n height: "inherit",\n position: "absolute",\n top: "0",\n left: "0",\n borderLeft: "1px dashed #333",\n userSelect: "none",\n pointerEvents: "none",\n });\n domAPI_1.$style(chartHorizontalTooltip, {\n display: "none",\n height: "1px",\n width: "inherit",\n position: "absolute",\n top: "0",\n left: "0",\n borderTop: "1px dashed #333",\n userSelect: "none",\n pointerEvents: "none",\n });\n domAPI_1.$style(chartHorizontalValue, {\n display: "none",\n position: "absolute",\n top: "0",\n left: "0",\n backgroundColor: "#000",\n color: "#fff",\n userSelect: "none",\n pointerEvents: "none",\n });\n domAPI_1.$style(chartInformation, {\n zIndex: "10",\n display: "none",\n flexDirection: "column",\n width: "fit-content",\n height: "auto",\n position: "absolute",\n top: "0",\n left: "0",\n backgroundColor: "white",\n userSelect: "none",\n padding: "8px 8px 8px 8px",\n border: "4px solid dodgerblue",\n borderRadius: "4px",\n opacity: "0.75",\n });\n domAPI_1.$style(minimapContainer, {\n position: "relative",\n width: "inherit",\n height: container.clientWidth * (index_1.MINIMAP_HEIGHT / index_1.CHART_RESOLUTION_WIDTH) + "px",\n });\n domAPI_1.$style(minimap, {\n width: "100%",\n height: "100%",\n });\n domAPI_1.$style(minimapTooltip, {\n display: "none",\n fontSize: "30px",\n position: "absolute",\n top: "0",\n left: "0",\n pointerEvents: "none",\n });\n };\n Line.prototype.initChart = function () {\n var canvas = this.elements.chart;\n canvas.width = index_1.CHART_RESOLUTION_WIDTH;\n canvas.height = index_1.CHART_RESOLUTION_HEIGHT;\n this.moveX = 0;\n this.tempMoveX = 0;\n var _a = this.elements.chart.getBoundingClientRect(), trueChartWidth = _a.width, trueChartHeight = _a.height;\n this.trueChartCanvasSize = {\n width: trueChartWidth,\n height: trueChartHeight,\n };\n };\n Line.prototype.drawChart = function (moveX) {\n var canvas = this.elements.chart;\n var ctx = canvas.getContext("2d");\n /**\n * Draw all canvas white\n */\n ctx.fillStyle = "#fff";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n /**\n * Chart constants Informations\n */\n var LEFT_PADDING = 30;\n var RIGHT_PADDING = 30;\n var TOP_PADDING = 120;\n var BOTTOM_PADDING = 120;\n var Y_VALUE_WIDTH = 200;\n var X_VALUE_HEIGHT = 52;\n var Y_VALUE_COUNT = 7;\n var CANVAS_HEIGHT = canvas.height;\n var CANVAS_WIDTH = canvas.width;\n var TEXT_SIZE = 15;\n var CHART_WIDTH = CANVAS_WIDTH - LEFT_PADDING - RIGHT_PADDING - Y_VALUE_WIDTH;\n var CHART_HEIGHT = CANVAS_HEIGHT - TOP_PADDING - BOTTOM_PADDING - X_VALUE_HEIGHT;\n var LIMIT_Y = CHART_HEIGHT / 6;\n var LIMIT_X = (CHART_WIDTH / (Object.keys(this.data).length - 1)) * (1 / this.chartRatio || 10);\n var TOTAL_CHART_WIDTH = LIMIT_X * (Object.keys(this.data).length - 1);\n var chartRatio = this.chartRatio || CHART_WIDTH / TOTAL_CHART_WIDTH;\n this.chartRatio = chartRatio;\n this.chartSize = { width: CHART_WIDTH, height: CHART_HEIGHT };\n var trueMoveX = resize_1.trueLengthToCanvasLength(moveX, CANVAS_WIDTH, this.trueChartCanvasSize.width);\n var x;\n var y;\n ctx.beginPath();\n del = this.tempChartRatio ? trueMoveX * (this.tempChartRatio / this.chartRatio) : 0;\n /**\n * Draw X Axis\n */\n x = this.tempChartRatio\n ? LEFT_PADDING + Y_VALUE_WIDTH - trueMoveX * (this.tempChartRatio / this.chartRatio)\n : LEFT_PADDING + Y_VALUE_WIDTH - trueMoveX;\n y = CANVAS_HEIGHT - BOTTOM_PADDING;\n var dataLimit = Math.round(Object.keys(this.data).length / 52);\n var i = 0;\n for (var key in this.data) {\n if (this.chartRatio > 0.75) {\n if (i % (dataLimit * 4) === 0) {\n ctx.fillStyle = "#333";\n key.split("/")[1] === "1" ? (ctx.font = "bold 40px arial") : (ctx.font = "40px arial");\n ctx.fillRect(x, y - X_VALUE_HEIGHT - 14, 2, 20);\n ctx.fillText(key, x, y);\n }\n }\n else if (this.chartRatio > 0.2) {\n if (i % (dataLimit * 2) === 0) {\n ctx.fillStyle = "#333";\n key.split("/")[1] === "1" ? (ctx.font = "bold 40px arial") : (ctx.font = "40px arial");\n ctx.fillRect(x, y - X_VALUE_HEIGHT - 14, 2, 20);\n ctx.fillText(key, x, y);\n }\n }\n else if (this.chartRatio > 0.05) {\n if (i % dataLimit === 0) {\n ctx.fillStyle = "#333";\n key.split("/")[1] === "1" ? (ctx.font = "bold 40px arial") : (ctx.font = "40px arial");\n ctx.fillRect(x, y - X_VALUE_HEIGHT - 14, 2, 20);\n ctx.fillText(key, x, y);\n }\n }\n else {\n ctx.fillStyle = "#333";\n key.split("/")[1] === "1" ? (ctx.font = "bold 40px arial") : (ctx.font = "40px arial");\n ctx.fillRect(x, y - X_VALUE_HEIGHT - 14, 2, 20);\n ctx.fillText(key, x, y);\n }\n x += LIMIT_X;\n i++;\n }\n /**\n * Draw Line Chart\n */\n var newDataPositions = [];\n x = this.tempChartRatio\n ? LEFT_PADDING + Y_VALUE_WIDTH - trueMoveX * (this.tempChartRatio / this.chartRatio)\n : LEFT_PADDING + Y_VALUE_WIDTH - trueMoveX;\n for (var key in this.data) {\n if (this.chartRatio > 0.7) {\n ctx.lineWidth = 5;\n }\n else if (this.chartRatio > 0.2) {\n ctx.lineWidth = 7;\n }\n else {\n ctx.lineWidth = 10;\n }\n var valueInChart = CHART_HEIGHT / 2 + (CHART_HEIGHT / 2) * (this.data[key] / this.abs);\n var chartDataY = CANVAS_HEIGHT - BOTTOM_PADDING - X_VALUE_HEIGHT - valueInChart - 15;\n ctx.lineTo(x, chartDataY);\n ctx.strokeStyle = "dodgerblue";\n ctx.stroke();\n ctx.beginPath();\n ctx.moveTo(x, chartDataY);\n // If data position pushed, don\'t execute\n newDataPositions.push([\n resize_1.canvasLengthToTrueLength(x, CANVAS_WIDTH, this.trueChartCanvasSize.width),\n resize_1.canvasLengthToTrueLength(chartDataY, CANVAS_HEIGHT, this.trueChartCanvasSize.height),\n ]);\n x += LIMIT_X;\n }\n this.dataPositions = newDataPositions;\n /**\n * Draw Arc Point\n */\n x = this.tempChartRatio\n ? LEFT_PADDING + Y_VALUE_WIDTH - trueMoveX * (this.tempChartRatio / this.chartRatio)\n : LEFT_PADDING + Y_VALUE_WIDTH - trueMoveX;\n for (var key in this.data) {\n if (this.chartRatio > 0.7) {\n break;\n }\n var valueInChart = CHART_HEIGHT / 2 + (CHART_HEIGHT / 2) * (this.data[key] / this.abs);\n var chartDataY = CANVAS_HEIGHT - BOTTOM_PADDING - X_VALUE_HEIGHT - valueInChart - 15;\n ctx.fillStyle = "dodgerblue";\n ctx.arc(x, chartDataY, 12, 0, Math.PI * 2, true);\n ctx.fill();\n ctx.beginPath();\n ctx.fillStyle = "#fff";\n ctx.arc(x, CANVAS_HEIGHT - BOTTOM_PADDING - X_VALUE_HEIGHT - valueInChart - 15, 9, 0, Math.PI * 2, true);\n ctx.fill();\n ctx.beginPath();\n x += LIMIT_X;\n }\n /**\n * Draw Right Padding White\n */\n ctx.beginPath();\n ctx.fillStyle = "#fff";\n ctx.fillRect(LEFT_PADDING + Y_VALUE_WIDTH + CHART_WIDTH, TOP_PADDING, CHART_WIDTH, CHART_HEIGHT);\n /**\n * Draw Left Padding & Y Value Width White\n */\n ctx.fillStyle = "#ffffff";\n ctx.fillRect(0, 0, LEFT_PADDING + Y_VALUE_WIDTH, CANVAS_HEIGHT);\n /**\n * Draw Y Axis\n */\n y = CANVAS_HEIGHT - BOTTOM_PADDING - X_VALUE_HEIGHT;\n var leftValue = -this.abs;\n for (var i_1 = 0; i_1 < Y_VALUE_COUNT; i_1++) {\n ctx.beginPath();\n ctx.fillStyle = "black";\n ctx.font = "40px arial";\n ctx.lineWidth = 2;\n ctx.textAlign = "end";\n ctx.fillText(String(Math.round(leftValue)), Y_VALUE_WIDTH, y);\n ctx.moveTo(LEFT_PADDING + Y_VALUE_WIDTH, y - TEXT_SIZE);\n ctx.lineTo(CANVAS_WIDTH - RIGHT_PADDING, y - TEXT_SIZE);\n ctx.strokeStyle = "#444";\n if (i_1 === 3)\n ctx.lineWidth = 4;\n ctx.stroke();\n leftValue += this.abs / 3;\n y -= LIMIT_Y;\n }\n ctx.textAlign = "start";\n };\n Line.prototype.initMinimap = function () {\n var canvas = this.elements.minimap;\n canvas.width = index_1.MINIMAP_RESOLUTION_WIDTH;\n var _a = this.elements.minimap.getBoundingClientRect(), trueMinimapWidth = _a.width, trueMinimapHeight = _a.height;\n canvas.height = (index_1.CHART_RESOLUTION_WIDTH * trueMinimapHeight) / trueMinimapWidth;\n this.trueMinimapCanvasSize = {\n width: trueMinimapWidth,\n height: trueMinimapHeight,\n };\n };\n Line.prototype.drawMinimap = function (moveX) {\n var canvas = this.elements.minimap;\n var ctx = canvas.getContext("2d");\n /**\n * Draw all White\n */\n ctx.fillStyle = "#fff";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n /**\n * Minimap constants Informations\n */\n var LEFT_PADDING = 30;\n var RIGHT_PADDING = 30;\n var TOP_PADDING = 30;\n var BOTTOM_PADDING = 60;\n var TEXT_SIZE = 40;\n var CANVAS_HEIGHT = canvas.height;\n var CANVAS_WIDTH = canvas.width;\n var MINIMAP_WIDTH = CANVAS_WIDTH - LEFT_PADDING - RIGHT_PADDING;\n var MINIMAP_HEIGHT = CANVAS_HEIGHT - TOP_PADDING - BOTTOM_PADDING;\n var LIMIT_X = MINIMAP_WIDTH / (Object.keys(this.data).length - 1);\n this.minimapSize = { width: MINIMAP_WIDTH, height: MINIMAP_HEIGHT };\n var ratio = this.tempChartRatio || this.chartRatio;\n var trueMoveX = resize_1.chartLengthToMinimapLength(resize_1.trueLengthToCanvasLength(moveX, CANVAS_WIDTH, this.trueChartCanvasSize.width), this.chartSize.width, MINIMAP_WIDTH, ratio);\n var x;\n var y;\n ctx.beginPath();\n /**\n * Draw Minimap Box\n */\n ctx.fillStyle = "rgb(225, 232, 252)";\n ctx.fillRect(LEFT_PADDING, TOP_PADDING, MINIMAP_WIDTH, MINIMAP_HEIGHT);\n ctx.lineWidth = 2;\n ctx.strokeStyle = "#000";\n ctx.strokeRect(LEFT_PADDING, TOP_PADDING, MINIMAP_WIDTH, MINIMAP_HEIGHT);\n /**\n * Draw Visible Minimap Box\n */\n ctx.fillStyle = "#fff";\n ctx.fillRect(LEFT_PADDING + trueMoveX, TOP_PADDING, MINIMAP_WIDTH * this.chartRatio, MINIMAP_HEIGHT);\n ctx.strokeStyle = "#000";\n ctx.lineWidth = 5;\n ctx.strokeRect(LEFT_PADDING + trueMoveX, TOP_PADDING, MINIMAP_WIDTH * this.chartRatio, MINIMAP_HEIGHT);\n this.minimapPositions = [\n resize_1.canvasLengthToTrueLength(LEFT_PADDING + trueMoveX, CANVAS_WIDTH, this.trueMinimapCanvasSize.width),\n resize_1.canvasLengthToTrueLength(LEFT_PADDING + trueMoveX + MINIMAP_WIDTH * this.chartRatio, CANVAS_WIDTH, this.trueMinimapCanvasSize.width),\n ];\n /**\n * Draw Minimap\n */\n x = LEFT_PADDING;\n ctx.beginPath();\n for (var key in this.data) {\n var valueInChart = MINIMAP_HEIGHT / 2 + (MINIMAP_HEIGHT / 2) * (this.data[key] / this.abs);\n ctx.lineTo(x, CANVAS_HEIGHT - BOTTOM_PADDING - valueInChart);\n ctx.lineWidth = 3;\n ctx.strokeStyle = "dodgerblue";\n ctx.stroke();\n ctx.fillStyle = "dodgerblue";\n ctx.fill();\n ctx.beginPath();\n ctx.moveTo(x, CANVAS_HEIGHT - BOTTOM_PADDING - valueInChart);\n x += LIMIT_X;\n }\n /**\n * Draw X Axis\n */\n x = LEFT_PADDING - TEXT_SIZE / 2;\n y = CANVAS_HEIGHT - BOTTOM_PADDING + TEXT_SIZE;\n for (var key in this.data) {\n if (Number(key.split("/")[1]) % 31 === 1) {\n ctx.fillStyle = "black";\n ctx.font = "40px arial";\n ctx.fillText(key, x, y);\n }\n x += LIMIT_X;\n }\n };\n Line.prototype.addEventListener = function () {\n var _this = this;\n var mousedownFlag = null;\n var chartEvent = function () {\n var chartContainer = _this.elements.chartContainer;\n chartContainer.addEventListener("mousemove", function (e) {\n if (e.target !== _this.elements.chart)\n return;\n if (mousedownFlag) {\n _this.tempMoveX = mousedownFlag - e.offsetX;\n var chartVerticalTooltip_1 = _this.elements.chartVerticalTooltip;\n var chartHorizontalTooltip = _this.elements.chartHorizontalTooltip;\n chartVerticalTooltip_1.style.left = e.offsetX + "px";\n chartHorizontalTooltip.style.top = e.offsetY + "px";\n _this.drawChart(_this.moveX + _this.tempMoveX);\n _this.drawMinimap(_this.moveX + _this.tempMoveX);\n }\n else {\n var chartVerticalTooltip_2 = _this.elements.chartVerticalTooltip;\n var chartHorizontalTooltip = _this.elements.chartHorizontalTooltip;\n chartVerticalTooltip_2.style.display = "block";\n chartHorizontalTooltip.style.display = "block";\n chartHorizontalTooltip.style.top = e.offsetY + "px";\n _this.drawChart(_this.moveX);\n _this.drawMinimap(_this.moveX);\n }\n var chartInformation = _this.elements.chartInformation;\n var chartHorizontalValue = _this.elements.chartHorizontalValue;\n chartInformation.style.left = e.offsetX + 20 + "px";\n chartInformation.style.top = e.offsetY + 20 + "px";\n chartHorizontalValue.style.display = "block";\n chartHorizontalValue.style.left = "0px";\n chartHorizontalValue.style.top = e.offsetY + "px";\n chartHorizontalValue.innerHTML = "";\n if (e.offsetY >\n resize_1.canvasLengthToTrueLength(1080 - 120 - 52 - 15 - (_this.chartSize.height / 6) * 6, 1080, _this.trueChartCanvasSize.height) &&\n e.offsetY < resize_1.canvasLengthToTrueLength(1080 - 120 - 52 - 15, 1080, _this.trueChartCanvasSize.height)) {\n var start = resize_1.canvasLengthToTrueLength(1080 - 120 - 52 - 15 - (_this.chartSize.height / 6) * 6, 1080, _this.trueChartCanvasSize.height);\n var end = resize_1.canvasLengthToTrueLength(1080 - 120 - 52 - 15, 1080, _this.trueChartCanvasSize.height);\n chartHorizontalValue.innerHTML = "" + Math.round(_this.abs - ((e.offsetY - start) / (end - start)) * _this.abs * 2);\n }\n var chartVerticalTooltip = _this.elements.chartVerticalTooltip;\n _this.dataPositions.forEach(function (item, i) {\n if (e.offsetX > item[0] - 6 && e.offsetX < item[0] + 6) {\n var chartInformationHTML = _this.dataContents[i].reduce(function (acc, cur) {\n return (acc +\n ("
" + cur.type + "
" + cur.amount + "
"));\n }, "
" + Object.keys(_this.data)[i] + "
") +\n ("
\\uCD1D \\uAE08\\uC561 : " + _this.dataContents[i].reduce(function (acc, cur) {\n return acc + cur.amount;\n }, 0) + "
");\n chartInformation.style.display = "block";\n chartVerticalTooltip.style.left = item[0] + "px";\n chartInformation.innerHTML = chartInformationHTML;\n }\n });\n });\n chartContainer.addEventListener("mousedown", function (e) {\n mousedownFlag = e.offsetX;\n });\n chartContainer.addEventListener("mouseup", function (e) {\n _this.dataPositions.forEach(function (item) {\n item[0] -= _this.tempMoveX;\n });\n _this.moveX += _this.tempMoveX;\n mousedownFlag = null;\n _this.tempMoveX = 0;\n });\n chartContainer.addEventListener("mouseleave", function () {\n _this.dataPositions.forEach(function (item) {\n item[0] -= _this.tempMoveX;\n });\n var chartVerticalTooltip = _this.elements.chartVerticalTooltip;\n var chartHorizontalTooltip = _this.elements.chartHorizontalTooltip;\n var chartInformation = _this.elements.chartInformation;\n var chartHorizontalValue = _this.elements.chartHorizontalValue;\n chartVerticalTooltip.style.display = "none";\n chartHorizontalTooltip.style.display = "none";\n chartInformation.style.display = "none";\n chartHorizontalValue.style.display = "none";\n _this.moveX += _this.tempMoveX;\n _this.drawChart(_this.moveX);\n _this.drawMinimap(_this.moveX);\n mousedownFlag = null;\n _this.tempMoveX = 0;\n });\n };\n var minimapEvent = function () {\n var minimapContainer = _this.elements.minimapContainer;\n var rightResizeFlag = false;\n var leftResizeFlag = false;\n var moveFlag = false;\n minimapContainer.addEventListener("mousemove", function (e) {\n if (mousedownFlag) {\n if (rightResizeFlag) {\n var moveRatio = (mousedownFlag - e.offsetX) /\n resize_1.canvasLengthToTrueLength(_this.minimapSize.width, 1920, _this.trueMinimapCanvasSize.width);\n _this.chartRatio = _this.tempChartRatio - moveRatio;\n _this.drawChart(_this.moveX);\n _this.drawMinimap(_this.moveX);\n }\n else if (leftResizeFlag) {\n _this.tempMoveX = resize_1.canvasLengthToTrueLength(resize_1.minimapLengthToChartLength(resize_1.trueLengthToCanvasLength(mousedownFlag - e.offsetX, 1920, _this.trueMinimapCanvasSize.width), _this.chartSize.width, _this.minimapSize.width, _this.chartRatio), 1920, _this.trueChartCanvasSize.width);\n _this.drawChart(_this.moveX - _this.tempMoveX);\n _this.drawMinimap(_this.moveX - _this.tempMoveX);\n }\n else if (moveFlag) {\n _this.tempMoveX = resize_1.canvasLengthToTrueLength(resize_1.minimapLengthToChartLength(resize_1.trueLengthToCanvasLength(mousedownFlag - e.offsetX, 1920, _this.trueMinimapCanvasSize.width), _this.chartSize.width, _this.minimapSize.width, _this.chartRatio), 1920, _this.trueChartCanvasSize.width);\n _this.drawChart(_this.moveX - _this.tempMoveX);\n _this.drawMinimap(_this.moveX - _this.tempMoveX);\n }\n }\n minimapContainer.style.cursor = "default";\n if (e.offsetX > _this.minimapPositions[0] - 3 && e.offsetX < _this.minimapPositions[0] + 3) {\n minimapContainer.style.cursor = "ew-resize";\n }\n if (e.offsetX > _this.minimapPositions[1] - 3 && e.offsetX < _this.minimapPositions[1] + 3) {\n minimapContainer.style.cursor = "ew-resize";\n }\n if (e.offsetX > _this.minimapPositions[0] + 3 && e.offsetX < _this.minimapPositions[1] - 3) {\n minimapContainer.style.cursor = "grab";\n }\n });\n minimapContainer.addEventListener("mousedown", function (e) {\n mousedownFlag = e.offsetX;\n _this.tempChartRatio = _this.chartRatio;\n if (e.offsetX > _this.minimapPositions[0] - 3 && e.offsetX < _this.minimapPositions[0] + 3) {\n leftResizeFlag = true;\n }\n if (e.offsetX > _this.minimapPositions[1] - 3 && e.offsetX < _this.minimapPositions[1] + 3) {\n rightResizeFlag = true;\n }\n if (e.offsetX > _this.minimapPositions[0] + 3 && e.offsetX < _this.minimapPositions[1] - 3) {\n if (mousedownFlag) {\n moveFlag = true;\n }\n }\n });\n minimapContainer.addEventListener("mouseup", function () {\n if (_this.tempChartRatio && rightResizeFlag)\n _this.moveX *= _this.tempChartRatio / _this.chartRatio;\n else if (_this.tempChartRatio && (leftResizeFlag || moveFlag))\n _this.moveX -= _this.tempMoveX;\n leftResizeFlag = false;\n rightResizeFlag = false;\n moveFlag = false;\n mousedownFlag = null;\n _this.tempChartRatio = 0;\n _this.tempMoveX = 0;\n del = 0;\n });\n minimapContainer.addEventListener("mouseleave", function () {\n if (_this.tempChartRatio && rightResizeFlag)\n _this.moveX *= _this.tempChartRatio / _this.chartRatio;\n else if (_this.tempChartRatio && (leftResizeFlag || moveFlag))\n _this.moveX -= _this.tempMoveX;\n leftResizeFlag = false;\n rightResizeFlag = false;\n moveFlag = false;\n _this.tempMoveX = 0;\n _this.tempChartRatio = 0;\n mousedownFlag = null;\n });\n };\n chartEvent();\n minimapEvent();\n };\n return Line;\n }());\n exports.default = Line;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9MaW5lLnRzP2FkODciXSwic291cmNlc0NvbnRlbnQiOlsiZGVmaW5lKFtcInJlcXVpcmVcIiwgXCJleHBvcnRzXCIsIFwiLi90eXBlc1wiLCBcIi4vdXRpbHMvZG9tQVBJXCIsIFwiLi9jb25zdGFudHMvaW5kZXhcIiwgXCIuL3V0aWxzL3Jlc2l6ZVwiXSwgZnVuY3Rpb24gKHJlcXVpcmUsIGV4cG9ydHMsIHR5cGVzXzEsIGRvbUFQSV8xLCBpbmRleF8xLCByZXNpemVfMSkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbiAgICB2YXIgZGVsID0gMDtcbiAgICB0eXBlc18xLnRlbXBGdW5jdGlvbihcImJ1Z1wiKTtcbiAgICB2YXIgTGluZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZnVuY3Rpb24gTGluZShjaGFydFByb3BzKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRQcm9wcyhjaGFydFByb3BzKTtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SFRNTCgpO1xuICAgICAgICAgICAgdGhpcy5pbml0RWxlbWVudCgpO1xuICAgICAgICAgICAgdGhpcy5pbml0U3R5bGUoKTtcbiAgICAgICAgICAgIHRoaXMuaW5pdENoYXJ0KCk7XG4gICAgICAgICAgICB0aGlzLmluaXRNaW5pbWFwKCk7XG4gICAgICAgICAgICB0aGlzLmRyYXdDaGFydCh0aGlzLm1vdmVYKTtcbiAgICAgICAgICAgIHRoaXMuZHJhd01pbmltYXAodGhpcy5tb3ZlWCk7XG4gICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBMaW5lLnByb3RvdHlwZS5pbml0UHJvcHMgPSBmdW5jdGlvbiAoY2hhcnRQcm9wcykge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXJOYW1lID0gY2hhcnRQcm9wcy5zZWxlY3RvcjtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudHMgPSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgY2hhcnRDb250YWluZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjaGFydDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGNoYXJ0VGl0bGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjaGFydFZlcnRpY2FsVG9vbHRpcDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGNoYXJ0SG9yaXpvbnRhbFRvb2x0aXA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBjaGFydEhvcml6b250YWxWYWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGNoYXJ0SW5mb3JtYXRpb246IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBtaW5pbWFwQ29udGFpbmVyOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgbWluaW1hcDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG1pbmltYXBUaXRsZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG1pbmltYXBUb29sdGlwOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5jaGFydFRpdGxlID0gY2hhcnRQcm9wcy5jaGFydFRpdGxlO1xuICAgICAgICAgICAgdmFyIG1ha2VEYXRhID0gZnVuY3Rpb24gKGRhdGFzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB7fTtcbiAgICAgICAgICAgICAgICBkYXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChtb250aEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgbW9udGhJdGVtLmRhdGEuZm9yRWFjaChmdW5jdGlvbiAoZGF0ZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbW91bnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUl0ZW0uZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50ICs9IGRhdGEuYW1vdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW21vbnRoSXRlbS5tb250aCArIFwiL1wiICsgZGF0ZUl0ZW0uZGF0ZV0gPSBhbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhciBtYWtlRGF0YUNvbnRlbnRzID0gZnVuY3Rpb24gKGRhdGFzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBbXTtcbiAgICAgICAgICAgICAgICBkYXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChtb250aEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgbW9udGhJdGVtLmRhdGEuZm9yRWFjaChmdW5jdGlvbiAoZGF0ZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250ZW50cyA9IGRhdGVJdGVtLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnB1c2goY29udGVudHMpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmRhdGFDb250ZW50cyA9IG1ha2VEYXRhQ29udGVudHMoY2hhcnRQcm9wcy5kYXRhKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IG1ha2VEYXRhKGNoYXJ0UHJvcHMuZGF0YSk7XG4gICAgICAgICAgICB0aGlzLm1pbk1heCA9IFtNYXRoLm1pbi5hcHBseShNYXRoLCBPYmplY3QudmFsdWVzKHRoaXMuZGF0YSkpLCBNYXRoLm1heC5hcHBseShNYXRoLCBPYmplY3QudmFsdWVzKHRoaXMuZGF0YSkpXTtcbiAgICAgICAgICAgIHRoaXMuYWJzID0gTWF0aC5tYXguYXBwbHkoTWF0aCwgdGhpcy5taW5NYXgubWFwKGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiBNYXRoLmFicyhpdGVtKTsgfSkpO1xuICAgICAgICB9O1xuICAgICAgICBMaW5lLnByb3RvdHlwZS5pbnNlcnRIVE1MID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5jb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmNvbnRhaW5lck5hbWUpO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5jb250YWluZXIuaW5uZXJIVE1MID0gXCJcXG4gICAgPGRpdiBpZD0nXCIgKyB0aGlzLmNvbnRhaW5lck5hbWUgKyBcIi1jaGFydC10aXRsZSc+XCIgKyB0aGlzLmNoYXJ0VGl0bGUgKyBcIjwvZGl2PlxcbiAgICA8ZGl2IHN0eWxlPVxcXCJ3aWR0aDppbmhlcml0OyBoZWlnaHQ6aW5oZXJpdDsgcGFkZGluZzo2cHggMHB4IDZweCAwcHhcXFwiPlxcbiAgICAgIDxkaXYgaWQ9J1wiICsgdGhpcy5jb250YWluZXJOYW1lICsgXCItY2hhcnQtY29udGFpbmVyJz5cXG4gICAgICAgIDxkaXYgaWQ9J1wiICsgdGhpcy5jb250YWluZXJOYW1lICsgXCItY2hhcnQtdmVydGljYWwtdG9vbHRpcCc+PC9kaXY+XFxuICAgICAgICA8ZGl2IGlkPSdcIiArIHRoaXMuY29udGFpbmVyTmFtZSArIFwiLWNoYXJ0LWhvcml6b250YWwtdG9vbHRpcCc+PC9kaXY+XFxuICAgICAgICA8ZGl2IGlkPSdcIiArIHRoaXMuY29udGFpbmVyTmFtZSArIFwiLWNoYXJ0LWhvcml6b250YWwtdmFsdWUnPjwvZGl2PlxcbiAgICAgICAgPGRpdiBpZD0nXCIgKyB0aGlzLmNvbnRhaW5lck5hbWUgKyBcIi1jaGFydC1pbmZvcm1hdGlvbic+PC9kaXY+XFxuICAgICAgICA8Y2FudmFzIGlkPSdcIiArIHRoaXMuY29udGFpbmVyTmFtZSArIFwiLWNoYXJ0Jz48L2NhbnZhcz5cXG4gICAgICA8L2Rpdj5cXG4gICAgICA8ZGl2IGlkPSdcIiArIHRoaXMuY29udGFpbmVyTmFtZSArIFwiLW1pbmltYXAtY29udGFpbmVyJz5cXG4gICAgICAgIDxjYW52YXMgaWQ9J1wiICsgdGhpcy5jb250YWluZXJOYW1lICsgXCItbWluaW1hcCc+PC9jYW52YXM+XFxuICAgICAgICA8ZGl2IGlkPSdcIiArIHRoaXMuY29udGFpbmVyTmFtZSArIFwiLW1pbmltYXAtdG9vbHRpcCc+XFxuICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgICBcIjtcbiAgICAgICAgfTtcbiAgICAgICAgTGluZS5wcm90b3R5cGUuaW5pdEVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRzLmNoYXJ0Q29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNcIiArIHRoaXMuY29udGFpbmVyTmFtZSArIFwiLWNoYXJ0LWNvbnRhaW5lclwiKTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudHMuY2hhcnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI1wiICsgdGhpcy5jb250YWluZXJOYW1lICsgXCItY2hhcnRcIik7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRzLmNoYXJ0VGl0bGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI1wiICsgdGhpcy5jb250YWluZXJOYW1lICsgXCItY2hhcnQtdGl0bGVcIik7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRzLmNoYXJ0SG9yaXpvbnRhbFRvb2x0aXAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI1wiICsgdGhpcy5jb250YWluZXJOYW1lICsgXCItY2hhcnQtaG9yaXpvbnRhbC10b29sdGlwXCIpO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5jaGFydFZlcnRpY2FsVG9vbHRpcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjXCIgKyB0aGlzLmNvbnRhaW5lck5hbWUgKyBcIi1jaGFydC12ZXJ0aWNhbC10b29sdGlwXCIpO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5jaGFydEhvcml6b250YWxWYWx1ZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjXCIgKyB0aGlzLmNvbnRhaW5lck5hbWUgKyBcIi1jaGFydC1ob3Jpem9udGFsLXZhbHVlXCIpO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5jaGFydEluZm9ybWF0aW9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNcIiArIHRoaXMuY29udGFpbmVyTmFtZSArIFwiLWNoYXJ0LWluZm9ybWF0aW9uXCIpO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5taW5pbWFwQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNcIiArIHRoaXMuY29udGFpbmVyTmFtZSArIFwiLW1pbmltYXAtY29udGFpbmVyXCIpO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50cy5taW5pbWFwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNcIiArIHRoaXMuY29udGFpbmVyTmFtZSArIFwiLW1pbmltYXBcIik7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRzLm1pbmltYXBUb29sdGlwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNcIiArIHRoaXMuY29udGFpbmVyTmFtZSArIFwiLW1pbmltYXAtdG9vbHRpcFwiKTtcbiAgICAgICAgfTtcbiAgICAgICAgTGluZS5wcm90b3R5cGUuaW5pdFN0eWxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuZWxlbWVudHMuY29udGFpbmVyO1xuICAgICAgICAgICAgdmFyIGNoYXJ0Q29udGFpbmVyID0gdGhpcy5lbGVtZW50cy5jaGFydENvbnRhaW5lcjtcbiAgICAgICAgICAgIHZhciBjaGFydCA9IHRoaXMuZWxlbWVudHMuY2hhcnQ7XG4gICAgICAgICAgICB2YXIgY2hhcnRUaXRsZSA9IHRoaXMuZWxlbWVudHMuY2hhcnRUaXRsZTtcbiAgICAgICAgICAgIHZhciBjaGFydFZlcnRpY2FsVG9vbHRpcCA9IHRoaXMuZWxlbWVudHMuY2hhcnRWZXJ0aWNhbFRvb2x0aXA7XG4gICAgICAgICAgICB2YXIgY2hhcnRIb3Jpem9udGFsVG9vbHRpcCA9IHRoaXMuZWxlbWVudHMuY2hhcnRIb3Jpem9udGFsVG9vbHRpcDtcbiAgICAgICAgICAgIHZhciBjaGFydEhvcml6b250YWxWYWx1ZSA9IHRoaXMuZWxlbWVudHMuY2hhcnRIb3Jpem9udGFsVmFsdWU7XG4gICAgICAgICAgICB2YXIgY2hhcnRJbmZvcm1hdGlvbiA9IHRoaXMuZWxlbWVudHMuY2hhcnRJbmZvcm1hdGlvbjtcbiAgICAgICAgICAgIHZhciBtaW5pbWFwQ29udGFpbmVyID0gdGhpcy5lbGVtZW50cy5taW5pbWFwQ29udGFpbmVyO1xuICAgICAgICAgICAgdmFyIG1pbmltYXAgPSB0aGlzLmVsZW1lbnRzLm1pbmltYXA7XG4gICAgICAgICAgICB2YXIgbWluaW1hcFRvb2x0aXAgPSB0aGlzLmVsZW1lbnRzLm1pbmltYXBUb29sdGlwO1xuICAgICAgICAgICAgZG9tQVBJXzEuJHN0eWxlKGNvbnRhaW5lciwge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6IFwic3BhY2UtYmV0d2VlblwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkb21BUElfMS4kc3R5bGUoY2hhcnRDb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBcImluaGVyaXRcIixcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGNvbnRhaW5lci5jbGllbnRXaWR0aCAqIChpbmRleF8xLkNIQVJUX1JFU09MVVRJT05fSEVJR0hUIC8gaW5kZXhfMS5DSEFSVF9SRVNPTFVUSU9OX1dJRFRIKSArIFwicHhcIixcbiAgICAgICAgICAgICAgICB1c2VyU2VsZWN0OiBcIm5vbmVcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZG9tQVBJXzEuJHN0eWxlKGNoYXJ0LCB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgICAgICAgICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgICAgICAgICAgICAgdXNlclNlbGVjdDogXCJub25lXCIsXG4gICAgICAgICAgICAgICAgekluZGV4OiAxMDAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRvbUFQSV8xLiRzdHlsZShjaGFydFRpdGxlLCB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IFwiaW5oZXJpdFwiLFxuICAgICAgICAgICAgICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgICAgICAgICAgICAgZm9udFNpemU6IFwiMzJweFwiLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICAgICAgZm9udFdlaWdodDogXCJib2xkXCIsXG4gICAgICAgICAgICAgICAgY29sb3I6IFwiYmxhY2tcIixcbiAgICAgICAgICAgICAgICB0ZXh0U2hhZG93OiBcIjJweCAycHggNHB4IGdyZXlcIixcbiAgICAgICAgICAgICAgICB1c2VyU2VsZWN0OiBcIm5vbmVcIixcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjZweCAwcHggNnB4IDBweFwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkb21BUElfMS4kc3R5bGUoY2hhcnRWZXJ0aWNhbFRvb2x0aXAsIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBcIm5vbmVcIixcbiAgICAgICAgICAgICAgICB3aWR0aDogXCIxcHhcIixcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IFwiaW5oZXJpdFwiLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICAgICAgdG9wOiBcIjBcIixcbiAgICAgICAgICAgICAgICBsZWZ0OiBcIjBcIixcbiAgICAgICAgICAgICAgICBib3JkZXJMZWZ0OiBcIjFweCBkYXNoZWQgIzMzM1wiLFxuICAgICAgICAgICAgICAgIHVzZXJTZWxlY3Q6IFwibm9uZVwiLFxuICAgICAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6IFwibm9uZVwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkb21BUElfMS4kc3R5bGUoY2hhcnRIb3Jpem9udGFsVG9vbHRpcCwge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwibm9uZVwiLFxuICAgICAgICAgICAgICAgIGhlaWdodDogXCIxcHhcIixcbiAgICAgICAgICAgICAgICB3aWR0aDogXCJpbmhlcml0XCIsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICAgICAgICB0b3A6IFwiMFwiLFxuICAgICAgICAgICAgICAgIGxlZnQ6IFwiMFwiLFxuICAgICAgICAgICAgICAgIGJvcmRlclRvcDogXCIxcHggZGFzaGVkICMzMzNcIixcbiAgICAgICAgICAgICAgICB1c2VyU2VsZWN0OiBcIm5vbmVcIixcbiAgICAgICAgICAgICAgICBwb2ludGVyRXZlbnRzOiBcIm5vbmVcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZG9tQVBJXzEuJHN0eWxlKGNoYXJ0SG9yaXpvbnRhbFZhbHVlLCB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogXCJub25lXCIsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICAgICAgICB0b3A6IFwiMFwiLFxuICAgICAgICAgICAgICAgIGxlZnQ6IFwiMFwiLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjMDAwXCIsXG4gICAgICAgICAgICAgICAgY29sb3I6IFwiI2ZmZlwiLFxuICAgICAgICAgICAgICAgIHVzZXJTZWxlY3Q6IFwibm9uZVwiLFxuICAgICAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6IFwibm9uZVwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkb21BUElfMS4kc3R5bGUoY2hhcnRJbmZvcm1hdGlvbiwge1xuICAgICAgICAgICAgICAgIHpJbmRleDogXCIxMFwiLFxuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwibm9uZVwiLFxuICAgICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gICAgICAgICAgICAgICAgd2lkdGg6IFwiZml0LWNvbnRlbnRcIixcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IFwiYXV0b1wiLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICAgICAgdG9wOiBcIjBcIixcbiAgICAgICAgICAgICAgICBsZWZ0OiBcIjBcIixcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwid2hpdGVcIixcbiAgICAgICAgICAgICAgICB1c2VyU2VsZWN0OiBcIm5vbmVcIixcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjhweCA4cHggOHB4IDhweFwiLFxuICAgICAgICAgICAgICAgIGJvcmRlcjogXCI0cHggc29saWQgZG9kZ2VyYmx1ZVwiLFxuICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCI0cHhcIixcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiBcIjAuNzVcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZG9tQVBJXzEuJHN0eWxlKG1pbmltYXBDb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLFxuICAgICAgICAgICAgICAgIHdpZHRoOiBcImluaGVyaXRcIixcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGNvbnRhaW5lci5jbGllbnRXaWR0aCAqIChpbmRleF8xLk1JTklNQVBfSEVJR0hUIC8gaW5kZXhfMS5DSEFSVF9SRVNPTFVUSU9OX1dJRFRIKSArIFwicHhcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZG9tQVBJXzEuJHN0eWxlKG1pbmltYXAsIHtcbiAgICAgICAgICAgICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZG9tQVBJXzEuJHN0eWxlKG1pbmltYXBUb29sdGlwLCB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogXCJub25lXCIsXG4gICAgICAgICAgICAgICAgZm9udFNpemU6IFwiMzBweFwiLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICAgICAgdG9wOiBcIjBcIixcbiAgICAgICAgICAgICAgICBsZWZ0OiBcIjBcIixcbiAgICAgICAgICAgICAgICBwb2ludGVyRXZlbnRzOiBcIm5vbmVcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBMaW5lLnByb3RvdHlwZS5pbml0Q2hhcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgY2FudmFzID0gdGhpcy5lbGVtZW50cy5jaGFydDtcbiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IGluZGV4XzEuQ0hBUlRfUkVTT0xVVElPTl9XSURUSDtcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbmRleF8xLkNIQVJUX1JFU09MVVRJT05fSEVJR0hUO1xuICAgICAgICAgICAgdGhpcy5tb3ZlWCA9IDA7XG4gICAgICAgICAgICB0aGlzLnRlbXBNb3ZlWCA9IDA7XG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLmVsZW1lbnRzLmNoYXJ0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCB0cnVlQ2hhcnRXaWR0aCA9IF9hLndpZHRoLCB0cnVlQ2hhcnRIZWlnaHQgPSBfYS5oZWlnaHQ7XG4gICAgICAgICAgICB0aGlzLnRydWVDaGFydENhbnZhc1NpemUgPSB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IHRydWVDaGFydFdpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogdHJ1ZUNoYXJ0SGVpZ2h0LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgICAgTGluZS5wcm90b3R5cGUuZHJhd0NoYXJ0ID0gZnVuY3Rpb24gKG1vdmVYKSB7XG4gICAgICAgICAgICB2YXIgY2FudmFzID0gdGhpcy5lbGVtZW50cy5jaGFydDtcbiAgICAgICAgICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBEcmF3IGFsbCBjYW52YXMgd2hpdGVcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IFwiI2ZmZlwiO1xuICAgICAgICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIENoYXJ0IGNvbnN0YW50cyBJbmZvcm1hdGlvbnNcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdmFyIExFRlRfUEFERElORyA9IDMwO1xuICAgICAgICAgICAgdmFyIFJJR0hUX1BBRERJTkcgPSAzMDtcbiAgICAgICAgICAgIHZhciBUT1BfUEFERElORyA9IDEyMDtcbiAgICAgICAgICAgIHZhciBCT1RUT01fUEFERElORyA9IDEyMDtcbiAgICAgICAgICAgIHZhciBZX1ZBTFVFX1dJRFRIID0gMjAwO1xuICAgICAgICAgICAgdmFyIFhfVkFMVUVfSEVJR0hUID0gNTI7XG4gICAgICAgICAgICB2YXIgWV9WQUxVRV9DT1VOVCA9IDc7XG4gICAgICAgICAgICB2YXIgQ0FOVkFTX0hFSUdIVCA9IGNhbnZhcy5oZWlnaHQ7XG4gICAgICAgICAgICB2YXIgQ0FOVkFTX1dJRFRIID0gY2FudmFzLndpZHRoO1xuICAgICAgICAgICAgdmFyIFRFWFRfU0laRSA9IDE1O1xuICAgICAgICAgICAgdmFyIENIQVJUX1dJRFRIID0gQ0FOVkFTX1dJRFRIIC0gTEVGVF9QQURESU5HIC0gUklHSFRfUEFERElORyAtIFlfVkFMVUVfV0lEVEg7XG4gICAgICAgICAgICB2YXIgQ0hBUlRfSEVJR0hUID0gQ0FOVkFTX0hFSUdIVCAtIFRPUF9QQURESU5HIC0gQk9UVE9NX1BBRERJTkcgLSBYX1ZBTFVFX0hFSUdIVDtcbiAgICAgICAgICAgIHZhciBMSU1JVF9ZID0gQ0hBUlRfSEVJR0hUIC8gNjtcbiAgICAgICAgICAgIHZhciBMSU1JVF9YID0gKENIQVJUX1dJRFRIIC8gKE9iamVjdC5rZXlzKHRoaXMuZGF0YSkubGVuZ3RoIC0gMSkpICogKDEgLyB0aGlzLmNoYXJ0UmF0aW8gfHwgMTApO1xuICAgICAgICAgICAgdmFyIFRPVEFMX0NIQVJUX1dJRFRIID0gTElNSVRfWCAqIChPYmplY3Qua2V5cyh0aGlzLmRhdGEpLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgdmFyIGNoYXJ0UmF0aW8gPSB0aGlzLmNoYXJ0UmF0aW8gfHwgQ0hBUlRfV0lEVEggLyBUT1RBTF9DSEFSVF9XSURUSDtcbiAgICAgICAgICAgIHRoaXMuY2hhcnRSYXRpbyA9IGNoYXJ0UmF0aW87XG4gICAgICAgICAgICB0aGlzLmNoYXJ0U2l6ZSA9IHsgd2lkdGg6IENIQVJUX1dJRFRILCBoZWlnaHQ6IENIQVJUX0hFSUdIVCB9O1xuICAgICAgICAgICAgdmFyIHRydWVNb3ZlWCA9IHJlc2l6ZV8xLnRydWVMZW5ndGhUb0NhbnZhc0xlbmd0aChtb3ZlWCwgQ0FOVkFTX1dJRFRILCB0aGlzLnRydWVDaGFydENhbnZhc1NpemUud2lkdGgpO1xuICAgICAgICAgICAgdmFyIHg7XG4gICAgICAgICAgICB2YXIgeTtcbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIGRlbCA9IHRoaXMudGVtcENoYXJ0UmF0aW8gPyB0cnVlTW92ZVggKiAodGhpcy50ZW1wQ2hhcnRSYXRpbyAvIHRoaXMuY2hhcnRSYXRpbykgOiAwO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBEcmF3IFggQXhpc1xuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB4ID0gdGhpcy50ZW1wQ2hhcnRSYXRpb1xuICAgICAgICAgICAgICAgID8gTEVGVF9QQURESU5HICsgWV9WQUxVRV9XSURUSCAtIHRydWVNb3ZlWCAqICh0aGlzLnRlbXBDaGFydFJhdGlvIC8gdGhpcy5jaGFydFJhdGlvKVxuICAgICAgICAgICAgICAgIDogTEVGVF9QQURESU5HICsgWV9WQUxVRV9XSURUSCAtIHRydWVNb3ZlWDtcbiAgICAgICAgICAgIHkgPSBDQU5WQVNfSEVJR0hUIC0gQk9UVE9NX1BBRERJTkc7XG4gICAgICAgICAgICB2YXIgZGF0YUxpbWl0ID0gTWF0aC5yb3VuZChPYmplY3Qua2V5cyh0aGlzLmRhdGEpLmxlbmd0aCAvIDUyKTtcbiAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGFydFJhdGlvID4gMC43NSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSAlIChkYXRhTGltaXQgKiA0KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IFwiIzMzM1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5LnNwbGl0KFwiL1wiKVsxXSA9PT0gXCIxXCIgPyAoY3R4LmZvbnQgPSBcImJvbGQgNDBweCBhcmlhbFwiKSA6IChjdHguZm9udCA9IFwiNDBweCBhcmlhbFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5maWxsUmVjdCh4LCB5IC0gWF9WQUxVRV9IRUlHSFQgLSAxNCwgMiwgMjApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxUZXh0KGtleSwgeCwgeSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jaGFydFJhdGlvID4gMC4yKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICUgKGRhdGFMaW1pdCAqIDIpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gXCIjMzMzXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkuc3BsaXQoXCIvXCIpWzFdID09PSBcIjFcIiA/IChjdHguZm9udCA9IFwiYm9sZCA0MHB4IGFyaWFsXCIpIDogKGN0eC5mb250ID0gXCI0MHB4IGFyaWFsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KHgsIHkgLSBYX1ZBTFVFX0hFSUdIVCAtIDE0LCAyLCAyMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFRleHQoa2V5LCB4LCB5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmNoYXJ0UmF0aW8gPiAwLjA1KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpICUgZGF0YUxpbWl0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gXCIjMzMzXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkuc3BsaXQoXCIvXCIpWzFdID09PSBcIjFcIiA/IChjdHguZm9udCA9IFwiYm9sZCA0MHB4IGFyaWFsXCIpIDogKGN0eC5mb250ID0gXCI0MHB4IGFyaWFsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxSZWN0KHgsIHkgLSBYX1ZBTFVFX0hFSUdIVCAtIDE0LCAyLCAyMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFRleHQoa2V5LCB4LCB5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IFwiIzMzM1wiO1xuICAgICAgICAgICAgICAgICAgICBrZXkuc3BsaXQoXCIvXCIpWzFdID09PSBcIjFcIiA/IChjdHguZm9udCA9IFwiYm9sZCA0MHB4IGFyaWFsXCIpIDogKGN0eC5mb250ID0gXCI0MHB4IGFyaWFsXCIpO1xuICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoeCwgeSAtIFhfVkFMVUVfSEVJR0hUIC0gMTQsIDIsIDIwKTtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmZpbGxUZXh0KGtleSwgeCwgeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHggKz0gTElNSVRfWDtcbiAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIERyYXcgTGluZSBDaGFydFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICB2YXIgbmV3RGF0YVBvc2l0aW9ucyA9IFtdO1xuICAgICAgICAgICAgeCA9IHRoaXMudGVtcENoYXJ0UmF0aW9cbiAgICAgICAgICAgICAgICA/IExFRlRfUEFERElORyArIFlfVkFMVUVfV0lEVEggLSB0cnVlTW92ZVggKiAodGhpcy50ZW1wQ2hhcnRSYXRpbyAvIHRoaXMuY2hhcnRSYXRpbylcbiAgICAgICAgICAgICAgICA6IExFRlRfUEFERElORyArIFlfVkFMVUVfV0lEVEggLSB0cnVlTW92ZVg7XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5kYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hhcnRSYXRpbyA+IDAuNykge1xuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVdpZHRoID0gNTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jaGFydFJhdGlvID4gMC4yKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSA3O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDEwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVJbkNoYXJ0ID0gQ0hBUlRfSEVJR0hUIC8gMiArIChDSEFSVF9IRUlHSFQgLyAyKSAqICh0aGlzLmRhdGFba2V5XSAvIHRoaXMuYWJzKTtcbiAgICAgICAgICAgICAgICB2YXIgY2hhcnREYXRhWSA9IENBTlZBU19IRUlHSFQgLSBCT1RUT01fUEFERElORyAtIFhfVkFMVUVfSEVJR0hUIC0gdmFsdWVJbkNoYXJ0IC0gMTU7XG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4LCBjaGFydERhdGFZKTtcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBcImRvZGdlcmJsdWVcIjtcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oeCwgY2hhcnREYXRhWSk7XG4gICAgICAgICAgICAgICAgLy8gSWYgZGF0YSBwb3NpdGlvbiBwdXNoZWQsIGRvbid0IGV4ZWN1dGVcbiAgICAgICAgICAgICAgICBuZXdEYXRhUG9zaXRpb25zLnB1c2goW1xuICAgICAgICAgICAgICAgICAgICByZXNpemVfMS5jYW52YXNMZW5ndGhUb1RydWVMZW5ndGgoeCwgQ0FOVkFTX1dJRFRILCB0aGlzLnRydWVDaGFydENhbnZhc1NpemUud2lkdGgpLFxuICAgICAgICAgICAgICAgICAgICByZXNpemVfMS5jYW52YXNMZW5ndGhUb1RydWVMZW5ndGgoY2hhcnREYXRhWSwgQ0FOVkFTX0hFSUdIVCwgdGhpcy50cnVlQ2hhcnRDYW52YXNTaXplLmhlaWdodCksXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgeCArPSBMSU1JVF9YO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5kYXRhUG9zaXRpb25zID0gbmV3RGF0YVBvc2l0aW9ucztcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogRHJhdyBBcmMgUG9pbnRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgeCA9IHRoaXMudGVtcENoYXJ0UmF0aW9cbiAgICAgICAgICAgICAgICA/IExFRlRfUEFERElORyArIFlfVkFMVUVfV0lEVEggLSB0cnVlTW92ZVggKiAodGhpcy50ZW1wQ2hhcnRSYXRpbyAvIHRoaXMuY2hhcnRSYXRpbylcbiAgICAgICAgICAgICAgICA6IExFRlRfUEFERElORyArIFlfVkFMVUVfV0lEVEggLSB0cnVlTW92ZVg7XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5kYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hhcnRSYXRpbyA+IDAuNykge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlSW5DaGFydCA9IENIQVJUX0hFSUdIVCAvIDIgKyAoQ0hBUlRfSEVJR0hUIC8gMikgKiAodGhpcy5kYXRhW2tleV0gLyB0aGlzLmFicyk7XG4gICAgICAgICAgICAgICAgdmFyIGNoYXJ0RGF0YVkgPSBDQU5WQVNfSEVJR0hUIC0gQk9UVE9NX1BBRERJTkcgLSBYX1ZBTFVFX0hFSUdIVCAtIHZhbHVlSW5DaGFydCAtIDE1O1xuICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBcImRvZGdlcmJsdWVcIjtcbiAgICAgICAgICAgICAgICBjdHguYXJjKHgsIGNoYXJ0RGF0YVksIDEyLCAwLCBNYXRoLlBJICogMiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IFwiI2ZmZlwiO1xuICAgICAgICAgICAgICAgIGN0eC5hcmMoeCwgQ0FOVkFTX0hFSUdIVCAtIEJPVFRPTV9QQURESU5HIC0gWF9WQUxVRV9IRUlHSFQgLSB2YWx1ZUluQ2hhcnQgLSAxNSwgOSwgMCwgTWF0aC5QSSAqIDIsIHRydWUpO1xuICAgICAgICAgICAgICAgIGN0eC5maWxsKCk7XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgICAgIHggKz0gTElNSVRfWDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogRHJhdyBSaWdodCBQYWRkaW5nIFdoaXRlXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBcIiNmZmZcIjtcbiAgICAgICAgICAgIGN0eC5maWxsUmVjdChMRUZUX1BBRERJTkcgKyBZX1ZBTFVFX1dJRFRIICsgQ0hBUlRfV0lEVEgsIFRPUF9QQURESU5HLCBDSEFSVF9XSURUSCwgQ0hBUlRfSEVJR0hUKTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogRHJhdyBMZWZ0IFBhZGRpbmcgJiBZIFZhbHVlIFdpZHRoIFdoaXRlXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBcIiNmZmZmZmZcIjtcbiAgICAgICAgICAgIGN0eC5maWxsUmVjdCgwLCAwLCBMRUZUX1BBRERJTkcgKyBZX1ZBTFVFX1dJRFRILCBDQU5WQVNfSEVJR0hUKTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogRHJhdyBZIEF4aXNcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgeSA9IENBTlZBU19IRUlHSFQgLSBCT1RUT01fUEFERElORyAtIFhfVkFMVUVfSEVJR0hUO1xuICAgICAgICAgICAgdmFyIGxlZnRWYWx1ZSA9IC10aGlzLmFicztcbiAgICAgICAgICAgIGZvciAodmFyIGlfMSA9IDA7IGlfMSA8IFlfVkFMVUVfQ09VTlQ7IGlfMSsrKSB7XG4gICAgICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBcImJsYWNrXCI7XG4gICAgICAgICAgICAgICAgY3R4LmZvbnQgPSBcIjQwcHggYXJpYWxcIjtcbiAgICAgICAgICAgICAgICBjdHgubGluZVdpZHRoID0gMjtcbiAgICAgICAgICAgICAgICBjdHgudGV4dEFsaWduID0gXCJlbmRcIjtcbiAgICAgICAgICAgICAgICBjdHguZmlsbFRleHQoU3RyaW5nKE1hdGgucm91bmQobGVmdFZhbHVlKSksIFlfVkFMVUVfV0lEVEgsIHkpO1xuICAgICAgICAgICAgICAgIGN0eC5tb3ZlVG8oTEVGVF9QQURESU5HICsgWV9WQUxVRV9XSURUSCwgeSAtIFRFWFRfU0laRSk7XG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyhDQU5WQVNfV0lEVEggLSBSSUdIVF9QQURESU5HLCB5IC0gVEVYVF9TSVpFKTtcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBcIiM0NDRcIjtcbiAgICAgICAgICAgICAgICBpZiAoaV8xID09PSAzKVxuICAgICAgICAgICAgICAgICAgICBjdHgubGluZVdpZHRoID0gNDtcbiAgICAgICAgICAgICAgICBjdHguc3Ryb2tlKCk7XG4gICAgICAgICAgICAgICAgbGVmdFZhbHVlICs9IHRoaXMuYWJzIC8gMztcbiAgICAgICAgICAgICAgICB5IC09IExJTUlUX1k7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdHgudGV4dEFsaWduID0gXCJzdGFydFwiO1xuICAgICAgICB9O1xuICAgICAgICBMaW5lLnByb3RvdHlwZS5pbml0TWluaW1hcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjYW52YXMgPSB0aGlzLmVsZW1lbnRzLm1pbmltYXA7XG4gICAgICAgICAgICBjYW52YXMud2lkdGggPSBpbmRleF8xLk1JTklNQVBfUkVTT0xVVElPTl9XSURUSDtcbiAgICAgICAgICAgIHZhciBfYSA9IHRoaXMuZWxlbWVudHMubWluaW1hcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgdHJ1ZU1pbmltYXBXaWR0aCA9IF9hLndpZHRoLCB0cnVlTWluaW1hcEhlaWdodCA9IF9hLmhlaWdodDtcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSAoaW5kZXhfMS5DSEFSVF9SRVNPTFVUSU9OX1dJRFRIICogdHJ1ZU1pbmltYXBIZWlnaHQpIC8gdHJ1ZU1pbmltYXBXaWR0aDtcbiAgICAgICAgICAgIHRoaXMudHJ1ZU1pbmltYXBDYW52YXNTaXplID0ge1xuICAgICAgICAgICAgICAgIHdpZHRoOiB0cnVlTWluaW1hcFdpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogdHJ1ZU1pbmltYXBIZWlnaHQsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICBMaW5lLnByb3RvdHlwZS5kcmF3TWluaW1hcCA9IGZ1bmN0aW9uIChtb3ZlWCkge1xuICAgICAgICAgICAgdmFyIGNhbnZhcyA9IHRoaXMuZWxlbWVudHMubWluaW1hcDtcbiAgICAgICAgICAgIHZhciBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBEcmF3IGFsbCBXaGl0ZVxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gXCIjZmZmXCI7XG4gICAgICAgICAgICBjdHguZmlsbFJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogTWluaW1hcCBjb25zdGFudHMgSW5mb3JtYXRpb25zXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHZhciBMRUZUX1BBRERJTkcgPSAzMDtcbiAgICAgICAgICAgIHZhciBSSUdIVF9QQURESU5HID0gMzA7XG4gICAgICAgICAgICB2YXIgVE9QX1BBRERJTkcgPSAzMDtcbiAgICAgICAgICAgIHZhciBCT1RUT01fUEFERElORyA9IDYwO1xuICAgICAgICAgICAgdmFyIFRFWFRfU0laRSA9IDQwO1xuICAgICAgICAgICAgdmFyIENBTlZBU19IRUlHSFQgPSBjYW52YXMuaGVpZ2h0O1xuICAgICAgICAgICAgdmFyIENBTlZBU19XSURUSCA9IGNhbnZhcy53aWR0aDtcbiAgICAgICAgICAgIHZhciBNSU5JTUFQX1dJRFRIID0gQ0FOVkFTX1dJRFRIIC0gTEVGVF9QQURESU5HIC0gUklHSFRfUEFERElORztcbiAgICAgICAgICAgIHZhciBNSU5JTUFQX0hFSUdIVCA9IENBTlZBU19IRUlHSFQgLSBUT1BfUEFERElORyAtIEJPVFRPTV9QQURESU5HO1xuICAgICAgICAgICAgdmFyIExJTUlUX1ggPSBNSU5JTUFQX1dJRFRIIC8gKE9iamVjdC5rZXlzKHRoaXMuZGF0YSkubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB0aGlzLm1pbmltYXBTaXplID0geyB3aWR0aDogTUlOSU1BUF9XSURUSCwgaGVpZ2h0OiBNSU5JTUFQX0hFSUdIVCB9O1xuICAgICAgICAgICAgdmFyIHJhdGlvID0gdGhpcy50ZW1wQ2hhcnRSYXRpbyB8fCB0aGlzLmNoYXJ0UmF0aW87XG4gICAgICAgICAgICB2YXIgdHJ1ZU1vdmVYID0gcmVzaXplXzEuY2hhcnRMZW5ndGhUb01pbmltYXBMZW5ndGgocmVzaXplXzEudHJ1ZUxlbmd0aFRvQ2FudmFzTGVuZ3RoKG1vdmVYLCBDQU5WQVNfV0lEVEgsIHRoaXMudHJ1ZUNoYXJ0Q2FudmFzU2l6ZS53aWR0aCksIHRoaXMuY2hhcnRTaXplLndpZHRoLCBNSU5JTUFQX1dJRFRILCByYXRpbyk7XG4gICAgICAgICAgICB2YXIgeDtcbiAgICAgICAgICAgIHZhciB5O1xuICAgICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBEcmF3IE1pbmltYXAgQm94XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBcInJnYigyMjUsIDIzMiwgMjUyKVwiO1xuICAgICAgICAgICAgY3R4LmZpbGxSZWN0KExFRlRfUEFERElORywgVE9QX1BBRERJTkcsIE1JTklNQVBfV0lEVEgsIE1JTklNQVBfSEVJR0hUKTtcbiAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSAyO1xuICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gXCIjMDAwXCI7XG4gICAgICAgICAgICBjdHguc3Ryb2tlUmVjdChMRUZUX1BBRERJTkcsIFRPUF9QQURESU5HLCBNSU5JTUFQX1dJRFRILCBNSU5JTUFQX0hFSUdIVCk7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIERyYXcgVmlzaWJsZSBNaW5pbWFwIEJveFxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gXCIjZmZmXCI7XG4gICAgICAgICAgICBjdHguZmlsbFJlY3QoTEVGVF9QQURESU5HICsgdHJ1ZU1vdmVYLCBUT1BfUEFERElORywgTUlOSU1BUF9XSURUSCAqIHRoaXMuY2hhcnRSYXRpbywgTUlOSU1BUF9IRUlHSFQpO1xuICAgICAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gXCIjMDAwXCI7XG4gICAgICAgICAgICBjdHgubGluZVdpZHRoID0gNTtcbiAgICAgICAgICAgIGN0eC5zdHJva2VSZWN0KExFRlRfUEFERElORyArIHRydWVNb3ZlWCwgVE9QX1BBRERJTkcsIE1JTklNQVBfV0lEVEggKiB0aGlzLmNoYXJ0UmF0aW8sIE1JTklNQVBfSEVJR0hUKTtcbiAgICAgICAgICAgIHRoaXMubWluaW1hcFBvc2l0aW9ucyA9IFtcbiAgICAgICAgICAgICAgICByZXNpemVfMS5jYW52YXNMZW5ndGhUb1RydWVMZW5ndGgoTEVGVF9QQURESU5HICsgdHJ1ZU1vdmVYLCBDQU5WQVNfV0lEVEgsIHRoaXMudHJ1ZU1pbmltYXBDYW52YXNTaXplLndpZHRoKSxcbiAgICAgICAgICAgICAgICByZXNpemVfMS5jYW52YXNMZW5ndGhUb1RydWVMZW5ndGgoTEVGVF9QQURESU5HICsgdHJ1ZU1vdmVYICsgTUlOSU1BUF9XSURUSCAqIHRoaXMuY2hhcnRSYXRpbywgQ0FOVkFTX1dJRFRILCB0aGlzLnRydWVNaW5pbWFwQ2FudmFzU2l6ZS53aWR0aCksXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBEcmF3IE1pbmltYXBcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgeCA9IExFRlRfUEFERElORztcbiAgICAgICAgICAgIGN0eC5iZWdpblBhdGgoKTtcbiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWVJbkNoYXJ0ID0gTUlOSU1BUF9IRUlHSFQgLyAyICsgKE1JTklNQVBfSEVJR0hUIC8gMikgKiAodGhpcy5kYXRhW2tleV0gLyB0aGlzLmFicyk7XG4gICAgICAgICAgICAgICAgY3R4LmxpbmVUbyh4LCBDQU5WQVNfSEVJR0hUIC0gQk9UVE9NX1BBRERJTkcgLSB2YWx1ZUluQ2hhcnQpO1xuICAgICAgICAgICAgICAgIGN0eC5saW5lV2lkdGggPSAzO1xuICAgICAgICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9IFwiZG9kZ2VyYmx1ZVwiO1xuICAgICAgICAgICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gXCJkb2RnZXJibHVlXCI7XG4gICAgICAgICAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgICAgICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgICAgICAgICAgY3R4Lm1vdmVUbyh4LCBDQU5WQVNfSEVJR0hUIC0gQk9UVE9NX1BBRERJTkcgLSB2YWx1ZUluQ2hhcnQpO1xuICAgICAgICAgICAgICAgIHggKz0gTElNSVRfWDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogRHJhdyBYIEF4aXNcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgeCA9IExFRlRfUEFERElORyAtIFRFWFRfU0laRSAvIDI7XG4gICAgICAgICAgICB5ID0gQ0FOVkFTX0hFSUdIVCAtIEJPVFRPTV9QQURESU5HICsgVEVYVF9TSVpFO1xuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChOdW1iZXIoa2V5LnNwbGl0KFwiL1wiKVsxXSkgJSAzMSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gXCJibGFja1wiO1xuICAgICAgICAgICAgICAgICAgICBjdHguZm9udCA9IFwiNDBweCBhcmlhbFwiO1xuICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFRleHQoa2V5LCB4LCB5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeCArPSBMSU1JVF9YO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBMaW5lLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHZhciBtb3VzZWRvd25GbGFnID0gbnVsbDtcbiAgICAgICAgICAgIHZhciBjaGFydEV2ZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBjaGFydENvbnRhaW5lciA9IF90aGlzLmVsZW1lbnRzLmNoYXJ0Q29udGFpbmVyO1xuICAgICAgICAgICAgICAgIGNoYXJ0Q29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0ICE9PSBfdGhpcy5lbGVtZW50cy5jaGFydClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdXNlZG93bkZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnRlbXBNb3ZlWCA9IG1vdXNlZG93bkZsYWcgLSBlLm9mZnNldFg7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hhcnRWZXJ0aWNhbFRvb2x0aXBfMSA9IF90aGlzLmVsZW1lbnRzLmNoYXJ0VmVydGljYWxUb29sdGlwO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoYXJ0SG9yaXpvbnRhbFRvb2x0aXAgPSBfdGhpcy5lbGVtZW50cy5jaGFydEhvcml6b250YWxUb29sdGlwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRWZXJ0aWNhbFRvb2x0aXBfMS5zdHlsZS5sZWZ0ID0gZS5vZmZzZXRYICsgXCJweFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnRIb3Jpem9udGFsVG9vbHRpcC5zdHlsZS50b3AgPSBlLm9mZnNldFkgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5kcmF3Q2hhcnQoX3RoaXMubW92ZVggKyBfdGhpcy50ZW1wTW92ZVgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZHJhd01pbmltYXAoX3RoaXMubW92ZVggKyBfdGhpcy50ZW1wTW92ZVgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoYXJ0VmVydGljYWxUb29sdGlwXzIgPSBfdGhpcy5lbGVtZW50cy5jaGFydFZlcnRpY2FsVG9vbHRpcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGFydEhvcml6b250YWxUb29sdGlwID0gX3RoaXMuZWxlbWVudHMuY2hhcnRIb3Jpem9udGFsVG9vbHRpcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0VmVydGljYWxUb29sdGlwXzIuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0SG9yaXpvbnRhbFRvb2x0aXAuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0SG9yaXpvbnRhbFRvb2x0aXAuc3R5bGUudG9wID0gZS5vZmZzZXRZICsgXCJweFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZHJhd0NoYXJ0KF90aGlzLm1vdmVYKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmRyYXdNaW5pbWFwKF90aGlzLm1vdmVYKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgY2hhcnRJbmZvcm1hdGlvbiA9IF90aGlzLmVsZW1lbnRzLmNoYXJ0SW5mb3JtYXRpb247XG4gICAgICAgICAgICAgICAgICAgIHZhciBjaGFydEhvcml6b250YWxWYWx1ZSA9IF90aGlzLmVsZW1lbnRzLmNoYXJ0SG9yaXpvbnRhbFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBjaGFydEluZm9ybWF0aW9uLnN0eWxlLmxlZnQgPSBlLm9mZnNldFggKyAyMCArIFwicHhcIjtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnRJbmZvcm1hdGlvbi5zdHlsZS50b3AgPSBlLm9mZnNldFkgKyAyMCArIFwicHhcIjtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnRIb3Jpem9udGFsVmFsdWUuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnRIb3Jpem9udGFsVmFsdWUuc3R5bGUubGVmdCA9IFwiMHB4XCI7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJ0SG9yaXpvbnRhbFZhbHVlLnN0eWxlLnRvcCA9IGUub2Zmc2V0WSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnRIb3Jpem9udGFsVmFsdWUuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUub2Zmc2V0WSA+XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNpemVfMS5jYW52YXNMZW5ndGhUb1RydWVMZW5ndGgoMTA4MCAtIDEyMCAtIDUyIC0gMTUgLSAoX3RoaXMuY2hhcnRTaXplLmhlaWdodCAvIDYpICogNiwgMTA4MCwgX3RoaXMudHJ1ZUNoYXJ0Q2FudmFzU2l6ZS5oZWlnaHQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBlLm9mZnNldFkgPCByZXNpemVfMS5jYW52YXNMZW5ndGhUb1RydWVMZW5ndGgoMTA4MCAtIDEyMCAtIDUyIC0gMTUsIDEwODAsIF90aGlzLnRydWVDaGFydENhbnZhc1NpemUuaGVpZ2h0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gcmVzaXplXzEuY2FudmFzTGVuZ3RoVG9UcnVlTGVuZ3RoKDEwODAgLSAxMjAgLSA1MiAtIDE1IC0gKF90aGlzLmNoYXJ0U2l6ZS5oZWlnaHQgLyA2KSAqIDYsIDEwODAsIF90aGlzLnRydWVDaGFydENhbnZhc1NpemUuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbmQgPSByZXNpemVfMS5jYW52YXNMZW5ndGhUb1RydWVMZW5ndGgoMTA4MCAtIDEyMCAtIDUyIC0gMTUsIDEwODAsIF90aGlzLnRydWVDaGFydENhbnZhc1NpemUuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0SG9yaXpvbnRhbFZhbHVlLmlubmVySFRNTCA9IFwiXCIgKyBNYXRoLnJvdW5kKF90aGlzLmFicyAtICgoZS5vZmZzZXRZIC0gc3RhcnQpIC8gKGVuZCAtIHN0YXJ0KSkgKiBfdGhpcy5hYnMgKiAyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgY2hhcnRWZXJ0aWNhbFRvb2x0aXAgPSBfdGhpcy5lbGVtZW50cy5jaGFydFZlcnRpY2FsVG9vbHRpcDtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZGF0YVBvc2l0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5vZmZzZXRYID4gaXRlbVswXSAtIDYgJiYgZS5vZmZzZXRYIDwgaXRlbVswXSArIDYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hhcnRJbmZvcm1hdGlvbkhUTUwgPSBfdGhpcy5kYXRhQ29udGVudHNbaV0ucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGN1cikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGFjYyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCI8ZGl2IHN0eWxlPVxcXCJkaXNwbGF5OmZsZXg7IGp1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO1xcXCI+PGRpdj5cIiArIGN1ci50eXBlICsgXCI8L2Rpdj48ZGl2IHN0eWxlPSdwYWRkaW5nLWxlZnQ6MTJweCc+XCIgKyBjdXIuYW1vdW50ICsgXCI8L2Rpdj48L2Rpdj5cIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIFwiPGRpdiBzdHlsZT1cXFwiY29sb3I6IzAwMDsgZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1hbGlnbjpjZW50ZXI7IHBhZGRpbmc6MnB4IDBweCAycHggMHB4XFxcIj5cIiArIE9iamVjdC5rZXlzKF90aGlzLmRhdGEpW2ldICsgXCI8L2Rpdj5cIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXCI8ZGl2IHN0eWxlPVxcXCJmb250LXdlaWdodDpib2xkOyBtYXJnaW4tdG9wOjZweFxcXCI+XFx1Q0QxRCBcXHVBRTA4XFx1QzU2MSA6IFwiICsgX3RoaXMuZGF0YUNvbnRlbnRzW2ldLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBjdXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2MgKyBjdXIuYW1vdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAwKSArIFwiPC9kaXY+XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJ0SW5mb3JtYXRpb24uc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydFZlcnRpY2FsVG9vbHRpcC5zdHlsZS5sZWZ0ID0gaXRlbVswXSArIFwicHhcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFydEluZm9ybWF0aW9uLmlubmVySFRNTCA9IGNoYXJ0SW5mb3JtYXRpb25IVE1MO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjaGFydENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vdXNlZG93bkZsYWcgPSBlLm9mZnNldFg7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY2hhcnRDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZGF0YVBvc2l0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtWzBdIC09IF90aGlzLnRlbXBNb3ZlWDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLm1vdmVYICs9IF90aGlzLnRlbXBNb3ZlWDtcbiAgICAgICAgICAgICAgICAgICAgbW91c2Vkb3duRmxhZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnRlbXBNb3ZlWCA9IDA7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY2hhcnRDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5kYXRhUG9zaXRpb25zLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1bMF0gLT0gX3RoaXMudGVtcE1vdmVYO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNoYXJ0VmVydGljYWxUb29sdGlwID0gX3RoaXMuZWxlbWVudHMuY2hhcnRWZXJ0aWNhbFRvb2x0aXA7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjaGFydEhvcml6b250YWxUb29sdGlwID0gX3RoaXMuZWxlbWVudHMuY2hhcnRIb3Jpem9udGFsVG9vbHRpcDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNoYXJ0SW5mb3JtYXRpb24gPSBfdGhpcy5lbGVtZW50cy5jaGFydEluZm9ybWF0aW9uO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2hhcnRIb3Jpem9udGFsVmFsdWUgPSBfdGhpcy5lbGVtZW50cy5jaGFydEhvcml6b250YWxWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnRWZXJ0aWNhbFRvb2x0aXAuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgICAgICAgICBjaGFydEhvcml6b250YWxUb29sdGlwLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgY2hhcnRJbmZvcm1hdGlvbi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJ0SG9yaXpvbnRhbFZhbHVlLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMubW92ZVggKz0gX3RoaXMudGVtcE1vdmVYO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5kcmF3Q2hhcnQoX3RoaXMubW92ZVgpO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5kcmF3TWluaW1hcChfdGhpcy5tb3ZlWCk7XG4gICAgICAgICAgICAgICAgICAgIG1vdXNlZG93bkZsYWcgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy50ZW1wTW92ZVggPSAwO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhciBtaW5pbWFwRXZlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1pbmltYXBDb250YWluZXIgPSBfdGhpcy5lbGVtZW50cy5taW5pbWFwQ29udGFpbmVyO1xuICAgICAgICAgICAgICAgIHZhciByaWdodFJlc2l6ZUZsYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB2YXIgbGVmdFJlc2l6ZUZsYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB2YXIgbW92ZUZsYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBtaW5pbWFwQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vdXNlZG93bkZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyaWdodFJlc2l6ZUZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbW92ZVJhdGlvID0gKG1vdXNlZG93bkZsYWcgLSBlLm9mZnNldFgpIC9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzaXplXzEuY2FudmFzTGVuZ3RoVG9UcnVlTGVuZ3RoKF90aGlzLm1pbmltYXBTaXplLndpZHRoLCAxOTIwLCBfdGhpcy50cnVlTWluaW1hcENhbnZhc1NpemUud2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmNoYXJ0UmF0aW8gPSBfdGhpcy50ZW1wQ2hhcnRSYXRpbyAtIG1vdmVSYXRpbztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5kcmF3Q2hhcnQoX3RoaXMubW92ZVgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmRyYXdNaW5pbWFwKF90aGlzLm1vdmVYKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxlZnRSZXNpemVGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMudGVtcE1vdmVYID0gcmVzaXplXzEuY2FudmFzTGVuZ3RoVG9UcnVlTGVuZ3RoKHJlc2l6ZV8xLm1pbmltYXBMZW5ndGhUb0NoYXJ0TGVuZ3RoKHJlc2l6ZV8xLnRydWVMZW5ndGhUb0NhbnZhc0xlbmd0aChtb3VzZWRvd25GbGFnIC0gZS5vZmZzZXRYLCAxOTIwLCBfdGhpcy50cnVlTWluaW1hcENhbnZhc1NpemUud2lkdGgpLCBfdGhpcy5jaGFydFNpemUud2lkdGgsIF90aGlzLm1pbmltYXBTaXplLndpZHRoLCBfdGhpcy5jaGFydFJhdGlvKSwgMTkyMCwgX3RoaXMudHJ1ZUNoYXJ0Q2FudmFzU2l6ZS53aWR0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZHJhd0NoYXJ0KF90aGlzLm1vdmVYIC0gX3RoaXMudGVtcE1vdmVYKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5kcmF3TWluaW1hcChfdGhpcy5tb3ZlWCAtIF90aGlzLnRlbXBNb3ZlWCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtb3ZlRmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnRlbXBNb3ZlWCA9IHJlc2l6ZV8xLmNhbnZhc0xlbmd0aFRvVHJ1ZUxlbmd0aChyZXNpemVfMS5taW5pbWFwTGVuZ3RoVG9DaGFydExlbmd0aChyZXNpemVfMS50cnVlTGVuZ3RoVG9DYW52YXNMZW5ndGgobW91c2Vkb3duRmxhZyAtIGUub2Zmc2V0WCwgMTkyMCwgX3RoaXMudHJ1ZU1pbmltYXBDYW52YXNTaXplLndpZHRoKSwgX3RoaXMuY2hhcnRTaXplLndpZHRoLCBfdGhpcy5taW5pbWFwU2l6ZS53aWR0aCwgX3RoaXMuY2hhcnRSYXRpbyksIDE5MjAsIF90aGlzLnRydWVDaGFydENhbnZhc1NpemUud2lkdGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmRyYXdDaGFydChfdGhpcy5tb3ZlWCAtIF90aGlzLnRlbXBNb3ZlWCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZHJhd01pbmltYXAoX3RoaXMubW92ZVggLSBfdGhpcy50ZW1wTW92ZVgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1pbmltYXBDb250YWluZXIuc3R5bGUuY3Vyc29yID0gXCJkZWZhdWx0XCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLm9mZnNldFggPiBfdGhpcy5taW5pbWFwUG9zaXRpb25zWzBdIC0gMyAmJiBlLm9mZnNldFggPCBfdGhpcy5taW5pbWFwUG9zaXRpb25zWzBdICsgMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW1hcENvbnRhaW5lci5zdHlsZS5jdXJzb3IgPSBcImV3LXJlc2l6ZVwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLm9mZnNldFggPiBfdGhpcy5taW5pbWFwUG9zaXRpb25zWzFdIC0gMyAmJiBlLm9mZnNldFggPCBfdGhpcy5taW5pbWFwUG9zaXRpb25zWzFdICsgMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW1hcENvbnRhaW5lci5zdHlsZS5jdXJzb3IgPSBcImV3LXJlc2l6ZVwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLm9mZnNldFggPiBfdGhpcy5taW5pbWFwUG9zaXRpb25zWzBdICsgMyAmJiBlLm9mZnNldFggPCBfdGhpcy5taW5pbWFwUG9zaXRpb25zWzFdIC0gMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW1hcENvbnRhaW5lci5zdHlsZS5jdXJzb3IgPSBcImdyYWJcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG1pbmltYXBDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICBtb3VzZWRvd25GbGFnID0gZS5vZmZzZXRYO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy50ZW1wQ2hhcnRSYXRpbyA9IF90aGlzLmNoYXJ0UmF0aW87XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLm9mZnNldFggPiBfdGhpcy5taW5pbWFwUG9zaXRpb25zWzBdIC0gMyAmJiBlLm9mZnNldFggPCBfdGhpcy5taW5pbWFwUG9zaXRpb25zWzBdICsgMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFJlc2l6ZUZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLm9mZnNldFggPiBfdGhpcy5taW5pbWFwUG9zaXRpb25zWzFdIC0gMyAmJiBlLm9mZnNldFggPCBfdGhpcy5taW5pbWFwUG9zaXRpb25zWzFdICsgMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRSZXNpemVGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZS5vZmZzZXRYID4gX3RoaXMubWluaW1hcFBvc2l0aW9uc1swXSArIDMgJiYgZS5vZmZzZXRYIDwgX3RoaXMubWluaW1hcFBvc2l0aW9uc1sxXSAtIDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb3VzZWRvd25GbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZUZsYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbWluaW1hcENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy50ZW1wQ2hhcnRSYXRpbyAmJiByaWdodFJlc2l6ZUZsYWcpXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5tb3ZlWCAqPSBfdGhpcy50ZW1wQ2hhcnRSYXRpbyAvIF90aGlzLmNoYXJ0UmF0aW87XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF90aGlzLnRlbXBDaGFydFJhdGlvICYmIChsZWZ0UmVzaXplRmxhZyB8fCBtb3ZlRmxhZykpXG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5tb3ZlWCAtPSBfdGhpcy50ZW1wTW92ZVg7XG4gICAgICAgICAgICAgICAgICAgIGxlZnRSZXNpemVGbGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0UmVzaXplRmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBtb3ZlRmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBtb3VzZWRvd25GbGFnID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMudGVtcENoYXJ0UmF0aW8gPSAwO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy50ZW1wTW92ZVggPSAwO1xuICAgICAgICAgICAgICAgICAgICBkZWwgPSAwO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG1pbmltYXBDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMudGVtcENoYXJ0UmF0aW8gJiYgcmlnaHRSZXNpemVGbGFnKVxuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMubW92ZVggKj0gX3RoaXMudGVtcENoYXJ0UmF0aW8gLyBfdGhpcy5jaGFydFJhdGlvO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChfdGhpcy50ZW1wQ2hhcnRSYXRpbyAmJiAobGVmdFJlc2l6ZUZsYWcgfHwgbW92ZUZsYWcpKVxuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMubW92ZVggLT0gX3RoaXMudGVtcE1vdmVYO1xuICAgICAgICAgICAgICAgICAgICBsZWZ0UmVzaXplRmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByaWdodFJlc2l6ZUZsYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbW92ZUZsYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMudGVtcE1vdmVYID0gMDtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMudGVtcENoYXJ0UmF0aW8gPSAwO1xuICAgICAgICAgICAgICAgICAgICBtb3VzZWRvd25GbGFnID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjaGFydEV2ZW50KCk7XG4gICAgICAgICAgICBtaW5pbWFwRXZlbnQoKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIExpbmU7XG4gICAgfSgpKTtcbiAgICBleHBvcnRzLmRlZmF1bHQgPSBMaW5lO1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3\n')},function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n "use strict";\n Object.defineProperty(exports, "__esModule", { value: true });\n exports.tempFunction = void 0;\n /**\n * If this function is removed, interface is not compiled\n */\n exports.tempFunction = function (name) { return 23; };\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy90eXBlcy50cz9iZTE3Il0sInNvdXJjZXNDb250ZW50IjpbImRlZmluZShbXCJyZXF1aXJlXCIsIFwiZXhwb3J0c1wiXSwgZnVuY3Rpb24gKHJlcXVpcmUsIGV4cG9ydHMpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4gICAgZXhwb3J0cy50ZW1wRnVuY3Rpb24gPSB2b2lkIDA7XG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBmdW5jdGlvbiBpcyByZW1vdmVkLCBpbnRlcmZhY2UgaXMgbm90IGNvbXBpbGVkXG4gICAgICovXG4gICAgZXhwb3J0cy50ZW1wRnVuY3Rpb24gPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gMjM7IH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4\n')},function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n "use strict";\n Object.defineProperty(exports, "__esModule", { value: true });\n exports.minimapLengthToChartLength = exports.chartLengthToMinimapLength = exports.canvasLengthToTrueLength = exports.trueLengthToCanvasLength = void 0;\n exports.trueLengthToCanvasLength = function (trueLength, canvasSize, trueSize) {\n return (trueLength * canvasSize) / trueSize;\n };\n exports.canvasLengthToTrueLength = function (canvasLength, canvasSize, trueSize) {\n return (canvasLength / canvasSize) * trueSize;\n };\n exports.chartLengthToMinimapLength = function (chartLength, chartSize, minimapSize, visibleRatio) {\n return chartLength * (minimapSize / chartSize) * visibleRatio;\n };\n exports.minimapLengthToChartLength = function (minimapLength, chartSize, minimapSize, visibleRatio) {\n return ((minimapLength / minimapSize) * chartSize) / visibleRatio;\n };\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy91dGlscy9yZXNpemUudHM/ZDE2MCJdLCJzb3VyY2VzQ29udGVudCI6WyJkZWZpbmUoW1wicmVxdWlyZVwiLCBcImV4cG9ydHNcIl0sIGZ1bmN0aW9uIChyZXF1aXJlLCBleHBvcnRzKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuICAgIGV4cG9ydHMubWluaW1hcExlbmd0aFRvQ2hhcnRMZW5ndGggPSBleHBvcnRzLmNoYXJ0TGVuZ3RoVG9NaW5pbWFwTGVuZ3RoID0gZXhwb3J0cy5jYW52YXNMZW5ndGhUb1RydWVMZW5ndGggPSBleHBvcnRzLnRydWVMZW5ndGhUb0NhbnZhc0xlbmd0aCA9IHZvaWQgMDtcbiAgICBleHBvcnRzLnRydWVMZW5ndGhUb0NhbnZhc0xlbmd0aCA9IGZ1bmN0aW9uICh0cnVlTGVuZ3RoLCBjYW52YXNTaXplLCB0cnVlU2l6ZSkge1xuICAgICAgICByZXR1cm4gKHRydWVMZW5ndGggKiBjYW52YXNTaXplKSAvIHRydWVTaXplO1xuICAgIH07XG4gICAgZXhwb3J0cy5jYW52YXNMZW5ndGhUb1RydWVMZW5ndGggPSBmdW5jdGlvbiAoY2FudmFzTGVuZ3RoLCBjYW52YXNTaXplLCB0cnVlU2l6ZSkge1xuICAgICAgICByZXR1cm4gKGNhbnZhc0xlbmd0aCAvIGNhbnZhc1NpemUpICogdHJ1ZVNpemU7XG4gICAgfTtcbiAgICBleHBvcnRzLmNoYXJ0TGVuZ3RoVG9NaW5pbWFwTGVuZ3RoID0gZnVuY3Rpb24gKGNoYXJ0TGVuZ3RoLCBjaGFydFNpemUsIG1pbmltYXBTaXplLCB2aXNpYmxlUmF0aW8pIHtcbiAgICAgICAgcmV0dXJuIGNoYXJ0TGVuZ3RoICogKG1pbmltYXBTaXplIC8gY2hhcnRTaXplKSAqIHZpc2libGVSYXRpbztcbiAgICB9O1xuICAgIGV4cG9ydHMubWluaW1hcExlbmd0aFRvQ2hhcnRMZW5ndGggPSBmdW5jdGlvbiAobWluaW1hcExlbmd0aCwgY2hhcnRTaXplLCBtaW5pbWFwU2l6ZSwgdmlzaWJsZVJhdGlvKSB7XG4gICAgICAgIHJldHVybiAoKG1pbmltYXBMZW5ndGggLyBtaW5pbWFwU2l6ZSkgKiBjaGFydFNpemUpIC8gdmlzaWJsZVJhdGlvO1xuICAgIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5\n')},function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;var __spreadArrays = (this && this.__spreadArrays) || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n};\n!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(0), __webpack_require__(1), __webpack_require__(7), __webpack_require__(0)], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports, constants_1, domAPI_1, toPieChartItemPath_1, index_1) {\n "use strict";\n Object.defineProperty(exports, "__esModule", { value: true });\n var incomeData = {};\n var outlayData = {};\n var selectedData = {\n season: undefined,\n month: undefined,\n type: undefined,\n dataType: undefined,\n };\n var Pie = /** @class */ (function () {\n function Pie(chartProps) {\n this.chartProps = chartProps;\n this.initProps(this.chartProps);\n this.insertHTML();\n this.initStyle();\n this.offsetMonth && this.changeData(this.offsetMonth);\n this.offsetMonth && this.initStyleOffsetMonth();\n this.drawChart();\n this.addEventListener();\n }\n Pie.prototype.initProps = function (chartProps) {\n this.containerName = chartProps.selector;\n this.chartTitle = chartProps.chartTitle;\n this.offsetMonth = chartProps.offsetMonth;\n incomeData = {};\n outlayData = {};\n var makeData = function (datas) {\n var data = {};\n datas.forEach(function (monthItem) {\n monthItem.data.forEach(function (dateItem) {\n var amount = 0;\n dateItem.data.forEach(function (data) {\n amount += data.amount;\n if (data.amount >= 0) {\n if (!incomeData["" + data.type]) {\n incomeData["" + data.type] = data.amount;\n }\n else {\n incomeData["" + data.type] += data.amount;\n }\n }\n else if (data.amount < 0) {\n if (!outlayData["" + data.type]) {\n outlayData["" + data.type] = data.amount;\n }\n else {\n outlayData["" + data.type] += data.amount;\n }\n }\n });\n data[monthItem.month + "/" + dateItem.date] = amount;\n });\n });\n return data;\n };\n var makeDataContents = function (datas) {\n var data = [];\n datas.forEach(function (monthItem) {\n monthItem.data.forEach(function (dateItem) {\n var contents = dateItem.data;\n data.push(contents);\n });\n });\n return data;\n };\n this.originalData = chartProps.data;\n this.dataContents = makeDataContents(chartProps.data);\n this.data = makeData(chartProps.data);\n };\n Pie.prototype.changeData = function (month) {\n incomeData = {};\n outlayData = {};\n var makeData = function (datas, month) {\n var data = {};\n datas\n .filter(function (item) { return item.month === month; })\n .forEach(function (monthItem) {\n monthItem.data.forEach(function (dateItem) {\n var amount = 0;\n dateItem.data.forEach(function (data) {\n amount += data.amount;\n if (data.amount >= 0) {\n if (!incomeData["" + data.type]) {\n incomeData["" + data.type] = data.amount;\n }\n else {\n incomeData["" + data.type] += data.amount;\n }\n }\n else if (data.amount < 0) {\n if (!outlayData["" + data.type]) {\n outlayData["" + data.type] = data.amount;\n }\n else {\n outlayData["" + data.type] += data.amount;\n }\n }\n });\n data[monthItem.month + "/" + dateItem.date] = amount;\n });\n });\n return data;\n };\n var makeDataContents = function (datas, month) {\n var data = [];\n datas\n .filter(function (item) { return item.month === month; })\n .forEach(function (monthItem) {\n monthItem.data.forEach(function (dateItem) {\n var contents = dateItem.data;\n data.push(contents);\n });\n });\n return data;\n };\n this.dataContents = makeDataContents(this.originalData, month);\n this.data = makeData(this.originalData, month);\n };\n Pie.prototype.insertHTML = function () {\n var _this = this;\n var container = document.querySelector("#" + this.containerName);\n container.innerHTML = "\\n
" + this.chartTitle + "
\\n \\n \\n " + ["SPRING", "SUMMER", "FALL", "WINTER"]\n .map(function (item) {\n return "";\n })\n .join("") + "\\n " + this.originalData\n .map(function (item, i) {\n return "\\n " + item.month + "\\uC6D4";\n })\n .join("") + "\\n " + ["income", "outlay"]\n .map(function (item) {\n return "\\n " + (item === "income" ? "수입" : "지출") + "";\n })\n .join("") + "\\n " + Object.keys(incomeData)\n .map(function (item) {\n return "\\n " + item + "";\n })\n .join("") + "\\n " + Object.keys(outlayData)\n .map(function (item) {\n return "\\n " + item + "";\n })\n .join("") + "\\n \\n ";\n };\n Pie.prototype.initStyle = function () {\n var container = document.querySelector("#" + this.containerName);\n var text = document.querySelector("#" + this.containerName + "-text");\n domAPI_1.$style(container, {\n position: "relative",\n });\n domAPI_1.$style(text, {\n display: "flex",\n flexDirection: "column",\n justifyContent: "center",\n alignItems: "center",\n flexWrap: "wrap",\n position: "absolute",\n top: "50%",\n left: "50%",\n transform: "translate(-50%,-50%)",\n });\n };\n Pie.prototype.drawChart = function () {\n var _this = this;\n var container = document.querySelector("#" + this.containerName);\n var svg = container.querySelector("svg");\n var zoomSize = Number(container.style.width.split("px")[0]) / constants_1.SVG_WIDTH;\n svg.style.zoom = String(zoomSize);\n var i;\n /**\n * Draw Season\n */\n var seasonElem = svg.querySelectorAll("." + this.containerName + "-season");\n i = -90;\n [].slice.call(seasonElem).forEach(function (item) {\n item.setAttribute("d", toPieChartItemPath_1.toPieChartItemPath(250, 250, 70, 79, i, i + 360 / seasonElem.length - 0.5));\n i += 360 / seasonElem.length;\n });\n /**\n * Draw Month\n */\n var monthElems = svg.querySelectorAll("." + this.containerName + "-month");\n i = (360 / monthElems.length) * 7;\n [].slice.call(monthElems).forEach(function (item) {\n item.setAttribute("d", toPieChartItemPath_1.toPieChartItemPath(250, 250, 80, 110, i, i + 360 / monthElems.length - 0.5));\n i += 360 / monthElems.length;\n });\n /**\n * Draw Month Text\n */\n var monthTextElems = svg.querySelectorAll("." + this.containerName + "-month-text");\n i = (360 / monthElems.length) * 7;\n [].slice.call(monthTextElems).forEach(function (item, index) {\n item.style.cssText = "user-select:none; font-size:12px; transform-origin:250px 340px; transform:translate(0px,-90px) rotate(" + (i + 105) + "deg);";\n i += 360 / monthElems.length;\n });\n /**\n * Draw Type [income, outlay]\n */\n var types = svg.querySelectorAll("." + this.containerName + "-type");\n i = 90;\n [].slice.call(types).forEach(function (item, index) {\n item.setAttribute("d", toPieChartItemPath_1.toPieChartItemPath(250, 250, 141, 171, i, i + 180 - 0.5));\n i += 180;\n });\n /**\n * Draw Type Text [income, outlay]\n */\n var typeTexts = svg.querySelectorAll("." + this.containerName + "-type-text");\n i = -90;\n [].slice.call(typeTexts).forEach(function (item, index) {\n item.style.cssText = "user-select:none; font-size:12px; transform-origin:250px 400px; transform:translate(0px,-150px) rotate(" + i + "deg);";\n i += 180;\n });\n /**\n * Draw Income Data [월급, 용돈 ...]\n */\n var incomes = svg.querySelectorAll("." + this.containerName + "-income");\n var incomeDatas = Object.values(incomeData);\n var incomeSum = incomeDatas.reduce(function (acc, cur) { return acc + cur; }, 0);\n i = 90;\n [].slice.call(incomes).forEach(function (item) {\n var category = item.id.split("-")[item.id.split("-").length - 1];\n var value = incomeData[category] ? incomeData[category] : 0;\n var itemI = i;\n var myIndex = incomeData[category] ? itemI + 180 * (incomeData[category] / incomeSum) - 0.5 : i;\n item.setAttribute("d", toPieChartItemPath_1.toPieChartItemPath(250, 250, 172, 202, i, myIndex));\n item.addEventListener("mouseenter", function (e) {\n item.setAttribute("d", toPieChartItemPath_1.toPieChartItemPath(250, 250, 172, 232, itemI, myIndex));\n [].slice.call(incomes).forEach(function (item) {\n item.style.opacity = "0.3";\n });\n [].slice.call(outlays).forEach(function (item) {\n item.style.opacity = "0.3";\n });\n e.currentTarget.style.opacity = "1";\n types[0].style.opacity = "1";\n types[1].style.opacity = "0.3";\n selectedData["dataType"] = e.currentTarget.id.split("-")[e.currentTarget.id.split("-").length - 1];\n selectedData["type"] = "income";\n _this.drawCenterText();\n });\n item.addEventListener("mouseleave", function () {\n item.setAttribute("d", toPieChartItemPath_1.toPieChartItemPath(250, 250, 172, 202, itemI, myIndex));\n });\n i += 180 * (value / incomeSum);\n });\n /**\n * Draw Income Data Text\n */\n var IncomeTexts = svg.querySelectorAll("." + this.containerName + "-income-text");\n i = 180;\n [].slice.call(IncomeTexts).forEach(function (item) {\n var category = item.id.split("-")[item.id.split("-").length - 1];\n var myIndex = incomeData[category] ? 180 * (incomeData[category] / incomeSum) : 0;\n if (myIndex) {\n item.style.cssText = "font-size:12px; transform-origin:250px 430px; transform:translate(0px,-180px) rotate(" + (i + myIndex / 2) + "deg); user-select:none; pointer-events:none;";\n i += myIndex;\n }\n else {\n item.style.cssText = "font-size:0px; transform-origin:250px 430px; transform:translate(0px,-180px) rotate(" + (i + myIndex / 2) + "deg); user-select:none; pointer-events:none;";\n i += myIndex;\n }\n });\n /**\n * Draw Outlay Data [교통, 쇼핑/뷰티 ...]\n */\n var outlays = svg.querySelectorAll("." + this.containerName + "-outlay");\n var outlayDatas = Object.values(outlayData);\n var outlaySum = outlayDatas.reduce(function (acc, cur) { return acc + cur; }, 0);\n i = 270;\n [].slice.call(outlays).forEach(function (item) {\n var category = item.id.split("-")[item.id.split("-").length - 1];\n var value = outlayData[category] ? outlayData[category] : 0;\n var itemI = i;\n var myIndex = outlayData[category] ? itemI + 180 * (outlayData[category] / outlaySum) - 0.5 : i;\n item.setAttribute("d", toPieChartItemPath_1.toPieChartItemPath(250, 250, 172, 202, i, myIndex));\n item.addEventListener("mouseenter", function (e) {\n item.setAttribute("d", toPieChartItemPath_1.toPieChartItemPath(250, 250, 172, 232, itemI, myIndex));\n [].slice.call(outlays).forEach(function (item) {\n item.style.opacity = "0.3";\n });\n [].slice.call(incomes).forEach(function (item) {\n item.style.opacity = "0.3";\n });\n e.currentTarget.style.opacity = "1";\n types[1].style.opacity = "1";\n types[0].style.opacity = "0.3";\n selectedData["dataType"] = e.currentTarget.id.split("-")[e.currentTarget.id.split("-").length - 1];\n selectedData["type"] = "outlay";\n _this.drawCenterText();\n });\n item.addEventListener("mouseleave", function () {\n item.setAttribute("d", toPieChartItemPath_1.toPieChartItemPath(250, 250, 172, 202, itemI, myIndex));\n });\n i += 180 * (value / outlaySum);\n });\n /**\n * Draw Outlay Data Text\n */\n var outlayTexts = svg.querySelectorAll("." + this.containerName + "-outlay-text");\n i = 0;\n [].slice.call(outlayTexts).forEach(function (item, index) {\n var category = item.id.split("-")[item.id.split("-").length - 1];\n var myIndex = outlayData[category] ? 180 * (outlayData[category] / outlaySum) : 0;\n if (myIndex) {\n item.style.cssText = "font-size:12px; transform-origin:250px 430px; transform:translate(0px,-180px) rotate(" + (i + myIndex / 2) + "deg); user-select:none; pointer-events:none;";\n i += myIndex;\n }\n else {\n item.style.cssText = "font-size:0px; transform-origin:250px 430px; transform:translate(0px,-180px) rotate(" + (i + myIndex / 2) + "deg); user-select:none; pointer-events:none;";\n i += myIndex;\n }\n });\n };\n Pie.prototype.drawCenterText = function () {\n var text = document.querySelector("#" + this.containerName + "-text");\n var defaltText = "
" + this.chartTitle + "
";\n var insertText = "";\n insertText += selectedData["season"]\n ? "
" + selectedData["season"] + "
"\n : "";\n insertText += selectedData["month"]\n ? "
" + selectedData["month"] + "\\uC6D4
"\n : "";\n var container = document.querySelector("#" + this.containerName);\n var svg = container.querySelector("svg");\n var ratio;\n var incomes = svg.querySelectorAll("." + this.containerName + "-income");\n var incomeDatas = Object.values(incomeData);\n var incomeSum = incomeDatas.reduce(function (acc, cur) { return acc + cur; }, 0);\n var outlays = svg.querySelectorAll("." + this.containerName + "-outlay");\n var outlayDatas = Object.values(outlayData);\n var outlaySum = outlayDatas.reduce(function (acc, cur) { return acc + cur; }, 0);\n [].slice.call(incomes).forEach(function (item) {\n var category = item.id.split("-")[item.id.split("-").length - 1];\n var value = incomeData[category] ? incomeData[category] : 0;\n if (selectedData["dataType"] === item.id.split("-")[item.id.split("-").length - 1]) {\n ratio = value / incomeSum;\n }\n });\n [].slice.call(outlays).forEach(function (item) {\n var category = item.id.split("-")[item.id.split("-").length - 1];\n var value = incomeData[category] ? incomeData[category] : 0;\n if (selectedData["dataType"] === item.id.split("-")[item.id.split("-").length - 1]) {\n ratio = value / outlaySum;\n }\n });\n insertText += selectedData["dataType"]\n ? "
" + Math.round(ratio * 100) + "%
"\n : "";\n insertText += selectedData["type"]\n ? "
" + (selectedData["type"] === "income" ? "수입" : "지출") + "
"\n : "";\n insertText += selectedData["dataType"]\n ? "
" + selectedData["dataType"] + "
"\n : "";\n text.innerHTML = insertText ? insertText : defaltText;\n };\n Pie.prototype.addEventListener = function () {\n var _this = this;\n var container = document.querySelector("#" + this.containerName);\n var svg = container.querySelector("svg");\n var resetCircle = svg.querySelector("circle");\n var seasonElems = svg.querySelectorAll("." + this.containerName + "-season");\n var monthElems = svg.querySelectorAll("." + this.containerName + "-month");\n var types = svg.querySelectorAll("." + this.containerName + "-type");\n resetCircle.addEventListener("mouseenter", function () {\n var allElems = __spreadArrays([].slice.call(seasonElems), [].slice.call(monthElems));\n allElems.forEach(function (item) {\n item.style.opacity = "1";\n });\n _this.drawCenterText();\n });\n resetCircle.addEventListener("click", function () {\n selectedData["dataType"] = undefined;\n selectedData["type"] = undefined;\n selectedData["month"] = undefined;\n selectedData["season"] = undefined;\n _this.drawCenterText();\n _this.initProps(_this.chartProps);\n _this.drawChart();\n var incomes = svg.querySelectorAll("." + _this.containerName + "-income");\n var outlays = svg.querySelectorAll("." + _this.containerName + "-outlay");\n var allElems = __spreadArrays([].slice.call(types), [].slice.call(incomes), [].slice.call(outlays));\n allElems.forEach(function (item) {\n item.style.opacity = "1";\n });\n });\n [].slice.call(seasonElems).forEach(function (seasonElem) {\n seasonElem.addEventListener("mouseenter", function (e) {\n [].slice.call(seasonElems).forEach(function (seasonElem) {\n seasonElem.style.opacity = "0.3";\n });\n var season = e.currentTarget.id.split("-")[e.currentTarget.id.split("-").length - 1];\n selectedData["season"] = season;\n e.currentTarget.style.opacity = "1";\n _this.drawCenterText();\n });\n });\n [].slice.call(monthElems).forEach(function (monthElem) {\n monthElem.addEventListener("mouseenter", function (e) {\n var month = Number(e.currentTarget.id.split("-")[e.currentTarget.id.split("-").length - 1]);\n _this.initProps(_this.chartProps);\n _this.changeData(month);\n _this.drawChart();\n [].slice.call(monthElems).forEach(function (monthElem) {\n monthElem.style.opacity = "0.3";\n });\n selectedData["month"] = month;\n [].slice.call(seasonElems).forEach(function (seasonElem, index) {\n seasonElem.style.opacity = "0.3";\n if ([3, 4, 5].indexOf(month) >= 0 && index === 0) {\n selectedData["season"] = "SPRING";\n seasonElem.style.opacity = "1";\n }\n if ([6, 7, 8].indexOf(month) >= 0 && index === 1) {\n selectedData["season"] = "SUMMER";\n seasonElem.style.opacity = "1";\n }\n if ([9, 10, 11].indexOf(month) >= 0 && index === 2) {\n selectedData["season"] = "FALL";\n seasonElem.style.opacity = "1";\n }\n if ([12, 1, 2].indexOf(month) >= 0 && index === 3) {\n selectedData["season"] = "WINTER";\n seasonElem.style.opacity = "1";\n }\n });\n e.currentTarget.style.opacity = "1";\n _this.drawCenterText();\n });\n });\n [].slice.call(types).forEach(function (typeElem, index) {\n typeElem.addEventListener("mouseenter", function (e) {\n var incomes = svg.querySelectorAll("." + _this.containerName + "-income");\n var outlays = svg.querySelectorAll("." + _this.containerName + "-outlay");\n [].slice.call(types).forEach(function (typeElem) {\n typeElem.style.opacity = "0.3";\n });\n index === 0 &&\n [].slice.call(outlays).forEach(function (item) {\n item.style.opacity = "0.3";\n });\n index === 1 &&\n [].slice.call(incomes).forEach(function (item) {\n item.style.opacity = "0.3";\n });\n var type = e.currentTarget.id.split("-")[e.currentTarget.id.split("-").length - 1];\n selectedData["type"] = type;\n e.currentTarget.style.opacity = "1";\n _this.drawCenterText();\n });\n });\n };\n Pie.prototype.initStyleOffsetMonth = function () {\n var _this = this;\n var container = document.querySelector("#" + this.containerName);\n var svg = container.querySelector("svg");\n var resetCircle = svg.querySelector("circle");\n var seasonElems = svg.querySelectorAll("." + this.containerName + "-season");\n var monthElems = svg.querySelectorAll("." + this.containerName + "-month");\n var types = svg.querySelectorAll("." + this.containerName + "-type");\n [].slice.call(seasonElems).forEach(function (seasonElem, index) {\n seasonElem.style.opacity = "0.3";\n if ([3, 4, 5].indexOf(_this.offsetMonth) >= 0 && index === 0) {\n selectedData["season"] = "SPRING";\n seasonElem.style.opacity = "1";\n }\n if ([6, 7, 8].indexOf(_this.offsetMonth) >= 0 && index === 1) {\n selectedData["season"] = "SUMMER";\n seasonElem.style.opacity = "1";\n }\n if ([9, 10, 11].indexOf(_this.offsetMonth) >= 0 && index === 2) {\n selectedData["season"] = "FALL";\n seasonElem.style.opacity = "1";\n }\n if ([12, 1, 2].indexOf(_this.offsetMonth) >= 0 && index === 3) {\n selectedData["season"] = "WINTER";\n seasonElem.style.opacity = "1";\n }\n });\n [].slice.call(monthElems).forEach(function (monthElem) {\n var month = Number(monthElem.id.split("-")[monthElem.id.split("-").length - 1]);\n if (month === _this.offsetMonth) {\n monthElem.style.opacity = "1";\n }\n else {\n monthElem.style.opacity = "0.3";\n }\n });\n };\n return Pie;\n }());\n exports.default = Pie;\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy9QaWUudHM/MjA1OCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19zcHJlYWRBcnJheXMgPSAodGhpcyAmJiB0aGlzLl9fc3ByZWFkQXJyYXlzKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xuICAgIHJldHVybiByO1xufTtcbmRlZmluZShbXCJyZXF1aXJlXCIsIFwiZXhwb3J0c1wiLCBcIi4vY29uc3RhbnRzXCIsIFwiLi91dGlscy9kb21BUElcIiwgXCIuL3V0aWxzL3RvUGllQ2hhcnRJdGVtUGF0aFwiLCBcIi4vY29uc3RhbnRzL2luZGV4XCJdLCBmdW5jdGlvbiAocmVxdWlyZSwgZXhwb3J0cywgY29uc3RhbnRzXzEsIGRvbUFQSV8xLCB0b1BpZUNoYXJ0SXRlbVBhdGhfMSwgaW5kZXhfMSkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbiAgICB2YXIgaW5jb21lRGF0YSA9IHt9O1xuICAgIHZhciBvdXRsYXlEYXRhID0ge307XG4gICAgdmFyIHNlbGVjdGVkRGF0YSA9IHtcbiAgICAgICAgc2Vhc29uOiB1bmRlZmluZWQsXG4gICAgICAgIG1vbnRoOiB1bmRlZmluZWQsXG4gICAgICAgIHR5cGU6IHVuZGVmaW5lZCxcbiAgICAgICAgZGF0YVR5cGU6IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgIHZhciBQaWUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZ1bmN0aW9uIFBpZShjaGFydFByb3BzKSB7XG4gICAgICAgICAgICB0aGlzLmNoYXJ0UHJvcHMgPSBjaGFydFByb3BzO1xuICAgICAgICAgICAgdGhpcy5pbml0UHJvcHModGhpcy5jaGFydFByb3BzKTtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SFRNTCgpO1xuICAgICAgICAgICAgdGhpcy5pbml0U3R5bGUoKTtcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0TW9udGggJiYgdGhpcy5jaGFuZ2VEYXRhKHRoaXMub2Zmc2V0TW9udGgpO1xuICAgICAgICAgICAgdGhpcy5vZmZzZXRNb250aCAmJiB0aGlzLmluaXRTdHlsZU9mZnNldE1vbnRoKCk7XG4gICAgICAgICAgICB0aGlzLmRyYXdDaGFydCgpO1xuICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgUGllLnByb3RvdHlwZS5pbml0UHJvcHMgPSBmdW5jdGlvbiAoY2hhcnRQcm9wcykge1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXJOYW1lID0gY2hhcnRQcm9wcy5zZWxlY3RvcjtcbiAgICAgICAgICAgIHRoaXMuY2hhcnRUaXRsZSA9IGNoYXJ0UHJvcHMuY2hhcnRUaXRsZTtcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0TW9udGggPSBjaGFydFByb3BzLm9mZnNldE1vbnRoO1xuICAgICAgICAgICAgaW5jb21lRGF0YSA9IHt9O1xuICAgICAgICAgICAgb3V0bGF5RGF0YSA9IHt9O1xuICAgICAgICAgICAgdmFyIG1ha2VEYXRhID0gZnVuY3Rpb24gKGRhdGFzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB7fTtcbiAgICAgICAgICAgICAgICBkYXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChtb250aEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgbW9udGhJdGVtLmRhdGEuZm9yRWFjaChmdW5jdGlvbiAoZGF0ZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhbW91bnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZUl0ZW0uZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vdW50ICs9IGRhdGEuYW1vdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmFtb3VudCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5jb21lRGF0YVtcIlwiICsgZGF0YS50eXBlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21lRGF0YVtcIlwiICsgZGF0YS50eXBlXSA9IGRhdGEuYW1vdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21lRGF0YVtcIlwiICsgZGF0YS50eXBlXSArPSBkYXRhLmFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkYXRhLmFtb3VudCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvdXRsYXlEYXRhW1wiXCIgKyBkYXRhLnR5cGVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsYXlEYXRhW1wiXCIgKyBkYXRhLnR5cGVdID0gZGF0YS5hbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsYXlEYXRhW1wiXCIgKyBkYXRhLnR5cGVdICs9IGRhdGEuYW1vdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW21vbnRoSXRlbS5tb250aCArIFwiL1wiICsgZGF0ZUl0ZW0uZGF0ZV0gPSBhbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhciBtYWtlRGF0YUNvbnRlbnRzID0gZnVuY3Rpb24gKGRhdGFzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBbXTtcbiAgICAgICAgICAgICAgICBkYXRhcy5mb3JFYWNoKGZ1bmN0aW9uIChtb250aEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgbW9udGhJdGVtLmRhdGEuZm9yRWFjaChmdW5jdGlvbiAoZGF0ZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb250ZW50cyA9IGRhdGVJdGVtLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnB1c2goY29udGVudHMpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLm9yaWdpbmFsRGF0YSA9IGNoYXJ0UHJvcHMuZGF0YTtcbiAgICAgICAgICAgIHRoaXMuZGF0YUNvbnRlbnRzID0gbWFrZURhdGFDb250ZW50cyhjaGFydFByb3BzLmRhdGEpO1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gbWFrZURhdGEoY2hhcnRQcm9wcy5kYXRhKTtcbiAgICAgICAgfTtcbiAgICAgICAgUGllLnByb3RvdHlwZS5jaGFuZ2VEYXRhID0gZnVuY3Rpb24gKG1vbnRoKSB7XG4gICAgICAgICAgICBpbmNvbWVEYXRhID0ge307XG4gICAgICAgICAgICBvdXRsYXlEYXRhID0ge307XG4gICAgICAgICAgICB2YXIgbWFrZURhdGEgPSBmdW5jdGlvbiAoZGF0YXMsIG1vbnRoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB7fTtcbiAgICAgICAgICAgICAgICBkYXRhc1xuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiBpdGVtLm1vbnRoID09PSBtb250aDsgfSlcbiAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKG1vbnRoSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBtb250aEl0ZW0uZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRlSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFtb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlSXRlbS5kYXRhLmZvckVhY2goZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW91bnQgKz0gZGF0YS5hbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuYW1vdW50ID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmNvbWVEYXRhW1wiXCIgKyBkYXRhLnR5cGVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVEYXRhW1wiXCIgKyBkYXRhLnR5cGVdID0gZGF0YS5hbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVEYXRhW1wiXCIgKyBkYXRhLnR5cGVdICs9IGRhdGEuYW1vdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRhdGEuYW1vdW50IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW91dGxheURhdGFbXCJcIiArIGRhdGEudHlwZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxheURhdGFbXCJcIiArIGRhdGEudHlwZV0gPSBkYXRhLmFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxheURhdGFbXCJcIiArIGRhdGEudHlwZV0gKz0gZGF0YS5hbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbbW9udGhJdGVtLm1vbnRoICsgXCIvXCIgKyBkYXRlSXRlbS5kYXRlXSA9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIG1ha2VEYXRhQ29udGVudHMgPSBmdW5jdGlvbiAoZGF0YXMsIG1vbnRoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBbXTtcbiAgICAgICAgICAgICAgICBkYXRhc1xuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiBpdGVtLm1vbnRoID09PSBtb250aDsgfSlcbiAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24gKG1vbnRoSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBtb250aEl0ZW0uZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRlSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRlbnRzID0gZGF0ZUl0ZW0uZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucHVzaChjb250ZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuZGF0YUNvbnRlbnRzID0gbWFrZURhdGFDb250ZW50cyh0aGlzLm9yaWdpbmFsRGF0YSwgbW9udGgpO1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gbWFrZURhdGEodGhpcy5vcmlnaW5hbERhdGEsIG1vbnRoKTtcbiAgICAgICAgfTtcbiAgICAgICAgUGllLnByb3RvdHlwZS5pbnNlcnRIVE1MID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI1wiICsgdGhpcy5jb250YWluZXJOYW1lKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBcIlxcbiAgICA8ZGl2IGlkPVxcXCJcIiArIHRoaXMuY29udGFpbmVyTmFtZSArIFwiLXRleHRcXFwiIHN0eWxlPSd1c2VyLXNlbGVjdDpub25lOyBwb2ludGVyLWV2ZW50czpub25lJz5cIiArIHRoaXMuY2hhcnRUaXRsZSArIFwiPC9kaXY+XFxuICAgIDxzdmcgaWQ9XFxcIlwiICsgdGhpcy5jb250YWluZXJOYW1lICsgXCItc3ZnXFxcIiB3aWR0aD1cXFwiNTAwXFxcIiBoZWlnaHQ9XFxcIjUwMFxcXCI+XFxuICAgICAgPGNpcmNsZSBzdHlsZT0nY3Vyc29yOnBvaW50ZXInIGlkPSdcIiArIHRoaXMuY29udGFpbmVyTmFtZSArIFwiLXJlc2V0LWNpcmNsZScgY3g9MjUwIGN5PTI1MCByPTYwIGZpbGw9I2VlZSAvPlxcbiAgICBcIiArIFtcIlNQUklOR1wiLCBcIlNVTU1FUlwiLCBcIkZBTExcIiwgXCJXSU5URVJcIl1cbiAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiPHBhdGggaWQ9XCIgKyBfdGhpcy5jb250YWluZXJOYW1lICsgXCItc2Vhc29uLVwiICsgaXRlbSArIFwiIGNsYXNzPVwiICsgX3RoaXMuY29udGFpbmVyTmFtZSArIFwiLXNlYXNvbiBmaWxsPSdcIiArIGNvbnN0YW50c18xLlNlYXNvbkNvbG9yW2l0ZW1dICsgXCInIC8+XCI7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5qb2luKFwiXCIpICsgXCJcXG4gICAgXCIgKyB0aGlzLm9yaWdpbmFsRGF0YVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGl0ZW0sIGkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCI8cGF0aCBpZD1cIiArIF90aGlzLmNvbnRhaW5lck5hbWUgKyBcIi1tb250aC1cIiArIGl0ZW0ubW9udGggKyBcIiBjbGFzcz1cIiArIF90aGlzLmNvbnRhaW5lck5hbWUgKyBcIi1tb250aCBmaWxsPSdcIiArIGluZGV4XzEuTW9udGhDb2xvcltpdGVtLm1vbnRoXSArIFwiJyAvPlxcbiAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9XFxcIm1pZGRsZVxcXCIgaWQ9XCIgKyBfdGhpcy5jb250YWluZXJOYW1lICsgXCItbW9udGgtXCIgKyBpdGVtLm1vbnRoICsgXCItdGV4dCBjbGFzcz1cIiArIF90aGlzLmNvbnRhaW5lck5hbWUgKyBcIi1tb250aC10ZXh0IHg9MjUwIHk9MjUwIGZpbGw9JyNmZmYnPlwiICsgaXRlbS5tb250aCArIFwiXFx1QzZENDwvdGV4dD5cIjtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oXCJcIikgKyBcIlxcbiAgICBcIiArIFtcImluY29tZVwiLCBcIm91dGxheVwiXVxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCI8cGF0aCBpZD1cIiArIF90aGlzLmNvbnRhaW5lck5hbWUgKyBcIi1cIiArIGl0ZW0gKyBcIiBjbGFzcz1cIiArIF90aGlzLmNvbnRhaW5lck5hbWUgKyBcIi10eXBlIGZpbGw9J1wiICsgY29uc3RhbnRzXzEuVHlwZUNvbG9yW2l0ZW0udG9VcHBlckNhc2UoKV0gKyBcIicgLz5cXG4gICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPVxcXCJtaWRkbGVcXFwiIGlkPVwiICsgX3RoaXMuY29udGFpbmVyTmFtZSArIFwiLXRleHQgY2xhc3M9XCIgKyBfdGhpcy5jb250YWluZXJOYW1lICsgXCItdHlwZS10ZXh0IHg9MjUwIHk9MjUwIGZpbGw9JyNmZmYnPlwiICsgKGl0ZW0gPT09IFwiaW5jb21lXCIgPyBcIuyImOyehVwiIDogXCLsp4DstpxcIikgKyBcIjwvdGV4dD5cIjtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oXCJcIikgKyBcIlxcbiAgICAgIFwiICsgT2JqZWN0LmtleXMoaW5jb21lRGF0YSlcbiAgICAgICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiPHBhdGggaWQ9XCIgKyBfdGhpcy5jb250YWluZXJOYW1lICsgXCItXCIgKyBpdGVtICsgXCIgY2xhc3M9XCIgKyBfdGhpcy5jb250YWluZXJOYW1lICsgXCItaW5jb21lIGZpbGw9J1wiICsgY29uc3RhbnRzXzEuVHlwZUNvbG9yW1wiSU5DT01FXCJdICsgXCInIC8+XFxuICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPVxcXCJtaWRkbGVcXFwiIGlkPVwiICsgX3RoaXMuY29udGFpbmVyTmFtZSArIFwiLVwiICsgaXRlbSArIFwiIGNsYXNzPVwiICsgX3RoaXMuY29udGFpbmVyTmFtZSArIFwiLWluY29tZS10ZXh0IHg9MjUwIHk9MjUwIGZpbGw9JyNmZmYnPlwiICsgaXRlbSArIFwiPC90ZXh0PlwiO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuam9pbihcIlwiKSArIFwiXFxuICAgICAgICBcIiArIE9iamVjdC5rZXlzKG91dGxheURhdGEpXG4gICAgICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIjxwYXRoIGlkPVwiICsgX3RoaXMuY29udGFpbmVyTmFtZSArIFwiLVwiICsgaXRlbSArIFwiIGNsYXNzPVwiICsgX3RoaXMuY29udGFpbmVyTmFtZSArIFwiLW91dGxheSBmaWxsPSdcIiArIGNvbnN0YW50c18xLlR5cGVDb2xvcltcIk9VVExBWVwiXSArIFwiJyAvPlxcbiAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPVxcXCJtaWRkbGVcXFwiIGlkPVwiICsgX3RoaXMuY29udGFpbmVyTmFtZSArIFwiLVwiICsgaXRlbSArIFwiIGNsYXNzPVwiICsgX3RoaXMuY29udGFpbmVyTmFtZSArIFwiLW91dGxheS10ZXh0IHg9MjUwIHk9MjUwIGZpbGw9JyNmZmYnPlwiICsgaXRlbSArIFwiPC90ZXh0PlwiO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuam9pbihcIlwiKSArIFwiXFxuICAgICAgPC9zdmc+XFxuICAgICAgXCI7XG4gICAgICAgIH07XG4gICAgICAgIFBpZS5wcm90b3R5cGUuaW5pdFN0eWxlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjXCIgKyB0aGlzLmNvbnRhaW5lck5hbWUpO1xuICAgICAgICAgICAgdmFyIHRleHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI1wiICsgdGhpcy5jb250YWluZXJOYW1lICsgXCItdGV4dFwiKTtcbiAgICAgICAgICAgIGRvbUFQSV8xLiRzdHlsZShjb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkb21BUElfMS4kc3R5bGUodGV4dCwge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgICAgICAgICAgICBmbGV4V3JhcDogXCJ3cmFwXCIsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICAgICAgICB0b3A6IFwiNTAlXCIsXG4gICAgICAgICAgICAgICAgbGVmdDogXCI1MCVcIixcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFwidHJhbnNsYXRlKC01MCUsLTUwJSlcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBQaWUucHJvdG90eXBlLmRyYXdDaGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICB2YXIgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNcIiArIHRoaXMuY29udGFpbmVyTmFtZSk7XG4gICAgICAgICAgICB2YXIgc3ZnID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoXCJzdmdcIik7XG4gICAgICAgICAgICB2YXIgem9vbVNpemUgPSBOdW1iZXIoY29udGFpbmVyLnN0eWxlLndpZHRoLnNwbGl0KFwicHhcIilbMF0pIC8gY29uc3RhbnRzXzEuU1ZHX1dJRFRIO1xuICAgICAgICAgICAgc3ZnLnN0eWxlLnpvb20gPSBTdHJpbmcoem9vbVNpemUpO1xuICAgICAgICAgICAgdmFyIGk7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIERyYXcgU2Vhc29uXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHZhciBzZWFzb25FbGVtID0gc3ZnLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuXCIgKyB0aGlzLmNvbnRhaW5lck5hbWUgKyBcIi1zZWFzb25cIik7XG4gICAgICAgICAgICBpID0gLTkwO1xuICAgICAgICAgICAgW10uc2xpY2UuY2FsbChzZWFzb25FbGVtKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoXCJkXCIsIHRvUGllQ2hhcnRJdGVtUGF0aF8xLnRvUGllQ2hhcnRJdGVtUGF0aCgyNTAsIDI1MCwgNzAsIDc5LCBpLCBpICsgMzYwIC8gc2Vhc29uRWxlbS5sZW5ndGggLSAwLjUpKTtcbiAgICAgICAgICAgICAgICBpICs9IDM2MCAvIHNlYXNvbkVsZW0ubGVuZ3RoO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIERyYXcgTW9udGhcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdmFyIG1vbnRoRWxlbXMgPSBzdmcucXVlcnlTZWxlY3RvckFsbChcIi5cIiArIHRoaXMuY29udGFpbmVyTmFtZSArIFwiLW1vbnRoXCIpO1xuICAgICAgICAgICAgaSA9ICgzNjAgLyBtb250aEVsZW1zLmxlbmd0aCkgKiA3O1xuICAgICAgICAgICAgW10uc2xpY2UuY2FsbChtb250aEVsZW1zKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoXCJkXCIsIHRvUGllQ2hhcnRJdGVtUGF0aF8xLnRvUGllQ2hhcnRJdGVtUGF0aCgyNTAsIDI1MCwgODAsIDExMCwgaSwgaSArIDM2MCAvIG1vbnRoRWxlbXMubGVuZ3RoIC0gMC41KSk7XG4gICAgICAgICAgICAgICAgaSArPSAzNjAgLyBtb250aEVsZW1zLmxlbmd0aDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBEcmF3IE1vbnRoIFRleHRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdmFyIG1vbnRoVGV4dEVsZW1zID0gc3ZnLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuXCIgKyB0aGlzLmNvbnRhaW5lck5hbWUgKyBcIi1tb250aC10ZXh0XCIpO1xuICAgICAgICAgICAgaSA9ICgzNjAgLyBtb250aEVsZW1zLmxlbmd0aCkgKiA3O1xuICAgICAgICAgICAgW10uc2xpY2UuY2FsbChtb250aFRleHRFbGVtcykuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpdGVtLnN0eWxlLmNzc1RleHQgPSBcInVzZXItc2VsZWN0Om5vbmU7IGZvbnQtc2l6ZToxMnB4OyB0cmFuc2Zvcm0tb3JpZ2luOjI1MHB4IDM0MHB4OyB0cmFuc2Zvcm06dHJhbnNsYXRlKDBweCwtOTBweCkgcm90YXRlKFwiICsgKGkgKyAxMDUpICsgXCJkZWcpO1wiO1xuICAgICAgICAgICAgICAgIGkgKz0gMzYwIC8gbW9udGhFbGVtcy5sZW5ndGg7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogRHJhdyBUeXBlIFtpbmNvbWUsIG91dGxheV1cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdmFyIHR5cGVzID0gc3ZnLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuXCIgKyB0aGlzLmNvbnRhaW5lck5hbWUgKyBcIi10eXBlXCIpO1xuICAgICAgICAgICAgaSA9IDkwO1xuICAgICAgICAgICAgW10uc2xpY2UuY2FsbCh0eXBlcykuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZShcImRcIiwgdG9QaWVDaGFydEl0ZW1QYXRoXzEudG9QaWVDaGFydEl0ZW1QYXRoKDI1MCwgMjUwLCAxNDEsIDE3MSwgaSwgaSArIDE4MCAtIDAuNSkpO1xuICAgICAgICAgICAgICAgIGkgKz0gMTgwO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIERyYXcgVHlwZSBUZXh0IFtpbmNvbWUsIG91dGxheV1cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdmFyIHR5cGVUZXh0cyA9IHN2Zy5xdWVyeVNlbGVjdG9yQWxsKFwiLlwiICsgdGhpcy5jb250YWluZXJOYW1lICsgXCItdHlwZS10ZXh0XCIpO1xuICAgICAgICAgICAgaSA9IC05MDtcbiAgICAgICAgICAgIFtdLnNsaWNlLmNhbGwodHlwZVRleHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkge1xuICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUuY3NzVGV4dCA9IFwidXNlci1zZWxlY3Q6bm9uZTsgZm9udC1zaXplOjEycHg7IHRyYW5zZm9ybS1vcmlnaW46MjUwcHggNDAwcHg7IHRyYW5zZm9ybTp0cmFuc2xhdGUoMHB4LC0xNTBweCkgcm90YXRlKFwiICsgaSArIFwiZGVnKTtcIjtcbiAgICAgICAgICAgICAgICBpICs9IDE4MDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBEcmF3IEluY29tZSBEYXRhIFvsm5TquIksIOyaqeuPiCAuLi5dXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHZhciBpbmNvbWVzID0gc3ZnLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuXCIgKyB0aGlzLmNvbnRhaW5lck5hbWUgKyBcIi1pbmNvbWVcIik7XG4gICAgICAgICAgICB2YXIgaW5jb21lRGF0YXMgPSBPYmplY3QudmFsdWVzKGluY29tZURhdGEpO1xuICAgICAgICAgICAgdmFyIGluY29tZVN1bSA9IGluY29tZURhdGFzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBjdXIpIHsgcmV0dXJuIGFjYyArIGN1cjsgfSwgMCk7XG4gICAgICAgICAgICBpID0gOTA7XG4gICAgICAgICAgICBbXS5zbGljZS5jYWxsKGluY29tZXMpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICB2YXIgY2F0ZWdvcnkgPSBpdGVtLmlkLnNwbGl0KFwiLVwiKVtpdGVtLmlkLnNwbGl0KFwiLVwiKS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBpbmNvbWVEYXRhW2NhdGVnb3J5XSA/IGluY29tZURhdGFbY2F0ZWdvcnldIDogMDtcbiAgICAgICAgICAgICAgICB2YXIgaXRlbUkgPSBpO1xuICAgICAgICAgICAgICAgIHZhciBteUluZGV4ID0gaW5jb21lRGF0YVtjYXRlZ29yeV0gPyBpdGVtSSArIDE4MCAqIChpbmNvbWVEYXRhW2NhdGVnb3J5XSAvIGluY29tZVN1bSkgLSAwLjUgOiBpO1xuICAgICAgICAgICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKFwiZFwiLCB0b1BpZUNoYXJ0SXRlbVBhdGhfMS50b1BpZUNoYXJ0SXRlbVBhdGgoMjUwLCAyNTAsIDE3MiwgMjAyLCBpLCBteUluZGV4KSk7XG4gICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZShcImRcIiwgdG9QaWVDaGFydEl0ZW1QYXRoXzEudG9QaWVDaGFydEl0ZW1QYXRoKDI1MCwgMjUwLCAxNzIsIDIzMiwgaXRlbUksIG15SW5kZXgpKTtcbiAgICAgICAgICAgICAgICAgICAgW10uc2xpY2UuY2FsbChpbmNvbWVzKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlLm9wYWNpdHkgPSBcIjAuM1wiO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgW10uc2xpY2UuY2FsbChvdXRsYXlzKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlLm9wYWNpdHkgPSBcIjAuM1wiO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZS5jdXJyZW50VGFyZ2V0LnN0eWxlLm9wYWNpdHkgPSBcIjFcIjtcbiAgICAgICAgICAgICAgICAgICAgdHlwZXNbMF0uc3R5bGUub3BhY2l0eSA9IFwiMVwiO1xuICAgICAgICAgICAgICAgICAgICB0eXBlc1sxXS5zdHlsZS5vcGFjaXR5ID0gXCIwLjNcIjtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREYXRhW1wiZGF0YVR5cGVcIl0gPSBlLmN1cnJlbnRUYXJnZXQuaWQuc3BsaXQoXCItXCIpW2UuY3VycmVudFRhcmdldC5pZC5zcGxpdChcIi1cIikubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0YVtcInR5cGVcIl0gPSBcImluY29tZVwiO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5kcmF3Q2VudGVyVGV4dCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZShcImRcIiwgdG9QaWVDaGFydEl0ZW1QYXRoXzEudG9QaWVDaGFydEl0ZW1QYXRoKDI1MCwgMjUwLCAxNzIsIDIwMiwgaXRlbUksIG15SW5kZXgpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpICs9IDE4MCAqICh2YWx1ZSAvIGluY29tZVN1bSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogRHJhdyBJbmNvbWUgRGF0YSBUZXh0XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHZhciBJbmNvbWVUZXh0cyA9IHN2Zy5xdWVyeVNlbGVjdG9yQWxsKFwiLlwiICsgdGhpcy5jb250YWluZXJOYW1lICsgXCItaW5jb21lLXRleHRcIik7XG4gICAgICAgICAgICBpID0gMTgwO1xuICAgICAgICAgICAgW10uc2xpY2UuY2FsbChJbmNvbWVUZXh0cykuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgICAgIHZhciBjYXRlZ29yeSA9IGl0ZW0uaWQuc3BsaXQoXCItXCIpW2l0ZW0uaWQuc3BsaXQoXCItXCIpLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIHZhciBteUluZGV4ID0gaW5jb21lRGF0YVtjYXRlZ29yeV0gPyAxODAgKiAoaW5jb21lRGF0YVtjYXRlZ29yeV0gLyBpbmNvbWVTdW0pIDogMDtcbiAgICAgICAgICAgICAgICBpZiAobXlJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlLmNzc1RleHQgPSBcImZvbnQtc2l6ZToxMnB4OyB0cmFuc2Zvcm0tb3JpZ2luOjI1MHB4IDQzMHB4OyB0cmFuc2Zvcm06dHJhbnNsYXRlKDBweCwtMTgwcHgpIHJvdGF0ZShcIiArIChpICsgbXlJbmRleCAvIDIpICsgXCJkZWcpOyB1c2VyLXNlbGVjdDpub25lOyBwb2ludGVyLWV2ZW50czpub25lO1wiO1xuICAgICAgICAgICAgICAgICAgICBpICs9IG15SW5kZXg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlLmNzc1RleHQgPSBcImZvbnQtc2l6ZTowcHg7IHRyYW5zZm9ybS1vcmlnaW46MjUwcHggNDMwcHg7IHRyYW5zZm9ybTp0cmFuc2xhdGUoMHB4LC0xODBweCkgcm90YXRlKFwiICsgKGkgKyBteUluZGV4IC8gMikgKyBcImRlZyk7IHVzZXItc2VsZWN0Om5vbmU7IHBvaW50ZXItZXZlbnRzOm5vbmU7XCI7XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gbXlJbmRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogRHJhdyBPdXRsYXkgRGF0YSBb6rWQ7Ya1LCDsh7ztlZEv67ew7YuwIC4uLl1cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgdmFyIG91dGxheXMgPSBzdmcucXVlcnlTZWxlY3RvckFsbChcIi5cIiArIHRoaXMuY29udGFpbmVyTmFtZSArIFwiLW91dGxheVwiKTtcbiAgICAgICAgICAgIHZhciBvdXRsYXlEYXRhcyA9IE9iamVjdC52YWx1ZXMob3V0bGF5RGF0YSk7XG4gICAgICAgICAgICB2YXIgb3V0bGF5U3VtID0gb3V0bGF5RGF0YXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGN1cikgeyByZXR1cm4gYWNjICsgY3VyOyB9LCAwKTtcbiAgICAgICAgICAgIGkgPSAyNzA7XG4gICAgICAgICAgICBbXS5zbGljZS5jYWxsKG91dGxheXMpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICB2YXIgY2F0ZWdvcnkgPSBpdGVtLmlkLnNwbGl0KFwiLVwiKVtpdGVtLmlkLnNwbGl0KFwiLVwiKS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBvdXRsYXlEYXRhW2NhdGVnb3J5XSA/IG91dGxheURhdGFbY2F0ZWdvcnldIDogMDtcbiAgICAgICAgICAgICAgICB2YXIgaXRlbUkgPSBpO1xuICAgICAgICAgICAgICAgIHZhciBteUluZGV4ID0gb3V0bGF5RGF0YVtjYXRlZ29yeV0gPyBpdGVtSSArIDE4MCAqIChvdXRsYXlEYXRhW2NhdGVnb3J5XSAvIG91dGxheVN1bSkgLSAwLjUgOiBpO1xuICAgICAgICAgICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKFwiZFwiLCB0b1BpZUNoYXJ0SXRlbVBhdGhfMS50b1BpZUNoYXJ0SXRlbVBhdGgoMjUwLCAyNTAsIDE3MiwgMjAyLCBpLCBteUluZGV4KSk7XG4gICAgICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZShcImRcIiwgdG9QaWVDaGFydEl0ZW1QYXRoXzEudG9QaWVDaGFydEl0ZW1QYXRoKDI1MCwgMjUwLCAxNzIsIDIzMiwgaXRlbUksIG15SW5kZXgpKTtcbiAgICAgICAgICAgICAgICAgICAgW10uc2xpY2UuY2FsbChvdXRsYXlzKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlLm9wYWNpdHkgPSBcIjAuM1wiO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgW10uc2xpY2UuY2FsbChpbmNvbWVzKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlLm9wYWNpdHkgPSBcIjAuM1wiO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgZS5jdXJyZW50VGFyZ2V0LnN0eWxlLm9wYWNpdHkgPSBcIjFcIjtcbiAgICAgICAgICAgICAgICAgICAgdHlwZXNbMV0uc3R5bGUub3BhY2l0eSA9IFwiMVwiO1xuICAgICAgICAgICAgICAgICAgICB0eXBlc1swXS5zdHlsZS5vcGFjaXR5ID0gXCIwLjNcIjtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREYXRhW1wiZGF0YVR5cGVcIl0gPSBlLmN1cnJlbnRUYXJnZXQuaWQuc3BsaXQoXCItXCIpW2UuY3VycmVudFRhcmdldC5pZC5zcGxpdChcIi1cIikubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0YVtcInR5cGVcIl0gPSBcIm91dGxheVwiO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5kcmF3Q2VudGVyVGV4dCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZShcImRcIiwgdG9QaWVDaGFydEl0ZW1QYXRoXzEudG9QaWVDaGFydEl0ZW1QYXRoKDI1MCwgMjUwLCAxNzIsIDIwMiwgaXRlbUksIG15SW5kZXgpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpICs9IDE4MCAqICh2YWx1ZSAvIG91dGxheVN1bSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogRHJhdyBPdXRsYXkgRGF0YSBUZXh0XG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHZhciBvdXRsYXlUZXh0cyA9IHN2Zy5xdWVyeVNlbGVjdG9yQWxsKFwiLlwiICsgdGhpcy5jb250YWluZXJOYW1lICsgXCItb3V0bGF5LXRleHRcIik7XG4gICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgIFtdLnNsaWNlLmNhbGwob3V0bGF5VGV4dHMpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgdmFyIGNhdGVnb3J5ID0gaXRlbS5pZC5zcGxpdChcIi1cIilbaXRlbS5pZC5zcGxpdChcIi1cIikubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgdmFyIG15SW5kZXggPSBvdXRsYXlEYXRhW2NhdGVnb3J5XSA/IDE4MCAqIChvdXRsYXlEYXRhW2NhdGVnb3J5XSAvIG91dGxheVN1bSkgOiAwO1xuICAgICAgICAgICAgICAgIGlmIChteUluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUuY3NzVGV4dCA9IFwiZm9udC1zaXplOjEycHg7IHRyYW5zZm9ybS1vcmlnaW46MjUwcHggNDMwcHg7IHRyYW5zZm9ybTp0cmFuc2xhdGUoMHB4LC0xODBweCkgcm90YXRlKFwiICsgKGkgKyBteUluZGV4IC8gMikgKyBcImRlZyk7IHVzZXItc2VsZWN0Om5vbmU7IHBvaW50ZXItZXZlbnRzOm5vbmU7XCI7XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gbXlJbmRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUuY3NzVGV4dCA9IFwiZm9udC1zaXplOjBweDsgdHJhbnNmb3JtLW9yaWdpbjoyNTBweCA0MzBweDsgdHJhbnNmb3JtOnRyYW5zbGF0ZSgwcHgsLTE4MHB4KSByb3RhdGUoXCIgKyAoaSArIG15SW5kZXggLyAyKSArIFwiZGVnKTsgdXNlci1zZWxlY3Q6bm9uZTsgcG9pbnRlci1ldmVudHM6bm9uZTtcIjtcbiAgICAgICAgICAgICAgICAgICAgaSArPSBteUluZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBQaWUucHJvdG90eXBlLmRyYXdDZW50ZXJUZXh0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHRleHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI1wiICsgdGhpcy5jb250YWluZXJOYW1lICsgXCItdGV4dFwiKTtcbiAgICAgICAgICAgIHZhciBkZWZhbHRUZXh0ID0gXCI8ZGl2PlwiICsgdGhpcy5jaGFydFRpdGxlICsgXCI8L2Rpdj5cIjtcbiAgICAgICAgICAgIHZhciBpbnNlcnRUZXh0ID0gXCJcIjtcbiAgICAgICAgICAgIGluc2VydFRleHQgKz0gc2VsZWN0ZWREYXRhW1wic2Vhc29uXCJdXG4gICAgICAgICAgICAgICAgPyBcIjxkaXYgaWQ9XCIgKyB0aGlzLmNvbnRhaW5lck5hbWUgKyBcIi10ZXh0LXNlYXNvbiBzdHlsZT0nZm9udC1zaXplOjZweCc+XCIgKyBzZWxlY3RlZERhdGFbXCJzZWFzb25cIl0gKyBcIjwvZGl2PlwiXG4gICAgICAgICAgICAgICAgOiBcIlwiO1xuICAgICAgICAgICAgaW5zZXJ0VGV4dCArPSBzZWxlY3RlZERhdGFbXCJtb250aFwiXVxuICAgICAgICAgICAgICAgID8gXCI8ZGl2IGlkPVwiICsgdGhpcy5jb250YWluZXJOYW1lICsgXCItdGV4dC1tb250aCBzdHlsZT0nZm9udC1zaXplOjlweDsgZm9udC13ZWlnaHQ6Ym9sZCc+XCIgKyBzZWxlY3RlZERhdGFbXCJtb250aFwiXSArIFwiXFx1QzZENDwvZGl2PlwiXG4gICAgICAgICAgICAgICAgOiBcIlwiO1xuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjXCIgKyB0aGlzLmNvbnRhaW5lck5hbWUpO1xuICAgICAgICAgICAgdmFyIHN2ZyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFwic3ZnXCIpO1xuICAgICAgICAgICAgdmFyIHJhdGlvO1xuICAgICAgICAgICAgdmFyIGluY29tZXMgPSBzdmcucXVlcnlTZWxlY3RvckFsbChcIi5cIiArIHRoaXMuY29udGFpbmVyTmFtZSArIFwiLWluY29tZVwiKTtcbiAgICAgICAgICAgIHZhciBpbmNvbWVEYXRhcyA9IE9iamVjdC52YWx1ZXMoaW5jb21lRGF0YSk7XG4gICAgICAgICAgICB2YXIgaW5jb21lU3VtID0gaW5jb21lRGF0YXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGN1cikgeyByZXR1cm4gYWNjICsgY3VyOyB9LCAwKTtcbiAgICAgICAgICAgIHZhciBvdXRsYXlzID0gc3ZnLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuXCIgKyB0aGlzLmNvbnRhaW5lck5hbWUgKyBcIi1vdXRsYXlcIik7XG4gICAgICAgICAgICB2YXIgb3V0bGF5RGF0YXMgPSBPYmplY3QudmFsdWVzKG91dGxheURhdGEpO1xuICAgICAgICAgICAgdmFyIG91dGxheVN1bSA9IG91dGxheURhdGFzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBjdXIpIHsgcmV0dXJuIGFjYyArIGN1cjsgfSwgMCk7XG4gICAgICAgICAgICBbXS5zbGljZS5jYWxsKGluY29tZXMpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICB2YXIgY2F0ZWdvcnkgPSBpdGVtLmlkLnNwbGl0KFwiLVwiKVtpdGVtLmlkLnNwbGl0KFwiLVwiKS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBpbmNvbWVEYXRhW2NhdGVnb3J5XSA/IGluY29tZURhdGFbY2F0ZWdvcnldIDogMDtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWREYXRhW1wiZGF0YVR5cGVcIl0gPT09IGl0ZW0uaWQuc3BsaXQoXCItXCIpW2l0ZW0uaWQuc3BsaXQoXCItXCIpLmxlbmd0aCAtIDFdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJhdGlvID0gdmFsdWUgLyBpbmNvbWVTdW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBbXS5zbGljZS5jYWxsKG91dGxheXMpLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICB2YXIgY2F0ZWdvcnkgPSBpdGVtLmlkLnNwbGl0KFwiLVwiKVtpdGVtLmlkLnNwbGl0KFwiLVwiKS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBpbmNvbWVEYXRhW2NhdGVnb3J5XSA/IGluY29tZURhdGFbY2F0ZWdvcnldIDogMDtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWREYXRhW1wiZGF0YVR5cGVcIl0gPT09IGl0ZW0uaWQuc3BsaXQoXCItXCIpW2l0ZW0uaWQuc3BsaXQoXCItXCIpLmxlbmd0aCAtIDFdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJhdGlvID0gdmFsdWUgLyBvdXRsYXlTdW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpbnNlcnRUZXh0ICs9IHNlbGVjdGVkRGF0YVtcImRhdGFUeXBlXCJdXG4gICAgICAgICAgICAgICAgPyBcIjxkaXYgc3R5bGU9J2ZvbnQtc2l6ZTozMnB4OyBmb250LXdlaWdodDpib2xkJz5cIiArIE1hdGgucm91bmQocmF0aW8gKiAxMDApICsgXCIlPC9kaXY+XCJcbiAgICAgICAgICAgICAgICA6IFwiXCI7XG4gICAgICAgICAgICBpbnNlcnRUZXh0ICs9IHNlbGVjdGVkRGF0YVtcInR5cGVcIl1cbiAgICAgICAgICAgICAgICA/IFwiPGRpdiBpZD1cIiArIHRoaXMuY29udGFpbmVyTmFtZSArIFwiLXRleHQtdHlwZSBzdHlsZT0nZm9udC1zaXplOjZweCc+XCIgKyAoc2VsZWN0ZWREYXRhW1widHlwZVwiXSA9PT0gXCJpbmNvbWVcIiA/IFwi7IiY7J6FXCIgOiBcIuyngOy2nFwiKSArIFwiPC9kaXY+XCJcbiAgICAgICAgICAgICAgICA6IFwiXCI7XG4gICAgICAgICAgICBpbnNlcnRUZXh0ICs9IHNlbGVjdGVkRGF0YVtcImRhdGFUeXBlXCJdXG4gICAgICAgICAgICAgICAgPyBcIjxkaXYgaWQ9XCIgKyB0aGlzLmNvbnRhaW5lck5hbWUgKyBcIi10ZXh0LXR5cGUgc3R5bGU9J2ZvbnQtc2l6ZToxMnB4OyBmb250LXdlaWdodDpib2xkOyc+XCIgKyBzZWxlY3RlZERhdGFbXCJkYXRhVHlwZVwiXSArIFwiPC9kaXY+XCJcbiAgICAgICAgICAgICAgICA6IFwiXCI7XG4gICAgICAgICAgICB0ZXh0LmlubmVySFRNTCA9IGluc2VydFRleHQgPyBpbnNlcnRUZXh0IDogZGVmYWx0VGV4dDtcbiAgICAgICAgfTtcbiAgICAgICAgUGllLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI1wiICsgdGhpcy5jb250YWluZXJOYW1lKTtcbiAgICAgICAgICAgIHZhciBzdmcgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcihcInN2Z1wiKTtcbiAgICAgICAgICAgIHZhciByZXNldENpcmNsZSA9IHN2Zy5xdWVyeVNlbGVjdG9yKFwiY2lyY2xlXCIpO1xuICAgICAgICAgICAgdmFyIHNlYXNvbkVsZW1zID0gc3ZnLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuXCIgKyB0aGlzLmNvbnRhaW5lck5hbWUgKyBcIi1zZWFzb25cIik7XG4gICAgICAgICAgICB2YXIgbW9udGhFbGVtcyA9IHN2Zy5xdWVyeVNlbGVjdG9yQWxsKFwiLlwiICsgdGhpcy5jb250YWluZXJOYW1lICsgXCItbW9udGhcIik7XG4gICAgICAgICAgICB2YXIgdHlwZXMgPSBzdmcucXVlcnlTZWxlY3RvckFsbChcIi5cIiArIHRoaXMuY29udGFpbmVyTmFtZSArIFwiLXR5cGVcIik7XG4gICAgICAgICAgICByZXNldENpcmNsZS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFsbEVsZW1zID0gX19zcHJlYWRBcnJheXMoW10uc2xpY2UuY2FsbChzZWFzb25FbGVtcyksIFtdLnNsaWNlLmNhbGwobW9udGhFbGVtcykpO1xuICAgICAgICAgICAgICAgIGFsbEVsZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZS5vcGFjaXR5ID0gXCIxXCI7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgX3RoaXMuZHJhd0NlbnRlclRleHQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzZXRDaXJjbGUuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZERhdGFbXCJkYXRhVHlwZVwiXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZERhdGFbXCJ0eXBlXCJdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0YVtcIm1vbnRoXCJdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0YVtcInNlYXNvblwiXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBfdGhpcy5kcmF3Q2VudGVyVGV4dCgpO1xuICAgICAgICAgICAgICAgIF90aGlzLmluaXRQcm9wcyhfdGhpcy5jaGFydFByb3BzKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5kcmF3Q2hhcnQoKTtcbiAgICAgICAgICAgICAgICB2YXIgaW5jb21lcyA9IHN2Zy5xdWVyeVNlbGVjdG9yQWxsKFwiLlwiICsgX3RoaXMuY29udGFpbmVyTmFtZSArIFwiLWluY29tZVwiKTtcbiAgICAgICAgICAgICAgICB2YXIgb3V0bGF5cyA9IHN2Zy5xdWVyeVNlbGVjdG9yQWxsKFwiLlwiICsgX3RoaXMuY29udGFpbmVyTmFtZSArIFwiLW91dGxheVwiKTtcbiAgICAgICAgICAgICAgICB2YXIgYWxsRWxlbXMgPSBfX3NwcmVhZEFycmF5cyhbXS5zbGljZS5jYWxsKHR5cGVzKSwgW10uc2xpY2UuY2FsbChpbmNvbWVzKSwgW10uc2xpY2UuY2FsbChvdXRsYXlzKSk7XG4gICAgICAgICAgICAgICAgYWxsRWxlbXMuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlLm9wYWNpdHkgPSBcIjFcIjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgW10uc2xpY2UuY2FsbChzZWFzb25FbGVtcykuZm9yRWFjaChmdW5jdGlvbiAoc2Vhc29uRWxlbSkge1xuICAgICAgICAgICAgICAgIHNlYXNvbkVsZW0uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgW10uc2xpY2UuY2FsbChzZWFzb25FbGVtcykuZm9yRWFjaChmdW5jdGlvbiAoc2Vhc29uRWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Vhc29uRWxlbS5zdHlsZS5vcGFjaXR5ID0gXCIwLjNcIjtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWFzb24gPSBlLmN1cnJlbnRUYXJnZXQuaWQuc3BsaXQoXCItXCIpW2UuY3VycmVudFRhcmdldC5pZC5zcGxpdChcIi1cIikubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0YVtcInNlYXNvblwiXSA9IHNlYXNvbjtcbiAgICAgICAgICAgICAgICAgICAgZS5jdXJyZW50VGFyZ2V0LnN0eWxlLm9wYWNpdHkgPSBcIjFcIjtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZHJhd0NlbnRlclRleHQoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgW10uc2xpY2UuY2FsbChtb250aEVsZW1zKS5mb3JFYWNoKGZ1bmN0aW9uIChtb250aEVsZW0pIHtcbiAgICAgICAgICAgICAgICBtb250aEVsZW0uYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1vbnRoID0gTnVtYmVyKGUuY3VycmVudFRhcmdldC5pZC5zcGxpdChcIi1cIilbZS5jdXJyZW50VGFyZ2V0LmlkLnNwbGl0KFwiLVwiKS5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmluaXRQcm9wcyhfdGhpcy5jaGFydFByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuY2hhbmdlRGF0YShtb250aCk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmRyYXdDaGFydCgpO1xuICAgICAgICAgICAgICAgICAgICBbXS5zbGljZS5jYWxsKG1vbnRoRWxlbXMpLmZvckVhY2goZnVuY3Rpb24gKG1vbnRoRWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9udGhFbGVtLnN0eWxlLm9wYWNpdHkgPSBcIjAuM1wiO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREYXRhW1wibW9udGhcIl0gPSBtb250aDtcbiAgICAgICAgICAgICAgICAgICAgW10uc2xpY2UuY2FsbChzZWFzb25FbGVtcykuZm9yRWFjaChmdW5jdGlvbiAoc2Vhc29uRWxlbSwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXNvbkVsZW0uc3R5bGUub3BhY2l0eSA9IFwiMC4zXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoWzMsIDQsIDVdLmluZGV4T2YobW9udGgpID49IDAgJiYgaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERhdGFbXCJzZWFzb25cIl0gPSBcIlNQUklOR1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXNvbkVsZW0uc3R5bGUub3BhY2l0eSA9IFwiMVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFs2LCA3LCA4XS5pbmRleE9mKG1vbnRoKSA+PSAwICYmIGluZGV4ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREYXRhW1wic2Vhc29uXCJdID0gXCJTVU1NRVJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFzb25FbGVtLnN0eWxlLm9wYWNpdHkgPSBcIjFcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChbOSwgMTAsIDExXS5pbmRleE9mKG1vbnRoKSA+PSAwICYmIGluZGV4ID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREYXRhW1wic2Vhc29uXCJdID0gXCJGQUxMXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vhc29uRWxlbS5zdHlsZS5vcGFjaXR5ID0gXCIxXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoWzEyLCAxLCAyXS5pbmRleE9mKG1vbnRoKSA+PSAwICYmIGluZGV4ID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREYXRhW1wic2Vhc29uXCJdID0gXCJXSU5URVJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFzb25FbGVtLnN0eWxlLm9wYWNpdHkgPSBcIjFcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGUuY3VycmVudFRhcmdldC5zdHlsZS5vcGFjaXR5ID0gXCIxXCI7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmRyYXdDZW50ZXJUZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIFtdLnNsaWNlLmNhbGwodHlwZXMpLmZvckVhY2goZnVuY3Rpb24gKHR5cGVFbGVtLCBpbmRleCkge1xuICAgICAgICAgICAgICAgIHR5cGVFbGVtLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbmNvbWVzID0gc3ZnLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuXCIgKyBfdGhpcy5jb250YWluZXJOYW1lICsgXCItaW5jb21lXCIpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgb3V0bGF5cyA9IHN2Zy5xdWVyeVNlbGVjdG9yQWxsKFwiLlwiICsgX3RoaXMuY29udGFpbmVyTmFtZSArIFwiLW91dGxheVwiKTtcbiAgICAgICAgICAgICAgICAgICAgW10uc2xpY2UuY2FsbCh0eXBlcykuZm9yRWFjaChmdW5jdGlvbiAodHlwZUVsZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVFbGVtLnN0eWxlLm9wYWNpdHkgPSBcIjAuM1wiO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIFtdLnNsaWNlLmNhbGwob3V0bGF5cykuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUub3BhY2l0eSA9IFwiMC4zXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPT09IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIFtdLnNsaWNlLmNhbGwoaW5jb21lcykuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUub3BhY2l0eSA9IFwiMC4zXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBlLmN1cnJlbnRUYXJnZXQuaWQuc3BsaXQoXCItXCIpW2UuY3VycmVudFRhcmdldC5pZC5zcGxpdChcIi1cIikubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0YVtcInR5cGVcIl0gPSB0eXBlO1xuICAgICAgICAgICAgICAgICAgICBlLmN1cnJlbnRUYXJnZXQuc3R5bGUub3BhY2l0eSA9IFwiMVwiO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5kcmF3Q2VudGVyVGV4dCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIFBpZS5wcm90b3R5cGUuaW5pdFN0eWxlT2Zmc2V0TW9udGggPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjXCIgKyB0aGlzLmNvbnRhaW5lck5hbWUpO1xuICAgICAgICAgICAgdmFyIHN2ZyA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFwic3ZnXCIpO1xuICAgICAgICAgICAgdmFyIHJlc2V0Q2lyY2xlID0gc3ZnLnF1ZXJ5U2VsZWN0b3IoXCJjaXJjbGVcIik7XG4gICAgICAgICAgICB2YXIgc2Vhc29uRWxlbXMgPSBzdmcucXVlcnlTZWxlY3RvckFsbChcIi5cIiArIHRoaXMuY29udGFpbmVyTmFtZSArIFwiLXNlYXNvblwiKTtcbiAgICAgICAgICAgIHZhciBtb250aEVsZW1zID0gc3ZnLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuXCIgKyB0aGlzLmNvbnRhaW5lck5hbWUgKyBcIi1tb250aFwiKTtcbiAgICAgICAgICAgIHZhciB0eXBlcyA9IHN2Zy5xdWVyeVNlbGVjdG9yQWxsKFwiLlwiICsgdGhpcy5jb250YWluZXJOYW1lICsgXCItdHlwZVwiKTtcbiAgICAgICAgICAgIFtdLnNsaWNlLmNhbGwoc2Vhc29uRWxlbXMpLmZvckVhY2goZnVuY3Rpb24gKHNlYXNvbkVsZW0sIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgc2Vhc29uRWxlbS5zdHlsZS5vcGFjaXR5ID0gXCIwLjNcIjtcbiAgICAgICAgICAgICAgICBpZiAoWzMsIDQsIDVdLmluZGV4T2YoX3RoaXMub2Zmc2V0TW9udGgpID49IDAgJiYgaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREYXRhW1wic2Vhc29uXCJdID0gXCJTUFJJTkdcIjtcbiAgICAgICAgICAgICAgICAgICAgc2Vhc29uRWxlbS5zdHlsZS5vcGFjaXR5ID0gXCIxXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChbNiwgNywgOF0uaW5kZXhPZihfdGhpcy5vZmZzZXRNb250aCkgPj0gMCAmJiBpbmRleCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERhdGFbXCJzZWFzb25cIl0gPSBcIlNVTU1FUlwiO1xuICAgICAgICAgICAgICAgICAgICBzZWFzb25FbGVtLnN0eWxlLm9wYWNpdHkgPSBcIjFcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFs5LCAxMCwgMTFdLmluZGV4T2YoX3RoaXMub2Zmc2V0TW9udGgpID49IDAgJiYgaW5kZXggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREYXRhW1wic2Vhc29uXCJdID0gXCJGQUxMXCI7XG4gICAgICAgICAgICAgICAgICAgIHNlYXNvbkVsZW0uc3R5bGUub3BhY2l0eSA9IFwiMVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoWzEyLCAxLCAyXS5pbmRleE9mKF90aGlzLm9mZnNldE1vbnRoKSA+PSAwICYmIGluZGV4ID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0YVtcInNlYXNvblwiXSA9IFwiV0lOVEVSXCI7XG4gICAgICAgICAgICAgICAgICAgIHNlYXNvbkVsZW0uc3R5bGUub3BhY2l0eSA9IFwiMVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgW10uc2xpY2UuY2FsbChtb250aEVsZW1zKS5mb3JFYWNoKGZ1bmN0aW9uIChtb250aEVsZW0pIHtcbiAgICAgICAgICAgICAgICB2YXIgbW9udGggPSBOdW1iZXIobW9udGhFbGVtLmlkLnNwbGl0KFwiLVwiKVttb250aEVsZW0uaWQuc3BsaXQoXCItXCIpLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICAgICAgICBpZiAobW9udGggPT09IF90aGlzLm9mZnNldE1vbnRoKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vbnRoRWxlbS5zdHlsZS5vcGFjaXR5ID0gXCIxXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtb250aEVsZW0uc3R5bGUub3BhY2l0eSA9IFwiMC4zXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBQaWU7XG4gICAgfSgpKTtcbiAgICBleHBvcnRzLmRlZmF1bHQgPSBQaWU7XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6\n')},function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports], __WEBPACK_AMD_DEFINE_RESULT__ = (function (require, exports) {\n "use strict";\n Object.defineProperty(exports, "__esModule", { value: true });\n exports.toPieChartItemPath = void 0;\n exports.toPieChartItemPath = function (x, y, radiusIn, radiusOut, startAngle, endAngle) {\n var _toXY = function (cX, cY, r, degrees) {\n var rad = (degrees * Math.PI) / 180.0;\n return {\n x: cX + r * Math.cos(rad),\n y: cY + r * Math.sin(rad),\n };\n };\n var startIn = _toXY(x, y, radiusIn, endAngle);\n var endIn = _toXY(x, y, radiusIn, startAngle);\n var startOut = _toXY(x, y, radiusOut, endAngle);\n var endOut = _toXY(x, y, radiusOut, startAngle);\n var arcSweep = endAngle - startAngle <= 180 ? "0" : "1";\n return [\n "M", startIn.x, startIn.y,\n "L", startOut.x, startOut.y,\n "A", radiusOut, radiusOut, 0, arcSweep, 0, endOut.x, endOut.y,\n "L", endIn.x, endIn.y,\n "A", radiusIn, radiusIn, 0, arcSweep, 1, startIn.x, startIn.y,\n "z"\n ].join(" "); //prettier-ignore\n };\n}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3NyYy91dGlscy90b1BpZUNoYXJ0SXRlbVBhdGgudHM/MmIwYiJdLCJzb3VyY2VzQ29udGVudCI6WyJkZWZpbmUoW1wicmVxdWlyZVwiLCBcImV4cG9ydHNcIl0sIGZ1bmN0aW9uIChyZXF1aXJlLCBleHBvcnRzKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuICAgIGV4cG9ydHMudG9QaWVDaGFydEl0ZW1QYXRoID0gdm9pZCAwO1xuICAgIGV4cG9ydHMudG9QaWVDaGFydEl0ZW1QYXRoID0gZnVuY3Rpb24gKHgsIHksIHJhZGl1c0luLCByYWRpdXNPdXQsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlKSB7XG4gICAgICAgIHZhciBfdG9YWSA9IGZ1bmN0aW9uIChjWCwgY1ksIHIsIGRlZ3JlZXMpIHtcbiAgICAgICAgICAgIHZhciByYWQgPSAoZGVncmVlcyAqIE1hdGguUEkpIC8gMTgwLjA7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHg6IGNYICsgciAqIE1hdGguY29zKHJhZCksXG4gICAgICAgICAgICAgICAgeTogY1kgKyByICogTWF0aC5zaW4ocmFkKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICAgIHZhciBzdGFydEluID0gX3RvWFkoeCwgeSwgcmFkaXVzSW4sIGVuZEFuZ2xlKTtcbiAgICAgICAgdmFyIGVuZEluID0gX3RvWFkoeCwgeSwgcmFkaXVzSW4sIHN0YXJ0QW5nbGUpO1xuICAgICAgICB2YXIgc3RhcnRPdXQgPSBfdG9YWSh4LCB5LCByYWRpdXNPdXQsIGVuZEFuZ2xlKTtcbiAgICAgICAgdmFyIGVuZE91dCA9IF90b1hZKHgsIHksIHJhZGl1c091dCwgc3RhcnRBbmdsZSk7XG4gICAgICAgIHZhciBhcmNTd2VlcCA9IGVuZEFuZ2xlIC0gc3RhcnRBbmdsZSA8PSAxODAgPyBcIjBcIiA6IFwiMVwiO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgXCJNXCIsIHN0YXJ0SW4ueCwgc3RhcnRJbi55LFxuICAgICAgICAgICAgXCJMXCIsIHN0YXJ0T3V0LngsIHN0YXJ0T3V0LnksXG4gICAgICAgICAgICBcIkFcIiwgcmFkaXVzT3V0LCByYWRpdXNPdXQsIDAsIGFyY1N3ZWVwLCAwLCBlbmRPdXQueCwgZW5kT3V0LnksXG4gICAgICAgICAgICBcIkxcIiwgZW5kSW4ueCwgZW5kSW4ueSxcbiAgICAgICAgICAgIFwiQVwiLCByYWRpdXNJbiwgcmFkaXVzSW4sIDAsIGFyY1N3ZWVwLCAxLCBzdGFydEluLngsIHN0YXJ0SW4ueSxcbiAgICAgICAgICAgIFwielwiXG4gICAgICAgIF0uam9pbihcIiBcIik7IC8vcHJldHRpZXItaWdub3JlXG4gICAgfTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7\n')},function(module){eval('module.exports = JSON.parse("[{\\"month\\":1,\\"data\\":[{\\"date\\":1,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"교통\\",\\"amount\\":-1000}]},{\\"date\\":2,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"월급\\",\\"amount\\":15000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000}]},{\\"date\\":3,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":15000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-3000},{\\"type\\":\\"기타수입\\",\\"amount\\":10000}]},{\\"date\\":4,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":3000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-10000}]},{\\"date\\":5,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-50000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-50000}]},{\\"date\\":6,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"생활\\",\\"amount\\":-30000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000}]},{\\"date\\":7,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":15000},{\\"type\\":\\"생활\\",\\"amount\\":-50000},{\\"type\\":\\"식비\\",\\"amount\\":-30000}]},{\\"date\\":8,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":10000},{\\"type\\":\\"월급\\",\\"amount\\":50000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-1000}]},{\\"date\\":9,\\"data\\":[{\\"type\\":\\"의료/건강\\",\\"amount\\":-50000},{\\"type\\":\\"용돈\\",\\"amount\\":20000},{\\"type\\":\\"생활\\",\\"amount\\":-50000}]},{\\"date\\":10,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"교통\\",\\"amount\\":-5000},{\\"type\\":\\"미분류\\",\\"amount\\":-1000}]},{\\"date\\":11,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"식비\\",\\"amount\\":-50000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-50000}]},{\\"date\\":12,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":50000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000},{\\"type\\":\\"기타수입\\",\\"amount\\":5000}]},{\\"date\\":13,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-1000},{\\"type\\":\\"교통\\",\\"amount\\":-30000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000}]},{\\"date\\":14,\\"data\\":[{\\"type\\":\\"의료/건강\\",\\"amount\\":-30000},{\\"type\\":\\"식비\\",\\"amount\\":-3000},{\\"type\\":\\"미분류\\",\\"amount\\":-5000}]},{\\"date\\":15,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"생활\\",\\"amount\\":-1000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-50000}]},{\\"date\\":16,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-1000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000}]},{\\"date\\":17,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":3000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-50000},{\\"type\\":\\"생활\\",\\"amount\\":-30000}]},{\\"date\\":18,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-5000}]},{\\"date\\":19,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"교통\\",\\"amount\\":-1000},{\\"type\\":\\"교통\\",\\"amount\\":-50000}]},{\\"date\\":20,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-10000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-1000},{\\"type\\":\\"용돈\\",\\"amount\\":50000}]},{\\"date\\":21,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-3000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-50000}]},{\\"date\\":22,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-10000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-30000},{\\"type\\":\\"용돈\\",\\"amount\\":3000}]},{\\"date\\":23,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"미분류\\",\\"amount\\":-3000},{\\"type\\":\\"식비\\",\\"amount\\":-5000}]},{\\"date\\":24,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-50000},{\\"type\\":\\"월급\\",\\"amount\\":15000},{\\"type\\":\\"미분류\\",\\"amount\\":-1000}]},{\\"date\\":25,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"미분류\\",\\"amount\\":-10000},{\\"type\\":\\"식비\\",\\"amount\\":-1000}]},{\\"date\\":26,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-3000},{\\"type\\":\\"용돈\\",\\"amount\\":10000},{\\"type\\":\\"용돈\\",\\"amount\\":15000}]},{\\"date\\":27,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":50000},{\\"type\\":\\"월급\\",\\"amount\\":5000},{\\"type\\":\\"용돈\\",\\"amount\\":5000}]},{\\"date\\":28,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":3000},{\\"type\\":\\"미분류\\",\\"amount\\":-30000},{\\"type\\":\\"식비\\",\\"amount\\":-50000}]},{\\"date\\":29,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":3000},{\\"type\\":\\"월급\\",\\"amount\\":50000},{\\"type\\":\\"용돈\\",\\"amount\\":50000}]},{\\"date\\":30,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-5000},{\\"type\\":\\"월급\\",\\"amount\\":3000}]},{\\"date\\":31,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-5000},{\\"type\\":\\"용돈\\",\\"amount\\":10000},{\\"type\\":\\"교통\\",\\"amount\\":-10000}]}]},{\\"month\\":2,\\"data\\":[{\\"date\\":1,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"생활\\",\\"amount\\":-1000},{\\"type\\":\\"교통\\",\\"amount\\":-10000}]},{\\"date\\":2,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"식비\\",\\"amount\\":-1000},{\\"type\\":\\"기타수입\\",\\"amount\\":5000}]},{\\"date\\":3,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":10000},{\\"type\\":\\"미분류\\",\\"amount\\":-50000},{\\"type\\":\\"식비\\",\\"amount\\":-1000}]},{\\"date\\":4,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-50000},{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"식비\\",\\"amount\\":-10000}]},{\\"date\\":5,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-30000},{\\"type\\":\\"용돈\\",\\"amount\\":3000},{\\"type\\":\\"월급\\",\\"amount\\":50000}]},{\\"date\\":6,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":50000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-3000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000}]},{\\"date\\":7,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-1000}]},{\\"date\\":8,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-5000}]},{\\"date\\":9,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-5000},{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000}]},{\\"date\\":10,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-30000},{\\"type\\":\\"용돈\\",\\"amount\\":10000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000}]},{\\"date\\":11,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"용돈\\",\\"amount\\":20000},{\\"type\\":\\"미분류\\",\\"amount\\":-3000}]},{\\"date\\":12,\\"data\\":[{\\"type\\":\\"의료/건강\\",\\"amount\\":-5000},{\\"type\\":\\"월급\\",\\"amount\\":5000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-50000}]},{\\"date\\":13,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-50000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-1000}]},{\\"date\\":14,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":50000},{\\"type\\":\\"미분류\\",\\"amount\\":-10000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000}]},{\\"date\\":15,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":10000},{\\"type\\":\\"용돈\\",\\"amount\\":10000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000}]},{\\"date\\":16,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-1000},{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000}]},{\\"date\\":17,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-10000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000},{\\"type\\":\\"용돈\\",\\"amount\\":5000}]},{\\"date\\":18,\\"data\\":[{\\"type\\":\\"식비\\",\\"amount\\":-30000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000},{\\"type\\":\\"월급\\",\\"amount\\":20000}]},{\\"date\\":19,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"월급\\",\\"amount\\":20000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-10000}]},{\\"date\\":20,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-30000},{\\"type\\":\\"용돈\\",\\"amount\\":5000}]},{\\"date\\":21,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":3000},{\\"type\\":\\"용돈\\",\\"amount\\":3000},{\\"type\\":\\"용돈\\",\\"amount\\":5000}]},{\\"date\\":22,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-10000},{\\"type\\":\\"식비\\",\\"amount\\":-10000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-10000}]},{\\"date\\":23,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-50000},{\\"type\\":\\"미분류\\",\\"amount\\":-1000}]},{\\"date\\":24,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-10000},{\\"type\\":\\"교통\\",\\"amount\\":-3000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-50000}]},{\\"date\\":25,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-5000},{\\"type\\":\\"교통\\",\\"amount\\":-50000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-10000}]},{\\"date\\":26,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000}]},{\\"date\\":27,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":50000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-30000},{\\"type\\":\\"식비\\",\\"amount\\":-3000}]},{\\"date\\":28,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-1000},{\\"type\\":\\"미분류\\",\\"amount\\":-5000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000}]},{\\"date\\":29,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-1000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-30000},{\\"type\\":\\"월급\\",\\"amount\\":3000}]},{\\"date\\":30,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"식비\\",\\"amount\\":-10000},{\\"type\\":\\"미분류\\",\\"amount\\":-5000}]},{\\"date\\":31,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-30000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-50000},{\\"type\\":\\"교통\\",\\"amount\\":-30000}]}]},{\\"month\\":3,\\"data\\":[{\\"date\\":1,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"식비\\",\\"amount\\":-3000}]},{\\"date\\":2,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"미분류\\",\\"amount\\":-10000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000}]},{\\"date\\":3,\\"data\\":[{\\"type\\":\\"의료/건강\\",\\"amount\\":-10000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-3000},{\\"type\\":\\"용돈\\",\\"amount\\":20000}]},{\\"date\\":4,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"교통\\",\\"amount\\":-50000},{\\"type\\":\\"월급\\",\\"amount\\":3000}]},{\\"date\\":5,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-10000},{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"생활\\",\\"amount\\":-3000}]},{\\"date\\":6,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-50000},{\\"type\\":\\"교통\\",\\"amount\\":-3000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-1000}]},{\\"date\\":7,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-1000},{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"미분류\\",\\"amount\\":-1000}]},{\\"date\\":8,\\"data\\":[{\\"type\\":\\"식비\\",\\"amount\\":-30000},{\\"type\\":\\"식비\\",\\"amount\\":-30000},{\\"type\\":\\"용돈\\",\\"amount\\":10000}]},{\\"date\\":9,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-10000},{\\"type\\":\\"교통\\",\\"amount\\":-30000},{\\"type\\":\\"월급\\",\\"amount\\":10000}]},{\\"date\\":10,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-30000},{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-10000}]},{\\"date\\":11,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-30000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000},{\\"type\\":\\"식비\\",\\"amount\\":-50000}]},{\\"date\\":12,\\"data\\":[{\\"type\\":\\"식비\\",\\"amount\\":-5000},{\\"type\\":\\"교통\\",\\"amount\\":-1000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000}]},{\\"date\\":13,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-10000},{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"월급\\",\\"amount\\":5000}]},{\\"date\\":14,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"미분류\\",\\"amount\\":-1000},{\\"type\\":\\"용돈\\",\\"amount\\":15000}]},{\\"date\\":15,\\"data\\":[{\\"type\\":\\"의료/건강\\",\\"amount\\":-10000},{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-30000}]},{\\"date\\":16,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"용돈\\",\\"amount\\":10000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-50000}]},{\\"date\\":17,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"월급\\",\\"amount\\":3000}]},{\\"date\\":18,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":5000},{\\"type\\":\\"생활\\",\\"amount\\":-1000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-3000}]},{\\"date\\":19,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":15000},{\\"type\\":\\"교통\\",\\"amount\\":-10000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000}]},{\\"date\\":20,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-3000},{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-3000}]},{\\"date\\":21,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":3000},{\\"type\\":\\"식비\\",\\"amount\\":-10000},{\\"type\\":\\"월급\\",\\"amount\\":20000}]},{\\"date\\":22,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"식비\\",\\"amount\\":-5000},{\\"type\\":\\"식비\\",\\"amount\\":-10000}]},{\\"date\\":23,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-3000},{\\"type\\":\\"생활\\",\\"amount\\":-1000},{\\"type\\":\\"식비\\",\\"amount\\":-10000}]},{\\"date\\":24,\\"data\\":[{\\"type\\":\\"식비\\",\\"amount\\":-10000},{\\"type\\":\\"월급\\",\\"amount\\":20000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000}]},{\\"date\\":25,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-1000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-5000},{\\"type\\":\\"식비\\",\\"amount\\":-1000}]},{\\"date\\":26,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-1000},{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-10000}]},{\\"date\\":27,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"미분류\\",\\"amount\\":-5000}]},{\\"date\\":28,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"생활\\",\\"amount\\":-50000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-50000}]},{\\"date\\":29,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":3000},{\\"type\\":\\"생활\\",\\"amount\\":-10000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-5000}]},{\\"date\\":30,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-10000},{\\"type\\":\\"용돈\\",\\"amount\\":50000}]},{\\"date\\":31,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":15000},{\\"type\\":\\"월급\\",\\"amount\\":5000},{\\"type\\":\\"교통\\",\\"amount\\":-50000}]}]},{\\"month\\":4,\\"data\\":[{\\"date\\":1,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":20000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"교통\\",\\"amount\\":-1000}]},{\\"date\\":2,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":15000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-1000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-1000}]},{\\"date\\":3,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":3000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"교통\\",\\"amount\\":-3000}]},{\\"date\\":4,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":15000},{\\"type\\":\\"식비\\",\\"amount\\":-30000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000}]},{\\"date\\":5,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":20000},{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"미분류\\",\\"amount\\":-5000}]},{\\"date\\":6,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"용돈\\",\\"amount\\":3000},{\\"type\\":\\"월급\\",\\"amount\\":10000}]},{\\"date\\":7,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"월급\\",\\"amount\\":3000},{\\"type\\":\\"월급\\",\\"amount\\":3000}]},{\\"date\\":8,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-10000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-30000}]},{\\"date\\":9,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"교통\\",\\"amount\\":-50000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-30000}]},{\\"date\\":10,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-3000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"월급\\",\\"amount\\":50000}]},{\\"date\\":11,\\"data\\":[{\\"type\\":\\"식비\\",\\"amount\\":-50000},{\\"type\\":\\"용돈\\",\\"amount\\":3000},{\\"type\\":\\"미분류\\",\\"amount\\":-5000}]},{\\"date\\":12,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-10000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-3000},{\\"type\\":\\"월급\\",\\"amount\\":5000}]},{\\"date\\":13,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"교통\\",\\"amount\\":-30000}]},{\\"date\\":14,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":50000},{\\"type\\":\\"용돈\\",\\"amount\\":10000},{\\"type\\":\\"용돈\\",\\"amount\\":5000}]},{\\"date\\":15,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-50000},{\\"type\\":\\"미분류\\",\\"amount\\":-10000}]},{\\"date\\":16,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-1000},{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-1000}]},{\\"date\\":17,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":15000},{\\"type\\":\\"월급\\",\\"amount\\":3000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-5000}]},{\\"date\\":18,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"미분류\\",\\"amount\\":-3000},{\\"type\\":\\"교통\\",\\"amount\\":-1000}]},{\\"date\\":19,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-50000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-1000},{\\"type\\":\\"미분류\\",\\"amount\\":-50000}]},{\\"date\\":20,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":3000},{\\"type\\":\\"생활\\",\\"amount\\":-30000},{\\"type\\":\\"용돈\\",\\"amount\\":50000}]},{\\"date\\":21,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-1000},{\\"type\\":\\"생활\\",\\"amount\\":-5000},{\\"type\\":\\"월급\\",\\"amount\\":20000}]},{\\"date\\":22,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000}]},{\\"date\\":23,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-10000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-50000},{\\"type\\":\\"식비\\",\\"amount\\":-3000}]},{\\"date\\":24,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":15000},{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-50000}]},{\\"date\\":25,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"기타수입\\",\\"amount\\":5000}]},{\\"date\\":26,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-3000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"교통\\",\\"amount\\":-30000}]},{\\"date\\":27,\\"data\\":[{\\"type\\":\\"의료/건강\\",\\"amount\\":-3000},{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"생활\\",\\"amount\\":-1000}]},{\\"date\\":28,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-3000},{\\"type\\":\\"월급\\",\\"amount\\":3000}]},{\\"date\\":29,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"식비\\",\\"amount\\":-50000},{\\"type\\":\\"생활\\",\\"amount\\":-5000}]},{\\"date\\":30,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"용돈\\",\\"amount\\":3000},{\\"type\\":\\"생활\\",\\"amount\\":-3000}]},{\\"date\\":31,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-1000},{\\"type\\":\\"미분류\\",\\"amount\\":-3000},{\\"type\\":\\"미분류\\",\\"amount\\":-3000}]}]},{\\"month\\":5,\\"data\\":[{\\"date\\":1,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-30000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000}]},{\\"date\\":2,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":50000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-10000},{\\"type\\":\\"생활\\",\\"amount\\":-1000}]},{\\"date\\":3,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"용돈\\",\\"amount\\":3000}]},{\\"date\\":4,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-10000},{\\"type\\":\\"생활\\",\\"amount\\":-3000},{\\"type\\":\\"교통\\",\\"amount\\":-1000}]},{\\"date\\":5,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-1000},{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-30000}]},{\\"date\\":6,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":15000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000},{\\"type\\":\\"월급\\",\\"amount\\":15000}]},{\\"date\\":7,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"월급\\",\\"amount\\":5000},{\\"type\\":\\"용돈\\",\\"amount\\":3000}]},{\\"date\\":8,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-1000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-30000}]},{\\"date\\":9,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":3000},{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-1000}]},{\\"date\\":10,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-10000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-30000}]},{\\"date\\":11,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-30000},{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"미분류\\",\\"amount\\":-3000}]},{\\"date\\":12,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-1000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-3000}]},{\\"date\\":13,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":50000},{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"미분류\\",\\"amount\\":-5000}]},{\\"date\\":14,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-50000},{\\"type\\":\\"식비\\",\\"amount\\":-50000},{\\"type\\":\\"월급\\",\\"amount\\":15000}]},{\\"date\\":15,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":15000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-50000},{\\"type\\":\\"교통\\",\\"amount\\":-3000}]},{\\"date\\":16,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":5000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-3000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-50000}]},{\\"date\\":17,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-30000},{\\"type\\":\\"용돈\\",\\"amount\\":20000},{\\"type\\":\\"용돈\\",\\"amount\\":50000}]},{\\"date\\":18,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-5000},{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"월급\\",\\"amount\\":20000}]},{\\"date\\":19,\\"data\\":[{\\"type\\":\\"의료/건강\\",\\"amount\\":-10000},{\\"type\\":\\"용돈\\",\\"amount\\":20000},{\\"type\\":\\"교통\\",\\"amount\\":-5000}]},{\\"date\\":20,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"교통\\",\\"amount\\":-3000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-1000}]},{\\"date\\":21,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-1000},{\\"type\\":\\"월급\\",\\"amount\\":5000},{\\"type\\":\\"월급\\",\\"amount\\":5000}]},{\\"date\\":22,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-3000},{\\"type\\":\\"월급\\",\\"amount\\":15000},{\\"type\\":\\"용돈\\",\\"amount\\":3000}]},{\\"date\\":23,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000}]},{\\"date\\":24,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"식비\\",\\"amount\\":-10000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000}]},{\\"date\\":25,\\"data\\":[{\\"type\\":\\"식비\\",\\"amount\\":-3000},{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"월급\\",\\"amount\\":50000}]},{\\"date\\":26,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":20000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-30000}]},{\\"date\\":27,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":10000},{\\"type\\":\\"생활\\",\\"amount\\":-3000},{\\"type\\":\\"생활\\",\\"amount\\":-1000}]},{\\"date\\":28,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-50000},{\\"type\\":\\"용돈\\",\\"amount\\":10000}]},{\\"date\\":29,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":3000},{\\"type\\":\\"미분류\\",\\"amount\\":-1000},{\\"type\\":\\"미분류\\",\\"amount\\":-1000}]},{\\"date\\":30,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-5000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000}]},{\\"date\\":31,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":20000},{\\"type\\":\\"월급\\",\\"amount\\":15000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-1000}]}]},{\\"month\\":6,\\"data\\":[{\\"date\\":1,\\"data\\":[{\\"type\\":\\"식비\\",\\"amount\\":-3000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-30000},{\\"type\\":\\"교통\\",\\"amount\\":-30000}]},{\\"date\\":2,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-50000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-10000},{\\"type\\":\\"용돈\\",\\"amount\\":20000}]},{\\"date\\":3,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-50000},{\\"type\\":\\"기타수입\\",\\"amount\\":5000}]},{\\"date\\":4,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-1000},{\\"type\\":\\"월급\\",\\"amount\\":3000},{\\"type\\":\\"용돈\\",\\"amount\\":50000}]},{\\"date\\":5,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-50000},{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"월급\\",\\"amount\\":3000}]},{\\"date\\":6,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-50000},{\\"type\\":\\"월급\\",\\"amount\\":3000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-10000}]},{\\"date\\":7,\\"data\\":[{\\"type\\":\\"식비\\",\\"amount\\":-10000},{\\"type\\":\\"식비\\",\\"amount\\":-5000},{\\"type\\":\\"기타수입\\",\\"amount\\":10000}]},{\\"date\\":8,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-10000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-3000},{\\"type\\":\\"식비\\",\\"amount\\":-10000}]},{\\"date\\":9,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-3000},{\\"type\\":\\"식비\\",\\"amount\\":-30000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000}]},{\\"date\\":10,\\"data\\":[{\\"type\\":\\"식비\\",\\"amount\\":-5000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000}]},{\\"date\\":11,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"용돈\\",\\"amount\\":20000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-50000}]},{\\"date\\":12,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-3000},{\\"type\\":\\"용돈\\",\\"amount\\":3000},{\\"type\\":\\"생활\\",\\"amount\\":-1000}]},{\\"date\\":13,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-10000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000},{\\"type\\":\\"식비\\",\\"amount\\":-5000}]},{\\"date\\":14,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"식비\\",\\"amount\\":-3000}]},{\\"date\\":15,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-1000},{\\"type\\":\\"월급\\",\\"amount\\":5000},{\\"type\\":\\"미분류\\",\\"amount\\":-1000}]},{\\"date\\":16,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"기타수입\\",\\"amount\\":10000}]},{\\"date\\":17,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-3000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-5000}]},{\\"date\\":18,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-5000},{\\"type\\":\\"생활\\",\\"amount\\":-10000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-1000}]},{\\"date\\":19,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":20000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-10000},{\\"type\\":\\"교통\\",\\"amount\\":-10000}]},{\\"date\\":20,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":3000},{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-50000}]},{\\"date\\":21,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"식비\\",\\"amount\\":-1000}]},{\\"date\\":22,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":50000},{\\"type\\":\\"월급\\",\\"amount\\":20000},{\\"type\\":\\"교통\\",\\"amount\\":-30000}]},{\\"date\\":23,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-1000},{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-10000}]},{\\"date\\":24,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-50000},{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"용돈\\",\\"amount\\":20000}]},{\\"date\\":25,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"월급\\",\\"amount\\":50000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-3000}]},{\\"date\\":26,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":3000},{\\"type\\":\\"교통\\",\\"amount\\":-30000},{\\"type\\":\\"용돈\\",\\"amount\\":15000}]},{\\"date\\":27,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-10000},{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000}]},{\\"date\\":28,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-5000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-50000}]},{\\"date\\":29,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":50000},{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-50000}]},{\\"date\\":30,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-50000},{\\"type\\":\\"미분류\\",\\"amount\\":-1000},{\\"type\\":\\"생활\\",\\"amount\\":-30000}]},{\\"date\\":31,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-50000},{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"월급\\",\\"amount\\":15000}]}]},{\\"month\\":7,\\"data\\":[{\\"date\\":1,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-10000},{\\"type\\":\\"미분류\\",\\"amount\\":-1000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-5000}]},{\\"date\\":2,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"생활\\",\\"amount\\":-5000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000}]},{\\"date\\":3,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-30000},{\\"type\\":\\"생활\\",\\"amount\\":-3000}]},{\\"date\\":4,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-3000},{\\"type\\":\\"월급\\",\\"amount\\":3000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000}]},{\\"date\\":5,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-10000},{\\"type\\":\\"생활\\",\\"amount\\":-1000},{\\"type\\":\\"용돈\\",\\"amount\\":3000}]},{\\"date\\":6,\\"data\\":[{\\"type\\":\\"의료/건강\\",\\"amount\\":-5000},{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"월급\\",\\"amount\\":20000}]},{\\"date\\":7,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"생활\\",\\"amount\\":-5000}]},{\\"date\\":8,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-5000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-50000},{\\"type\\":\\"월급\\",\\"amount\\":20000}]},{\\"date\\":9,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":50000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-3000},{\\"type\\":\\"월급\\",\\"amount\\":3000}]},{\\"date\\":10,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":20000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-3000}]},{\\"date\\":11,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-3000},{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"용돈\\",\\"amount\\":3000}]},{\\"date\\":12,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-10000},{\\"type\\":\\"용돈\\",\\"amount\\":3000}]},{\\"date\\":13,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-1000},{\\"type\\":\\"교통\\",\\"amount\\":-50000},{\\"type\\":\\"용돈\\",\\"amount\\":10000}]},{\\"date\\":14,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-3000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-30000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-5000}]},{\\"date\\":15,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"용돈\\",\\"amount\\":10000},{\\"type\\":\\"생활\\",\\"amount\\":-1000}]},{\\"date\\":16,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":20000},{\\"type\\":\\"월급\\",\\"amount\\":50000},{\\"type\\":\\"식비\\",\\"amount\\":-1000}]},{\\"date\\":17,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-5000},{\\"type\\":\\"월급\\",\\"amount\\":20000},{\\"type\\":\\"미분류\\",\\"amount\\":-1000}]},{\\"date\\":18,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"식비\\",\\"amount\\":-10000}]},{\\"date\\":19,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":15000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-5000},{\\"type\\":\\"식비\\",\\"amount\\":-30000}]},{\\"date\\":20,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":50000},{\\"type\\":\\"생활\\",\\"amount\\":-3000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-10000}]},{\\"date\\":21,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-5000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-30000},{\\"type\\":\\"교통\\",\\"amount\\":-3000}]},{\\"date\\":22,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":50000},{\\"type\\":\\"미분류\\",\\"amount\\":-1000},{\\"type\\":\\"미분류\\",\\"amount\\":-5000}]},{\\"date\\":23,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-30000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000},{\\"type\\":\\"용돈\\",\\"amount\\":50000}]},{\\"date\\":24,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-50000},{\\"type\\":\\"미분류\\",\\"amount\\":-10000},{\\"type\\":\\"생활\\",\\"amount\\":-50000}]},{\\"date\\":25,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-1000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-5000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-10000}]},{\\"date\\":26,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-5000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"월급\\",\\"amount\\":5000}]},{\\"date\\":27,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-3000},{\\"type\\":\\"월급\\",\\"amount\\":50000},{\\"type\\":\\"월급\\",\\"amount\\":3000}]},{\\"date\\":28,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-5000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-3000},{\\"type\\":\\"월급\\",\\"amount\\":5000}]},{\\"date\\":29,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"식비\\",\\"amount\\":-50000},{\\"type\\":\\"월급\\",\\"amount\\":50000}]},{\\"date\\":30,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":10000},{\\"type\\":\\"월급\\",\\"amount\\":15000},{\\"type\\":\\"월급\\",\\"amount\\":10000}]},{\\"date\\":31,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-5000},{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-30000}]}]},{\\"month\\":8,\\"data\\":[{\\"date\\":1,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":10000},{\\"type\\":\\"용돈\\",\\"amount\\":20000},{\\"type\\":\\"용돈\\",\\"amount\\":10000}]},{\\"date\\":2,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"월급\\",\\"amount\\":20000},{\\"type\\":\\"월급\\",\\"amount\\":10000}]},{\\"date\\":3,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-1000},{\\"type\\":\\"월급\\",\\"amount\\":3000},{\\"type\\":\\"용돈\\",\\"amount\\":15000}]},{\\"date\\":4,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-1000},{\\"type\\":\\"용돈\\",\\"amount\\":15000}]},{\\"date\\":5,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-50000},{\\"type\\":\\"식비\\",\\"amount\\":-10000},{\\"type\\":\\"식비\\",\\"amount\\":-3000}]},{\\"date\\":6,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-1000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-30000},{\\"type\\":\\"기타수입\\",\\"amount\\":10000}]},{\\"date\\":7,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":20000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"기타수입\\",\\"amount\\":5000}]},{\\"date\\":8,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":50000},{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000}]},{\\"date\\":9,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-1000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000},{\\"type\\":\\"월급\\",\\"amount\\":3000}]},{\\"date\\":10,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":20000},{\\"type\\":\\"월급\\",\\"amount\\":3000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000}]},{\\"date\\":11,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":3000},{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"교통\\",\\"amount\\":-30000}]},{\\"date\\":12,\\"data\\":[{\\"type\\":\\"식비\\",\\"amount\\":-50000},{\\"type\\":\\"용돈\\",\\"amount\\":10000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-5000}]},{\\"date\\":13,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":20000},{\\"type\\":\\"월급\\",\\"amount\\":3000},{\\"type\\":\\"식비\\",\\"amount\\":-3000}]},{\\"date\\":14,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":5000},{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"기타수입\\",\\"amount\\":5000}]},{\\"date\\":15,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-50000},{\\"type\\":\\"월급\\",\\"amount\\":5000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000}]},{\\"date\\":16,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-50000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-50000},{\\"type\\":\\"용돈\\",\\"amount\\":10000}]},{\\"date\\":17,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":50000},{\\"type\\":\\"식비\\",\\"amount\\":-3000},{\\"type\\":\\"미분류\\",\\"amount\\":-50000}]},{\\"date\\":18,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-5000},{\\"type\\":\\"기타수입\\",\\"amount\\":10000}]},{\\"date\\":19,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":20000},{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"생활\\",\\"amount\\":-50000}]},{\\"date\\":20,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":50000},{\\"type\\":\\"교통\\",\\"amount\\":-10000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-50000}]},{\\"date\\":21,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":3000},{\\"type\\":\\"미분류\\",\\"amount\\":-10000},{\\"type\\":\\"월급\\",\\"amount\\":20000}]},{\\"date\\":22,\\"data\\":[{\\"type\\":\\"의료/건강\\",\\"amount\\":-50000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-1000},{\\"type\\":\\"용돈\\",\\"amount\\":10000}]},{\\"date\\":23,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-10000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"교통\\",\\"amount\\":-1000}]},{\\"date\\":24,\\"data\\":[{\\"type\\":\\"식비\\",\\"amount\\":-1000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"용돈\\",\\"amount\\":3000}]},{\\"date\\":25,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"생활\\",\\"amount\\":-10000}]},{\\"date\\":26,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000}]},{\\"date\\":27,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-10000},{\\"type\\":\\"용돈\\",\\"amount\\":20000},{\\"type\\":\\"용돈\\",\\"amount\\":20000}]},{\\"date\\":28,\\"data\\":[{\\"type\\":\\"의료/건강\\",\\"amount\\":-30000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-10000},{\\"type\\":\\"생활\\",\\"amount\\":-50000}]},{\\"date\\":29,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-10000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-3000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-50000}]},{\\"date\\":30,\\"data\\":[{\\"type\\":\\"의료/건강\\",\\"amount\\":-50000},{\\"type\\":\\"미분류\\",\\"amount\\":-30000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-10000}]},{\\"date\\":31,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-5000},{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-3000}]}]},{\\"month\\":9,\\"data\\":[{\\"date\\":1,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"월급\\",\\"amount\\":15000}]},{\\"date\\":2,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"식비\\",\\"amount\\":-3000}]},{\\"date\\":3,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":50000},{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"식비\\",\\"amount\\":-30000}]},{\\"date\\":4,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":20000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"식비\\",\\"amount\\":-1000}]},{\\"date\\":5,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":20000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-1000}]},{\\"date\\":6,\\"data\\":[{\\"type\\":\\"의료/건강\\",\\"amount\\":-50000},{\\"type\\":\\"생활\\",\\"amount\\":-50000},{\\"type\\":\\"식비\\",\\"amount\\":-10000}]},{\\"date\\":7,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-5000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000}]},{\\"date\\":8,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"식비\\",\\"amount\\":-30000},{\\"type\\":\\"식비\\",\\"amount\\":-10000}]},{\\"date\\":9,\\"data\\":[{\\"type\\":\\"의료/건강\\",\\"amount\\":-1000},{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-5000}]},{\\"date\\":10,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-50000},{\\"type\\":\\"용돈\\",\\"amount\\":3000},{\\"type\\":\\"용돈\\",\\"amount\\":3000}]},{\\"date\\":11,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":3000},{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"용돈\\",\\"amount\\":20000}]},{\\"date\\":12,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":20000},{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-5000}]},{\\"date\\":13,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-1000},{\\"type\\":\\"미분류\\",\\"amount\\":-30000},{\\"type\\":\\"월급\\",\\"amount\\":5000}]},{\\"date\\":14,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-5000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-10000},{\\"type\\":\\"기타수입\\",\\"amount\\":5000}]},{\\"date\\":15,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"생활\\",\\"amount\\":-1000}]},{\\"date\\":16,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":3000},{\\"type\\":\\"식비\\",\\"amount\\":-10000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000}]},{\\"date\\":17,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-30000},{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"월급\\",\\"amount\\":5000}]},{\\"date\\":18,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"미분류\\",\\"amount\\":-30000}]},{\\"date\\":19,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-3000},{\\"type\\":\\"월급\\",\\"amount\\":20000},{\\"type\\":\\"식비\\",\\"amount\\":-30000}]},{\\"date\\":20,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":3000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-10000},{\\"type\\":\\"용돈\\",\\"amount\\":50000}]},{\\"date\\":21,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-5000},{\\"type\\":\\"월급\\",\\"amount\\":20000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000}]},{\\"date\\":22,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-3000},{\\"type\\":\\"미분류\\",\\"amount\\":-10000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-5000}]},{\\"date\\":23,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"생활\\",\\"amount\\":-1000}]},{\\"date\\":24,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-5000},{\\"type\\":\\"월급\\",\\"amount\\":50000},{\\"type\\":\\"미분류\\",\\"amount\\":-10000}]},{\\"date\\":25,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":50000},{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-30000}]},{\\"date\\":26,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"용돈\\",\\"amount\\":10000}]},{\\"date\\":27,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-1000},{\\"type\\":\\"교통\\",\\"amount\\":-50000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-50000}]},{\\"date\\":28,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-1000},{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"용돈\\",\\"amount\\":3000}]},{\\"date\\":29,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"미분류\\",\\"amount\\":-10000}]},{\\"date\\":30,\\"data\\":[{\\"type\\":\\"의료/건강\\",\\"amount\\":-5000},{\\"type\\":\\"미분류\\",\\"amount\\":-50000},{\\"type\\":\\"월급\\",\\"amount\\":5000}]},{\\"date\\":31,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":10000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"미분류\\",\\"amount\\":-3000}]}]},{\\"month\\":10,\\"data\\":[{\\"date\\":1,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"생활\\",\\"amount\\":-30000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-10000}]},{\\"date\\":2,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-3000},{\\"type\\":\\"식비\\",\\"amount\\":-50000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-30000}]},{\\"date\\":3,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"식비\\",\\"amount\\":-3000}]},{\\"date\\":4,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":50000},{\\"type\\":\\"월급\\",\\"amount\\":15000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-30000}]},{\\"date\\":5,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-1000},{\\"type\\":\\"미분류\\",\\"amount\\":-1000}]},{\\"date\\":6,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-30000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-50000},{\\"type\\":\\"식비\\",\\"amount\\":-1000}]},{\\"date\\":7,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"월급\\",\\"amount\\":3000},{\\"type\\":\\"기타수입\\",\\"amount\\":10000}]},{\\"date\\":8,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-30000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000}]},{\\"date\\":9,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"생활\\",\\"amount\\":-50000},{\\"type\\":\\"교통\\",\\"amount\\":-1000}]},{\\"date\\":10,\\"data\\":[{\\"type\\":\\"식비\\",\\"amount\\":-10000},{\\"type\\":\\"월급\\",\\"amount\\":5000},{\\"type\\":\\"용돈\\",\\"amount\\":5000}]},{\\"date\\":11,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-50000},{\\"type\\":\\"용돈\\",\\"amount\\":10000}]},{\\"date\\":12,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-30000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-1000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-1000}]},{\\"date\\":13,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":3000},{\\"type\\":\\"월급\\",\\"amount\\":50000},{\\"type\\":\\"용돈\\",\\"amount\\":5000}]},{\\"date\\":14,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":15000},{\\"type\\":\\"용돈\\",\\"amount\\":3000},{\\"type\\":\\"월급\\",\\"amount\\":20000}]},{\\"date\\":15,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-50000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-1000}]},{\\"date\\":16,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":50000},{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"미분류\\",\\"amount\\":-30000}]},{\\"date\\":17,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-5000},{\\"type\\":\\"월급\\",\\"amount\\":5000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000}]},{\\"date\\":18,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-30000},{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-3000}]},{\\"date\\":19,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"교통\\",\\"amount\\":-50000},{\\"type\\":\\"생활\\",\\"amount\\":-30000}]},{\\"date\\":20,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"월급\\",\\"amount\\":5000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000}]},{\\"date\\":21,\\"data\\":[{\\"type\\":\\"식비\\",\\"amount\\":-1000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-30000},{\\"type\\":\\"생활\\",\\"amount\\":-3000}]},{\\"date\\":22,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"월급\\",\\"amount\\":50000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-5000}]},{\\"date\\":23,\\"data\\":[{\\"type\\":\\"식비\\",\\"amount\\":-50000},{\\"type\\":\\"식비\\",\\"amount\\":-50000},{\\"type\\":\\"식비\\",\\"amount\\":-50000}]},{\\"date\\":24,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"생활\\",\\"amount\\":-10000},{\\"type\\":\\"월급\\",\\"amount\\":15000}]},{\\"date\\":25,\\"data\\":[{\\"type\\":\\"식비\\",\\"amount\\":-30000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-50000},{\\"type\\":\\"용돈\\",\\"amount\\":10000}]},{\\"date\\":26,\\"data\\":[{\\"type\\":\\"식비\\",\\"amount\\":-10000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-10000},{\\"type\\":\\"용돈\\",\\"amount\\":20000}]},{\\"date\\":27,\\"data\\":[{\\"type\\":\\"식비\\",\\"amount\\":-50000},{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"용돈\\",\\"amount\\":10000}]},{\\"date\\":28,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-1000},{\\"type\\":\\"월급\\",\\"amount\\":5000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-30000}]},{\\"date\\":29,\\"data\\":[{\\"type\\":\\"의료/건강\\",\\"amount\\":-30000},{\\"type\\":\\"미분류\\",\\"amount\\":-5000},{\\"type\\":\\"생활\\",\\"amount\\":-3000}]},{\\"date\\":30,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":3000},{\\"type\\":\\"용돈\\",\\"amount\\":20000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000}]},{\\"date\\":31,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-5000}]}]},{\\"month\\":11,\\"data\\":[{\\"date\\":1,\\"data\\":[{\\"type\\":\\"의료/건강\\",\\"amount\\":-30000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-5000}]},{\\"date\\":2,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":50000},{\\"type\\":\\"식비\\",\\"amount\\":-5000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000}]},{\\"date\\":3,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-1000},{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-30000}]},{\\"date\\":4,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-5000},{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000}]},{\\"date\\":5,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"용돈\\",\\"amount\\":50000}]},{\\"date\\":6,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":20000},{\\"type\\":\\"용돈\\",\\"amount\\":3000},{\\"type\\":\\"용돈\\",\\"amount\\":20000}]},{\\"date\\":7,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"월급\\",\\"amount\\":3000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-5000}]},{\\"date\\":8,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-5000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-3000},{\\"type\\":\\"용돈\\",\\"amount\\":50000}]},{\\"date\\":9,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-30000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-50000},{\\"type\\":\\"용돈\\",\\"amount\\":5000}]},{\\"date\\":10,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":3000},{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"월급\\",\\"amount\\":10000}]},{\\"date\\":11,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-10000},{\\"type\\":\\"월급\\",\\"amount\\":15000},{\\"type\\":\\"월급\\",\\"amount\\":10000}]},{\\"date\\":12,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-30000},{\\"type\\":\\"용돈\\",\\"amount\\":10000},{\\"type\\":\\"용돈\\",\\"amount\\":5000}]},{\\"date\\":13,\\"data\\":[{\\"type\\":\\"식비\\",\\"amount\\":-50000},{\\"type\\":\\"교통\\",\\"amount\\":-50000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000}]},{\\"date\\":14,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":15000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-30000},{\\"type\\":\\"생활\\",\\"amount\\":-30000}]},{\\"date\\":15,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-3000},{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-30000}]},{\\"date\\":16,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-50000},{\\"type\\":\\"생활\\",\\"amount\\":-1000},{\\"type\\":\\"기타수입\\",\\"amount\\":5000}]},{\\"date\\":17,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":50000},{\\"type\\":\\"미분류\\",\\"amount\\":-1000},{\\"type\\":\\"미분류\\",\\"amount\\":-5000}]},{\\"date\\":18,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"용돈\\",\\"amount\\":15000}]},{\\"date\\":19,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-30000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-5000},{\\"type\\":\\"미분류\\",\\"amount\\":-10000}]},{\\"date\\":20,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-50000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-10000},{\\"type\\":\\"용돈\\",\\"amount\\":5000}]},{\\"date\\":21,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-10000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-1000},{\\"type\\":\\"용돈\\",\\"amount\\":20000}]},{\\"date\\":22,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":3000},{\\"type\\":\\"생활\\",\\"amount\\":-10000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-10000}]},{\\"date\\":23,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000}]},{\\"date\\":24,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-30000},{\\"type\\":\\"기타수입\\",\\"amount\\":5000},{\\"type\\":\\"미분류\\",\\"amount\\":-50000}]},{\\"date\\":25,\\"data\\":[{\\"type\\":\\"의료/건강\\",\\"amount\\":-30000},{\\"type\\":\\"교통\\",\\"amount\\":-10000},{\\"type\\":\\"월급\\",\\"amount\\":20000}]},{\\"date\\":26,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"생활\\",\\"amount\\":-1000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-1000}]},{\\"date\\":27,\\"data\\":[{\\"type\\":\\"의료/건강\\",\\"amount\\":-3000},{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"교통\\",\\"amount\\":-50000}]},{\\"date\\":28,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-10000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-50000}]},{\\"date\\":29,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-3000},{\\"type\\":\\"식비\\",\\"amount\\":-10000},{\\"type\\":\\"식비\\",\\"amount\\":-50000}]},{\\"date\\":30,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":20000},{\\"type\\":\\"생활\\",\\"amount\\":-30000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-3000}]},{\\"date\\":31,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":3000},{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"생활\\",\\"amount\\":-10000}]}]},{\\"month\\":12,\\"data\\":[{\\"date\\":1,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":20000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-1000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000}]},{\\"date\\":2,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":10000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-30000},{\\"type\\":\\"월급\\",\\"amount\\":15000}]},{\\"date\\":3,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-30000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000}]},{\\"date\\":4,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":20000},{\\"type\\":\\"교통\\",\\"amount\\":-5000},{\\"type\\":\\"교통\\",\\"amount\\":-30000}]},{\\"date\\":5,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-10000},{\\"type\\":\\"미분류\\",\\"amount\\":-1000},{\\"type\\":\\"기타수입\\",\\"amount\\":5000}]},{\\"date\\":6,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-10000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-1000},{\\"type\\":\\"기타수입\\",\\"amount\\":10000}]},{\\"date\\":7,\\"data\\":[{\\"type\\":\\"의료/건강\\",\\"amount\\":-50000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-5000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-10000}]},{\\"date\\":8,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-5000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000},{\\"type\\":\\"용돈\\",\\"amount\\":15000}]},{\\"date\\":9,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":3000},{\\"type\\":\\"월급\\",\\"amount\\":20000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000}]},{\\"date\\":10,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-50000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-3000},{\\"type\\":\\"월급\\",\\"amount\\":15000}]},{\\"date\\":11,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-50000},{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"미분류\\",\\"amount\\":-3000}]},{\\"date\\":12,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":5000},{\\"type\\":\\"용돈\\",\\"amount\\":5000},{\\"type\\":\\"월급\\",\\"amount\\":50000}]},{\\"date\\":13,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-10000},{\\"type\\":\\"월급\\",\\"amount\\":15000},{\\"type\\":\\"용돈\\",\\"amount\\":10000}]},{\\"date\\":14,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-50000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"식비\\",\\"amount\\":-30000}]},{\\"date\\":15,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-3000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-3000},{\\"type\\":\\"생활\\",\\"amount\\":-1000}]},{\\"date\\":16,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":10000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-5000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-50000}]},{\\"date\\":17,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":50000},{\\"type\\":\\"용돈\\",\\"amount\\":3000},{\\"type\\":\\"교통\\",\\"amount\\":-5000}]},{\\"date\\":18,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-50000},{\\"type\\":\\"기타수입\\",\\"amount\\":10000},{\\"type\\":\\"월급\\",\\"amount\\":3000}]},{\\"date\\":19,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-50000},{\\"type\\":\\"기타수입\\",\\"amount\\":3000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-10000}]},{\\"date\\":20,\\"data\\":[{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-1000},{\\"type\\":\\"교통\\",\\"amount\\":-5000},{\\"type\\":\\"문화/여가\\",\\"amount\\":-5000}]},{\\"date\\":21,\\"data\\":[{\\"type\\":\\"문화/여가\\",\\"amount\\":-1000},{\\"type\\":\\"기타수입\\",\\"amount\\":50000},{\\"type\\":\\"생활\\",\\"amount\\":-10000}]},{\\"date\\":22,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":10000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-3000},{\\"type\\":\\"식비\\",\\"amount\\":-10000}]},{\\"date\\":23,\\"data\\":[{\\"type\\":\\"생활\\",\\"amount\\":-50000},{\\"type\\":\\"월급\\",\\"amount\\":5000},{\\"type\\":\\"용돈\\",\\"amount\\":10000}]},{\\"date\\":24,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-1000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-3000},{\\"type\\":\\"기타수입\\",\\"amount\\":20000}]},{\\"date\\":25,\\"data\\":[{\\"type\\":\\"기타수입\\",\\"amount\\":20000},{\\"type\\":\\"미분류\\",\\"amount\\":-50000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000}]},{\\"date\\":26,\\"data\\":[{\\"type\\":\\"미분류\\",\\"amount\\":-5000},{\\"type\\":\\"미분류\\",\\"amount\\":-50000},{\\"type\\":\\"용돈\\",\\"amount\\":5000}]},{\\"date\\":27,\\"data\\":[{\\"type\\":\\"의료/건강\\",\\"amount\\":-10000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-30000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000}]},{\\"date\\":28,\\"data\\":[{\\"type\\":\\"용돈\\",\\"amount\\":50000},{\\"type\\":\\"의료/건강\\",\\"amount\\":-5000},{\\"type\\":\\"기타수입\\",\\"amount\\":15000}]},{\\"date\\":29,\\"data\\":[{\\"type\\":\\"교통\\",\\"amount\\":-30000},{\\"type\\":\\"식비\\",\\"amount\\":-3000},{\\"type\\":\\"미분류\\",\\"amount\\":-5000}]},{\\"date\\":30,\\"data\\":[{\\"type\\":\\"의료/건강\\",\\"amount\\":-1000},{\\"type\\":\\"용돈\\",\\"amount\\":15000},{\\"type\\":\\"용돈\\",\\"amount\\":5000}]},{\\"date\\":31,\\"data\\":[{\\"type\\":\\"월급\\",\\"amount\\":5000},{\\"type\\":\\"쇼핑/뷰티\\",\\"amount\\":-50000},{\\"type\\":\\"용돈\\",\\"amount\\":20000}]}]}]");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOC5qcyIsInNvdXJjZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8\n')}])})); \ No newline at end of file +!function(t,a){if("object"==typeof exports&&"object"==typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var e=a();for(var n in e)("object"==typeof exports?exports:t)[n]=e[n]}}(window,(function(){return function(t){var a={};function e(n){if(a[n])return a[n].exports;var o=a[n]={i:n,l:!1,exports:{}};return t[n].call(o.exports,o,o.exports,e),o.l=!0,o.exports}return e.m=t,e.c=a,e.d=function(t,a,n){e.o(t,a)||Object.defineProperty(t,a,{enumerable:!0,get:n})},e.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,a){if(1&a&&(t=e(t)),8&a)return t;if(4&a&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(e.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&a&&"string"!=typeof t)for(var o in t)e.d(n,o,function(a){return t[a]}.bind(null,o));return n},e.n=function(t){var a=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(a,"a",a),a},e.o=function(t,a){return Object.prototype.hasOwnProperty.call(t,a)},e.p="",e(e.s=2)}([function(t,a,e){var n;void 0===(n=function(t,a){"use strict";Object.defineProperty(a,"__esModule",{value:!0}),a.TypeColor=a.MonthColor=a.SeasonColor=a.SVG_HEIGHT=a.SVG_WIDTH=a.MINIMAP_RESOLUTION_WIDTH=a.CHART_RESOLUTION_HEIGHT=a.CHART_RESOLUTION_WIDTH=a.MINIMAP_HEIGHT=a.CONTAINER_RATIO=void 0,a.CONTAINER_RATIO=3/4,a.MINIMAP_HEIGHT=200,a.CHART_RESOLUTION_WIDTH=1920,a.CHART_RESOLUTION_HEIGHT=1080,a.MINIMAP_RESOLUTION_WIDTH=1920,a.SVG_WIDTH=500,a.SVG_HEIGHT=500,function(t){t.SPRING="#ffc7c7",t.SUMMER="#bdd687",t.FALL="#e9b296",t.WINTER="#c7fdff"}(a.SeasonColor||(a.SeasonColor={})),a.MonthColor={3:"#fa9494",4:"#f15e5e",5:"#c25050",6:"#a0d430",7:"#81b214",8:"#567c02",9:"#e6895b",10:"#df6f38",11:"#ac4b1c",12:"#82ecf0",1:"#30bbc0",2:"#0d7377"},function(t){t.INCOME="#2a3d66",t.OUTLAY="#d789d7"}(a.TypeColor||(a.TypeColor={}))}.apply(a,[e,a]))||(t.exports=n)},function(t,a,e){var n;void 0===(n=function(t,a){"use strict";Object.defineProperty(a,"__esModule",{value:!0}),a.$style=void 0;a.$style=function(t,a){for(var e in a)t.style[e]=a[e]}}.apply(a,[e,a]))||(t.exports=n)},function(t,a,e){var n,o;n=[e,a,e(3),e(6)],void 0===(o=function(t,a,n,o){"use strict";Object.defineProperty(a,"__esModule",{value:!0}),a.Pie=a.Line=void 0,a.Line=n.default,a.Pie=o.default;e(8)}.apply(a,n))||(t.exports=o)},function(t,a,e){var n,o;n=[e,a,e(4),e(1),e(0),e(5)],void 0===(o=function(t,a,e,n,o,p){"use strict";Object.defineProperty(a,"__esModule",{value:!0});e.tempFunction("bug");var u=function(){function t(t){this.initProps(t),this.insertHTML(),this.initElement(),this.initStyle(),this.initChart(),this.initMinimap(),this.drawChart(this.moveX),this.drawMinimap(this.moveX),this.addEventListener()}return t.prototype.initProps=function(t){this.containerName=t.selector,this.elements={container:void 0,chartContainer:void 0,chart:void 0,chartTitle:void 0,chartVerticalTooltip:void 0,chartHorizontalTooltip:void 0,chartHorizontalValue:void 0,chartInformation:void 0,minimapContainer:void 0,minimap:void 0,minimapTitle:void 0,minimapTooltip:void 0},this.chartTitle=t.chartTitle;var a,e;this.dataContents=(a=t.data,e=[],a.forEach((function(t){t.data.forEach((function(t){var a=t.data;e.push(a)}))})),e),this.data=function(t){var a={};return t.forEach((function(t){t.data.forEach((function(e){var n=0;e.data.forEach((function(t){n+=t.amount})),a[t.month+"/"+e.date]=n}))})),a}(t.data),this.minMax=[Math.min.apply(Math,Object.values(this.data)),Math.max.apply(Math,Object.values(this.data))],this.abs=Math.max.apply(Math,this.minMax.map((function(t){return Math.abs(t)})))},t.prototype.insertHTML=function(){this.elements.container=document.getElementById(this.containerName),this.elements.container.innerHTML="\n
"+this.chartTitle+'
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n "},t.prototype.initElement=function(){this.elements.chartContainer=document.querySelector("#"+this.containerName+"-chart-container"),this.elements.chart=document.querySelector("#"+this.containerName+"-chart"),this.elements.chartTitle=document.querySelector("#"+this.containerName+"-chart-title"),this.elements.chartHorizontalTooltip=document.querySelector("#"+this.containerName+"-chart-horizontal-tooltip"),this.elements.chartVerticalTooltip=document.querySelector("#"+this.containerName+"-chart-vertical-tooltip"),this.elements.chartHorizontalValue=document.querySelector("#"+this.containerName+"-chart-horizontal-value"),this.elements.chartInformation=document.querySelector("#"+this.containerName+"-chart-information"),this.elements.minimapContainer=document.querySelector("#"+this.containerName+"-minimap-container"),this.elements.minimap=document.querySelector("#"+this.containerName+"-minimap"),this.elements.minimapTooltip=document.querySelector("#"+this.containerName+"-minimap-tooltip")},t.prototype.initStyle=function(){var t=this.elements.container,a=this.elements.chartContainer,e=this.elements.chart,p=this.elements.chartTitle,u=this.elements.chartVerticalTooltip,m=this.elements.chartHorizontalTooltip,y=this.elements.chartHorizontalValue,i=this.elements.chartInformation,d=this.elements.minimapContainer,r=this.elements.minimap,s=this.elements.minimapTooltip;n.$style(t,{display:"flex",flexDirection:"column",justifyContent:"space-between"}),n.$style(a,{position:"relative",width:"inherit",height:t.clientWidth*(o.CHART_RESOLUTION_HEIGHT/o.CHART_RESOLUTION_WIDTH)+"px",userSelect:"none"}),n.$style(e,{width:"100%",height:"100%",userSelect:"none",zIndex:100}),n.$style(p,{width:"inherit",height:"100%",fontSize:"32px",display:"flex",justifyContent:"center",alignItems:"center",fontWeight:"bold",color:"black",textShadow:"2px 2px 4px grey",userSelect:"none",padding:"6px 0px 6px 0px"}),n.$style(u,{display:"none",width:"1px",height:"inherit",position:"absolute",top:"0",left:"0",borderLeft:"1px dashed #333",userSelect:"none",pointerEvents:"none"}),n.$style(m,{display:"none",height:"1px",width:"inherit",position:"absolute",top:"0",left:"0",borderTop:"1px dashed #333",userSelect:"none",pointerEvents:"none"}),n.$style(y,{display:"none",position:"absolute",top:"0",left:"0",backgroundColor:"#000",color:"#fff",userSelect:"none",pointerEvents:"none"}),n.$style(i,{zIndex:"10",display:"none",flexDirection:"column",width:"fit-content",height:"auto",position:"absolute",top:"0",left:"0",backgroundColor:"white",userSelect:"none",padding:"8px 8px 8px 8px",border:"4px solid dodgerblue",borderRadius:"4px",opacity:"0.75"}),n.$style(d,{position:"relative",width:"inherit",height:t.clientWidth*(o.MINIMAP_HEIGHT/o.CHART_RESOLUTION_WIDTH)+"px"}),n.$style(r,{width:"100%",height:"100%"}),n.$style(s,{display:"none",fontSize:"30px",position:"absolute",top:"0",left:"0",pointerEvents:"none"})},t.prototype.initChart=function(){var t=this.elements.chart;t.width=o.CHART_RESOLUTION_WIDTH,t.height=o.CHART_RESOLUTION_HEIGHT,this.moveX=0,this.tempMoveX=0;var a=this.elements.chart.getBoundingClientRect(),e=a.width,n=a.height;this.trueChartCanvasSize={width:e,height:n}},t.prototype.drawChart=function(t){var a=this.elements.chart,e=a.getContext("2d");e.fillStyle="#fff",e.fillRect(0,0,a.width,a.height);var n=30,o=120,u=200,m=52,y=a.height,i=a.width,d=i-n-30-u,r=y-120-o-m,s=r/6,l=d/(Object.keys(this.data).length-1)*(1/this.chartRatio||10),c=l*(Object.keys(this.data).length-1),h=this.chartRatio||d/c;this.chartRatio=h,this.chartSize={width:d,height:r};var f,v,g=p.trueLengthToCanvasLength(t,i,this.trueChartCanvasSize.width);e.beginPath(),this.tempChartRatio?g*(this.tempChartRatio/this.chartRatio):0,f=this.tempChartRatio?230-g*(this.tempChartRatio/this.chartRatio):230-g,v=y-o;var x=Math.round(Object.keys(this.data).length/52),T=0;for(var S in this.data)this.chartRatio>.75?T%(4*x)==0&&(e.fillStyle="#333","1"===S.split("/")[1]?e.font="bold 40px arial":e.font="40px arial",e.fillRect(f,v-m-14,2,20),e.fillText(S,f,v)):this.chartRatio>.2?T%(2*x)==0&&(e.fillStyle="#333","1"===S.split("/")[1]?e.font="bold 40px arial":e.font="40px arial",e.fillRect(f,v-m-14,2,20),e.fillText(S,f,v)):this.chartRatio>.05?T%x==0&&(e.fillStyle="#333","1"===S.split("/")[1]?e.font="bold 40px arial":e.font="40px arial",e.fillRect(f,v-m-14,2,20),e.fillText(S,f,v)):(e.fillStyle="#333","1"===S.split("/")[1]?e.font="bold 40px arial":e.font="40px arial",e.fillRect(f,v-m-14,2,20),e.fillText(S,f,v)),f+=l,T++;var C=[];for(var S in f=this.tempChartRatio?230-g*(this.tempChartRatio/this.chartRatio):230-g,this.data){this.chartRatio>.7?e.lineWidth=5:this.chartRatio>.2?e.lineWidth=7:e.lineWidth=10;var b=y-o-m-(N=r/2+r/2*(this.data[S]/this.abs))-15;e.lineTo(f,b),e.strokeStyle="dodgerblue",e.stroke(),e.beginPath(),e.moveTo(f,b),C.push([p.canvasLengthToTrueLength(f,i,this.trueChartCanvasSize.width),p.canvasLengthToTrueLength(b,y,this.trueChartCanvasSize.height)]),f+=l}for(var S in this.dataPositions=C,f=this.tempChartRatio?230-g*(this.tempChartRatio/this.chartRatio):230-g,this.data){if(this.chartRatio>.7)break;var N;b=y-o-m-(N=r/2+r/2*(this.data[S]/this.abs))-15;e.fillStyle="dodgerblue",e.arc(f,b,12,0,2*Math.PI,!0),e.fill(),e.beginPath(),e.fillStyle="#fff",e.arc(f,y-o-m-N-15,9,0,2*Math.PI,!0),e.fill(),e.beginPath(),f+=l}e.beginPath(),e.fillStyle="#fff",e.fillRect(230+d,120,d,r),e.fillStyle="#ffffff",e.fillRect(0,0,230,y),v=y-o-m;for(var M=-this.abs,E=0;E<7;E++)e.beginPath(),e.fillStyle="black",e.font="40px arial",e.lineWidth=2,e.textAlign="end",e.fillText(String(Math.round(M)),u,v),e.moveTo(230,v-15),e.lineTo(i-30,v-15),e.strokeStyle="#444",3===E&&(e.lineWidth=4),e.stroke(),M+=this.abs/3,v-=s;e.textAlign="start"},t.prototype.initMinimap=function(){var t=this.elements.minimap;t.width=o.MINIMAP_RESOLUTION_WIDTH;var a=this.elements.minimap.getBoundingClientRect(),e=a.width,n=a.height;t.height=o.CHART_RESOLUTION_WIDTH*n/e,this.trueMinimapCanvasSize={width:e,height:n}},t.prototype.drawMinimap=function(t){var a=this.elements.minimap,e=a.getContext("2d");e.fillStyle="#fff",e.fillRect(0,0,a.width,a.height);var n=30,o=a.height,u=a.width,m=u-n-30,y=o-30-60,i=m/(Object.keys(this.data).length-1);this.minimapSize={width:m,height:y};var d,r,s=this.tempChartRatio||this.chartRatio,l=p.chartLengthToMinimapLength(p.trueLengthToCanvasLength(t,u,this.trueChartCanvasSize.width),this.chartSize.width,m,s);for(var c in e.beginPath(),e.fillStyle="rgb(225, 232, 252)",e.fillRect(n,30,m,y),e.lineWidth=2,e.strokeStyle="#000",e.strokeRect(n,30,m,y),e.fillStyle="#fff",e.fillRect(n+l,30,m*this.chartRatio,y),e.strokeStyle="#000",e.lineWidth=5,e.strokeRect(n+l,30,m*this.chartRatio,y),this.minimapPositions=[p.canvasLengthToTrueLength(n+l,u,this.trueMinimapCanvasSize.width),p.canvasLengthToTrueLength(n+l+m*this.chartRatio,u,this.trueMinimapCanvasSize.width)],d=n,e.beginPath(),this.data){var h=y/2+y/2*(this.data[c]/this.abs);e.lineTo(d,o-60-h),e.lineWidth=3,e.strokeStyle="dodgerblue",e.stroke(),e.fillStyle="dodgerblue",e.fill(),e.beginPath(),e.moveTo(d,o-60-h),d+=i}for(var c in d=10,r=o-60+40,this.data)Number(c.split("/")[1])%31==1&&(e.fillStyle="black",e.font="40px arial",e.fillText(c,d,r)),d+=i},t.prototype.addEventListener=function(){var t,a,e,n,o,u=this,m=null;(t=u.elements.chartContainer).addEventListener("mousemove",(function(t){if(t.target===u.elements.chart){if(m){u.tempMoveX=m-t.offsetX;var a=u.elements.chartVerticalTooltip,e=u.elements.chartHorizontalTooltip;a.style.left=t.offsetX+"px",e.style.top=t.offsetY+"px",u.drawChart(u.moveX+u.tempMoveX),u.drawMinimap(u.moveX+u.tempMoveX)}else{var n=u.elements.chartVerticalTooltip;e=u.elements.chartHorizontalTooltip,n.style.display="block",e.style.display="block",e.style.top=t.offsetY+"px",u.drawChart(u.moveX),u.drawMinimap(u.moveX)}var o=u.elements.chartInformation,y=u.elements.chartHorizontalValue;if(o.style.left=t.offsetX+20+"px",o.style.top=t.offsetY+20+"px",y.style.display="block",y.style.left="0px",y.style.top=t.offsetY+"px",y.innerHTML="",t.offsetY>p.canvasLengthToTrueLength(893-u.chartSize.height/6*6,1080,u.trueChartCanvasSize.height)&&t.offsetYa[0]-6&&t.offsetX
'+a.type+"
"+a.amount+"
"}),'
'+Object.keys(u.data)[e]+"
")+'
총 금액 : '+u.dataContents[e].reduce((function(t,a){return t+a.amount}),0)+"
";o.style.display="block",r.style.left=a[0]+"px",o.innerHTML=n}}))}})),t.addEventListener("mousedown",(function(t){m=t.offsetX})),t.addEventListener("mouseup",(function(t){u.dataPositions.forEach((function(t){t[0]-=u.tempMoveX})),u.moveX+=u.tempMoveX,m=null,u.tempMoveX=0})),t.addEventListener("mouseleave",(function(){u.dataPositions.forEach((function(t){t[0]-=u.tempMoveX}));var t=u.elements.chartVerticalTooltip,a=u.elements.chartHorizontalTooltip,e=u.elements.chartInformation,n=u.elements.chartHorizontalValue;t.style.display="none",a.style.display="none",e.style.display="none",n.style.display="none",u.moveX+=u.tempMoveX,u.drawChart(u.moveX),u.drawMinimap(u.moveX),m=null,u.tempMoveX=0})),a=u.elements.minimapContainer,e=!1,n=!1,o=!1,a.addEventListener("mousemove",(function(t){if(m)if(e){var y=(m-t.offsetX)/p.canvasLengthToTrueLength(u.minimapSize.width,1920,u.trueMinimapCanvasSize.width);u.chartRatio=u.tempChartRatio-y,u.drawChart(u.moveX),u.drawMinimap(u.moveX)}else(n||o)&&(u.tempMoveX=p.canvasLengthToTrueLength(p.minimapLengthToChartLength(p.trueLengthToCanvasLength(m-t.offsetX,1920,u.trueMinimapCanvasSize.width),u.chartSize.width,u.minimapSize.width,u.chartRatio),1920,u.trueChartCanvasSize.width),u.drawChart(u.moveX-u.tempMoveX),u.drawMinimap(u.moveX-u.tempMoveX));a.style.cursor="default",t.offsetX>u.minimapPositions[0]-3&&t.offsetXu.minimapPositions[1]-3&&t.offsetXu.minimapPositions[0]+3&&t.offsetXu.minimapPositions[0]-3&&t.offsetXu.minimapPositions[1]-3&&t.offsetXu.minimapPositions[0]+3&&t.offsetX=0?m[""+t.type]?m[""+t.type]+=t.amount:m[""+t.type]=t.amount:t.amount<0&&(y[""+t.type]?y[""+t.type]+=t.amount:y[""+t.type]=t.amount)})),a[t.month+"/"+e.date]=n}))})),a}(t.data)},t.prototype.changeData=function(t){m={},y={};this.dataContents=function(t,a){var e=[];return t.filter((function(t){return t.month===a})).forEach((function(t){t.data.forEach((function(t){var a=t.data;e.push(a)}))})),e}(this.originalData,t),this.data=function(t,a){var e={};return t.filter((function(t){return t.month===a})).forEach((function(t){t.data.forEach((function(a){var n=0;a.data.forEach((function(t){n+=t.amount,t.amount>=0?m[""+t.type]?m[""+t.type]+=t.amount:m[""+t.type]=t.amount:t.amount<0&&(y[""+t.type]?y[""+t.type]+=t.amount:y[""+t.type]=t.amount)})),e[t.month+"/"+a.date]=n}))})),e}(this.originalData,t)},t.prototype.insertHTML=function(){var t=this;document.querySelector("#"+this.containerName).innerHTML='\n
"+this.chartTitle+'
\n \n \n "+["SPRING","SUMMER","FALL","WINTER"].map((function(a){return""})).join("")+"\n "+this.originalData.map((function(a,e){return"\n "+a.month+"월"})).join("")+"\n "+["income","outlay"].map((function(a){return"\n "+("income"===a?"수입":"지출")+""})).join("")+"\n "+Object.keys(m).map((function(a){return"\n "+a+""})).join("")+"\n "+Object.keys(y).map((function(a){return"\n "+a+""})).join("")+"\n \n "},t.prototype.initStyle=function(){var t=document.querySelector("#"+this.containerName),a=document.querySelector("#"+this.containerName+"-text");n.$style(t,{position:"relative"}),n.$style(a,{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",flexWrap:"wrap",position:"absolute",top:"50%",left:"50%",transform:"translate(-50%,-50%)"})},t.prototype.drawChart=function(){var t,a=this,n=document.querySelector("#"+this.containerName),p=n.querySelector("svg"),u=Number(n.style.width.split("px")[0])/e.SVG_WIDTH;p.style.zoom=String(u);var d=p.querySelectorAll("."+this.containerName+"-season");t=-90,[].slice.call(d).forEach((function(a){a.setAttribute("d",o.toPieChartItemPath(250,250,70,79,t,t+360/d.length-.5)),t+=360/d.length}));var r=p.querySelectorAll("."+this.containerName+"-month");t=360/r.length*7,[].slice.call(r).forEach((function(a){a.setAttribute("d",o.toPieChartItemPath(250,250,80,110,t,t+360/r.length-.5)),t+=360/r.length}));var s=p.querySelectorAll("."+this.containerName+"-month-text");t=360/r.length*7,[].slice.call(s).forEach((function(a,e){a.style.cssText="user-select:none; font-size:12px; transform-origin:250px 340px; transform:translate(0px,-90px) rotate("+(t+105)+"deg);",t+=360/r.length}));var l=p.querySelectorAll("."+this.containerName+"-type");t=90,[].slice.call(l).forEach((function(a,e){a.setAttribute("d",o.toPieChartItemPath(250,250,141,171,t,t+180-.5)),t+=180}));var c=p.querySelectorAll("."+this.containerName+"-type-text");t=-90,[].slice.call(c).forEach((function(a,e){a.style.cssText="user-select:none; font-size:12px; transform-origin:250px 400px; transform:translate(0px,-150px) rotate("+t+"deg);",t+=180}));var h=p.querySelectorAll("."+this.containerName+"-income"),f=Object.values(m).reduce((function(t,a){return t+a}),0);t=90,[].slice.call(h).forEach((function(e){var n=e.id.split("-")[e.id.split("-").length-1],p=m[n]?m[n]:0,u=t,y=m[n]?u+m[n]/f*180-.5:t;e.setAttribute("d",o.toPieChartItemPath(250,250,172,202,t,y)),e.addEventListener("mouseenter",(function(t){e.setAttribute("d",o.toPieChartItemPath(250,250,172,232,u,y)),[].slice.call(h).forEach((function(t){t.style.opacity="0.3"})),[].slice.call(g).forEach((function(t){t.style.opacity="0.3"})),t.currentTarget.style.opacity="1",l[0].style.opacity="1",l[1].style.opacity="0.3",i.dataType=t.currentTarget.id.split("-")[t.currentTarget.id.split("-").length-1],i.type="income",a.drawCenterText()})),e.addEventListener("mouseleave",(function(){e.setAttribute("d",o.toPieChartItemPath(250,250,172,202,u,y))})),t+=p/f*180}));var v=p.querySelectorAll("."+this.containerName+"-income-text");t=180,[].slice.call(v).forEach((function(a){var e=a.id.split("-")[a.id.split("-").length-1],n=m[e]?m[e]/f*180:0;n?(a.style.cssText="font-size:12px; transform-origin:250px 430px; transform:translate(0px,-180px) rotate("+(t+n/2)+"deg); user-select:none; pointer-events:none;",t+=n):(a.style.cssText="font-size:0px; transform-origin:250px 430px; transform:translate(0px,-180px) rotate("+(t+n/2)+"deg); user-select:none; pointer-events:none;",t+=n)}));var g=p.querySelectorAll("."+this.containerName+"-outlay"),x=Object.values(y).reduce((function(t,a){return t+a}),0);t=270,[].slice.call(g).forEach((function(e){var n=e.id.split("-")[e.id.split("-").length-1],p=y[n]?y[n]:0,u=t,m=y[n]?u+y[n]/x*180-.5:t;e.setAttribute("d",o.toPieChartItemPath(250,250,172,202,t,m)),e.addEventListener("mouseenter",(function(t){e.setAttribute("d",o.toPieChartItemPath(250,250,172,232,u,m)),[].slice.call(g).forEach((function(t){t.style.opacity="0.3"})),[].slice.call(h).forEach((function(t){t.style.opacity="0.3"})),t.currentTarget.style.opacity="1",l[1].style.opacity="1",l[0].style.opacity="0.3",i.dataType=t.currentTarget.id.split("-")[t.currentTarget.id.split("-").length-1],i.type="outlay",a.drawCenterText()})),e.addEventListener("mouseleave",(function(){e.setAttribute("d",o.toPieChartItemPath(250,250,172,202,u,m))})),t+=p/x*180}));var T=p.querySelectorAll("."+this.containerName+"-outlay-text");t=0,[].slice.call(T).forEach((function(a,e){var n=a.id.split("-")[a.id.split("-").length-1],o=y[n]?y[n]/x*180:0;o?(a.style.cssText="font-size:12px; transform-origin:250px 430px; transform:translate(0px,-180px) rotate("+(t+o/2)+"deg); user-select:none; pointer-events:none;",t+=o):(a.style.cssText="font-size:0px; transform-origin:250px 430px; transform:translate(0px,-180px) rotate("+(t+o/2)+"deg); user-select:none; pointer-events:none;",t+=o)}))},t.prototype.drawCenterText=function(){var t=document.querySelector("#"+this.containerName+"-text"),a="
"+this.chartTitle+"
",e="";e+=i.season?"
"+i.season+"
":"",e+=i.month?"
"+i.month+"월
":"";var n,o=document.querySelector("#"+this.containerName).querySelector("svg"),p=o.querySelectorAll("."+this.containerName+"-income"),u=Object.values(m).reduce((function(t,a){return t+a}),0),d=o.querySelectorAll("."+this.containerName+"-outlay"),r=Object.values(y).reduce((function(t,a){return t+a}),0);[].slice.call(p).forEach((function(t){var a=t.id.split("-")[t.id.split("-").length-1],e=m[a]?m[a]:0;i.dataType===t.id.split("-")[t.id.split("-").length-1]&&(n=e/u)})),[].slice.call(d).forEach((function(t){var a=t.id.split("-")[t.id.split("-").length-1],e=m[a]?m[a]:0;i.dataType===t.id.split("-")[t.id.split("-").length-1]&&(n=e/r)})),e+=i.dataType?"
"+Math.round(100*n)+"%
":"",e+=i.type?"
"+("income"===i.type?"수입":"지출")+"
":"",e+=i.dataType?"
"+i.dataType+"
":"",t.innerHTML=e||a},t.prototype.addEventListener=function(){var t=this,a=document.querySelector("#"+this.containerName).querySelector("svg"),e=a.querySelector("circle"),n=a.querySelectorAll("."+this.containerName+"-season"),o=a.querySelectorAll("."+this.containerName+"-month"),u=a.querySelectorAll("."+this.containerName+"-type");e.addEventListener("mouseenter",(function(){p([].slice.call(n),[].slice.call(o)).forEach((function(t){t.style.opacity="1"})),t.drawCenterText()})),e.addEventListener("click",(function(){i.dataType=void 0,i.type=void 0,i.month=void 0,i.season=void 0,t.drawCenterText(),t.initProps(t.chartProps),t.drawChart();var e=a.querySelectorAll("."+t.containerName+"-income"),n=a.querySelectorAll("."+t.containerName+"-outlay");p([].slice.call(u),[].slice.call(e),[].slice.call(n)).forEach((function(t){t.style.opacity="1"}))})),[].slice.call(n).forEach((function(a){a.addEventListener("mouseenter",(function(a){[].slice.call(n).forEach((function(t){t.style.opacity="0.3"}));var e=a.currentTarget.id.split("-")[a.currentTarget.id.split("-").length-1];i.season=e,a.currentTarget.style.opacity="1",t.drawCenterText()}))})),[].slice.call(o).forEach((function(a){a.addEventListener("mouseenter",(function(a){var e=Number(a.currentTarget.id.split("-")[a.currentTarget.id.split("-").length-1]);t.initProps(t.chartProps),t.changeData(e),t.drawChart(),[].slice.call(o).forEach((function(t){t.style.opacity="0.3"})),i.month=e,[].slice.call(n).forEach((function(t,a){t.style.opacity="0.3",[3,4,5].indexOf(e)>=0&&0===a&&(i.season="SPRING",t.style.opacity="1"),[6,7,8].indexOf(e)>=0&&1===a&&(i.season="SUMMER",t.style.opacity="1"),[9,10,11].indexOf(e)>=0&&2===a&&(i.season="FALL",t.style.opacity="1"),[12,1,2].indexOf(e)>=0&&3===a&&(i.season="WINTER",t.style.opacity="1")})),a.currentTarget.style.opacity="1",t.drawCenterText()}))})),[].slice.call(u).forEach((function(e,n){e.addEventListener("mouseenter",(function(e){var o=a.querySelectorAll("."+t.containerName+"-income"),p=a.querySelectorAll("."+t.containerName+"-outlay");[].slice.call(u).forEach((function(t){t.style.opacity="0.3"})),0===n&&[].slice.call(p).forEach((function(t){t.style.opacity="0.3"})),1===n&&[].slice.call(o).forEach((function(t){t.style.opacity="0.3"}));var m=e.currentTarget.id.split("-")[e.currentTarget.id.split("-").length-1];i.type=m,e.currentTarget.style.opacity="1",t.drawCenterText()}))}))},t.prototype.initStyleOffsetMonth=function(){var t=this,a=document.querySelector("#"+this.containerName).querySelector("svg"),e=(a.querySelector("circle"),a.querySelectorAll("."+this.containerName+"-season")),n=a.querySelectorAll("."+this.containerName+"-month");a.querySelectorAll("."+this.containerName+"-type");[].slice.call(e).forEach((function(a,e){a.style.opacity="0.3",[3,4,5].indexOf(t.offsetMonth)>=0&&0===e&&(i.season="SPRING",a.style.opacity="1"),[6,7,8].indexOf(t.offsetMonth)>=0&&1===e&&(i.season="SUMMER",a.style.opacity="1"),[9,10,11].indexOf(t.offsetMonth)>=0&&2===e&&(i.season="FALL",a.style.opacity="1"),[12,1,2].indexOf(t.offsetMonth)>=0&&3===e&&(i.season="WINTER",a.style.opacity="1")})),[].slice.call(n).forEach((function(a){Number(a.id.split("-")[a.id.split("-").length-1])===t.offsetMonth?a.style.opacity="1":a.style.opacity="0.3"}))},t}();a.default=d}.apply(a,n))||(t.exports=o)},function(t,a,e){var n;void 0===(n=function(t,a){"use strict";Object.defineProperty(a,"__esModule",{value:!0}),a.toPieChartItemPath=void 0,a.toPieChartItemPath=function(t,a,e,n,o,p){var u=function(t,a,e,n){var o=n*Math.PI/180;return{x:t+e*Math.cos(o),y:a+e*Math.sin(o)}},m=u(t,a,e,p),y=u(t,a,e,o),i=u(t,a,n,p),d=u(t,a,n,o),r=p-o<=180?"0":"1";return["M",m.x,m.y,"L",i.x,i.y,"A",n,n,0,r,0,d.x,d.y,"L",y.x,y.y,"A",e,e,0,r,1,m.x,m.y,"z"].join(" ")}}.apply(a,[e,a]))||(t.exports=n)},function(t){t.exports=JSON.parse('[{"month":1,"data":[{"date":1,"data":[{"type":"월급","amount":10000},{"type":"용돈","amount":50000},{"type":"교통","amount":-1000}]},{"date":2,"data":[{"type":"기타수입","amount":10000},{"type":"월급","amount":15000},{"type":"기타수입","amount":3000}]},{"date":3,"data":[{"type":"월급","amount":15000},{"type":"의료/건강","amount":-3000},{"type":"기타수입","amount":10000}]},{"date":4,"data":[{"type":"용돈","amount":3000},{"type":"기타수입","amount":15000},{"type":"의료/건강","amount":-10000}]},{"date":5,"data":[{"type":"교통","amount":-50000},{"type":"기타수입","amount":15000},{"type":"쇼핑/뷰티","amount":-50000}]},{"date":6,"data":[{"type":"용돈","amount":50000},{"type":"생활","amount":-30000},{"type":"기타수입","amount":15000}]},{"date":7,"data":[{"type":"월급","amount":15000},{"type":"생활","amount":-50000},{"type":"식비","amount":-30000}]},{"date":8,"data":[{"type":"용돈","amount":10000},{"type":"월급","amount":50000},{"type":"문화/여가","amount":-1000}]},{"date":9,"data":[{"type":"의료/건강","amount":-50000},{"type":"용돈","amount":20000},{"type":"생활","amount":-50000}]},{"date":10,"data":[{"type":"기타수입","amount":20000},{"type":"교통","amount":-5000},{"type":"미분류","amount":-1000}]},{"date":11,"data":[{"type":"용돈","amount":50000},{"type":"식비","amount":-50000},{"type":"의료/건강","amount":-50000}]},{"date":12,"data":[{"type":"월급","amount":50000},{"type":"기타수입","amount":50000},{"type":"기타수입","amount":5000}]},{"date":13,"data":[{"type":"쇼핑/뷰티","amount":-1000},{"type":"교통","amount":-30000},{"type":"기타수입","amount":3000}]},{"date":14,"data":[{"type":"의료/건강","amount":-30000},{"type":"식비","amount":-3000},{"type":"미분류","amount":-5000}]},{"date":15,"data":[{"type":"기타수입","amount":5000},{"type":"생활","amount":-1000},{"type":"문화/여가","amount":-50000}]},{"date":16,"data":[{"type":"생활","amount":-1000},{"type":"기타수입","amount":20000},{"type":"기타수입","amount":20000}]},{"date":17,"data":[{"type":"기타수입","amount":3000},{"type":"쇼핑/뷰티","amount":-50000},{"type":"생활","amount":-30000}]},{"date":18,"data":[{"type":"기타수입","amount":5000},{"type":"기타수입","amount":5000},{"type":"문화/여가","amount":-5000}]},{"date":19,"data":[{"type":"용돈","amount":15000},{"type":"교통","amount":-1000},{"type":"교통","amount":-50000}]},{"date":20,"data":[{"type":"교통","amount":-10000},{"type":"문화/여가","amount":-1000},{"type":"용돈","amount":50000}]},{"date":21,"data":[{"type":"월급","amount":10000},{"type":"문화/여가","amount":-3000},{"type":"쇼핑/뷰티","amount":-50000}]},{"date":22,"data":[{"type":"미분류","amount":-10000},{"type":"쇼핑/뷰티","amount":-30000},{"type":"용돈","amount":3000}]},{"date":23,"data":[{"type":"용돈","amount":15000},{"type":"미분류","amount":-3000},{"type":"식비","amount":-5000}]},{"date":24,"data":[{"type":"교통","amount":-50000},{"type":"월급","amount":15000},{"type":"미분류","amount":-1000}]},{"date":25,"data":[{"type":"기타수입","amount":10000},{"type":"미분류","amount":-10000},{"type":"식비","amount":-1000}]},{"date":26,"data":[{"type":"생활","amount":-3000},{"type":"용돈","amount":10000},{"type":"용돈","amount":15000}]},{"date":27,"data":[{"type":"기타수입","amount":50000},{"type":"월급","amount":5000},{"type":"용돈","amount":5000}]},{"date":28,"data":[{"type":"월급","amount":3000},{"type":"미분류","amount":-30000},{"type":"식비","amount":-50000}]},{"date":29,"data":[{"type":"기타수입","amount":3000},{"type":"월급","amount":50000},{"type":"용돈","amount":50000}]},{"date":30,"data":[{"type":"기타수입","amount":20000},{"type":"의료/건강","amount":-5000},{"type":"월급","amount":3000}]},{"date":31,"data":[{"type":"교통","amount":-5000},{"type":"용돈","amount":10000},{"type":"교통","amount":-10000}]}]},{"month":2,"data":[{"date":1,"data":[{"type":"용돈","amount":5000},{"type":"생활","amount":-1000},{"type":"교통","amount":-10000}]},{"date":2,"data":[{"type":"용돈","amount":15000},{"type":"식비","amount":-1000},{"type":"기타수입","amount":5000}]},{"date":3,"data":[{"type":"용돈","amount":10000},{"type":"미분류","amount":-50000},{"type":"식비","amount":-1000}]},{"date":4,"data":[{"type":"생활","amount":-50000},{"type":"월급","amount":10000},{"type":"식비","amount":-10000}]},{"date":5,"data":[{"type":"문화/여가","amount":-30000},{"type":"용돈","amount":3000},{"type":"월급","amount":50000}]},{"date":6,"data":[{"type":"월급","amount":50000},{"type":"의료/건강","amount":-3000},{"type":"기타수입","amount":50000}]},{"date":7,"data":[{"type":"용돈","amount":50000},{"type":"용돈","amount":50000},{"type":"쇼핑/뷰티","amount":-1000}]},{"date":8,"data":[{"type":"월급","amount":10000},{"type":"기타수입","amount":10000},{"type":"문화/여가","amount":-5000}]},{"date":9,"data":[{"type":"미분류","amount":-5000},{"type":"월급","amount":10000},{"type":"기타수입","amount":20000}]},{"date":10,"data":[{"type":"교통","amount":-30000},{"type":"용돈","amount":10000},{"type":"기타수입","amount":20000}]},{"date":11,"data":[{"type":"기타수입","amount":5000},{"type":"용돈","amount":20000},{"type":"미분류","amount":-3000}]},{"date":12,"data":[{"type":"의료/건강","amount":-5000},{"type":"월급","amount":5000},{"type":"문화/여가","amount":-50000}]},{"date":13,"data":[{"type":"기타수입","amount":5000},{"type":"의료/건강","amount":-50000},{"type":"쇼핑/뷰티","amount":-1000}]},{"date":14,"data":[{"type":"기타수입","amount":50000},{"type":"미분류","amount":-10000},{"type":"기타수입","amount":3000}]},{"date":15,"data":[{"type":"용돈","amount":10000},{"type":"용돈","amount":10000},{"type":"기타수입","amount":3000}]},{"date":16,"data":[{"type":"쇼핑/뷰티","amount":-1000},{"type":"용돈","amount":50000},{"type":"기타수입","amount":15000}]},{"date":17,"data":[{"type":"쇼핑/뷰티","amount":-10000},{"type":"기타수입","amount":50000},{"type":"용돈","amount":5000}]},{"date":18,"data":[{"type":"식비","amount":-30000},{"type":"기타수입","amount":3000},{"type":"월급","amount":20000}]},{"date":19,"data":[{"type":"용돈","amount":5000},{"type":"월급","amount":20000},{"type":"문화/여가","amount":-10000}]},{"date":20,"data":[{"type":"용돈","amount":5000},{"type":"의료/건강","amount":-30000},{"type":"용돈","amount":5000}]},{"date":21,"data":[{"type":"월급","amount":3000},{"type":"용돈","amount":3000},{"type":"용돈","amount":5000}]},{"date":22,"data":[{"type":"미분류","amount":-10000},{"type":"식비","amount":-10000},{"type":"쇼핑/뷰티","amount":-10000}]},{"date":23,"data":[{"type":"월급","amount":10000},{"type":"쇼핑/뷰티","amount":-50000},{"type":"미분류","amount":-1000}]},{"date":24,"data":[{"type":"문화/여가","amount":-10000},{"type":"교통","amount":-3000},{"type":"의료/건강","amount":-50000}]},{"date":25,"data":[{"type":"문화/여가","amount":-5000},{"type":"교통","amount":-50000},{"type":"의료/건강","amount":-10000}]},{"date":26,"data":[{"type":"용돈","amount":5000},{"type":"기타수입","amount":10000},{"type":"기타수입","amount":3000}]},{"date":27,"data":[{"type":"월급","amount":50000},{"type":"문화/여가","amount":-30000},{"type":"식비","amount":-3000}]},{"date":28,"data":[{"type":"생활","amount":-1000},{"type":"미분류","amount":-5000},{"type":"기타수입","amount":50000}]},{"date":29,"data":[{"type":"미분류","amount":-1000},{"type":"쇼핑/뷰티","amount":-30000},{"type":"월급","amount":3000}]},{"date":30,"data":[{"type":"월급","amount":10000},{"type":"식비","amount":-10000},{"type":"미분류","amount":-5000}]},{"date":31,"data":[{"type":"쇼핑/뷰티","amount":-30000},{"type":"쇼핑/뷰티","amount":-50000},{"type":"교통","amount":-30000}]}]},{"month":3,"data":[{"date":1,"data":[{"type":"용돈","amount":5000},{"type":"기타수입","amount":15000},{"type":"식비","amount":-3000}]},{"date":2,"data":[{"type":"기타수입","amount":20000},{"type":"미분류","amount":-10000},{"type":"기타수입","amount":3000}]},{"date":3,"data":[{"type":"의료/건강","amount":-10000},{"type":"쇼핑/뷰티","amount":-3000},{"type":"용돈","amount":20000}]},{"date":4,"data":[{"type":"기타수입","amount":15000},{"type":"교통","amount":-50000},{"type":"월급","amount":3000}]},{"date":5,"data":[{"type":"문화/여가","amount":-10000},{"type":"기타수입","amount":10000},{"type":"생활","amount":-3000}]},{"date":6,"data":[{"type":"교통","amount":-50000},{"type":"교통","amount":-3000},{"type":"문화/여가","amount":-1000}]},{"date":7,"data":[{"type":"교통","amount":-1000},{"type":"용돈","amount":50000},{"type":"미분류","amount":-1000}]},{"date":8,"data":[{"type":"식비","amount":-30000},{"type":"식비","amount":-30000},{"type":"용돈","amount":10000}]},{"date":9,"data":[{"type":"문화/여가","amount":-10000},{"type":"교통","amount":-30000},{"type":"월급","amount":10000}]},{"date":10,"data":[{"type":"문화/여가","amount":-30000},{"type":"기타수입","amount":5000},{"type":"문화/여가","amount":-10000}]},{"date":11,"data":[{"type":"교통","amount":-30000},{"type":"기타수입","amount":50000},{"type":"식비","amount":-50000}]},{"date":12,"data":[{"type":"식비","amount":-5000},{"type":"교통","amount":-1000},{"type":"기타수입","amount":3000}]},{"date":13,"data":[{"type":"생활","amount":-10000},{"type":"용돈","amount":50000},{"type":"월급","amount":5000}]},{"date":14,"data":[{"type":"월급","amount":10000},{"type":"미분류","amount":-1000},{"type":"용돈","amount":15000}]},{"date":15,"data":[{"type":"의료/건강","amount":-10000},{"type":"월급","amount":10000},{"type":"쇼핑/뷰티","amount":-30000}]},{"date":16,"data":[{"type":"월급","amount":10000},{"type":"용돈","amount":10000},{"type":"문화/여가","amount":-50000}]},{"date":17,"data":[{"type":"월급","amount":10000},{"type":"용돈","amount":5000},{"type":"월급","amount":3000}]},{"date":18,"data":[{"type":"월급","amount":5000},{"type":"생활","amount":-1000},{"type":"문화/여가","amount":-3000}]},{"date":19,"data":[{"type":"월급","amount":15000},{"type":"교통","amount":-10000},{"type":"기타수입","amount":50000}]},{"date":20,"data":[{"type":"문화/여가","amount":-3000},{"type":"용돈","amount":15000},{"type":"의료/건강","amount":-3000}]},{"date":21,"data":[{"type":"기타수입","amount":3000},{"type":"식비","amount":-10000},{"type":"월급","amount":20000}]},{"date":22,"data":[{"type":"용돈","amount":50000},{"type":"식비","amount":-5000},{"type":"식비","amount":-10000}]},{"date":23,"data":[{"type":"교통","amount":-3000},{"type":"생활","amount":-1000},{"type":"식비","amount":-10000}]},{"date":24,"data":[{"type":"식비","amount":-10000},{"type":"월급","amount":20000},{"type":"기타수입","amount":50000}]},{"date":25,"data":[{"type":"생활","amount":-1000},{"type":"쇼핑/뷰티","amount":-5000},{"type":"식비","amount":-1000}]},{"date":26,"data":[{"type":"교통","amount":-1000},{"type":"용돈","amount":5000},{"type":"문화/여가","amount":-10000}]},{"date":27,"data":[{"type":"기타수입","amount":10000},{"type":"월급","amount":10000},{"type":"미분류","amount":-5000}]},{"date":28,"data":[{"type":"용돈","amount":5000},{"type":"생활","amount":-50000},{"type":"문화/여가","amount":-50000}]},{"date":29,"data":[{"type":"용돈","amount":3000},{"type":"생활","amount":-10000},{"type":"의료/건강","amount":-5000}]},{"date":30,"data":[{"type":"기타수입","amount":20000},{"type":"문화/여가","amount":-10000},{"type":"용돈","amount":50000}]},{"date":31,"data":[{"type":"월급","amount":15000},{"type":"월급","amount":5000},{"type":"교통","amount":-50000}]}]},{"month":4,"data":[{"date":1,"data":[{"type":"용돈","amount":20000},{"type":"기타수입","amount":15000},{"type":"교통","amount":-1000}]},{"date":2,"data":[{"type":"월급","amount":15000},{"type":"의료/건강","amount":-1000},{"type":"의료/건강","amount":-1000}]},{"date":3,"data":[{"type":"용돈","amount":3000},{"type":"기타수입","amount":15000},{"type":"교통","amount":-3000}]},{"date":4,"data":[{"type":"월급","amount":15000},{"type":"식비","amount":-30000},{"type":"기타수입","amount":50000}]},{"date":5,"data":[{"type":"용돈","amount":20000},{"type":"월급","amount":10000},{"type":"미분류","amount":-5000}]},{"date":6,"data":[{"type":"월급","amount":10000},{"type":"용돈","amount":3000},{"type":"월급","amount":10000}]},{"date":7,"data":[{"type":"용돈","amount":5000},{"type":"월급","amount":3000},{"type":"월급","amount":3000}]},{"date":8,"data":[{"type":"문화/여가","amount":-10000},{"type":"기타수입","amount":20000},{"type":"쇼핑/뷰티","amount":-30000}]},{"date":9,"data":[{"type":"용돈","amount":5000},{"type":"교통","amount":-50000},{"type":"의료/건강","amount":-30000}]},{"date":10,"data":[{"type":"문화/여가","amount":-3000},{"type":"기타수입","amount":15000},{"type":"월급","amount":50000}]},{"date":11,"data":[{"type":"식비","amount":-50000},{"type":"용돈","amount":3000},{"type":"미분류","amount":-5000}]},{"date":12,"data":[{"type":"쇼핑/뷰티","amount":-10000},{"type":"의료/건강","amount":-3000},{"type":"월급","amount":5000}]},{"date":13,"data":[{"type":"용돈","amount":15000},{"type":"용돈","amount":50000},{"type":"교통","amount":-30000}]},{"date":14,"data":[{"type":"기타수입","amount":50000},{"type":"용돈","amount":10000},{"type":"용돈","amount":5000}]},{"date":15,"data":[{"type":"월급","amount":10000},{"type":"쇼핑/뷰티","amount":-50000},{"type":"미분류","amount":-10000}]},{"date":16,"data":[{"type":"문화/여가","amount":-1000},{"type":"기타수입","amount":5000},{"type":"의료/건강","amount":-1000}]},{"date":17,"data":[{"type":"월급","amount":15000},{"type":"월급","amount":3000},{"type":"쇼핑/뷰티","amount":-5000}]},{"date":18,"data":[{"type":"기타수입","amount":20000},{"type":"미분류","amount":-3000},{"type":"교통","amount":-1000}]},{"date":19,"data":[{"type":"문화/여가","amount":-50000},{"type":"쇼핑/뷰티","amount":-1000},{"type":"미분류","amount":-50000}]},{"date":20,"data":[{"type":"용돈","amount":3000},{"type":"생활","amount":-30000},{"type":"용돈","amount":50000}]},{"date":21,"data":[{"type":"생활","amount":-1000},{"type":"생활","amount":-5000},{"type":"월급","amount":20000}]},{"date":22,"data":[{"type":"월급","amount":10000},{"type":"기타수입","amount":5000},{"type":"기타수입","amount":50000}]},{"date":23,"data":[{"type":"쇼핑/뷰티","amount":-10000},{"type":"쇼핑/뷰티","amount":-50000},{"type":"식비","amount":-3000}]},{"date":24,"data":[{"type":"월급","amount":15000},{"type":"용돈","amount":5000},{"type":"문화/여가","amount":-50000}]},{"date":25,"data":[{"type":"용돈","amount":50000},{"type":"용돈","amount":5000},{"type":"기타수입","amount":5000}]},{"date":26,"data":[{"type":"미분류","amount":-3000},{"type":"기타수입","amount":15000},{"type":"교통","amount":-30000}]},{"date":27,"data":[{"type":"의료/건강","amount":-3000},{"type":"기타수입","amount":10000},{"type":"생활","amount":-1000}]},{"date":28,"data":[{"type":"기타수입","amount":10000},{"type":"문화/여가","amount":-3000},{"type":"월급","amount":3000}]},{"date":29,"data":[{"type":"용돈","amount":5000},{"type":"식비","amount":-50000},{"type":"생활","amount":-5000}]},{"date":30,"data":[{"type":"용돈","amount":50000},{"type":"용돈","amount":3000},{"type":"생활","amount":-3000}]},{"date":31,"data":[{"type":"문화/여가","amount":-1000},{"type":"미분류","amount":-3000},{"type":"미분류","amount":-3000}]}]},{"month":5,"data":[{"date":1,"data":[{"type":"용돈","amount":5000},{"type":"문화/여가","amount":-30000},{"type":"기타수입","amount":50000}]},{"date":2,"data":[{"type":"월급","amount":50000},{"type":"문화/여가","amount":-10000},{"type":"생활","amount":-1000}]},{"date":3,"data":[{"type":"기타수입","amount":15000},{"type":"기타수입","amount":10000},{"type":"용돈","amount":3000}]},{"date":4,"data":[{"type":"미분류","amount":-10000},{"type":"생활","amount":-3000},{"type":"교통","amount":-1000}]},{"date":5,"data":[{"type":"문화/여가","amount":-1000},{"type":"용돈","amount":5000},{"type":"문화/여가","amount":-30000}]},{"date":6,"data":[{"type":"월급","amount":15000},{"type":"기타수입","amount":50000},{"type":"월급","amount":15000}]},{"date":7,"data":[{"type":"기타수입","amount":10000},{"type":"월급","amount":5000},{"type":"용돈","amount":3000}]},{"date":8,"data":[{"type":"기타수입","amount":5000},{"type":"문화/여가","amount":-1000},{"type":"의료/건강","amount":-30000}]},{"date":9,"data":[{"type":"월급","amount":3000},{"type":"용돈","amount":15000},{"type":"문화/여가","amount":-1000}]},{"date":10,"data":[{"type":"월급","amount":10000},{"type":"쇼핑/뷰티","amount":-10000},{"type":"쇼핑/뷰티","amount":-30000}]},{"date":11,"data":[{"type":"쇼핑/뷰티","amount":-30000},{"type":"용돈","amount":15000},{"type":"미분류","amount":-3000}]},{"date":12,"data":[{"type":"문화/여가","amount":-1000},{"type":"기타수입","amount":20000},{"type":"쇼핑/뷰티","amount":-3000}]},{"date":13,"data":[{"type":"월급","amount":50000},{"type":"용돈","amount":50000},{"type":"미분류","amount":-5000}]},{"date":14,"data":[{"type":"문화/여가","amount":-50000},{"type":"식비","amount":-50000},{"type":"월급","amount":15000}]},{"date":15,"data":[{"type":"월급","amount":15000},{"type":"문화/여가","amount":-50000},{"type":"교통","amount":-3000}]},{"date":16,"data":[{"type":"월급","amount":5000},{"type":"문화/여가","amount":-3000},{"type":"의료/건강","amount":-50000}]},{"date":17,"data":[{"type":"미분류","amount":-30000},{"type":"용돈","amount":20000},{"type":"용돈","amount":50000}]},{"date":18,"data":[{"type":"쇼핑/뷰티","amount":-5000},{"type":"용돈","amount":15000},{"type":"월급","amount":20000}]},{"date":19,"data":[{"type":"의료/건강","amount":-10000},{"type":"용돈","amount":20000},{"type":"교통","amount":-5000}]},{"date":20,"data":[{"type":"월급","amount":10000},{"type":"교통","amount":-3000},{"type":"문화/여가","amount":-1000}]},{"date":21,"data":[{"type":"생활","amount":-1000},{"type":"월급","amount":5000},{"type":"월급","amount":5000}]},{"date":22,"data":[{"type":"쇼핑/뷰티","amount":-3000},{"type":"월급","amount":15000},{"type":"용돈","amount":3000}]},{"date":23,"data":[{"type":"기타수입","amount":15000},{"type":"용돈","amount":15000},{"type":"기타수입","amount":50000}]},{"date":24,"data":[{"type":"용돈","amount":15000},{"type":"식비","amount":-10000},{"type":"기타수입","amount":20000}]},{"date":25,"data":[{"type":"식비","amount":-3000},{"type":"월급","amount":10000},{"type":"월급","amount":50000}]},{"date":26,"data":[{"type":"용돈","amount":20000},{"type":"기타수입","amount":3000},{"type":"쇼핑/뷰티","amount":-30000}]},{"date":27,"data":[{"type":"용돈","amount":10000},{"type":"생활","amount":-3000},{"type":"생활","amount":-1000}]},{"date":28,"data":[{"type":"용돈","amount":5000},{"type":"의료/건강","amount":-50000},{"type":"용돈","amount":10000}]},{"date":29,"data":[{"type":"용돈","amount":3000},{"type":"미분류","amount":-1000},{"type":"미분류","amount":-1000}]},{"date":30,"data":[{"type":"기타수입","amount":5000},{"type":"문화/여가","amount":-5000},{"type":"기타수입","amount":50000}]},{"date":31,"data":[{"type":"용돈","amount":20000},{"type":"월급","amount":15000},{"type":"문화/여가","amount":-1000}]}]},{"month":6,"data":[{"date":1,"data":[{"type":"식비","amount":-3000},{"type":"문화/여가","amount":-30000},{"type":"교통","amount":-30000}]},{"date":2,"data":[{"type":"생활","amount":-50000},{"type":"의료/건강","amount":-10000},{"type":"용돈","amount":20000}]},{"date":3,"data":[{"type":"용돈","amount":50000},{"type":"의료/건강","amount":-50000},{"type":"기타수입","amount":5000}]},{"date":4,"data":[{"type":"문화/여가","amount":-1000},{"type":"월급","amount":3000},{"type":"용돈","amount":50000}]},{"date":5,"data":[{"type":"쇼핑/뷰티","amount":-50000},{"type":"용돈","amount":5000},{"type":"월급","amount":3000}]},{"date":6,"data":[{"type":"쇼핑/뷰티","amount":-50000},{"type":"월급","amount":3000},{"type":"의료/건강","amount":-10000}]},{"date":7,"data":[{"type":"식비","amount":-10000},{"type":"식비","amount":-5000},{"type":"기타수입","amount":10000}]},{"date":8,"data":[{"type":"문화/여가","amount":-10000},{"type":"의료/건강","amount":-3000},{"type":"식비","amount":-10000}]},{"date":9,"data":[{"type":"교통","amount":-3000},{"type":"식비","amount":-30000},{"type":"기타수입","amount":15000}]},{"date":10,"data":[{"type":"식비","amount":-5000},{"type":"기타수입","amount":3000},{"type":"기타수입","amount":3000}]},{"date":11,"data":[{"type":"기타수입","amount":20000},{"type":"용돈","amount":20000},{"type":"쇼핑/뷰티","amount":-50000}]},{"date":12,"data":[{"type":"교통","amount":-3000},{"type":"용돈","amount":3000},{"type":"생활","amount":-1000}]},{"date":13,"data":[{"type":"미분류","amount":-10000},{"type":"기타수입","amount":3000},{"type":"식비","amount":-5000}]},{"date":14,"data":[{"type":"월급","amount":10000},{"type":"기타수입","amount":5000},{"type":"식비","amount":-3000}]},{"date":15,"data":[{"type":"생활","amount":-1000},{"type":"월급","amount":5000},{"type":"미분류","amount":-1000}]},{"date":16,"data":[{"type":"기타수입","amount":15000},{"type":"용돈","amount":5000},{"type":"기타수입","amount":10000}]},{"date":17,"data":[{"type":"문화/여가","amount":-3000},{"type":"기타수입","amount":3000},{"type":"문화/여가","amount":-5000}]},{"date":18,"data":[{"type":"생활","amount":-5000},{"type":"생활","amount":-10000},{"type":"의료/건강","amount":-1000}]},{"date":19,"data":[{"type":"용돈","amount":20000},{"type":"의료/건강","amount":-10000},{"type":"교통","amount":-10000}]},{"date":20,"data":[{"type":"기타수입","amount":3000},{"type":"용돈","amount":50000},{"type":"문화/여가","amount":-50000}]},{"date":21,"data":[{"type":"월급","amount":10000},{"type":"기타수입","amount":20000},{"type":"식비","amount":-1000}]},{"date":22,"data":[{"type":"기타수입","amount":50000},{"type":"월급","amount":20000},{"type":"교통","amount":-30000}]},{"date":23,"data":[{"type":"교통","amount":-1000},{"type":"용돈","amount":15000},{"type":"쇼핑/뷰티","amount":-10000}]},{"date":24,"data":[{"type":"쇼핑/뷰티","amount":-50000},{"type":"월급","amount":10000},{"type":"용돈","amount":20000}]},{"date":25,"data":[{"type":"용돈","amount":5000},{"type":"월급","amount":50000},{"type":"쇼핑/뷰티","amount":-3000}]},{"date":26,"data":[{"type":"월급","amount":3000},{"type":"교통","amount":-30000},{"type":"용돈","amount":15000}]},{"date":27,"data":[{"type":"생활","amount":-10000},{"type":"용돈","amount":15000},{"type":"기타수입","amount":3000}]},{"date":28,"data":[{"type":"쇼핑/뷰티","amount":-5000},{"type":"기타수입","amount":50000},{"type":"의료/건강","amount":-50000}]},{"date":29,"data":[{"type":"기타수입","amount":50000},{"type":"기타수입","amount":5000},{"type":"문화/여가","amount":-50000}]},{"date":30,"data":[{"type":"미분류","amount":-50000},{"type":"미분류","amount":-1000},{"type":"생활","amount":-30000}]},{"date":31,"data":[{"type":"교통","amount":-50000},{"type":"기타수입","amount":10000},{"type":"월급","amount":15000}]}]},{"month":7,"data":[{"date":1,"data":[{"type":"쇼핑/뷰티","amount":-10000},{"type":"미분류","amount":-1000},{"type":"문화/여가","amount":-5000}]},{"date":2,"data":[{"type":"기타수입","amount":20000},{"type":"생활","amount":-5000},{"type":"기타수입","amount":20000}]},{"date":3,"data":[{"type":"용돈","amount":5000},{"type":"문화/여가","amount":-30000},{"type":"생활","amount":-3000}]},{"date":4,"data":[{"type":"교통","amount":-3000},{"type":"월급","amount":3000},{"type":"기타수입","amount":3000}]},{"date":5,"data":[{"type":"문화/여가","amount":-10000},{"type":"생활","amount":-1000},{"type":"용돈","amount":3000}]},{"date":6,"data":[{"type":"의료/건강","amount":-5000},{"type":"기타수입","amount":5000},{"type":"월급","amount":20000}]},{"date":7,"data":[{"type":"기타수입","amount":15000},{"type":"기타수입","amount":10000},{"type":"생활","amount":-5000}]},{"date":8,"data":[{"type":"문화/여가","amount":-5000},{"type":"의료/건강","amount":-50000},{"type":"월급","amount":20000}]},{"date":9,"data":[{"type":"월급","amount":50000},{"type":"의료/건강","amount":-3000},{"type":"월급","amount":3000}]},{"date":10,"data":[{"type":"용돈","amount":20000},{"type":"기타수입","amount":3000},{"type":"문화/여가","amount":-3000}]},{"date":11,"data":[{"type":"생활","amount":-3000},{"type":"용돈","amount":5000},{"type":"용돈","amount":3000}]},{"date":12,"data":[{"type":"용돈","amount":5000},{"type":"문화/여가","amount":-10000},{"type":"용돈","amount":3000}]},{"date":13,"data":[{"type":"미분류","amount":-1000},{"type":"교통","amount":-50000},{"type":"용돈","amount":10000}]},{"date":14,"data":[{"type":"교통","amount":-3000},{"type":"문화/여가","amount":-30000},{"type":"의료/건강","amount":-5000}]},{"date":15,"data":[{"type":"기타수입","amount":10000},{"type":"용돈","amount":10000},{"type":"생활","amount":-1000}]},{"date":16,"data":[{"type":"월급","amount":20000},{"type":"월급","amount":50000},{"type":"식비","amount":-1000}]},{"date":17,"data":[{"type":"쇼핑/뷰티","amount":-5000},{"type":"월급","amount":20000},{"type":"미분류","amount":-1000}]},{"date":18,"data":[{"type":"월급","amount":10000},{"type":"기타수입","amount":15000},{"type":"식비","amount":-10000}]},{"date":19,"data":[{"type":"월급","amount":15000},{"type":"쇼핑/뷰티","amount":-5000},{"type":"식비","amount":-30000}]},{"date":20,"data":[{"type":"기타수입","amount":50000},{"type":"생활","amount":-3000},{"type":"의료/건강","amount":-10000}]},{"date":21,"data":[{"type":"문화/여가","amount":-5000},{"type":"쇼핑/뷰티","amount":-30000},{"type":"교통","amount":-3000}]},{"date":22,"data":[{"type":"기타수입","amount":50000},{"type":"미분류","amount":-1000},{"type":"미분류","amount":-5000}]},{"date":23,"data":[{"type":"문화/여가","amount":-30000},{"type":"기타수입","amount":50000},{"type":"용돈","amount":50000}]},{"date":24,"data":[{"type":"교통","amount":-50000},{"type":"미분류","amount":-10000},{"type":"생활","amount":-50000}]},{"date":25,"data":[{"type":"교통","amount":-1000},{"type":"쇼핑/뷰티","amount":-5000},{"type":"쇼핑/뷰티","amount":-10000}]},{"date":26,"data":[{"type":"문화/여가","amount":-5000},{"type":"기타수입","amount":15000},{"type":"월급","amount":5000}]},{"date":27,"data":[{"type":"미분류","amount":-3000},{"type":"월급","amount":50000},{"type":"월급","amount":3000}]},{"date":28,"data":[{"type":"미분류","amount":-5000},{"type":"문화/여가","amount":-3000},{"type":"월급","amount":5000}]},{"date":29,"data":[{"type":"용돈","amount":5000},{"type":"식비","amount":-50000},{"type":"월급","amount":50000}]},{"date":30,"data":[{"type":"용돈","amount":10000},{"type":"월급","amount":15000},{"type":"월급","amount":10000}]},{"date":31,"data":[{"type":"쇼핑/뷰티","amount":-5000},{"type":"용돈","amount":15000},{"type":"의료/건강","amount":-30000}]}]},{"month":8,"data":[{"date":1,"data":[{"type":"용돈","amount":10000},{"type":"용돈","amount":20000},{"type":"용돈","amount":10000}]},{"date":2,"data":[{"type":"용돈","amount":15000},{"type":"월급","amount":20000},{"type":"월급","amount":10000}]},{"date":3,"data":[{"type":"미분류","amount":-1000},{"type":"월급","amount":3000},{"type":"용돈","amount":15000}]},{"date":4,"data":[{"type":"기타수입","amount":10000},{"type":"의료/건강","amount":-1000},{"type":"용돈","amount":15000}]},{"date":5,"data":[{"type":"문화/여가","amount":-50000},{"type":"식비","amount":-10000},{"type":"식비","amount":-3000}]},{"date":6,"data":[{"type":"미분류","amount":-1000},{"type":"쇼핑/뷰티","amount":-30000},{"type":"기타수입","amount":10000}]},{"date":7,"data":[{"type":"월급","amount":20000},{"type":"기타수입","amount":20000},{"type":"기타수입","amount":5000}]},{"date":8,"data":[{"type":"월급","amount":50000},{"type":"용돈","amount":5000},{"type":"기타수입","amount":20000}]},{"date":9,"data":[{"type":"미분류","amount":-1000},{"type":"기타수입","amount":50000},{"type":"월급","amount":3000}]},{"date":10,"data":[{"type":"용돈","amount":20000},{"type":"월급","amount":3000},{"type":"기타수입","amount":50000}]},{"date":11,"data":[{"type":"월급","amount":3000},{"type":"용돈","amount":50000},{"type":"교통","amount":-30000}]},{"date":12,"data":[{"type":"식비","amount":-50000},{"type":"용돈","amount":10000},{"type":"의료/건강","amount":-5000}]},{"date":13,"data":[{"type":"용돈","amount":20000},{"type":"월급","amount":3000},{"type":"식비","amount":-3000}]},{"date":14,"data":[{"type":"월급","amount":5000},{"type":"기타수입","amount":5000},{"type":"기타수입","amount":5000}]},{"date":15,"data":[{"type":"문화/여가","amount":-50000},{"type":"월급","amount":5000},{"type":"기타수입","amount":3000}]},{"date":16,"data":[{"type":"쇼핑/뷰티","amount":-50000},{"type":"의료/건강","amount":-50000},{"type":"용돈","amount":10000}]},{"date":17,"data":[{"type":"월급","amount":50000},{"type":"식비","amount":-3000},{"type":"미분류","amount":-50000}]},{"date":18,"data":[{"type":"기타수입","amount":10000},{"type":"문화/여가","amount":-5000},{"type":"기타수입","amount":10000}]},{"date":19,"data":[{"type":"용돈","amount":20000},{"type":"용돈","amount":15000},{"type":"생활","amount":-50000}]},{"date":20,"data":[{"type":"월급","amount":50000},{"type":"교통","amount":-10000},{"type":"의료/건강","amount":-50000}]},{"date":21,"data":[{"type":"월급","amount":3000},{"type":"미분류","amount":-10000},{"type":"월급","amount":20000}]},{"date":22,"data":[{"type":"의료/건강","amount":-50000},{"type":"쇼핑/뷰티","amount":-1000},{"type":"용돈","amount":10000}]},{"date":23,"data":[{"type":"미분류","amount":-10000},{"type":"기타수입","amount":15000},{"type":"교통","amount":-1000}]},{"date":24,"data":[{"type":"식비","amount":-1000},{"type":"기타수입","amount":20000},{"type":"용돈","amount":3000}]},{"date":25,"data":[{"type":"용돈","amount":5000},{"type":"기타수입","amount":15000},{"type":"생활","amount":-10000}]},{"date":26,"data":[{"type":"기타수입","amount":20000},{"type":"기타수입","amount":15000},{"type":"기타수입","amount":15000}]},{"date":27,"data":[{"type":"문화/여가","amount":-10000},{"type":"용돈","amount":20000},{"type":"용돈","amount":20000}]},{"date":28,"data":[{"type":"의료/건강","amount":-30000},{"type":"의료/건강","amount":-10000},{"type":"생활","amount":-50000}]},{"date":29,"data":[{"type":"미분류","amount":-10000},{"type":"쇼핑/뷰티","amount":-3000},{"type":"의료/건강","amount":-50000}]},{"date":30,"data":[{"type":"의료/건강","amount":-50000},{"type":"미분류","amount":-30000},{"type":"쇼핑/뷰티","amount":-10000}]},{"date":31,"data":[{"type":"생활","amount":-5000},{"type":"용돈","amount":15000},{"type":"쇼핑/뷰티","amount":-3000}]}]},{"month":9,"data":[{"date":1,"data":[{"type":"기타수입","amount":20000},{"type":"기타수입","amount":5000},{"type":"월급","amount":15000}]},{"date":2,"data":[{"type":"용돈","amount":5000},{"type":"기타수입","amount":20000},{"type":"식비","amount":-3000}]},{"date":3,"data":[{"type":"월급","amount":50000},{"type":"월급","amount":10000},{"type":"식비","amount":-30000}]},{"date":4,"data":[{"type":"월급","amount":20000},{"type":"기타수입","amount":15000},{"type":"식비","amount":-1000}]},{"date":5,"data":[{"type":"월급","amount":20000},{"type":"기타수입","amount":3000},{"type":"쇼핑/뷰티","amount":-1000}]},{"date":6,"data":[{"type":"의료/건강","amount":-50000},{"type":"생활","amount":-50000},{"type":"식비","amount":-10000}]},{"date":7,"data":[{"type":"기타수입","amount":10000},{"type":"의료/건강","amount":-5000},{"type":"기타수입","amount":20000}]},{"date":8,"data":[{"type":"용돈","amount":15000},{"type":"식비","amount":-30000},{"type":"식비","amount":-10000}]},{"date":9,"data":[{"type":"의료/건강","amount":-1000},{"type":"월급","amount":10000},{"type":"문화/여가","amount":-5000}]},{"date":10,"data":[{"type":"미분류","amount":-50000},{"type":"용돈","amount":3000},{"type":"용돈","amount":3000}]},{"date":11,"data":[{"type":"기타수입","amount":3000},{"type":"용돈","amount":5000},{"type":"용돈","amount":20000}]},{"date":12,"data":[{"type":"월급","amount":20000},{"type":"용돈","amount":15000},{"type":"의료/건강","amount":-5000}]},{"date":13,"data":[{"type":"쇼핑/뷰티","amount":-1000},{"type":"미분류","amount":-30000},{"type":"월급","amount":5000}]},{"date":14,"data":[{"type":"교통","amount":-5000},{"type":"의료/건강","amount":-10000},{"type":"기타수입","amount":5000}]},{"date":15,"data":[{"type":"용돈","amount":50000},{"type":"기타수입","amount":10000},{"type":"생활","amount":-1000}]},{"date":16,"data":[{"type":"용돈","amount":3000},{"type":"식비","amount":-10000},{"type":"기타수입","amount":20000}]},{"date":17,"data":[{"type":"교통","amount":-30000},{"type":"용돈","amount":50000},{"type":"월급","amount":5000}]},{"date":18,"data":[{"type":"기타수입","amount":5000},{"type":"기타수입","amount":20000},{"type":"미분류","amount":-30000}]},{"date":19,"data":[{"type":"미분류","amount":-3000},{"type":"월급","amount":20000},{"type":"식비","amount":-30000}]},{"date":20,"data":[{"type":"용돈","amount":3000},{"type":"의료/건강","amount":-10000},{"type":"용돈","amount":50000}]},{"date":21,"data":[{"type":"생활","amount":-5000},{"type":"월급","amount":20000},{"type":"기타수입","amount":3000}]},{"date":22,"data":[{"type":"문화/여가","amount":-3000},{"type":"미분류","amount":-10000},{"type":"문화/여가","amount":-5000}]},{"date":23,"data":[{"type":"기타수입","amount":15000},{"type":"기타수입","amount":5000},{"type":"생활","amount":-1000}]},{"date":24,"data":[{"type":"쇼핑/뷰티","amount":-5000},{"type":"월급","amount":50000},{"type":"미분류","amount":-10000}]},{"date":25,"data":[{"type":"월급","amount":50000},{"type":"기타수입","amount":10000},{"type":"쇼핑/뷰티","amount":-30000}]},{"date":26,"data":[{"type":"기타수입","amount":15000},{"type":"기타수입","amount":15000},{"type":"용돈","amount":10000}]},{"date":27,"data":[{"type":"생활","amount":-1000},{"type":"교통","amount":-50000},{"type":"의료/건강","amount":-50000}]},{"date":28,"data":[{"type":"문화/여가","amount":-1000},{"type":"용돈","amount":5000},{"type":"용돈","amount":3000}]},{"date":29,"data":[{"type":"기타수입","amount":20000},{"type":"용돈","amount":50000},{"type":"미분류","amount":-10000}]},{"date":30,"data":[{"type":"의료/건강","amount":-5000},{"type":"미분류","amount":-50000},{"type":"월급","amount":5000}]},{"date":31,"data":[{"type":"용돈","amount":10000},{"type":"기타수입","amount":15000},{"type":"미분류","amount":-3000}]}]},{"month":10,"data":[{"date":1,"data":[{"type":"기타수입","amount":5000},{"type":"생활","amount":-30000},{"type":"의료/건강","amount":-10000}]},{"date":2,"data":[{"type":"문화/여가","amount":-3000},{"type":"식비","amount":-50000},{"type":"쇼핑/뷰티","amount":-30000}]},{"date":3,"data":[{"type":"기타수입","amount":10000},{"type":"기타수입","amount":10000},{"type":"식비","amount":-3000}]},{"date":4,"data":[{"type":"기타수입","amount":50000},{"type":"월급","amount":15000},{"type":"쇼핑/뷰티","amount":-30000}]},{"date":5,"data":[{"type":"기타수입","amount":5000},{"type":"의료/건강","amount":-1000},{"type":"미분류","amount":-1000}]},{"date":6,"data":[{"type":"생활","amount":-30000},{"type":"문화/여가","amount":-50000},{"type":"식비","amount":-1000}]},{"date":7,"data":[{"type":"기타수입","amount":10000},{"type":"월급","amount":3000},{"type":"기타수입","amount":10000}]},{"date":8,"data":[{"type":"미분류","amount":-30000},{"type":"기타수입","amount":20000},{"type":"기타수입","amount":3000}]},{"date":9,"data":[{"type":"기타수입","amount":5000},{"type":"생활","amount":-50000},{"type":"교통","amount":-1000}]},{"date":10,"data":[{"type":"식비","amount":-10000},{"type":"월급","amount":5000},{"type":"용돈","amount":5000}]},{"date":11,"data":[{"type":"용돈","amount":5000},{"type":"문화/여가","amount":-50000},{"type":"용돈","amount":10000}]},{"date":12,"data":[{"type":"쇼핑/뷰티","amount":-30000},{"type":"문화/여가","amount":-1000},{"type":"쇼핑/뷰티","amount":-1000}]},{"date":13,"data":[{"type":"월급","amount":3000},{"type":"월급","amount":50000},{"type":"용돈","amount":5000}]},{"date":14,"data":[{"type":"월급","amount":15000},{"type":"용돈","amount":3000},{"type":"월급","amount":20000}]},{"date":15,"data":[{"type":"용돈","amount":5000},{"type":"쇼핑/뷰티","amount":-50000},{"type":"문화/여가","amount":-1000}]},{"date":16,"data":[{"type":"기타수입","amount":50000},{"type":"기타수입","amount":5000},{"type":"미분류","amount":-30000}]},{"date":17,"data":[{"type":"교통","amount":-5000},{"type":"월급","amount":5000},{"type":"기타수입","amount":3000}]},{"date":18,"data":[{"type":"교통","amount":-30000},{"type":"용돈","amount":50000},{"type":"쇼핑/뷰티","amount":-3000}]},{"date":19,"data":[{"type":"용돈","amount":5000},{"type":"교통","amount":-50000},{"type":"생활","amount":-30000}]},{"date":20,"data":[{"type":"기타수입","amount":20000},{"type":"월급","amount":5000},{"type":"기타수입","amount":50000}]},{"date":21,"data":[{"type":"식비","amount":-1000},{"type":"의료/건강","amount":-30000},{"type":"생활","amount":-3000}]},{"date":22,"data":[{"type":"기타수입","amount":10000},{"type":"월급","amount":50000},{"type":"의료/건강","amount":-5000}]},{"date":23,"data":[{"type":"식비","amount":-50000},{"type":"식비","amount":-50000},{"type":"식비","amount":-50000}]},{"date":24,"data":[{"type":"기타수입","amount":10000},{"type":"생활","amount":-10000},{"type":"월급","amount":15000}]},{"date":25,"data":[{"type":"식비","amount":-30000},{"type":"쇼핑/뷰티","amount":-50000},{"type":"용돈","amount":10000}]},{"date":26,"data":[{"type":"식비","amount":-10000},{"type":"쇼핑/뷰티","amount":-10000},{"type":"용돈","amount":20000}]},{"date":27,"data":[{"type":"식비","amount":-50000},{"type":"월급","amount":10000},{"type":"용돈","amount":10000}]},{"date":28,"data":[{"type":"쇼핑/뷰티","amount":-1000},{"type":"월급","amount":5000},{"type":"의료/건강","amount":-30000}]},{"date":29,"data":[{"type":"의료/건강","amount":-30000},{"type":"미분류","amount":-5000},{"type":"생활","amount":-3000}]},{"date":30,"data":[{"type":"용돈","amount":3000},{"type":"용돈","amount":20000},{"type":"기타수입","amount":50000}]},{"date":31,"data":[{"type":"기타수입","amount":5000},{"type":"기타수입","amount":10000},{"type":"쇼핑/뷰티","amount":-5000}]}]},{"month":11,"data":[{"date":1,"data":[{"type":"의료/건강","amount":-30000},{"type":"기타수입","amount":50000},{"type":"쇼핑/뷰티","amount":-5000}]},{"date":2,"data":[{"type":"기타수입","amount":50000},{"type":"식비","amount":-5000},{"type":"기타수입","amount":20000}]},{"date":3,"data":[{"type":"쇼핑/뷰티","amount":-1000},{"type":"용돈","amount":5000},{"type":"쇼핑/뷰티","amount":-30000}]},{"date":4,"data":[{"type":"문화/여가","amount":-5000},{"type":"용돈","amount":15000},{"type":"기타수입","amount":20000}]},{"date":5,"data":[{"type":"월급","amount":10000},{"type":"용돈","amount":15000},{"type":"용돈","amount":50000}]},{"date":6,"data":[{"type":"월급","amount":20000},{"type":"용돈","amount":3000},{"type":"용돈","amount":20000}]},{"date":7,"data":[{"type":"기타수입","amount":10000},{"type":"월급","amount":3000},{"type":"문화/여가","amount":-5000}]},{"date":8,"data":[{"type":"생활","amount":-5000},{"type":"쇼핑/뷰티","amount":-3000},{"type":"용돈","amount":50000}]},{"date":9,"data":[{"type":"쇼핑/뷰티","amount":-30000},{"type":"의료/건강","amount":-50000},{"type":"용돈","amount":5000}]},{"date":10,"data":[{"type":"용돈","amount":3000},{"type":"용돈","amount":50000},{"type":"월급","amount":10000}]},{"date":11,"data":[{"type":"생활","amount":-10000},{"type":"월급","amount":15000},{"type":"월급","amount":10000}]},{"date":12,"data":[{"type":"교통","amount":-30000},{"type":"용돈","amount":10000},{"type":"용돈","amount":5000}]},{"date":13,"data":[{"type":"식비","amount":-50000},{"type":"교통","amount":-50000},{"type":"기타수입","amount":20000}]},{"date":14,"data":[{"type":"기타수입","amount":15000},{"type":"의료/건강","amount":-30000},{"type":"생활","amount":-30000}]},{"date":15,"data":[{"type":"미분류","amount":-3000},{"type":"용돈","amount":15000},{"type":"의료/건강","amount":-30000}]},{"date":16,"data":[{"type":"미분류","amount":-50000},{"type":"생활","amount":-1000},{"type":"기타수입","amount":5000}]},{"date":17,"data":[{"type":"월급","amount":50000},{"type":"미분류","amount":-1000},{"type":"미분류","amount":-5000}]},{"date":18,"data":[{"type":"기타수입","amount":10000},{"type":"용돈","amount":5000},{"type":"용돈","amount":15000}]},{"date":19,"data":[{"type":"쇼핑/뷰티","amount":-30000},{"type":"의료/건강","amount":-5000},{"type":"미분류","amount":-10000}]},{"date":20,"data":[{"type":"교통","amount":-50000},{"type":"의료/건강","amount":-10000},{"type":"용돈","amount":5000}]},{"date":21,"data":[{"type":"교통","amount":-10000},{"type":"문화/여가","amount":-1000},{"type":"용돈","amount":20000}]},{"date":22,"data":[{"type":"월급","amount":3000},{"type":"생활","amount":-10000},{"type":"쇼핑/뷰티","amount":-10000}]},{"date":23,"data":[{"type":"용돈","amount":5000},{"type":"용돈","amount":50000},{"type":"기타수입","amount":50000}]},{"date":24,"data":[{"type":"문화/여가","amount":-30000},{"type":"기타수입","amount":5000},{"type":"미분류","amount":-50000}]},{"date":25,"data":[{"type":"의료/건강","amount":-30000},{"type":"교통","amount":-10000},{"type":"월급","amount":20000}]},{"date":26,"data":[{"type":"월급","amount":10000},{"type":"생활","amount":-1000},{"type":"의료/건강","amount":-1000}]},{"date":27,"data":[{"type":"의료/건강","amount":-3000},{"type":"용돈","amount":50000},{"type":"교통","amount":-50000}]},{"date":28,"data":[{"type":"기타수입","amount":20000},{"type":"문화/여가","amount":-10000},{"type":"의료/건강","amount":-50000}]},{"date":29,"data":[{"type":"쇼핑/뷰티","amount":-3000},{"type":"식비","amount":-10000},{"type":"식비","amount":-50000}]},{"date":30,"data":[{"type":"월급","amount":20000},{"type":"생활","amount":-30000},{"type":"의료/건강","amount":-3000}]},{"date":31,"data":[{"type":"기타수입","amount":3000},{"type":"월급","amount":10000},{"type":"생활","amount":-10000}]}]},{"month":12,"data":[{"date":1,"data":[{"type":"월급","amount":20000},{"type":"쇼핑/뷰티","amount":-1000},{"type":"기타수입","amount":50000}]},{"date":2,"data":[{"type":"용돈","amount":10000},{"type":"문화/여가","amount":-30000},{"type":"월급","amount":15000}]},{"date":3,"data":[{"type":"월급","amount":10000},{"type":"쇼핑/뷰티","amount":-30000},{"type":"기타수입","amount":3000}]},{"date":4,"data":[{"type":"용돈","amount":20000},{"type":"교통","amount":-5000},{"type":"교통","amount":-30000}]},{"date":5,"data":[{"type":"교통","amount":-10000},{"type":"미분류","amount":-1000},{"type":"기타수입","amount":5000}]},{"date":6,"data":[{"type":"쇼핑/뷰티","amount":-10000},{"type":"문화/여가","amount":-1000},{"type":"기타수입","amount":10000}]},{"date":7,"data":[{"type":"의료/건강","amount":-50000},{"type":"쇼핑/뷰티","amount":-5000},{"type":"쇼핑/뷰티","amount":-10000}]},{"date":8,"data":[{"type":"생활","amount":-5000},{"type":"기타수입","amount":3000},{"type":"용돈","amount":15000}]},{"date":9,"data":[{"type":"기타수입","amount":3000},{"type":"월급","amount":20000},{"type":"기타수입","amount":3000}]},{"date":10,"data":[{"type":"생활","amount":-50000},{"type":"쇼핑/뷰티","amount":-3000},{"type":"월급","amount":15000}]},{"date":11,"data":[{"type":"미분류","amount":-50000},{"type":"용돈","amount":50000},{"type":"미분류","amount":-3000}]},{"date":12,"data":[{"type":"월급","amount":5000},{"type":"용돈","amount":5000},{"type":"월급","amount":50000}]},{"date":13,"data":[{"type":"미분류","amount":-10000},{"type":"월급","amount":15000},{"type":"용돈","amount":10000}]},{"date":14,"data":[{"type":"미분류","amount":-50000},{"type":"기타수입","amount":20000},{"type":"식비","amount":-30000}]},{"date":15,"data":[{"type":"생활","amount":-3000},{"type":"문화/여가","amount":-3000},{"type":"생활","amount":-1000}]},{"date":16,"data":[{"type":"월급","amount":10000},{"type":"의료/건강","amount":-5000},{"type":"의료/건강","amount":-50000}]},{"date":17,"data":[{"type":"기타수입","amount":50000},{"type":"용돈","amount":3000},{"type":"교통","amount":-5000}]},{"date":18,"data":[{"type":"생활","amount":-50000},{"type":"기타수입","amount":10000},{"type":"월급","amount":3000}]},{"date":19,"data":[{"type":"미분류","amount":-50000},{"type":"기타수입","amount":3000},{"type":"의료/건강","amount":-10000}]},{"date":20,"data":[{"type":"쇼핑/뷰티","amount":-1000},{"type":"교통","amount":-5000},{"type":"문화/여가","amount":-5000}]},{"date":21,"data":[{"type":"문화/여가","amount":-1000},{"type":"기타수입","amount":50000},{"type":"생활","amount":-10000}]},{"date":22,"data":[{"type":"용돈","amount":10000},{"type":"의료/건강","amount":-3000},{"type":"식비","amount":-10000}]},{"date":23,"data":[{"type":"생활","amount":-50000},{"type":"월급","amount":5000},{"type":"용돈","amount":10000}]},{"date":24,"data":[{"type":"교통","amount":-1000},{"type":"의료/건강","amount":-3000},{"type":"기타수입","amount":20000}]},{"date":25,"data":[{"type":"기타수입","amount":20000},{"type":"미분류","amount":-50000},{"type":"기타수입","amount":15000}]},{"date":26,"data":[{"type":"미분류","amount":-5000},{"type":"미분류","amount":-50000},{"type":"용돈","amount":5000}]},{"date":27,"data":[{"type":"의료/건강","amount":-10000},{"type":"의료/건강","amount":-30000},{"type":"기타수입","amount":15000}]},{"date":28,"data":[{"type":"용돈","amount":50000},{"type":"의료/건강","amount":-5000},{"type":"기타수입","amount":15000}]},{"date":29,"data":[{"type":"교통","amount":-30000},{"type":"식비","amount":-3000},{"type":"미분류","amount":-5000}]},{"date":30,"data":[{"type":"의료/건강","amount":-1000},{"type":"용돈","amount":15000},{"type":"용돈","amount":5000}]},{"date":31,"data":[{"type":"월급","amount":5000},{"type":"쇼핑/뷰티","amount":-50000},{"type":"용돈","amount":20000}]}]}]')}])})); \ No newline at end of file