From c2eca90b05737fabac178a742b96ff49513f0cc2 Mon Sep 17 00:00:00 2001 From: Kevin Chung Date: Tue, 4 Jul 2023 03:21:35 -0400 Subject: [PATCH] Add API interface to mark submissions as correct (#2350) * Add the `discard` type for submissions * Add `PATCH /api/v1/submissions/[submission_id]` to mark submissions as correct * Closes #181 --- CTFd/api/v1/statistics/challenges.py | 7 +- CTFd/api/v1/submissions.py | 51 +++++++- CTFd/models/__init__.py | 4 + .../admin/assets/js/pages/submissions.js | 33 +++++ CTFd/themes/admin/assets/js/pages/team.js | 35 ++++++ CTFd/themes/admin/assets/js/pages/user.js | 35 ++++++ .../admin/static/js/pages/submissions.dev.js | 2 +- .../admin/static/js/pages/submissions.min.js | 2 +- CTFd/themes/admin/static/js/pages/team.dev.js | 2 +- CTFd/themes/admin/static/js/pages/team.min.js | 2 +- CTFd/themes/admin/static/js/pages/user.dev.js | 2 +- CTFd/themes/admin/static/js/pages/user.min.js | 2 +- CTFd/themes/admin/templates/submissions.html | 5 + CTFd/themes/admin/templates/teams/team.html | 5 +- CTFd/themes/admin/templates/users/user.html | 7 +- tests/api/v1/test_submissions.py | 117 ++++++++++++++++++ 16 files changed, 298 insertions(+), 13 deletions(-) diff --git a/CTFd/api/v1/statistics/challenges.py b/CTFd/api/v1/statistics/challenges.py index 1d762937..e1fad4d5 100644 --- a/CTFd/api/v1/statistics/challenges.py +++ b/CTFd/api/v1/statistics/challenges.py @@ -80,7 +80,12 @@ class ChallengeSolvePercentages(Resource): @admins_only def get(self): challenges = ( - Challenges.query.add_columns("id", "name", "state", "max_attempts") + Challenges.query.add_columns( + Challenges.id, + Challenges.name, + Challenges.state, + Challenges.max_attempts, + ) .order_by(Challenges.value) .all() ) diff --git a/CTFd/api/v1/submissions.py b/CTFd/api/v1/submissions.py index a5494d30..263c71ff 100644 --- a/CTFd/api/v1/submissions.py +++ b/CTFd/api/v1/submissions.py @@ -1,5 +1,6 @@ from typing import List +from flask import request from flask_restx import Namespace, Resource from CTFd.api.v1.helpers.request import validate_args @@ -10,7 +11,7 @@ from CTFd.api.v1.schemas import ( ) from CTFd.cache import clear_challenges, clear_standings from CTFd.constants import RawEnum -from CTFd.models import Submissions, db +from CTFd.models import Solves, Submissions, db from CTFd.schemas.submissions import SubmissionSchema from CTFd.utils.decorators import admins_only from CTFd.utils.helpers.models import build_model_filters @@ -152,7 +153,7 @@ class SubmissionsList(Resource): class Submission(Resource): @admins_only @submissions_namespace.doc( - description="Endpoint to get submission objects in bulk", + description="Endpoint to get a submission object", responses={ 200: ("Success", "SubmissionDetailedSuccessResponse"), 400: ( @@ -173,7 +174,51 @@ class Submission(Resource): @admins_only @submissions_namespace.doc( - description="Endpoint to get submission objects in bulk", + description="Endpoint to edit a submission object", + responses={ + 200: ("Success", "SubmissionDetailedSuccessResponse"), + 400: ( + "An error occured processing the provided or stored data", + "APISimpleErrorResponse", + ), + }, + ) + def patch(self, submission_id): + submission = Submissions.query.filter_by(id=submission_id).first_or_404() + + req = request.get_json() + submission_type = req.get("type") + + if submission_type == "correct": + solve = Solves( + user_id=submission.user_id, + challenge_id=submission.challenge_id, + team_id=submission.team_id, + ip=submission.ip, + provided=submission.provided, + date=submission.date, + ) + db.session.add(solve) + submission.type = "discard" + db.session.commit() + + # Delete standings cache + clear_standings() + clear_challenges() + + submission = solve + + schema = SubmissionSchema() + response = schema.dump(submission) + + if response.errors: + return {"success": False, "errors": response.errors}, 400 + + return {"success": True, "data": response.data} + + @admins_only + @submissions_namespace.doc( + description="Endpoint to delete a submission object", responses={ 200: ("Success", "APISimpleSuccessResponse"), 400: ( diff --git a/CTFd/models/__init__.py b/CTFd/models/__init__.py index d7a9fef0..124bb179 100644 --- a/CTFd/models/__init__.py +++ b/CTFd/models/__init__.py @@ -849,6 +849,10 @@ class Fails(Submissions): __mapper_args__ = {"polymorphic_identity": "incorrect"} +class Discards(Submissions): + __mapper_args__ = {"polymorphic_identity": "discard"} + + class Unlocks(db.Model): __tablename__ = "unlocks" id = db.Column(db.Integer, primary_key=True) diff --git a/CTFd/themes/admin/assets/js/pages/submissions.js b/CTFd/themes/admin/assets/js/pages/submissions.js index 0ec44362..a428dc0e 100644 --- a/CTFd/themes/admin/assets/js/pages/submissions.js +++ b/CTFd/themes/admin/assets/js/pages/submissions.js @@ -61,6 +61,38 @@ function deleteSelectedSubmissions(_event) { }); } +function correctSubmissions(_event) { + let submissionIDs = $("input[data-submission-id]:checked").map(function() { + return $(this).data("submission-id"); + }); + let target = submissionIDs.length === 1 ? "submission" : "submissions"; + + ezQuery({ + title: "Correct Submissions", + body: `Are you sure you want to mark ${ + submissionIDs.length + } ${target} correct?`, + success: function() { + const reqs = []; + for (var subId of submissionIDs) { + let req = CTFd.fetch(`/api/v1/submissions/${subId}`, { + method: "PATCH", + credentials: "same-origin", + headers: { + Accept: "application/json", + "Content-Type": "application/json" + }, + body: JSON.stringify({ type: "correct" }) + }); + reqs.push(req); + } + Promise.all(reqs).then(_responses => { + window.location.reload(); + }); + } + }); +} + function showFlagsToggle(_event) { const urlParams = new URLSearchParams(window.location.search); if (urlParams.has("full")) { @@ -110,6 +142,7 @@ $(() => { $("#show-short-flags-button").click(showFlagsToggle); $(".show-flag").click(showFlag); $(".copy-flag").click(copyFlag); + $("#correct-flags-button").click(correctSubmissions); $(".delete-correct-submission").click(deleteCorrectSubmission); $("#submission-delete-button").click(deleteSelectedSubmissions); }); diff --git a/CTFd/themes/admin/assets/js/pages/team.js b/CTFd/themes/admin/assets/js/pages/team.js index 5a9a6067..02efded8 100644 --- a/CTFd/themes/admin/assets/js/pages/team.js +++ b/CTFd/themes/admin/assets/js/pages/team.js @@ -112,6 +112,39 @@ function updateTeam(event) { }); } +function correctSubmissions(_event) { + let submissions = $("input[data-submission-type=incorrect]:checked"); + let submissionIDs = submissions.map(function() { + return $(this).data("submission-id"); + }); + let target = submissionIDs.length === 1 ? "submission" : "submissions"; + + ezQuery({ + title: "Correct Submissions", + body: `Are you sure you want to mark ${ + submissionIDs.length + } ${target} correct?`, + success: function() { + const reqs = []; + for (var subId of submissionIDs) { + let req = CTFd.fetch(`/api/v1/submissions/${subId}`, { + method: "PATCH", + credentials: "same-origin", + headers: { + Accept: "application/json", + "Content-Type": "application/json" + }, + body: JSON.stringify({ type: "correct" }) + }); + reqs.push(req); + } + Promise.all(reqs).then(_responses => { + window.location.reload(); + }); + } + }); +} + function deleteSelectedSubmissions(event, target) { let submissions; let type; @@ -529,6 +562,8 @@ $(() => { deleteSelectedSubmissions(e, "solves"); }); + $("#correct-fail-button").click(correctSubmissions); + $("#fails-delete-button").click(function(e) { deleteSelectedSubmissions(e, "fails"); }); diff --git a/CTFd/themes/admin/assets/js/pages/user.js b/CTFd/themes/admin/assets/js/pages/user.js index bfd1b9a6..a4810faf 100644 --- a/CTFd/themes/admin/assets/js/pages/user.js +++ b/CTFd/themes/admin/assets/js/pages/user.js @@ -225,6 +225,39 @@ function emailUser(event) { }); } +function correctSubmissions(_event) { + let submissions = $("input[data-submission-type=incorrect]:checked"); + let submissionIDs = submissions.map(function() { + return $(this).data("submission-id"); + }); + let target = submissionIDs.length === 1 ? "submission" : "submissions"; + + ezQuery({ + title: "Correct Submissions", + body: `Are you sure you want to mark ${ + submissionIDs.length + } ${target} correct?`, + success: function() { + const reqs = []; + for (var subId of submissionIDs) { + let req = CTFd.fetch(`/api/v1/submissions/${subId}`, { + method: "PATCH", + credentials: "same-origin", + headers: { + Accept: "application/json", + "Content-Type": "application/json" + }, + body: JSON.stringify({ type: "correct" }) + }); + reqs.push(req); + } + Promise.all(reqs).then(_responses => { + window.location.reload(); + }); + } + }); +} + function deleteSelectedSubmissions(event, target) { let submissions; let type; @@ -452,6 +485,8 @@ $(() => { deleteSelectedSubmissions(e, "solves"); }); + $("#correct-fail-button").click(correctSubmissions); + $("#fails-delete-button").click(function(e) { deleteSelectedSubmissions(e, "fails"); }); diff --git a/CTFd/themes/admin/static/js/pages/submissions.dev.js b/CTFd/themes/admin/static/js/pages/submissions.dev.js index 81faee26..4275b08a 100644 --- a/CTFd/themes/admin/static/js/pages/submissions.dev.js +++ b/CTFd/themes/admin/static/js/pages/submissions.dev.js @@ -162,7 +162,7 @@ /***/ (function(module, exports, __webpack_require__) { ; -eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/admin/assets/js/pages/main.js\");\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! core/CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _utils = __webpack_require__(/*! core/utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nvar _ezq = __webpack_require__(/*! core/ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction deleteCorrectSubmission(_event) {\n var key_id = (0, _jquery[\"default\"])(this).data(\"submission-id\");\n var $elem = (0, _jquery[\"default\"])(this).parent().parent();\n var chal_name = $elem.find(\".chal\").text().trim();\n var team_name = $elem.find(\".team\").text().trim();\n var row = (0, _jquery[\"default\"])(this).parent().parent();\n (0, _ezq.ezQuery)({\n title: \"Delete Submission\",\n body: \"Are you sure you want to delete correct submission from {0} for challenge {1}\".format(\"\" + (0, _utils.htmlEntities)(team_name) + \"\", \"\" + (0, _utils.htmlEntities)(chal_name) + \"\"),\n success: function success() {\n _CTFd[\"default\"].api.delete_submission({\n submissionId: key_id\n }).then(function (response) {\n if (response.success) {\n row.remove();\n }\n });\n }\n });\n}\n\nfunction deleteSelectedSubmissions(_event) {\n var submissionIDs = (0, _jquery[\"default\"])(\"input[data-submission-id]:checked\").map(function () {\n return (0, _jquery[\"default\"])(this).data(\"submission-id\");\n });\n var target = submissionIDs.length === 1 ? \"submission\" : \"submissions\";\n (0, _ezq.ezQuery)({\n title: \"Delete Submissions\",\n body: \"Are you sure you want to delete \".concat(submissionIDs.length, \" \").concat(target, \"?\"),\n success: function success() {\n var reqs = [];\n\n var _iterator = _createForOfIteratorHelper(submissionIDs),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var subId = _step.value;\n reqs.push(_CTFd[\"default\"].api.delete_submission({\n submissionId: subId\n }));\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n Promise.all(reqs).then(function (_responses) {\n window.location.reload();\n });\n }\n });\n}\n\nfunction showFlagsToggle(_event) {\n var urlParams = new URLSearchParams(window.location.search);\n\n if (urlParams.has(\"full\")) {\n urlParams[\"delete\"](\"full\");\n } else {\n urlParams.set(\"full\", \"true\");\n }\n\n window.location.href = \"\".concat(window.location.pathname, \"?\").concat(urlParams.toString());\n}\n\nfunction showFlag(event) {\n var target = (0, _jquery[\"default\"])(event.currentTarget);\n var eye = target.find(\"i\");\n var flag = target.parent().find(\"pre\");\n\n if (!flag.hasClass(\"full-flag\")) {\n flag.text(flag.attr(\"title\"));\n flag.addClass(\"full-flag\");\n eye.addClass(\"fa-eye-slash\");\n eye.removeClass(\"fa-eye\");\n } else {\n flag.text(flag.attr(\"title\").substring(0, 42) + \"...\");\n flag.removeClass(\"full-flag\");\n eye.addClass(\"fa-eye\");\n eye.removeClass(\"fa-eye-slash\");\n }\n}\n\nfunction copyFlag(event) {\n var target = (0, _jquery[\"default\"])(event.currentTarget);\n var flag = target.parent().find(\"pre\");\n var text = flag.attr(\"title\");\n navigator.clipboard.writeText(text);\n (0, _jquery[\"default\"])(event.currentTarget).tooltip({\n title: \"Copied!\",\n trigger: \"manual\"\n });\n (0, _jquery[\"default\"])(event.currentTarget).tooltip(\"show\");\n setTimeout(function () {\n (0, _jquery[\"default\"])(event.currentTarget).tooltip(\"hide\");\n }, 1500);\n}\n\n(0, _jquery[\"default\"])(function () {\n (0, _jquery[\"default\"])(\"#show-full-flags-button\").click(showFlagsToggle);\n (0, _jquery[\"default\"])(\"#show-short-flags-button\").click(showFlagsToggle);\n (0, _jquery[\"default\"])(\".show-flag\").click(showFlag);\n (0, _jquery[\"default\"])(\".copy-flag\").click(copyFlag);\n (0, _jquery[\"default\"])(\".delete-correct-submission\").click(deleteCorrectSubmission);\n (0, _jquery[\"default\"])(\"#submission-delete-button\").click(deleteSelectedSubmissions);\n});\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/pages/submissions.js?"); +eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/admin/assets/js/pages/main.js\");\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! core/CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _utils = __webpack_require__(/*! core/utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nvar _ezq = __webpack_require__(/*! core/ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\n\nfunction deleteCorrectSubmission(_event) {\n var key_id = (0, _jquery[\"default\"])(this).data(\"submission-id\");\n var $elem = (0, _jquery[\"default\"])(this).parent().parent();\n var chal_name = $elem.find(\".chal\").text().trim();\n var team_name = $elem.find(\".team\").text().trim();\n var row = (0, _jquery[\"default\"])(this).parent().parent();\n (0, _ezq.ezQuery)({\n title: \"Delete Submission\",\n body: \"Are you sure you want to delete correct submission from {0} for challenge {1}\".format(\"\" + (0, _utils.htmlEntities)(team_name) + \"\", \"\" + (0, _utils.htmlEntities)(chal_name) + \"\"),\n success: function success() {\n _CTFd[\"default\"].api.delete_submission({\n submissionId: key_id\n }).then(function (response) {\n if (response.success) {\n row.remove();\n }\n });\n }\n });\n}\n\nfunction deleteSelectedSubmissions(_event) {\n var submissionIDs = (0, _jquery[\"default\"])(\"input[data-submission-id]:checked\").map(function () {\n return (0, _jquery[\"default\"])(this).data(\"submission-id\");\n });\n var target = submissionIDs.length === 1 ? \"submission\" : \"submissions\";\n (0, _ezq.ezQuery)({\n title: \"Delete Submissions\",\n body: \"Are you sure you want to delete \".concat(submissionIDs.length, \" \").concat(target, \"?\"),\n success: function success() {\n var reqs = [];\n\n var _iterator = _createForOfIteratorHelper(submissionIDs),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var subId = _step.value;\n reqs.push(_CTFd[\"default\"].api.delete_submission({\n submissionId: subId\n }));\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n Promise.all(reqs).then(function (_responses) {\n window.location.reload();\n });\n }\n });\n}\n\nfunction correctSubmissions(_event) {\n var submissionIDs = (0, _jquery[\"default\"])(\"input[data-submission-id]:checked\").map(function () {\n return (0, _jquery[\"default\"])(this).data(\"submission-id\");\n });\n var target = submissionIDs.length === 1 ? \"submission\" : \"submissions\";\n (0, _ezq.ezQuery)({\n title: \"Correct Submissions\",\n body: \"Are you sure you want to mark \".concat(submissionIDs.length, \" \").concat(target, \" correct?\"),\n success: function success() {\n var reqs = [];\n\n var _iterator2 = _createForOfIteratorHelper(submissionIDs),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var subId = _step2.value;\n\n var req = _CTFd[\"default\"].fetch(\"/api/v1/submissions/\".concat(subId), {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n type: \"correct\"\n })\n });\n\n reqs.push(req);\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n Promise.all(reqs).then(function (_responses) {\n window.location.reload();\n });\n }\n });\n}\n\nfunction showFlagsToggle(_event) {\n var urlParams = new URLSearchParams(window.location.search);\n\n if (urlParams.has(\"full\")) {\n urlParams[\"delete\"](\"full\");\n } else {\n urlParams.set(\"full\", \"true\");\n }\n\n window.location.href = \"\".concat(window.location.pathname, \"?\").concat(urlParams.toString());\n}\n\nfunction showFlag(event) {\n var target = (0, _jquery[\"default\"])(event.currentTarget);\n var eye = target.find(\"i\");\n var flag = target.parent().find(\"pre\");\n\n if (!flag.hasClass(\"full-flag\")) {\n flag.text(flag.attr(\"title\"));\n flag.addClass(\"full-flag\");\n eye.addClass(\"fa-eye-slash\");\n eye.removeClass(\"fa-eye\");\n } else {\n flag.text(flag.attr(\"title\").substring(0, 42) + \"...\");\n flag.removeClass(\"full-flag\");\n eye.addClass(\"fa-eye\");\n eye.removeClass(\"fa-eye-slash\");\n }\n}\n\nfunction copyFlag(event) {\n var target = (0, _jquery[\"default\"])(event.currentTarget);\n var flag = target.parent().find(\"pre\");\n var text = flag.attr(\"title\");\n navigator.clipboard.writeText(text);\n (0, _jquery[\"default\"])(event.currentTarget).tooltip({\n title: \"Copied!\",\n trigger: \"manual\"\n });\n (0, _jquery[\"default\"])(event.currentTarget).tooltip(\"show\");\n setTimeout(function () {\n (0, _jquery[\"default\"])(event.currentTarget).tooltip(\"hide\");\n }, 1500);\n}\n\n(0, _jquery[\"default\"])(function () {\n (0, _jquery[\"default\"])(\"#show-full-flags-button\").click(showFlagsToggle);\n (0, _jquery[\"default\"])(\"#show-short-flags-button\").click(showFlagsToggle);\n (0, _jquery[\"default\"])(\".show-flag\").click(showFlag);\n (0, _jquery[\"default\"])(\".copy-flag\").click(copyFlag);\n (0, _jquery[\"default\"])(\"#correct-flags-button\").click(correctSubmissions);\n (0, _jquery[\"default\"])(\".delete-correct-submission\").click(deleteCorrectSubmission);\n (0, _jquery[\"default\"])(\"#submission-delete-button\").click(deleteSelectedSubmissions);\n});\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/pages/submissions.js?"); /***/ }) diff --git a/CTFd/themes/admin/static/js/pages/submissions.min.js b/CTFd/themes/admin/static/js/pages/submissions.min.js index d98aeb67..100c95cc 100644 --- a/CTFd/themes/admin/static/js/pages/submissions.min.js +++ b/CTFd/themes/admin/static/js/pages/submissions.min.js @@ -1 +1 @@ -!function(d){function e(e){for(var t,i,o=e[0],n=e[1],r=e[2],a=0,s=[];a=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,a=!0,s=!1;return{s:function(){i=e[Symbol.iterator]()},n:function(){var e=i.next();return a=e.done,e},e:function(e){s=!0,r=e},f:function(){try{a||null==i.return||i.return()}finally{if(s)throw r}}}}function p(e,t){(null==t||t>e.length)&&(t=e.length);for(var i=0,o=new Array(t);i"+(0,d.htmlEntities)(n)+"",""+(0,d.htmlEntities)(o)+""),success:function(){a.default.api.delete_submission({submissionId:t}).then(function(e){e.success&&r.remove()})}})}function l(e){var n=(0,s.default)("input[data-submission-id]:checked").map(function(){return(0,s.default)(this).data("submission-id")}),t=1===n.length?"submission":"submissions";(0,c.ezQuery)({title:"Delete Submissions",body:"Are you sure you want to delete ".concat(n.length," ").concat(t,"?"),success:function(){var e,t=[],i=r(n);try{for(i.s();!(e=i.n()).done;){var o=e.value;t.push(a.default.api.delete_submission({submissionId:o}))}}catch(e){i.e(e)}finally{i.f()}Promise.all(t).then(function(e){window.location.reload()})}})}function u(e){var t=new URLSearchParams(window.location.search);t.has("full")?t.delete("full"):t.set("full","true"),window.location.href="".concat(window.location.pathname,"?").concat(t.toString())}function f(e){var t=(0,s.default)(e.currentTarget),i=t.find("i"),o=t.parent().find("pre");o.hasClass("full-flag")?(o.text(o.attr("title").substring(0,42)+"..."),o.removeClass("full-flag"),i.addClass("fa-eye"),i.removeClass("fa-eye-slash")):(o.text(o.attr("title")),o.addClass("full-flag"),i.addClass("fa-eye-slash"),i.removeClass("fa-eye"))}function m(e){var t=(0,s.default)(e.currentTarget).parent().find("pre").attr("title");navigator.clipboard.writeText(t),(0,s.default)(e.currentTarget).tooltip({title:"Copied!",trigger:"manual"}),(0,s.default)(e.currentTarget).tooltip("show"),setTimeout(function(){(0,s.default)(e.currentTarget).tooltip("hide")},1500)}(0,s.default)(function(){(0,s.default)("#show-full-flags-button").click(u),(0,s.default)("#show-short-flags-button").click(u),(0,s.default)(".show-flag").click(f),(0,s.default)(".copy-flag").click(m),(0,s.default)(".delete-correct-submission").click(n),(0,s.default)("#submission-delete-button").click(l)})},"./CTFd/themes/admin/assets/js/styles.js":function(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.showMediaLibrary=p,t.bindMarkdownEditor=l,t.bindMarkdownEditors=u,t.default=void 0,i("./node_modules/bootstrap/dist/js/bootstrap.bundle.js");var o=i("./CTFd/themes/core/assets/js/utils.js"),n=c(i("./node_modules/jquery/dist/jquery.js")),r=c(i("./node_modules/easymde/src/js/easymde.js")),a=c(i("./node_modules/vue/dist/vue.esm.browser.js")),s=c(i("./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue")),d=c(i("./node_modules/highlight.js/lib/index.js"));function c(e){return e&&e.__esModule?e:{default:e}}function p(e){var t=a.default.extend(s.default),i=document.createElement("div");document.querySelector("main").appendChild(i);var o=new t({propsData:{editor:e}}).$mount(i);(0,n.default)("#media-modal").on("hidden.bs.modal",function(e){o.$destroy(),(0,n.default)("#media-modal").remove()}),(0,n.default)("#media-modal").modal()}function l(e){var t;!1===e.hasOwnProperty("mde")&&(t=new r.default({autoDownloadFontAwesome:!1,toolbar:["bold","italic","heading","|","quote","unordered-list","ordered-list","|","link","image",{name:"media",action:function(e){p(e)},className:"fas fa-file-upload",title:"Media Library"},"|","preview","guide"],element:e,initialValue:(0,n.default)(e).val(),forceSync:!0,minHeight:"200px",renderingConfig:{codeSyntaxHighlighting:!0,hljs:d.default}}),e.mde=t,e.codemirror=t.codemirror,(0,n.default)(e).on("change keyup paste",function(){t.codemirror.getDoc().setValue((0,n.default)(e).val()),t.codemirror.refresh()}))}function u(){(0,n.default)("textarea.markdown").each(function(e,t){l(t)})}t.default=function(){(0,n.default)(":input").each(function(){(0,n.default)(this).data("initial",(0,n.default)(this).val())}),(0,n.default)(function(){(0,n.default)("tr[data-href], td[data-href]").click(function(){var e;return getSelection().toString()||(e=(0,n.default)(this).attr("data-href"))&&(window.location=e),!1}),(0,n.default)("[data-checkbox]").click(function(e){(0,n.default)(e.target).is("input[type=checkbox]")||(0,n.default)(this).find("input[type=checkbox]").click(),e.stopImmediatePropagation()}),(0,n.default)("[data-checkbox-all]").on("click change",function(e){var t=(0,n.default)(this).prop("checked"),i=(0,n.default)(this).index()+1;(0,n.default)(this).closest("table").find("tr td:nth-child(".concat(i,") input[type=checkbox]")).prop("checked",t),e.stopImmediatePropagation()}),(0,n.default)("tr[data-href] a, tr[data-href] button").click(function(e){(0,n.default)(this).attr("data-dismiss")||e.stopPropagation()}),(0,n.default)(".page-select").change(function(){var e=new URL(window.location);e.searchParams.set("page",this.value),window.location.href=e.toString()}),(0,n.default)('a[data-toggle="tab"]').on("shown.bs.tab",function(e){sessionStorage.setItem("activeTab",(0,n.default)(e.target).attr("href"))});var e,t=sessionStorage.getItem("activeTab");t&&((e=(0,n.default)('.nav-tabs a[href="'.concat(t,'"], .nav-pills a[href="').concat(t,'"]'))).length?e.tab("show"):sessionStorage.removeItem("activeTab")),u(),(0,o.makeSortableTables)(),(0,n.default)('[data-toggle="tooltip"]').tooltip(),document.querySelectorAll("pre code").forEach(function(e){d.default.highlightBlock(e)})})}},"./CTFd/themes/core/assets/js/CTFd.js":function(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=l(i("./node_modules/jquery/dist/jquery.js")),n=l(i("./node_modules/dayjs/dayjs.min.js")),r=l(i("./node_modules/markdown-it/index.js"));i("./CTFd/themes/core/assets/js/patch.js");var a=l(i("./CTFd/themes/core/assets/js/fetch.js")),s=l(i("./CTFd/themes/core/assets/js/config.js")),d=i("./CTFd/themes/core/assets/js/api.js"),c=l(i("./CTFd/themes/core/assets/js/ezq.js")),p=i("./CTFd/themes/core/assets/js/utils.js");function l(e){return e&&e.__esModule?e:{default:e}}function u(t,e){var i,o=Object.keys(t);return Object.getOwnPropertySymbols&&(i=Object.getOwnPropertySymbols(t),e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),o.push.apply(o,i)),o}function f(n){for(var e=1;e".concat(e.body,"

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

".concat(e.body,"

")):i.find(".modal-body").append((0,s.default)(e.body));var o=(0,s.default)(f),n=(0,s.default)(u);return i.find(".modal-footer").append(n),i.find(".modal-footer").append(o),i.find("pre code").each(function(e){r.default.highlightBlock(this)}),(0,s.default)("main").append(i),(0,s.default)(i).on("hidden.bs.modal",function(){(0,s.default)(this).modal("dispose")}),(0,s.default)(o).click(function(){e.success()}),i.modal("show"),i}function v(e){if(e.target){var t=(0,s.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var i=c.format(e.width),o=a.format(e.title),n=(0,s.default)(o);return n.find(".modal-body").append((0,s.default)(i)),(0,s.default)("main").append(n),n.modal("show")}function y(e){var t={success:p,error:n}[e.type].format(e.body);return(0,s.default)(t)}var j={ezAlert:m,ezToast:h,ezQuery:g,ezProgressBar:v,ezBadge:y};t.default=j},"./CTFd/themes/core/assets/js/fetch.js":function(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,i("./node_modules/whatwg-fetch/fetch.js");var o,n=(o=i("./CTFd/themes/core/assets/js/config.js"))&&o.__esModule?o:{default:o};var r=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=n.default.urlRoot+e,void 0===t.headers&&(t.headers={}),t.credentials="same-origin",t.headers.Accept="application/json",t.headers["Content-Type"]="application/json",t.headers["CSRF-Token"]=n.default.csrfNonce,r(e,t)}},"./CTFd/themes/core/assets/js/patch.js":function(e,t,i){var o,s=(o=i("./node_modules/q/q.js"))&&o.__esModule?o:{default:o},n=i("./CTFd/themes/core/assets/js/api.js");function a(t,e){var i,o=Object.keys(t);return Object.getOwnPropertySymbols&&(i=Object.getOwnPropertySymbols(t),e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),o.push.apply(o,i)),o}function r(n){for(var e=1;e'),(0,a.default)("th.sort-col").click(function(){var n,e=(0,a.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort((n=(0,a.default)(this).index(),function(e,t){var i=r(e,n),o=r(t,n);return a.default.isNumeric(i)&&a.default.isNumeric(o)?i-o:i.toString().localeCompare(o)}));this.asc=!this.asc,this.asc||(t=t.reverse());for(var i=0;i").text(e).html()};var o,a=(o=i("./node_modules/jquery/dist/jquery.js"))&&o.__esModule?o:{default:o};function n(){this.id=Math.random(),this.isMaster=!1,this.others={},window.addEventListener("storage",this,!1),window.addEventListener("unload",this,!1),this.broadcast("hello");var t=this;this._checkTimeout=setTimeout(function e(){t.check(),t._checkTimeout=setTimeout(e,9e3)},500),this._pingTimeout=setTimeout(function e(){t.sendPing(),t._pingTimeout=setTimeout(e,17e3)},17e3)}a.default.fn.serializeJSON=function(i){var o={},n=(0,a.default)(this),e=n.serializeArray();return(e=(e=e.concat(n.find("input[type=checkbox]:checked").map(function(){return{name:this.name,value:!0}}).get())).concat(n.find("input[type=checkbox]:not(:checked)").map(function(){return{name:this.name,value:!1}}).get())).map(function(e){var t;i&&(null===e.value||""===e.value)&&(t=n.find(":input[name='".concat(e.name,"']"))).data("initial")===t.val()||(o[e.name]=e.value)}),o},String.prototype.format=String.prototype.f=function(){for(var e=this,t=arguments.length;t--;)e=e.replace(new RegExp("\\{"+t+"\\}","gm"),arguments[t]);return e},String.prototype.hashCode=function(){var e,t,i=0;if(0==this.length)return i;for(e=0,t=this.length;e=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,r=!0,s=!1;return{s:function(){i=e[Symbol.iterator]()},n:function(){var e=i.next();return r=e.done,e},e:function(e){s=!0,a=e},f:function(){try{r||null==i.return||i.return()}finally{if(s)throw a}}}}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var i=0,o=new Array(t);i"+(0,d.htmlEntities)(n)+"",""+(0,d.htmlEntities)(o)+""),success:function(){r.default.api.delete_submission({submissionId:t}).then(function(e){e.success&&a.remove()})}})}function a(e){var n=(0,s.default)("input[data-submission-id]:checked").map(function(){return(0,s.default)(this).data("submission-id")}),t=1===n.length?"submission":"submissions";(0,c.ezQuery)({title:"Delete Submissions",body:"Are you sure you want to delete ".concat(n.length," ").concat(t,"?"),success:function(){var e,t=[],i=p(n);try{for(i.s();!(e=i.n()).done;){var o=e.value;t.push(r.default.api.delete_submission({submissionId:o}))}}catch(e){i.e(e)}finally{i.f()}Promise.all(t).then(function(e){window.location.reload()})}})}function u(e){var a=(0,s.default)("input[data-submission-id]:checked").map(function(){return(0,s.default)(this).data("submission-id")}),t=1===a.length?"submission":"submissions";(0,c.ezQuery)({title:"Correct Submissions",body:"Are you sure you want to mark ".concat(a.length," ").concat(t," correct?"),success:function(){var e,t=[],i=p(a);try{for(i.s();!(e=i.n()).done;){var o=e.value,n=r.default.fetch("/api/v1/submissions/".concat(o),{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({type:"correct"})});t.push(n)}}catch(e){i.e(e)}finally{i.f()}Promise.all(t).then(function(e){window.location.reload()})}})}function f(e){var t=new URLSearchParams(window.location.search);t.has("full")?t.delete("full"):t.set("full","true"),window.location.href="".concat(window.location.pathname,"?").concat(t.toString())}function m(e){var t=(0,s.default)(e.currentTarget),i=t.find("i"),o=t.parent().find("pre");o.hasClass("full-flag")?(o.text(o.attr("title").substring(0,42)+"..."),o.removeClass("full-flag"),i.addClass("fa-eye"),i.removeClass("fa-eye-slash")):(o.text(o.attr("title")),o.addClass("full-flag"),i.addClass("fa-eye-slash"),i.removeClass("fa-eye"))}function h(e){var t=(0,s.default)(e.currentTarget).parent().find("pre").attr("title");navigator.clipboard.writeText(t),(0,s.default)(e.currentTarget).tooltip({title:"Copied!",trigger:"manual"}),(0,s.default)(e.currentTarget).tooltip("show"),setTimeout(function(){(0,s.default)(e.currentTarget).tooltip("hide")},1500)}(0,s.default)(function(){(0,s.default)("#show-full-flags-button").click(f),(0,s.default)("#show-short-flags-button").click(f),(0,s.default)(".show-flag").click(m),(0,s.default)(".copy-flag").click(h),(0,s.default)("#correct-flags-button").click(u),(0,s.default)(".delete-correct-submission").click(n),(0,s.default)("#submission-delete-button").click(a)})},"./CTFd/themes/admin/assets/js/styles.js":function(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.showMediaLibrary=p,t.bindMarkdownEditor=l,t.bindMarkdownEditors=u,t.default=void 0,i("./node_modules/bootstrap/dist/js/bootstrap.bundle.js");var o=i("./CTFd/themes/core/assets/js/utils.js"),n=c(i("./node_modules/jquery/dist/jquery.js")),a=c(i("./node_modules/easymde/src/js/easymde.js")),r=c(i("./node_modules/vue/dist/vue.esm.browser.js")),s=c(i("./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue")),d=c(i("./node_modules/highlight.js/lib/index.js"));function c(e){return e&&e.__esModule?e:{default:e}}function p(e){var t=r.default.extend(s.default),i=document.createElement("div");document.querySelector("main").appendChild(i);var o=new t({propsData:{editor:e}}).$mount(i);(0,n.default)("#media-modal").on("hidden.bs.modal",function(e){o.$destroy(),(0,n.default)("#media-modal").remove()}),(0,n.default)("#media-modal").modal()}function l(e){var t;!1===e.hasOwnProperty("mde")&&(t=new a.default({autoDownloadFontAwesome:!1,toolbar:["bold","italic","heading","|","quote","unordered-list","ordered-list","|","link","image",{name:"media",action:function(e){p(e)},className:"fas fa-file-upload",title:"Media Library"},"|","preview","guide"],element:e,initialValue:(0,n.default)(e).val(),forceSync:!0,minHeight:"200px",renderingConfig:{codeSyntaxHighlighting:!0,hljs:d.default}}),e.mde=t,e.codemirror=t.codemirror,(0,n.default)(e).on("change keyup paste",function(){t.codemirror.getDoc().setValue((0,n.default)(e).val()),t.codemirror.refresh()}))}function u(){(0,n.default)("textarea.markdown").each(function(e,t){l(t)})}t.default=function(){(0,n.default)(":input").each(function(){(0,n.default)(this).data("initial",(0,n.default)(this).val())}),(0,n.default)(function(){(0,n.default)("tr[data-href], td[data-href]").click(function(){var e;return getSelection().toString()||(e=(0,n.default)(this).attr("data-href"))&&(window.location=e),!1}),(0,n.default)("[data-checkbox]").click(function(e){(0,n.default)(e.target).is("input[type=checkbox]")||(0,n.default)(this).find("input[type=checkbox]").click(),e.stopImmediatePropagation()}),(0,n.default)("[data-checkbox-all]").on("click change",function(e){var t=(0,n.default)(this).prop("checked"),i=(0,n.default)(this).index()+1;(0,n.default)(this).closest("table").find("tr td:nth-child(".concat(i,") input[type=checkbox]")).prop("checked",t),e.stopImmediatePropagation()}),(0,n.default)("tr[data-href] a, tr[data-href] button").click(function(e){(0,n.default)(this).attr("data-dismiss")||e.stopPropagation()}),(0,n.default)(".page-select").change(function(){var e=new URL(window.location);e.searchParams.set("page",this.value),window.location.href=e.toString()}),(0,n.default)('a[data-toggle="tab"]').on("shown.bs.tab",function(e){sessionStorage.setItem("activeTab",(0,n.default)(e.target).attr("href"))});var e,t=sessionStorage.getItem("activeTab");t&&((e=(0,n.default)('.nav-tabs a[href="'.concat(t,'"], .nav-pills a[href="').concat(t,'"]'))).length?e.tab("show"):sessionStorage.removeItem("activeTab")),u(),(0,o.makeSortableTables)(),(0,n.default)('[data-toggle="tooltip"]').tooltip(),document.querySelectorAll("pre code").forEach(function(e){d.default.highlightBlock(e)})})}},"./CTFd/themes/core/assets/js/CTFd.js":function(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o=l(i("./node_modules/jquery/dist/jquery.js")),n=l(i("./node_modules/dayjs/dayjs.min.js")),a=l(i("./node_modules/markdown-it/index.js"));i("./CTFd/themes/core/assets/js/patch.js");var r=l(i("./CTFd/themes/core/assets/js/fetch.js")),s=l(i("./CTFd/themes/core/assets/js/config.js")),d=i("./CTFd/themes/core/assets/js/api.js"),c=l(i("./CTFd/themes/core/assets/js/ezq.js")),p=i("./CTFd/themes/core/assets/js/utils.js");function l(e){return e&&e.__esModule?e:{default:e}}function u(t,e){var i,o=Object.keys(t);return Object.getOwnPropertySymbols&&(i=Object.getOwnPropertySymbols(t),e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),o.push.apply(o,i)),o}function f(n){for(var e=1;e".concat(e.body,"

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

".concat(e.body,"

")):i.find(".modal-body").append((0,s.default)(e.body));var o=(0,s.default)(f),n=(0,s.default)(u);return i.find(".modal-footer").append(n),i.find(".modal-footer").append(o),i.find("pre code").each(function(e){a.default.highlightBlock(this)}),(0,s.default)("main").append(i),(0,s.default)(i).on("hidden.bs.modal",function(){(0,s.default)(this).modal("dispose")}),(0,s.default)(o).click(function(){e.success()}),i.modal("show"),i}function v(e){if(e.target){var t=(0,s.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var i=c.format(e.width),o=r.format(e.title),n=(0,s.default)(o);return n.find(".modal-body").append((0,s.default)(i)),(0,s.default)("main").append(n),n.modal("show")}function y(e){var t={success:p,error:n}[e.type].format(e.body);return(0,s.default)(t)}var j={ezAlert:m,ezToast:h,ezQuery:g,ezProgressBar:v,ezBadge:y};t.default=j},"./CTFd/themes/core/assets/js/fetch.js":function(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,i("./node_modules/whatwg-fetch/fetch.js");var o,n=(o=i("./CTFd/themes/core/assets/js/config.js"))&&o.__esModule?o:{default:o};var a=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=n.default.urlRoot+e,void 0===t.headers&&(t.headers={}),t.credentials="same-origin",t.headers.Accept="application/json",t.headers["Content-Type"]="application/json",t.headers["CSRF-Token"]=n.default.csrfNonce,a(e,t)}},"./CTFd/themes/core/assets/js/patch.js":function(e,t,i){var o,s=(o=i("./node_modules/q/q.js"))&&o.__esModule?o:{default:o},n=i("./CTFd/themes/core/assets/js/api.js");function r(t,e){var i,o=Object.keys(t);return Object.getOwnPropertySymbols&&(i=Object.getOwnPropertySymbols(t),e&&(i=i.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),o.push.apply(o,i)),o}function a(n){for(var e=1;e'),(0,r.default)("th.sort-col").click(function(){var n,e=(0,r.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort((n=(0,r.default)(this).index(),function(e,t){var i=a(e,n),o=a(t,n);return r.default.isNumeric(i)&&r.default.isNumeric(o)?i-o:i.toString().localeCompare(o)}));this.asc=!this.asc,this.asc||(t=t.reverse());for(var i=0;i").text(e).html()};var o,r=(o=i("./node_modules/jquery/dist/jquery.js"))&&o.__esModule?o:{default:o};function n(){this.id=Math.random(),this.isMaster=!1,this.others={},window.addEventListener("storage",this,!1),window.addEventListener("unload",this,!1),this.broadcast("hello");var t=this;this._checkTimeout=setTimeout(function e(){t.check(),t._checkTimeout=setTimeout(e,9e3)},500),this._pingTimeout=setTimeout(function e(){t.sendPing(),t._pingTimeout=setTimeout(e,17e3)},17e3)}r.default.fn.serializeJSON=function(i){var o={},n=(0,r.default)(this),e=n.serializeArray();return(e=(e=e.concat(n.find("input[type=checkbox]:checked").map(function(){return{name:this.name,value:!0}}).get())).concat(n.find("input[type=checkbox]:not(:checked)").map(function(){return{name:this.name,value:!1}}).get())).map(function(e){var t;i&&(null===e.value||""===e.value)&&(t=n.find(":input[name='".concat(e.name,"']"))).data("initial")===t.val()||(o[e.name]=e.value)}),o},String.prototype.format=String.prototype.f=function(){for(var e=this,t=arguments.length;t--;)e=e.replace(new RegExp("\\{"+t+"\\}","gm"),arguments[t]);return e},String.prototype.hashCode=function(){var e,t,i=0;if(0==this.length)return i;for(e=0,t=this.length;e= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction createTeam(event) {\n event.preventDefault();\n var params = (0, _jquery[\"default\"])(\"#team-info-create-form\").serializeJSON(true);\n params.fields = [];\n\n for (var property in params) {\n if (property.match(/fields\\[\\d+\\]/)) {\n var field = {};\n var id = parseInt(property.slice(7, -1));\n field[\"field_id\"] = id;\n field[\"value\"] = params[property];\n params.fields.push(field);\n delete params[property];\n }\n }\n\n _CTFd[\"default\"].fetch(\"/api/v1/teams\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n var team_id = response.data.id;\n window.location = _CTFd[\"default\"].config.urlRoot + \"/admin/teams/\" + team_id;\n } else {\n (0, _jquery[\"default\"])(\"#team-info-create-form > #results\").empty();\n Object.keys(response.errors).forEach(function (key, _index) {\n (0, _jquery[\"default\"])(\"#team-info-create-form > #results\").append((0, _ezq.ezBadge)({\n type: \"error\",\n body: response.errors[key]\n }));\n var i = (0, _jquery[\"default\"])(\"#team-info-create-form\").find(\"input[name={0}]\".format(key));\n var input = (0, _jquery[\"default\"])(i);\n input.addClass(\"input-filled-invalid\");\n input.removeClass(\"input-filled-valid\");\n });\n }\n });\n}\n\nfunction updateTeam(event) {\n event.preventDefault();\n var params = (0, _jquery[\"default\"])(\"#team-info-edit-form\").serializeJSON(true);\n params.fields = [];\n\n for (var property in params) {\n if (property.match(/fields\\[\\d+\\]/)) {\n var field = {};\n var id = parseInt(property.slice(7, -1));\n field[\"field_id\"] = id;\n field[\"value\"] = params[property];\n params.fields.push(field);\n delete params[property];\n }\n }\n\n _CTFd[\"default\"].fetch(\"/api/v1/teams/\" + window.TEAM_ID, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n window.location.reload();\n } else {\n (0, _jquery[\"default\"])(\"#team-info-form > #results\").empty();\n Object.keys(response.errors).forEach(function (key, _index) {\n (0, _jquery[\"default\"])(\"#team-info-form > #results\").append((0, _ezq.ezBadge)({\n type: \"error\",\n body: response.errors[key]\n }));\n var i = (0, _jquery[\"default\"])(\"#team-info-form\").find(\"input[name={0}]\".format(key));\n var input = (0, _jquery[\"default\"])(i);\n input.addClass(\"input-filled-invalid\");\n input.removeClass(\"input-filled-valid\");\n });\n }\n });\n}\n\nfunction deleteSelectedSubmissions(event, target) {\n var submissions;\n var type;\n var title;\n\n switch (target) {\n case \"solves\":\n submissions = (0, _jquery[\"default\"])(\"input[data-submission-type=correct]:checked\");\n type = \"solve\";\n title = \"Solves\";\n break;\n\n case \"fails\":\n submissions = (0, _jquery[\"default\"])(\"input[data-submission-type=incorrect]:checked\");\n type = \"fail\";\n title = \"Fails\";\n break;\n\n default:\n break;\n }\n\n var submissionIDs = submissions.map(function () {\n return (0, _jquery[\"default\"])(this).data(\"submission-id\");\n });\n var target_string = submissionIDs.length === 1 ? type : type + \"s\";\n (0, _ezq.ezQuery)({\n title: \"Delete \".concat(title),\n body: \"Are you sure you want to delete \".concat(submissionIDs.length, \" \").concat(target_string, \"?\"),\n success: function success() {\n var reqs = [];\n\n var _iterator = _createForOfIteratorHelper(submissionIDs),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var subId = _step.value;\n reqs.push(_CTFd[\"default\"].api.delete_submission({\n submissionId: subId\n }));\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n Promise.all(reqs).then(function (_responses) {\n window.location.reload();\n });\n }\n });\n}\n\nfunction deleteSelectedAwards(_event) {\n var awardIDs = (0, _jquery[\"default\"])(\"input[data-award-id]:checked\").map(function () {\n return (0, _jquery[\"default\"])(this).data(\"award-id\");\n });\n var target = awardIDs.length === 1 ? \"award\" : \"awards\";\n (0, _ezq.ezQuery)({\n title: \"Delete Awards\",\n body: \"Are you sure you want to delete \".concat(awardIDs.length, \" \").concat(target, \"?\"),\n success: function success() {\n var reqs = [];\n\n var _iterator2 = _createForOfIteratorHelper(awardIDs),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var awardID = _step2.value;\n\n var req = _CTFd[\"default\"].fetch(\"/api/v1/awards/\" + awardID, {\n method: \"DELETE\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n }\n });\n\n reqs.push(req);\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n Promise.all(reqs).then(function (_responses) {\n window.location.reload();\n });\n }\n });\n}\n\nfunction solveSelectedMissingChallenges(event) {\n event.preventDefault();\n var challengeIDs = (0, _jquery[\"default\"])(\"input[data-missing-challenge-id]:checked\").map(function () {\n return (0, _jquery[\"default\"])(this).data(\"missing-challenge-id\");\n });\n var target = challengeIDs.length === 1 ? \"challenge\" : \"challenges\";\n (0, _ezq.ezQuery)({\n title: \"Mark Correct\",\n body: \"Are you sure you want to mark \".concat(challengeIDs.length, \" \").concat(target, \" correct for \").concat((0, _utils.htmlEntities)(window.TEAM_NAME), \"?\"),\n success: function success() {\n (0, _ezq.ezAlert)({\n title: \"User Attribution\",\n body: \"\\n Which user on \".concat((0, _utils.htmlEntities)(window.TEAM_NAME), \" solved these challenges?\\n
\\n \").concat((0, _jquery[\"default\"])(\"#team-member-select\").html(), \"\\n
\\n \"),\n button: \"Mark Correct\",\n success: function success() {\n var USER_ID = (0, _jquery[\"default\"])(\"#query-team-member-solve > select\").val();\n var reqs = [];\n\n var _iterator3 = _createForOfIteratorHelper(challengeIDs),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var challengeID = _step3.value;\n var params = {\n provided: \"MARKED AS SOLVED BY ADMIN\",\n user_id: USER_ID,\n team_id: window.TEAM_ID,\n challenge_id: challengeID,\n type: \"correct\"\n };\n\n var req = _CTFd[\"default\"].fetch(\"/api/v1/submissions\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n });\n\n reqs.push(req);\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n\n Promise.all(reqs).then(function (_responses) {\n window.location.reload();\n });\n }\n });\n }\n });\n}\n\nvar api_funcs = {\n team: [function (x) {\n return _CTFd[\"default\"].api.get_team_solves({\n teamId: x\n });\n }, function (x) {\n return _CTFd[\"default\"].api.get_team_fails({\n teamId: x\n });\n }, function (x) {\n return _CTFd[\"default\"].api.get_team_awards({\n teamId: x\n });\n }],\n user: [function (x) {\n return _CTFd[\"default\"].api.get_user_solves({\n userId: x\n });\n }, function (x) {\n return _CTFd[\"default\"].api.get_user_fails({\n userId: x\n });\n }, function (x) {\n return _CTFd[\"default\"].api.get_user_awards({\n userId: x\n });\n }]\n};\n\nvar createGraphs = function createGraphs(type, id, name, account_id) {\n var _api_funcs$type = _slicedToArray(api_funcs[type], 3),\n solves_func = _api_funcs$type[0],\n fails_func = _api_funcs$type[1],\n awards_func = _api_funcs$type[2];\n\n Promise.all([solves_func(account_id), fails_func(account_id), awards_func(account_id)]).then(function (responses) {\n (0, _graphs.createGraph)(\"score_graph\", \"#score-graph\", responses, type, id, name, account_id);\n (0, _graphs.createGraph)(\"category_breakdown\", \"#categories-pie-graph\", responses, type, id, name, account_id);\n (0, _graphs.createGraph)(\"solve_percentages\", \"#keys-pie-graph\", responses, type, id, name, account_id);\n });\n};\n\nvar updateGraphs = function updateGraphs(type, id, name, account_id) {\n var _api_funcs$type2 = _slicedToArray(api_funcs[type], 3),\n solves_func = _api_funcs$type2[0],\n fails_func = _api_funcs$type2[1],\n awards_func = _api_funcs$type2[2];\n\n Promise.all([solves_func(account_id), fails_func(account_id), awards_func(account_id)]).then(function (responses) {\n (0, _graphs.updateGraph)(\"score_graph\", \"#score-graph\", responses, type, id, name, account_id);\n (0, _graphs.updateGraph)(\"category_breakdown\", \"#categories-pie-graph\", responses, type, id, name, account_id);\n (0, _graphs.updateGraph)(\"solve_percentages\", \"#keys-pie-graph\", responses, type, id, name, account_id);\n });\n};\n\n(0, _jquery[\"default\"])(function () {\n (0, _jquery[\"default\"])(\"#team-captain-form\").submit(function (e) {\n e.preventDefault();\n var params = (0, _jquery[\"default\"])(\"#team-captain-form\").serializeJSON(true);\n\n _CTFd[\"default\"].fetch(\"/api/v1/teams/\" + window.TEAM_ID, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n window.location.reload();\n } else {\n (0, _jquery[\"default\"])(\"#team-captain-form > #results\").empty();\n Object.keys(response.errors).forEach(function (key, _index) {\n (0, _jquery[\"default\"])(\"#team-captain-form > #results\").append((0, _ezq.ezBadge)({\n type: \"error\",\n body: response.errors[key]\n }));\n var i = (0, _jquery[\"default\"])(\"#team-captain-form\").find(\"select[name={0}]\".format(key));\n var input = (0, _jquery[\"default\"])(i);\n input.addClass(\"input-filled-invalid\");\n input.removeClass(\"input-filled-valid\");\n });\n }\n });\n });\n (0, _jquery[\"default\"])(\".edit-team\").click(function (_e) {\n (0, _jquery[\"default\"])(\"#team-info-edit-modal\").modal(\"toggle\");\n });\n (0, _jquery[\"default\"])(\".invite-team\").click(function (_e) {\n _CTFd[\"default\"].fetch(\"/api/v1/teams/\".concat(window.TEAM_ID, \"/members\"), {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n }\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n var code = response.data.code;\n var url = \"\".concat(window.location.origin).concat(_CTFd[\"default\"].config.urlRoot, \"/teams/invite?code=\").concat(code);\n (0, _jquery[\"default\"])(\"#team-invite-modal input[name=link]\").val(url);\n (0, _jquery[\"default\"])(\"#team-invite-modal\").modal(\"toggle\");\n }\n });\n });\n (0, _jquery[\"default\"])(\"#team-invite-link-copy\").click(function (e) {\n (0, _utils2.copyToClipboard)(e, \"#team-invite-link\");\n });\n (0, _jquery[\"default\"])(\".members-team\").click(function (_e) {\n (0, _jquery[\"default\"])(\"#team-add-modal\").modal(\"toggle\");\n });\n (0, _jquery[\"default\"])(\".edit-captain\").click(function (_e) {\n (0, _jquery[\"default\"])(\"#team-captain-modal\").modal(\"toggle\");\n });\n (0, _jquery[\"default\"])(\".award-team\").click(function (_e) {\n (0, _jquery[\"default\"])(\"#team-award-modal\").modal(\"toggle\");\n });\n (0, _jquery[\"default\"])(\".addresses-team\").click(function (_event) {\n (0, _jquery[\"default\"])(\"#team-addresses-modal\").modal(\"toggle\");\n });\n (0, _jquery[\"default\"])(\"#user-award-form\").submit(function (e) {\n e.preventDefault();\n var params = (0, _jquery[\"default\"])(\"#user-award-form\").serializeJSON(true);\n params[\"user_id\"] = (0, _jquery[\"default\"])(\"#award-member-input\").val();\n params[\"team_id\"] = window.TEAM_ID;\n (0, _jquery[\"default\"])(\"#user-award-form > #results\").empty();\n\n if (!params[\"user_id\"]) {\n (0, _jquery[\"default\"])(\"#user-award-form > #results\").append((0, _ezq.ezBadge)({\n type: \"error\",\n body: \"Please select a team member\"\n }));\n return;\n }\n\n params[\"user_id\"] = parseInt(params[\"user_id\"]);\n\n _CTFd[\"default\"].fetch(\"/api/v1/awards\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n window.location.reload();\n } else {\n (0, _jquery[\"default\"])(\"#user-award-form > #results\").empty();\n Object.keys(response.errors).forEach(function (key, _index) {\n (0, _jquery[\"default\"])(\"#user-award-form > #results\").append((0, _ezq.ezBadge)({\n type: \"error\",\n body: response.errors[key]\n }));\n var i = (0, _jquery[\"default\"])(\"#user-award-form\").find(\"input[name={0}]\".format(key));\n var input = (0, _jquery[\"default\"])(i);\n input.addClass(\"input-filled-invalid\");\n input.removeClass(\"input-filled-valid\");\n });\n }\n });\n });\n (0, _jquery[\"default\"])(\".delete-member\").click(function (e) {\n e.preventDefault();\n var member_id = (0, _jquery[\"default\"])(this).attr(\"member-id\");\n var member_name = (0, _jquery[\"default\"])(this).attr(\"member-name\");\n var params = {\n user_id: member_id\n };\n var row = (0, _jquery[\"default\"])(this).parent().parent();\n (0, _ezq.ezQuery)({\n title: \"Remove Member\",\n body: \"Are you sure you want to remove {0} from {1}?

All of their challenge solves, attempts, awards, and unlocked hints will also be deleted!\".format(\"\" + (0, _utils.htmlEntities)(member_name) + \"\", \"\" + (0, _utils.htmlEntities)(window.TEAM_NAME) + \"\"),\n success: function success() {\n _CTFd[\"default\"].fetch(\"/api/v1/teams/\" + window.TEAM_ID + \"/members\", {\n method: \"DELETE\",\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n row.remove();\n }\n });\n }\n });\n });\n (0, _jquery[\"default\"])(\".delete-team\").click(function (_e) {\n (0, _ezq.ezQuery)({\n title: \"Delete Team\",\n body: \"Are you sure you want to delete {0}\".format(\"\" + (0, _utils.htmlEntities)(window.TEAM_NAME) + \"\"),\n success: function success() {\n _CTFd[\"default\"].fetch(\"/api/v1/teams/\" + window.TEAM_ID, {\n method: \"DELETE\"\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n window.location = _CTFd[\"default\"].config.urlRoot + \"/admin/teams\";\n }\n });\n }\n });\n });\n (0, _jquery[\"default\"])(\"#solves-delete-button\").click(function (e) {\n deleteSelectedSubmissions(e, \"solves\");\n });\n (0, _jquery[\"default\"])(\"#fails-delete-button\").click(function (e) {\n deleteSelectedSubmissions(e, \"fails\");\n });\n (0, _jquery[\"default\"])(\"#awards-delete-button\").click(function (e) {\n deleteSelectedAwards(e);\n });\n (0, _jquery[\"default\"])(\"#missing-solve-button\").click(function (e) {\n solveSelectedMissingChallenges(e);\n });\n (0, _jquery[\"default\"])(\"#team-info-create-form\").submit(createTeam);\n (0, _jquery[\"default\"])(\"#team-info-edit-form\").submit(updateTeam); // Insert CommentBox element\n\n var commentBox = _vueEsm[\"default\"].extend(_CommentBox[\"default\"]);\n\n var vueContainer = document.createElement(\"div\");\n document.querySelector(\"#comment-box\").appendChild(vueContainer);\n new commentBox({\n propsData: {\n type: \"team\",\n id: window.TEAM_ID\n }\n }).$mount(vueContainer); // Insert team member addition form\n\n var userAddForm = _vueEsm[\"default\"].extend(_UserAddForm[\"default\"]);\n\n var memberFormContainer = document.createElement(\"div\");\n document.querySelector(\"#team-add-modal .modal-body\").appendChild(memberFormContainer);\n new userAddForm({\n propsData: {\n team_id: window.TEAM_ID\n }\n }).$mount(memberFormContainer);\n var type, id, name, account_id;\n var _window$stats_data = window.stats_data;\n type = _window$stats_data.type;\n id = _window$stats_data.id;\n name = _window$stats_data.name;\n account_id = _window$stats_data.account_id;\n var intervalId;\n (0, _jquery[\"default\"])(\"#team-statistics-modal\").on(\"shown.bs.modal\", function (_e) {\n createGraphs(type, id, name, account_id);\n intervalId = setInterval(function () {\n updateGraphs(type, id, name, account_id);\n }, 300000);\n });\n (0, _jquery[\"default\"])(\"#team-statistics-modal\").on(\"hidden.bs.modal\", function (_e) {\n clearInterval(intervalId);\n });\n (0, _jquery[\"default\"])(\".statistics-team\").click(function (_event) {\n (0, _jquery[\"default\"])(\"#team-statistics-modal\").modal(\"toggle\");\n });\n});\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/pages/team.js?"); +eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/admin/assets/js/pages/main.js\");\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! core/CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _utils = __webpack_require__(/*! core/utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nvar _ezq = __webpack_require__(/*! core/ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nvar _graphs = __webpack_require__(/*! core/graphs */ \"./CTFd/themes/core/assets/js/graphs.js\");\n\nvar _vueEsm = _interopRequireDefault(__webpack_require__(/*! vue/dist/vue.esm.browser */ \"./node_modules/vue/dist/vue.esm.browser.js\"));\n\nvar _CommentBox = _interopRequireDefault(__webpack_require__(/*! ../components/comments/CommentBox.vue */ \"./CTFd/themes/admin/assets/js/components/comments/CommentBox.vue\"));\n\nvar _UserAddForm = _interopRequireDefault(__webpack_require__(/*! ../components/teams/UserAddForm.vue */ \"./CTFd/themes/admin/assets/js/components/teams/UserAddForm.vue\"));\n\nvar _utils2 = __webpack_require__(/*! ../../../../core/assets/js/utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _iterableToArrayLimit(arr, i) { if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\n\nfunction createTeam(event) {\n event.preventDefault();\n var params = (0, _jquery[\"default\"])(\"#team-info-create-form\").serializeJSON(true);\n params.fields = [];\n\n for (var property in params) {\n if (property.match(/fields\\[\\d+\\]/)) {\n var field = {};\n var id = parseInt(property.slice(7, -1));\n field[\"field_id\"] = id;\n field[\"value\"] = params[property];\n params.fields.push(field);\n delete params[property];\n }\n }\n\n _CTFd[\"default\"].fetch(\"/api/v1/teams\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n var team_id = response.data.id;\n window.location = _CTFd[\"default\"].config.urlRoot + \"/admin/teams/\" + team_id;\n } else {\n (0, _jquery[\"default\"])(\"#team-info-create-form > #results\").empty();\n Object.keys(response.errors).forEach(function (key, _index) {\n (0, _jquery[\"default\"])(\"#team-info-create-form > #results\").append((0, _ezq.ezBadge)({\n type: \"error\",\n body: response.errors[key]\n }));\n var i = (0, _jquery[\"default\"])(\"#team-info-create-form\").find(\"input[name={0}]\".format(key));\n var input = (0, _jquery[\"default\"])(i);\n input.addClass(\"input-filled-invalid\");\n input.removeClass(\"input-filled-valid\");\n });\n }\n });\n}\n\nfunction updateTeam(event) {\n event.preventDefault();\n var params = (0, _jquery[\"default\"])(\"#team-info-edit-form\").serializeJSON(true);\n params.fields = [];\n\n for (var property in params) {\n if (property.match(/fields\\[\\d+\\]/)) {\n var field = {};\n var id = parseInt(property.slice(7, -1));\n field[\"field_id\"] = id;\n field[\"value\"] = params[property];\n params.fields.push(field);\n delete params[property];\n }\n }\n\n _CTFd[\"default\"].fetch(\"/api/v1/teams/\" + window.TEAM_ID, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n window.location.reload();\n } else {\n (0, _jquery[\"default\"])(\"#team-info-form > #results\").empty();\n Object.keys(response.errors).forEach(function (key, _index) {\n (0, _jquery[\"default\"])(\"#team-info-form > #results\").append((0, _ezq.ezBadge)({\n type: \"error\",\n body: response.errors[key]\n }));\n var i = (0, _jquery[\"default\"])(\"#team-info-form\").find(\"input[name={0}]\".format(key));\n var input = (0, _jquery[\"default\"])(i);\n input.addClass(\"input-filled-invalid\");\n input.removeClass(\"input-filled-valid\");\n });\n }\n });\n}\n\nfunction correctSubmissions(_event) {\n var submissions = (0, _jquery[\"default\"])(\"input[data-submission-type=incorrect]:checked\");\n var submissionIDs = submissions.map(function () {\n return (0, _jquery[\"default\"])(this).data(\"submission-id\");\n });\n var target = submissionIDs.length === 1 ? \"submission\" : \"submissions\";\n (0, _ezq.ezQuery)({\n title: \"Correct Submissions\",\n body: \"Are you sure you want to mark \".concat(submissionIDs.length, \" \").concat(target, \" correct?\"),\n success: function success() {\n var reqs = [];\n\n var _iterator = _createForOfIteratorHelper(submissionIDs),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var subId = _step.value;\n\n var req = _CTFd[\"default\"].fetch(\"/api/v1/submissions/\".concat(subId), {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n type: \"correct\"\n })\n });\n\n reqs.push(req);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n Promise.all(reqs).then(function (_responses) {\n window.location.reload();\n });\n }\n });\n}\n\nfunction deleteSelectedSubmissions(event, target) {\n var submissions;\n var type;\n var title;\n\n switch (target) {\n case \"solves\":\n submissions = (0, _jquery[\"default\"])(\"input[data-submission-type=correct]:checked\");\n type = \"solve\";\n title = \"Solves\";\n break;\n\n case \"fails\":\n submissions = (0, _jquery[\"default\"])(\"input[data-submission-type=incorrect]:checked\");\n type = \"fail\";\n title = \"Fails\";\n break;\n\n default:\n break;\n }\n\n var submissionIDs = submissions.map(function () {\n return (0, _jquery[\"default\"])(this).data(\"submission-id\");\n });\n var target_string = submissionIDs.length === 1 ? type : type + \"s\";\n (0, _ezq.ezQuery)({\n title: \"Delete \".concat(title),\n body: \"Are you sure you want to delete \".concat(submissionIDs.length, \" \").concat(target_string, \"?\"),\n success: function success() {\n var reqs = [];\n\n var _iterator2 = _createForOfIteratorHelper(submissionIDs),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var subId = _step2.value;\n reqs.push(_CTFd[\"default\"].api.delete_submission({\n submissionId: subId\n }));\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n Promise.all(reqs).then(function (_responses) {\n window.location.reload();\n });\n }\n });\n}\n\nfunction deleteSelectedAwards(_event) {\n var awardIDs = (0, _jquery[\"default\"])(\"input[data-award-id]:checked\").map(function () {\n return (0, _jquery[\"default\"])(this).data(\"award-id\");\n });\n var target = awardIDs.length === 1 ? \"award\" : \"awards\";\n (0, _ezq.ezQuery)({\n title: \"Delete Awards\",\n body: \"Are you sure you want to delete \".concat(awardIDs.length, \" \").concat(target, \"?\"),\n success: function success() {\n var reqs = [];\n\n var _iterator3 = _createForOfIteratorHelper(awardIDs),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var awardID = _step3.value;\n\n var req = _CTFd[\"default\"].fetch(\"/api/v1/awards/\" + awardID, {\n method: \"DELETE\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n }\n });\n\n reqs.push(req);\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n\n Promise.all(reqs).then(function (_responses) {\n window.location.reload();\n });\n }\n });\n}\n\nfunction solveSelectedMissingChallenges(event) {\n event.preventDefault();\n var challengeIDs = (0, _jquery[\"default\"])(\"input[data-missing-challenge-id]:checked\").map(function () {\n return (0, _jquery[\"default\"])(this).data(\"missing-challenge-id\");\n });\n var target = challengeIDs.length === 1 ? \"challenge\" : \"challenges\";\n (0, _ezq.ezQuery)({\n title: \"Mark Correct\",\n body: \"Are you sure you want to mark \".concat(challengeIDs.length, \" \").concat(target, \" correct for \").concat((0, _utils.htmlEntities)(window.TEAM_NAME), \"?\"),\n success: function success() {\n (0, _ezq.ezAlert)({\n title: \"User Attribution\",\n body: \"\\n Which user on \".concat((0, _utils.htmlEntities)(window.TEAM_NAME), \" solved these challenges?\\n
\\n \").concat((0, _jquery[\"default\"])(\"#team-member-select\").html(), \"\\n
\\n \"),\n button: \"Mark Correct\",\n success: function success() {\n var USER_ID = (0, _jquery[\"default\"])(\"#query-team-member-solve > select\").val();\n var reqs = [];\n\n var _iterator4 = _createForOfIteratorHelper(challengeIDs),\n _step4;\n\n try {\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n var challengeID = _step4.value;\n var params = {\n provided: \"MARKED AS SOLVED BY ADMIN\",\n user_id: USER_ID,\n team_id: window.TEAM_ID,\n challenge_id: challengeID,\n type: \"correct\"\n };\n\n var req = _CTFd[\"default\"].fetch(\"/api/v1/submissions\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n });\n\n reqs.push(req);\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n\n Promise.all(reqs).then(function (_responses) {\n window.location.reload();\n });\n }\n });\n }\n });\n}\n\nvar api_funcs = {\n team: [function (x) {\n return _CTFd[\"default\"].api.get_team_solves({\n teamId: x\n });\n }, function (x) {\n return _CTFd[\"default\"].api.get_team_fails({\n teamId: x\n });\n }, function (x) {\n return _CTFd[\"default\"].api.get_team_awards({\n teamId: x\n });\n }],\n user: [function (x) {\n return _CTFd[\"default\"].api.get_user_solves({\n userId: x\n });\n }, function (x) {\n return _CTFd[\"default\"].api.get_user_fails({\n userId: x\n });\n }, function (x) {\n return _CTFd[\"default\"].api.get_user_awards({\n userId: x\n });\n }]\n};\n\nvar createGraphs = function createGraphs(type, id, name, account_id) {\n var _api_funcs$type = _slicedToArray(api_funcs[type], 3),\n solves_func = _api_funcs$type[0],\n fails_func = _api_funcs$type[1],\n awards_func = _api_funcs$type[2];\n\n Promise.all([solves_func(account_id), fails_func(account_id), awards_func(account_id)]).then(function (responses) {\n (0, _graphs.createGraph)(\"score_graph\", \"#score-graph\", responses, type, id, name, account_id);\n (0, _graphs.createGraph)(\"category_breakdown\", \"#categories-pie-graph\", responses, type, id, name, account_id);\n (0, _graphs.createGraph)(\"solve_percentages\", \"#keys-pie-graph\", responses, type, id, name, account_id);\n });\n};\n\nvar updateGraphs = function updateGraphs(type, id, name, account_id) {\n var _api_funcs$type2 = _slicedToArray(api_funcs[type], 3),\n solves_func = _api_funcs$type2[0],\n fails_func = _api_funcs$type2[1],\n awards_func = _api_funcs$type2[2];\n\n Promise.all([solves_func(account_id), fails_func(account_id), awards_func(account_id)]).then(function (responses) {\n (0, _graphs.updateGraph)(\"score_graph\", \"#score-graph\", responses, type, id, name, account_id);\n (0, _graphs.updateGraph)(\"category_breakdown\", \"#categories-pie-graph\", responses, type, id, name, account_id);\n (0, _graphs.updateGraph)(\"solve_percentages\", \"#keys-pie-graph\", responses, type, id, name, account_id);\n });\n};\n\n(0, _jquery[\"default\"])(function () {\n (0, _jquery[\"default\"])(\"#team-captain-form\").submit(function (e) {\n e.preventDefault();\n var params = (0, _jquery[\"default\"])(\"#team-captain-form\").serializeJSON(true);\n\n _CTFd[\"default\"].fetch(\"/api/v1/teams/\" + window.TEAM_ID, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n window.location.reload();\n } else {\n (0, _jquery[\"default\"])(\"#team-captain-form > #results\").empty();\n Object.keys(response.errors).forEach(function (key, _index) {\n (0, _jquery[\"default\"])(\"#team-captain-form > #results\").append((0, _ezq.ezBadge)({\n type: \"error\",\n body: response.errors[key]\n }));\n var i = (0, _jquery[\"default\"])(\"#team-captain-form\").find(\"select[name={0}]\".format(key));\n var input = (0, _jquery[\"default\"])(i);\n input.addClass(\"input-filled-invalid\");\n input.removeClass(\"input-filled-valid\");\n });\n }\n });\n });\n (0, _jquery[\"default\"])(\".edit-team\").click(function (_e) {\n (0, _jquery[\"default\"])(\"#team-info-edit-modal\").modal(\"toggle\");\n });\n (0, _jquery[\"default\"])(\".invite-team\").click(function (_e) {\n _CTFd[\"default\"].fetch(\"/api/v1/teams/\".concat(window.TEAM_ID, \"/members\"), {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n }\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n var code = response.data.code;\n var url = \"\".concat(window.location.origin).concat(_CTFd[\"default\"].config.urlRoot, \"/teams/invite?code=\").concat(code);\n (0, _jquery[\"default\"])(\"#team-invite-modal input[name=link]\").val(url);\n (0, _jquery[\"default\"])(\"#team-invite-modal\").modal(\"toggle\");\n }\n });\n });\n (0, _jquery[\"default\"])(\"#team-invite-link-copy\").click(function (e) {\n (0, _utils2.copyToClipboard)(e, \"#team-invite-link\");\n });\n (0, _jquery[\"default\"])(\".members-team\").click(function (_e) {\n (0, _jquery[\"default\"])(\"#team-add-modal\").modal(\"toggle\");\n });\n (0, _jquery[\"default\"])(\".edit-captain\").click(function (_e) {\n (0, _jquery[\"default\"])(\"#team-captain-modal\").modal(\"toggle\");\n });\n (0, _jquery[\"default\"])(\".award-team\").click(function (_e) {\n (0, _jquery[\"default\"])(\"#team-award-modal\").modal(\"toggle\");\n });\n (0, _jquery[\"default\"])(\".addresses-team\").click(function (_event) {\n (0, _jquery[\"default\"])(\"#team-addresses-modal\").modal(\"toggle\");\n });\n (0, _jquery[\"default\"])(\"#user-award-form\").submit(function (e) {\n e.preventDefault();\n var params = (0, _jquery[\"default\"])(\"#user-award-form\").serializeJSON(true);\n params[\"user_id\"] = (0, _jquery[\"default\"])(\"#award-member-input\").val();\n params[\"team_id\"] = window.TEAM_ID;\n (0, _jquery[\"default\"])(\"#user-award-form > #results\").empty();\n\n if (!params[\"user_id\"]) {\n (0, _jquery[\"default\"])(\"#user-award-form > #results\").append((0, _ezq.ezBadge)({\n type: \"error\",\n body: \"Please select a team member\"\n }));\n return;\n }\n\n params[\"user_id\"] = parseInt(params[\"user_id\"]);\n\n _CTFd[\"default\"].fetch(\"/api/v1/awards\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n window.location.reload();\n } else {\n (0, _jquery[\"default\"])(\"#user-award-form > #results\").empty();\n Object.keys(response.errors).forEach(function (key, _index) {\n (0, _jquery[\"default\"])(\"#user-award-form > #results\").append((0, _ezq.ezBadge)({\n type: \"error\",\n body: response.errors[key]\n }));\n var i = (0, _jquery[\"default\"])(\"#user-award-form\").find(\"input[name={0}]\".format(key));\n var input = (0, _jquery[\"default\"])(i);\n input.addClass(\"input-filled-invalid\");\n input.removeClass(\"input-filled-valid\");\n });\n }\n });\n });\n (0, _jquery[\"default\"])(\".delete-member\").click(function (e) {\n e.preventDefault();\n var member_id = (0, _jquery[\"default\"])(this).attr(\"member-id\");\n var member_name = (0, _jquery[\"default\"])(this).attr(\"member-name\");\n var params = {\n user_id: member_id\n };\n var row = (0, _jquery[\"default\"])(this).parent().parent();\n (0, _ezq.ezQuery)({\n title: \"Remove Member\",\n body: \"Are you sure you want to remove {0} from {1}?

All of their challenge solves, attempts, awards, and unlocked hints will also be deleted!\".format(\"\" + (0, _utils.htmlEntities)(member_name) + \"\", \"\" + (0, _utils.htmlEntities)(window.TEAM_NAME) + \"\"),\n success: function success() {\n _CTFd[\"default\"].fetch(\"/api/v1/teams/\" + window.TEAM_ID + \"/members\", {\n method: \"DELETE\",\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n row.remove();\n }\n });\n }\n });\n });\n (0, _jquery[\"default\"])(\".delete-team\").click(function (_e) {\n (0, _ezq.ezQuery)({\n title: \"Delete Team\",\n body: \"Are you sure you want to delete {0}\".format(\"\" + (0, _utils.htmlEntities)(window.TEAM_NAME) + \"\"),\n success: function success() {\n _CTFd[\"default\"].fetch(\"/api/v1/teams/\" + window.TEAM_ID, {\n method: \"DELETE\"\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n window.location = _CTFd[\"default\"].config.urlRoot + \"/admin/teams\";\n }\n });\n }\n });\n });\n (0, _jquery[\"default\"])(\"#solves-delete-button\").click(function (e) {\n deleteSelectedSubmissions(e, \"solves\");\n });\n (0, _jquery[\"default\"])(\"#correct-fail-button\").click(correctSubmissions);\n (0, _jquery[\"default\"])(\"#fails-delete-button\").click(function (e) {\n deleteSelectedSubmissions(e, \"fails\");\n });\n (0, _jquery[\"default\"])(\"#awards-delete-button\").click(function (e) {\n deleteSelectedAwards(e);\n });\n (0, _jquery[\"default\"])(\"#missing-solve-button\").click(function (e) {\n solveSelectedMissingChallenges(e);\n });\n (0, _jquery[\"default\"])(\"#team-info-create-form\").submit(createTeam);\n (0, _jquery[\"default\"])(\"#team-info-edit-form\").submit(updateTeam); // Insert CommentBox element\n\n var commentBox = _vueEsm[\"default\"].extend(_CommentBox[\"default\"]);\n\n var vueContainer = document.createElement(\"div\");\n document.querySelector(\"#comment-box\").appendChild(vueContainer);\n new commentBox({\n propsData: {\n type: \"team\",\n id: window.TEAM_ID\n }\n }).$mount(vueContainer); // Insert team member addition form\n\n var userAddForm = _vueEsm[\"default\"].extend(_UserAddForm[\"default\"]);\n\n var memberFormContainer = document.createElement(\"div\");\n document.querySelector(\"#team-add-modal .modal-body\").appendChild(memberFormContainer);\n new userAddForm({\n propsData: {\n team_id: window.TEAM_ID\n }\n }).$mount(memberFormContainer);\n var type, id, name, account_id;\n var _window$stats_data = window.stats_data;\n type = _window$stats_data.type;\n id = _window$stats_data.id;\n name = _window$stats_data.name;\n account_id = _window$stats_data.account_id;\n var intervalId;\n (0, _jquery[\"default\"])(\"#team-statistics-modal\").on(\"shown.bs.modal\", function (_e) {\n createGraphs(type, id, name, account_id);\n intervalId = setInterval(function () {\n updateGraphs(type, id, name, account_id);\n }, 300000);\n });\n (0, _jquery[\"default\"])(\"#team-statistics-modal\").on(\"hidden.bs.modal\", function (_e) {\n clearInterval(intervalId);\n });\n (0, _jquery[\"default\"])(\".statistics-team\").click(function (_event) {\n (0, _jquery[\"default\"])(\"#team-statistics-modal\").modal(\"toggle\");\n });\n});\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/pages/team.js?"); /***/ }) diff --git a/CTFd/themes/admin/static/js/pages/team.min.js b/CTFd/themes/admin/static/js/pages/team.min.js index 15337efa..b88bc103 100644 --- a/CTFd/themes/admin/static/js/pages/team.min.js +++ b/CTFd/themes/admin/static/js/pages/team.min.js @@ -1 +1 @@ -!function(d){function e(e){for(var t,o,n=e[0],i=e[1],a=e[2],r=0,s=[];r=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,r=!0,s=!1;return{s:function(){o=e[Symbol.iterator]()},n:function(){var e=o.next();return r=e.done,e},e:function(e){s=!0,a=e},f:function(){try{r||null==o.return||o.return()}finally{if(s)throw a}}}}function c(e,t){if(e){if("string"==typeof e)return i(e,t);var o=Object.prototype.toString.call(e).slice(8,-1);return"Object"===o&&e.constructor&&(o=e.constructor.name),"Map"===o||"Set"===o?Array.from(e):"Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o)?i(e,t):void 0}}function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var o=0,n=new Array(t);o #results").empty(),Object.keys(i.errors).forEach(function(e,t){(0,d.default)("#team-info-create-form > #results").append((0,h.ezBadge)({type:"error",body:i.errors[e]}));var o=(0,d.default)("#team-info-create-form").find("input[name={0}]".format(e)),n=(0,d.default)(o);n.addClass("input-filled-invalid"),n.removeClass("input-filled-valid")}))})}function T(e){e.preventDefault();var t,o,n,i=(0,d.default)("#team-info-edit-form").serializeJSON(!0);for(t in i.fields=[],i){t.match(/fields\[\d+\]/)&&(o={},n=parseInt(t.slice(7,-1)),o.field_id=n,o.value=i[t],i.fields.push(o),delete i[t])}m.default.fetch("/api/v1/teams/"+window.TEAM_ID,{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(i)}).then(function(e){return e.json()}).then(function(i){i.success?window.location.reload():((0,d.default)("#team-info-form > #results").empty(),Object.keys(i.errors).forEach(function(e,t){(0,d.default)("#team-info-form > #results").append((0,h.ezBadge)({type:"error",body:i.errors[e]}));var o=(0,d.default)("#team-info-form").find("input[name={0}]".format(e)),n=(0,d.default)(o);n.addClass("input-filled-invalid"),n.removeClass("input-filled-valid")}))})}function w(e,t){var o,n,i;switch(t){case"solves":o=(0,d.default)("input[data-submission-type=correct]:checked"),n="solve",i="Solves";break;case"fails":o=(0,d.default)("input[data-submission-type=incorrect]:checked"),n="fail",i="Fails"}var a=o.map(function(){return(0,d.default)(this).data("submission-id")}),r=1===a.length?n:n+"s";(0,h.ezQuery)({title:"Delete ".concat(i),body:"Are you sure you want to delete ".concat(a.length," ").concat(r,"?"),success:function(){var e,t=[],o=_(a);try{for(o.s();!(e=o.n()).done;){var n=e.value;t.push(m.default.api.delete_submission({submissionId:n}))}}catch(e){o.e(e)}finally{o.f()}Promise.all(t).then(function(e){window.location.reload()})}})}var C={team:[function(e){return m.default.api.get_team_solves({teamId:e})},function(e){return m.default.api.get_team_fails({teamId:e})},function(e){return m.default.api.get_team_awards({teamId:e})}],user:[function(e){return m.default.api.get_user_solves({userId:e})},function(e){return m.default.api.get_user_fails({userId:e})},function(e){return m.default.api.get_user_awards({userId:e})}]};(0,d.default)(function(){(0,d.default)("#team-captain-form").submit(function(e){e.preventDefault();var t=(0,d.default)("#team-captain-form").serializeJSON(!0);m.default.fetch("/api/v1/teams/"+window.TEAM_ID,{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)}).then(function(e){return e.json()}).then(function(i){i.success?window.location.reload():((0,d.default)("#team-captain-form > #results").empty(),Object.keys(i.errors).forEach(function(e,t){(0,d.default)("#team-captain-form > #results").append((0,h.ezBadge)({type:"error",body:i.errors[e]}));var o=(0,d.default)("#team-captain-form").find("select[name={0}]".format(e)),n=(0,d.default)(o);n.addClass("input-filled-invalid"),n.removeClass("input-filled-valid")}))})}),(0,d.default)(".edit-team").click(function(e){(0,d.default)("#team-info-edit-modal").modal("toggle")}),(0,d.default)(".invite-team").click(function(e){m.default.fetch("/api/v1/teams/".concat(window.TEAM_ID,"/members"),{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"}}).then(function(e){return e.json()}).then(function(e){var t,o;e.success&&(t=e.data.code,o="".concat(window.location.origin).concat(m.default.config.urlRoot,"/teams/invite?code=").concat(t),(0,d.default)("#team-invite-modal input[name=link]").val(o),(0,d.default)("#team-invite-modal").modal("toggle"))})}),(0,d.default)("#team-invite-link-copy").click(function(e){(0,y.copyToClipboard)(e,"#team-invite-link")}),(0,d.default)(".members-team").click(function(e){(0,d.default)("#team-add-modal").modal("toggle")}),(0,d.default)(".edit-captain").click(function(e){(0,d.default)("#team-captain-modal").modal("toggle")}),(0,d.default)(".award-team").click(function(e){(0,d.default)("#team-award-modal").modal("toggle")}),(0,d.default)(".addresses-team").click(function(e){(0,d.default)("#team-addresses-modal").modal("toggle")}),(0,d.default)("#user-award-form").submit(function(e){e.preventDefault();var t=(0,d.default)("#user-award-form").serializeJSON(!0);t.user_id=(0,d.default)("#award-member-input").val(),t.team_id=window.TEAM_ID,(0,d.default)("#user-award-form > #results").empty(),t.user_id?(t.user_id=parseInt(t.user_id),m.default.fetch("/api/v1/awards",{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)}).then(function(e){return e.json()}).then(function(i){i.success?window.location.reload():((0,d.default)("#user-award-form > #results").empty(),Object.keys(i.errors).forEach(function(e,t){(0,d.default)("#user-award-form > #results").append((0,h.ezBadge)({type:"error",body:i.errors[e]}));var o=(0,d.default)("#user-award-form").find("input[name={0}]".format(e)),n=(0,d.default)(o);n.addClass("input-filled-invalid"),n.removeClass("input-filled-valid")}))})):(0,d.default)("#user-award-form > #results").append((0,h.ezBadge)({type:"error",body:"Please select a team member"}))}),(0,d.default)(".delete-member").click(function(e){e.preventDefault();var t=(0,d.default)(this).attr("member-id"),o=(0,d.default)(this).attr("member-name"),n={user_id:t},i=(0,d.default)(this).parent().parent();(0,h.ezQuery)({title:"Remove Member",body:"Are you sure you want to remove {0} from {1}?

All of their challenge solves, attempts, awards, and unlocked hints will also be deleted!".format(""+(0,a.htmlEntities)(o)+"",""+(0,a.htmlEntities)(window.TEAM_NAME)+""),success:function(){m.default.fetch("/api/v1/teams/"+window.TEAM_ID+"/members",{method:"DELETE",body:JSON.stringify(n)}).then(function(e){return e.json()}).then(function(e){e.success&&i.remove()})}})}),(0,d.default)(".delete-team").click(function(e){(0,h.ezQuery)({title:"Delete Team",body:"Are you sure you want to delete {0}".format(""+(0,a.htmlEntities)(window.TEAM_NAME)+""),success:function(){m.default.fetch("/api/v1/teams/"+window.TEAM_ID,{method:"DELETE"}).then(function(e){return e.json()}).then(function(e){e.success&&(window.location=m.default.config.urlRoot+"/admin/teams")})}})}),(0,d.default)("#solves-delete-button").click(function(e){w(0,"solves")}),(0,d.default)("#fails-delete-button").click(function(e){w(0,"fails")}),(0,d.default)("#awards-delete-button").click(function(e){var a,t;a=(0,d.default)("input[data-award-id]:checked").map(function(){return(0,d.default)(this).data("award-id")}),t=1===a.length?"award":"awards",(0,h.ezQuery)({title:"Delete Awards",body:"Are you sure you want to delete ".concat(a.length," ").concat(t,"?"),success:function(){var e,t=[],o=_(a);try{for(o.s();!(e=o.n()).done;){var n=e.value,i=m.default.fetch("/api/v1/awards/"+n,{method:"DELETE",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"}});t.push(i)}}catch(e){o.e(e)}finally{o.f()}Promise.all(t).then(function(e){window.location.reload()})}})}),(0,d.default)("#missing-solve-button").click(function(e){!function(e){e.preventDefault();var s=(0,d.default)("input[data-missing-challenge-id]:checked").map(function(){return(0,d.default)(this).data("missing-challenge-id")}),t=1===s.length?"challenge":"challenges";(0,h.ezQuery)({title:"Mark Correct",body:"Are you sure you want to mark ".concat(s.length," ").concat(t," correct for ").concat((0,a.htmlEntities)(window.TEAM_NAME),"?"),success:function(){(0,h.ezAlert)({title:"User Attribution",body:"\n Which user on ".concat((0,a.htmlEntities)(window.TEAM_NAME),' solved these challenges?\n
\n ').concat((0,d.default)("#team-member-select").html(),"\n
\n "),button:"Mark Correct",success:function(){var e,t=(0,d.default)("#query-team-member-solve > select").val(),o=[],n=_(s);try{for(n.s();!(e=n.n()).done;){var i=e.value,a={provided:"MARKED AS SOLVED BY ADMIN",user_id:t,team_id:window.TEAM_ID,challenge_id:i,type:"correct"},r=m.default.fetch("/api/v1/submissions",{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(a)});o.push(r)}}catch(e){n.e(e)}finally{n.f()}Promise.all(o).then(function(e){window.location.reload()})}})}})}(e)}),(0,d.default)("#team-info-create-form").submit(b),(0,d.default)("#team-info-edit-form").submit(T);var e=r.default.extend(s.default),t=document.createElement("div");document.querySelector("#comment-box").appendChild(t),new e({propsData:{type:"team",id:window.TEAM_ID}}).$mount(t);var o=r.default.extend(v.default),n=document.createElement("div");document.querySelector("#team-add-modal .modal-body").appendChild(n),new o({propsData:{team_id:window.TEAM_ID}}).$mount(n);var c,i=window.stats_data,l=i.type,u=i.id,p=i.name,f=i.account_id;(0,d.default)("#team-statistics-modal").on("shown.bs.modal",function(e){var t,o,n,i,a,r,s,d;o=u,n=p,i=f,a=j(C[t=l],3),r=a[0],s=a[1],d=a[2],Promise.all([r(i),s(i),d(i)]).then(function(e){(0,g.createGraph)("score_graph","#score-graph",e,t,o,n,i),(0,g.createGraph)("category_breakdown","#categories-pie-graph",e,t,o,n,i),(0,g.createGraph)("solve_percentages","#keys-pie-graph",e,t,o,n,i)}),c=setInterval(function(){var t,o,n,i,e,a,r,s;o=u,n=p,i=f,e=j(C[t=l],3),a=e[0],r=e[1],s=e[2],Promise.all([a(i),r(i),s(i)]).then(function(e){(0,g.updateGraph)("score_graph","#score-graph",e,t,o,n,i),(0,g.updateGraph)("category_breakdown","#categories-pie-graph",e,t,o,n,i),(0,g.updateGraph)("solve_percentages","#keys-pie-graph",e,t,o,n,i)})},3e5)}),(0,d.default)("#team-statistics-modal").on("hidden.bs.modal",function(e){clearInterval(c)}),(0,d.default)(".statistics-team").click(function(e){(0,d.default)("#team-statistics-modal").modal("toggle")})})},"./CTFd/themes/admin/assets/js/styles.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.showMediaLibrary=l,t.bindMarkdownEditor=u,t.bindMarkdownEditors=p,t.default=void 0,o("./node_modules/bootstrap/dist/js/bootstrap.bundle.js");var n=o("./CTFd/themes/core/assets/js/utils.js"),i=c(o("./node_modules/jquery/dist/jquery.js")),a=c(o("./node_modules/easymde/src/js/easymde.js")),r=c(o("./node_modules/vue/dist/vue.esm.browser.js")),s=c(o("./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue")),d=c(o("./node_modules/highlight.js/lib/index.js"));function c(e){return e&&e.__esModule?e:{default:e}}function l(e){var t=r.default.extend(s.default),o=document.createElement("div");document.querySelector("main").appendChild(o);var n=new t({propsData:{editor:e}}).$mount(o);(0,i.default)("#media-modal").on("hidden.bs.modal",function(e){n.$destroy(),(0,i.default)("#media-modal").remove()}),(0,i.default)("#media-modal").modal()}function u(e){var t;!1===e.hasOwnProperty("mde")&&(t=new a.default({autoDownloadFontAwesome:!1,toolbar:["bold","italic","heading","|","quote","unordered-list","ordered-list","|","link","image",{name:"media",action:function(e){l(e)},className:"fas fa-file-upload",title:"Media Library"},"|","preview","guide"],element:e,initialValue:(0,i.default)(e).val(),forceSync:!0,minHeight:"200px",renderingConfig:{codeSyntaxHighlighting:!0,hljs:d.default}}),e.mde=t,e.codemirror=t.codemirror,(0,i.default)(e).on("change keyup paste",function(){t.codemirror.getDoc().setValue((0,i.default)(e).val()),t.codemirror.refresh()}))}function p(){(0,i.default)("textarea.markdown").each(function(e,t){u(t)})}t.default=function(){(0,i.default)(":input").each(function(){(0,i.default)(this).data("initial",(0,i.default)(this).val())}),(0,i.default)(function(){(0,i.default)("tr[data-href], td[data-href]").click(function(){var e;return getSelection().toString()||(e=(0,i.default)(this).attr("data-href"))&&(window.location=e),!1}),(0,i.default)("[data-checkbox]").click(function(e){(0,i.default)(e.target).is("input[type=checkbox]")||(0,i.default)(this).find("input[type=checkbox]").click(),e.stopImmediatePropagation()}),(0,i.default)("[data-checkbox-all]").on("click change",function(e){var t=(0,i.default)(this).prop("checked"),o=(0,i.default)(this).index()+1;(0,i.default)(this).closest("table").find("tr td:nth-child(".concat(o,") input[type=checkbox]")).prop("checked",t),e.stopImmediatePropagation()}),(0,i.default)("tr[data-href] a, tr[data-href] button").click(function(e){(0,i.default)(this).attr("data-dismiss")||e.stopPropagation()}),(0,i.default)(".page-select").change(function(){var e=new URL(window.location);e.searchParams.set("page",this.value),window.location.href=e.toString()}),(0,i.default)('a[data-toggle="tab"]').on("shown.bs.tab",function(e){sessionStorage.setItem("activeTab",(0,i.default)(e.target).attr("href"))});var e,t=sessionStorage.getItem("activeTab");t&&((e=(0,i.default)('.nav-tabs a[href="'.concat(t,'"], .nav-pills a[href="').concat(t,'"]'))).length?e.tab("show"):sessionStorage.removeItem("activeTab")),p(),(0,n.makeSortableTables)(),(0,i.default)('[data-toggle="tooltip"]').tooltip(),document.querySelectorAll("pre code").forEach(function(e){d.default.highlightBlock(e)})})}},"./CTFd/themes/core/assets/js/CTFd.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=u(o("./node_modules/jquery/dist/jquery.js")),i=u(o("./node_modules/dayjs/dayjs.min.js")),a=u(o("./node_modules/markdown-it/index.js"));o("./CTFd/themes/core/assets/js/patch.js");var r=u(o("./CTFd/themes/core/assets/js/fetch.js")),s=u(o("./CTFd/themes/core/assets/js/config.js")),d=o("./CTFd/themes/core/assets/js/api.js"),c=u(o("./CTFd/themes/core/assets/js/ezq.js")),l=o("./CTFd/themes/core/assets/js/utils.js");function u(e){return e&&e.__esModule?e:{default:e}}function p(t,e){var o,n=Object.keys(t);return Object.getOwnPropertySymbols&&(o=Object.getOwnPropertySymbols(t),e&&(o=o.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,o)),n}function f(i){for(var e=1;e".concat(e.body,"

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

".concat(e.body,"

")):o.find(".modal-body").append((0,s.default)(e.body));var n=(0,s.default)(f),i=(0,s.default)(p);return o.find(".modal-footer").append(i),o.find(".modal-footer").append(n),o.find("pre code").each(function(e){a.default.highlightBlock(this)}),(0,s.default)("main").append(o),(0,s.default)(o).on("hidden.bs.modal",function(){(0,s.default)(this).modal("dispose")}),(0,s.default)(n).click(function(){e.success()}),o.modal("show"),o}function v(e){if(e.target){var t=(0,s.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var o=c.format(e.width),n=r.format(e.title),i=(0,s.default)(n);return i.find(".modal-body").append((0,s.default)(o)),(0,s.default)("main").append(i),i.modal("show")}function y(e){var t={success:l,error:i}[e.type].format(e.body);return(0,s.default)(t)}var j={ezAlert:m,ezToast:h,ezQuery:g,ezProgressBar:v,ezBadge:y};t.default=j},"./CTFd/themes/core/assets/js/fetch.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,o("./node_modules/whatwg-fetch/fetch.js");var n,i=(n=o("./CTFd/themes/core/assets/js/config.js"))&&n.__esModule?n:{default:n};var a=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=i.default.urlRoot+e,void 0===t.headers&&(t.headers={}),t.credentials="same-origin",t.headers.Accept="application/json",t.headers["Content-Type"]="application/json",t.headers["CSRF-Token"]=i.default.csrfNonce,a(e,t)}},"./CTFd/themes/core/assets/js/graphs.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.createGraph=function(e,t,o,n,i,a,r){var s=u[e],d=l.default.init(document.querySelector(t));d.setOption(s.format(n,i,a,r,o)),(0,c.default)(window).on("resize",function(){null!=d&&null!=d&&d.resize()})},t.updateGraph=function(e,t,o,n,i,a,r){var s=u[e];l.default.init(document.querySelector(t)).setOption(s.format(n,i,a,r,o))},t.disposeGraph=function(e){l.default.dispose(document.querySelector(e))};var c=n(o("./node_modules/jquery/dist/jquery.js")),l=n(o("./node_modules/echarts/dist/echarts-en.common.js")),f=n(o("./node_modules/dayjs/dayjs.min.js")),m=o("./CTFd/themes/core/assets/js/utils.js");function n(e){return e&&e.__esModule?e:{default:e}}var u={score_graph:{format:function(e,t,o,n,i){var a={title:{left:"center",text:"Score over Time"},tooltip:{trigger:"axis",axisPointer:{type:"cross"}},legend:{type:"scroll",orient:"horizontal",align:"left",bottom:0,data:[o]},toolbox:{feature:{saveAsImage:{}}},grid:{containLabel:!0},xAxis:[{type:"category",boundaryGap:!1,data:[]}],yAxis:[{type:"value"}],dataZoom:[{id:"dataZoomX",type:"slider",xAxisIndex:[0],filterMode:"filter",height:20,top:35,fillerColor:"rgba(233, 236, 241, 0.4)"}],series:[]},r=[],s=[],d=i[0].data,c=i[2].data,l=d.concat(c);l.sort(function(e,t){return new Date(e.date)-new Date(t.date)});for(var u=0;u'),(0,r.default)("th.sort-col").click(function(){var i,e=(0,r.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort((i=(0,r.default)(this).index(),function(e,t){var o=a(e,i),n=a(t,i);return r.default.isNumeric(o)&&r.default.isNumeric(n)?o-n:o.toString().localeCompare(n)}));this.asc=!this.asc,this.asc||(t=t.reverse());for(var o=0;o").text(e).html()};var n,r=(n=o("./node_modules/jquery/dist/jquery.js"))&&n.__esModule?n:{default:n};function i(){this.id=Math.random(),this.isMaster=!1,this.others={},window.addEventListener("storage",this,!1),window.addEventListener("unload",this,!1),this.broadcast("hello");var t=this;this._checkTimeout=setTimeout(function e(){t.check(),t._checkTimeout=setTimeout(e,9e3)},500),this._pingTimeout=setTimeout(function e(){t.sendPing(),t._pingTimeout=setTimeout(e,17e3)},17e3)}r.default.fn.serializeJSON=function(o){var n={},i=(0,r.default)(this),e=i.serializeArray();return(e=(e=e.concat(i.find("input[type=checkbox]:checked").map(function(){return{name:this.name,value:!0}}).get())).concat(i.find("input[type=checkbox]:not(:checked)").map(function(){return{name:this.name,value:!1}}).get())).map(function(e){var t;o&&(null===e.value||""===e.value)&&(t=i.find(":input[name='".concat(e.name,"']"))).data("initial")===t.val()||(n[e.name]=e.value)}),n},String.prototype.format=String.prototype.f=function(){for(var e=this,t=arguments.length;t--;)e=e.replace(new RegExp("\\{"+t+"\\}","gm"),arguments[t]);return e},String.prototype.hashCode=function(){var e,t,o=0;if(0==this.length)return o;for(e=0,t=this.length;e=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,r=!0,s=!1;return{s:function(){o=e[Symbol.iterator]()},n:function(){var e=o.next();return r=e.done,e},e:function(e){s=!0,a=e},f:function(){try{r||null==o.return||o.return()}finally{if(s)throw a}}}}function c(e,t){if(e){if("string"==typeof e)return i(e,t);var o=Object.prototype.toString.call(e).slice(8,-1);return"Object"===o&&e.constructor&&(o=e.constructor.name),"Map"===o||"Set"===o?Array.from(e):"Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o)?i(e,t):void 0}}function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var o=0,n=new Array(t);o #results").empty(),Object.keys(i.errors).forEach(function(e,t){(0,d.default)("#team-info-create-form > #results").append((0,h.ezBadge)({type:"error",body:i.errors[e]}));var o=(0,d.default)("#team-info-create-form").find("input[name={0}]".format(e)),n=(0,d.default)(o);n.addClass("input-filled-invalid"),n.removeClass("input-filled-valid")}))})}function T(e){e.preventDefault();var t,o,n,i=(0,d.default)("#team-info-edit-form").serializeJSON(!0);for(t in i.fields=[],i){t.match(/fields\[\d+\]/)&&(o={},n=parseInt(t.slice(7,-1)),o.field_id=n,o.value=i[t],i.fields.push(o),delete i[t])}m.default.fetch("/api/v1/teams/"+window.TEAM_ID,{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(i)}).then(function(e){return e.json()}).then(function(i){i.success?window.location.reload():((0,d.default)("#team-info-form > #results").empty(),Object.keys(i.errors).forEach(function(e,t){(0,d.default)("#team-info-form > #results").append((0,h.ezBadge)({type:"error",body:i.errors[e]}));var o=(0,d.default)("#team-info-form").find("input[name={0}]".format(e)),n=(0,d.default)(o);n.addClass("input-filled-invalid"),n.removeClass("input-filled-valid")}))})}function w(e){var a=(0,d.default)("input[data-submission-type=incorrect]:checked").map(function(){return(0,d.default)(this).data("submission-id")}),t=1===a.length?"submission":"submissions";(0,h.ezQuery)({title:"Correct Submissions",body:"Are you sure you want to mark ".concat(a.length," ").concat(t," correct?"),success:function(){var e,t=[],o=_(a);try{for(o.s();!(e=o.n()).done;){var n=e.value,i=m.default.fetch("/api/v1/submissions/".concat(n),{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({type:"correct"})});t.push(i)}}catch(e){o.e(e)}finally{o.f()}Promise.all(t).then(function(e){window.location.reload()})}})}function C(e,t){var o,n,i;switch(t){case"solves":o=(0,d.default)("input[data-submission-type=correct]:checked"),n="solve",i="Solves";break;case"fails":o=(0,d.default)("input[data-submission-type=incorrect]:checked"),n="fail",i="Fails"}var a=o.map(function(){return(0,d.default)(this).data("submission-id")}),r=1===a.length?n:n+"s";(0,h.ezQuery)({title:"Delete ".concat(i),body:"Are you sure you want to delete ".concat(a.length," ").concat(r,"?"),success:function(){var e,t=[],o=_(a);try{for(o.s();!(e=o.n()).done;){var n=e.value;t.push(m.default.api.delete_submission({submissionId:n}))}}catch(e){o.e(e)}finally{o.f()}Promise.all(t).then(function(e){window.location.reload()})}})}var E={team:[function(e){return m.default.api.get_team_solves({teamId:e})},function(e){return m.default.api.get_team_fails({teamId:e})},function(e){return m.default.api.get_team_awards({teamId:e})}],user:[function(e){return m.default.api.get_user_solves({userId:e})},function(e){return m.default.api.get_user_fails({userId:e})},function(e){return m.default.api.get_user_awards({userId:e})}]};(0,d.default)(function(){(0,d.default)("#team-captain-form").submit(function(e){e.preventDefault();var t=(0,d.default)("#team-captain-form").serializeJSON(!0);m.default.fetch("/api/v1/teams/"+window.TEAM_ID,{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)}).then(function(e){return e.json()}).then(function(i){i.success?window.location.reload():((0,d.default)("#team-captain-form > #results").empty(),Object.keys(i.errors).forEach(function(e,t){(0,d.default)("#team-captain-form > #results").append((0,h.ezBadge)({type:"error",body:i.errors[e]}));var o=(0,d.default)("#team-captain-form").find("select[name={0}]".format(e)),n=(0,d.default)(o);n.addClass("input-filled-invalid"),n.removeClass("input-filled-valid")}))})}),(0,d.default)(".edit-team").click(function(e){(0,d.default)("#team-info-edit-modal").modal("toggle")}),(0,d.default)(".invite-team").click(function(e){m.default.fetch("/api/v1/teams/".concat(window.TEAM_ID,"/members"),{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"}}).then(function(e){return e.json()}).then(function(e){var t,o;e.success&&(t=e.data.code,o="".concat(window.location.origin).concat(m.default.config.urlRoot,"/teams/invite?code=").concat(t),(0,d.default)("#team-invite-modal input[name=link]").val(o),(0,d.default)("#team-invite-modal").modal("toggle"))})}),(0,d.default)("#team-invite-link-copy").click(function(e){(0,y.copyToClipboard)(e,"#team-invite-link")}),(0,d.default)(".members-team").click(function(e){(0,d.default)("#team-add-modal").modal("toggle")}),(0,d.default)(".edit-captain").click(function(e){(0,d.default)("#team-captain-modal").modal("toggle")}),(0,d.default)(".award-team").click(function(e){(0,d.default)("#team-award-modal").modal("toggle")}),(0,d.default)(".addresses-team").click(function(e){(0,d.default)("#team-addresses-modal").modal("toggle")}),(0,d.default)("#user-award-form").submit(function(e){e.preventDefault();var t=(0,d.default)("#user-award-form").serializeJSON(!0);t.user_id=(0,d.default)("#award-member-input").val(),t.team_id=window.TEAM_ID,(0,d.default)("#user-award-form > #results").empty(),t.user_id?(t.user_id=parseInt(t.user_id),m.default.fetch("/api/v1/awards",{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)}).then(function(e){return e.json()}).then(function(i){i.success?window.location.reload():((0,d.default)("#user-award-form > #results").empty(),Object.keys(i.errors).forEach(function(e,t){(0,d.default)("#user-award-form > #results").append((0,h.ezBadge)({type:"error",body:i.errors[e]}));var o=(0,d.default)("#user-award-form").find("input[name={0}]".format(e)),n=(0,d.default)(o);n.addClass("input-filled-invalid"),n.removeClass("input-filled-valid")}))})):(0,d.default)("#user-award-form > #results").append((0,h.ezBadge)({type:"error",body:"Please select a team member"}))}),(0,d.default)(".delete-member").click(function(e){e.preventDefault();var t=(0,d.default)(this).attr("member-id"),o=(0,d.default)(this).attr("member-name"),n={user_id:t},i=(0,d.default)(this).parent().parent();(0,h.ezQuery)({title:"Remove Member",body:"Are you sure you want to remove {0} from {1}?

All of their challenge solves, attempts, awards, and unlocked hints will also be deleted!".format(""+(0,a.htmlEntities)(o)+"",""+(0,a.htmlEntities)(window.TEAM_NAME)+""),success:function(){m.default.fetch("/api/v1/teams/"+window.TEAM_ID+"/members",{method:"DELETE",body:JSON.stringify(n)}).then(function(e){return e.json()}).then(function(e){e.success&&i.remove()})}})}),(0,d.default)(".delete-team").click(function(e){(0,h.ezQuery)({title:"Delete Team",body:"Are you sure you want to delete {0}".format(""+(0,a.htmlEntities)(window.TEAM_NAME)+""),success:function(){m.default.fetch("/api/v1/teams/"+window.TEAM_ID,{method:"DELETE"}).then(function(e){return e.json()}).then(function(e){e.success&&(window.location=m.default.config.urlRoot+"/admin/teams")})}})}),(0,d.default)("#solves-delete-button").click(function(e){C(0,"solves")}),(0,d.default)("#correct-fail-button").click(w),(0,d.default)("#fails-delete-button").click(function(e){C(0,"fails")}),(0,d.default)("#awards-delete-button").click(function(e){var a,t;a=(0,d.default)("input[data-award-id]:checked").map(function(){return(0,d.default)(this).data("award-id")}),t=1===a.length?"award":"awards",(0,h.ezQuery)({title:"Delete Awards",body:"Are you sure you want to delete ".concat(a.length," ").concat(t,"?"),success:function(){var e,t=[],o=_(a);try{for(o.s();!(e=o.n()).done;){var n=e.value,i=m.default.fetch("/api/v1/awards/"+n,{method:"DELETE",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"}});t.push(i)}}catch(e){o.e(e)}finally{o.f()}Promise.all(t).then(function(e){window.location.reload()})}})}),(0,d.default)("#missing-solve-button").click(function(e){!function(e){e.preventDefault();var s=(0,d.default)("input[data-missing-challenge-id]:checked").map(function(){return(0,d.default)(this).data("missing-challenge-id")}),t=1===s.length?"challenge":"challenges";(0,h.ezQuery)({title:"Mark Correct",body:"Are you sure you want to mark ".concat(s.length," ").concat(t," correct for ").concat((0,a.htmlEntities)(window.TEAM_NAME),"?"),success:function(){(0,h.ezAlert)({title:"User Attribution",body:"\n Which user on ".concat((0,a.htmlEntities)(window.TEAM_NAME),' solved these challenges?\n
\n ').concat((0,d.default)("#team-member-select").html(),"\n
\n "),button:"Mark Correct",success:function(){var e,t=(0,d.default)("#query-team-member-solve > select").val(),o=[],n=_(s);try{for(n.s();!(e=n.n()).done;){var i=e.value,a={provided:"MARKED AS SOLVED BY ADMIN",user_id:t,team_id:window.TEAM_ID,challenge_id:i,type:"correct"},r=m.default.fetch("/api/v1/submissions",{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(a)});o.push(r)}}catch(e){n.e(e)}finally{n.f()}Promise.all(o).then(function(e){window.location.reload()})}})}})}(e)}),(0,d.default)("#team-info-create-form").submit(b),(0,d.default)("#team-info-edit-form").submit(T);var e=r.default.extend(s.default),t=document.createElement("div");document.querySelector("#comment-box").appendChild(t),new e({propsData:{type:"team",id:window.TEAM_ID}}).$mount(t);var o=r.default.extend(v.default),n=document.createElement("div");document.querySelector("#team-add-modal .modal-body").appendChild(n),new o({propsData:{team_id:window.TEAM_ID}}).$mount(n);var c,i=window.stats_data,l=i.type,u=i.id,p=i.name,f=i.account_id;(0,d.default)("#team-statistics-modal").on("shown.bs.modal",function(e){var t,o,n,i,a,r,s,d;o=u,n=p,i=f,a=j(E[t=l],3),r=a[0],s=a[1],d=a[2],Promise.all([r(i),s(i),d(i)]).then(function(e){(0,g.createGraph)("score_graph","#score-graph",e,t,o,n,i),(0,g.createGraph)("category_breakdown","#categories-pie-graph",e,t,o,n,i),(0,g.createGraph)("solve_percentages","#keys-pie-graph",e,t,o,n,i)}),c=setInterval(function(){var t,o,n,i,e,a,r,s;o=u,n=p,i=f,e=j(E[t=l],3),a=e[0],r=e[1],s=e[2],Promise.all([a(i),r(i),s(i)]).then(function(e){(0,g.updateGraph)("score_graph","#score-graph",e,t,o,n,i),(0,g.updateGraph)("category_breakdown","#categories-pie-graph",e,t,o,n,i),(0,g.updateGraph)("solve_percentages","#keys-pie-graph",e,t,o,n,i)})},3e5)}),(0,d.default)("#team-statistics-modal").on("hidden.bs.modal",function(e){clearInterval(c)}),(0,d.default)(".statistics-team").click(function(e){(0,d.default)("#team-statistics-modal").modal("toggle")})})},"./CTFd/themes/admin/assets/js/styles.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.showMediaLibrary=l,t.bindMarkdownEditor=u,t.bindMarkdownEditors=p,t.default=void 0,o("./node_modules/bootstrap/dist/js/bootstrap.bundle.js");var n=o("./CTFd/themes/core/assets/js/utils.js"),i=c(o("./node_modules/jquery/dist/jquery.js")),a=c(o("./node_modules/easymde/src/js/easymde.js")),r=c(o("./node_modules/vue/dist/vue.esm.browser.js")),s=c(o("./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue")),d=c(o("./node_modules/highlight.js/lib/index.js"));function c(e){return e&&e.__esModule?e:{default:e}}function l(e){var t=r.default.extend(s.default),o=document.createElement("div");document.querySelector("main").appendChild(o);var n=new t({propsData:{editor:e}}).$mount(o);(0,i.default)("#media-modal").on("hidden.bs.modal",function(e){n.$destroy(),(0,i.default)("#media-modal").remove()}),(0,i.default)("#media-modal").modal()}function u(e){var t;!1===e.hasOwnProperty("mde")&&(t=new a.default({autoDownloadFontAwesome:!1,toolbar:["bold","italic","heading","|","quote","unordered-list","ordered-list","|","link","image",{name:"media",action:function(e){l(e)},className:"fas fa-file-upload",title:"Media Library"},"|","preview","guide"],element:e,initialValue:(0,i.default)(e).val(),forceSync:!0,minHeight:"200px",renderingConfig:{codeSyntaxHighlighting:!0,hljs:d.default}}),e.mde=t,e.codemirror=t.codemirror,(0,i.default)(e).on("change keyup paste",function(){t.codemirror.getDoc().setValue((0,i.default)(e).val()),t.codemirror.refresh()}))}function p(){(0,i.default)("textarea.markdown").each(function(e,t){u(t)})}t.default=function(){(0,i.default)(":input").each(function(){(0,i.default)(this).data("initial",(0,i.default)(this).val())}),(0,i.default)(function(){(0,i.default)("tr[data-href], td[data-href]").click(function(){var e;return getSelection().toString()||(e=(0,i.default)(this).attr("data-href"))&&(window.location=e),!1}),(0,i.default)("[data-checkbox]").click(function(e){(0,i.default)(e.target).is("input[type=checkbox]")||(0,i.default)(this).find("input[type=checkbox]").click(),e.stopImmediatePropagation()}),(0,i.default)("[data-checkbox-all]").on("click change",function(e){var t=(0,i.default)(this).prop("checked"),o=(0,i.default)(this).index()+1;(0,i.default)(this).closest("table").find("tr td:nth-child(".concat(o,") input[type=checkbox]")).prop("checked",t),e.stopImmediatePropagation()}),(0,i.default)("tr[data-href] a, tr[data-href] button").click(function(e){(0,i.default)(this).attr("data-dismiss")||e.stopPropagation()}),(0,i.default)(".page-select").change(function(){var e=new URL(window.location);e.searchParams.set("page",this.value),window.location.href=e.toString()}),(0,i.default)('a[data-toggle="tab"]').on("shown.bs.tab",function(e){sessionStorage.setItem("activeTab",(0,i.default)(e.target).attr("href"))});var e,t=sessionStorage.getItem("activeTab");t&&((e=(0,i.default)('.nav-tabs a[href="'.concat(t,'"], .nav-pills a[href="').concat(t,'"]'))).length?e.tab("show"):sessionStorage.removeItem("activeTab")),p(),(0,n.makeSortableTables)(),(0,i.default)('[data-toggle="tooltip"]').tooltip(),document.querySelectorAll("pre code").forEach(function(e){d.default.highlightBlock(e)})})}},"./CTFd/themes/core/assets/js/CTFd.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=u(o("./node_modules/jquery/dist/jquery.js")),i=u(o("./node_modules/dayjs/dayjs.min.js")),a=u(o("./node_modules/markdown-it/index.js"));o("./CTFd/themes/core/assets/js/patch.js");var r=u(o("./CTFd/themes/core/assets/js/fetch.js")),s=u(o("./CTFd/themes/core/assets/js/config.js")),d=o("./CTFd/themes/core/assets/js/api.js"),c=u(o("./CTFd/themes/core/assets/js/ezq.js")),l=o("./CTFd/themes/core/assets/js/utils.js");function u(e){return e&&e.__esModule?e:{default:e}}function p(t,e){var o,n=Object.keys(t);return Object.getOwnPropertySymbols&&(o=Object.getOwnPropertySymbols(t),e&&(o=o.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,o)),n}function f(i){for(var e=1;e".concat(e.body,"

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

".concat(e.body,"

")):o.find(".modal-body").append((0,s.default)(e.body));var n=(0,s.default)(f),i=(0,s.default)(p);return o.find(".modal-footer").append(i),o.find(".modal-footer").append(n),o.find("pre code").each(function(e){a.default.highlightBlock(this)}),(0,s.default)("main").append(o),(0,s.default)(o).on("hidden.bs.modal",function(){(0,s.default)(this).modal("dispose")}),(0,s.default)(n).click(function(){e.success()}),o.modal("show"),o}function v(e){if(e.target){var t=(0,s.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var o=c.format(e.width),n=r.format(e.title),i=(0,s.default)(n);return i.find(".modal-body").append((0,s.default)(o)),(0,s.default)("main").append(i),i.modal("show")}function y(e){var t={success:l,error:i}[e.type].format(e.body);return(0,s.default)(t)}var j={ezAlert:m,ezToast:h,ezQuery:g,ezProgressBar:v,ezBadge:y};t.default=j},"./CTFd/themes/core/assets/js/fetch.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,o("./node_modules/whatwg-fetch/fetch.js");var n,i=(n=o("./CTFd/themes/core/assets/js/config.js"))&&n.__esModule?n:{default:n};var a=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=i.default.urlRoot+e,void 0===t.headers&&(t.headers={}),t.credentials="same-origin",t.headers.Accept="application/json",t.headers["Content-Type"]="application/json",t.headers["CSRF-Token"]=i.default.csrfNonce,a(e,t)}},"./CTFd/themes/core/assets/js/graphs.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.createGraph=function(e,t,o,n,i,a,r){var s=u[e],d=l.default.init(document.querySelector(t));d.setOption(s.format(n,i,a,r,o)),(0,c.default)(window).on("resize",function(){null!=d&&null!=d&&d.resize()})},t.updateGraph=function(e,t,o,n,i,a,r){var s=u[e];l.default.init(document.querySelector(t)).setOption(s.format(n,i,a,r,o))},t.disposeGraph=function(e){l.default.dispose(document.querySelector(e))};var c=n(o("./node_modules/jquery/dist/jquery.js")),l=n(o("./node_modules/echarts/dist/echarts-en.common.js")),f=n(o("./node_modules/dayjs/dayjs.min.js")),m=o("./CTFd/themes/core/assets/js/utils.js");function n(e){return e&&e.__esModule?e:{default:e}}var u={score_graph:{format:function(e,t,o,n,i){var a={title:{left:"center",text:"Score over Time"},tooltip:{trigger:"axis",axisPointer:{type:"cross"}},legend:{type:"scroll",orient:"horizontal",align:"left",bottom:0,data:[o]},toolbox:{feature:{saveAsImage:{}}},grid:{containLabel:!0},xAxis:[{type:"category",boundaryGap:!1,data:[]}],yAxis:[{type:"value"}],dataZoom:[{id:"dataZoomX",type:"slider",xAxisIndex:[0],filterMode:"filter",height:20,top:35,fillerColor:"rgba(233, 236, 241, 0.4)"}],series:[]},r=[],s=[],d=i[0].data,c=i[2].data,l=d.concat(c);l.sort(function(e,t){return new Date(e.date)-new Date(t.date)});for(var u=0;u'),(0,r.default)("th.sort-col").click(function(){var i,e=(0,r.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort((i=(0,r.default)(this).index(),function(e,t){var o=a(e,i),n=a(t,i);return r.default.isNumeric(o)&&r.default.isNumeric(n)?o-n:o.toString().localeCompare(n)}));this.asc=!this.asc,this.asc||(t=t.reverse());for(var o=0;o").text(e).html()};var n,r=(n=o("./node_modules/jquery/dist/jquery.js"))&&n.__esModule?n:{default:n};function i(){this.id=Math.random(),this.isMaster=!1,this.others={},window.addEventListener("storage",this,!1),window.addEventListener("unload",this,!1),this.broadcast("hello");var t=this;this._checkTimeout=setTimeout(function e(){t.check(),t._checkTimeout=setTimeout(e,9e3)},500),this._pingTimeout=setTimeout(function e(){t.sendPing(),t._pingTimeout=setTimeout(e,17e3)},17e3)}r.default.fn.serializeJSON=function(o){var n={},i=(0,r.default)(this),e=i.serializeArray();return(e=(e=e.concat(i.find("input[type=checkbox]:checked").map(function(){return{name:this.name,value:!0}}).get())).concat(i.find("input[type=checkbox]:not(:checked)").map(function(){return{name:this.name,value:!1}}).get())).map(function(e){var t;o&&(null===e.value||""===e.value)&&(t=i.find(":input[name='".concat(e.name,"']"))).data("initial")===t.val()||(n[e.name]=e.value)}),n},String.prototype.format=String.prototype.f=function(){for(var e=this,t=arguments.length;t--;)e=e.replace(new RegExp("\\{"+t+"\\}","gm"),arguments[t]);return e},String.prototype.hashCode=function(){var e,t,o=0;if(0==this.length)return o;for(e=0,t=this.length;e= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction createUser(event) {\n event.preventDefault();\n var params = (0, _jquery[\"default\"])(\"#user-info-create-form\").serializeJSON(true);\n params.fields = [];\n\n for (var property in params) {\n if (property.match(/fields\\[\\d+\\]/)) {\n var field = {};\n var id = parseInt(property.slice(7, -1));\n field[\"field_id\"] = id;\n field[\"value\"] = params[property];\n params.fields.push(field);\n delete params[property];\n }\n } // Move the notify value into a GET param\n\n\n var url = \"/api/v1/users\";\n var notify = params.notify;\n\n if (notify === true) {\n url = \"\".concat(url, \"?notify=true\");\n }\n\n delete params.notify;\n\n _CTFd[\"default\"].fetch(url, {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n var user_id = response.data.id;\n window.location = _CTFd[\"default\"].config.urlRoot + \"/admin/users/\" + user_id;\n } else {\n (0, _jquery[\"default\"])(\"#user-info-create-form > #results\").empty();\n Object.keys(response.errors).forEach(function (key, _index) {\n (0, _jquery[\"default\"])(\"#user-info-create-form > #results\").append((0, _ezq.ezBadge)({\n type: \"error\",\n body: response.errors[key]\n }));\n var i = (0, _jquery[\"default\"])(\"#user-info-form\").find(\"input[name={0}]\".format(key));\n var input = (0, _jquery[\"default\"])(i);\n input.addClass(\"input-filled-invalid\");\n input.removeClass(\"input-filled-valid\");\n });\n }\n });\n}\n\nfunction updateUser(event) {\n event.preventDefault();\n var params = (0, _jquery[\"default\"])(\"#user-info-edit-form\").serializeJSON(true);\n params.fields = [];\n\n for (var property in params) {\n if (property.match(/fields\\[\\d+\\]/)) {\n var field = {};\n var id = parseInt(property.slice(7, -1));\n field[\"field_id\"] = id;\n field[\"value\"] = params[property];\n params.fields.push(field);\n delete params[property];\n }\n }\n\n _CTFd[\"default\"].fetch(\"/api/v1/users/\" + window.USER_ID, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n window.location.reload();\n } else {\n (0, _jquery[\"default\"])(\"#user-info-edit-form > #results\").empty();\n Object.keys(response.errors).forEach(function (key, _index) {\n (0, _jquery[\"default\"])(\"#user-info-edit-form > #results\").append((0, _ezq.ezBadge)({\n type: \"error\",\n body: response.errors[key]\n }));\n var i = (0, _jquery[\"default\"])(\"#user-info-edit-form\").find(\"input[name={0}]\".format(key));\n var input = (0, _jquery[\"default\"])(i);\n input.addClass(\"input-filled-invalid\");\n input.removeClass(\"input-filled-valid\");\n });\n }\n });\n}\n\nfunction deleteUser(event) {\n event.preventDefault();\n (0, _ezq.ezQuery)({\n title: \"Delete User\",\n body: \"Are you sure you want to delete {0}\".format(\"\" + (0, _utils.htmlEntities)(window.USER_NAME) + \"\"),\n success: function success() {\n _CTFd[\"default\"].fetch(\"/api/v1/users/\" + window.USER_ID, {\n method: \"DELETE\"\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n window.location = _CTFd[\"default\"].config.urlRoot + \"/admin/users\";\n }\n });\n }\n });\n}\n\nfunction awardUser(event) {\n event.preventDefault();\n var params = (0, _jquery[\"default\"])(\"#user-award-form\").serializeJSON(true);\n params[\"user_id\"] = window.USER_ID;\n\n _CTFd[\"default\"].fetch(\"/api/v1/awards\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n window.location.reload();\n } else {\n (0, _jquery[\"default\"])(\"#user-award-form > #results\").empty();\n Object.keys(response.errors).forEach(function (key, _index) {\n (0, _jquery[\"default\"])(\"#user-award-form > #results\").append((0, _ezq.ezBadge)({\n type: \"error\",\n body: response.errors[key]\n }));\n var i = (0, _jquery[\"default\"])(\"#user-award-form\").find(\"input[name={0}]\".format(key));\n var input = (0, _jquery[\"default\"])(i);\n input.addClass(\"input-filled-invalid\");\n input.removeClass(\"input-filled-valid\");\n });\n }\n });\n}\n\nfunction emailUser(event) {\n event.preventDefault();\n var params = (0, _jquery[\"default\"])(\"#user-mail-form\").serializeJSON(true);\n\n _CTFd[\"default\"].fetch(\"/api/v1/users/\" + window.USER_ID + \"/email\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n (0, _jquery[\"default\"])(\"#user-mail-form > #results\").append((0, _ezq.ezBadge)({\n type: \"success\",\n body: \"E-Mail sent successfully!\"\n }));\n (0, _jquery[\"default\"])(\"#user-mail-form\").find(\"input[type=text], textarea\").val(\"\");\n } else {\n (0, _jquery[\"default\"])(\"#user-mail-form > #results\").empty();\n Object.keys(response.errors).forEach(function (key, _index) {\n (0, _jquery[\"default\"])(\"#user-mail-form > #results\").append((0, _ezq.ezBadge)({\n type: \"error\",\n body: response.errors[key]\n }));\n var i = (0, _jquery[\"default\"])(\"#user-mail-form\").find(\"input[name={0}], textarea[name={0}]\".format(key));\n var input = (0, _jquery[\"default\"])(i);\n input.addClass(\"input-filled-invalid\");\n input.removeClass(\"input-filled-valid\");\n });\n }\n });\n}\n\nfunction deleteSelectedSubmissions(event, target) {\n var submissions;\n var type;\n var title;\n\n switch (target) {\n case \"solves\":\n submissions = (0, _jquery[\"default\"])(\"input[data-submission-type=correct]:checked\");\n type = \"solve\";\n title = \"Solves\";\n break;\n\n case \"fails\":\n submissions = (0, _jquery[\"default\"])(\"input[data-submission-type=incorrect]:checked\");\n type = \"fail\";\n title = \"Fails\";\n break;\n\n default:\n break;\n }\n\n var submissionIDs = submissions.map(function () {\n return (0, _jquery[\"default\"])(this).data(\"submission-id\");\n });\n var target_string = submissionIDs.length === 1 ? type : type + \"s\";\n (0, _ezq.ezQuery)({\n title: \"Delete \".concat(title),\n body: \"Are you sure you want to delete \".concat(submissionIDs.length, \" \").concat(target_string, \"?\"),\n success: function success() {\n var reqs = [];\n\n var _iterator = _createForOfIteratorHelper(submissionIDs),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var subId = _step.value;\n reqs.push(_CTFd[\"default\"].api.delete_submission({\n submissionId: subId\n }));\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n Promise.all(reqs).then(function (_responses) {\n window.location.reload();\n });\n }\n });\n}\n\nfunction deleteSelectedAwards(_event) {\n var awardIDs = (0, _jquery[\"default\"])(\"input[data-award-id]:checked\").map(function () {\n return (0, _jquery[\"default\"])(this).data(\"award-id\");\n });\n var target = awardIDs.length === 1 ? \"award\" : \"awards\";\n (0, _ezq.ezQuery)({\n title: \"Delete Awards\",\n body: \"Are you sure you want to delete \".concat(awardIDs.length, \" \").concat(target, \"?\"),\n success: function success() {\n var reqs = [];\n\n var _iterator2 = _createForOfIteratorHelper(awardIDs),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var awardID = _step2.value;\n\n var req = _CTFd[\"default\"].fetch(\"/api/v1/awards/\" + awardID, {\n method: \"DELETE\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n }\n });\n\n reqs.push(req);\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n Promise.all(reqs).then(function (_responses) {\n window.location.reload();\n });\n }\n });\n}\n\nfunction solveSelectedMissingChallenges(event) {\n event.preventDefault();\n var challengeIDs = (0, _jquery[\"default\"])(\"input[data-missing-challenge-id]:checked\").map(function () {\n return (0, _jquery[\"default\"])(this).data(\"missing-challenge-id\");\n });\n var target = challengeIDs.length === 1 ? \"challenge\" : \"challenges\";\n (0, _ezq.ezQuery)({\n title: \"Mark Correct\",\n body: \"Are you sure you want to mark \".concat(challengeIDs.length, \" \").concat(target, \" correct for \").concat((0, _utils.htmlEntities)(window.USER_NAME), \"?\"),\n success: function success() {\n var reqs = [];\n\n var _iterator3 = _createForOfIteratorHelper(challengeIDs),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var challengeID = _step3.value;\n var params = {\n provided: \"MARKED AS SOLVED BY ADMIN\",\n user_id: window.USER_ID,\n team_id: window.TEAM_ID,\n challenge_id: challengeID,\n type: \"correct\"\n };\n\n var req = _CTFd[\"default\"].fetch(\"/api/v1/submissions\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n });\n\n reqs.push(req);\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n\n Promise.all(reqs).then(function (_responses) {\n window.location.reload();\n });\n }\n });\n}\n\nvar api_funcs = {\n team: [function (x) {\n return _CTFd[\"default\"].api.get_team_solves({\n teamId: x\n });\n }, function (x) {\n return _CTFd[\"default\"].api.get_team_fails({\n teamId: x\n });\n }, function (x) {\n return _CTFd[\"default\"].api.get_team_awards({\n teamId: x\n });\n }],\n user: [function (x) {\n return _CTFd[\"default\"].api.get_user_solves({\n userId: x\n });\n }, function (x) {\n return _CTFd[\"default\"].api.get_user_fails({\n userId: x\n });\n }, function (x) {\n return _CTFd[\"default\"].api.get_user_awards({\n userId: x\n });\n }]\n};\n\nvar createGraphs = function createGraphs(type, id, name, account_id) {\n var _api_funcs$type = _slicedToArray(api_funcs[type], 3),\n solves_func = _api_funcs$type[0],\n fails_func = _api_funcs$type[1],\n awards_func = _api_funcs$type[2];\n\n Promise.all([solves_func(account_id), fails_func(account_id), awards_func(account_id)]).then(function (responses) {\n (0, _graphs.createGraph)(\"score_graph\", \"#score-graph\", responses, type, id, name, account_id);\n (0, _graphs.createGraph)(\"category_breakdown\", \"#categories-pie-graph\", responses, type, id, name, account_id);\n (0, _graphs.createGraph)(\"solve_percentages\", \"#keys-pie-graph\", responses, type, id, name, account_id);\n });\n};\n\nvar updateGraphs = function updateGraphs(type, id, name, account_id) {\n var _api_funcs$type2 = _slicedToArray(api_funcs[type], 3),\n solves_func = _api_funcs$type2[0],\n fails_func = _api_funcs$type2[1],\n awards_func = _api_funcs$type2[2];\n\n Promise.all([solves_func(account_id), fails_func(account_id), awards_func(account_id)]).then(function (responses) {\n (0, _graphs.updateGraph)(\"score_graph\", \"#score-graph\", responses, type, id, name, account_id);\n (0, _graphs.updateGraph)(\"category_breakdown\", \"#categories-pie-graph\", responses, type, id, name, account_id);\n (0, _graphs.updateGraph)(\"solve_percentages\", \"#keys-pie-graph\", responses, type, id, name, account_id);\n });\n};\n\n(0, _jquery[\"default\"])(function () {\n (0, _jquery[\"default\"])(\".delete-user\").click(deleteUser);\n (0, _jquery[\"default\"])(\".edit-user\").click(function (_event) {\n (0, _jquery[\"default\"])(\"#user-info-modal\").modal(\"toggle\");\n });\n (0, _jquery[\"default\"])(\".award-user\").click(function (_event) {\n (0, _jquery[\"default\"])(\"#user-award-modal\").modal(\"toggle\");\n });\n (0, _jquery[\"default\"])(\".email-user\").click(function (_event) {\n (0, _jquery[\"default\"])(\"#user-email-modal\").modal(\"toggle\");\n });\n (0, _jquery[\"default\"])(\".addresses-user\").click(function (_event) {\n (0, _jquery[\"default\"])(\"#user-addresses-modal\").modal(\"toggle\");\n });\n (0, _jquery[\"default\"])(\"#user-mail-form\").submit(emailUser);\n (0, _jquery[\"default\"])(\"#solves-delete-button\").click(function (e) {\n deleteSelectedSubmissions(e, \"solves\");\n });\n (0, _jquery[\"default\"])(\"#fails-delete-button\").click(function (e) {\n deleteSelectedSubmissions(e, \"fails\");\n });\n (0, _jquery[\"default\"])(\"#awards-delete-button\").click(function (e) {\n deleteSelectedAwards(e);\n });\n (0, _jquery[\"default\"])(\"#missing-solve-button\").click(function (e) {\n solveSelectedMissingChallenges(e);\n });\n (0, _jquery[\"default\"])(\"#user-info-create-form\").submit(createUser);\n (0, _jquery[\"default\"])(\"#user-info-edit-form\").submit(updateUser);\n (0, _jquery[\"default\"])(\"#user-award-form\").submit(awardUser); // Insert CommentBox element\n\n var commentBox = _vueEsm[\"default\"].extend(_CommentBox[\"default\"]);\n\n var vueContainer = document.createElement(\"div\");\n document.querySelector(\"#comment-box\").appendChild(vueContainer);\n new commentBox({\n propsData: {\n type: \"user\",\n id: window.USER_ID\n }\n }).$mount(vueContainer);\n var type, id, name, account_id;\n var _window$stats_data = window.stats_data;\n type = _window$stats_data.type;\n id = _window$stats_data.id;\n name = _window$stats_data.name;\n account_id = _window$stats_data.account_id;\n var intervalId;\n (0, _jquery[\"default\"])(\"#user-statistics-modal\").on(\"shown.bs.modal\", function (_e) {\n createGraphs(type, id, name, account_id);\n intervalId = setInterval(function () {\n updateGraphs(type, id, name, account_id);\n }, 300000);\n });\n (0, _jquery[\"default\"])(\"#user-statistics-modal\").on(\"hidden.bs.modal\", function (_e) {\n clearInterval(intervalId);\n });\n (0, _jquery[\"default\"])(\".statistics-user\").click(function (_event) {\n (0, _jquery[\"default\"])(\"#user-statistics-modal\").modal(\"toggle\");\n });\n});\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/pages/user.js?"); +eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/admin/assets/js/pages/main.js\");\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! core/CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _utils = __webpack_require__(/*! core/utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nvar _ezq = __webpack_require__(/*! core/ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nvar _graphs = __webpack_require__(/*! core/graphs */ \"./CTFd/themes/core/assets/js/graphs.js\");\n\nvar _vueEsm = _interopRequireDefault(__webpack_require__(/*! vue/dist/vue.esm.browser */ \"./node_modules/vue/dist/vue.esm.browser.js\"));\n\nvar _CommentBox = _interopRequireDefault(__webpack_require__(/*! ../components/comments/CommentBox.vue */ \"./CTFd/themes/admin/assets/js/components/comments/CommentBox.vue\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _iterableToArrayLimit(arr, i) { if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\n\nfunction createUser(event) {\n event.preventDefault();\n var params = (0, _jquery[\"default\"])(\"#user-info-create-form\").serializeJSON(true);\n params.fields = [];\n\n for (var property in params) {\n if (property.match(/fields\\[\\d+\\]/)) {\n var field = {};\n var id = parseInt(property.slice(7, -1));\n field[\"field_id\"] = id;\n field[\"value\"] = params[property];\n params.fields.push(field);\n delete params[property];\n }\n } // Move the notify value into a GET param\n\n\n var url = \"/api/v1/users\";\n var notify = params.notify;\n\n if (notify === true) {\n url = \"\".concat(url, \"?notify=true\");\n }\n\n delete params.notify;\n\n _CTFd[\"default\"].fetch(url, {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n var user_id = response.data.id;\n window.location = _CTFd[\"default\"].config.urlRoot + \"/admin/users/\" + user_id;\n } else {\n (0, _jquery[\"default\"])(\"#user-info-create-form > #results\").empty();\n Object.keys(response.errors).forEach(function (key, _index) {\n (0, _jquery[\"default\"])(\"#user-info-create-form > #results\").append((0, _ezq.ezBadge)({\n type: \"error\",\n body: response.errors[key]\n }));\n var i = (0, _jquery[\"default\"])(\"#user-info-form\").find(\"input[name={0}]\".format(key));\n var input = (0, _jquery[\"default\"])(i);\n input.addClass(\"input-filled-invalid\");\n input.removeClass(\"input-filled-valid\");\n });\n }\n });\n}\n\nfunction updateUser(event) {\n event.preventDefault();\n var params = (0, _jquery[\"default\"])(\"#user-info-edit-form\").serializeJSON(true);\n params.fields = [];\n\n for (var property in params) {\n if (property.match(/fields\\[\\d+\\]/)) {\n var field = {};\n var id = parseInt(property.slice(7, -1));\n field[\"field_id\"] = id;\n field[\"value\"] = params[property];\n params.fields.push(field);\n delete params[property];\n }\n }\n\n _CTFd[\"default\"].fetch(\"/api/v1/users/\" + window.USER_ID, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n window.location.reload();\n } else {\n (0, _jquery[\"default\"])(\"#user-info-edit-form > #results\").empty();\n Object.keys(response.errors).forEach(function (key, _index) {\n (0, _jquery[\"default\"])(\"#user-info-edit-form > #results\").append((0, _ezq.ezBadge)({\n type: \"error\",\n body: response.errors[key]\n }));\n var i = (0, _jquery[\"default\"])(\"#user-info-edit-form\").find(\"input[name={0}]\".format(key));\n var input = (0, _jquery[\"default\"])(i);\n input.addClass(\"input-filled-invalid\");\n input.removeClass(\"input-filled-valid\");\n });\n }\n });\n}\n\nfunction deleteUser(event) {\n event.preventDefault();\n (0, _ezq.ezQuery)({\n title: \"Delete User\",\n body: \"Are you sure you want to delete {0}\".format(\"\" + (0, _utils.htmlEntities)(window.USER_NAME) + \"\"),\n success: function success() {\n _CTFd[\"default\"].fetch(\"/api/v1/users/\" + window.USER_ID, {\n method: \"DELETE\"\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n window.location = _CTFd[\"default\"].config.urlRoot + \"/admin/users\";\n }\n });\n }\n });\n}\n\nfunction awardUser(event) {\n event.preventDefault();\n var params = (0, _jquery[\"default\"])(\"#user-award-form\").serializeJSON(true);\n params[\"user_id\"] = window.USER_ID;\n\n _CTFd[\"default\"].fetch(\"/api/v1/awards\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n window.location.reload();\n } else {\n (0, _jquery[\"default\"])(\"#user-award-form > #results\").empty();\n Object.keys(response.errors).forEach(function (key, _index) {\n (0, _jquery[\"default\"])(\"#user-award-form > #results\").append((0, _ezq.ezBadge)({\n type: \"error\",\n body: response.errors[key]\n }));\n var i = (0, _jquery[\"default\"])(\"#user-award-form\").find(\"input[name={0}]\".format(key));\n var input = (0, _jquery[\"default\"])(i);\n input.addClass(\"input-filled-invalid\");\n input.removeClass(\"input-filled-valid\");\n });\n }\n });\n}\n\nfunction emailUser(event) {\n event.preventDefault();\n var params = (0, _jquery[\"default\"])(\"#user-mail-form\").serializeJSON(true);\n\n _CTFd[\"default\"].fetch(\"/api/v1/users/\" + window.USER_ID + \"/email\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n (0, _jquery[\"default\"])(\"#user-mail-form > #results\").append((0, _ezq.ezBadge)({\n type: \"success\",\n body: \"E-Mail sent successfully!\"\n }));\n (0, _jquery[\"default\"])(\"#user-mail-form\").find(\"input[type=text], textarea\").val(\"\");\n } else {\n (0, _jquery[\"default\"])(\"#user-mail-form > #results\").empty();\n Object.keys(response.errors).forEach(function (key, _index) {\n (0, _jquery[\"default\"])(\"#user-mail-form > #results\").append((0, _ezq.ezBadge)({\n type: \"error\",\n body: response.errors[key]\n }));\n var i = (0, _jquery[\"default\"])(\"#user-mail-form\").find(\"input[name={0}], textarea[name={0}]\".format(key));\n var input = (0, _jquery[\"default\"])(i);\n input.addClass(\"input-filled-invalid\");\n input.removeClass(\"input-filled-valid\");\n });\n }\n });\n}\n\nfunction correctSubmissions(_event) {\n var submissions = (0, _jquery[\"default\"])(\"input[data-submission-type=incorrect]:checked\");\n var submissionIDs = submissions.map(function () {\n return (0, _jquery[\"default\"])(this).data(\"submission-id\");\n });\n var target = submissionIDs.length === 1 ? \"submission\" : \"submissions\";\n (0, _ezq.ezQuery)({\n title: \"Correct Submissions\",\n body: \"Are you sure you want to mark \".concat(submissionIDs.length, \" \").concat(target, \" correct?\"),\n success: function success() {\n var reqs = [];\n\n var _iterator = _createForOfIteratorHelper(submissionIDs),\n _step;\n\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var subId = _step.value;\n\n var req = _CTFd[\"default\"].fetch(\"/api/v1/submissions/\".concat(subId), {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({\n type: \"correct\"\n })\n });\n\n reqs.push(req);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n\n Promise.all(reqs).then(function (_responses) {\n window.location.reload();\n });\n }\n });\n}\n\nfunction deleteSelectedSubmissions(event, target) {\n var submissions;\n var type;\n var title;\n\n switch (target) {\n case \"solves\":\n submissions = (0, _jquery[\"default\"])(\"input[data-submission-type=correct]:checked\");\n type = \"solve\";\n title = \"Solves\";\n break;\n\n case \"fails\":\n submissions = (0, _jquery[\"default\"])(\"input[data-submission-type=incorrect]:checked\");\n type = \"fail\";\n title = \"Fails\";\n break;\n\n default:\n break;\n }\n\n var submissionIDs = submissions.map(function () {\n return (0, _jquery[\"default\"])(this).data(\"submission-id\");\n });\n var target_string = submissionIDs.length === 1 ? type : type + \"s\";\n (0, _ezq.ezQuery)({\n title: \"Delete \".concat(title),\n body: \"Are you sure you want to delete \".concat(submissionIDs.length, \" \").concat(target_string, \"?\"),\n success: function success() {\n var reqs = [];\n\n var _iterator2 = _createForOfIteratorHelper(submissionIDs),\n _step2;\n\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var subId = _step2.value;\n reqs.push(_CTFd[\"default\"].api.delete_submission({\n submissionId: subId\n }));\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n\n Promise.all(reqs).then(function (_responses) {\n window.location.reload();\n });\n }\n });\n}\n\nfunction deleteSelectedAwards(_event) {\n var awardIDs = (0, _jquery[\"default\"])(\"input[data-award-id]:checked\").map(function () {\n return (0, _jquery[\"default\"])(this).data(\"award-id\");\n });\n var target = awardIDs.length === 1 ? \"award\" : \"awards\";\n (0, _ezq.ezQuery)({\n title: \"Delete Awards\",\n body: \"Are you sure you want to delete \".concat(awardIDs.length, \" \").concat(target, \"?\"),\n success: function success() {\n var reqs = [];\n\n var _iterator3 = _createForOfIteratorHelper(awardIDs),\n _step3;\n\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var awardID = _step3.value;\n\n var req = _CTFd[\"default\"].fetch(\"/api/v1/awards/\" + awardID, {\n method: \"DELETE\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n }\n });\n\n reqs.push(req);\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n\n Promise.all(reqs).then(function (_responses) {\n window.location.reload();\n });\n }\n });\n}\n\nfunction solveSelectedMissingChallenges(event) {\n event.preventDefault();\n var challengeIDs = (0, _jquery[\"default\"])(\"input[data-missing-challenge-id]:checked\").map(function () {\n return (0, _jquery[\"default\"])(this).data(\"missing-challenge-id\");\n });\n var target = challengeIDs.length === 1 ? \"challenge\" : \"challenges\";\n (0, _ezq.ezQuery)({\n title: \"Mark Correct\",\n body: \"Are you sure you want to mark \".concat(challengeIDs.length, \" \").concat(target, \" correct for \").concat((0, _utils.htmlEntities)(window.USER_NAME), \"?\"),\n success: function success() {\n var reqs = [];\n\n var _iterator4 = _createForOfIteratorHelper(challengeIDs),\n _step4;\n\n try {\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n var challengeID = _step4.value;\n var params = {\n provided: \"MARKED AS SOLVED BY ADMIN\",\n user_id: window.USER_ID,\n team_id: window.TEAM_ID,\n challenge_id: challengeID,\n type: \"correct\"\n };\n\n var req = _CTFd[\"default\"].fetch(\"/api/v1/submissions\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(params)\n });\n\n reqs.push(req);\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n\n Promise.all(reqs).then(function (_responses) {\n window.location.reload();\n });\n }\n });\n}\n\nvar api_funcs = {\n team: [function (x) {\n return _CTFd[\"default\"].api.get_team_solves({\n teamId: x\n });\n }, function (x) {\n return _CTFd[\"default\"].api.get_team_fails({\n teamId: x\n });\n }, function (x) {\n return _CTFd[\"default\"].api.get_team_awards({\n teamId: x\n });\n }],\n user: [function (x) {\n return _CTFd[\"default\"].api.get_user_solves({\n userId: x\n });\n }, function (x) {\n return _CTFd[\"default\"].api.get_user_fails({\n userId: x\n });\n }, function (x) {\n return _CTFd[\"default\"].api.get_user_awards({\n userId: x\n });\n }]\n};\n\nvar createGraphs = function createGraphs(type, id, name, account_id) {\n var _api_funcs$type = _slicedToArray(api_funcs[type], 3),\n solves_func = _api_funcs$type[0],\n fails_func = _api_funcs$type[1],\n awards_func = _api_funcs$type[2];\n\n Promise.all([solves_func(account_id), fails_func(account_id), awards_func(account_id)]).then(function (responses) {\n (0, _graphs.createGraph)(\"score_graph\", \"#score-graph\", responses, type, id, name, account_id);\n (0, _graphs.createGraph)(\"category_breakdown\", \"#categories-pie-graph\", responses, type, id, name, account_id);\n (0, _graphs.createGraph)(\"solve_percentages\", \"#keys-pie-graph\", responses, type, id, name, account_id);\n });\n};\n\nvar updateGraphs = function updateGraphs(type, id, name, account_id) {\n var _api_funcs$type2 = _slicedToArray(api_funcs[type], 3),\n solves_func = _api_funcs$type2[0],\n fails_func = _api_funcs$type2[1],\n awards_func = _api_funcs$type2[2];\n\n Promise.all([solves_func(account_id), fails_func(account_id), awards_func(account_id)]).then(function (responses) {\n (0, _graphs.updateGraph)(\"score_graph\", \"#score-graph\", responses, type, id, name, account_id);\n (0, _graphs.updateGraph)(\"category_breakdown\", \"#categories-pie-graph\", responses, type, id, name, account_id);\n (0, _graphs.updateGraph)(\"solve_percentages\", \"#keys-pie-graph\", responses, type, id, name, account_id);\n });\n};\n\n(0, _jquery[\"default\"])(function () {\n (0, _jquery[\"default\"])(\".delete-user\").click(deleteUser);\n (0, _jquery[\"default\"])(\".edit-user\").click(function (_event) {\n (0, _jquery[\"default\"])(\"#user-info-modal\").modal(\"toggle\");\n });\n (0, _jquery[\"default\"])(\".award-user\").click(function (_event) {\n (0, _jquery[\"default\"])(\"#user-award-modal\").modal(\"toggle\");\n });\n (0, _jquery[\"default\"])(\".email-user\").click(function (_event) {\n (0, _jquery[\"default\"])(\"#user-email-modal\").modal(\"toggle\");\n });\n (0, _jquery[\"default\"])(\".addresses-user\").click(function (_event) {\n (0, _jquery[\"default\"])(\"#user-addresses-modal\").modal(\"toggle\");\n });\n (0, _jquery[\"default\"])(\"#user-mail-form\").submit(emailUser);\n (0, _jquery[\"default\"])(\"#solves-delete-button\").click(function (e) {\n deleteSelectedSubmissions(e, \"solves\");\n });\n (0, _jquery[\"default\"])(\"#correct-fail-button\").click(correctSubmissions);\n (0, _jquery[\"default\"])(\"#fails-delete-button\").click(function (e) {\n deleteSelectedSubmissions(e, \"fails\");\n });\n (0, _jquery[\"default\"])(\"#awards-delete-button\").click(function (e) {\n deleteSelectedAwards(e);\n });\n (0, _jquery[\"default\"])(\"#missing-solve-button\").click(function (e) {\n solveSelectedMissingChallenges(e);\n });\n (0, _jquery[\"default\"])(\"#user-info-create-form\").submit(createUser);\n (0, _jquery[\"default\"])(\"#user-info-edit-form\").submit(updateUser);\n (0, _jquery[\"default\"])(\"#user-award-form\").submit(awardUser); // Insert CommentBox element\n\n var commentBox = _vueEsm[\"default\"].extend(_CommentBox[\"default\"]);\n\n var vueContainer = document.createElement(\"div\");\n document.querySelector(\"#comment-box\").appendChild(vueContainer);\n new commentBox({\n propsData: {\n type: \"user\",\n id: window.USER_ID\n }\n }).$mount(vueContainer);\n var type, id, name, account_id;\n var _window$stats_data = window.stats_data;\n type = _window$stats_data.type;\n id = _window$stats_data.id;\n name = _window$stats_data.name;\n account_id = _window$stats_data.account_id;\n var intervalId;\n (0, _jquery[\"default\"])(\"#user-statistics-modal\").on(\"shown.bs.modal\", function (_e) {\n createGraphs(type, id, name, account_id);\n intervalId = setInterval(function () {\n updateGraphs(type, id, name, account_id);\n }, 300000);\n });\n (0, _jquery[\"default\"])(\"#user-statistics-modal\").on(\"hidden.bs.modal\", function (_e) {\n clearInterval(intervalId);\n });\n (0, _jquery[\"default\"])(\".statistics-user\").click(function (_event) {\n (0, _jquery[\"default\"])(\"#user-statistics-modal\").modal(\"toggle\");\n });\n});\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/pages/user.js?"); /***/ }) diff --git a/CTFd/themes/admin/static/js/pages/user.min.js b/CTFd/themes/admin/static/js/pages/user.min.js index f7a416c9..17b157a5 100644 --- a/CTFd/themes/admin/static/js/pages/user.min.js +++ b/CTFd/themes/admin/static/js/pages/user.min.js @@ -1 +1 @@ -!function(d){function e(e){for(var t,o,i=e[0],n=e[1],a=e[2],r=0,s=[];r=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,r=!0,s=!1;return{s:function(){o=e[Symbol.iterator]()},n:function(){var e=o.next();return r=e.done,e},e:function(e){s=!0,a=e},f:function(){try{r||null==o.return||o.return()}finally{if(s)throw a}}}}function c(e,t){if(e){if("string"==typeof e)return l(e,t);var o=Object.prototype.toString.call(e).slice(8,-1);return"Object"===o&&e.constructor&&(o=e.constructor.name),"Map"===o||"Set"===o?Array.from(e):"Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o)?l(e,t):void 0}}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var o=0,i=new Array(t);o #results").empty(),Object.keys(n.errors).forEach(function(e,t){(0,s.default)("#user-info-create-form > #results").append((0,m.ezBadge)({type:"error",body:n.errors[e]}));var o=(0,s.default)("#user-info-form").find("input[name={0}]".format(e)),i=(0,s.default)(o);i.addClass("input-filled-invalid"),i.removeClass("input-filled-valid")}))})}function j(e){e.preventDefault();var t,o,i,n=(0,s.default)("#user-info-edit-form").serializeJSON(!0);for(t in n.fields=[],n){t.match(/fields\[\d+\]/)&&(o={},i=parseInt(t.slice(7,-1)),o.field_id=i,o.value=n[t],n.fields.push(o),delete n[t])}d.default.fetch("/api/v1/users/"+window.USER_ID,{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(n)}).then(function(e){return e.json()}).then(function(n){n.success?window.location.reload():((0,s.default)("#user-info-edit-form > #results").empty(),Object.keys(n.errors).forEach(function(e,t){(0,s.default)("#user-info-edit-form > #results").append((0,m.ezBadge)({type:"error",body:n.errors[e]}));var o=(0,s.default)("#user-info-edit-form").find("input[name={0}]".format(e)),i=(0,s.default)(o);i.addClass("input-filled-invalid"),i.removeClass("input-filled-valid")}))})}function _(e){e.preventDefault(),(0,m.ezQuery)({title:"Delete User",body:"Are you sure you want to delete {0}".format(""+(0,i.htmlEntities)(window.USER_NAME)+""),success:function(){d.default.fetch("/api/v1/users/"+window.USER_ID,{method:"DELETE"}).then(function(e){return e.json()}).then(function(e){e.success&&(window.location=d.default.config.urlRoot+"/admin/users")})}})}function b(e){e.preventDefault();var t=(0,s.default)("#user-award-form").serializeJSON(!0);t.user_id=window.USER_ID,d.default.fetch("/api/v1/awards",{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)}).then(function(e){return e.json()}).then(function(n){n.success?window.location.reload():((0,s.default)("#user-award-form > #results").empty(),Object.keys(n.errors).forEach(function(e,t){(0,s.default)("#user-award-form > #results").append((0,m.ezBadge)({type:"error",body:n.errors[e]}));var o=(0,s.default)("#user-award-form").find("input[name={0}]".format(e)),i=(0,s.default)(o);i.addClass("input-filled-invalid"),i.removeClass("input-filled-valid")}))})}function T(e){e.preventDefault();var t=(0,s.default)("#user-mail-form").serializeJSON(!0);d.default.fetch("/api/v1/users/"+window.USER_ID+"/email",{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)}).then(function(e){return e.json()}).then(function(n){n.success?((0,s.default)("#user-mail-form > #results").append((0,m.ezBadge)({type:"success",body:"E-Mail sent successfully!"})),(0,s.default)("#user-mail-form").find("input[type=text], textarea").val("")):((0,s.default)("#user-mail-form > #results").empty(),Object.keys(n.errors).forEach(function(e,t){(0,s.default)("#user-mail-form > #results").append((0,m.ezBadge)({type:"error",body:n.errors[e]}));var o=(0,s.default)("#user-mail-form").find("input[name={0}], textarea[name={0}]".format(e)),i=(0,s.default)(o);i.addClass("input-filled-invalid"),i.removeClass("input-filled-valid")}))})}function w(e,t){var o,i,n;switch(t){case"solves":o=(0,s.default)("input[data-submission-type=correct]:checked"),i="solve",n="Solves";break;case"fails":o=(0,s.default)("input[data-submission-type=incorrect]:checked"),i="fail",n="Fails"}var a=o.map(function(){return(0,s.default)(this).data("submission-id")}),r=1===a.length?i:i+"s";(0,m.ezQuery)({title:"Delete ".concat(n),body:"Are you sure you want to delete ".concat(a.length," ").concat(r,"?"),success:function(){var e,t=[],o=v(a);try{for(o.s();!(e=o.n()).done;){var i=e.value;t.push(d.default.api.delete_submission({submissionId:i}))}}catch(e){o.e(e)}finally{o.f()}Promise.all(t).then(function(e){window.location.reload()})}})}var C={team:[function(e){return d.default.api.get_team_solves({teamId:e})},function(e){return d.default.api.get_team_fails({teamId:e})},function(e){return d.default.api.get_team_awards({teamId:e})}],user:[function(e){return d.default.api.get_user_solves({userId:e})},function(e){return d.default.api.get_user_fails({userId:e})},function(e){return d.default.api.get_user_awards({userId:e})}]};(0,s.default)(function(){(0,s.default)(".delete-user").click(_),(0,s.default)(".edit-user").click(function(e){(0,s.default)("#user-info-modal").modal("toggle")}),(0,s.default)(".award-user").click(function(e){(0,s.default)("#user-award-modal").modal("toggle")}),(0,s.default)(".email-user").click(function(e){(0,s.default)("#user-email-modal").modal("toggle")}),(0,s.default)(".addresses-user").click(function(e){(0,s.default)("#user-addresses-modal").modal("toggle")}),(0,s.default)("#user-mail-form").submit(T),(0,s.default)("#solves-delete-button").click(function(e){w(0,"solves")}),(0,s.default)("#fails-delete-button").click(function(e){w(0,"fails")}),(0,s.default)("#awards-delete-button").click(function(e){var a,t;a=(0,s.default)("input[data-award-id]:checked").map(function(){return(0,s.default)(this).data("award-id")}),t=1===a.length?"award":"awards",(0,m.ezQuery)({title:"Delete Awards",body:"Are you sure you want to delete ".concat(a.length," ").concat(t,"?"),success:function(){var e,t=[],o=v(a);try{for(o.s();!(e=o.n()).done;){var i=e.value,n=d.default.fetch("/api/v1/awards/"+i,{method:"DELETE",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"}});t.push(n)}}catch(e){o.e(e)}finally{o.f()}Promise.all(t).then(function(e){window.location.reload()})}})}),(0,s.default)("#missing-solve-button").click(function(e){!function(e){e.preventDefault();var r=(0,s.default)("input[data-missing-challenge-id]:checked").map(function(){return(0,s.default)(this).data("missing-challenge-id")}),t=1===r.length?"challenge":"challenges";(0,m.ezQuery)({title:"Mark Correct",body:"Are you sure you want to mark ".concat(r.length," ").concat(t," correct for ").concat((0,i.htmlEntities)(window.USER_NAME),"?"),success:function(){var e,t=[],o=v(r);try{for(o.s();!(e=o.n()).done;){var i=e.value,n={provided:"MARKED AS SOLVED BY ADMIN",user_id:window.USER_ID,team_id:window.TEAM_ID,challenge_id:i,type:"correct"},a=d.default.fetch("/api/v1/submissions",{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(n)});t.push(a)}}catch(e){o.e(e)}finally{o.f()}Promise.all(t).then(function(e){window.location.reload()})}})}(e)}),(0,s.default)("#user-info-create-form").submit(y),(0,s.default)("#user-info-edit-form").submit(j),(0,s.default)("#user-award-form").submit(b);var e=n.default.extend(a.default),t=document.createElement("div");document.querySelector("#comment-box").appendChild(t),new e({propsData:{type:"user",id:window.USER_ID}}).$mount(t);var c,o=window.stats_data,l=o.type,u=o.id,p=o.name,f=o.account_id;(0,s.default)("#user-statistics-modal").on("shown.bs.modal",function(e){var t,o,i,n,a,r,s,d;o=u,i=p,n=f,a=g(C[t=l],3),r=a[0],s=a[1],d=a[2],Promise.all([r(n),s(n),d(n)]).then(function(e){(0,h.createGraph)("score_graph","#score-graph",e,t,o,i,n),(0,h.createGraph)("category_breakdown","#categories-pie-graph",e,t,o,i,n),(0,h.createGraph)("solve_percentages","#keys-pie-graph",e,t,o,i,n)}),c=setInterval(function(){var t,o,i,n,e,a,r,s;o=u,i=p,n=f,e=g(C[t=l],3),a=e[0],r=e[1],s=e[2],Promise.all([a(n),r(n),s(n)]).then(function(e){(0,h.updateGraph)("score_graph","#score-graph",e,t,o,i,n),(0,h.updateGraph)("category_breakdown","#categories-pie-graph",e,t,o,i,n),(0,h.updateGraph)("solve_percentages","#keys-pie-graph",e,t,o,i,n)})},3e5)}),(0,s.default)("#user-statistics-modal").on("hidden.bs.modal",function(e){clearInterval(c)}),(0,s.default)(".statistics-user").click(function(e){(0,s.default)("#user-statistics-modal").modal("toggle")})})},"./CTFd/themes/admin/assets/js/styles.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.showMediaLibrary=l,t.bindMarkdownEditor=u,t.bindMarkdownEditors=p,t.default=void 0,o("./node_modules/bootstrap/dist/js/bootstrap.bundle.js");var i=o("./CTFd/themes/core/assets/js/utils.js"),n=c(o("./node_modules/jquery/dist/jquery.js")),a=c(o("./node_modules/easymde/src/js/easymde.js")),r=c(o("./node_modules/vue/dist/vue.esm.browser.js")),s=c(o("./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue")),d=c(o("./node_modules/highlight.js/lib/index.js"));function c(e){return e&&e.__esModule?e:{default:e}}function l(e){var t=r.default.extend(s.default),o=document.createElement("div");document.querySelector("main").appendChild(o);var i=new t({propsData:{editor:e}}).$mount(o);(0,n.default)("#media-modal").on("hidden.bs.modal",function(e){i.$destroy(),(0,n.default)("#media-modal").remove()}),(0,n.default)("#media-modal").modal()}function u(e){var t;!1===e.hasOwnProperty("mde")&&(t=new a.default({autoDownloadFontAwesome:!1,toolbar:["bold","italic","heading","|","quote","unordered-list","ordered-list","|","link","image",{name:"media",action:function(e){l(e)},className:"fas fa-file-upload",title:"Media Library"},"|","preview","guide"],element:e,initialValue:(0,n.default)(e).val(),forceSync:!0,minHeight:"200px",renderingConfig:{codeSyntaxHighlighting:!0,hljs:d.default}}),e.mde=t,e.codemirror=t.codemirror,(0,n.default)(e).on("change keyup paste",function(){t.codemirror.getDoc().setValue((0,n.default)(e).val()),t.codemirror.refresh()}))}function p(){(0,n.default)("textarea.markdown").each(function(e,t){u(t)})}t.default=function(){(0,n.default)(":input").each(function(){(0,n.default)(this).data("initial",(0,n.default)(this).val())}),(0,n.default)(function(){(0,n.default)("tr[data-href], td[data-href]").click(function(){var e;return getSelection().toString()||(e=(0,n.default)(this).attr("data-href"))&&(window.location=e),!1}),(0,n.default)("[data-checkbox]").click(function(e){(0,n.default)(e.target).is("input[type=checkbox]")||(0,n.default)(this).find("input[type=checkbox]").click(),e.stopImmediatePropagation()}),(0,n.default)("[data-checkbox-all]").on("click change",function(e){var t=(0,n.default)(this).prop("checked"),o=(0,n.default)(this).index()+1;(0,n.default)(this).closest("table").find("tr td:nth-child(".concat(o,") input[type=checkbox]")).prop("checked",t),e.stopImmediatePropagation()}),(0,n.default)("tr[data-href] a, tr[data-href] button").click(function(e){(0,n.default)(this).attr("data-dismiss")||e.stopPropagation()}),(0,n.default)(".page-select").change(function(){var e=new URL(window.location);e.searchParams.set("page",this.value),window.location.href=e.toString()}),(0,n.default)('a[data-toggle="tab"]').on("shown.bs.tab",function(e){sessionStorage.setItem("activeTab",(0,n.default)(e.target).attr("href"))});var e,t=sessionStorage.getItem("activeTab");t&&((e=(0,n.default)('.nav-tabs a[href="'.concat(t,'"], .nav-pills a[href="').concat(t,'"]'))).length?e.tab("show"):sessionStorage.removeItem("activeTab")),p(),(0,i.makeSortableTables)(),(0,n.default)('[data-toggle="tooltip"]').tooltip(),document.querySelectorAll("pre code").forEach(function(e){d.default.highlightBlock(e)})})}},"./CTFd/themes/core/assets/js/CTFd.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var i=u(o("./node_modules/jquery/dist/jquery.js")),n=u(o("./node_modules/dayjs/dayjs.min.js")),a=u(o("./node_modules/markdown-it/index.js"));o("./CTFd/themes/core/assets/js/patch.js");var r=u(o("./CTFd/themes/core/assets/js/fetch.js")),s=u(o("./CTFd/themes/core/assets/js/config.js")),d=o("./CTFd/themes/core/assets/js/api.js"),c=u(o("./CTFd/themes/core/assets/js/ezq.js")),l=o("./CTFd/themes/core/assets/js/utils.js");function u(e){return e&&e.__esModule?e:{default:e}}function p(t,e){var o,i=Object.keys(t);return Object.getOwnPropertySymbols&&(o=Object.getOwnPropertySymbols(t),e&&(o=o.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),i.push.apply(i,o)),i}function f(n){for(var e=1;e".concat(e.body,"

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

".concat(e.body,"

")):o.find(".modal-body").append((0,s.default)(e.body));var i=(0,s.default)(f),n=(0,s.default)(p);return o.find(".modal-footer").append(n),o.find(".modal-footer").append(i),o.find("pre code").each(function(e){a.default.highlightBlock(this)}),(0,s.default)("main").append(o),(0,s.default)(o).on("hidden.bs.modal",function(){(0,s.default)(this).modal("dispose")}),(0,s.default)(i).click(function(){e.success()}),o.modal("show"),o}function v(e){if(e.target){var t=(0,s.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var o=c.format(e.width),i=r.format(e.title),n=(0,s.default)(i);return n.find(".modal-body").append((0,s.default)(o)),(0,s.default)("main").append(n),n.modal("show")}function y(e){var t={success:l,error:n}[e.type].format(e.body);return(0,s.default)(t)}var j={ezAlert:m,ezToast:h,ezQuery:g,ezProgressBar:v,ezBadge:y};t.default=j},"./CTFd/themes/core/assets/js/fetch.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,o("./node_modules/whatwg-fetch/fetch.js");var i,n=(i=o("./CTFd/themes/core/assets/js/config.js"))&&i.__esModule?i:{default:i};var a=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=n.default.urlRoot+e,void 0===t.headers&&(t.headers={}),t.credentials="same-origin",t.headers.Accept="application/json",t.headers["Content-Type"]="application/json",t.headers["CSRF-Token"]=n.default.csrfNonce,a(e,t)}},"./CTFd/themes/core/assets/js/graphs.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.createGraph=function(e,t,o,i,n,a,r){var s=u[e],d=l.default.init(document.querySelector(t));d.setOption(s.format(i,n,a,r,o)),(0,c.default)(window).on("resize",function(){null!=d&&null!=d&&d.resize()})},t.updateGraph=function(e,t,o,i,n,a,r){var s=u[e];l.default.init(document.querySelector(t)).setOption(s.format(i,n,a,r,o))},t.disposeGraph=function(e){l.default.dispose(document.querySelector(e))};var c=i(o("./node_modules/jquery/dist/jquery.js")),l=i(o("./node_modules/echarts/dist/echarts-en.common.js")),f=i(o("./node_modules/dayjs/dayjs.min.js")),m=o("./CTFd/themes/core/assets/js/utils.js");function i(e){return e&&e.__esModule?e:{default:e}}var u={score_graph:{format:function(e,t,o,i,n){var a={title:{left:"center",text:"Score over Time"},tooltip:{trigger:"axis",axisPointer:{type:"cross"}},legend:{type:"scroll",orient:"horizontal",align:"left",bottom:0,data:[o]},toolbox:{feature:{saveAsImage:{}}},grid:{containLabel:!0},xAxis:[{type:"category",boundaryGap:!1,data:[]}],yAxis:[{type:"value"}],dataZoom:[{id:"dataZoomX",type:"slider",xAxisIndex:[0],filterMode:"filter",height:20,top:35,fillerColor:"rgba(233, 236, 241, 0.4)"}],series:[]},r=[],s=[],d=n[0].data,c=n[2].data,l=d.concat(c);l.sort(function(e,t){return new Date(e.date)-new Date(t.date)});for(var u=0;u'),(0,r.default)("th.sort-col").click(function(){var n,e=(0,r.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort((n=(0,r.default)(this).index(),function(e,t){var o=a(e,n),i=a(t,n);return r.default.isNumeric(o)&&r.default.isNumeric(i)?o-i:o.toString().localeCompare(i)}));this.asc=!this.asc,this.asc||(t=t.reverse());for(var o=0;o").text(e).html()};var i,r=(i=o("./node_modules/jquery/dist/jquery.js"))&&i.__esModule?i:{default:i};function n(){this.id=Math.random(),this.isMaster=!1,this.others={},window.addEventListener("storage",this,!1),window.addEventListener("unload",this,!1),this.broadcast("hello");var t=this;this._checkTimeout=setTimeout(function e(){t.check(),t._checkTimeout=setTimeout(e,9e3)},500),this._pingTimeout=setTimeout(function e(){t.sendPing(),t._pingTimeout=setTimeout(e,17e3)},17e3)}r.default.fn.serializeJSON=function(o){var i={},n=(0,r.default)(this),e=n.serializeArray();return(e=(e=e.concat(n.find("input[type=checkbox]:checked").map(function(){return{name:this.name,value:!0}}).get())).concat(n.find("input[type=checkbox]:not(:checked)").map(function(){return{name:this.name,value:!1}}).get())).map(function(e){var t;o&&(null===e.value||""===e.value)&&(t=n.find(":input[name='".concat(e.name,"']"))).data("initial")===t.val()||(i[e.name]=e.value)}),i},String.prototype.format=String.prototype.f=function(){for(var e=this,t=arguments.length;t--;)e=e.replace(new RegExp("\\{"+t+"\\}","gm"),arguments[t]);return e},String.prototype.hashCode=function(){var e,t,o=0;if(0==this.length)return o;for(e=0,t=this.length;e=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,r=!0,s=!1;return{s:function(){o=e[Symbol.iterator]()},n:function(){var e=o.next();return r=e.done,e},e:function(e){s=!0,a=e},f:function(){try{r||null==o.return||o.return()}finally{if(s)throw a}}}}function c(e,t){if(e){if("string"==typeof e)return l(e,t);var o=Object.prototype.toString.call(e).slice(8,-1);return"Object"===o&&e.constructor&&(o=e.constructor.name),"Map"===o||"Set"===o?Array.from(e):"Arguments"===o||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o)?l(e,t):void 0}}function l(e,t){(null==t||t>e.length)&&(t=e.length);for(var o=0,i=new Array(t);o #results").empty(),Object.keys(n.errors).forEach(function(e,t){(0,s.default)("#user-info-create-form > #results").append((0,m.ezBadge)({type:"error",body:n.errors[e]}));var o=(0,s.default)("#user-info-form").find("input[name={0}]".format(e)),i=(0,s.default)(o);i.addClass("input-filled-invalid"),i.removeClass("input-filled-valid")}))})}function j(e){e.preventDefault();var t,o,i,n=(0,s.default)("#user-info-edit-form").serializeJSON(!0);for(t in n.fields=[],n){t.match(/fields\[\d+\]/)&&(o={},i=parseInt(t.slice(7,-1)),o.field_id=i,o.value=n[t],n.fields.push(o),delete n[t])}d.default.fetch("/api/v1/users/"+window.USER_ID,{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(n)}).then(function(e){return e.json()}).then(function(n){n.success?window.location.reload():((0,s.default)("#user-info-edit-form > #results").empty(),Object.keys(n.errors).forEach(function(e,t){(0,s.default)("#user-info-edit-form > #results").append((0,m.ezBadge)({type:"error",body:n.errors[e]}));var o=(0,s.default)("#user-info-edit-form").find("input[name={0}]".format(e)),i=(0,s.default)(o);i.addClass("input-filled-invalid"),i.removeClass("input-filled-valid")}))})}function _(e){e.preventDefault(),(0,m.ezQuery)({title:"Delete User",body:"Are you sure you want to delete {0}".format(""+(0,i.htmlEntities)(window.USER_NAME)+""),success:function(){d.default.fetch("/api/v1/users/"+window.USER_ID,{method:"DELETE"}).then(function(e){return e.json()}).then(function(e){e.success&&(window.location=d.default.config.urlRoot+"/admin/users")})}})}function b(e){e.preventDefault();var t=(0,s.default)("#user-award-form").serializeJSON(!0);t.user_id=window.USER_ID,d.default.fetch("/api/v1/awards",{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)}).then(function(e){return e.json()}).then(function(n){n.success?window.location.reload():((0,s.default)("#user-award-form > #results").empty(),Object.keys(n.errors).forEach(function(e,t){(0,s.default)("#user-award-form > #results").append((0,m.ezBadge)({type:"error",body:n.errors[e]}));var o=(0,s.default)("#user-award-form").find("input[name={0}]".format(e)),i=(0,s.default)(o);i.addClass("input-filled-invalid"),i.removeClass("input-filled-valid")}))})}function T(e){e.preventDefault();var t=(0,s.default)("#user-mail-form").serializeJSON(!0);d.default.fetch("/api/v1/users/"+window.USER_ID+"/email",{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)}).then(function(e){return e.json()}).then(function(n){n.success?((0,s.default)("#user-mail-form > #results").append((0,m.ezBadge)({type:"success",body:"E-Mail sent successfully!"})),(0,s.default)("#user-mail-form").find("input[type=text], textarea").val("")):((0,s.default)("#user-mail-form > #results").empty(),Object.keys(n.errors).forEach(function(e,t){(0,s.default)("#user-mail-form > #results").append((0,m.ezBadge)({type:"error",body:n.errors[e]}));var o=(0,s.default)("#user-mail-form").find("input[name={0}], textarea[name={0}]".format(e)),i=(0,s.default)(o);i.addClass("input-filled-invalid"),i.removeClass("input-filled-valid")}))})}function w(e){var a=(0,s.default)("input[data-submission-type=incorrect]:checked").map(function(){return(0,s.default)(this).data("submission-id")}),t=1===a.length?"submission":"submissions";(0,m.ezQuery)({title:"Correct Submissions",body:"Are you sure you want to mark ".concat(a.length," ").concat(t," correct?"),success:function(){var e,t=[],o=v(a);try{for(o.s();!(e=o.n()).done;){var i=e.value,n=d.default.fetch("/api/v1/submissions/".concat(i),{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({type:"correct"})});t.push(n)}}catch(e){o.e(e)}finally{o.f()}Promise.all(t).then(function(e){window.location.reload()})}})}function C(e,t){var o,i,n;switch(t){case"solves":o=(0,s.default)("input[data-submission-type=correct]:checked"),i="solve",n="Solves";break;case"fails":o=(0,s.default)("input[data-submission-type=incorrect]:checked"),i="fail",n="Fails"}var a=o.map(function(){return(0,s.default)(this).data("submission-id")}),r=1===a.length?i:i+"s";(0,m.ezQuery)({title:"Delete ".concat(n),body:"Are you sure you want to delete ".concat(a.length," ").concat(r,"?"),success:function(){var e,t=[],o=v(a);try{for(o.s();!(e=o.n()).done;){var i=e.value;t.push(d.default.api.delete_submission({submissionId:i}))}}catch(e){o.e(e)}finally{o.f()}Promise.all(t).then(function(e){window.location.reload()})}})}var E={team:[function(e){return d.default.api.get_team_solves({teamId:e})},function(e){return d.default.api.get_team_fails({teamId:e})},function(e){return d.default.api.get_team_awards({teamId:e})}],user:[function(e){return d.default.api.get_user_solves({userId:e})},function(e){return d.default.api.get_user_fails({userId:e})},function(e){return d.default.api.get_user_awards({userId:e})}]};(0,s.default)(function(){(0,s.default)(".delete-user").click(_),(0,s.default)(".edit-user").click(function(e){(0,s.default)("#user-info-modal").modal("toggle")}),(0,s.default)(".award-user").click(function(e){(0,s.default)("#user-award-modal").modal("toggle")}),(0,s.default)(".email-user").click(function(e){(0,s.default)("#user-email-modal").modal("toggle")}),(0,s.default)(".addresses-user").click(function(e){(0,s.default)("#user-addresses-modal").modal("toggle")}),(0,s.default)("#user-mail-form").submit(T),(0,s.default)("#solves-delete-button").click(function(e){C(0,"solves")}),(0,s.default)("#correct-fail-button").click(w),(0,s.default)("#fails-delete-button").click(function(e){C(0,"fails")}),(0,s.default)("#awards-delete-button").click(function(e){var a,t;a=(0,s.default)("input[data-award-id]:checked").map(function(){return(0,s.default)(this).data("award-id")}),t=1===a.length?"award":"awards",(0,m.ezQuery)({title:"Delete Awards",body:"Are you sure you want to delete ".concat(a.length," ").concat(t,"?"),success:function(){var e,t=[],o=v(a);try{for(o.s();!(e=o.n()).done;){var i=e.value,n=d.default.fetch("/api/v1/awards/"+i,{method:"DELETE",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"}});t.push(n)}}catch(e){o.e(e)}finally{o.f()}Promise.all(t).then(function(e){window.location.reload()})}})}),(0,s.default)("#missing-solve-button").click(function(e){!function(e){e.preventDefault();var r=(0,s.default)("input[data-missing-challenge-id]:checked").map(function(){return(0,s.default)(this).data("missing-challenge-id")}),t=1===r.length?"challenge":"challenges";(0,m.ezQuery)({title:"Mark Correct",body:"Are you sure you want to mark ".concat(r.length," ").concat(t," correct for ").concat((0,i.htmlEntities)(window.USER_NAME),"?"),success:function(){var e,t=[],o=v(r);try{for(o.s();!(e=o.n()).done;){var i=e.value,n={provided:"MARKED AS SOLVED BY ADMIN",user_id:window.USER_ID,team_id:window.TEAM_ID,challenge_id:i,type:"correct"},a=d.default.fetch("/api/v1/submissions",{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(n)});t.push(a)}}catch(e){o.e(e)}finally{o.f()}Promise.all(t).then(function(e){window.location.reload()})}})}(e)}),(0,s.default)("#user-info-create-form").submit(y),(0,s.default)("#user-info-edit-form").submit(j),(0,s.default)("#user-award-form").submit(b);var e=n.default.extend(a.default),t=document.createElement("div");document.querySelector("#comment-box").appendChild(t),new e({propsData:{type:"user",id:window.USER_ID}}).$mount(t);var c,o=window.stats_data,l=o.type,u=o.id,p=o.name,f=o.account_id;(0,s.default)("#user-statistics-modal").on("shown.bs.modal",function(e){var t,o,i,n,a,r,s,d;o=u,i=p,n=f,a=g(E[t=l],3),r=a[0],s=a[1],d=a[2],Promise.all([r(n),s(n),d(n)]).then(function(e){(0,h.createGraph)("score_graph","#score-graph",e,t,o,i,n),(0,h.createGraph)("category_breakdown","#categories-pie-graph",e,t,o,i,n),(0,h.createGraph)("solve_percentages","#keys-pie-graph",e,t,o,i,n)}),c=setInterval(function(){var t,o,i,n,e,a,r,s;o=u,i=p,n=f,e=g(E[t=l],3),a=e[0],r=e[1],s=e[2],Promise.all([a(n),r(n),s(n)]).then(function(e){(0,h.updateGraph)("score_graph","#score-graph",e,t,o,i,n),(0,h.updateGraph)("category_breakdown","#categories-pie-graph",e,t,o,i,n),(0,h.updateGraph)("solve_percentages","#keys-pie-graph",e,t,o,i,n)})},3e5)}),(0,s.default)("#user-statistics-modal").on("hidden.bs.modal",function(e){clearInterval(c)}),(0,s.default)(".statistics-user").click(function(e){(0,s.default)("#user-statistics-modal").modal("toggle")})})},"./CTFd/themes/admin/assets/js/styles.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.showMediaLibrary=l,t.bindMarkdownEditor=u,t.bindMarkdownEditors=p,t.default=void 0,o("./node_modules/bootstrap/dist/js/bootstrap.bundle.js");var i=o("./CTFd/themes/core/assets/js/utils.js"),n=c(o("./node_modules/jquery/dist/jquery.js")),a=c(o("./node_modules/easymde/src/js/easymde.js")),r=c(o("./node_modules/vue/dist/vue.esm.browser.js")),s=c(o("./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue")),d=c(o("./node_modules/highlight.js/lib/index.js"));function c(e){return e&&e.__esModule?e:{default:e}}function l(e){var t=r.default.extend(s.default),o=document.createElement("div");document.querySelector("main").appendChild(o);var i=new t({propsData:{editor:e}}).$mount(o);(0,n.default)("#media-modal").on("hidden.bs.modal",function(e){i.$destroy(),(0,n.default)("#media-modal").remove()}),(0,n.default)("#media-modal").modal()}function u(e){var t;!1===e.hasOwnProperty("mde")&&(t=new a.default({autoDownloadFontAwesome:!1,toolbar:["bold","italic","heading","|","quote","unordered-list","ordered-list","|","link","image",{name:"media",action:function(e){l(e)},className:"fas fa-file-upload",title:"Media Library"},"|","preview","guide"],element:e,initialValue:(0,n.default)(e).val(),forceSync:!0,minHeight:"200px",renderingConfig:{codeSyntaxHighlighting:!0,hljs:d.default}}),e.mde=t,e.codemirror=t.codemirror,(0,n.default)(e).on("change keyup paste",function(){t.codemirror.getDoc().setValue((0,n.default)(e).val()),t.codemirror.refresh()}))}function p(){(0,n.default)("textarea.markdown").each(function(e,t){u(t)})}t.default=function(){(0,n.default)(":input").each(function(){(0,n.default)(this).data("initial",(0,n.default)(this).val())}),(0,n.default)(function(){(0,n.default)("tr[data-href], td[data-href]").click(function(){var e;return getSelection().toString()||(e=(0,n.default)(this).attr("data-href"))&&(window.location=e),!1}),(0,n.default)("[data-checkbox]").click(function(e){(0,n.default)(e.target).is("input[type=checkbox]")||(0,n.default)(this).find("input[type=checkbox]").click(),e.stopImmediatePropagation()}),(0,n.default)("[data-checkbox-all]").on("click change",function(e){var t=(0,n.default)(this).prop("checked"),o=(0,n.default)(this).index()+1;(0,n.default)(this).closest("table").find("tr td:nth-child(".concat(o,") input[type=checkbox]")).prop("checked",t),e.stopImmediatePropagation()}),(0,n.default)("tr[data-href] a, tr[data-href] button").click(function(e){(0,n.default)(this).attr("data-dismiss")||e.stopPropagation()}),(0,n.default)(".page-select").change(function(){var e=new URL(window.location);e.searchParams.set("page",this.value),window.location.href=e.toString()}),(0,n.default)('a[data-toggle="tab"]').on("shown.bs.tab",function(e){sessionStorage.setItem("activeTab",(0,n.default)(e.target).attr("href"))});var e,t=sessionStorage.getItem("activeTab");t&&((e=(0,n.default)('.nav-tabs a[href="'.concat(t,'"], .nav-pills a[href="').concat(t,'"]'))).length?e.tab("show"):sessionStorage.removeItem("activeTab")),p(),(0,i.makeSortableTables)(),(0,n.default)('[data-toggle="tooltip"]').tooltip(),document.querySelectorAll("pre code").forEach(function(e){d.default.highlightBlock(e)})})}},"./CTFd/themes/core/assets/js/CTFd.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var i=u(o("./node_modules/jquery/dist/jquery.js")),n=u(o("./node_modules/dayjs/dayjs.min.js")),a=u(o("./node_modules/markdown-it/index.js"));o("./CTFd/themes/core/assets/js/patch.js");var r=u(o("./CTFd/themes/core/assets/js/fetch.js")),s=u(o("./CTFd/themes/core/assets/js/config.js")),d=o("./CTFd/themes/core/assets/js/api.js"),c=u(o("./CTFd/themes/core/assets/js/ezq.js")),l=o("./CTFd/themes/core/assets/js/utils.js");function u(e){return e&&e.__esModule?e:{default:e}}function p(t,e){var o,i=Object.keys(t);return Object.getOwnPropertySymbols&&(o=Object.getOwnPropertySymbols(t),e&&(o=o.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),i.push.apply(i,o)),i}function f(n){for(var e=1;e".concat(e.body,"

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

".concat(e.body,"

")):o.find(".modal-body").append((0,s.default)(e.body));var i=(0,s.default)(f),n=(0,s.default)(p);return o.find(".modal-footer").append(n),o.find(".modal-footer").append(i),o.find("pre code").each(function(e){a.default.highlightBlock(this)}),(0,s.default)("main").append(o),(0,s.default)(o).on("hidden.bs.modal",function(){(0,s.default)(this).modal("dispose")}),(0,s.default)(i).click(function(){e.success()}),o.modal("show"),o}function v(e){if(e.target){var t=(0,s.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var o=c.format(e.width),i=r.format(e.title),n=(0,s.default)(i);return n.find(".modal-body").append((0,s.default)(o)),(0,s.default)("main").append(n),n.modal("show")}function y(e){var t={success:l,error:n}[e.type].format(e.body);return(0,s.default)(t)}var j={ezAlert:m,ezToast:h,ezQuery:g,ezProgressBar:v,ezBadge:y};t.default=j},"./CTFd/themes/core/assets/js/fetch.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0,o("./node_modules/whatwg-fetch/fetch.js");var i,n=(i=o("./CTFd/themes/core/assets/js/config.js"))&&i.__esModule?i:{default:i};var a=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=n.default.urlRoot+e,void 0===t.headers&&(t.headers={}),t.credentials="same-origin",t.headers.Accept="application/json",t.headers["Content-Type"]="application/json",t.headers["CSRF-Token"]=n.default.csrfNonce,a(e,t)}},"./CTFd/themes/core/assets/js/graphs.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.createGraph=function(e,t,o,i,n,a,r){var s=u[e],d=l.default.init(document.querySelector(t));d.setOption(s.format(i,n,a,r,o)),(0,c.default)(window).on("resize",function(){null!=d&&null!=d&&d.resize()})},t.updateGraph=function(e,t,o,i,n,a,r){var s=u[e];l.default.init(document.querySelector(t)).setOption(s.format(i,n,a,r,o))},t.disposeGraph=function(e){l.default.dispose(document.querySelector(e))};var c=i(o("./node_modules/jquery/dist/jquery.js")),l=i(o("./node_modules/echarts/dist/echarts-en.common.js")),f=i(o("./node_modules/dayjs/dayjs.min.js")),m=o("./CTFd/themes/core/assets/js/utils.js");function i(e){return e&&e.__esModule?e:{default:e}}var u={score_graph:{format:function(e,t,o,i,n){var a={title:{left:"center",text:"Score over Time"},tooltip:{trigger:"axis",axisPointer:{type:"cross"}},legend:{type:"scroll",orient:"horizontal",align:"left",bottom:0,data:[o]},toolbox:{feature:{saveAsImage:{}}},grid:{containLabel:!0},xAxis:[{type:"category",boundaryGap:!1,data:[]}],yAxis:[{type:"value"}],dataZoom:[{id:"dataZoomX",type:"slider",xAxisIndex:[0],filterMode:"filter",height:20,top:35,fillerColor:"rgba(233, 236, 241, 0.4)"}],series:[]},r=[],s=[],d=n[0].data,c=n[2].data,l=d.concat(c);l.sort(function(e,t){return new Date(e.date)-new Date(t.date)});for(var u=0;u'),(0,r.default)("th.sort-col").click(function(){var n,e=(0,r.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort((n=(0,r.default)(this).index(),function(e,t){var o=a(e,n),i=a(t,n);return r.default.isNumeric(o)&&r.default.isNumeric(i)?o-i:o.toString().localeCompare(i)}));this.asc=!this.asc,this.asc||(t=t.reverse());for(var o=0;o").text(e).html()};var i,r=(i=o("./node_modules/jquery/dist/jquery.js"))&&i.__esModule?i:{default:i};function n(){this.id=Math.random(),this.isMaster=!1,this.others={},window.addEventListener("storage",this,!1),window.addEventListener("unload",this,!1),this.broadcast("hello");var t=this;this._checkTimeout=setTimeout(function e(){t.check(),t._checkTimeout=setTimeout(e,9e3)},500),this._pingTimeout=setTimeout(function e(){t.sendPing(),t._pingTimeout=setTimeout(e,17e3)},17e3)}r.default.fn.serializeJSON=function(o){var i={},n=(0,r.default)(this),e=n.serializeArray();return(e=(e=e.concat(n.find("input[type=checkbox]:checked").map(function(){return{name:this.name,value:!0}}).get())).concat(n.find("input[type=checkbox]:not(:checked)").map(function(){return{name:this.name,value:!1}}).get())).map(function(e){var t;o&&(null===e.value||""===e.value)&&(t=n.find(":input[name='".concat(e.name,"']"))).data("initial")===t.val()||(i[e.name]=e.value)}),i},String.prototype.format=String.prototype.f=function(){for(var e=this,t=arguments.length;t--;)e=e.replace(new RegExp("\\{"+t+"\\}","gm"),arguments[t]);return e},String.prototype.hashCode=function(){var e,t,o=0;if(0==this.length)return o;for(e=0,t=this.length;e
+ {% if type == "incorrect" %} + + {% endif %} {% if request.args.get("full") %} @@ -409,7 +412,7 @@ {% for fail in fails %} - +
-   @@ -264,6 +264,9 @@
+ @@ -288,7 +291,7 @@ {% for fail in fails %} - +