diff --git a/CTFd/themes/core/assets/js/pages/scoreboard.js b/CTFd/themes/core/assets/js/pages/scoreboard.js index a726c9e..1324506 100644 --- a/CTFd/themes/core/assets/js/pages/scoreboard.js +++ b/CTFd/themes/core/assets/js/pages/scoreboard.js @@ -12,7 +12,7 @@ const config = { responsive: true }; const layout = { - title: "Top 10 Teams", + title: "Top 10 " + (window.userMode === "teams" ? "Teams" : "Users"), paper_bgcolor: "rgba(0,0,0,0)", plot_bgcolor: "rgba(0,0,0,0)", hovermode: "closest", diff --git a/CTFd/themes/core/static/js/pages/scoreboard.dev.js b/CTFd/themes/core/static/js/pages/scoreboard.dev.js index b32426d..8c46586 100644 --- a/CTFd/themes/core/static/js/pages/scoreboard.dev.js +++ b/CTFd/themes/core/static/js/pages/scoreboard.dev.js @@ -162,7 +162,7 @@ /***/ (function(module, exports, __webpack_require__) { ; -eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/core/assets/js/pages/main.js\");\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! ../CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _plotly = _interopRequireDefault(__webpack_require__(/*! plotly.js-basic-dist */ \"./node_modules/plotly.js-basic-dist/plotly-basic.js\"));\n\nvar _moment = _interopRequireDefault(__webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\"));\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar graph = (0, _jquery.default)(\"#score-graph\");\nvar table = (0, _jquery.default)(\"#scoreboard tbody\");\nvar config = {\n displaylogo: false,\n responsive: true\n};\nvar layout = {\n title: \"Top 10 Teams\",\n paper_bgcolor: \"rgba(0,0,0,0)\",\n plot_bgcolor: \"rgba(0,0,0,0)\",\n hovermode: \"closest\",\n xaxis: {\n showgrid: false,\n showspikes: true\n },\n yaxis: {\n showgrid: false,\n showspikes: true\n },\n legend: {\n orientation: \"h\"\n }\n};\n\nvar updateScores = function updateScores() {\n _CTFd.default.api.get_scoreboard_list().then(function (response) {\n var teams = response.data;\n table.empty();\n\n for (var i = 0; i < teams.length; i++) {\n var row = [\"\", '', i + 1, \"\", ''.format(_CTFd.default.config.urlRoot, teams[i].account_id), (0, _utils.htmlEntities)(teams[i].name), \"\", \"\", teams[i].score, \"\", \"\"].join(\"\");\n table.append(row);\n }\n });\n};\n\nvar createGraph = function createGraph() {\n _CTFd.default.api.get_scoreboard_detail({\n count: 10\n }).then(function (response) {\n var places = response.data;\n var teams = Object.keys(places);\n var traces = [];\n\n if (teams.length === 0) {\n // Replace spinner\n graph.html('

No solves yet

');\n return;\n }\n\n for (var i = 0; i < teams.length; i++) {\n var team_score = [];\n var times = [];\n\n for (var j = 0; j < places[teams[i]][\"solves\"].length; j++) {\n team_score.push(places[teams[i]][\"solves\"][j].value);\n var date = (0, _moment.default)(places[teams[i]][\"solves\"][j].date);\n times.push(date.toDate());\n }\n\n var trace = {\n x: times,\n y: (0, _utils.cumulativeSum)(team_score),\n mode: \"lines+markers\",\n name: places[teams[i]][\"name\"],\n marker: {\n color: (0, _utils.colorHash)(places[teams[i]][\"name\"] + places[teams[i]][\"id\"])\n },\n line: {\n color: (0, _utils.colorHash)(places[teams[i]][\"name\"] + places[teams[i]][\"id\"])\n }\n };\n traces.push(trace);\n }\n\n traces.sort(function (a, b) {\n var score_diff = b[\"y\"][b[\"y\"].length - 1] - a[\"y\"][a[\"y\"].length - 1];\n\n if (!score_diff) {\n return a[\"x\"][a[\"x\"].length - 1] - b[\"x\"][b[\"x\"].length - 1];\n }\n\n return score_diff;\n });\n graph.empty(); // Remove spinners\n\n graph[0].fn = \"CTFd_scoreboard_\" + new Date().toISOString().slice(0, 19);\n\n _plotly.default.newPlot(graph[0], traces, layout, config);\n });\n};\n\nvar updateGraph = function updateGraph() {\n _CTFd.default.api.get_scoreboard_detail({\n count: 10\n }).then(function (response) {\n var places = response.data;\n var teams = Object.keys(places);\n var traces = [];\n\n if (teams.length === 0) {\n return;\n }\n\n for (var i = 0; i < teams.length; i++) {\n var team_score = [];\n var times = [];\n\n for (var j = 0; j < places[teams[i]][\"solves\"].length; j++) {\n team_score.push(places[teams[i]][\"solves\"][j].value);\n var date = (0, _moment.default)(places[teams[i]][\"solves\"][j].date);\n times.push(date.toDate());\n }\n\n var trace = {\n x: times,\n y: (0, _utils.cumulativeSum)(team_score),\n mode: \"lines+markers\",\n name: places[teams[i]][\"name\"],\n marker: {\n color: (0, _utils.colorHash)(places[teams[i]][\"name\"] + places[teams[i]][\"id\"])\n },\n line: {\n color: (0, _utils.colorHash)(places[teams[i]][\"name\"] + places[teams[i]][\"id\"])\n }\n };\n traces.push(trace);\n }\n\n traces.sort(function (a, b) {\n var score_diff = b[\"y\"][b[\"y\"].length - 1] - a[\"y\"][a[\"y\"].length - 1];\n\n if (!score_diff) {\n return a[\"x\"][a[\"x\"].length - 1] - b[\"x\"][b[\"x\"].length - 1];\n }\n\n return score_diff;\n });\n\n _plotly.default.react(graph[0], traces, layout, config);\n });\n};\n\nfunction update() {\n updateScores();\n updateGraph();\n}\n\n(0, _jquery.default)(function () {\n setInterval(update, 300000); // Update scores every 5 minutes\n\n createGraph();\n updateGraph();\n});\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/scoreboard.js?"); +eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/core/assets/js/pages/main.js\");\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! ../CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _plotly = _interopRequireDefault(__webpack_require__(/*! plotly.js-basic-dist */ \"./node_modules/plotly.js-basic-dist/plotly-basic.js\"));\n\nvar _moment = _interopRequireDefault(__webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\"));\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar graph = (0, _jquery.default)(\"#score-graph\");\nvar table = (0, _jquery.default)(\"#scoreboard tbody\");\nvar config = {\n displaylogo: false,\n responsive: true\n};\nvar layout = {\n title: \"Top 10 \" + (window.userMode === \"teams\" ? \"Teams\" : \"Users\"),\n paper_bgcolor: \"rgba(0,0,0,0)\",\n plot_bgcolor: \"rgba(0,0,0,0)\",\n hovermode: \"closest\",\n xaxis: {\n showgrid: false,\n showspikes: true\n },\n yaxis: {\n showgrid: false,\n showspikes: true\n },\n legend: {\n orientation: \"h\"\n }\n};\n\nvar updateScores = function updateScores() {\n _CTFd.default.api.get_scoreboard_list().then(function (response) {\n var teams = response.data;\n table.empty();\n\n for (var i = 0; i < teams.length; i++) {\n var row = [\"\", '', i + 1, \"\", ''.format(_CTFd.default.config.urlRoot, teams[i].account_id), (0, _utils.htmlEntities)(teams[i].name), \"\", \"\", teams[i].score, \"\", \"\"].join(\"\");\n table.append(row);\n }\n });\n};\n\nvar createGraph = function createGraph() {\n _CTFd.default.api.get_scoreboard_detail({\n count: 10\n }).then(function (response) {\n var places = response.data;\n var teams = Object.keys(places);\n var traces = [];\n\n if (teams.length === 0) {\n // Replace spinner\n graph.html('

No solves yet

');\n return;\n }\n\n for (var i = 0; i < teams.length; i++) {\n var team_score = [];\n var times = [];\n\n for (var j = 0; j < places[teams[i]][\"solves\"].length; j++) {\n team_score.push(places[teams[i]][\"solves\"][j].value);\n var date = (0, _moment.default)(places[teams[i]][\"solves\"][j].date);\n times.push(date.toDate());\n }\n\n var trace = {\n x: times,\n y: (0, _utils.cumulativeSum)(team_score),\n mode: \"lines+markers\",\n name: places[teams[i]][\"name\"],\n marker: {\n color: (0, _utils.colorHash)(places[teams[i]][\"name\"] + places[teams[i]][\"id\"])\n },\n line: {\n color: (0, _utils.colorHash)(places[teams[i]][\"name\"] + places[teams[i]][\"id\"])\n }\n };\n traces.push(trace);\n }\n\n traces.sort(function (a, b) {\n var score_diff = b[\"y\"][b[\"y\"].length - 1] - a[\"y\"][a[\"y\"].length - 1];\n\n if (!score_diff) {\n return a[\"x\"][a[\"x\"].length - 1] - b[\"x\"][b[\"x\"].length - 1];\n }\n\n return score_diff;\n });\n graph.empty(); // Remove spinners\n\n graph[0].fn = \"CTFd_scoreboard_\" + new Date().toISOString().slice(0, 19);\n\n _plotly.default.newPlot(graph[0], traces, layout, config);\n });\n};\n\nvar updateGraph = function updateGraph() {\n _CTFd.default.api.get_scoreboard_detail({\n count: 10\n }).then(function (response) {\n var places = response.data;\n var teams = Object.keys(places);\n var traces = [];\n\n if (teams.length === 0) {\n return;\n }\n\n for (var i = 0; i < teams.length; i++) {\n var team_score = [];\n var times = [];\n\n for (var j = 0; j < places[teams[i]][\"solves\"].length; j++) {\n team_score.push(places[teams[i]][\"solves\"][j].value);\n var date = (0, _moment.default)(places[teams[i]][\"solves\"][j].date);\n times.push(date.toDate());\n }\n\n var trace = {\n x: times,\n y: (0, _utils.cumulativeSum)(team_score),\n mode: \"lines+markers\",\n name: places[teams[i]][\"name\"],\n marker: {\n color: (0, _utils.colorHash)(places[teams[i]][\"name\"] + places[teams[i]][\"id\"])\n },\n line: {\n color: (0, _utils.colorHash)(places[teams[i]][\"name\"] + places[teams[i]][\"id\"])\n }\n };\n traces.push(trace);\n }\n\n traces.sort(function (a, b) {\n var score_diff = b[\"y\"][b[\"y\"].length - 1] - a[\"y\"][a[\"y\"].length - 1];\n\n if (!score_diff) {\n return a[\"x\"][a[\"x\"].length - 1] - b[\"x\"][b[\"x\"].length - 1];\n }\n\n return score_diff;\n });\n\n _plotly.default.react(graph[0], traces, layout, config);\n });\n};\n\nfunction update() {\n updateScores();\n updateGraph();\n}\n\n(0, _jquery.default)(function () {\n setInterval(update, 300000); // Update scores every 5 minutes\n\n createGraph();\n updateGraph();\n});\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/scoreboard.js?"); /***/ }) diff --git a/CTFd/themes/core/static/js/pages/scoreboard.min.js b/CTFd/themes/core/static/js/pages/scoreboard.min.js index 9a918cc..5fbbc6b 100644 --- a/CTFd/themes/core/static/js/pages/scoreboard.min.js +++ b/CTFd/themes/core/static/js/pages/scoreboard.min.js @@ -1 +1 @@ -!function(l){function e(e){for(var o,t,n=e[0],s=e[1],i=e[2],a=0,r=[];a".concat(e.body,"

")):t.find(".modal-body").append((0,r.default)(e.body));var n=(0,r.default)(c.format(e.button));return e.success&&(0,r.default)(n).click(function(){e.success()}),e.large&&t.find(".modal-dialog").addClass("modal-lg"),t.find(".modal-footer").append(n),(0,r.default)("main").append(t),t.modal("show"),(0,r.default)(t).on("hidden.bs.modal",function(){(0,r.default)(this).modal("dispose")}),t}function f(e){(0,r.default)("#ezq--notifications-toast-container").length||(0,r.default)("body").append((0,r.default)("
").attr({id:"ezq--notifications-toast-container"}).css({position:"fixed",bottom:"0",right:"0","min-width":"20%"}));var o=l.format(e.title,e.body),t=(0,r.default)(o);if(e.onclose&&(0,r.default)(t).find("button[data-dismiss=toast]").click(function(){e.onclose()}),e.onclick){var n=(0,r.default)(t).find(".toast-body");n.addClass("cursor-pointer"),n.click(function(){e.onclick()})}var s=!1!==e.autohide,i=!1!==e.animation,a=e.delay||1e4;return(0,r.default)("#ezq--notifications-toast-container").prepend(t),t.toast({autohide:s,delay:a,animation:i}),t.toast("show"),t}function j(e){var o=i.format(e.title),t=(0,r.default)(o);"string"==typeof e.body?t.find(".modal-body").append("

".concat(e.body,"

")):t.find(".modal-body").append((0,r.default)(e.body));var n=(0,r.default)(u),s=(0,r.default)(m);return t.find(".modal-footer").append(s),t.find(".modal-footer").append(n),(0,r.default)("main").append(t),(0,r.default)(t).on("hidden.bs.modal",function(){(0,r.default)(this).modal("dispose")}),(0,r.default)(n).click(function(){e.success()}),t.modal("show"),t}function h(e){if(e.target){var o=(0,r.default)(e.target);return o.find(".progress-bar").css("width",e.width+"%"),o}var t=a.format(e.width),n=i.format(e.title),s=(0,r.default)(n);return s.find(".modal-body").append((0,r.default)(t)),(0,r.default)("main").append(s),s.modal("show")}function _(e){var o={success:d,error:s}[e.type].format(e.body);return(0,r.default)(o)}var v={ezAlert:p,ezToast:f,ezQuery:j,ezProgressBar:h,ezBadge:_};o.default=v},"./CTFd/themes/core/assets/js/fetch.js":function(e,o,t){Object.defineProperty(o,"__esModule",{value:!0}),o.default=void 0,t("./node_modules/whatwg-fetch/fetch.js");var n,s=(n=t("./CTFd/themes/core/assets/js/config.js"))&&n.__esModule?n:{default:n};var i=window.fetch;o.default=function(e,o){return void 0===o&&(o={method:"GET",credentials:"same-origin",headers:{}}),e=s.default.urlRoot+e,void 0===o.headers&&(o.headers={}),o.credentials="same-origin",o.headers.Accept="application/json",o.headers["Content-Type"]="application/json",o.headers["CSRF-Token"]=s.default.csrfNonce,i(e,o)}},"./CTFd/themes/core/assets/js/pages/main.js":function(e,o,t){var n=p(t("./CTFd/themes/core/assets/js/CTFd.js")),s=p(t("./node_modules/jquery/dist/jquery.js")),i=p(t("./node_modules/moment/moment.js")),a=p(t("./node_modules/nunjucks/browser/nunjucks.js")),r=t("./node_modules/howler/dist/howler.js"),l=p(t("./CTFd/themes/core/assets/js/events.js")),d=p(t("./CTFd/themes/core/assets/js/config.js")),c=p(t("./CTFd/themes/core/assets/js/styles.js")),m=p(t("./CTFd/themes/core/assets/js/times.js")),u=p(t("./CTFd/themes/core/assets/js/helpers.js"));function p(e){return e&&e.__esModule?e:{default:e}}n.default.init(window.init),window.CTFd=n.default,window.helpers=u.default,window.$=s.default,window.Moment=i.default,window.nunjucks=a.default,window.Howl=r.Howl,(0,s.default)(function(){(0,c.default)(),(0,m.default)(),(0,l.default)(d.default.urlRoot)})},"./CTFd/themes/core/assets/js/pages/scoreboard.js":function(e,o,t){t("./CTFd/themes/core/assets/js/pages/main.js");var n=i(t("./node_modules/jquery/dist/jquery.js")),s=i(t("./CTFd/themes/core/assets/js/CTFd.js")),c=i(t("./node_modules/plotly.js-basic-dist/plotly-basic.js")),m=i(t("./node_modules/moment/moment.js")),u=t("./CTFd/themes/core/assets/js/utils.js");function i(e){return e&&e.__esModule?e:{default:e}}function a(){s.default.api.get_scoreboard_detail({count:10}).then(function(e){var o=e.data,t=Object.keys(o),n=[];if(0!==t.length){for(var s=0;s",'',t+1,"",''.format(s.default.config.urlRoot,o[t].account_id),(0,u.htmlEntities)(o[t].name),"","",o[t].score,"",""].join("");r.append(n)}}),a()}(0,n.default)(function(){setInterval(l,3e5),s.default.api.get_scoreboard_detail({count:10}).then(function(e){var o=e.data,t=Object.keys(o),n=[];if(0!==t.length){for(var s=0;s

No solves yet

')}),a()})},"./CTFd/themes/core/assets/js/patch.js":function(e,o,t){var n,r=(n=t("./node_modules/q/q.js"))&&n.__esModule?n:{default:n},s=t("./CTFd/themes/core/assets/js/api.js");function i(e,o,t){return o in e?Object.defineProperty(e,o,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[o]=t,e}function l(e,o){return function(o){for(var e=1;e>8*s&255).toString(16)).substr(-2)}return n},o.htmlEntities=function(e){return(0,i.default)("
").text(e).html()},o.cumulativeSum=function(e){for(var o=e.concat(),t=0;t".concat(e.body,"

")):t.find(".modal-body").append((0,r.default)(e.body));var n=(0,r.default)(c.format(e.button));return e.success&&(0,r.default)(n).click(function(){e.success()}),e.large&&t.find(".modal-dialog").addClass("modal-lg"),t.find(".modal-footer").append(n),(0,r.default)("main").append(t),t.modal("show"),(0,r.default)(t).on("hidden.bs.modal",function(){(0,r.default)(this).modal("dispose")}),t}function f(e){(0,r.default)("#ezq--notifications-toast-container").length||(0,r.default)("body").append((0,r.default)("
").attr({id:"ezq--notifications-toast-container"}).css({position:"fixed",bottom:"0",right:"0","min-width":"20%"}));var o=l.format(e.title,e.body),t=(0,r.default)(o);if(e.onclose&&(0,r.default)(t).find("button[data-dismiss=toast]").click(function(){e.onclose()}),e.onclick){var n=(0,r.default)(t).find(".toast-body");n.addClass("cursor-pointer"),n.click(function(){e.onclick()})}var s=!1!==e.autohide,i=!1!==e.animation,a=e.delay||1e4;return(0,r.default)("#ezq--notifications-toast-container").prepend(t),t.toast({autohide:s,delay:a,animation:i}),t.toast("show"),t}function j(e){var o=i.format(e.title),t=(0,r.default)(o);"string"==typeof e.body?t.find(".modal-body").append("

".concat(e.body,"

")):t.find(".modal-body").append((0,r.default)(e.body));var n=(0,r.default)(u),s=(0,r.default)(m);return t.find(".modal-footer").append(s),t.find(".modal-footer").append(n),(0,r.default)("main").append(t),(0,r.default)(t).on("hidden.bs.modal",function(){(0,r.default)(this).modal("dispose")}),(0,r.default)(n).click(function(){e.success()}),t.modal("show"),t}function h(e){if(e.target){var o=(0,r.default)(e.target);return o.find(".progress-bar").css("width",e.width+"%"),o}var t=a.format(e.width),n=i.format(e.title),s=(0,r.default)(n);return s.find(".modal-body").append((0,r.default)(t)),(0,r.default)("main").append(s),s.modal("show")}function _(e){var o={success:d,error:s}[e.type].format(e.body);return(0,r.default)(o)}var v={ezAlert:p,ezToast:f,ezQuery:j,ezProgressBar:h,ezBadge:_};o.default=v},"./CTFd/themes/core/assets/js/fetch.js":function(e,o,t){Object.defineProperty(o,"__esModule",{value:!0}),o.default=void 0,t("./node_modules/whatwg-fetch/fetch.js");var n,s=(n=t("./CTFd/themes/core/assets/js/config.js"))&&n.__esModule?n:{default:n};var i=window.fetch;o.default=function(e,o){return void 0===o&&(o={method:"GET",credentials:"same-origin",headers:{}}),e=s.default.urlRoot+e,void 0===o.headers&&(o.headers={}),o.credentials="same-origin",o.headers.Accept="application/json",o.headers["Content-Type"]="application/json",o.headers["CSRF-Token"]=s.default.csrfNonce,i(e,o)}},"./CTFd/themes/core/assets/js/pages/main.js":function(e,o,t){var n=p(t("./CTFd/themes/core/assets/js/CTFd.js")),s=p(t("./node_modules/jquery/dist/jquery.js")),i=p(t("./node_modules/moment/moment.js")),a=p(t("./node_modules/nunjucks/browser/nunjucks.js")),r=t("./node_modules/howler/dist/howler.js"),l=p(t("./CTFd/themes/core/assets/js/events.js")),d=p(t("./CTFd/themes/core/assets/js/config.js")),c=p(t("./CTFd/themes/core/assets/js/styles.js")),m=p(t("./CTFd/themes/core/assets/js/times.js")),u=p(t("./CTFd/themes/core/assets/js/helpers.js"));function p(e){return e&&e.__esModule?e:{default:e}}n.default.init(window.init),window.CTFd=n.default,window.helpers=u.default,window.$=s.default,window.Moment=i.default,window.nunjucks=a.default,window.Howl=r.Howl,(0,s.default)(function(){(0,c.default)(),(0,m.default)(),(0,l.default)(d.default.urlRoot)})},"./CTFd/themes/core/assets/js/pages/scoreboard.js":function(e,o,t){t("./CTFd/themes/core/assets/js/pages/main.js");var n=i(t("./node_modules/jquery/dist/jquery.js")),s=i(t("./CTFd/themes/core/assets/js/CTFd.js")),c=i(t("./node_modules/plotly.js-basic-dist/plotly-basic.js")),m=i(t("./node_modules/moment/moment.js")),u=t("./CTFd/themes/core/assets/js/utils.js");function i(e){return e&&e.__esModule?e:{default:e}}function a(){s.default.api.get_scoreboard_detail({count:10}).then(function(e){var o=e.data,t=Object.keys(o),n=[];if(0!==t.length){for(var s=0;s",'',t+1,"",''.format(s.default.config.urlRoot,o[t].account_id),(0,u.htmlEntities)(o[t].name),"","",o[t].score,"",""].join("");r.append(n)}}),a()}(0,n.default)(function(){setInterval(l,3e5),s.default.api.get_scoreboard_detail({count:10}).then(function(e){var o=e.data,t=Object.keys(o),n=[];if(0!==t.length){for(var s=0;s

No solves yet

')}),a()})},"./CTFd/themes/core/assets/js/patch.js":function(e,o,t){var n,r=(n=t("./node_modules/q/q.js"))&&n.__esModule?n:{default:n},s=t("./CTFd/themes/core/assets/js/api.js");function i(e,o,t){return o in e?Object.defineProperty(e,o,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[o]=t,e}function l(e,o){return function(o){for(var e=1;e>8*s&255).toString(16)).substr(-2)}return n},o.htmlEntities=function(e){return(0,i.default)("
").text(e).html()},o.cumulativeSum=function(e){for(var o=e.concat(),t=0;t