\\n \\n \\n \\n
\\n \\n \\n \\n
\\n \\n \\n \\n
\\n \\n \"),\n button: \"Submit\",\n success: function success() {\n var data = (0, _jquery.default)(\"#users-bulk-edit\").serializeJSON(true);\n var reqs = [];\n var _iteratorNormalCompletion2 = true;\n var _didIteratorError2 = false;\n var _iteratorError2 = undefined;\n\n try {\n for (var _iterator2 = userIDs[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var userID = _step2.value;\n reqs.push(_CTFd.default.fetch(\"/api/v1/users/\".concat(userID), {\n method: \"PATCH\",\n body: JSON.stringify(data)\n }));\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n\n Promise.all(reqs).then(function (responses) {\n window.location.reload();\n });\n }\n });\n}\n\n(0, _jquery.default)(function () {\n (0, _jquery.default)(\"#users-delete-button\").click(deleteSelectedUsers);\n (0, _jquery.default)(\"#users-edit-button\").click(bulkEditUsers);\n});\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/pages/users.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 _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 deleteSelectedUsers(_event) {\n var userIDs = (0, _jquery.default)(\"input[data-user-id]:checked\").map(function () {\n return (0, _jquery.default)(this).data(\"user-id\");\n });\n var target = userIDs.length === 1 ? \"user\" : \"users\";\n (0, _ezq.ezQuery)({\n title: \"Delete Users\",\n body: \"Are you sure you want to delete \".concat(userIDs.length, \" \").concat(target, \"?\"),\n success: function success() {\n var reqs = [];\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = userIDs[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var userID = _step.value;\n reqs.push(_CTFd.default.fetch(\"/api/v1/users/\".concat(userID), {\n method: \"DELETE\"\n }));\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n Promise.all(reqs).then(function (_responses) {\n window.location.reload();\n });\n }\n });\n}\n\nfunction bulkEditUsers(_event) {\n var userIDs = (0, _jquery.default)(\"input[data-user-id]:checked\").map(function () {\n return (0, _jquery.default)(this).data(\"user-id\");\n });\n (0, _ezq.ezAlert)({\n title: \"Edit Users\",\n body: (0, _jquery.default)(\"\\n \\n \"),\n button: \"Submit\",\n success: function success() {\n var data = (0, _jquery.default)(\"#users-bulk-edit\").serializeJSON(true);\n var reqs = [];\n var _iteratorNormalCompletion2 = true;\n var _didIteratorError2 = false;\n var _iteratorError2 = undefined;\n\n try {\n for (var _iterator2 = userIDs[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var userID = _step2.value;\n reqs.push(_CTFd.default.fetch(\"/api/v1/users/\".concat(userID), {\n method: \"PATCH\",\n body: JSON.stringify(data)\n }));\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n\n Promise.all(reqs).then(function (_responses) {\n window.location.reload();\n });\n }\n });\n}\n\n(0, _jquery.default)(function () {\n (0, _jquery.default)(\"#users-delete-button\").click(deleteSelectedUsers);\n (0, _jquery.default)(\"#users-edit-button\").click(bulkEditUsers);\n});\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/pages/users.js?");
/***/ })
diff --git a/CTFd/themes/core/assets/js/api.js b/CTFd/themes/core/assets/js/api.js
index 2f7e9535..251b83a8 100644
--- a/CTFd/themes/core/assets/js/api.js
+++ b/CTFd/themes/core/assets/js/api.js
@@ -3610,4 +3610,5 @@ let API = (function() {
return API;
})();
+// eslint-disable-next-line no-undef
exports.API = API;
diff --git a/CTFd/themes/core/assets/js/events.js b/CTFd/themes/core/assets/js/events.js
index f87b5e36..7dda05e6 100644
--- a/CTFd/themes/core/assets/js/events.js
+++ b/CTFd/themes/core/assets/js/events.js
@@ -42,7 +42,7 @@ export default root => {
function render(data) {
switch (data.type) {
- case "toast":
+ case "toast": {
inc_notification_counter();
// Trim toast body to length
let length = 50;
@@ -72,7 +72,8 @@ export default root => {
}
});
break;
- case "alert":
+ }
+ case "alert": {
inc_notification_counter();
ezAlert({
title: data.title,
@@ -83,12 +84,15 @@ export default root => {
}
});
break;
- case "background":
+ }
+ case "background": {
inc_notification_counter();
break;
- default:
+ }
+ default: {
inc_notification_counter();
break;
+ }
}
if (data.sound) {
diff --git a/CTFd/themes/core/assets/js/graphs.js b/CTFd/themes/core/assets/js/graphs.js
index 86e13179..76f05b58 100644
--- a/CTFd/themes/core/assets/js/graphs.js
+++ b/CTFd/themes/core/assets/js/graphs.js
@@ -22,11 +22,11 @@ const graph_configs = {
orientation: "h"
}
},
- fn: (type, id, name, account_id) =>
+ fn: (type, id, name, _account_id) =>
`CTFd_score_${type}_${name}_${id}_${new Date()
.toISOString()
.slice(0, 19)}`,
- format: (type, id, name, account_id, responses) => {
+ format: (type, id, name, _account_id, responses) => {
const times = [];
const scores = [];
const solves = responses[0].data;
@@ -74,7 +74,7 @@ const graph_configs = {
},
height: "400px"
},
- fn: (type, id, name, account_id) =>
+ fn: (type, id, name, _account_id) =>
`CTFd_submissions_${type}_${name}_${id}_${new Date()
.toISOString()
.slice(0, 19)}`,
@@ -122,7 +122,7 @@ const graph_configs = {
},
height: "400px"
},
- fn: (type, id, name, account_id) =>
+ fn: (type, id, name, _account_id) =>
`CTFd_submissions_${type}_${name}_${id}_${new Date()
.toISOString()
.slice(0, 19)}`,
@@ -164,7 +164,6 @@ export function createGraph(
const $elem = $(target);
$elem.empty();
if ($elem[0] === undefined) {
- console.log("Couldn't find graph target: " + target);
return;
}
$elem[0].fn = cfg.fn(type, id, name, account_id);
diff --git a/CTFd/themes/core/assets/js/pages/challenges.js b/CTFd/themes/core/assets/js/pages/challenges.js
index 74402ab3..0c071be4 100644
--- a/CTFd/themes/core/assets/js/pages/challenges.js
+++ b/CTFd/themes/core/assets/js/pages/challenges.js
@@ -76,7 +76,7 @@ const displayChal = chal => {
}
}
- $(".challenge-solves").click(function(event) {
+ $(".challenge-solves").click(function(_event) {
getSolves($("#challenge-id").val());
});
$(".nav-tabs a").click(function(event) {
@@ -85,7 +85,7 @@ const displayChal = chal => {
});
// Handle modal toggling
- $("#challenge-window").on("hide.bs.modal", function(event) {
+ $("#challenge-window").on("hide.bs.modal", function(_event) {
$("#challenge-input").removeClass("wrong");
$("#challenge-input").removeClass("correct");
$("#incorrect-key").slideUp();
@@ -94,7 +94,7 @@ const displayChal = chal => {
$("#too-fast").slideUp();
});
- $(".load-hint").on("click", function(event) {
+ $(".load-hint").on("click", function(_event) {
loadHint($(this).data("hint-id"));
});
@@ -329,7 +329,7 @@ function loadChals() {
.append(chalwrap);
}
- $(".challenge-button").click(function(event) {
+ $(".challenge-button").click(function(_event) {
loadChal(this.value);
getSolves(this.value);
});
@@ -360,16 +360,16 @@ $(() => {
$(this).tab("show");
});
- $("#challenge-window").on("hidden.bs.modal", function(event) {
+ $("#challenge-window").on("hidden.bs.modal", function(_event) {
$(".nav-tabs a:first").tab("show");
history.replaceState("", window.document.title, window.location.pathname);
});
- $(".challenge-solves").click(function(event) {
+ $(".challenge-solves").click(function(_event) {
getSolves($("#challenge-id").val());
});
- $("#challenge-window").on("hide.bs.modal", function(event) {
+ $("#challenge-window").on("hide.bs.modal", function(_event) {
$("#challenge-input").removeClass("wrong");
$("#challenge-input").removeClass("correct");
$("#incorrect-key").slideUp();
diff --git a/CTFd/themes/core/assets/js/pages/notifications.js b/CTFd/themes/core/assets/js/pages/notifications.js
index 563abdc5..a5d1d435 100644
--- a/CTFd/themes/core/assets/js/pages/notifications.js
+++ b/CTFd/themes/core/assets/js/pages/notifications.js
@@ -1,6 +1,5 @@
import "./main";
import $ from "jquery";
-import CTFd from "../CTFd";
import { clear_notification_counter } from "../utils";
$(() => {
diff --git a/CTFd/themes/core/assets/js/pages/settings.js b/CTFd/themes/core/assets/js/pages/settings.js
index be8fb667..c1d6c813 100644
--- a/CTFd/themes/core/assets/js/pages/settings.js
+++ b/CTFd/themes/core/assets/js/pages/settings.js
@@ -111,7 +111,7 @@ $(() => {
$("#user-profile-form").submit(profileUpdate);
$("#user-token-form").submit(tokenGenerate);
$(".delete-token").click(deleteToken);
- $(".nav-pills a").click(function(event) {
+ $(".nav-pills a").click(function(_event) {
window.location.hash = this.hash;
});
diff --git a/CTFd/themes/core/assets/js/pages/setup.js b/CTFd/themes/core/assets/js/pages/setup.js
index 219e54aa..b138cc15 100644
--- a/CTFd/themes/core/assets/js/pages/setup.js
+++ b/CTFd/themes/core/assets/js/pages/setup.js
@@ -1,7 +1,6 @@
import "./main";
import $ from "jquery";
import Moment from "moment-timezone";
-import moment from "moment-timezone";
import CTFd from "../CTFd";
function switchTab(event) {
@@ -13,7 +12,7 @@ function switchTab(event) {
.closest("[role=tabpanel]")
.find("input,textarea")
.each(function(i, e) {
- $e = $(e);
+ let $e = $(e);
let status = e.checkValidity();
if (status === false) {
$e.removeClass("input-filled-valid");
@@ -33,7 +32,7 @@ function switchTab(event) {
function processDateTime(datetime) {
let date_picker = $(`#${datetime}-date`);
let time_picker = $(`#${datetime}-time`);
- return function(event) {
+ return function(_event) {
let unix_time = Moment(
`${date_picker.val()} ${time_picker.val()}`,
"YYYY-MM-DD HH:mm"
@@ -44,7 +43,7 @@ function processDateTime(datetime) {
};
}
-function mlcSetup(event) {
+function mlcSetup(_event) {
let params = {
name: $("#ctf_name").val(),
type: "jeopardy",
@@ -57,7 +56,7 @@ function mlcSetup(event) {
start: $("#start-preview").val(),
end: $("#end-preview").val(),
platform: "CTFd",
- state: STATE
+ state: window.STATE
};
const ret = [];
@@ -88,7 +87,7 @@ $(() => {
$("#start-date,#start-time").change(processDateTime("start"));
$("#end-date,#end-time").change(processDateTime("end"));
- $("#config-color-picker").on("input", function(e) {
+ $("#config-color-picker").on("input", function(_e) {
$("#config-color-input").val($(this).val());
});
diff --git a/CTFd/themes/core/assets/js/pages/teams/private.js b/CTFd/themes/core/assets/js/pages/teams/private.js
index c31ab39f..ed5fda35 100644
--- a/CTFd/themes/core/assets/js/pages/teams/private.js
+++ b/CTFd/themes/core/assets/js/pages/teams/private.js
@@ -3,6 +3,7 @@ import "../../utils";
import CTFd from "../../CTFd";
import "bootstrap/js/dist/modal";
import $ from "jquery";
+import { ezBadge } from "../../ezq";
$(() => {
if (window.team_captain) {
@@ -34,6 +35,12 @@ $(() => {
if (response.status === 400) {
response.json().then(function(object) {
if (!object.success) {
+ const error_template =
+ '\n' +
+ ' Error:\n' +
+ " {0}\n" +
+ ' \n' +
+ "
";
Object.keys(object.errors).map(function(error) {
var i = form.find("input[name={0}]".format(error));
var input = $(i);
@@ -76,9 +83,9 @@ $(() => {
window.location.reload();
} else {
$("#team-captain-form > #results").empty();
- Object.keys(response.errors).forEach(function(key, index) {
+ Object.keys(response.errors).forEach(function(key, _index) {
$("#team-captain-form > #results").append(
- ezbadge({
+ ezBadge({
type: "error",
body: response.errors[key]
})
diff --git a/CTFd/themes/core/assets/js/utils.js b/CTFd/themes/core/assets/js/utils.js
index dd778517..fcf090df 100644
--- a/CTFd/themes/core/assets/js/utils.js
+++ b/CTFd/themes/core/assets/js/utils.js
@@ -108,7 +108,9 @@ WindowController.prototype.handleEvent = function(event) {
if (data.id !== this.id) {
this[data.type](data);
}
- } catch (error) {}
+ } catch (error) {
+ // Ignore error
+ }
}
};
@@ -134,7 +136,7 @@ WindowController.prototype.bye = function(event) {
this.check();
};
-WindowController.prototype.check = function(event) {
+WindowController.prototype.check = function(_event) {
var now = +new Date(),
takeMaster = true,
id;
@@ -164,6 +166,7 @@ WindowController.prototype.broadcast = function(type, data) {
try {
localStorage.setItem("broadcast", JSON.stringify(event));
} catch (error) {
+ // eslint-disable-next-line no-console
console.log(error);
}
};
diff --git a/CTFd/themes/core/static/js/core.dev.js b/CTFd/themes/core/static/js/core.dev.js
index 9d09532f..653b833a 100644
--- a/CTFd/themes/core/static/js/core.dev.js
+++ b/CTFd/themes/core/static/js/core.dev.js
@@ -20,7 +20,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n
/***/ (function(module, exports, __webpack_require__) {
;
-eval("\n\nvar _fetch = _interopRequireDefault(__webpack_require__(/*! ./fetch */ \"./CTFd/themes/core/assets/js/fetch.js\"));\n\nvar _q = _interopRequireDefault(__webpack_require__(/*! q */ \"./node_modules/q/q.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/**\n *\n * @class API\n * @param {(string|object)} [domainOrOptions] - The project domain or options object. If object, see the object's optional properties.\n * @param {string} [domainOrOptions.domain] - The project domain\n * @param {object} [domainOrOptions.token] - auth token - object with value property and optional headerOrQueryName and isQuery properties\n */\nvar API = function () {\n \"use strict\";\n\n function API(options) {\n var domain = _typeof(options) === \"object\" ? options.domain : options;\n this.domain = domain ? domain : \"\";\n\n if (this.domain.length === 0) {\n throw new Error(\"Domain parameter must be specified as a string.\");\n }\n }\n\n function serializeQueryParams(parameters) {\n var str = [];\n\n for (var p in parameters) {\n if (parameters.hasOwnProperty(p)) {\n str.push(encodeURIComponent(p) + \"=\" + encodeURIComponent(parameters[p]));\n }\n }\n\n return str.join(\"&\");\n }\n\n function mergeQueryParams(parameters, queryParameters) {\n if (parameters.$queryParameters) {\n Object.keys(parameters.$queryParameters).forEach(function (parameterName) {\n var parameter = parameters.$queryParameters[parameterName];\n queryParameters[parameterName] = parameter;\n });\n }\n\n return queryParameters;\n }\n /**\n * HTTP Request\n * @method\n * @name API#request\n * @param {string} method - http method\n * @param {string} url - url to do request\n * @param {object} parameters\n * @param {object} body - body parameters / object\n * @param {object} headers - header parameters\n * @param {object} queryParameters - querystring parameters\n * @param {object} form - form data object\n * @param {object} deferred - promise object\n */\n\n\n API.prototype.request = function (method, url, parameters, body, headers, queryParameters, form, deferred) {\n var queryParams = queryParameters && Object.keys(queryParameters).length ? serializeQueryParams(queryParameters) : null;\n var urlWithParams = url + (queryParams ? \"?\" + queryParams : \"\");\n\n if (body && !Object.keys(body).length) {\n body = undefined;\n }\n\n (0, _fetch.default)(urlWithParams, {\n method: method,\n headers: headers,\n body: JSON.stringify(body)\n }).then(function (response) {\n return response.json();\n }).then(function (body) {\n deferred.resolve(body);\n }).catch(function (error) {\n deferred.reject(error);\n });\n };\n /**\n *\n * @method\n * @name API#post_award_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_award_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/awards\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_award\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.awardId - An Award ID\n */\n\n\n API.prototype.delete_award = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/awards/{award_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{award_id}\", parameters[\"awardId\"]);\n\n if (parameters[\"awardId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: awardId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_award\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.awardId - An Award ID\n */\n\n\n API.prototype.get_award = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/awards/{award_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{award_id}\", parameters[\"awardId\"]);\n\n if (parameters[\"awardId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: awardId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_challenge_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_challenge_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_challenge_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_challenge_attempt\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_challenge_attempt = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/attempt\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_types\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_challenge_types = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/types\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_challenge\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.challengeId - A Challenge ID\n */\n\n\n API.prototype.patch_challenge = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_challenge\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.challengeId - A Challenge ID\n */\n\n\n API.prototype.delete_challenge = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.challengeId - A Challenge ID\n */\n\n\n API.prototype.get_challenge = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_files\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.id - A Challenge ID\n * @param {string} parameters.challengeId -\n */\n\n\n API.prototype.get_challenge_files = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}/files\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"id\"] !== undefined) {\n queryParameters[\"id\"] = parameters[\"id\"];\n }\n\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_flags\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.id - A Challenge ID\n * @param {string} parameters.challengeId -\n */\n\n\n API.prototype.get_challenge_flags = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}/flags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"id\"] !== undefined) {\n queryParameters[\"id\"] = parameters[\"id\"];\n }\n\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_hints\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.id - A Challenge ID\n * @param {string} parameters.challengeId -\n */\n\n\n API.prototype.get_challenge_hints = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}/hints\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"id\"] !== undefined) {\n queryParameters[\"id\"] = parameters[\"id\"];\n }\n\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_solves\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.id - A Challenge ID\n * @param {string} parameters.challengeId -\n */\n\n\n API.prototype.get_challenge_solves = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}/solves\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"id\"] !== undefined) {\n queryParameters[\"id\"] = parameters[\"id\"];\n }\n\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_tags\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.id - A Challenge ID\n * @param {string} parameters.challengeId -\n */\n\n\n API.prototype.get_challenge_tags = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}/tags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"id\"] !== undefined) {\n queryParameters[\"id\"] = parameters[\"id\"];\n }\n\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_config_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_config_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_config_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.patch_config_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_config_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_config_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_config\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.configKey -\n */\n\n\n API.prototype.patch_config = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs/{config_key}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{config_key}\", parameters[\"configKey\"]);\n\n if (parameters[\"configKey\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: configKey\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_config\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.configKey -\n */\n\n\n API.prototype.delete_config = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs/{config_key}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{config_key}\", parameters[\"configKey\"]);\n\n if (parameters[\"configKey\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: configKey\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_config\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.configKey -\n */\n\n\n API.prototype.get_config = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs/{config_key}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{config_key}\", parameters[\"configKey\"]);\n\n if (parameters[\"configKey\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: configKey\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_files_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_files_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/files\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_files_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_files_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/files\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_files_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.fileId -\n */\n\n\n API.prototype.delete_files_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/files/{file_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{file_id}\", parameters[\"fileId\"]);\n\n if (parameters[\"fileId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: fileId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_files_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.fileId -\n */\n\n\n API.prototype.get_files_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/files/{file_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{file_id}\", parameters[\"fileId\"]);\n\n if (parameters[\"fileId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: fileId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_flag_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_flag_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_flag_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_flag_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_flag_types\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_flag_types = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags/types\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_flag_types_1\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.typeName -\n */\n\n\n API.prototype.get_flag_types_1 = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags/types/{type_name}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{type_name}\", parameters[\"typeName\"]);\n\n if (parameters[\"typeName\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: typeName\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_flag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.flagId -\n */\n\n\n API.prototype.patch_flag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags/{flag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{flag_id}\", parameters[\"flagId\"]);\n\n if (parameters[\"flagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: flagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_flag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.flagId -\n */\n\n\n API.prototype.delete_flag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags/{flag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{flag_id}\", parameters[\"flagId\"]);\n\n if (parameters[\"flagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: flagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_flag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.flagId -\n */\n\n\n API.prototype.get_flag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags/{flag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{flag_id}\", parameters[\"flagId\"]);\n\n if (parameters[\"flagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: flagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_hint_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_hint_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/hints\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_hint_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_hint_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/hints\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_hint\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.hintId -\n */\n\n\n API.prototype.patch_hint = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/hints/{hint_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{hint_id}\", parameters[\"hintId\"]);\n\n if (parameters[\"hintId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: hintId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_hint\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.hintId -\n */\n\n\n API.prototype.delete_hint = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/hints/{hint_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{hint_id}\", parameters[\"hintId\"]);\n\n if (parameters[\"hintId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: hintId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_hint\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.hintId -\n */\n\n\n API.prototype.get_hint = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/hints/{hint_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{hint_id}\", parameters[\"hintId\"]);\n\n if (parameters[\"hintId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: hintId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_notification_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_notification_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/notifications\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_notification_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_notification_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/notifications\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_notification\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.notificationId - A Notification ID\n */\n\n\n API.prototype.delete_notification = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/notifications/{notification_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{notification_id}\", parameters[\"notificationId\"]);\n\n if (parameters[\"notificationId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: notificationId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_notification\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.notificationId - A Notification ID\n */\n\n\n API.prototype.get_notification = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/notifications/{notification_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{notification_id}\", parameters[\"notificationId\"]);\n\n if (parameters[\"notificationId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: notificationId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_page_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_page_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/pages\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_page_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_page_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/pages\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_page_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.pageId -\n */\n\n\n API.prototype.patch_page_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/pages/{page_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{page_id}\", parameters[\"pageId\"]);\n\n if (parameters[\"pageId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: pageId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_page_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.pageId -\n */\n\n\n API.prototype.delete_page_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/pages/{page_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{page_id}\", parameters[\"pageId\"]);\n\n if (parameters[\"pageId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: pageId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_page_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.pageId -\n */\n\n\n API.prototype.get_page_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/pages/{page_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{page_id}\", parameters[\"pageId\"]);\n\n if (parameters[\"pageId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: pageId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_scoreboard_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_scoreboard_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/scoreboard\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_scoreboard_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.count - How many top teams to return\n */\n\n\n API.prototype.get_scoreboard_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/scoreboard/top/{count}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{count}\", parameters[\"count\"]);\n\n if (parameters[\"count\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: count\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_solve_statistics\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_challenge_solve_statistics = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/challenges/solves\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_solve_percentages\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_challenge_solve_percentages = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/challenges/solves/percentages\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_property_counts\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.column -\n */\n\n\n API.prototype.get_challenge_property_counts = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/challenges/{column}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{column}\", parameters[\"column\"]);\n\n if (parameters[\"column\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: column\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_submission_property_counts\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.column -\n */\n\n\n API.prototype.get_submission_property_counts = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/submissions/{column}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{column}\", parameters[\"column\"]);\n\n if (parameters[\"column\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: column\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_statistics\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_team_statistics = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/teams\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_statistics\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_user_statistics = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/users\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_property_counts\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.column -\n */\n\n\n API.prototype.get_user_property_counts = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/users/{column}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{column}\", parameters[\"column\"]);\n\n if (parameters[\"column\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: column\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_submissions_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_submissions_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/submissions\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_submissions_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_submissions_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/submissions\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_submission\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.submissionId - A Submission ID\n */\n\n\n API.prototype.delete_submission = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/submissions/{submission_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{submission_id}\", parameters[\"submissionId\"]);\n\n if (parameters[\"submissionId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: submissionId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_submission\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.submissionId - A Submission ID\n */\n\n\n API.prototype.get_submission = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/submissions/{submission_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{submission_id}\", parameters[\"submissionId\"]);\n\n if (parameters[\"submissionId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: submissionId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_tag_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_tag_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/tags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_tag_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_tag_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/tags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_tag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.tagId - A Tag ID\n */\n\n\n API.prototype.patch_tag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/tags/{tag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{tag_id}\", parameters[\"tagId\"]);\n\n if (parameters[\"tagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: tagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_tag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.tagId - A Tag ID\n */\n\n\n API.prototype.delete_tag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/tags/{tag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{tag_id}\", parameters[\"tagId\"]);\n\n if (parameters[\"tagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: tagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_tag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.tagId - A Tag ID\n */\n\n\n API.prototype.get_tag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/tags/{tag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{tag_id}\", parameters[\"tagId\"]);\n\n if (parameters[\"tagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: tagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_team_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_team_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_team_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_team_private\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Current Team\n */\n\n\n API.prototype.patch_team_private = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/me\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"teamId\"] !== undefined) {\n queryParameters[\"team_id\"] = parameters[\"teamId\"];\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_private\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Current Team\n */\n\n\n API.prototype.get_team_private = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/me\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"teamId\"] !== undefined) {\n queryParameters[\"team_id\"] = parameters[\"teamId\"];\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_team_public\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID\n */\n\n\n API.prototype.patch_team_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_team_public\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID\n */\n\n\n API.prototype.delete_team_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_public\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID\n */\n\n\n API.prototype.get_team_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_awards\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID or 'me'\n */\n\n\n API.prototype.get_team_awards = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}/awards\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_fails\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID or 'me'\n */\n\n\n API.prototype.get_team_fails = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}/fails\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_solves\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID or 'me'\n */\n\n\n API.prototype.get_team_solves = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}/solves\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_unlock_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_unlock_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/unlocks\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_unlock_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_unlock_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/unlocks\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_user_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_user_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_user_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_user_private\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.patch_user_private = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/me\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_private\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_user_private = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/me\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_user_public\n * @param {object} parameters - method options and parameters\n * @param {integer} parameters.userId - User ID\n */\n\n\n API.prototype.patch_user_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_user_public\n * @param {object} parameters - method options and parameters\n * @param {integer} parameters.userId - User ID\n */\n\n\n API.prototype.delete_user_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_public\n * @param {object} parameters - method options and parameters\n * @param {integer} parameters.userId - User ID\n */\n\n\n API.prototype.get_user_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_awards\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.userId - User ID or 'me'\n */\n\n\n API.prototype.get_user_awards = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}/awards\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_fails\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.userId - User ID or 'me'\n */\n\n\n API.prototype.get_user_fails = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}/fails\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_solves\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.userId - User ID or 'me'\n */\n\n\n API.prototype.get_user_solves = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}/solves\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n\n return API;\n}();\n\nexports.API = API;\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/api.js?");
+eval("\n\nvar _fetch = _interopRequireDefault(__webpack_require__(/*! ./fetch */ \"./CTFd/themes/core/assets/js/fetch.js\"));\n\nvar _q = _interopRequireDefault(__webpack_require__(/*! q */ \"./node_modules/q/q.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n/**\n *\n * @class API\n * @param {(string|object)} [domainOrOptions] - The project domain or options object. If object, see the object's optional properties.\n * @param {string} [domainOrOptions.domain] - The project domain\n * @param {object} [domainOrOptions.token] - auth token - object with value property and optional headerOrQueryName and isQuery properties\n */\nvar API = function () {\n \"use strict\";\n\n function API(options) {\n var domain = _typeof(options) === \"object\" ? options.domain : options;\n this.domain = domain ? domain : \"\";\n\n if (this.domain.length === 0) {\n throw new Error(\"Domain parameter must be specified as a string.\");\n }\n }\n\n function serializeQueryParams(parameters) {\n var str = [];\n\n for (var p in parameters) {\n if (parameters.hasOwnProperty(p)) {\n str.push(encodeURIComponent(p) + \"=\" + encodeURIComponent(parameters[p]));\n }\n }\n\n return str.join(\"&\");\n }\n\n function mergeQueryParams(parameters, queryParameters) {\n if (parameters.$queryParameters) {\n Object.keys(parameters.$queryParameters).forEach(function (parameterName) {\n var parameter = parameters.$queryParameters[parameterName];\n queryParameters[parameterName] = parameter;\n });\n }\n\n return queryParameters;\n }\n /**\n * HTTP Request\n * @method\n * @name API#request\n * @param {string} method - http method\n * @param {string} url - url to do request\n * @param {object} parameters\n * @param {object} body - body parameters / object\n * @param {object} headers - header parameters\n * @param {object} queryParameters - querystring parameters\n * @param {object} form - form data object\n * @param {object} deferred - promise object\n */\n\n\n API.prototype.request = function (method, url, parameters, body, headers, queryParameters, form, deferred) {\n var queryParams = queryParameters && Object.keys(queryParameters).length ? serializeQueryParams(queryParameters) : null;\n var urlWithParams = url + (queryParams ? \"?\" + queryParams : \"\");\n\n if (body && !Object.keys(body).length) {\n body = undefined;\n }\n\n (0, _fetch.default)(urlWithParams, {\n method: method,\n headers: headers,\n body: JSON.stringify(body)\n }).then(function (response) {\n return response.json();\n }).then(function (body) {\n deferred.resolve(body);\n }).catch(function (error) {\n deferred.reject(error);\n });\n };\n /**\n *\n * @method\n * @name API#post_award_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_award_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/awards\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_award\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.awardId - An Award ID\n */\n\n\n API.prototype.delete_award = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/awards/{award_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{award_id}\", parameters[\"awardId\"]);\n\n if (parameters[\"awardId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: awardId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_award\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.awardId - An Award ID\n */\n\n\n API.prototype.get_award = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/awards/{award_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{award_id}\", parameters[\"awardId\"]);\n\n if (parameters[\"awardId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: awardId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_challenge_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_challenge_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_challenge_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_challenge_attempt\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_challenge_attempt = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/attempt\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_types\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_challenge_types = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/types\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_challenge\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.challengeId - A Challenge ID\n */\n\n\n API.prototype.patch_challenge = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_challenge\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.challengeId - A Challenge ID\n */\n\n\n API.prototype.delete_challenge = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.challengeId - A Challenge ID\n */\n\n\n API.prototype.get_challenge = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_files\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.id - A Challenge ID\n * @param {string} parameters.challengeId -\n */\n\n\n API.prototype.get_challenge_files = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}/files\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"id\"] !== undefined) {\n queryParameters[\"id\"] = parameters[\"id\"];\n }\n\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_flags\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.id - A Challenge ID\n * @param {string} parameters.challengeId -\n */\n\n\n API.prototype.get_challenge_flags = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}/flags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"id\"] !== undefined) {\n queryParameters[\"id\"] = parameters[\"id\"];\n }\n\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_hints\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.id - A Challenge ID\n * @param {string} parameters.challengeId -\n */\n\n\n API.prototype.get_challenge_hints = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}/hints\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"id\"] !== undefined) {\n queryParameters[\"id\"] = parameters[\"id\"];\n }\n\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_solves\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.id - A Challenge ID\n * @param {string} parameters.challengeId -\n */\n\n\n API.prototype.get_challenge_solves = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}/solves\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"id\"] !== undefined) {\n queryParameters[\"id\"] = parameters[\"id\"];\n }\n\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_tags\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.id - A Challenge ID\n * @param {string} parameters.challengeId -\n */\n\n\n API.prototype.get_challenge_tags = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/challenges/{challenge_id}/tags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"id\"] !== undefined) {\n queryParameters[\"id\"] = parameters[\"id\"];\n }\n\n path = path.replace(\"{challenge_id}\", parameters[\"challengeId\"]);\n\n if (parameters[\"challengeId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: challengeId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_config_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_config_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_config_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.patch_config_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_config_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_config_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_config\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.configKey -\n */\n\n\n API.prototype.patch_config = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs/{config_key}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{config_key}\", parameters[\"configKey\"]);\n\n if (parameters[\"configKey\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: configKey\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_config\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.configKey -\n */\n\n\n API.prototype.delete_config = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs/{config_key}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{config_key}\", parameters[\"configKey\"]);\n\n if (parameters[\"configKey\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: configKey\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_config\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.configKey -\n */\n\n\n API.prototype.get_config = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/configs/{config_key}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{config_key}\", parameters[\"configKey\"]);\n\n if (parameters[\"configKey\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: configKey\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_files_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_files_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/files\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_files_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_files_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/files\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_files_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.fileId -\n */\n\n\n API.prototype.delete_files_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/files/{file_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{file_id}\", parameters[\"fileId\"]);\n\n if (parameters[\"fileId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: fileId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_files_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.fileId -\n */\n\n\n API.prototype.get_files_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/files/{file_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{file_id}\", parameters[\"fileId\"]);\n\n if (parameters[\"fileId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: fileId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_flag_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_flag_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_flag_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_flag_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_flag_types\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_flag_types = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags/types\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_flag_types_1\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.typeName -\n */\n\n\n API.prototype.get_flag_types_1 = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags/types/{type_name}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{type_name}\", parameters[\"typeName\"]);\n\n if (parameters[\"typeName\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: typeName\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_flag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.flagId -\n */\n\n\n API.prototype.patch_flag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags/{flag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{flag_id}\", parameters[\"flagId\"]);\n\n if (parameters[\"flagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: flagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_flag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.flagId -\n */\n\n\n API.prototype.delete_flag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags/{flag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{flag_id}\", parameters[\"flagId\"]);\n\n if (parameters[\"flagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: flagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_flag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.flagId -\n */\n\n\n API.prototype.get_flag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/flags/{flag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{flag_id}\", parameters[\"flagId\"]);\n\n if (parameters[\"flagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: flagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_hint_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_hint_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/hints\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_hint_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_hint_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/hints\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_hint\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.hintId -\n */\n\n\n API.prototype.patch_hint = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/hints/{hint_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{hint_id}\", parameters[\"hintId\"]);\n\n if (parameters[\"hintId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: hintId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_hint\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.hintId -\n */\n\n\n API.prototype.delete_hint = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/hints/{hint_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{hint_id}\", parameters[\"hintId\"]);\n\n if (parameters[\"hintId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: hintId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_hint\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.hintId -\n */\n\n\n API.prototype.get_hint = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/hints/{hint_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{hint_id}\", parameters[\"hintId\"]);\n\n if (parameters[\"hintId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: hintId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_notification_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_notification_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/notifications\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_notification_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_notification_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/notifications\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_notification\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.notificationId - A Notification ID\n */\n\n\n API.prototype.delete_notification = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/notifications/{notification_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{notification_id}\", parameters[\"notificationId\"]);\n\n if (parameters[\"notificationId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: notificationId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_notification\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.notificationId - A Notification ID\n */\n\n\n API.prototype.get_notification = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/notifications/{notification_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{notification_id}\", parameters[\"notificationId\"]);\n\n if (parameters[\"notificationId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: notificationId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_page_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_page_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/pages\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_page_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_page_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/pages\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_page_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.pageId -\n */\n\n\n API.prototype.patch_page_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/pages/{page_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{page_id}\", parameters[\"pageId\"]);\n\n if (parameters[\"pageId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: pageId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_page_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.pageId -\n */\n\n\n API.prototype.delete_page_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/pages/{page_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{page_id}\", parameters[\"pageId\"]);\n\n if (parameters[\"pageId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: pageId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_page_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.pageId -\n */\n\n\n API.prototype.get_page_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/pages/{page_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{page_id}\", parameters[\"pageId\"]);\n\n if (parameters[\"pageId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: pageId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_scoreboard_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_scoreboard_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/scoreboard\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_scoreboard_detail\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.count - How many top teams to return\n */\n\n\n API.prototype.get_scoreboard_detail = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/scoreboard/top/{count}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{count}\", parameters[\"count\"]);\n\n if (parameters[\"count\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: count\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_solve_statistics\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_challenge_solve_statistics = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/challenges/solves\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_solve_percentages\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_challenge_solve_percentages = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/challenges/solves/percentages\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_challenge_property_counts\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.column -\n */\n\n\n API.prototype.get_challenge_property_counts = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/challenges/{column}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{column}\", parameters[\"column\"]);\n\n if (parameters[\"column\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: column\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_submission_property_counts\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.column -\n */\n\n\n API.prototype.get_submission_property_counts = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/submissions/{column}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{column}\", parameters[\"column\"]);\n\n if (parameters[\"column\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: column\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_statistics\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_team_statistics = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/teams\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_statistics\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_user_statistics = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/users\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_property_counts\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.column -\n */\n\n\n API.prototype.get_user_property_counts = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/statistics/users/{column}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{column}\", parameters[\"column\"]);\n\n if (parameters[\"column\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: column\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_submissions_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_submissions_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/submissions\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_submissions_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_submissions_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/submissions\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_submission\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.submissionId - A Submission ID\n */\n\n\n API.prototype.delete_submission = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/submissions/{submission_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{submission_id}\", parameters[\"submissionId\"]);\n\n if (parameters[\"submissionId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: submissionId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_submission\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.submissionId - A Submission ID\n */\n\n\n API.prototype.get_submission = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/submissions/{submission_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{submission_id}\", parameters[\"submissionId\"]);\n\n if (parameters[\"submissionId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: submissionId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_tag_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_tag_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/tags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_tag_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_tag_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/tags\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_tag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.tagId - A Tag ID\n */\n\n\n API.prototype.patch_tag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/tags/{tag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{tag_id}\", parameters[\"tagId\"]);\n\n if (parameters[\"tagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: tagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_tag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.tagId - A Tag ID\n */\n\n\n API.prototype.delete_tag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/tags/{tag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{tag_id}\", parameters[\"tagId\"]);\n\n if (parameters[\"tagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: tagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_tag\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.tagId - A Tag ID\n */\n\n\n API.prototype.get_tag = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/tags/{tag_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{tag_id}\", parameters[\"tagId\"]);\n\n if (parameters[\"tagId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: tagId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_team_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_team_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_team_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_team_private\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Current Team\n */\n\n\n API.prototype.patch_team_private = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/me\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"teamId\"] !== undefined) {\n queryParameters[\"team_id\"] = parameters[\"teamId\"];\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_private\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Current Team\n */\n\n\n API.prototype.get_team_private = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/me\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n\n if (parameters[\"teamId\"] !== undefined) {\n queryParameters[\"team_id\"] = parameters[\"teamId\"];\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_team_public\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID\n */\n\n\n API.prototype.patch_team_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_team_public\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID\n */\n\n\n API.prototype.delete_team_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_public\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID\n */\n\n\n API.prototype.get_team_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_awards\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID or 'me'\n */\n\n\n API.prototype.get_team_awards = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}/awards\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_fails\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID or 'me'\n */\n\n\n API.prototype.get_team_fails = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}/fails\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_team_solves\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.teamId - Team ID or 'me'\n */\n\n\n API.prototype.get_team_solves = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/teams/{team_id}/solves\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{team_id}\", parameters[\"teamId\"]);\n\n if (parameters[\"teamId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: teamId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_unlock_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_unlock_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/unlocks\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_unlock_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_unlock_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/unlocks\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#post_user_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.post_user_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"POST\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_list\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_user_list = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_user_private\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.patch_user_private = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/me\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_private\n * @param {object} parameters - method options and parameters\n */\n\n\n API.prototype.get_user_private = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/me\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#patch_user_public\n * @param {object} parameters - method options and parameters\n * @param {integer} parameters.userId - User ID\n */\n\n\n API.prototype.patch_user_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"PATCH\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#delete_user_public\n * @param {object} parameters - method options and parameters\n * @param {integer} parameters.userId - User ID\n */\n\n\n API.prototype.delete_user_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"DELETE\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_public\n * @param {object} parameters - method options and parameters\n * @param {integer} parameters.userId - User ID\n */\n\n\n API.prototype.get_user_public = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_awards\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.userId - User ID or 'me'\n */\n\n\n API.prototype.get_user_awards = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}/awards\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_fails\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.userId - User ID or 'me'\n */\n\n\n API.prototype.get_user_fails = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}/fails\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n /**\n *\n * @method\n * @name API#get_user_solves\n * @param {object} parameters - method options and parameters\n * @param {string} parameters.userId - User ID or 'me'\n */\n\n\n API.prototype.get_user_solves = function (parameters) {\n if (parameters === undefined) {\n parameters = {};\n }\n\n var deferred = _q.default.defer();\n\n var domain = this.domain,\n path = \"/users/{user_id}/solves\";\n var body = {},\n queryParameters = {},\n headers = {},\n form = {};\n headers[\"Accept\"] = [\"application/json\"];\n headers[\"Content-Type\"] = [\"application/json\"];\n path = path.replace(\"{user_id}\", parameters[\"userId\"]);\n\n if (parameters[\"userId\"] === undefined) {\n deferred.reject(new Error(\"Missing required parameter: userId\"));\n return deferred.promise;\n }\n\n queryParameters = mergeQueryParams(parameters, queryParameters);\n this.request(\"GET\", domain + path, parameters, body, headers, queryParameters, form, deferred);\n return deferred.promise;\n };\n\n return API;\n}(); // eslint-disable-next-line no-undef\n\n\nexports.API = API;\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/api.js?");
/***/ }),
@@ -44,7 +44,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n
/***/ (function(module, exports, __webpack_require__) {
;
-eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _howler = __webpack_require__(/*! howler */ \"./node_modules/howler/dist/howler.js\");\n\nvar _eventSourcePolyfill = __webpack_require__(/*! event-source-polyfill */ \"./node_modules/event-source-polyfill/src/eventsource.js\");\n\nvar _ezq = __webpack_require__(/*! ./ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nvar _utils = __webpack_require__(/*! ./utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nvar EventSource = _eventSourcePolyfill.NativeEventSource || _eventSourcePolyfill.EventSourcePolyfill;\n\nvar _default = function _default(root) {\n var source = new EventSource(root + \"/events\");\n var wc = new _utils.WindowController();\n var howl = new _howler.Howl({\n src: [root + \"/themes/core/static/sounds/notification.webm\", root + \"/themes/core/static/sounds/notification.mp3\"]\n });\n (0, _utils.init_notification_counter)();\n\n function connect() {\n source.addEventListener(\"notification\", function (event) {\n var data = JSON.parse(event.data);\n wc.broadcast(\"notification\", data);\n render(data);\n }, false);\n }\n\n function disconnect() {\n if (source) {\n source.close();\n }\n }\n\n function render(data) {\n switch (data.type) {\n case \"toast\":\n (0, _utils.inc_notification_counter)(); // Trim toast body to length\n\n var length = 50;\n var trimmed_content = data.content.length > length ? data.content.substring(0, length - 3) + \"...\" : data.content;\n var clicked = false;\n (0, _ezq.ezToast)({\n title: data.title,\n body: trimmed_content,\n onclick: function onclick() {\n (0, _ezq.ezAlert)({\n title: data.title,\n body: data.content,\n button: \"Got it!\",\n success: function success() {\n clicked = true;\n (0, _utils.dec_notification_counter)();\n }\n });\n },\n onclose: function onclose() {\n if (!clicked) {\n (0, _utils.dec_notification_counter)();\n }\n }\n });\n break;\n\n case \"alert\":\n (0, _utils.inc_notification_counter)();\n (0, _ezq.ezAlert)({\n title: data.title,\n body: data.content,\n button: \"Got it!\",\n success: function success() {\n (0, _utils.dec_notification_counter)();\n }\n });\n break;\n\n case \"background\":\n (0, _utils.inc_notification_counter)();\n break;\n\n default:\n (0, _utils.inc_notification_counter)();\n break;\n }\n\n if (data.sound) {\n howl.play();\n }\n }\n\n wc.notification = function (data) {\n render(data);\n };\n\n wc.masterDidChange = function () {\n if (this.isMaster) {\n connect();\n } else {\n disconnect();\n }\n };\n};\n\nexports.default = _default;\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/events.js?");
+eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _howler = __webpack_require__(/*! howler */ \"./node_modules/howler/dist/howler.js\");\n\nvar _eventSourcePolyfill = __webpack_require__(/*! event-source-polyfill */ \"./node_modules/event-source-polyfill/src/eventsource.js\");\n\nvar _ezq = __webpack_require__(/*! ./ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nvar _utils = __webpack_require__(/*! ./utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nvar EventSource = _eventSourcePolyfill.NativeEventSource || _eventSourcePolyfill.EventSourcePolyfill;\n\nvar _default = function _default(root) {\n var source = new EventSource(root + \"/events\");\n var wc = new _utils.WindowController();\n var howl = new _howler.Howl({\n src: [root + \"/themes/core/static/sounds/notification.webm\", root + \"/themes/core/static/sounds/notification.mp3\"]\n });\n (0, _utils.init_notification_counter)();\n\n function connect() {\n source.addEventListener(\"notification\", function (event) {\n var data = JSON.parse(event.data);\n wc.broadcast(\"notification\", data);\n render(data);\n }, false);\n }\n\n function disconnect() {\n if (source) {\n source.close();\n }\n }\n\n function render(data) {\n switch (data.type) {\n case \"toast\":\n {\n (0, _utils.inc_notification_counter)(); // Trim toast body to length\n\n var length = 50;\n var trimmed_content = data.content.length > length ? data.content.substring(0, length - 3) + \"...\" : data.content;\n var clicked = false;\n (0, _ezq.ezToast)({\n title: data.title,\n body: trimmed_content,\n onclick: function onclick() {\n (0, _ezq.ezAlert)({\n title: data.title,\n body: data.content,\n button: \"Got it!\",\n success: function success() {\n clicked = true;\n (0, _utils.dec_notification_counter)();\n }\n });\n },\n onclose: function onclose() {\n if (!clicked) {\n (0, _utils.dec_notification_counter)();\n }\n }\n });\n break;\n }\n\n case \"alert\":\n {\n (0, _utils.inc_notification_counter)();\n (0, _ezq.ezAlert)({\n title: data.title,\n body: data.content,\n button: \"Got it!\",\n success: function success() {\n (0, _utils.dec_notification_counter)();\n }\n });\n break;\n }\n\n case \"background\":\n {\n (0, _utils.inc_notification_counter)();\n break;\n }\n\n default:\n {\n (0, _utils.inc_notification_counter)();\n break;\n }\n }\n\n if (data.sound) {\n howl.play();\n }\n }\n\n wc.notification = function (data) {\n render(data);\n };\n\n wc.masterDidChange = function () {\n if (this.isMaster) {\n connect();\n } else {\n disconnect();\n }\n };\n};\n\nexports.default = _default;\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/events.js?");
/***/ }),
@@ -128,7 +128,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n
/***/ (function(module, exports, __webpack_require__) {
;
-eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.WindowController = WindowController;\nexports.colorHash = colorHash;\nexports.htmlEntities = htmlEntities;\nexports.cumulativeSum = cumulativeSum;\nexports.init_notification_counter = init_notification_counter;\nexports.set_notification_counter = set_notification_counter;\nexports.inc_notification_counter = inc_notification_counter;\nexports.dec_notification_counter = dec_notification_counter;\nexports.clear_notification_counter = clear_notification_counter;\nexports.copyToClipboard = copyToClipboard;\nexports.makeSortableTables = makeSortableTables;\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n_jquery.default.fn.serializeJSON = function (omit_nulls) {\n var params = {};\n var form = (0, _jquery.default)(this);\n var values = form.serializeArray();\n values = values.concat(form.find(\"input[type=checkbox]:checked\").map(function () {\n return {\n name: this.name,\n value: true\n };\n }).get());\n values = values.concat(form.find(\"input[type=checkbox]:not(:checked)\").map(function () {\n return {\n name: this.name,\n value: false\n };\n }).get());\n values.map(function (x) {\n if (omit_nulls) {\n if (x.value !== null && x.value !== \"\") {\n params[x.name] = x.value;\n } else {\n var input = form.find(\":input[name=\".concat(x.name, \"]\"));\n\n if (input.data(\"initial\") !== input.val()) {\n params[x.name] = x.value;\n }\n }\n } else {\n params[x.name] = x.value;\n }\n });\n return params;\n}; //http://stackoverflow.com/a/2648463 - wizardry!\n\n\nString.prototype.format = String.prototype.f = function () {\n var s = this,\n i = arguments.length;\n\n while (i--) {\n s = s.replace(new RegExp(\"\\\\{\" + i + \"\\\\}\", \"gm\"), arguments[i]);\n }\n\n return s;\n}; //http://stackoverflow.com/a/7616484\n\n\nString.prototype.hashCode = function () {\n var hash = 0,\n i,\n chr,\n len;\n if (this.length == 0) return hash;\n\n for (i = 0, len = this.length; i < len; i++) {\n chr = this.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0; // Convert to 32bit integer\n }\n\n return hash;\n}; // https://gist.github.com/neilj/4146038\n// https://fastmail.blog/2012/11/26/inter-tab-communication-using-local-storage/\n\n\nfunction WindowController() {\n this.id = Math.random();\n this.isMaster = false;\n this.others = {};\n window.addEventListener(\"storage\", this, false);\n window.addEventListener(\"unload\", this, false);\n this.broadcast(\"hello\");\n var that = this;\n\n var check = function check() {\n that.check();\n that._checkTimeout = setTimeout(check, 9000);\n };\n\n var ping = function ping() {\n that.sendPing();\n that._pingTimeout = setTimeout(ping, 17000);\n };\n\n this._checkTimeout = setTimeout(check, 500);\n this._pingTimeout = setTimeout(ping, 17000);\n}\n\nWindowController.prototype.destroy = function () {\n clearTimeout(this._pingTimeout);\n clearTimeout(this._checkTimeout);\n window.removeEventListener(\"storage\", this, false);\n window.removeEventListener(\"unload\", this, false);\n this.broadcast(\"bye\");\n};\n\nWindowController.prototype.handleEvent = function (event) {\n if (event.type === \"unload\") {\n this.destroy();\n } else if (event.key === \"broadcast\") {\n try {\n var data = JSON.parse(event.newValue);\n\n if (data.id !== this.id) {\n this[data.type](data);\n }\n } catch (error) {}\n }\n};\n\nWindowController.prototype.sendPing = function () {\n this.broadcast(\"ping\");\n};\n\nWindowController.prototype.hello = function (event) {\n this.ping(event);\n\n if (event.id < this.id) {\n this.check();\n } else {\n this.sendPing();\n }\n};\n\nWindowController.prototype.ping = function (event) {\n this.others[event.id] = +new Date();\n};\n\nWindowController.prototype.bye = function (event) {\n delete this.others[event.id];\n this.check();\n};\n\nWindowController.prototype.check = function (event) {\n var now = +new Date(),\n takeMaster = true,\n id;\n\n for (id in this.others) {\n if (this.others[id] + 23000 < now) {\n delete this.others[id];\n } else if (id < this.id) {\n takeMaster = false;\n }\n }\n\n if (this.isMaster !== takeMaster) {\n this.isMaster = takeMaster;\n this.masterDidChange();\n }\n};\n\nWindowController.prototype.masterDidChange = function () {};\n\nWindowController.prototype.broadcast = function (type, data) {\n var event = {\n id: this.id,\n type: type\n };\n\n for (var x in data) {\n event[x] = data[x];\n }\n\n try {\n localStorage.setItem(\"broadcast\", JSON.stringify(event));\n } catch (error) {\n console.log(error);\n }\n};\n\nfunction colorHash(str) {\n var hash = 0;\n\n for (var i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n }\n\n var colour = \"#\";\n\n for (var _i = 0; _i < 3; _i++) {\n var value = hash >> _i * 8 & 0xff;\n colour += (\"00\" + value.toString(16)).substr(-2);\n }\n\n return colour;\n}\n\nfunction htmlEntities(string) {\n return (0, _jquery.default)(\"\").text(string).html();\n}\n\nfunction cumulativeSum(arr) {\n var result = arr.concat();\n\n for (var i = 0; i < arr.length; i++) {\n result[i] = arr.slice(0, i + 1).reduce(function (p, i) {\n return p + i;\n });\n }\n\n return result;\n}\n\nvar storage = window.localStorage;\nvar counter_key = \"unread_notifications\";\n\nfunction init_notification_counter() {\n var count = storage.getItem(counter_key);\n\n if (count === null) {\n storage.setItem(counter_key, 0);\n } else {\n if (count > 0) {\n (0, _jquery.default)(\".badge-notification\").text(count);\n }\n }\n}\n\nfunction set_notification_counter(count) {\n storage.setItem(counter_key, count);\n}\n\nfunction inc_notification_counter() {\n var count = storage.getItem(counter_key) || 0;\n storage.setItem(counter_key, ++count);\n (0, _jquery.default)(\".badge-notification\").text(count);\n}\n\nfunction dec_notification_counter() {\n var count = storage.getItem(counter_key) || 0;\n\n if (count > 0) {\n storage.setItem(counter_key, --count);\n (0, _jquery.default)(\".badge-notification\").text(count);\n } // Always clear if count is 0\n\n\n if (count == 0) {\n clear_notification_counter();\n }\n}\n\nfunction clear_notification_counter() {\n storage.setItem(counter_key, 0);\n (0, _jquery.default)(\".badge-notification\").empty();\n}\n\nfunction copyToClipboard(event, selector) {\n // Select element\n (0, _jquery.default)(selector).select(); // Copy to clipboard\n\n document.execCommand(\"copy\"); // Show tooltip to user\n\n (0, _jquery.default)(event.target).tooltip({\n title: \"Copied!\",\n trigger: \"manual\"\n });\n (0, _jquery.default)(event.target).tooltip(\"show\");\n setTimeout(function () {\n (0, _jquery.default)(event.target).tooltip(\"hide\");\n }, 1500);\n}\n\nfunction makeSortableTables() {\n (0, _jquery.default)(\"th.sort-col\").append(\" \");\n (0, _jquery.default)(\"th.sort-col\").click(function () {\n var table = (0, _jquery.default)(this).parents(\"table\").eq(0);\n var rows = table.find(\"tr:gt(0)\").toArray().sort(comparer((0, _jquery.default)(this).index()));\n this.asc = !this.asc;\n\n if (!this.asc) {\n rows = rows.reverse();\n }\n\n for (var i = 0; i < rows.length; i++) {\n table.append(rows[i]);\n }\n });\n\n function comparer(index) {\n return function (a, b) {\n var valA = getCellValue(a, index),\n valB = getCellValue(b, index);\n return _jquery.default.isNumeric(valA) && _jquery.default.isNumeric(valB) ? valA - valB : valA.toString().localeCompare(valB);\n };\n }\n\n function getCellValue(row, index) {\n return (0, _jquery.default)(row).children(\"td\").eq(index).text();\n }\n}\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/utils.js?");
+eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.WindowController = WindowController;\nexports.colorHash = colorHash;\nexports.htmlEntities = htmlEntities;\nexports.cumulativeSum = cumulativeSum;\nexports.init_notification_counter = init_notification_counter;\nexports.set_notification_counter = set_notification_counter;\nexports.inc_notification_counter = inc_notification_counter;\nexports.dec_notification_counter = dec_notification_counter;\nexports.clear_notification_counter = clear_notification_counter;\nexports.copyToClipboard = copyToClipboard;\nexports.makeSortableTables = makeSortableTables;\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n_jquery.default.fn.serializeJSON = function (omit_nulls) {\n var params = {};\n var form = (0, _jquery.default)(this);\n var values = form.serializeArray();\n values = values.concat(form.find(\"input[type=checkbox]:checked\").map(function () {\n return {\n name: this.name,\n value: true\n };\n }).get());\n values = values.concat(form.find(\"input[type=checkbox]:not(:checked)\").map(function () {\n return {\n name: this.name,\n value: false\n };\n }).get());\n values.map(function (x) {\n if (omit_nulls) {\n if (x.value !== null && x.value !== \"\") {\n params[x.name] = x.value;\n } else {\n var input = form.find(\":input[name=\".concat(x.name, \"]\"));\n\n if (input.data(\"initial\") !== input.val()) {\n params[x.name] = x.value;\n }\n }\n } else {\n params[x.name] = x.value;\n }\n });\n return params;\n}; //http://stackoverflow.com/a/2648463 - wizardry!\n\n\nString.prototype.format = String.prototype.f = function () {\n var s = this,\n i = arguments.length;\n\n while (i--) {\n s = s.replace(new RegExp(\"\\\\{\" + i + \"\\\\}\", \"gm\"), arguments[i]);\n }\n\n return s;\n}; //http://stackoverflow.com/a/7616484\n\n\nString.prototype.hashCode = function () {\n var hash = 0,\n i,\n chr,\n len;\n if (this.length == 0) return hash;\n\n for (i = 0, len = this.length; i < len; i++) {\n chr = this.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0; // Convert to 32bit integer\n }\n\n return hash;\n}; // https://gist.github.com/neilj/4146038\n// https://fastmail.blog/2012/11/26/inter-tab-communication-using-local-storage/\n\n\nfunction WindowController() {\n this.id = Math.random();\n this.isMaster = false;\n this.others = {};\n window.addEventListener(\"storage\", this, false);\n window.addEventListener(\"unload\", this, false);\n this.broadcast(\"hello\");\n var that = this;\n\n var check = function check() {\n that.check();\n that._checkTimeout = setTimeout(check, 9000);\n };\n\n var ping = function ping() {\n that.sendPing();\n that._pingTimeout = setTimeout(ping, 17000);\n };\n\n this._checkTimeout = setTimeout(check, 500);\n this._pingTimeout = setTimeout(ping, 17000);\n}\n\nWindowController.prototype.destroy = function () {\n clearTimeout(this._pingTimeout);\n clearTimeout(this._checkTimeout);\n window.removeEventListener(\"storage\", this, false);\n window.removeEventListener(\"unload\", this, false);\n this.broadcast(\"bye\");\n};\n\nWindowController.prototype.handleEvent = function (event) {\n if (event.type === \"unload\") {\n this.destroy();\n } else if (event.key === \"broadcast\") {\n try {\n var data = JSON.parse(event.newValue);\n\n if (data.id !== this.id) {\n this[data.type](data);\n }\n } catch (error) {// Ignore error\n }\n }\n};\n\nWindowController.prototype.sendPing = function () {\n this.broadcast(\"ping\");\n};\n\nWindowController.prototype.hello = function (event) {\n this.ping(event);\n\n if (event.id < this.id) {\n this.check();\n } else {\n this.sendPing();\n }\n};\n\nWindowController.prototype.ping = function (event) {\n this.others[event.id] = +new Date();\n};\n\nWindowController.prototype.bye = function (event) {\n delete this.others[event.id];\n this.check();\n};\n\nWindowController.prototype.check = function (_event) {\n var now = +new Date(),\n takeMaster = true,\n id;\n\n for (id in this.others) {\n if (this.others[id] + 23000 < now) {\n delete this.others[id];\n } else if (id < this.id) {\n takeMaster = false;\n }\n }\n\n if (this.isMaster !== takeMaster) {\n this.isMaster = takeMaster;\n this.masterDidChange();\n }\n};\n\nWindowController.prototype.masterDidChange = function () {};\n\nWindowController.prototype.broadcast = function (type, data) {\n var event = {\n id: this.id,\n type: type\n };\n\n for (var x in data) {\n event[x] = data[x];\n }\n\n try {\n localStorage.setItem(\"broadcast\", JSON.stringify(event));\n } catch (error) {\n // eslint-disable-next-line no-console\n console.log(error);\n }\n};\n\nfunction colorHash(str) {\n var hash = 0;\n\n for (var i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n }\n\n var colour = \"#\";\n\n for (var _i = 0; _i < 3; _i++) {\n var value = hash >> _i * 8 & 0xff;\n colour += (\"00\" + value.toString(16)).substr(-2);\n }\n\n return colour;\n}\n\nfunction htmlEntities(string) {\n return (0, _jquery.default)(\"\").text(string).html();\n}\n\nfunction cumulativeSum(arr) {\n var result = arr.concat();\n\n for (var i = 0; i < arr.length; i++) {\n result[i] = arr.slice(0, i + 1).reduce(function (p, i) {\n return p + i;\n });\n }\n\n return result;\n}\n\nvar storage = window.localStorage;\nvar counter_key = \"unread_notifications\";\n\nfunction init_notification_counter() {\n var count = storage.getItem(counter_key);\n\n if (count === null) {\n storage.setItem(counter_key, 0);\n } else {\n if (count > 0) {\n (0, _jquery.default)(\".badge-notification\").text(count);\n }\n }\n}\n\nfunction set_notification_counter(count) {\n storage.setItem(counter_key, count);\n}\n\nfunction inc_notification_counter() {\n var count = storage.getItem(counter_key) || 0;\n storage.setItem(counter_key, ++count);\n (0, _jquery.default)(\".badge-notification\").text(count);\n}\n\nfunction dec_notification_counter() {\n var count = storage.getItem(counter_key) || 0;\n\n if (count > 0) {\n storage.setItem(counter_key, --count);\n (0, _jquery.default)(\".badge-notification\").text(count);\n } // Always clear if count is 0\n\n\n if (count == 0) {\n clear_notification_counter();\n }\n}\n\nfunction clear_notification_counter() {\n storage.setItem(counter_key, 0);\n (0, _jquery.default)(\".badge-notification\").empty();\n}\n\nfunction copyToClipboard(event, selector) {\n // Select element\n (0, _jquery.default)(selector).select(); // Copy to clipboard\n\n document.execCommand(\"copy\"); // Show tooltip to user\n\n (0, _jquery.default)(event.target).tooltip({\n title: \"Copied!\",\n trigger: \"manual\"\n });\n (0, _jquery.default)(event.target).tooltip(\"show\");\n setTimeout(function () {\n (0, _jquery.default)(event.target).tooltip(\"hide\");\n }, 1500);\n}\n\nfunction makeSortableTables() {\n (0, _jquery.default)(\"th.sort-col\").append(\" \");\n (0, _jquery.default)(\"th.sort-col\").click(function () {\n var table = (0, _jquery.default)(this).parents(\"table\").eq(0);\n var rows = table.find(\"tr:gt(0)\").toArray().sort(comparer((0, _jquery.default)(this).index()));\n this.asc = !this.asc;\n\n if (!this.asc) {\n rows = rows.reverse();\n }\n\n for (var i = 0; i < rows.length; i++) {\n table.append(rows[i]);\n }\n });\n\n function comparer(index) {\n return function (a, b) {\n var valA = getCellValue(a, index),\n valB = getCellValue(b, index);\n return _jquery.default.isNumeric(valA) && _jquery.default.isNumeric(valB) ? valA - valB : valA.toString().localeCompare(valB);\n };\n }\n\n function getCellValue(row, index) {\n return (0, _jquery.default)(row).children(\"td\").eq(index).text();\n }\n}\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/utils.js?");
/***/ }),
diff --git a/CTFd/themes/core/static/js/pages/challenges.dev.js b/CTFd/themes/core/static/js/pages/challenges.dev.js
index 57305a8d..7425b295 100644
--- a/CTFd/themes/core/static/js/pages/challenges.dev.js
+++ b/CTFd/themes/core/static/js/pages/challenges.dev.js
@@ -162,7 +162,7 @@
/***/ (function(module, exports, __webpack_require__) {
;
-eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/core/assets/js/pages/main.js\");\n\n__webpack_require__(/*! bootstrap/js/dist/tab */ \"./node_modules/bootstrap/js/dist/tab.js\");\n\nvar _ezq = __webpack_require__(/*! ../ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nvar _moment = _interopRequireDefault(__webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\"));\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! ../CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _config = _interopRequireDefault(__webpack_require__(/*! ../config */ \"./CTFd/themes/core/assets/js/config.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar api_func = {\n teams: function teams(x) {\n return _CTFd.default.api.get_team_solves({\n teamId: x\n });\n },\n users: function users(x) {\n return _CTFd.default.api.get_user_solves({\n userId: x\n });\n }\n};\n\nvar md = _CTFd.default.lib.markdown();\n\n_CTFd.default._internal.challenge = {};\nvar challenges = [];\nvar solves = [];\n\nvar loadChal = function loadChal(id) {\n var chal = _jquery.default.grep(challenges, function (chal) {\n return chal.id == id;\n })[0];\n\n if (chal.type === \"hidden\") {\n (0, _ezq.ezAlert)({\n title: \"Challenge Hidden!\",\n body: \"You haven't unlocked this challenge yet!\",\n button: \"Got it!\"\n });\n return;\n }\n\n displayChal(chal);\n};\n\nvar loadChalByName = function loadChalByName(name) {\n var chal = _jquery.default.grep(challenges, function (chal) {\n return chal.name == name;\n })[0];\n\n displayChal(chal);\n};\n\nvar displayChal = function displayChal(chal) {\n return Promise.all([_CTFd.default.api.get_challenge({\n challengeId: chal.id\n }), _jquery.default.getScript(_config.default.urlRoot + chal.script), _jquery.default.get(_config.default.urlRoot + chal.template)]).then(function (responses) {\n var challenge = _CTFd.default._internal.challenge;\n (0, _jquery.default)(\"#challenge-window\").empty();\n (0, _jquery.default)(\"#challenge-window\").append(responses[0].data.view);\n (0, _jquery.default)(\"#challenge-window #challenge-input\").addClass(\"form-control\");\n (0, _jquery.default)(\"#challenge-window #challenge-submit\").addClass(\"btn btn-md btn-outline-secondary float-right\");\n var modal = (0, _jquery.default)(\"#challenge-window\").find(\".modal-dialog\");\n\n if (window.init.theme_settings && window.init.theme_settings.challenge_window_size) {\n switch (window.init.theme_settings.challenge_window_size) {\n case \"sm\":\n modal.addClass(\"modal-sm\");\n break;\n\n case \"lg\":\n modal.addClass(\"modal-lg\");\n break;\n\n case \"xl\":\n modal.addClass(\"modal-xl\");\n break;\n\n default:\n break;\n }\n }\n\n (0, _jquery.default)(\".challenge-solves\").click(function (event) {\n getSolves((0, _jquery.default)(\"#challenge-id\").val());\n });\n (0, _jquery.default)(\".nav-tabs a\").click(function (event) {\n event.preventDefault();\n (0, _jquery.default)(this).tab(\"show\");\n }); // Handle modal toggling\n\n (0, _jquery.default)(\"#challenge-window\").on(\"hide.bs.modal\", function (event) {\n (0, _jquery.default)(\"#challenge-input\").removeClass(\"wrong\");\n (0, _jquery.default)(\"#challenge-input\").removeClass(\"correct\");\n (0, _jquery.default)(\"#incorrect-key\").slideUp();\n (0, _jquery.default)(\"#correct-key\").slideUp();\n (0, _jquery.default)(\"#already-solved\").slideUp();\n (0, _jquery.default)(\"#too-fast\").slideUp();\n });\n (0, _jquery.default)(\".load-hint\").on(\"click\", function (event) {\n loadHint((0, _jquery.default)(this).data(\"hint-id\"));\n });\n (0, _jquery.default)(\"#challenge-submit\").click(function (event) {\n event.preventDefault();\n (0, _jquery.default)(\"#challenge-submit\").addClass(\"disabled-button\");\n (0, _jquery.default)(\"#challenge-submit\").prop(\"disabled\", true);\n\n _CTFd.default._internal.challenge.submit().then(renderSubmissionResponse).then(loadChals).then(markSolves);\n });\n (0, _jquery.default)(\"#challenge-input\").keyup(function (event) {\n if (event.keyCode == 13) {\n (0, _jquery.default)(\"#challenge-submit\").click();\n }\n });\n challenge.postRender();\n window.location.replace(window.location.href.split(\"#\")[0] + \"#\" + chal.name);\n (0, _jquery.default)(\"#challenge-window\").modal();\n });\n};\n\nfunction renderSubmissionResponse(response) {\n var result = response.data;\n var result_message = (0, _jquery.default)(\"#result-message\");\n var result_notification = (0, _jquery.default)(\"#result-notification\");\n var answer_input = (0, _jquery.default)(\"#challenge-input\");\n result_notification.removeClass();\n result_message.text(result.message);\n\n if (result.status === \"authentication_required\") {\n window.location = _CTFd.default.config.urlRoot + \"/login?next=\" + _CTFd.default.config.urlRoot + window.location.pathname + window.location.hash;\n return;\n } else if (result.status === \"incorrect\") {\n // Incorrect key\n result_notification.addClass(\"alert alert-danger alert-dismissable text-center\");\n result_notification.slideDown();\n answer_input.removeClass(\"correct\");\n answer_input.addClass(\"wrong\");\n setTimeout(function () {\n answer_input.removeClass(\"wrong\");\n }, 3000);\n } else if (result.status === \"correct\") {\n // Challenge Solved\n result_notification.addClass(\"alert alert-success alert-dismissable text-center\");\n result_notification.slideDown();\n (0, _jquery.default)(\".challenge-solves\").text(parseInt((0, _jquery.default)(\".challenge-solves\").text().split(\" \")[0]) + 1 + \" Solves\");\n answer_input.val(\"\");\n answer_input.removeClass(\"wrong\");\n answer_input.addClass(\"correct\");\n } else if (result.status === \"already_solved\") {\n // Challenge already solved\n result_notification.addClass(\"alert alert-info alert-dismissable text-center\");\n result_notification.slideDown();\n answer_input.addClass(\"correct\");\n } else if (result.status === \"paused\") {\n // CTF is paused\n result_notification.addClass(\"alert alert-warning alert-dismissable text-center\");\n result_notification.slideDown();\n } else if (result.status === \"ratelimited\") {\n // Keys per minute too high\n result_notification.addClass(\"alert alert-warning alert-dismissable text-center\");\n result_notification.slideDown();\n answer_input.addClass(\"too-fast\");\n setTimeout(function () {\n answer_input.removeClass(\"too-fast\");\n }, 3000);\n }\n\n setTimeout(function () {\n (0, _jquery.default)(\".alert\").slideUp();\n (0, _jquery.default)(\"#challenge-submit\").removeClass(\"disabled-button\");\n (0, _jquery.default)(\"#challenge-submit\").prop(\"disabled\", false);\n }, 3000);\n}\n\nfunction markSolves() {\n return api_func[_CTFd.default.config.userMode](\"me\").then(function (response) {\n var solves = response.data;\n\n for (var i = solves.length - 1; i >= 0; i--) {\n var btn = (0, _jquery.default)('button[value=\"' + solves[i].challenge_id + '\"]');\n btn.addClass(\"solved-challenge\");\n btn.prepend(\"\");\n }\n });\n}\n\nfunction loadUserSolves() {\n if (_CTFd.default.user.id == 0) {\n return Promise.resolve();\n }\n\n return api_func[_CTFd.default.config.userMode](\"me\").then(function (response) {\n var solves = response.data;\n\n for (var i = solves.length - 1; i >= 0; i--) {\n var chal_id = solves[i].challenge_id;\n solves.push(chal_id);\n }\n });\n}\n\nfunction getSolves(id) {\n return _CTFd.default.api.get_challenge_solves({\n challengeId: id\n }).then(function (response) {\n var data = response.data;\n (0, _jquery.default)(\".challenge-solves\").text(parseInt(data.length) + \" Solves\");\n var box = (0, _jquery.default)(\"#challenge-solves-names\");\n box.empty();\n\n for (var i = 0; i < data.length; i++) {\n var _id = data[i].account_id;\n var name = data[i].name;\n var date = (0, _moment.default)(data[i].date).local().fromNow();\n var account_url = data[i].account_url;\n box.append('| {2} | {3} |
'.format(account_url, _id, (0, _utils.htmlEntities)(name), date));\n }\n });\n}\n\nfunction loadChals() {\n return _CTFd.default.api.get_challenge_list().then(function (response) {\n var categories = [];\n var $challenges_board = (0, _jquery.default)(\"#challenges-board\");\n challenges = response.data;\n $challenges_board.empty();\n\n for (var i = challenges.length - 1; i >= 0; i--) {\n challenges[i].solves = 0;\n\n if (_jquery.default.inArray(challenges[i].category, categories) == -1) {\n var category = challenges[i].category;\n categories.push(category);\n var categoryid = category.replace(/ /g, \"-\").hashCode();\n var categoryrow = (0, _jquery.default)(\"\" + ''.format(categoryid) + '\" + '
\" + \"
\");\n categoryrow.find(\".category-header\").append((0, _jquery.default)(\"\" + category + \"
\"));\n $challenges_board.append(categoryrow);\n }\n }\n\n for (var _i = 0; _i <= challenges.length - 1; _i++) {\n var chalinfo = challenges[_i];\n var chalid = chalinfo.name.replace(/ /g, \"-\").hashCode();\n var catid = chalinfo.category.replace(/ /g, \"-\").hashCode();\n var chalwrap = (0, _jquery.default)(\"\".format(chalid));\n var chalbutton = void 0;\n\n if (solves.indexOf(chalinfo.id) == -1) {\n chalbutton = (0, _jquery.default)(\"\".format(chalinfo.id));\n } else {\n chalbutton = (0, _jquery.default)(\"\".format(chalinfo.id));\n }\n\n var chalheader = (0, _jquery.default)(\"{0}
\".format(chalinfo.name));\n var chalscore = (0, _jquery.default)(\"{0}\".format(chalinfo.value));\n\n for (var j = 0; j < chalinfo.tags.length; j++) {\n var tag = \"tag-\" + chalinfo.tags[j].value.replace(/ /g, \"-\");\n chalwrap.addClass(tag);\n }\n\n chalbutton.append(chalheader);\n chalbutton.append(chalscore);\n chalwrap.append(chalbutton);\n (0, _jquery.default)(\"#\" + catid + \"-row\").find(\".category-challenges > .challenges-row\").append(chalwrap);\n }\n\n (0, _jquery.default)(\".challenge-button\").click(function (event) {\n loadChal(this.value);\n getSolves(this.value);\n });\n });\n}\n\nfunction update() {\n return loadUserSolves() // Load the user's solved challenge ids\n .then(loadChals) // Load the full list of challenges\n .then(markSolves);\n}\n\n(0, _jquery.default)(function () {\n update().then(function () {\n if (window.location.hash.length > 0) {\n loadChalByName(decodeURIComponent(window.location.hash.substring(1)));\n }\n });\n (0, _jquery.default)(\"#challenge-input\").keyup(function (event) {\n if (event.keyCode == 13) {\n (0, _jquery.default)(\"#challenge-submit\").click();\n }\n });\n (0, _jquery.default)(\".nav-tabs a\").click(function (event) {\n event.preventDefault();\n (0, _jquery.default)(this).tab(\"show\");\n });\n (0, _jquery.default)(\"#challenge-window\").on(\"hidden.bs.modal\", function (event) {\n (0, _jquery.default)(\".nav-tabs a:first\").tab(\"show\");\n history.replaceState(\"\", window.document.title, window.location.pathname);\n });\n (0, _jquery.default)(\".challenge-solves\").click(function (event) {\n getSolves((0, _jquery.default)(\"#challenge-id\").val());\n });\n (0, _jquery.default)(\"#challenge-window\").on(\"hide.bs.modal\", function (event) {\n (0, _jquery.default)(\"#challenge-input\").removeClass(\"wrong\");\n (0, _jquery.default)(\"#challenge-input\").removeClass(\"correct\");\n (0, _jquery.default)(\"#incorrect-key\").slideUp();\n (0, _jquery.default)(\"#correct-key\").slideUp();\n (0, _jquery.default)(\"#already-solved\").slideUp();\n (0, _jquery.default)(\"#too-fast\").slideUp();\n });\n});\nsetInterval(update, 300000); // Update every 5 minutes.\n\nvar displayHint = function displayHint(data) {\n (0, _ezq.ezAlert)({\n title: \"Hint\",\n body: md.render(data.content),\n button: \"Got it!\"\n });\n};\n\nvar displayUnlock = function displayUnlock(id) {\n (0, _ezq.ezQuery)({\n title: \"Unlock Hint?\",\n body: \"Are you sure you want to open this hint?\",\n success: function success() {\n var params = {\n target: id,\n type: \"hints\"\n };\n\n _CTFd.default.api.post_unlock_list({}, params).then(function (response) {\n if (response.success) {\n _CTFd.default.api.get_hint({\n hintId: id\n }).then(function (response) {\n displayHint(response.data);\n });\n\n return;\n }\n\n (0, _ezq.ezAlert)({\n title: \"Error\",\n body: md.render(response.errors.score),\n button: \"Got it!\"\n });\n });\n }\n });\n};\n\nvar loadHint = function loadHint(id) {\n _CTFd.default.api.get_hint({\n hintId: id\n }).then(function (response) {\n if (response.data.content) {\n displayHint(response.data);\n return;\n }\n\n displayUnlock(id);\n });\n};\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/challenges.js?");
+eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/core/assets/js/pages/main.js\");\n\n__webpack_require__(/*! bootstrap/js/dist/tab */ \"./node_modules/bootstrap/js/dist/tab.js\");\n\nvar _ezq = __webpack_require__(/*! ../ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nvar _moment = _interopRequireDefault(__webpack_require__(/*! moment */ \"./node_modules/moment/moment.js\"));\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! ../CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _config = _interopRequireDefault(__webpack_require__(/*! ../config */ \"./CTFd/themes/core/assets/js/config.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar api_func = {\n teams: function teams(x) {\n return _CTFd.default.api.get_team_solves({\n teamId: x\n });\n },\n users: function users(x) {\n return _CTFd.default.api.get_user_solves({\n userId: x\n });\n }\n};\n\nvar md = _CTFd.default.lib.markdown();\n\n_CTFd.default._internal.challenge = {};\nvar challenges = [];\nvar solves = [];\n\nvar loadChal = function loadChal(id) {\n var chal = _jquery.default.grep(challenges, function (chal) {\n return chal.id == id;\n })[0];\n\n if (chal.type === \"hidden\") {\n (0, _ezq.ezAlert)({\n title: \"Challenge Hidden!\",\n body: \"You haven't unlocked this challenge yet!\",\n button: \"Got it!\"\n });\n return;\n }\n\n displayChal(chal);\n};\n\nvar loadChalByName = function loadChalByName(name) {\n var chal = _jquery.default.grep(challenges, function (chal) {\n return chal.name == name;\n })[0];\n\n displayChal(chal);\n};\n\nvar displayChal = function displayChal(chal) {\n return Promise.all([_CTFd.default.api.get_challenge({\n challengeId: chal.id\n }), _jquery.default.getScript(_config.default.urlRoot + chal.script), _jquery.default.get(_config.default.urlRoot + chal.template)]).then(function (responses) {\n var challenge = _CTFd.default._internal.challenge;\n (0, _jquery.default)(\"#challenge-window\").empty();\n (0, _jquery.default)(\"#challenge-window\").append(responses[0].data.view);\n (0, _jquery.default)(\"#challenge-window #challenge-input\").addClass(\"form-control\");\n (0, _jquery.default)(\"#challenge-window #challenge-submit\").addClass(\"btn btn-md btn-outline-secondary float-right\");\n var modal = (0, _jquery.default)(\"#challenge-window\").find(\".modal-dialog\");\n\n if (window.init.theme_settings && window.init.theme_settings.challenge_window_size) {\n switch (window.init.theme_settings.challenge_window_size) {\n case \"sm\":\n modal.addClass(\"modal-sm\");\n break;\n\n case \"lg\":\n modal.addClass(\"modal-lg\");\n break;\n\n case \"xl\":\n modal.addClass(\"modal-xl\");\n break;\n\n default:\n break;\n }\n }\n\n (0, _jquery.default)(\".challenge-solves\").click(function (_event) {\n getSolves((0, _jquery.default)(\"#challenge-id\").val());\n });\n (0, _jquery.default)(\".nav-tabs a\").click(function (event) {\n event.preventDefault();\n (0, _jquery.default)(this).tab(\"show\");\n }); // Handle modal toggling\n\n (0, _jquery.default)(\"#challenge-window\").on(\"hide.bs.modal\", function (_event) {\n (0, _jquery.default)(\"#challenge-input\").removeClass(\"wrong\");\n (0, _jquery.default)(\"#challenge-input\").removeClass(\"correct\");\n (0, _jquery.default)(\"#incorrect-key\").slideUp();\n (0, _jquery.default)(\"#correct-key\").slideUp();\n (0, _jquery.default)(\"#already-solved\").slideUp();\n (0, _jquery.default)(\"#too-fast\").slideUp();\n });\n (0, _jquery.default)(\".load-hint\").on(\"click\", function (_event) {\n loadHint((0, _jquery.default)(this).data(\"hint-id\"));\n });\n (0, _jquery.default)(\"#challenge-submit\").click(function (event) {\n event.preventDefault();\n (0, _jquery.default)(\"#challenge-submit\").addClass(\"disabled-button\");\n (0, _jquery.default)(\"#challenge-submit\").prop(\"disabled\", true);\n\n _CTFd.default._internal.challenge.submit().then(renderSubmissionResponse).then(loadChals).then(markSolves);\n });\n (0, _jquery.default)(\"#challenge-input\").keyup(function (event) {\n if (event.keyCode == 13) {\n (0, _jquery.default)(\"#challenge-submit\").click();\n }\n });\n challenge.postRender();\n window.location.replace(window.location.href.split(\"#\")[0] + \"#\" + chal.name);\n (0, _jquery.default)(\"#challenge-window\").modal();\n });\n};\n\nfunction renderSubmissionResponse(response) {\n var result = response.data;\n var result_message = (0, _jquery.default)(\"#result-message\");\n var result_notification = (0, _jquery.default)(\"#result-notification\");\n var answer_input = (0, _jquery.default)(\"#challenge-input\");\n result_notification.removeClass();\n result_message.text(result.message);\n\n if (result.status === \"authentication_required\") {\n window.location = _CTFd.default.config.urlRoot + \"/login?next=\" + _CTFd.default.config.urlRoot + window.location.pathname + window.location.hash;\n return;\n } else if (result.status === \"incorrect\") {\n // Incorrect key\n result_notification.addClass(\"alert alert-danger alert-dismissable text-center\");\n result_notification.slideDown();\n answer_input.removeClass(\"correct\");\n answer_input.addClass(\"wrong\");\n setTimeout(function () {\n answer_input.removeClass(\"wrong\");\n }, 3000);\n } else if (result.status === \"correct\") {\n // Challenge Solved\n result_notification.addClass(\"alert alert-success alert-dismissable text-center\");\n result_notification.slideDown();\n (0, _jquery.default)(\".challenge-solves\").text(parseInt((0, _jquery.default)(\".challenge-solves\").text().split(\" \")[0]) + 1 + \" Solves\");\n answer_input.val(\"\");\n answer_input.removeClass(\"wrong\");\n answer_input.addClass(\"correct\");\n } else if (result.status === \"already_solved\") {\n // Challenge already solved\n result_notification.addClass(\"alert alert-info alert-dismissable text-center\");\n result_notification.slideDown();\n answer_input.addClass(\"correct\");\n } else if (result.status === \"paused\") {\n // CTF is paused\n result_notification.addClass(\"alert alert-warning alert-dismissable text-center\");\n result_notification.slideDown();\n } else if (result.status === \"ratelimited\") {\n // Keys per minute too high\n result_notification.addClass(\"alert alert-warning alert-dismissable text-center\");\n result_notification.slideDown();\n answer_input.addClass(\"too-fast\");\n setTimeout(function () {\n answer_input.removeClass(\"too-fast\");\n }, 3000);\n }\n\n setTimeout(function () {\n (0, _jquery.default)(\".alert\").slideUp();\n (0, _jquery.default)(\"#challenge-submit\").removeClass(\"disabled-button\");\n (0, _jquery.default)(\"#challenge-submit\").prop(\"disabled\", false);\n }, 3000);\n}\n\nfunction markSolves() {\n return api_func[_CTFd.default.config.userMode](\"me\").then(function (response) {\n var solves = response.data;\n\n for (var i = solves.length - 1; i >= 0; i--) {\n var btn = (0, _jquery.default)('button[value=\"' + solves[i].challenge_id + '\"]');\n btn.addClass(\"solved-challenge\");\n btn.prepend(\"\");\n }\n });\n}\n\nfunction loadUserSolves() {\n if (_CTFd.default.user.id == 0) {\n return Promise.resolve();\n }\n\n return api_func[_CTFd.default.config.userMode](\"me\").then(function (response) {\n var solves = response.data;\n\n for (var i = solves.length - 1; i >= 0; i--) {\n var chal_id = solves[i].challenge_id;\n solves.push(chal_id);\n }\n });\n}\n\nfunction getSolves(id) {\n return _CTFd.default.api.get_challenge_solves({\n challengeId: id\n }).then(function (response) {\n var data = response.data;\n (0, _jquery.default)(\".challenge-solves\").text(parseInt(data.length) + \" Solves\");\n var box = (0, _jquery.default)(\"#challenge-solves-names\");\n box.empty();\n\n for (var i = 0; i < data.length; i++) {\n var _id = data[i].account_id;\n var name = data[i].name;\n var date = (0, _moment.default)(data[i].date).local().fromNow();\n var account_url = data[i].account_url;\n box.append('| {2} | {3} |
'.format(account_url, _id, (0, _utils.htmlEntities)(name), date));\n }\n });\n}\n\nfunction loadChals() {\n return _CTFd.default.api.get_challenge_list().then(function (response) {\n var categories = [];\n var $challenges_board = (0, _jquery.default)(\"#challenges-board\");\n challenges = response.data;\n $challenges_board.empty();\n\n for (var i = challenges.length - 1; i >= 0; i--) {\n challenges[i].solves = 0;\n\n if (_jquery.default.inArray(challenges[i].category, categories) == -1) {\n var category = challenges[i].category;\n categories.push(category);\n var categoryid = category.replace(/ /g, \"-\").hashCode();\n var categoryrow = (0, _jquery.default)(\"\" + ''.format(categoryid) + '\" + '
\" + \"
\");\n categoryrow.find(\".category-header\").append((0, _jquery.default)(\"\" + category + \"
\"));\n $challenges_board.append(categoryrow);\n }\n }\n\n for (var _i = 0; _i <= challenges.length - 1; _i++) {\n var chalinfo = challenges[_i];\n var chalid = chalinfo.name.replace(/ /g, \"-\").hashCode();\n var catid = chalinfo.category.replace(/ /g, \"-\").hashCode();\n var chalwrap = (0, _jquery.default)(\"\".format(chalid));\n var chalbutton = void 0;\n\n if (solves.indexOf(chalinfo.id) == -1) {\n chalbutton = (0, _jquery.default)(\"\".format(chalinfo.id));\n } else {\n chalbutton = (0, _jquery.default)(\"\".format(chalinfo.id));\n }\n\n var chalheader = (0, _jquery.default)(\"{0}
\".format(chalinfo.name));\n var chalscore = (0, _jquery.default)(\"{0}\".format(chalinfo.value));\n\n for (var j = 0; j < chalinfo.tags.length; j++) {\n var tag = \"tag-\" + chalinfo.tags[j].value.replace(/ /g, \"-\");\n chalwrap.addClass(tag);\n }\n\n chalbutton.append(chalheader);\n chalbutton.append(chalscore);\n chalwrap.append(chalbutton);\n (0, _jquery.default)(\"#\" + catid + \"-row\").find(\".category-challenges > .challenges-row\").append(chalwrap);\n }\n\n (0, _jquery.default)(\".challenge-button\").click(function (_event) {\n loadChal(this.value);\n getSolves(this.value);\n });\n });\n}\n\nfunction update() {\n return loadUserSolves() // Load the user's solved challenge ids\n .then(loadChals) // Load the full list of challenges\n .then(markSolves);\n}\n\n(0, _jquery.default)(function () {\n update().then(function () {\n if (window.location.hash.length > 0) {\n loadChalByName(decodeURIComponent(window.location.hash.substring(1)));\n }\n });\n (0, _jquery.default)(\"#challenge-input\").keyup(function (event) {\n if (event.keyCode == 13) {\n (0, _jquery.default)(\"#challenge-submit\").click();\n }\n });\n (0, _jquery.default)(\".nav-tabs a\").click(function (event) {\n event.preventDefault();\n (0, _jquery.default)(this).tab(\"show\");\n });\n (0, _jquery.default)(\"#challenge-window\").on(\"hidden.bs.modal\", function (_event) {\n (0, _jquery.default)(\".nav-tabs a:first\").tab(\"show\");\n history.replaceState(\"\", window.document.title, window.location.pathname);\n });\n (0, _jquery.default)(\".challenge-solves\").click(function (_event) {\n getSolves((0, _jquery.default)(\"#challenge-id\").val());\n });\n (0, _jquery.default)(\"#challenge-window\").on(\"hide.bs.modal\", function (_event) {\n (0, _jquery.default)(\"#challenge-input\").removeClass(\"wrong\");\n (0, _jquery.default)(\"#challenge-input\").removeClass(\"correct\");\n (0, _jquery.default)(\"#incorrect-key\").slideUp();\n (0, _jquery.default)(\"#correct-key\").slideUp();\n (0, _jquery.default)(\"#already-solved\").slideUp();\n (0, _jquery.default)(\"#too-fast\").slideUp();\n });\n});\nsetInterval(update, 300000); // Update every 5 minutes.\n\nvar displayHint = function displayHint(data) {\n (0, _ezq.ezAlert)({\n title: \"Hint\",\n body: md.render(data.content),\n button: \"Got it!\"\n });\n};\n\nvar displayUnlock = function displayUnlock(id) {\n (0, _ezq.ezQuery)({\n title: \"Unlock Hint?\",\n body: \"Are you sure you want to open this hint?\",\n success: function success() {\n var params = {\n target: id,\n type: \"hints\"\n };\n\n _CTFd.default.api.post_unlock_list({}, params).then(function (response) {\n if (response.success) {\n _CTFd.default.api.get_hint({\n hintId: id\n }).then(function (response) {\n displayHint(response.data);\n });\n\n return;\n }\n\n (0, _ezq.ezAlert)({\n title: \"Error\",\n body: md.render(response.errors.score),\n button: \"Got it!\"\n });\n });\n }\n });\n};\n\nvar loadHint = function loadHint(id) {\n _CTFd.default.api.get_hint({\n hintId: id\n }).then(function (response) {\n if (response.data.content) {\n displayHint(response.data);\n return;\n }\n\n displayUnlock(id);\n });\n};\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/challenges.js?");
/***/ })
diff --git a/CTFd/themes/core/static/js/pages/notifications.dev.js b/CTFd/themes/core/static/js/pages/notifications.dev.js
index e0b4b785..ed543747 100644
--- a/CTFd/themes/core/static/js/pages/notifications.dev.js
+++ b/CTFd/themes/core/static/js/pages/notifications.dev.js
@@ -162,7 +162,7 @@
/***/ (function(module, exports, __webpack_require__) {
;
-eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/core/assets/js/pages/main.js\");\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! ../CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(0, _jquery.default)(function () {\n (0, _utils.clear_notification_counter)();\n});\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/notifications.js?");
+eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/core/assets/js/pages/main.js\");\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(0, _jquery.default)(function () {\n (0, _utils.clear_notification_counter)();\n});\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/notifications.js?");
/***/ })
diff --git a/CTFd/themes/core/static/js/pages/notifications.min.js b/CTFd/themes/core/static/js/pages/notifications.min.js
index ec4a3233..f4685582 100644
--- a/CTFd/themes/core/static/js/pages/notifications.min.js
+++ b/CTFd/themes/core/static/js/pages/notifications.min.js
@@ -1 +1 @@
-!function(l){function e(e){for(var t,o,n=e[0],s=e[1],i=e[2],a=0,r=[];a {1}
',a='',s='\n Error:\n {0}\n \n
',d='\n Success!\n {0}\n \n
',c='',m='',u='';function p(e){var t=i.format(e.title),o=(0,r.default)(t);"string"==typeof e.body?o.find(".modal-body").append("".concat(e.body,"
")):o.find(".modal-body").append((0,r.default)(e.body));var n=(0,r.default)(c.format(e.button));return e.success&&(0,r.default)(n).click(function(){e.success()}),e.large&&o.find(".modal-dialog").addClass("modal-lg"),o.find(".modal-footer").append(n),(0,r.default)("main").append(o),o.modal("show"),(0,r.default)(o).on("hidden.bs.modal",function(){(0,r.default)(this).modal("dispose")}),o}function f(e){(0,r.default)("#ezq--notifications-toast-container").length||(0,r.default)("body").append((0,r.default)("").attr({id:"ezq--notifications-toast-container"}).css({position:"fixed",bottom:"0",right:"0","min-width":"20%"}));var t=l.format(e.title,e.body),o=(0,r.default)(t);if(e.onclose&&(0,r.default)(o).find("button[data-dismiss=toast]").click(function(){e.onclose()}),e.onclick){var n=(0,r.default)(o).find(".toast-body");n.addClass("cursor-pointer"),n.click(function(){e.onclick()})}var s=!1!==e.autohide,i=!1!==e.animation,a=e.delay||1e4;return(0,r.default)("#ezq--notifications-toast-container").prepend(o),o.toast({autohide:s,delay:a,animation:i}),o.toast("show"),o}function j(e){var t=i.format(e.title),o=(0,r.default)(t);"string"==typeof e.body?o.find(".modal-body").append("".concat(e.body,"
")):o.find(".modal-body").append((0,r.default)(e.body));var n=(0,r.default)(u),s=(0,r.default)(m);return o.find(".modal-footer").append(s),o.find(".modal-footer").append(n),(0,r.default)("main").append(o),(0,r.default)(o).on("hidden.bs.modal",function(){(0,r.default)(this).modal("dispose")}),(0,r.default)(n).click(function(){e.success()}),o.modal("show"),o}function _(e){if(e.target){var t=(0,r.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var o=a.format(e.width),n=i.format(e.title),s=(0,r.default)(n);return s.find(".modal-body").append((0,r.default)(o)),(0,r.default)("main").append(s),s.modal("show")}function h(e){var t={success:d,error:s}[e.type].format(e.body);return(0,r.default)(t)}var v={ezAlert:p,ezToast:f,ezQuery:j,ezProgressBar:_,ezBadge:h};t.default=v},"./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,s=(n=o("./CTFd/themes/core/assets/js/config.js"))&&n.__esModule?n:{default:n};var i=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=s.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"]=s.default.csrfNonce,i(e,t)}},"./CTFd/themes/core/assets/js/pages/main.js":function(e,t,o){var n=p(o("./CTFd/themes/core/assets/js/CTFd.js")),s=p(o("./node_modules/jquery/dist/jquery.js")),i=p(o("./node_modules/moment/moment.js")),a=p(o("./node_modules/nunjucks/browser/nunjucks.js")),r=o("./node_modules/howler/dist/howler.js"),l=p(o("./CTFd/themes/core/assets/js/events.js")),d=p(o("./CTFd/themes/core/assets/js/config.js")),c=p(o("./CTFd/themes/core/assets/js/styles.js")),m=p(o("./CTFd/themes/core/assets/js/times.js")),u=p(o("./CTFd/themes/core/assets/js/helpers.js"));function p(e){return e&&e.__esModule?e:{default:e}}n.default.init(window.init),window.CTFd=n.default,window.helpers=u.default,window.$=s.default,window.Moment=i.default,window.nunjucks=a.default,window.Howl=r.Howl,(0,s.default)(function(){(0,c.default)(),(0,m.default)(),(0,l.default)(d.default.urlRoot)})},"./CTFd/themes/core/assets/js/pages/notifications.js":function(e,t,o){o("./CTFd/themes/core/assets/js/pages/main.js");var n=i(o("./node_modules/jquery/dist/jquery.js")),s=(i(o("./CTFd/themes/core/assets/js/CTFd.js")),o("./CTFd/themes/core/assets/js/utils.js"));function i(e){return e&&e.__esModule?e:{default:e}}(0,n.default)(function(){(0,s.clear_notification_counter)()})},"./CTFd/themes/core/assets/js/patch.js":function(e,t,o){var n,r=(n=o("./node_modules/q/q.js"))&&n.__esModule?n:{default:n},s=o("./CTFd/themes/core/assets/js/api.js");function i(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function l(e,t){return function(t){for(var e=1;e>8*s&255).toString(16)).substr(-2)}return n},t.htmlEntities=function(e){return(0,a.default)("").text(e).html()},t.cumulativeSum=function(e){for(var t=e.concat(),o=0;o'),(0,a.default)("th.sort-col").click(function(){var e=(0,a.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort(function(s){return function(e,t){var o=i(e,s),n=i(t,s);return a.default.isNumeric(o)&&a.default.isNumeric(n)?o-n:o.toString().localeCompare(n)}}((0,a.default)(this).index()));this.asc=!this.asc,this.asc||(t=t.reverse());for(var o=0;o {1}
',a='',s='\n Error:\n {0}\n \n
',d='\n Success!\n {0}\n \n
',c='',m='',u='';function p(e){var t=i.format(e.title),o=(0,r.default)(t);"string"==typeof e.body?o.find(".modal-body").append("".concat(e.body,"
")):o.find(".modal-body").append((0,r.default)(e.body));var n=(0,r.default)(c.format(e.button));return e.success&&(0,r.default)(n).click(function(){e.success()}),e.large&&o.find(".modal-dialog").addClass("modal-lg"),o.find(".modal-footer").append(n),(0,r.default)("main").append(o),o.modal("show"),(0,r.default)(o).on("hidden.bs.modal",function(){(0,r.default)(this).modal("dispose")}),o}function f(e){(0,r.default)("#ezq--notifications-toast-container").length||(0,r.default)("body").append((0,r.default)("").attr({id:"ezq--notifications-toast-container"}).css({position:"fixed",bottom:"0",right:"0","min-width":"20%"}));var t=l.format(e.title,e.body),o=(0,r.default)(t);if(e.onclose&&(0,r.default)(o).find("button[data-dismiss=toast]").click(function(){e.onclose()}),e.onclick){var n=(0,r.default)(o).find(".toast-body");n.addClass("cursor-pointer"),n.click(function(){e.onclick()})}var s=!1!==e.autohide,i=!1!==e.animation,a=e.delay||1e4;return(0,r.default)("#ezq--notifications-toast-container").prepend(o),o.toast({autohide:s,delay:a,animation:i}),o.toast("show"),o}function j(e){var t=i.format(e.title),o=(0,r.default)(t);"string"==typeof e.body?o.find(".modal-body").append("".concat(e.body,"
")):o.find(".modal-body").append((0,r.default)(e.body));var n=(0,r.default)(u),s=(0,r.default)(m);return o.find(".modal-footer").append(s),o.find(".modal-footer").append(n),(0,r.default)("main").append(o),(0,r.default)(o).on("hidden.bs.modal",function(){(0,r.default)(this).modal("dispose")}),(0,r.default)(n).click(function(){e.success()}),o.modal("show"),o}function _(e){if(e.target){var t=(0,r.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var o=a.format(e.width),n=i.format(e.title),s=(0,r.default)(n);return s.find(".modal-body").append((0,r.default)(o)),(0,r.default)("main").append(s),s.modal("show")}function h(e){var t={success:d,error:s}[e.type].format(e.body);return(0,r.default)(t)}var v={ezAlert:p,ezToast:f,ezQuery:j,ezProgressBar:_,ezBadge:h};t.default=v},"./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,s=(n=o("./CTFd/themes/core/assets/js/config.js"))&&n.__esModule?n:{default:n};var i=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=s.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"]=s.default.csrfNonce,i(e,t)}},"./CTFd/themes/core/assets/js/pages/main.js":function(e,t,o){var n=p(o("./CTFd/themes/core/assets/js/CTFd.js")),s=p(o("./node_modules/jquery/dist/jquery.js")),i=p(o("./node_modules/moment/moment.js")),a=p(o("./node_modules/nunjucks/browser/nunjucks.js")),r=o("./node_modules/howler/dist/howler.js"),l=p(o("./CTFd/themes/core/assets/js/events.js")),d=p(o("./CTFd/themes/core/assets/js/config.js")),c=p(o("./CTFd/themes/core/assets/js/styles.js")),m=p(o("./CTFd/themes/core/assets/js/times.js")),u=p(o("./CTFd/themes/core/assets/js/helpers.js"));function p(e){return e&&e.__esModule?e:{default:e}}n.default.init(window.init),window.CTFd=n.default,window.helpers=u.default,window.$=s.default,window.Moment=i.default,window.nunjucks=a.default,window.Howl=r.Howl,(0,s.default)(function(){(0,c.default)(),(0,m.default)(),(0,l.default)(d.default.urlRoot)})},"./CTFd/themes/core/assets/js/pages/notifications.js":function(e,t,o){o("./CTFd/themes/core/assets/js/pages/main.js");var n,s=(n=o("./node_modules/jquery/dist/jquery.js"))&&n.__esModule?n:{default:n},i=o("./CTFd/themes/core/assets/js/utils.js");(0,s.default)(function(){(0,i.clear_notification_counter)()})},"./CTFd/themes/core/assets/js/patch.js":function(e,t,o){var n,r=(n=o("./node_modules/q/q.js"))&&n.__esModule?n:{default:n},s=o("./CTFd/themes/core/assets/js/api.js");function i(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function l(e,t){return function(t){for(var e=1;e>8*s&255).toString(16)).substr(-2)}return n},t.htmlEntities=function(e){return(0,a.default)("").text(e).html()},t.cumulativeSum=function(e){for(var t=e.concat(),o=0;o'),(0,a.default)("th.sort-col").click(function(){var e=(0,a.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort(function(s){return function(e,t){var o=i(e,s),n=i(t,s);return a.default.isNumeric(o)&&a.default.isNumeric(n)?o-n:o.toString().localeCompare(n)}}((0,a.default)(this).index()));this.asc=!this.asc,this.asc||(t=t.reverse());for(var o=0;oError:\\n' + \" {0}\\n\" + ' \\n' + \"\";\nvar success_template = '\\n' + \" Success!\\n\" + \" Your profile has been updated\\n\" + ' \\n' + \"
\";\n\nfunction profileUpdate(event) {\n event.preventDefault();\n (0, _jquery.default)(\"#results\").empty();\n var $form = (0, _jquery.default)(this);\n var params = $form.serializeJSON(true);\n\n _CTFd.default.api.patch_user_private({}, params).then(function (response) {\n if (response.success) {\n (0, _jquery.default)(\"#results\").html(success_template);\n } else if (\"errors\" in response) {\n Object.keys(response.errors).map(function (error) {\n var i = $form.find(\"input[name={0}]\".format(error));\n var input = (0, _jquery.default)(i);\n input.addClass(\"input-filled-invalid\");\n input.removeClass(\"input-filled-valid\");\n var error_msg = response.errors[error];\n (0, _jquery.default)(\"#results\").append(error_template.format(error_msg));\n });\n }\n });\n}\n\nfunction tokenGenerate(event) {\n event.preventDefault();\n var $form = (0, _jquery.default)(this);\n var params = $form.serializeJSON(true);\n\n _CTFd.default.fetch(\"/api/v1/tokens\", {\n method: \"POST\",\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n var body = (0, _jquery.default)(\"\\n Please copy your API Key, it won't be shown again!
\\n \\n \"));\n body.find(\"button\").click(function (event) {\n (0, _utils.copyToClipboard)(event, \"#user-token-result\");\n });\n (0, _ezq.ezAlert)({\n title: \"API Key Generated\",\n body: body,\n button: \"Got it!\",\n large: true\n });\n }\n });\n}\n\nfunction deleteToken(event) {\n event.preventDefault();\n var $elem = (0, _jquery.default)(this);\n var id = $elem.data(\"token-id\");\n (0, _ezq.ezQuery)({\n title: \"Delete Token\",\n body: \"Are you sure you want to delete this token?\",\n success: function success() {\n _CTFd.default.fetch(\"/api/v1/tokens/\" + id, {\n method: \"DELETE\"\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n $elem.parent().parent().remove();\n }\n });\n }\n });\n}\n\n(0, _jquery.default)(function () {\n (0, _jquery.default)(\"#user-profile-form\").submit(profileUpdate);\n (0, _jquery.default)(\"#user-token-form\").submit(tokenGenerate);\n (0, _jquery.default)(\".delete-token\").click(deleteToken);\n (0, _jquery.default)(\".nav-pills a\").click(function (event) {\n window.location.hash = this.hash;\n }); // Load location hash\n\n var hash = window.location.hash;\n\n if (hash) {\n hash = hash.replace(\"<>[]'\\\"\", \"\");\n (0, _jquery.default)('.nav-pills a[href=\"' + hash + '\"]').tab(\"show\");\n }\n});\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/settings.js?");
+eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/core/assets/js/pages/main.js\");\n\nvar _utils = __webpack_require__(/*! ../utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! ../CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _ezq = __webpack_require__(/*! ../ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar error_template = '\\n' + ' Error:\\n' + \" {0}\\n\" + ' \\n' + \"
\";\nvar success_template = '\\n' + \" Success!\\n\" + \" Your profile has been updated\\n\" + ' \\n' + \"
\";\n\nfunction profileUpdate(event) {\n event.preventDefault();\n (0, _jquery.default)(\"#results\").empty();\n var $form = (0, _jquery.default)(this);\n var params = $form.serializeJSON(true);\n\n _CTFd.default.api.patch_user_private({}, params).then(function (response) {\n if (response.success) {\n (0, _jquery.default)(\"#results\").html(success_template);\n } else if (\"errors\" in response) {\n Object.keys(response.errors).map(function (error) {\n var i = $form.find(\"input[name={0}]\".format(error));\n var input = (0, _jquery.default)(i);\n input.addClass(\"input-filled-invalid\");\n input.removeClass(\"input-filled-valid\");\n var error_msg = response.errors[error];\n (0, _jquery.default)(\"#results\").append(error_template.format(error_msg));\n });\n }\n });\n}\n\nfunction tokenGenerate(event) {\n event.preventDefault();\n var $form = (0, _jquery.default)(this);\n var params = $form.serializeJSON(true);\n\n _CTFd.default.fetch(\"/api/v1/tokens\", {\n method: \"POST\",\n body: JSON.stringify(params)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n var body = (0, _jquery.default)(\"\\n Please copy your API Key, it won't be shown again!
\\n \\n \"));\n body.find(\"button\").click(function (event) {\n (0, _utils.copyToClipboard)(event, \"#user-token-result\");\n });\n (0, _ezq.ezAlert)({\n title: \"API Key Generated\",\n body: body,\n button: \"Got it!\",\n large: true\n });\n }\n });\n}\n\nfunction deleteToken(event) {\n event.preventDefault();\n var $elem = (0, _jquery.default)(this);\n var id = $elem.data(\"token-id\");\n (0, _ezq.ezQuery)({\n title: \"Delete Token\",\n body: \"Are you sure you want to delete this token?\",\n success: function success() {\n _CTFd.default.fetch(\"/api/v1/tokens/\" + id, {\n method: \"DELETE\"\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success) {\n $elem.parent().parent().remove();\n }\n });\n }\n });\n}\n\n(0, _jquery.default)(function () {\n (0, _jquery.default)(\"#user-profile-form\").submit(profileUpdate);\n (0, _jquery.default)(\"#user-token-form\").submit(tokenGenerate);\n (0, _jquery.default)(\".delete-token\").click(deleteToken);\n (0, _jquery.default)(\".nav-pills a\").click(function (_event) {\n window.location.hash = this.hash;\n }); // Load location hash\n\n var hash = window.location.hash;\n\n if (hash) {\n hash = hash.replace(\"<>[]'\\\"\", \"\");\n (0, _jquery.default)('.nav-pills a[href=\"' + hash + '\"]').tab(\"show\");\n }\n});\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/settings.js?");
/***/ })
diff --git a/CTFd/themes/core/static/js/pages/setup.dev.js b/CTFd/themes/core/static/js/pages/setup.dev.js
index 1343ddac..4bf5673a 100644
--- a/CTFd/themes/core/static/js/pages/setup.dev.js
+++ b/CTFd/themes/core/static/js/pages/setup.dev.js
@@ -162,7 +162,7 @@
/***/ (function(module, exports, __webpack_require__) {
;
-eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/core/assets/js/pages/main.js\");\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _momentTimezone = _interopRequireDefault(__webpack_require__(/*! moment-timezone */ \"./node_modules/moment-timezone/index.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! ../CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction switchTab(event) {\n event.preventDefault(); // Handle tab validation\n\n var valid_tab = true;\n (0, _jquery.default)(event.target).closest(\"[role=tabpanel]\").find(\"input,textarea\").each(function (i, e) {\n $e = (0, _jquery.default)(e);\n var status = e.checkValidity();\n\n if (status === false) {\n $e.removeClass(\"input-filled-valid\");\n $e.addClass(\"input-filled-invalid\");\n valid_tab = false;\n }\n });\n\n if (valid_tab == false) {\n return;\n }\n\n var href = (0, _jquery.default)(event.target).data(\"href\");\n (0, _jquery.default)(\".nav a[href=\\\"\".concat(href, \"\\\"]\")).tab(\"show\");\n}\n\nfunction processDateTime(datetime) {\n var date_picker = (0, _jquery.default)(\"#\".concat(datetime, \"-date\"));\n var time_picker = (0, _jquery.default)(\"#\".concat(datetime, \"-time\"));\n return function (event) {\n var unix_time = (0, _momentTimezone.default)(\"\".concat(date_picker.val(), \" \").concat(time_picker.val()), \"YYYY-MM-DD HH:mm\").utc().format(\"X\");\n (0, _jquery.default)(\"#\".concat(datetime, \"-preview\")).val(unix_time);\n };\n}\n\nfunction mlcSetup(event) {\n var params = {\n name: (0, _jquery.default)(\"#ctf_name\").val(),\n type: \"jeopardy\",\n description: (0, _jquery.default)(\"#ctf_description\").val(),\n user_mode: (0, _jquery.default)(\"#user_mode\").val(),\n event_url: window.location.origin + _CTFd.default.config.urlRoot,\n redirect_url: window.location.origin + _CTFd.default.config.urlRoot + \"/redirect\",\n integration_setup_url: window.location.origin + _CTFd.default.config.urlRoot + \"/setup/integrations\",\n start: (0, _jquery.default)(\"#start-preview\").val(),\n end: (0, _jquery.default)(\"#end-preview\").val(),\n platform: \"CTFd\",\n state: STATE\n };\n var ret = [];\n\n for (var p in params) {\n ret.push(encodeURIComponent(p) + \"=\" + encodeURIComponent(params[p]));\n }\n\n window.open(\"https://www.majorleaguecyber.org/events/new?\" + ret.join(\"&\"), \"_blank\");\n}\n\n(0, _jquery.default)(function () {\n (0, _jquery.default)(\".tab-next\").click(switchTab);\n (0, _jquery.default)(\"input\").on(\"keypress\", function (e) {\n // Hook Enter button\n if (e.keyCode == 13) {\n e.preventDefault();\n (0, _jquery.default)(e.target).closest(\".tab-pane\").find(\"button[data-href]\").click();\n }\n });\n (0, _jquery.default)(\"#integration-mlc\").click(mlcSetup);\n (0, _jquery.default)(\"#start-date,#start-time\").change(processDateTime(\"start\"));\n (0, _jquery.default)(\"#end-date,#end-time\").change(processDateTime(\"end\"));\n (0, _jquery.default)(\"#config-color-picker\").on(\"input\", function (e) {\n (0, _jquery.default)(\"#config-color-input\").val((0, _jquery.default)(this).val());\n });\n (0, _jquery.default)(\"#config-color-reset\").click(function () {\n (0, _jquery.default)(\"#config-color-input\").val(\"\");\n (0, _jquery.default)(\"#config-color-picker\").val(\"\");\n });\n window.addEventListener(\"storage\", function (event) {\n if (event.key == \"integrations\" && event.newValue) {\n var integration = JSON.parse(event.newValue);\n\n if (integration[\"name\"] == \"mlc\") {\n (0, _jquery.default)(\"#integration-mlc\").text(\"Already Configured\").attr(\"disabled\", true);\n window.focus();\n localStorage.removeItem(\"integrations\");\n }\n }\n });\n (0, _jquery.default)(\"#setup-form\").submit(function (e) {\n if ((0, _jquery.default)(\"#newsletter-checkbox\").prop(\"checked\")) {\n var email = (0, _jquery.default)(e.target).find(\"input[name=email]\").val();\n\n _jquery.default.ajax({\n type: \"POST\",\n url: \"https://ctfd.us15.list-manage.com/subscribe/post-json?u=6c7fa6feeced52775aec9d015&id=dd1484208e&c=?\",\n data: {\n EMAIL: email,\n subscribe: \"Subscribe\",\n b_6c7fa6feeced52775aec9d015_dd1484208e: \"\"\n },\n dataType: \"jsonp\",\n contentType: \"application/json; charset=utf-8\"\n });\n }\n });\n});\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/setup.js?");
+eval("\n\n__webpack_require__(/*! ./main */ \"./CTFd/themes/core/assets/js/pages/main.js\");\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _momentTimezone = _interopRequireDefault(__webpack_require__(/*! moment-timezone */ \"./node_modules/moment-timezone/index.js\"));\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! ../CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction switchTab(event) {\n event.preventDefault(); // Handle tab validation\n\n var valid_tab = true;\n (0, _jquery.default)(event.target).closest(\"[role=tabpanel]\").find(\"input,textarea\").each(function (i, e) {\n var $e = (0, _jquery.default)(e);\n var status = e.checkValidity();\n\n if (status === false) {\n $e.removeClass(\"input-filled-valid\");\n $e.addClass(\"input-filled-invalid\");\n valid_tab = false;\n }\n });\n\n if (valid_tab == false) {\n return;\n }\n\n var href = (0, _jquery.default)(event.target).data(\"href\");\n (0, _jquery.default)(\".nav a[href=\\\"\".concat(href, \"\\\"]\")).tab(\"show\");\n}\n\nfunction processDateTime(datetime) {\n var date_picker = (0, _jquery.default)(\"#\".concat(datetime, \"-date\"));\n var time_picker = (0, _jquery.default)(\"#\".concat(datetime, \"-time\"));\n return function (_event) {\n var unix_time = (0, _momentTimezone.default)(\"\".concat(date_picker.val(), \" \").concat(time_picker.val()), \"YYYY-MM-DD HH:mm\").utc().format(\"X\");\n (0, _jquery.default)(\"#\".concat(datetime, \"-preview\")).val(unix_time);\n };\n}\n\nfunction mlcSetup(_event) {\n var params = {\n name: (0, _jquery.default)(\"#ctf_name\").val(),\n type: \"jeopardy\",\n description: (0, _jquery.default)(\"#ctf_description\").val(),\n user_mode: (0, _jquery.default)(\"#user_mode\").val(),\n event_url: window.location.origin + _CTFd.default.config.urlRoot,\n redirect_url: window.location.origin + _CTFd.default.config.urlRoot + \"/redirect\",\n integration_setup_url: window.location.origin + _CTFd.default.config.urlRoot + \"/setup/integrations\",\n start: (0, _jquery.default)(\"#start-preview\").val(),\n end: (0, _jquery.default)(\"#end-preview\").val(),\n platform: \"CTFd\",\n state: window.STATE\n };\n var ret = [];\n\n for (var p in params) {\n ret.push(encodeURIComponent(p) + \"=\" + encodeURIComponent(params[p]));\n }\n\n window.open(\"https://www.majorleaguecyber.org/events/new?\" + ret.join(\"&\"), \"_blank\");\n}\n\n(0, _jquery.default)(function () {\n (0, _jquery.default)(\".tab-next\").click(switchTab);\n (0, _jquery.default)(\"input\").on(\"keypress\", function (e) {\n // Hook Enter button\n if (e.keyCode == 13) {\n e.preventDefault();\n (0, _jquery.default)(e.target).closest(\".tab-pane\").find(\"button[data-href]\").click();\n }\n });\n (0, _jquery.default)(\"#integration-mlc\").click(mlcSetup);\n (0, _jquery.default)(\"#start-date,#start-time\").change(processDateTime(\"start\"));\n (0, _jquery.default)(\"#end-date,#end-time\").change(processDateTime(\"end\"));\n (0, _jquery.default)(\"#config-color-picker\").on(\"input\", function (_e) {\n (0, _jquery.default)(\"#config-color-input\").val((0, _jquery.default)(this).val());\n });\n (0, _jquery.default)(\"#config-color-reset\").click(function () {\n (0, _jquery.default)(\"#config-color-input\").val(\"\");\n (0, _jquery.default)(\"#config-color-picker\").val(\"\");\n });\n window.addEventListener(\"storage\", function (event) {\n if (event.key == \"integrations\" && event.newValue) {\n var integration = JSON.parse(event.newValue);\n\n if (integration[\"name\"] == \"mlc\") {\n (0, _jquery.default)(\"#integration-mlc\").text(\"Already Configured\").attr(\"disabled\", true);\n window.focus();\n localStorage.removeItem(\"integrations\");\n }\n }\n });\n (0, _jquery.default)(\"#setup-form\").submit(function (e) {\n if ((0, _jquery.default)(\"#newsletter-checkbox\").prop(\"checked\")) {\n var email = (0, _jquery.default)(e.target).find(\"input[name=email]\").val();\n\n _jquery.default.ajax({\n type: \"POST\",\n url: \"https://ctfd.us15.list-manage.com/subscribe/post-json?u=6c7fa6feeced52775aec9d015&id=dd1484208e&c=?\",\n data: {\n EMAIL: email,\n subscribe: \"Subscribe\",\n b_6c7fa6feeced52775aec9d015_dd1484208e: \"\"\n },\n dataType: \"jsonp\",\n contentType: \"application/json; charset=utf-8\"\n });\n }\n });\n});\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/setup.js?");
/***/ })
diff --git a/CTFd/themes/core/static/js/pages/setup.min.js b/CTFd/themes/core/static/js/pages/setup.min.js
index 23baf276..e001b2b1 100644
--- a/CTFd/themes/core/static/js/pages/setup.min.js
+++ b/CTFd/themes/core/static/js/pages/setup.min.js
@@ -1 +1 @@
-!function(l){function e(e){for(var t,o,n=e[0],s=e[1],i=e[2],a=0,r=[];a {1}
',a='',s='\n Error:\n {0}\n \n
',d='\n Success!\n {0}\n \n
',c='',u='',m='';function p(e){var t=i.format(e.title),o=(0,r.default)(t);"string"==typeof e.body?o.find(".modal-body").append("".concat(e.body,"
")):o.find(".modal-body").append((0,r.default)(e.body));var n=(0,r.default)(c.format(e.button));return e.success&&(0,r.default)(n).click(function(){e.success()}),e.large&&o.find(".modal-dialog").addClass("modal-lg"),o.find(".modal-footer").append(n),(0,r.default)("main").append(o),o.modal("show"),(0,r.default)(o).on("hidden.bs.modal",function(){(0,r.default)(this).modal("dispose")}),o}function f(e){(0,r.default)("#ezq--notifications-toast-container").length||(0,r.default)("body").append((0,r.default)("").attr({id:"ezq--notifications-toast-container"}).css({position:"fixed",bottom:"0",right:"0","min-width":"20%"}));var t=l.format(e.title,e.body),o=(0,r.default)(t);if(e.onclose&&(0,r.default)(o).find("button[data-dismiss=toast]").click(function(){e.onclose()}),e.onclick){var n=(0,r.default)(o).find(".toast-body");n.addClass("cursor-pointer"),n.click(function(){e.onclick()})}var s=!1!==e.autohide,i=!1!==e.animation,a=e.delay||1e4;return(0,r.default)("#ezq--notifications-toast-container").prepend(o),o.toast({autohide:s,delay:a,animation:i}),o.toast("show"),o}function j(e){var t=i.format(e.title),o=(0,r.default)(t);"string"==typeof e.body?o.find(".modal-body").append("".concat(e.body,"
")):o.find(".modal-body").append((0,r.default)(e.body));var n=(0,r.default)(m),s=(0,r.default)(u);return o.find(".modal-footer").append(s),o.find(".modal-footer").append(n),(0,r.default)("main").append(o),(0,r.default)(o).on("hidden.bs.modal",function(){(0,r.default)(this).modal("dispose")}),(0,r.default)(n).click(function(){e.success()}),o.modal("show"),o}function _(e){if(e.target){var t=(0,r.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var o=a.format(e.width),n=i.format(e.title),s=(0,r.default)(n);return s.find(".modal-body").append((0,r.default)(o)),(0,r.default)("main").append(s),s.modal("show")}function h(e){var t={success:d,error:s}[e.type].format(e.body);return(0,r.default)(t)}var v={ezAlert:p,ezToast:f,ezQuery:j,ezProgressBar:_,ezBadge:h};t.default=v},"./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,s=(n=o("./CTFd/themes/core/assets/js/config.js"))&&n.__esModule?n:{default:n};var i=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=s.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"]=s.default.csrfNonce,i(e,t)}},"./CTFd/themes/core/assets/js/pages/main.js":function(e,t,o){var n=p(o("./CTFd/themes/core/assets/js/CTFd.js")),s=p(o("./node_modules/jquery/dist/jquery.js")),i=p(o("./node_modules/moment/moment.js")),a=p(o("./node_modules/nunjucks/browser/nunjucks.js")),r=o("./node_modules/howler/dist/howler.js"),l=p(o("./CTFd/themes/core/assets/js/events.js")),d=p(o("./CTFd/themes/core/assets/js/config.js")),c=p(o("./CTFd/themes/core/assets/js/styles.js")),u=p(o("./CTFd/themes/core/assets/js/times.js")),m=p(o("./CTFd/themes/core/assets/js/helpers.js"));function p(e){return e&&e.__esModule?e:{default:e}}n.default.init(window.init),window.CTFd=n.default,window.helpers=m.default,window.$=s.default,window.Moment=i.default,window.nunjucks=a.default,window.Howl=r.Howl,(0,s.default)(function(){(0,c.default)(),(0,u.default)(),(0,l.default)(d.default.urlRoot)})},"./CTFd/themes/core/assets/js/pages/setup.js":function(e,t,o){o("./CTFd/themes/core/assets/js/pages/main.js");var i=n(o("./node_modules/jquery/dist/jquery.js")),a=n(o("./node_modules/moment-timezone/index.js")),s=n(o("./CTFd/themes/core/assets/js/CTFd.js"));function n(e){return e&&e.__esModule?e:{default:e}}function r(e){e.preventDefault();var o=!0;if((0,i.default)(e.target).closest("[role=tabpanel]").find("input,textarea").each(function(e,t){$e=(0,i.default)(t),!1===t.checkValidity()&&($e.removeClass("input-filled-valid"),$e.addClass("input-filled-invalid"),o=!1)}),0!=o){var t=(0,i.default)(e.target).data("href");(0,i.default)('.nav a[href="'.concat(t,'"]')).tab("show")}}function l(o){var n=(0,i.default)("#".concat(o,"-date")),s=(0,i.default)("#".concat(o,"-time"));return function(e){var t=(0,a.default)("".concat(n.val()," ").concat(s.val()),"YYYY-MM-DD HH:mm").utc().format("X");(0,i.default)("#".concat(o,"-preview")).val(t)}}function d(e){var t={name:(0,i.default)("#ctf_name").val(),type:"jeopardy",description:(0,i.default)("#ctf_description").val(),user_mode:(0,i.default)("#user_mode").val(),event_url:window.location.origin+s.default.config.urlRoot,redirect_url:window.location.origin+s.default.config.urlRoot+"/redirect",integration_setup_url:window.location.origin+s.default.config.urlRoot+"/setup/integrations",start:(0,i.default)("#start-preview").val(),end:(0,i.default)("#end-preview").val(),platform:"CTFd",state:STATE},o=[];for(var n in t)o.push(encodeURIComponent(n)+"="+encodeURIComponent(t[n]));window.open("https://www.majorleaguecyber.org/events/new?"+o.join("&"),"_blank")}(0,i.default)(function(){(0,i.default)(".tab-next").click(r),(0,i.default)("input").on("keypress",function(e){13==e.keyCode&&(e.preventDefault(),(0,i.default)(e.target).closest(".tab-pane").find("button[data-href]").click())}),(0,i.default)("#integration-mlc").click(d),(0,i.default)("#start-date,#start-time").change(l("start")),(0,i.default)("#end-date,#end-time").change(l("end")),(0,i.default)("#config-color-picker").on("input",function(e){(0,i.default)("#config-color-input").val((0,i.default)(this).val())}),(0,i.default)("#config-color-reset").click(function(){(0,i.default)("#config-color-input").val(""),(0,i.default)("#config-color-picker").val("")}),window.addEventListener("storage",function(e){"integrations"==e.key&&e.newValue&&"mlc"==JSON.parse(e.newValue).name&&((0,i.default)("#integration-mlc").text("Already Configured").attr("disabled",!0),window.focus(),localStorage.removeItem("integrations"))}),(0,i.default)("#setup-form").submit(function(e){if((0,i.default)("#newsletter-checkbox").prop("checked")){var t=(0,i.default)(e.target).find("input[name=email]").val();i.default.ajax({type:"POST",url:"https://ctfd.us15.list-manage.com/subscribe/post-json?u=6c7fa6feeced52775aec9d015&id=dd1484208e&c=?",data:{EMAIL:t,subscribe:"Subscribe",b_6c7fa6feeced52775aec9d015_dd1484208e:""},dataType:"jsonp",contentType:"application/json; charset=utf-8"})}})})},"./CTFd/themes/core/assets/js/patch.js":function(e,t,o){var n,r=(n=o("./node_modules/q/q.js"))&&n.__esModule?n:{default:n},s=o("./CTFd/themes/core/assets/js/api.js");function i(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function l(e,t){return function(t){for(var e=1;e>8*s&255).toString(16)).substr(-2)}return n},t.htmlEntities=function(e){return(0,a.default)("").text(e).html()},t.cumulativeSum=function(e){for(var t=e.concat(),o=0;o'),(0,a.default)("th.sort-col").click(function(){var e=(0,a.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort(function(s){return function(e,t){var o=i(e,s),n=i(t,s);return a.default.isNumeric(o)&&a.default.isNumeric(n)?o-n:o.toString().localeCompare(n)}}((0,a.default)(this).index()));this.asc=!this.asc,this.asc||(t=t.reverse());for(var o=0;o {1}
',a='',s='\n Error:\n {0}\n \n
',d='\n Success!\n {0}\n \n
',c='',u='',m='';function p(e){var t=i.format(e.title),o=(0,r.default)(t);"string"==typeof e.body?o.find(".modal-body").append("".concat(e.body,"
")):o.find(".modal-body").append((0,r.default)(e.body));var n=(0,r.default)(c.format(e.button));return e.success&&(0,r.default)(n).click(function(){e.success()}),e.large&&o.find(".modal-dialog").addClass("modal-lg"),o.find(".modal-footer").append(n),(0,r.default)("main").append(o),o.modal("show"),(0,r.default)(o).on("hidden.bs.modal",function(){(0,r.default)(this).modal("dispose")}),o}function f(e){(0,r.default)("#ezq--notifications-toast-container").length||(0,r.default)("body").append((0,r.default)("").attr({id:"ezq--notifications-toast-container"}).css({position:"fixed",bottom:"0",right:"0","min-width":"20%"}));var t=l.format(e.title,e.body),o=(0,r.default)(t);if(e.onclose&&(0,r.default)(o).find("button[data-dismiss=toast]").click(function(){e.onclose()}),e.onclick){var n=(0,r.default)(o).find(".toast-body");n.addClass("cursor-pointer"),n.click(function(){e.onclick()})}var s=!1!==e.autohide,i=!1!==e.animation,a=e.delay||1e4;return(0,r.default)("#ezq--notifications-toast-container").prepend(o),o.toast({autohide:s,delay:a,animation:i}),o.toast("show"),o}function j(e){var t=i.format(e.title),o=(0,r.default)(t);"string"==typeof e.body?o.find(".modal-body").append("".concat(e.body,"
")):o.find(".modal-body").append((0,r.default)(e.body));var n=(0,r.default)(m),s=(0,r.default)(u);return o.find(".modal-footer").append(s),o.find(".modal-footer").append(n),(0,r.default)("main").append(o),(0,r.default)(o).on("hidden.bs.modal",function(){(0,r.default)(this).modal("dispose")}),(0,r.default)(n).click(function(){e.success()}),o.modal("show"),o}function _(e){if(e.target){var t=(0,r.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var o=a.format(e.width),n=i.format(e.title),s=(0,r.default)(n);return s.find(".modal-body").append((0,r.default)(o)),(0,r.default)("main").append(s),s.modal("show")}function h(e){var t={success:d,error:s}[e.type].format(e.body);return(0,r.default)(t)}var v={ezAlert:p,ezToast:f,ezQuery:j,ezProgressBar:_,ezBadge:h};t.default=v},"./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,s=(n=o("./CTFd/themes/core/assets/js/config.js"))&&n.__esModule?n:{default:n};var i=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=s.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"]=s.default.csrfNonce,i(e,t)}},"./CTFd/themes/core/assets/js/pages/main.js":function(e,t,o){var n=p(o("./CTFd/themes/core/assets/js/CTFd.js")),s=p(o("./node_modules/jquery/dist/jquery.js")),i=p(o("./node_modules/moment/moment.js")),a=p(o("./node_modules/nunjucks/browser/nunjucks.js")),r=o("./node_modules/howler/dist/howler.js"),l=p(o("./CTFd/themes/core/assets/js/events.js")),d=p(o("./CTFd/themes/core/assets/js/config.js")),c=p(o("./CTFd/themes/core/assets/js/styles.js")),u=p(o("./CTFd/themes/core/assets/js/times.js")),m=p(o("./CTFd/themes/core/assets/js/helpers.js"));function p(e){return e&&e.__esModule?e:{default:e}}n.default.init(window.init),window.CTFd=n.default,window.helpers=m.default,window.$=s.default,window.Moment=i.default,window.nunjucks=a.default,window.Howl=r.Howl,(0,s.default)(function(){(0,c.default)(),(0,u.default)(),(0,l.default)(d.default.urlRoot)})},"./CTFd/themes/core/assets/js/pages/setup.js":function(e,t,o){o("./CTFd/themes/core/assets/js/pages/main.js");var i=n(o("./node_modules/jquery/dist/jquery.js")),a=n(o("./node_modules/moment-timezone/index.js")),s=n(o("./CTFd/themes/core/assets/js/CTFd.js"));function n(e){return e&&e.__esModule?e:{default:e}}function r(e){e.preventDefault();var n=!0;if((0,i.default)(e.target).closest("[role=tabpanel]").find("input,textarea").each(function(e,t){var o=(0,i.default)(t);!1===t.checkValidity()&&(o.removeClass("input-filled-valid"),o.addClass("input-filled-invalid"),n=!1)}),0!=n){var t=(0,i.default)(e.target).data("href");(0,i.default)('.nav a[href="'.concat(t,'"]')).tab("show")}}function l(o){var n=(0,i.default)("#".concat(o,"-date")),s=(0,i.default)("#".concat(o,"-time"));return function(e){var t=(0,a.default)("".concat(n.val()," ").concat(s.val()),"YYYY-MM-DD HH:mm").utc().format("X");(0,i.default)("#".concat(o,"-preview")).val(t)}}function d(e){var t={name:(0,i.default)("#ctf_name").val(),type:"jeopardy",description:(0,i.default)("#ctf_description").val(),user_mode:(0,i.default)("#user_mode").val(),event_url:window.location.origin+s.default.config.urlRoot,redirect_url:window.location.origin+s.default.config.urlRoot+"/redirect",integration_setup_url:window.location.origin+s.default.config.urlRoot+"/setup/integrations",start:(0,i.default)("#start-preview").val(),end:(0,i.default)("#end-preview").val(),platform:"CTFd",state:window.STATE},o=[];for(var n in t)o.push(encodeURIComponent(n)+"="+encodeURIComponent(t[n]));window.open("https://www.majorleaguecyber.org/events/new?"+o.join("&"),"_blank")}(0,i.default)(function(){(0,i.default)(".tab-next").click(r),(0,i.default)("input").on("keypress",function(e){13==e.keyCode&&(e.preventDefault(),(0,i.default)(e.target).closest(".tab-pane").find("button[data-href]").click())}),(0,i.default)("#integration-mlc").click(d),(0,i.default)("#start-date,#start-time").change(l("start")),(0,i.default)("#end-date,#end-time").change(l("end")),(0,i.default)("#config-color-picker").on("input",function(e){(0,i.default)("#config-color-input").val((0,i.default)(this).val())}),(0,i.default)("#config-color-reset").click(function(){(0,i.default)("#config-color-input").val(""),(0,i.default)("#config-color-picker").val("")}),window.addEventListener("storage",function(e){"integrations"==e.key&&e.newValue&&"mlc"==JSON.parse(e.newValue).name&&((0,i.default)("#integration-mlc").text("Already Configured").attr("disabled",!0),window.focus(),localStorage.removeItem("integrations"))}),(0,i.default)("#setup-form").submit(function(e){if((0,i.default)("#newsletter-checkbox").prop("checked")){var t=(0,i.default)(e.target).find("input[name=email]").val();i.default.ajax({type:"POST",url:"https://ctfd.us15.list-manage.com/subscribe/post-json?u=6c7fa6feeced52775aec9d015&id=dd1484208e&c=?",data:{EMAIL:t,subscribe:"Subscribe",b_6c7fa6feeced52775aec9d015_dd1484208e:""},dataType:"jsonp",contentType:"application/json; charset=utf-8"})}})})},"./CTFd/themes/core/assets/js/patch.js":function(e,t,o){var n,r=(n=o("./node_modules/q/q.js"))&&n.__esModule?n:{default:n},s=o("./CTFd/themes/core/assets/js/api.js");function i(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function l(e,t){return function(t){for(var e=1;e>8*s&255).toString(16)).substr(-2)}return n},t.htmlEntities=function(e){return(0,a.default)("").text(e).html()},t.cumulativeSum=function(e){for(var t=e.concat(),o=0;o'),(0,a.default)("th.sort-col").click(function(){var e=(0,a.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort(function(s){return function(e,t){var o=i(e,s),n=i(t,s);return a.default.isNumeric(o)&&a.default.isNumeric(n)?o-n:o.toString().localeCompare(n)}}((0,a.default)(this).index()));this.asc=!this.asc,this.asc||(t=t.reverse());for(var o=0;o {1}
',i='',s='\n Error:\n {0}\n \n
',d='\n Success!\n {0}\n \n
',c='',u='',m='';function p(e){var t=a.format(e.title),o=(0,r.default)(t);"string"==typeof e.body?o.find(".modal-body").append("".concat(e.body,"
")):o.find(".modal-body").append((0,r.default)(e.body));var n=(0,r.default)(c.format(e.button));return e.success&&(0,r.default)(n).click(function(){e.success()}),e.large&&o.find(".modal-dialog").addClass("modal-lg"),o.find(".modal-footer").append(n),(0,r.default)("main").append(o),o.modal("show"),(0,r.default)(o).on("hidden.bs.modal",function(){(0,r.default)(this).modal("dispose")}),o}function f(e){(0,r.default)("#ezq--notifications-toast-container").length||(0,r.default)("body").append((0,r.default)("").attr({id:"ezq--notifications-toast-container"}).css({position:"fixed",bottom:"0",right:"0","min-width":"20%"}));var t=l.format(e.title,e.body),o=(0,r.default)(t);if(e.onclose&&(0,r.default)(o).find("button[data-dismiss=toast]").click(function(){e.onclose()}),e.onclick){var n=(0,r.default)(o).find(".toast-body");n.addClass("cursor-pointer"),n.click(function(){e.onclick()})}var s=!1!==e.autohide,a=!1!==e.animation,i=e.delay||1e4;return(0,r.default)("#ezq--notifications-toast-container").prepend(o),o.toast({autohide:s,delay:i,animation:a}),o.toast("show"),o}function j(e){var t=a.format(e.title),o=(0,r.default)(t);"string"==typeof e.body?o.find(".modal-body").append("".concat(e.body,"
")):o.find(".modal-body").append((0,r.default)(e.body));var n=(0,r.default)(m),s=(0,r.default)(u);return o.find(".modal-footer").append(s),o.find(".modal-footer").append(n),(0,r.default)("main").append(o),(0,r.default)(o).on("hidden.bs.modal",function(){(0,r.default)(this).modal("dispose")}),(0,r.default)(n).click(function(){e.success()}),o.modal("show"),o}function _(e){if(e.target){var t=(0,r.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var o=i.format(e.width),n=a.format(e.title),s=(0,r.default)(n);return s.find(".modal-body").append((0,r.default)(o)),(0,r.default)("main").append(s),s.modal("show")}function h(e){var t={success:d,error:s}[e.type].format(e.body);return(0,r.default)(t)}var g={ezAlert:p,ezToast:f,ezQuery:j,ezProgressBar:_,ezBadge:h};t.default=g},"./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,s=(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=s.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"]=s.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,s,a,i){var r=f[e],l=(0,c.default)(t);if(l.empty(),void 0===l[0])return void console.log("Couldn't find graph target: "+t);l[0].fn=r.fn(n,s,a,i);var d=r.format(n,s,a,i,o);u.default.newPlot(l[0],d,r.layout,j)},t.updateGraph=function(e,t,o,n,s,a,i){var r=f[e],l=(0,c.default)(t),d=r.format(n,s,a,i,o);u.default.update(l[0],d,r.layout,j)};var c=n(o("./node_modules/jquery/dist/jquery.js")),u=n(o("./node_modules/plotly.js-basic-dist/plotly-basic.js")),m=n(o("./node_modules/moment/moment.js")),p=o("./CTFd/themes/core/assets/js/utils.js");function n(e){return e&&e.__esModule?e:{default:e}}var f={score_graph:{layout:{title:"Score over Time",paper_bgcolor:"rgba(0,0,0,0)",plot_bgcolor:"rgba(0,0,0,0)",hovermode:"closest",xaxis:{showgrid:!1,showspikes:!0},yaxis:{showgrid:!1,showspikes:!0},legend:{orientation:"h"}},fn:function(e,t,o,n){return"CTFd_score_".concat(e,"_").concat(o,"_").concat(t,"_").concat((new Date).toISOString().slice(0,19))},format:function(e,t,o,n,s){var a=[],i=[],r=s[0].data,l=s[2].data,d=r.concat(l);d.sort(function(e,t){return new Date(e.date)-new Date(t.date)});for(var c=0;c>8*s&255).toString(16)).substr(-2)}return n},t.htmlEntities=function(e){return(0,i.default)("").text(e).html()},t.cumulativeSum=function(e){for(var t=e.concat(),o=0;o'),(0,i.default)("th.sort-col").click(function(){var e=(0,i.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort(function(s){return function(e,t){var o=a(e,s),n=a(t,s);return i.default.isNumeric(o)&&i.default.isNumeric(n)?o-n:o.toString().localeCompare(n)}}((0,i.default)(this).index()));this.asc=!this.asc,this.asc||(t=t.reverse());for(var o=0;o {1}
',i='',s='\n Error:\n {0}\n \n
',d='\n Success!\n {0}\n \n
',c='',u='',m='';function p(e){var t=a.format(e.title),o=(0,r.default)(t);"string"==typeof e.body?o.find(".modal-body").append("".concat(e.body,"
")):o.find(".modal-body").append((0,r.default)(e.body));var n=(0,r.default)(c.format(e.button));return e.success&&(0,r.default)(n).click(function(){e.success()}),e.large&&o.find(".modal-dialog").addClass("modal-lg"),o.find(".modal-footer").append(n),(0,r.default)("main").append(o),o.modal("show"),(0,r.default)(o).on("hidden.bs.modal",function(){(0,r.default)(this).modal("dispose")}),o}function f(e){(0,r.default)("#ezq--notifications-toast-container").length||(0,r.default)("body").append((0,r.default)("").attr({id:"ezq--notifications-toast-container"}).css({position:"fixed",bottom:"0",right:"0","min-width":"20%"}));var t=l.format(e.title,e.body),o=(0,r.default)(t);if(e.onclose&&(0,r.default)(o).find("button[data-dismiss=toast]").click(function(){e.onclose()}),e.onclick){var n=(0,r.default)(o).find(".toast-body");n.addClass("cursor-pointer"),n.click(function(){e.onclick()})}var s=!1!==e.autohide,a=!1!==e.animation,i=e.delay||1e4;return(0,r.default)("#ezq--notifications-toast-container").prepend(o),o.toast({autohide:s,delay:i,animation:a}),o.toast("show"),o}function j(e){var t=a.format(e.title),o=(0,r.default)(t);"string"==typeof e.body?o.find(".modal-body").append("".concat(e.body,"
")):o.find(".modal-body").append((0,r.default)(e.body));var n=(0,r.default)(m),s=(0,r.default)(u);return o.find(".modal-footer").append(s),o.find(".modal-footer").append(n),(0,r.default)("main").append(o),(0,r.default)(o).on("hidden.bs.modal",function(){(0,r.default)(this).modal("dispose")}),(0,r.default)(n).click(function(){e.success()}),o.modal("show"),o}function _(e){if(e.target){var t=(0,r.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var o=i.format(e.width),n=a.format(e.title),s=(0,r.default)(n);return s.find(".modal-body").append((0,r.default)(o)),(0,r.default)("main").append(s),s.modal("show")}function h(e){var t={success:d,error:s}[e.type].format(e.body);return(0,r.default)(t)}var g={ezAlert:p,ezToast:f,ezQuery:j,ezProgressBar:_,ezBadge:h};t.default=g},"./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,s=(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=s.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"]=s.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,s,a,i){var r=f[e],l=(0,c.default)(t);if(l.empty(),void 0===l[0])return;l[0].fn=r.fn(n,s,a,i);var d=r.format(n,s,a,i,o);u.default.newPlot(l[0],d,r.layout,j)},t.updateGraph=function(e,t,o,n,s,a,i){var r=f[e],l=(0,c.default)(t),d=r.format(n,s,a,i,o);u.default.update(l[0],d,r.layout,j)};var c=n(o("./node_modules/jquery/dist/jquery.js")),u=n(o("./node_modules/plotly.js-basic-dist/plotly-basic.js")),m=n(o("./node_modules/moment/moment.js")),p=o("./CTFd/themes/core/assets/js/utils.js");function n(e){return e&&e.__esModule?e:{default:e}}var f={score_graph:{layout:{title:"Score over Time",paper_bgcolor:"rgba(0,0,0,0)",plot_bgcolor:"rgba(0,0,0,0)",hovermode:"closest",xaxis:{showgrid:!1,showspikes:!0},yaxis:{showgrid:!1,showspikes:!0},legend:{orientation:"h"}},fn:function(e,t,o,n){return"CTFd_score_".concat(e,"_").concat(o,"_").concat(t,"_").concat((new Date).toISOString().slice(0,19))},format:function(e,t,o,n,s){var a=[],i=[],r=s[0].data,l=s[2].data,d=r.concat(l);d.sort(function(e,t){return new Date(e.date)-new Date(t.date)});for(var c=0;c>8*s&255).toString(16)).substr(-2)}return n},t.htmlEntities=function(e){return(0,i.default)("").text(e).html()},t.cumulativeSum=function(e){for(var t=e.concat(),o=0;o'),(0,i.default)("th.sort-col").click(function(){var e=(0,i.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort(function(s){return function(e,t){var o=a(e,s),n=a(t,s);return i.default.isNumeric(o)&&i.default.isNumeric(n)?o-n:o.toString().localeCompare(n)}}((0,i.default)(this).index()));this.asc=!this.asc,this.asc||(t=t.reverse());for(var o=0;o #results\").empty();\n Object.keys(response.errors).forEach(function (key, index) {\n (0, _jquery.default)(\"#team-captain-form > #results\").append(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});\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/teams/private.js?");
+eval("\n\n__webpack_require__(/*! ../main */ \"./CTFd/themes/core/assets/js/pages/main.js\");\n\n__webpack_require__(/*! ../../utils */ \"./CTFd/themes/core/assets/js/utils.js\");\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! ../../CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\n__webpack_require__(/*! bootstrap/js/dist/modal */ \"./node_modules/bootstrap/js/dist/modal.js\");\n\nvar _jquery = _interopRequireDefault(__webpack_require__(/*! jquery */ \"./node_modules/jquery/dist/jquery.js\"));\n\nvar _ezq = __webpack_require__(/*! ../../ezq */ \"./CTFd/themes/core/assets/js/ezq.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(0, _jquery.default)(function () {\n if (window.team_captain) {\n (0, _jquery.default)(\".edit-team\").click(function () {\n (0, _jquery.default)(\"#team-edit-modal\").modal();\n });\n (0, _jquery.default)(\".edit-captain\").click(function () {\n (0, _jquery.default)(\"#team-captain-modal\").modal();\n });\n }\n\n var form = (0, _jquery.default)(\"#team-info-form\");\n form.submit(function (e) {\n e.preventDefault();\n (0, _jquery.default)(\"#results\").empty();\n var params = (0, _jquery.default)(this).serializeJSON();\n var method = \"PATCH\";\n var url = \"/api/v1/teams/me\";\n\n _CTFd.default.fetch(url, {\n method: method,\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 if (response.status === 400) {\n response.json().then(function (object) {\n if (!object.success) {\n var error_template = '\\n' + ' Error:\\n' + \" {0}\\n\" + ' \\n' + \"
\";\n Object.keys(object.errors).map(function (error) {\n var i = form.find(\"input[name={0}]\".format(error));\n var input = (0, _jquery.default)(i);\n input.addClass(\"input-filled-invalid\");\n input.removeClass(\"input-filled-valid\");\n var error_msg = object.errors[error];\n var alert = error_template.format(error_msg);\n (0, _jquery.default)(\"#results\").append(alert);\n });\n }\n });\n } else if (response.status === 200) {\n response.json().then(function (object) {\n if (object.success) {\n window.location.reload();\n }\n });\n }\n });\n });\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/me\", {\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});\n\n//# sourceURL=webpack:///./CTFd/themes/core/assets/js/pages/teams/private.js?");
/***/ })
diff --git a/CTFd/themes/core/static/js/pages/teams/private.min.js b/CTFd/themes/core/static/js/pages/teams/private.min.js
index 9caf554a..995c648c 100644
--- a/CTFd/themes/core/static/js/pages/teams/private.min.js
+++ b/CTFd/themes/core/static/js/pages/teams/private.min.js
@@ -1 +1 @@
-!function(l){function e(e){for(var t,o,n=e[0],s=e[1],i=e[2],a=0,r=[];a {1}
',a='',s='\n Error:\n {0}\n \n
',d='\n Success!\n {0}\n \n
',c='',m='',u='';function p(e){var t=i.format(e.title),o=(0,r.default)(t);"string"==typeof e.body?o.find(".modal-body").append("".concat(e.body,"
")):o.find(".modal-body").append((0,r.default)(e.body));var n=(0,r.default)(c.format(e.button));return e.success&&(0,r.default)(n).click(function(){e.success()}),e.large&&o.find(".modal-dialog").addClass("modal-lg"),o.find(".modal-footer").append(n),(0,r.default)("main").append(o),o.modal("show"),(0,r.default)(o).on("hidden.bs.modal",function(){(0,r.default)(this).modal("dispose")}),o}function f(e){(0,r.default)("#ezq--notifications-toast-container").length||(0,r.default)("body").append((0,r.default)("").attr({id:"ezq--notifications-toast-container"}).css({position:"fixed",bottom:"0",right:"0","min-width":"20%"}));var t=l.format(e.title,e.body),o=(0,r.default)(t);if(e.onclose&&(0,r.default)(o).find("button[data-dismiss=toast]").click(function(){e.onclose()}),e.onclick){var n=(0,r.default)(o).find(".toast-body");n.addClass("cursor-pointer"),n.click(function(){e.onclick()})}var s=!1!==e.autohide,i=!1!==e.animation,a=e.delay||1e4;return(0,r.default)("#ezq--notifications-toast-container").prepend(o),o.toast({autohide:s,delay:a,animation:i}),o.toast("show"),o}function j(e){var t=i.format(e.title),o=(0,r.default)(t);"string"==typeof e.body?o.find(".modal-body").append("".concat(e.body,"
")):o.find(".modal-body").append((0,r.default)(e.body));var n=(0,r.default)(u),s=(0,r.default)(m);return o.find(".modal-footer").append(s),o.find(".modal-footer").append(n),(0,r.default)("main").append(o),(0,r.default)(o).on("hidden.bs.modal",function(){(0,r.default)(this).modal("dispose")}),(0,r.default)(n).click(function(){e.success()}),o.modal("show"),o}function _(e){if(e.target){var t=(0,r.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var o=a.format(e.width),n=i.format(e.title),s=(0,r.default)(n);return s.find(".modal-body").append((0,r.default)(o)),(0,r.default)("main").append(s),s.modal("show")}function h(e){var t={success:d,error:s}[e.type].format(e.body);return(0,r.default)(t)}var v={ezAlert:p,ezToast:f,ezQuery:j,ezProgressBar:_,ezBadge:h};t.default=v},"./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,s=(n=o("./CTFd/themes/core/assets/js/config.js"))&&n.__esModule?n:{default:n};var i=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=s.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"]=s.default.csrfNonce,i(e,t)}},"./CTFd/themes/core/assets/js/pages/main.js":function(e,t,o){var n=p(o("./CTFd/themes/core/assets/js/CTFd.js")),s=p(o("./node_modules/jquery/dist/jquery.js")),i=p(o("./node_modules/moment/moment.js")),a=p(o("./node_modules/nunjucks/browser/nunjucks.js")),r=o("./node_modules/howler/dist/howler.js"),l=p(o("./CTFd/themes/core/assets/js/events.js")),d=p(o("./CTFd/themes/core/assets/js/config.js")),c=p(o("./CTFd/themes/core/assets/js/styles.js")),m=p(o("./CTFd/themes/core/assets/js/times.js")),u=p(o("./CTFd/themes/core/assets/js/helpers.js"));function p(e){return e&&e.__esModule?e:{default:e}}n.default.init(window.init),window.CTFd=n.default,window.helpers=u.default,window.$=s.default,window.Moment=i.default,window.nunjucks=a.default,window.Howl=r.Howl,(0,s.default)(function(){(0,c.default)(),(0,m.default)(),(0,l.default)(d.default.urlRoot)})},"./CTFd/themes/core/assets/js/pages/teams/private.js":function(e,t,o){o("./CTFd/themes/core/assets/js/pages/main.js"),o("./CTFd/themes/core/assets/js/utils.js");var n=s(o("./CTFd/themes/core/assets/js/CTFd.js"));o("./node_modules/bootstrap/js/dist/modal.js");var r=s(o("./node_modules/jquery/dist/jquery.js"));function s(e){return e&&e.__esModule?e:{default:e}}(0,r.default)(function(){window.team_captain&&((0,r.default)(".edit-team").click(function(){(0,r.default)("#team-edit-modal").modal()}),(0,r.default)(".edit-captain").click(function(){(0,r.default)("#team-captain-modal").modal()}));var a=(0,r.default)("#team-info-form");a.submit(function(e){e.preventDefault(),(0,r.default)("#results").empty();var t=(0,r.default)(this).serializeJSON();n.default.fetch("/api/v1/teams/me",{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)}).then(function(e){400===e.status?e.json().then(function(i){i.success||Object.keys(i.errors).map(function(e){var t=a.find("input[name={0}]".format(e)),o=(0,r.default)(t);o.addClass("input-filled-invalid"),o.removeClass("input-filled-valid");var n=i.errors[e],s=error_template.format(n);(0,r.default)("#results").append(s)})}):200===e.status&&e.json().then(function(e){e.success&&window.location.reload()})})}),(0,r.default)("#team-captain-form").submit(function(e){e.preventDefault();var t=(0,r.default)("#team-captain-form").serializeJSON(!0);n.default.fetch("/api/v1/teams/me",{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(s){s.success?window.location.reload():((0,r.default)("#team-captain-form > #results").empty(),Object.keys(s.errors).forEach(function(e,t){(0,r.default)("#team-captain-form > #results").append(ezbadge({type:"error",body:s.errors[e]}));var o=(0,r.default)("#team-captain-form").find("select[name={0}]".format(e)),n=(0,r.default)(o);n.addClass("input-filled-invalid"),n.removeClass("input-filled-valid")}))})})})},"./CTFd/themes/core/assets/js/patch.js":function(e,t,o){var n,r=(n=o("./node_modules/q/q.js"))&&n.__esModule?n:{default:n},s=o("./CTFd/themes/core/assets/js/api.js");function i(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function l(e,t){return function(t){for(var e=1;e>8*s&255).toString(16)).substr(-2)}return n},t.htmlEntities=function(e){return(0,a.default)("").text(e).html()},t.cumulativeSum=function(e){for(var t=e.concat(),o=0;o'),(0,a.default)("th.sort-col").click(function(){var e=(0,a.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort(function(s){return function(e,t){var o=i(e,s),n=i(t,s);return a.default.isNumeric(o)&&a.default.isNumeric(n)?o-n:o.toString().localeCompare(n)}}((0,a.default)(this).index()));this.asc=!this.asc,this.asc||(t=t.reverse());for(var o=0;o {1}
',a='',s='\n Error:\n {0}\n \n
',d='\n Success!\n {0}\n \n
',c='',m='',u='';function p(e){var t=i.format(e.title),o=(0,r.default)(t);"string"==typeof e.body?o.find(".modal-body").append("".concat(e.body,"
")):o.find(".modal-body").append((0,r.default)(e.body));var n=(0,r.default)(c.format(e.button));return e.success&&(0,r.default)(n).click(function(){e.success()}),e.large&&o.find(".modal-dialog").addClass("modal-lg"),o.find(".modal-footer").append(n),(0,r.default)("main").append(o),o.modal("show"),(0,r.default)(o).on("hidden.bs.modal",function(){(0,r.default)(this).modal("dispose")}),o}function f(e){(0,r.default)("#ezq--notifications-toast-container").length||(0,r.default)("body").append((0,r.default)("").attr({id:"ezq--notifications-toast-container"}).css({position:"fixed",bottom:"0",right:"0","min-width":"20%"}));var t=l.format(e.title,e.body),o=(0,r.default)(t);if(e.onclose&&(0,r.default)(o).find("button[data-dismiss=toast]").click(function(){e.onclose()}),e.onclick){var n=(0,r.default)(o).find(".toast-body");n.addClass("cursor-pointer"),n.click(function(){e.onclick()})}var s=!1!==e.autohide,i=!1!==e.animation,a=e.delay||1e4;return(0,r.default)("#ezq--notifications-toast-container").prepend(o),o.toast({autohide:s,delay:a,animation:i}),o.toast("show"),o}function j(e){var t=i.format(e.title),o=(0,r.default)(t);"string"==typeof e.body?o.find(".modal-body").append("".concat(e.body,"
")):o.find(".modal-body").append((0,r.default)(e.body));var n=(0,r.default)(u),s=(0,r.default)(m);return o.find(".modal-footer").append(s),o.find(".modal-footer").append(n),(0,r.default)("main").append(o),(0,r.default)(o).on("hidden.bs.modal",function(){(0,r.default)(this).modal("dispose")}),(0,r.default)(n).click(function(){e.success()}),o.modal("show"),o}function _(e){if(e.target){var t=(0,r.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var o=a.format(e.width),n=i.format(e.title),s=(0,r.default)(n);return s.find(".modal-body").append((0,r.default)(o)),(0,r.default)("main").append(s),s.modal("show")}function h(e){var t={success:d,error:s}[e.type].format(e.body);return(0,r.default)(t)}var v={ezAlert:p,ezToast:f,ezQuery:j,ezProgressBar:_,ezBadge:h};t.default=v},"./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,s=(n=o("./CTFd/themes/core/assets/js/config.js"))&&n.__esModule?n:{default:n};var i=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=s.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"]=s.default.csrfNonce,i(e,t)}},"./CTFd/themes/core/assets/js/pages/main.js":function(e,t,o){var n=p(o("./CTFd/themes/core/assets/js/CTFd.js")),s=p(o("./node_modules/jquery/dist/jquery.js")),i=p(o("./node_modules/moment/moment.js")),a=p(o("./node_modules/nunjucks/browser/nunjucks.js")),r=o("./node_modules/howler/dist/howler.js"),l=p(o("./CTFd/themes/core/assets/js/events.js")),d=p(o("./CTFd/themes/core/assets/js/config.js")),c=p(o("./CTFd/themes/core/assets/js/styles.js")),m=p(o("./CTFd/themes/core/assets/js/times.js")),u=p(o("./CTFd/themes/core/assets/js/helpers.js"));function p(e){return e&&e.__esModule?e:{default:e}}n.default.init(window.init),window.CTFd=n.default,window.helpers=u.default,window.$=s.default,window.Moment=i.default,window.nunjucks=a.default,window.Howl=r.Howl,(0,s.default)(function(){(0,c.default)(),(0,m.default)(),(0,l.default)(d.default.urlRoot)})},"./CTFd/themes/core/assets/js/pages/teams/private.js":function(e,t,o){o("./CTFd/themes/core/assets/js/pages/main.js"),o("./CTFd/themes/core/assets/js/utils.js");var n=s(o("./CTFd/themes/core/assets/js/CTFd.js"));o("./node_modules/bootstrap/js/dist/modal.js");var l=s(o("./node_modules/jquery/dist/jquery.js")),i=o("./CTFd/themes/core/assets/js/ezq.js");function s(e){return e&&e.__esModule?e:{default:e}}(0,l.default)(function(){window.team_captain&&((0,l.default)(".edit-team").click(function(){(0,l.default)("#team-edit-modal").modal()}),(0,l.default)(".edit-captain").click(function(){(0,l.default)("#team-captain-modal").modal()}));var r=(0,l.default)("#team-info-form");r.submit(function(e){e.preventDefault(),(0,l.default)("#results").empty();var t=(0,l.default)(this).serializeJSON();n.default.fetch("/api/v1/teams/me",{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)}).then(function(e){400===e.status?e.json().then(function(i){if(!i.success){var a='\n Error:\n {0}\n \n
';Object.keys(i.errors).map(function(e){var t=r.find("input[name={0}]".format(e)),o=(0,l.default)(t);o.addClass("input-filled-invalid"),o.removeClass("input-filled-valid");var n=i.errors[e],s=a.format(n);(0,l.default)("#results").append(s)})}}):200===e.status&&e.json().then(function(e){e.success&&window.location.reload()})})}),(0,l.default)("#team-captain-form").submit(function(e){e.preventDefault();var t=(0,l.default)("#team-captain-form").serializeJSON(!0);n.default.fetch("/api/v1/teams/me",{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(s){s.success?window.location.reload():((0,l.default)("#team-captain-form > #results").empty(),Object.keys(s.errors).forEach(function(e,t){(0,l.default)("#team-captain-form > #results").append((0,i.ezBadge)({type:"error",body:s.errors[e]}));var o=(0,l.default)("#team-captain-form").find("select[name={0}]".format(e)),n=(0,l.default)(o);n.addClass("input-filled-invalid"),n.removeClass("input-filled-valid")}))})})})},"./CTFd/themes/core/assets/js/patch.js":function(e,t,o){var n,r=(n=o("./node_modules/q/q.js"))&&n.__esModule?n:{default:n},s=o("./CTFd/themes/core/assets/js/api.js");function i(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function l(e,t){return function(t){for(var e=1;e>8*s&255).toString(16)).substr(-2)}return n},t.htmlEntities=function(e){return(0,a.default)("").text(e).html()},t.cumulativeSum=function(e){for(var t=e.concat(),o=0;o'),(0,a.default)("th.sort-col").click(function(){var e=(0,a.default)(this).parents("table").eq(0),t=e.find("tr:gt(0)").toArray().sort(function(s){return function(e,t){var o=i(e,s),n=i(t,s);return a.default.isNumeric(o)&&a.default.isNumeric(n)?o-n:o.toString().localeCompare(n)}}((0,a.default)(this).index()));this.asc=!this.asc,this.asc||(t=t.reverse());for(var o=0;o