diff --git a/CTFd/api/v1/config.py b/CTFd/api/v1/config.py index f4472982..ae1c686e 100644 --- a/CTFd/api/v1/config.py +++ b/CTFd/api/v1/config.py @@ -8,8 +8,9 @@ from CTFd.api.v1.helpers.schemas import sqlalchemy_to_pydantic from CTFd.api.v1.schemas import APIDetailedSuccessResponse, APIListSuccessResponse from CTFd.cache import clear_config, clear_standings from CTFd.constants import RawEnum -from CTFd.models import Configs, db +from CTFd.models import Configs, Fields, db from CTFd.schemas.config import ConfigSchema +from CTFd.schemas.fields import FieldSchema from CTFd.utils import set_config from CTFd.utils.decorators import admins_only from CTFd.utils.helpers.models import build_model_filters @@ -189,3 +190,89 @@ class Config(Resource): clear_standings() return {"success": True} + + +@configs_namespace.route("/fields") +class FieldList(Resource): + @admins_only + @validate_args( + { + "type": (str, None), + "q": (str, None), + "field": (RawEnum("FieldFields", {"description": "description"}), None), + }, + location="query", + ) + def get(self, query_args): + q = query_args.pop("q", None) + field = str(query_args.pop("field", None)) + filters = build_model_filters(model=Fields, query=q, field=field) + + fields = Fields.query.filter_by(**query_args).filter(*filters).all() + schema = FieldSchema(many=True) + + response = schema.dump(fields) + + if response.errors: + return {"success": False, "errors": response.errors}, 400 + + return {"success": True, "data": response.data} + + @admins_only + def post(self): + req = request.get_json() + schema = FieldSchema() + response = schema.load(req, session=db.session) + + if response.errors: + return {"success": False, "errors": response.errors}, 400 + + db.session.add(response.data) + db.session.commit() + + response = schema.dump(response.data) + db.session.close() + + return {"success": True, "data": response.data} + + +@configs_namespace.route("/fields/") +class Field(Resource): + @admins_only + def get(self, field_id): + field = Fields.query.filter_by(id=field_id).first_or_404() + schema = FieldSchema() + + response = schema.dump(field) + + if response.errors: + return {"success": False, "errors": response.errors}, 400 + + return {"success": True, "data": response.data} + + @admins_only + def patch(self, field_id): + field = Fields.query.filter_by(id=field_id).first_or_404() + schema = FieldSchema() + + req = request.get_json() + + response = schema.load(req, session=db.session, instance=field) + if response.errors: + return {"success": False, "errors": response.errors}, 400 + + db.session.commit() + + response = schema.dump(response.data) + db.session.close() + + return {"success": True, "data": response.data} + + @admins_only + def delete(self, field_id): + field = Fields.query.filter_by(id=field_id).first_or_404() + db.session.delete(field) + db.session.commit() + db.session.close() + + return {"success": True} diff --git a/CTFd/auth.py b/CTFd/auth.py index f4ec1da4..2f801f03 100644 --- a/CTFd/auth.py +++ b/CTFd/auth.py @@ -7,7 +7,7 @@ from flask import redirect, render_template, request, session, url_for from itsdangerous.exc import BadSignature, BadTimeSignature, SignatureExpired from CTFd.cache import clear_team_session, clear_user_session -from CTFd.models import Teams, Users, db +from CTFd.models import Teams, UserFieldEntries, UserFields, Users, db from CTFd.utils import config, email, get_app_config, get_config from CTFd.utils import user as current_user from CTFd.utils import validators @@ -206,6 +206,31 @@ def register(): valid_email = validators.validate_email(email_address) team_name_email_check = validators.validate_email(name) + # Process additional user fields + fields = {} + for field in UserFields.query.all(): + fields[field.id] = field + + entries = {} + for field_id, field in fields.items(): + value = request.form.get(f"fields[{field_id}]", "").strip() + if field.required is True and (value is None or value == ""): + errors.append("Please provide all required fields") + break + + # Handle special casing of existing profile fields + if field.name.lower() == "affiliation": + affiliation = value + break + elif field.name.lower() == "website": + website = value + break + + if field.field_type == "boolean": + entries[field_id] = bool(value) + else: + entries[field_id] = value + if country: try: validators.validate_country_code(country) @@ -275,6 +300,13 @@ def register(): db.session.commit() db.session.flush() + for field_id, value in entries.items(): + entry = UserFieldEntries( + field_id=field_id, value=value, user_id=user.id + ) + db.session.add(entry) + db.session.commit() + login_user(user) if config.can_send_mail() and get_config( diff --git a/CTFd/forms/auth.py b/CTFd/forms/auth.py index 7708b561..b0c70402 100644 --- a/CTFd/forms/auth.py +++ b/CTFd/forms/auth.py @@ -4,13 +4,25 @@ from wtforms.validators import InputRequired from CTFd.forms import BaseForm from CTFd.forms.fields import SubmitField +from CTFd.forms.users import attach_custom_user_fields, build_custom_user_fields -class RegistrationForm(BaseForm): - name = StringField("User Name", validators=[InputRequired()]) - email = EmailField("Email", validators=[InputRequired()]) - password = PasswordField("Password", validators=[InputRequired()]) - submit = SubmitField("Submit") +def RegistrationForm(*args, **kwargs): + class _RegistrationForm(BaseForm): + name = StringField("User Name", validators=[InputRequired()]) + email = EmailField("Email", validators=[InputRequired()]) + password = PasswordField("Password", validators=[InputRequired()]) + submit = SubmitField("Submit") + + @property + def extra(self): + return build_custom_user_fields( + self, include_entries=False, blacklisted_items=() + ) + + attach_custom_user_fields(_RegistrationForm) + + return _RegistrationForm(*args, **kwargs) class LoginForm(BaseForm): diff --git a/CTFd/forms/self.py b/CTFd/forms/self.py index a57b2af2..13a32035 100644 --- a/CTFd/forms/self.py +++ b/CTFd/forms/self.py @@ -1,20 +1,36 @@ +from flask import session from wtforms import PasswordField, SelectField, StringField from wtforms.fields.html5 import DateField, URLField from CTFd.forms import BaseForm from CTFd.forms.fields import SubmitField +from CTFd.forms.users import attach_custom_user_fields, build_custom_user_fields from CTFd.utils.countries import SELECT_COUNTRIES_LIST -class SettingsForm(BaseForm): - name = StringField("User Name") - email = StringField("Email") - password = PasswordField("Password") - confirm = PasswordField("Current Password") - affiliation = StringField("Affiliation") - website = URLField("Website") - country = SelectField("Country", choices=SELECT_COUNTRIES_LIST) - submit = SubmitField("Submit") +def SettingsForm(*args, **kwargs): + class _SettingsForm(BaseForm): + name = StringField("User Name") + email = StringField("Email") + password = PasswordField("Password") + confirm = PasswordField("Current Password") + affiliation = StringField("Affiliation") + website = URLField("Website") + country = SelectField("Country", choices=SELECT_COUNTRIES_LIST) + submit = SubmitField("Submit") + + @property + def extra(self): + return build_custom_user_fields( + self, + include_entries=True, + fields_kwargs={"editable": True}, + field_entries_kwargs={"user_id": session["id"]}, + ) + + attach_custom_user_fields(_SettingsForm, editable=True) + + return _SettingsForm(*args, **kwargs) class TokensForm(BaseForm): diff --git a/CTFd/forms/users.py b/CTFd/forms/users.py index 7b47d172..55627171 100644 --- a/CTFd/forms/users.py +++ b/CTFd/forms/users.py @@ -4,9 +4,83 @@ from wtforms.validators import InputRequired from CTFd.forms import BaseForm from CTFd.forms.fields import SubmitField +from CTFd.models import UserFieldEntries, UserFields from CTFd.utils.countries import SELECT_COUNTRIES_LIST +def build_custom_user_fields( + form_cls, + include_entries=False, + fields_kwargs=None, + field_entries_kwargs=None, + blacklisted_items=("affiliation", "website"), +): + """ + Function used to reinject values back into forms for accessing by themes + """ + if fields_kwargs is None: + fields_kwargs = {} + if field_entries_kwargs is None: + field_entries_kwargs = {} + + fields = [] + new_fields = UserFields.query.filter_by(**fields_kwargs).all() + user_fields = {} + + # Only include preexisting values if asked + if include_entries is True: + for f in UserFieldEntries.query.filter_by(**field_entries_kwargs).all(): + user_fields[f.field_id] = f.value + + for field in new_fields: + if field.name.lower() in blacklisted_items: + continue + + form_field = getattr(form_cls, f"fields[{field.id}]") + + # Add the field_type to the field so we know how to render it + form_field.field_type = field.field_type + + # Only include preexisting values if asked + if include_entries is True: + initial = user_fields.get(field.id, "") + form_field.data = initial + if form_field.render_kw: + form_field.render_kw["data-initial"] = initial + else: + form_field.render_kw = {"data-initial": initial} + + fields.append(form_field) + return fields + + +def attach_custom_user_fields(form_cls, **kwargs): + """ + Function used to attach form fields to wtforms. + Not really a great solution but is approved by wtforms. + + https://wtforms.readthedocs.io/en/2.3.x/specific_problems/#dynamic-form-composition + """ + new_fields = UserFields.query.filter_by(**kwargs).all() + for field in new_fields: + validators = [] + if field.required: + validators.append(InputRequired()) + + if field.field_type == "text": + input_field = StringField( + field.name, description=field.description, validators=validators + ) + elif field.field_type == "boolean": + input_field = BooleanField( + field.name, description=field.description, validators=validators + ) + + setattr( + form_cls, f"fields[{field.id}]", input_field, + ) + + class UserSearchForm(BaseForm): field = SelectField( "Search Field", @@ -40,7 +114,7 @@ class PublicUserSearchForm(BaseForm): submit = SubmitField("Search") -class UserEditForm(BaseForm): +class UserBaseForm(BaseForm): name = StringField("User Name", validators=[InputRequired()]) email = EmailField("Email", validators=[InputRequired()]) password = PasswordField("Password") @@ -54,5 +128,41 @@ class UserEditForm(BaseForm): submit = SubmitField("Submit") -class UserCreateForm(UserEditForm): - notify = BooleanField("Email account credentials to user", default=True) +def UserEditForm(*args, **kwargs): + class _UserEditForm(UserBaseForm): + pass + + @property + def extra(self): + return build_custom_user_fields( + self, + include_entries=True, + fields_kwargs=None, + field_entries_kwargs={"user_id": self.obj.id}, + ) + + def __init__(self, *args, **kwargs): + """ + Custom init to persist the obj parameter to the rest of the form + """ + super().__init__(*args, **kwargs) + obj = kwargs.get("obj") + if obj: + self.obj = obj + + attach_custom_user_fields(_UserEditForm) + + return _UserEditForm(*args, **kwargs) + + +def UserCreateForm(*args, **kwargs): + class _UserCreateForm(UserBaseForm): + notify = BooleanField("Email account credentials to user", default=True) + + @property + def extra(self): + return build_custom_user_fields(self, include_entries=False) + + attach_custom_user_fields(_UserCreateForm) + + return _UserCreateForm(*args, **kwargs) diff --git a/CTFd/models/__init__.py b/CTFd/models/__init__.py index af9b08bf..e0979181 100644 --- a/CTFd/models/__init__.py +++ b/CTFd/models/__init__.py @@ -276,6 +276,10 @@ class Users(db.Model): # Relationship for Teams team_id = db.Column(db.Integer, db.ForeignKey("teams.id")) + field_entries = db.relationship( + "UserFieldEntries", foreign_keys="UserFieldEntries.user_id", lazy="joined" + ) + created = db.Column(db.DateTime, default=datetime.datetime.utcnow) __mapper_args__ = {"polymorphic_identity": "user", "polymorphic_on": type} @@ -309,6 +313,10 @@ class Users(db.Model): elif user_mode == "users": return self + @property + def fields(self): + return self.get_fields(admin=False) + @property def solves(self): return self.get_solves(admin=False) @@ -334,6 +342,12 @@ class Users(db.Model): else: return None + def get_fields(self, admin=False): + if admin: + return self.field_entries + + return [entry for entry in self.field_entries if entry.field.public] + def get_solves(self, admin=False): from CTFd.utils import get_config @@ -781,3 +795,59 @@ class TeamComments(Comments): class PageComments(Comments): __mapper_args__ = {"polymorphic_identity": "page"} page_id = db.Column(db.Integer, db.ForeignKey("pages.id", ondelete="CASCADE")) + + +class Fields(db.Model): + __tablename__ = "fields" + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.Text) + type = db.Column(db.String(80), default="standard") + field_type = db.Column(db.String(80)) + description = db.Column(db.Text) + required = db.Column(db.Boolean, default=False) + public = db.Column(db.Boolean, default=False) + editable = db.Column(db.Boolean, default=False) + + __mapper_args__ = {"polymorphic_identity": "standard", "polymorphic_on": type} + + +class UserFields(Fields): + __mapper_args__ = {"polymorphic_identity": "user"} + + +class TeamFields(Fields): + __mapper_args__ = {"polymorphic_identity": "team"} + + +class FieldEntries(db.Model): + __tablename__ = "field_entries" + id = db.Column(db.Integer, primary_key=True) + type = db.Column(db.String(80), default="standard") + value = db.Column(db.JSON) + field_id = db.Column(db.Integer, db.ForeignKey("fields.id", ondelete="CASCADE")) + + field = db.relationship( + "Fields", foreign_keys="FieldEntries.field_id", lazy="joined" + ) + + __mapper_args__ = {"polymorphic_identity": "standard", "polymorphic_on": type} + + @hybrid_property + def name(self): + return self.field.name + + @hybrid_property + def description(self): + return self.field.description + + +class UserFieldEntries(FieldEntries): + __mapper_args__ = {"polymorphic_identity": "user"} + user_id = db.Column(db.Integer, db.ForeignKey("users.id", ondelete="CASCADE")) + user = db.relationship("Users", foreign_keys="UserFieldEntries.user_id") + + +class TeamFieldEntries(FieldEntries): + __mapper_args__ = {"polymorphic_identity": "team"} + team_id = db.Column(db.Integer, db.ForeignKey("teams.id", ondelete="CASCADE")) + team = db.relationship("Teams", foreign_keys="TeamFieldEntries.team_id") diff --git a/CTFd/schemas/fields.py b/CTFd/schemas/fields.py new file mode 100644 index 00000000..a6c8841a --- /dev/null +++ b/CTFd/schemas/fields.py @@ -0,0 +1,24 @@ +from marshmallow import fields + +from CTFd.models import Fields, UserFieldEntries, db, ma + + +class FieldSchema(ma.ModelSchema): + class Meta: + model = Fields + include_fk = True + dump_only = ("id",) + + +class UserFieldEntriesSchema(ma.ModelSchema): + class Meta: + model = UserFieldEntries + sqla_session = db.session + include_fk = True + load_only = ("id",) + exclude = ("field", "user", "user_id") + dump_only = ("user_id", "name", "description", "type") + + name = fields.Nested(FieldSchema, only=("name"), attribute="field") + description = fields.Nested(FieldSchema, only=("description"), attribute="field") + type = fields.Nested(FieldSchema, only=("field_type"), attribute="field") diff --git a/CTFd/schemas/users.py b/CTFd/schemas/users.py index 07148255..3b51453b 100644 --- a/CTFd/schemas/users.py +++ b/CTFd/schemas/users.py @@ -1,7 +1,10 @@ -from marshmallow import ValidationError, pre_load, validate +from marshmallow import ValidationError, post_dump, pre_load, validate +from marshmallow.fields import Nested from marshmallow_sqlalchemy import field_for +from sqlalchemy.orm import load_only -from CTFd.models import Users, ma +from CTFd.models import UserFieldEntries, UserFields, Users, ma +from CTFd.schemas.fields import UserFieldEntriesSchema from CTFd.utils import get_config, string_types from CTFd.utils.crypto import verify_password from CTFd.utils.email import check_email_is_whitelisted @@ -49,6 +52,9 @@ class UserSchema(ma.ModelSchema): ) country = field_for(Users, "country", validate=[validate_country_code]) password = field_for(Users, "password") + fields = Nested( + UserFieldEntriesSchema, partial=True, many=True, attribute="field_entries" + ) @pre_load def validate_name(self, data): @@ -180,6 +186,116 @@ class UserSchema(ma.ModelSchema): data.pop("password", None) data.pop("confirm", None) + @pre_load + def validate_fields(self, data): + """ + This validator is used to only allow users to update the field entry for their user. + It's not possible to exclude it because without the PK Marshmallow cannot load the right instance + """ + fields = data.get("fields") + if fields is None: + return + + current_user = get_current_user() + + if is_admin(): + user_id = data.get("id") + if user_id: + target_user = Users.query.filter_by(id=data["id"]).first() + else: + target_user = current_user + + provided_ids = [] + for f in fields: + f.pop("id", None) + field_id = f.get("field_id") + + # # Check that we have an existing field for this. May be unnecessary b/c the foriegn key should enforce + field = UserFields.query.filter_by(id=field_id).first_or_404() + + # Get the existing field entry if one exists + entry = UserFieldEntries.query.filter_by( + field_id=field.id, user_id=target_user.id + ).first() + if entry: + f["id"] = entry.id + provided_ids.append(entry.id) + + # Extremely dirty hack to prevent deleting previously provided data. + # This needs a better soln. + entries = ( + UserFieldEntries.query.options(load_only("id")) + .filter_by(user_id=target_user.id) + .all() + ) + for entry in entries: + if entry.id not in provided_ids: + fields.append({"id": entry.id}) + else: + provided_ids = [] + for f in fields: + # Remove any existing set + f.pop("id", None) + field_id = f.get("field_id") + + # # Check that we have an existing field for this. May be unnecessary b/c the foriegn key should enforce + field = UserFields.query.filter_by(id=field_id).first_or_404() + + if field.editable is False: + raise ValidationError( + f"Field {field.name} cannot be editted", field_names=["fields"] + ) + + # Get the existing field entry if one exists + entry = UserFieldEntries.query.filter_by( + field_id=field.id, user_id=current_user.id + ).first() + + if entry: + f["id"] = entry.id + provided_ids.append(entry.id) + + # Extremely dirty hack to prevent deleting previously provided data. + # This needs a better soln. + entries = ( + UserFieldEntries.query.options(load_only("id")) + .filter_by(user_id=current_user.id) + .all() + ) + for entry in entries: + if entry.id not in provided_ids: + fields.append({"id": entry.id}) + + @post_dump + def process_fields(self, data): + """ + Handle permissions levels for fields. + This is post_dump to manipulate JSON instead of the raw db object + + Admins can see all fields. + Users (self) can see their edittable and public fields + Public (user) can only see public fields + """ + # Gather all possible fields + removed_field_ids = [] + fields = UserFields.query.all() + + # Select fields for removal based on current view and properties of the field + for field in fields: + if self.view == "user": + if field.public is False: + removed_field_ids.append(field.id) + elif self.view == "self": + if field.editable is False and field.public is False: + removed_field_ids.append(field.id) + + # Rebuild fuilds + fields = data.get("fields") + if fields: + data["fields"] = [ + field for field in fields if field["field_id"] not in removed_field_ids + ] + views = { "user": [ "website", @@ -189,6 +305,7 @@ class UserSchema(ma.ModelSchema): "bracket", "id", "oauth_id", + "fields", ], "self": [ "website", @@ -200,6 +317,7 @@ class UserSchema(ma.ModelSchema): "id", "oauth_id", "password", + "fields", ], "admin": [ "website", @@ -217,6 +335,7 @@ class UserSchema(ma.ModelSchema): "password", "type", "verified", + "fields", ], } @@ -226,5 +345,6 @@ class UserSchema(ma.ModelSchema): kwargs["only"] = self.views[view] elif isinstance(view, list): kwargs["only"] = view + self.view = view super(UserSchema, self).__init__(*args, **kwargs) diff --git a/CTFd/themes/admin/assets/js/components/configs/fields/Field.vue b/CTFd/themes/admin/assets/js/components/configs/fields/Field.vue new file mode 100644 index 00000000..f02bea77 --- /dev/null +++ b/CTFd/themes/admin/assets/js/components/configs/fields/Field.vue @@ -0,0 +1,200 @@ + + + + + diff --git a/CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue b/CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue new file mode 100644 index 00000000..a6b655c9 --- /dev/null +++ b/CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue @@ -0,0 +1,80 @@ + + + diff --git a/CTFd/themes/admin/assets/js/pages/configs.js b/CTFd/themes/admin/assets/js/pages/configs.js index c8b63177..dd5ac87a 100644 --- a/CTFd/themes/admin/assets/js/pages/configs.js +++ b/CTFd/themes/admin/assets/js/pages/configs.js @@ -9,6 +9,8 @@ import $ from "jquery"; import { ezQuery, ezProgressBar, ezAlert } from "core/ezq"; import CodeMirror from "codemirror"; import "codemirror/mode/htmlmixed/htmlmixed.js"; +import Vue from "vue/dist/vue.esm.browser"; +import FieldList from "../components/configs/fields/FieldList.vue"; function loadTimestamp(place, timestamp) { if (typeof timestamp == "string") { @@ -360,4 +362,10 @@ $(() => { $("#mail_username_password").toggle(this.checked); }) .change(); + + // Insert CommentBox element + const fieldList = Vue.extend(FieldList); + let vueContainer = document.createElement("div"); + document.querySelector("#user-field-list").appendChild(vueContainer); + new fieldList({}).$mount(vueContainer); }); diff --git a/CTFd/themes/admin/assets/js/pages/user.js b/CTFd/themes/admin/assets/js/pages/user.js index 417289d7..bfd1b9a6 100644 --- a/CTFd/themes/admin/assets/js/pages/user.js +++ b/CTFd/themes/admin/assets/js/pages/user.js @@ -11,6 +11,19 @@ function createUser(event) { event.preventDefault(); const params = $("#user-info-create-form").serializeJSON(true); + params.fields = []; + + for (const property in params) { + if (property.match(/fields\[\d+\]/)) { + let field = {}; + let id = parseInt(property.slice(7, -1)); + field["field_id"] = id; + field["value"] = params[property]; + params.fields.push(field); + delete params[property]; + } + } + // Move the notify value into a GET param let url = "/api/v1/users"; let notify = params.notify; @@ -57,6 +70,19 @@ function updateUser(event) { event.preventDefault(); const params = $("#user-info-edit-form").serializeJSON(true); + params.fields = []; + + for (const property in params) { + if (property.match(/fields\[\d+\]/)) { + let field = {}; + let id = parseInt(property.slice(7, -1)); + field["field_id"] = id; + field["value"] = params[property]; + params.fields.push(field); + delete params[property]; + } + } + CTFd.fetch("/api/v1/users/" + window.USER_ID, { method: "PATCH", credentials: "same-origin", diff --git a/CTFd/themes/admin/static/js/components.dev.js b/CTFd/themes/admin/static/js/components.dev.js index 2667c603..39a8ef9a 100644 --- a/CTFd/themes/admin/static/js/components.dev.js +++ b/CTFd/themes/admin/static/js/components.dev.js @@ -48,6 +48,78 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod /***/ }), +/***/ "./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue": +/*!*************************************************************************!*\ + !*** ./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue ***! + \*************************************************************************/ +/*! no static exports found */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Field_vue_vue_type_template_id_30e0f744_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Field.vue?vue&type=template&id=30e0f744&scoped=true& */ \"./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?vue&type=template&id=30e0f744&scoped=true&\");\n/* harmony import */ var _Field_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Field.vue?vue&type=script&lang=js& */ \"./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?vue&type=script&lang=js&\");\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _Field_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__) if(__WEBPACK_IMPORT_KEY__ !== 'default') (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _Field_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(\n _Field_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n _Field_vue_vue_type_template_id_30e0f744_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n _Field_vue_vue_type_template_id_30e0f744_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n false,\n null,\n \"30e0f744\",\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"CTFd/themes/admin/assets/js/components/configs/fields/Field.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?"); + +/***/ }), + +/***/ "./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?vue&type=script&lang=js&": +/*!**************************************************************************************************!*\ + !*** ./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?vue&type=script&lang=js& ***! + \**************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_babel_loader_lib_index_js_ref_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Field_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../../../../node_modules/babel-loader/lib??ref--0!../../../../../../../../node_modules/vue-loader/lib??vue-loader-options!./Field.vue?vue&type=script&lang=js& */ \"./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?vue&type=script&lang=js&\");\n/* harmony import */ var _node_modules_babel_loader_lib_index_js_ref_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Field_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_babel_loader_lib_index_js_ref_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Field_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_babel_loader_lib_index_js_ref_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Field_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== 'default') (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_babel_loader_lib_index_js_ref_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Field_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_babel_loader_lib_index_js_ref_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Field_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0___default.a); \n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?"); + +/***/ }), + +/***/ "./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?vue&type=template&id=30e0f744&scoped=true&": +/*!********************************************************************************************************************!*\ + !*** ./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?vue&type=template&id=30e0f744&scoped=true& ***! + \********************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_Field_vue_vue_type_template_id_30e0f744_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../../../../../node_modules/vue-loader/lib??vue-loader-options!./Field.vue?vue&type=template&id=30e0f744&scoped=true& */ \"./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?vue&type=template&id=30e0f744&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_Field_vue_vue_type_template_id_30e0f744_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_Field_vue_vue_type_template_id_30e0f744_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?"); + +/***/ }), + +/***/ "./CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue": +/*!*****************************************************************************!*\ + !*** ./CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue ***! + \*****************************************************************************/ +/*! no static exports found */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _FieldList_vue_vue_type_template_id_4b8cc71c___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FieldList.vue?vue&type=template&id=4b8cc71c& */ \"./CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue?vue&type=template&id=4b8cc71c&\");\n/* harmony import */ var _FieldList_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FieldList.vue?vue&type=script&lang=js& */ \"./CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue?vue&type=script&lang=js&\");\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _FieldList_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__) if(__WEBPACK_IMPORT_KEY__ !== 'default') (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _FieldList_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../../../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(\n _FieldList_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n _FieldList_vue_vue_type_template_id_4b8cc71c___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n _FieldList_vue_vue_type_template_id_4b8cc71c___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue?"); + +/***/ }), + +/***/ "./CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue?vue&type=script&lang=js&": +/*!******************************************************************************************************!*\ + !*** ./CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue?vue&type=script&lang=js& ***! + \******************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_babel_loader_lib_index_js_ref_0_node_modules_vue_loader_lib_index_js_vue_loader_options_FieldList_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../../../../node_modules/babel-loader/lib??ref--0!../../../../../../../../node_modules/vue-loader/lib??vue-loader-options!./FieldList.vue?vue&type=script&lang=js& */ \"./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue?vue&type=script&lang=js&\");\n/* harmony import */ var _node_modules_babel_loader_lib_index_js_ref_0_node_modules_vue_loader_lib_index_js_vue_loader_options_FieldList_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_babel_loader_lib_index_js_ref_0_node_modules_vue_loader_lib_index_js_vue_loader_options_FieldList_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_babel_loader_lib_index_js_ref_0_node_modules_vue_loader_lib_index_js_vue_loader_options_FieldList_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== 'default') (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_babel_loader_lib_index_js_ref_0_node_modules_vue_loader_lib_index_js_vue_loader_options_FieldList_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_babel_loader_lib_index_js_ref_0_node_modules_vue_loader_lib_index_js_vue_loader_options_FieldList_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0___default.a); \n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue?"); + +/***/ }), + +/***/ "./CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue?vue&type=template&id=4b8cc71c&": +/*!************************************************************************************************************!*\ + !*** ./CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue?vue&type=template&id=4b8cc71c& ***! + \************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_FieldList_vue_vue_type_template_id_4b8cc71c___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../../../../../node_modules/vue-loader/lib??vue-loader-options!./FieldList.vue?vue&type=template&id=4b8cc71c& */ \"./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue?vue&type=template&id=4b8cc71c&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_FieldList_vue_vue_type_template_id_4b8cc71c___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_FieldList_vue_vue_type_template_id_4b8cc71c___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue?"); + +/***/ }), + /***/ "./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue": /*!***********************************************************************!*\ !*** ./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue ***! @@ -96,6 +168,30 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n /***/ }), +/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?vue&type=script&lang=js&": +/*!********************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/babel-loader/lib??ref--0!./node_modules/vue-loader/lib??vue-loader-options!./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?vue&type=script&lang=js& ***! + \********************************************************************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +; +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! core/CTFd */ \"./CTFd/themes/core/assets/js/CTFd.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\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nvar _default = {\n props: {\n index: Number,\n initialField: Object\n },\n data: function data() {\n return {\n field: this.initialField\n };\n },\n methods: {\n persistedField: function persistedField() {\n // We're using Math.random() for unique IDs so new items have IDs < 1\n // Real items will have an ID > 1\n return this.field.id >= 1;\n },\n saveField: function saveField() {\n var _this = this;\n\n var body = this.field;\n\n if (this.persistedField()) {\n _CTFd.default.fetch(\"/api/v1/configs/fields/\".concat(this.field.id), {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(body)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success === true) {\n _this.field = response.data;\n (0, _ezq.ezToast)({\n title: \"Success\",\n body: \"Field has been updated!\",\n delay: 1000\n });\n }\n });\n } else {\n _CTFd.default.fetch(\"/api/v1/configs/fields\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(body)\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success === true) {\n _this.field = response.data;\n (0, _ezq.ezToast)({\n title: \"Success\",\n body: \"Field has been created!\",\n delay: 1000\n });\n }\n });\n }\n },\n deleteField: function deleteField() {\n var _this2 = this;\n\n if (confirm(\"Are you sure you'd like to delete this field?\")) {\n if (this.persistedField()) {\n _CTFd.default.fetch(\"/api/v1/configs/fields/\".concat(this.field.id), {\n method: \"DELETE\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n }\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n if (response.success === true) {\n _this2.$emit(\"remove-field\", _this2.index);\n }\n });\n } else {\n this.$emit(\"remove-field\", this.index);\n }\n }\n }\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?./node_modules/babel-loader/lib??ref--0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue?vue&type=script&lang=js&": +/*!************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/babel-loader/lib??ref--0!./node_modules/vue-loader/lib??vue-loader-options!./CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue?vue&type=script&lang=js& ***! + \************************************************************************************************************************************************************************************************/ +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { + +; +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _CTFd = _interopRequireDefault(__webpack_require__(/*! core/CTFd */ \"./CTFd/themes/core/assets/js/CTFd.js\"));\n\nvar _Field = _interopRequireDefault(__webpack_require__(/*! ./Field.vue */ \"./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\nvar _default = {\n name: \"FieldList\",\n components: {\n Field: _Field.default\n },\n props: {},\n data: function data() {\n return {\n fields: []\n };\n },\n methods: {\n loadFields: function loadFields() {\n var _this = this;\n\n _CTFd.default.fetch(\"/api/v1/configs/fields?type=user\", {\n method: \"GET\",\n credentials: \"same-origin\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\"\n }\n }).then(function (response) {\n return response.json();\n }).then(function (response) {\n _this.fields = response.data;\n });\n },\n addField: function addField() {\n this.fields.push({\n id: Math.random(),\n type: \"user\",\n field_type: \"text\",\n name: \"\",\n description: \"\",\n editable: false,\n required: false,\n public: false\n });\n },\n removeField: function removeField(index) {\n this.fields.splice(index, 1);\n console.log(this.fields);\n }\n },\n created: function created() {\n this.loadFields();\n }\n};\nexports.default = _default;\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue?./node_modules/babel-loader/lib??ref--0!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + /***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue?vue&type=script&lang=js&": /*!******************************************************************************************************************************************************************************************!*\ !*** ./node_modules/babel-loader/lib??ref--0!./node_modules/vue-loader/lib??vue-loader-options!./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue?vue&type=script&lang=js& ***! @@ -131,6 +227,30 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ }), +/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?vue&type=template&id=30e0f744&scoped=true&": +/*!**************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?vue&type=template&id=30e0f744&scoped=true& ***! + \**************************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"border-bottom\" }, [\n _c(\"div\", [\n _c(\n \"button\",\n {\n staticClass: \"close float-right\",\n attrs: { type: \"button\", \"aria-label\": \"Close\" },\n on: {\n click: function($event) {\n return _vm.deleteField()\n }\n }\n },\n [_c(\"span\", { attrs: { \"aria-hidden\": \"true\" } }, [_vm._v(\"×\")])]\n )\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col-md-3\" }, [\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"label\", [_vm._v(\"Field Type\")]),\n _vm._v(\" \"),\n _c(\n \"select\",\n {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.field.field_type,\n expression: \"field.field_type\",\n modifiers: { lazy: true }\n }\n ],\n staticClass: \"form-control custom-select\",\n on: {\n change: function($event) {\n var $$selectedVal = Array.prototype.filter\n .call($event.target.options, function(o) {\n return o.selected\n })\n .map(function(o) {\n var val = \"_value\" in o ? o._value : o.value\n return val\n })\n _vm.$set(\n _vm.field,\n \"field_type\",\n $event.target.multiple ? $$selectedVal : $$selectedVal[0]\n )\n }\n }\n },\n [\n _c(\"option\", { attrs: { value: \"text\" } }, [\n _vm._v(\"Text Field\")\n ]),\n _vm._v(\" \"),\n _c(\"option\", { attrs: { value: \"checkbox\" } }, [\n _vm._v(\"Checkbox\")\n ])\n ]\n ),\n _vm._v(\" \"),\n _c(\"small\", { staticClass: \"form-text text-muted\" }, [\n _vm._v(\"Type of field shown to the user\")\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-9\" }, [\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"label\", [_vm._v(\"Field Name\")]),\n _vm._v(\" \"),\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.field.name,\n expression: \"field.name\",\n modifiers: { lazy: true }\n }\n ],\n staticClass: \"form-control\",\n attrs: { type: \"text\" },\n domProps: { value: _vm.field.name },\n on: {\n change: function($event) {\n return _vm.$set(_vm.field, \"name\", $event.target.value)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\"small\", { staticClass: \"form-text text-muted\" }, [\n _vm._v(\"Field name\")\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"form-group\" }, [\n _c(\"label\", [_vm._v(\"Field Description\")]),\n _vm._v(\" \"),\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.field.description,\n expression: \"field.description\",\n modifiers: { lazy: true }\n }\n ],\n staticClass: \"form-control\",\n attrs: { type: \"text\" },\n domProps: { value: _vm.field.description },\n on: {\n change: function($event) {\n return _vm.$set(_vm.field, \"description\", $event.target.value)\n }\n }\n }),\n _vm._v(\" \"),\n _c(\n \"small\",\n { staticClass: \"form-text text-muted\", attrs: { id: \"emailHelp\" } },\n [_vm._v(\"Field Description\")]\n )\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"form-check\" }, [\n _c(\"label\", { staticClass: \"form-check-label\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.field.editable,\n expression: \"field.editable\",\n modifiers: { lazy: true }\n }\n ],\n staticClass: \"form-check-input\",\n attrs: { type: \"checkbox\" },\n domProps: {\n checked: Array.isArray(_vm.field.editable)\n ? _vm._i(_vm.field.editable, null) > -1\n : _vm.field.editable\n },\n on: {\n change: function($event) {\n var $$a = _vm.field.editable,\n $$el = $event.target,\n $$c = $$el.checked ? true : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n _vm.$set(_vm.field, \"editable\", $$a.concat([$$v]))\n } else {\n $$i > -1 &&\n _vm.$set(\n _vm.field,\n \"editable\",\n $$a.slice(0, $$i).concat($$a.slice($$i + 1))\n )\n }\n } else {\n _vm.$set(_vm.field, \"editable\", $$c)\n }\n }\n }\n }),\n _vm._v(\"\\n Editable by user in profile\\n \")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-check\" }, [\n _c(\"label\", { staticClass: \"form-check-label\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.field.required,\n expression: \"field.required\",\n modifiers: { lazy: true }\n }\n ],\n staticClass: \"form-check-input\",\n attrs: { type: \"checkbox\" },\n domProps: {\n checked: Array.isArray(_vm.field.required)\n ? _vm._i(_vm.field.required, null) > -1\n : _vm.field.required\n },\n on: {\n change: function($event) {\n var $$a = _vm.field.required,\n $$el = $event.target,\n $$c = $$el.checked ? true : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n _vm.$set(_vm.field, \"required\", $$a.concat([$$v]))\n } else {\n $$i > -1 &&\n _vm.$set(\n _vm.field,\n \"required\",\n $$a.slice(0, $$i).concat($$a.slice($$i + 1))\n )\n }\n } else {\n _vm.$set(_vm.field, \"required\", $$c)\n }\n }\n }\n }),\n _vm._v(\"\\n Required on registration\\n \")\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"form-check\" }, [\n _c(\"label\", { staticClass: \"form-check-label\" }, [\n _c(\"input\", {\n directives: [\n {\n name: \"model\",\n rawName: \"v-model.lazy\",\n value: _vm.field.public,\n expression: \"field.public\",\n modifiers: { lazy: true }\n }\n ],\n staticClass: \"form-check-input\",\n attrs: { type: \"checkbox\" },\n domProps: {\n checked: Array.isArray(_vm.field.public)\n ? _vm._i(_vm.field.public, null) > -1\n : _vm.field.public\n },\n on: {\n change: function($event) {\n var $$a = _vm.field.public,\n $$el = $event.target,\n $$c = $$el.checked ? true : false\n if (Array.isArray($$a)) {\n var $$v = null,\n $$i = _vm._i($$a, $$v)\n if ($$el.checked) {\n $$i < 0 &&\n _vm.$set(_vm.field, \"public\", $$a.concat([$$v]))\n } else {\n $$i > -1 &&\n _vm.$set(\n _vm.field,\n \"public\",\n $$a.slice(0, $$i).concat($$a.slice($$i + 1))\n )\n }\n } else {\n _vm.$set(_vm.field, \"public\", $$c)\n }\n }\n }\n }),\n _vm._v(\"\\n Shown on public profile\\n \")\n ])\n ])\n ])\n ]),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row pb-3\" }, [\n _c(\"div\", { staticClass: \"col-md-12\" }, [\n _c(\"div\", { staticClass: \"d-block\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-sm btn-success btn-outlined float-right\",\n attrs: { type: \"button\" },\n on: {\n click: function($event) {\n return _vm.saveField()\n }\n }\n },\n [_vm._v(\"\\n Save\\n \")]\n )\n ])\n ])\n ])\n ])\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + +/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue?vue&type=template&id=4b8cc71c&": +/*!******************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue?vue&type=template&id=4b8cc71c& ***! + \******************************************************************************************************************************************************************************************************************************************/ +/*! exports provided: render, staticRenderFns */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n [\n _vm._l(_vm.fields, function(field, index) {\n return _c(\n \"div\",\n { key: field.id, staticClass: \"mb-5\" },\n [\n _c(\"Field\", {\n attrs: { index: index, initialField: _vm.fields[index] },\n on: {\n \"update:initialField\": function($event) {\n return _vm.$set(_vm.fields, index, $event)\n },\n \"update:initial-field\": function($event) {\n return _vm.$set(_vm.fields, index, $event)\n },\n \"remove-field\": _vm.removeField\n }\n })\n ],\n 1\n )\n }),\n _vm._v(\" \"),\n _c(\"div\", { staticClass: \"row\" }, [\n _c(\"div\", { staticClass: \"col text-center\" }, [\n _c(\n \"button\",\n {\n staticClass: \"btn btn-sm btn-success btn-outlined m-auto\",\n attrs: { type: \"button\" },\n on: {\n click: function($event) {\n return _vm.addField()\n }\n }\n },\n [_vm._v(\"\\n Add New Field\\n \")]\n )\n ])\n ])\n ],\n 2\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./CTFd/themes/admin/assets/js/components/configs/fields/FieldList.vue?./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options"); + +/***/ }), + /***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue?vue&type=template&id=50f8d42a&": /*!************************************************************************************************************************************************************************************************************************************!*\ !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue?vue&type=template&id=50f8d42a& ***! diff --git a/CTFd/themes/admin/static/js/components.min.js b/CTFd/themes/admin/static/js/components.min.js index 0d4ed53c..f8fca7d3 100644 --- a/CTFd/themes/admin/static/js/components.min.js +++ b/CTFd/themes/admin/static/js/components.min.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],{"./CTFd/themes/admin/assets/js/components/comments/CommentBox.vue":function(e,t,s){s.r(t);var a=s("./CTFd/themes/admin/assets/js/components/comments/CommentBox.vue?vue&type=template&id=1fd2c08a&scoped=true&"),i=s("./CTFd/themes/admin/assets/js/components/comments/CommentBox.vue?vue&type=script&lang=js&");for(var n in i)"default"!==n&&function(e){s.d(t,e,function(){return i[e]})}(n);s("./CTFd/themes/admin/assets/js/components/comments/CommentBox.vue?vue&type=style&index=0&id=1fd2c08a&scoped=true&lang=css&");var o=s("./node_modules/vue-loader/lib/runtime/componentNormalizer.js"),l=Object(o.a)(i.default,a.a,a.b,!1,null,"1fd2c08a",null);l.options.__file="CTFd/themes/admin/assets/js/components/comments/CommentBox.vue",t.default=l.exports},"./CTFd/themes/admin/assets/js/components/comments/CommentBox.vue?vue&type=script&lang=js&":function(e,t,s){s.r(t);var a=s("./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./CTFd/themes/admin/assets/js/components/comments/CommentBox.vue?vue&type=script&lang=js&"),i=s.n(a);for(var n in a)"default"!==n&&function(e){s.d(t,e,function(){return a[e]})}(n);t.default=i.a},"./CTFd/themes/admin/assets/js/components/comments/CommentBox.vue?vue&type=style&index=0&id=1fd2c08a&scoped=true&lang=css&":function(e,t,s){var a=s("./node_modules/vue-style-loader/index.js!./node_modules/css-loader/dist/cjs.js!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/vue-loader/lib/index.js?!./CTFd/themes/admin/assets/js/components/comments/CommentBox.vue?vue&type=style&index=0&id=1fd2c08a&scoped=true&lang=css&");s.n(a).a},"./CTFd/themes/admin/assets/js/components/comments/CommentBox.vue?vue&type=template&id=1fd2c08a&scoped=true&":function(e,t,s){function a(){var s=this,e=s.$createElement,a=s._self._c||e;return a("div",[a("div",{staticClass:"row mb-3"},[a("div",{staticClass:"col-md-12"},[a("div",{staticClass:"comment"},[a("textarea",{directives:[{name:"model",rawName:"v-model.lazy",value:s.comment,expression:"comment",modifiers:{lazy:!0}}],staticClass:"form-control mb-2",attrs:{rows:"2",id:"comment-input",placeholder:"Add comment"},domProps:{value:s.comment},on:{change:function(e){s.comment=e.target.value}}}),s._v(" "),a("button",{staticClass:"btn btn-sm btn-success btn-outlined float-right",attrs:{type:"submit"},on:{click:function(e){return s.submitComment()}}},[s._v("\n Comment\n ")])])])]),s._v(" "),1>>\n ")])])]),s._v(" "),a("div",{staticClass:"col-md-12"},[a("div",{staticClass:"text-center"},[a("small",{staticClass:"text-muted"},[s._v("Page "+s._s(s.page)+" of "+s._s(s.total)+" comments")])])])]):s._e(),s._v(" "),a("div",{staticClass:"comments"},[a("transition-group",{attrs:{name:"comment-card"}},s._l(s.comments,function(t){return a("div",{key:t.id,staticClass:"comment-card card mb-2"},[a("div",{staticClass:"card-body pl-0 pb-0 pt-2 pr-2"},[a("button",{staticClass:"close float-right",attrs:{type:"button","aria-label":"Close"},on:{click:function(e){return s.deleteComment(t.id)}}},[a("span",{attrs:{"aria-hidden":"true"}},[s._v("×")])])]),s._v(" "),a("div",{staticClass:"card-body"},[a("div",{staticClass:"card-text",domProps:{innerHTML:s._s(t.html)}}),s._v(" "),a("small",{staticClass:"text-muted float-left"},[a("span",[a("a",{attrs:{href:s.urlRoot+"/admin/users/"+t.author_id}},[s._v(s._s(t.author.name))])])]),s._v(" "),a("small",{staticClass:"text-muted float-right"},[a("span",{staticClass:"float-right"},[s._v(s._s(s.toLocalTime(t.date)))])])])])}),0)],1),s._v(" "),1>>\n ")])])]),s._v(" "),a("div",{staticClass:"col-md-12"},[a("div",{staticClass:"text-center"},[a("small",{staticClass:"text-muted"},[s._v("Page "+s._s(s.page)+" of "+s._s(s.total)+" comments")])])])]):s._e()])}var i=[];a._withStripped=!0,s.d(t,"a",function(){return a}),s.d(t,"b",function(){return i})},"./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue":function(e,t,s){s.r(t);var a=s("./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue?vue&type=template&id=50f8d42a&"),i=s("./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue?vue&type=script&lang=js&");for(var n in i)"default"!==n&&function(e){s.d(t,e,function(){return i[e]})}(n);var o=s("./node_modules/vue-loader/lib/runtime/componentNormalizer.js"),l=Object(o.a)(i.default,a.a,a.b,!1,null,null,null);l.options.__file="CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue",t.default=l.exports},"./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue?vue&type=script&lang=js&":function(e,t,s){s.r(t);var a=s("./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue?vue&type=script&lang=js&"),i=s.n(a);for(var n in a)"default"!==n&&function(e){s.d(t,e,function(){return a[e]})}(n);t.default=i.a},"./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue?vue&type=template&id=50f8d42a&":function(e,t,s){function a(){var s=this,e=s.$createElement,a=s._self._c||e;return a("div",{staticClass:"modal fade",attrs:{id:"media-modal",tabindex:"-1"}},[a("div",{staticClass:"modal-dialog modal-lg"},[a("div",{staticClass:"modal-content"},[s._m(0),s._v(" "),a("div",{staticClass:"modal-body"},[a("div",{staticClass:"modal-header"},[a("div",{staticClass:"container"},[a("div",{staticClass:"row mh-100"},[a("div",{staticClass:"col-md-6",attrs:{id:"media-library-list"}},s._l(s.files,function(t){return a("div",{key:t.id,staticClass:"media-item-wrapper"},[a("a",{attrs:{href:"javascript:void(0)"},on:{click:function(e){return s.selectFile(t),!1}}},[a("i",{class:s.getIconClass(t.location),attrs:{"aria-hidden":"true"}}),s._v(" "),a("small",{staticClass:"media-item-title"},[s._v(s._s(t.location.split("/").pop()))])])])}),0),s._v(" "),a("div",{staticClass:"col-md-6",attrs:{id:"media-library-details"}},[a("h4",{staticClass:"text-center"},[s._v("Media Details")]),s._v(" "),a("div",{attrs:{id:"media-item"}},[a("div",{staticClass:"text-center",attrs:{id:"media-icon"}},[this.selectedFile?a("div",["far fa-file-image"===s.getIconClass(this.selectedFile.location)?a("div",[a("img",{staticStyle:{"max-width":"100%","max-height":"100%","object-fit":"contain"},attrs:{src:s.buildSelectedFileUrl()}})]):a("div",[a("i",{class:s.getIconClass(this.selectedFile.location)+" fa-4x",attrs:{"aria-hidden":"true"}})])]):s._e()]),s._v(" "),a("br"),s._v(" "),this.selectedFile?a("div",{staticClass:"text-center",attrs:{id:"media-filename"}},[a("a",{attrs:{href:s.buildSelectedFileUrl(),target:"_blank"}},[s._v("\n "+s._s(this.selectedFile.location.split("/").pop())+"\n ")])]):s._e(),s._v(" "),a("br"),s._v(" "),a("div",{staticClass:"form-group"},[this.selectedFile?a("div",[s._v("\n Link:\n "),a("input",{staticClass:"form-control",attrs:{type:"text",id:"media-link",readonly:""},domProps:{value:s.buildSelectedFileUrl()}})]):a("div",[s._v("\n Link:\n "),a("input",{staticClass:"form-control",attrs:{type:"text",id:"media-link",readonly:""}})])]),s._v(" "),a("div",{staticClass:"form-group text-center"},[a("div",{staticClass:"row"},[a("div",{staticClass:"col-md-6"},[a("button",{staticClass:"btn btn-success w-100",attrs:{id:"media-insert","data-toggle":"tooltip","data-placement":"top",title:"Insert link into editor"},on:{click:s.insertSelectedFile}},[s._v("\n Insert\n ")])]),s._v(" "),a("div",{staticClass:"col-md-3"},[a("button",{staticClass:"btn btn-primary w-100",attrs:{id:"media-download","data-toggle":"tooltip","data-placement":"top",title:"Download file"},on:{click:s.downloadSelectedFile}},[a("i",{staticClass:"fas fa-download"})])]),s._v(" "),a("div",{staticClass:"col-md-3"},[a("button",{staticClass:"btn btn-danger w-100",attrs:{id:"media-delete","data-toggle":"tooltip","data-placement":"top",title:"Delete file"},on:{click:s.deleteSelectedFile}},[a("i",{staticClass:"far fa-trash-alt"})])])])])])])])])]),s._v(" "),s._m(1)]),s._v(" "),a("div",{staticClass:"modal-footer"},[a("div",{staticClass:"float-right"},[a("button",{staticClass:"btn btn-primary media-upload-button",attrs:{type:"submit"},on:{click:s.uploadChosenFiles}},[s._v("\n Upload\n ")])])])])])])}var i=[function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"modal-header"},[s("div",{staticClass:"container"},[s("div",{staticClass:"row"},[s("div",{staticClass:"col-md-12"},[s("h3",{staticClass:"text-center"},[e._v("Media Library")])])])]),e._v(" "),s("button",{staticClass:"close",attrs:{type:"button","data-dismiss":"modal","aria-label":"Close"}},[s("span",{attrs:{"aria-hidden":"true"}},[e._v("×")])])])},function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("form",{attrs:{id:"media-library-upload",enctype:"multipart/form-data"}},[s("div",{staticClass:"form-group"},[s("label",{attrs:{for:"media-files"}},[e._v("\n Upload Files\n ")]),e._v(" "),s("input",{staticClass:"form-control-file",attrs:{type:"file",name:"file",id:"media-files",multiple:""}}),e._v(" "),s("sub",{staticClass:"help-block"},[e._v("\n Attach multiple files using Control+Click or Cmd+Click.\n ")])]),e._v(" "),s("input",{attrs:{type:"hidden",value:"page",name:"type"}})])}];a._withStripped=!0,s.d(t,"a",function(){return a}),s.d(t,"b",function(){return i})},"./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./CTFd/themes/admin/assets/js/components/comments/CommentBox.vue?vue&type=script&lang=js&":function(e,t,s){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var a=o(s("./CTFd/themes/core/assets/js/CTFd.js")),i=o(s("./CTFd/themes/core/assets/js/helpers.js")),n=o(s("./node_modules/moment/moment.js"));function o(e){return e&&e.__esModule?e:{default:e}}var l={props:{type:String,id:Number},data:function(){return{page:1,pages:null,next:null,prev:null,total:null,comment:"",comments:[],urlRoot:a.default.config.urlRoot}},methods:{toLocalTime:function(e){return(0,n.default)(e).local().format("MMMM Do, h:mm:ss A")},nextPage:function(){this.page++,this.loadComments()},prevPage:function(){this.page--,this.loadComments()},getArgs:function(){var e={};return e["".concat(this.$props.type,"_id")]=this.$props.id,e},loadComments:function(){var t=this,e=this.getArgs();e.page=this.page,e.per_page=10,i.default.comments.get_comments(e).then(function(e){return t.page=e.meta.pagination.page,t.pages=e.meta.pagination.pages,t.next=e.meta.pagination.next,t.prev=e.meta.pagination.prev,t.total=e.meta.pagination.total,t.comments=e.data,t.comments})},submitComment:function(){var e=this,t=this.comment.trim();0>>\n ")])])]),s._v(" "),i("div",{staticClass:"col-md-12"},[i("div",{staticClass:"text-center"},[i("small",{staticClass:"text-muted"},[s._v("Page "+s._s(s.page)+" of "+s._s(s.total)+" comments")])])])]):s._e(),s._v(" "),i("div",{staticClass:"comments"},[i("transition-group",{attrs:{name:"comment-card"}},s._l(s.comments,function(t){return i("div",{key:t.id,staticClass:"comment-card card mb-2"},[i("div",{staticClass:"card-body pl-0 pb-0 pt-2 pr-2"},[i("button",{staticClass:"close float-right",attrs:{type:"button","aria-label":"Close"},on:{click:function(e){return s.deleteComment(t.id)}}},[i("span",{attrs:{"aria-hidden":"true"}},[s._v("×")])])]),s._v(" "),i("div",{staticClass:"card-body"},[i("div",{staticClass:"card-text",domProps:{innerHTML:s._s(t.html)}}),s._v(" "),i("small",{staticClass:"text-muted float-left"},[i("span",[i("a",{attrs:{href:s.urlRoot+"/admin/users/"+t.author_id}},[s._v(s._s(t.author.name))])])]),s._v(" "),i("small",{staticClass:"text-muted float-right"},[i("span",{staticClass:"float-right"},[s._v(s._s(s.toLocalTime(t.date)))])])])])}),0)],1),s._v(" "),1>>\n ")])])]),s._v(" "),i("div",{staticClass:"col-md-12"},[i("div",{staticClass:"text-center"},[i("small",{staticClass:"text-muted"},[s._v("Page "+s._s(s.page)+" of "+s._s(s.total)+" comments")])])])]):s._e()])}var a=[];i._withStripped=!0,s.d(t,"a",function(){return i}),s.d(t,"b",function(){return a})},"./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue":function(e,t,s){s.r(t);var i=s("./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?vue&type=template&id=30e0f744&scoped=true&"),a=s("./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?vue&type=script&lang=js&");for(var n in a)"default"!==n&&function(e){s.d(t,e,function(){return a[e]})}(n);var l=s("./node_modules/vue-loader/lib/runtime/componentNormalizer.js"),o=Object(l.a)(a.default,i.a,i.b,!1,null,"30e0f744",null);o.options.__file="CTFd/themes/admin/assets/js/components/configs/fields/Field.vue",t.default=o.exports},"./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?vue&type=script&lang=js&":function(e,t,s){s.r(t);var i=s("./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?vue&type=script&lang=js&"),a=s.n(i);for(var n in i)"default"!==n&&function(e){s.d(t,e,function(){return i[e]})}(n);t.default=a.a},"./CTFd/themes/admin/assets/js/components/configs/fields/Field.vue?vue&type=template&id=30e0f744&scoped=true&":function(e,t,s){function i(){var n=this,e=n.$createElement,t=n._self._c||e;return t("div",{staticClass:"border-bottom"},[t("div",[t("button",{staticClass:"close float-right",attrs:{type:"button","aria-label":"Close"},on:{click:function(e){return n.deleteField()}}},[t("span",{attrs:{"aria-hidden":"true"}},[n._v("×")])])]),n._v(" "),t("div",{staticClass:"row"},[t("div",{staticClass:"col-md-3"},[t("div",{staticClass:"form-group"},[t("label",[n._v("Field Type")]),n._v(" "),t("select",{directives:[{name:"model",rawName:"v-model.lazy",value:n.field.field_type,expression:"field.field_type",modifiers:{lazy:!0}}],staticClass:"form-control custom-select",on:{change:function(e){var t=Array.prototype.filter.call(e.target.options,function(e){return e.selected}).map(function(e){return"_value"in e?e._value:e.value});n.$set(n.field,"field_type",e.target.multiple?t:t[0])}}},[t("option",{attrs:{value:"text"}},[n._v("Text Field")]),n._v(" "),t("option",{attrs:{value:"checkbox"}},[n._v("Checkbox")])]),n._v(" "),t("small",{staticClass:"form-text text-muted"},[n._v("Type of field shown to the user")])])]),n._v(" "),t("div",{staticClass:"col-md-9"},[t("div",{staticClass:"form-group"},[t("label",[n._v("Field Name")]),n._v(" "),t("input",{directives:[{name:"model",rawName:"v-model.lazy",value:n.field.name,expression:"field.name",modifiers:{lazy:!0}}],staticClass:"form-control",attrs:{type:"text"},domProps:{value:n.field.name},on:{change:function(e){return n.$set(n.field,"name",e.target.value)}}}),n._v(" "),t("small",{staticClass:"form-text text-muted"},[n._v("Field name")])])]),n._v(" "),t("div",{staticClass:"col-md-12"},[t("div",{staticClass:"form-group"},[t("label",[n._v("Field Description")]),n._v(" "),t("input",{directives:[{name:"model",rawName:"v-model.lazy",value:n.field.description,expression:"field.description",modifiers:{lazy:!0}}],staticClass:"form-control",attrs:{type:"text"},domProps:{value:n.field.description},on:{change:function(e){return n.$set(n.field,"description",e.target.value)}}}),n._v(" "),t("small",{staticClass:"form-text text-muted",attrs:{id:"emailHelp"}},[n._v("Field Description")])])]),n._v(" "),t("div",{staticClass:"col-md-12"},[t("div",{staticClass:"form-check"},[t("label",{staticClass:"form-check-label"},[t("input",{directives:[{name:"model",rawName:"v-model.lazy",value:n.field.editable,expression:"field.editable",modifiers:{lazy:!0}}],staticClass:"form-check-input",attrs:{type:"checkbox"},domProps:{checked:Array.isArray(n.field.editable)?-1> _i * 4 & 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 * 4 & 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/admin/static/js/pages/challenge.min.js b/CTFd/themes/admin/static/js/pages/challenge.min.js index 42e7fc34..840a5f38 100644 --- a/CTFd/themes/admin/static/js/pages/challenge.min.js +++ b/CTFd/themes/admin/static/js/pages/challenge.min.js @@ -1 +1 @@ -!function(d){function e(e){for(var t,o,n=e[0],a=e[1],s=e[2],i=0,l=[];i -- ");for(var a in o.append(n),t)t.hasOwnProperty(a)&&(n=(0,s.default)("".format(a,t[a].name)),o.append(n));(0,s.default)("#flag-edit-modal").modal()}),(0,s.default)("#flag-edit-modal form").submit(function(e){e.preventDefault();var t=(0,s.default)(this).serializeJSON(!0);t.challenge=window.CHALLENGE_ID,i.default.fetch("/api/v1/flags",{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)}).then(function(e){return e.json()}).then(function(e){window.location.reload()})}),(0,s.default)("#flag-edit-modal").modal()},t.editFlagModal=function(e){e.preventDefault();var n=(0,s.default)(this).attr("flag-id"),a=(0,s.default)(this).parent().parent();s.default.get(i.default.config.urlRoot+"/api/v1/flags/"+n,function(e){var o=e.data;s.default.get(i.default.config.urlRoot+o.templates.update,function(e){(0,s.default)("#edit-flags form").empty(),(0,s.default)("#edit-flags form").off();var t=l.default.compile(e);(0,s.default)("#edit-flags form").append(t.render(o)),(0,s.default)("#edit-flags form").submit(function(e){e.preventDefault();var t=(0,s.default)("#edit-flags form").serializeJSON();i.default.fetch("/api/v1/flags/"+n,{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(e){e.success&&((0,s.default)(a).find(".flag-content").text(e.data.content),(0,s.default)("#edit-flags").modal("toggle"))})}),(0,s.default)("#edit-flags").modal()})})},t.flagTypeSelect=function(e){e.preventDefault();var t=(0,s.default)(this).find("option:selected").text();s.default.get(i.default.config.urlRoot+"/api/v1/flags/types/"+t,function(e){var t=e.data;s.default.get(i.default.config.urlRoot+t.templates.create,function(e){var t=l.default.compile(e);(0,s.default)("#create-keys-entry-div").html(t.render()),(0,s.default)("#create-keys-button-div").show()})})};var s=a(o("./node_modules/jquery/dist/jquery.js")),i=a(o("./CTFd/themes/core/assets/js/CTFd.js")),l=a(o("./node_modules/nunjucks/browser/nunjucks.js")),n=o("./CTFd/themes/core/assets/js/ezq.js");function a(e){return e&&e.__esModule?e:{default:e}}},"./CTFd/themes/admin/assets/js/challenges/hints.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.showHintModal=function(e){e.preventDefault(),(0,a.default)("#hint-edit-modal form").find("input, textarea").val("").trigger("change"),(0,a.default)("#hint-edit-form textarea").each(function(e,t){t.hasOwnProperty("codemirror")&&t.codemirror.refresh()}),(0,a.default)("#hint-edit-modal").modal()},t.showEditHintModal=function(e){e.preventDefault();var t=(0,a.default)(this).attr("hint-id");s.default.fetch("/api/v1/hints/"+t+"?preview=true",{method:"GET",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"}}).then(function(e){return e.json()}).then(function(e){e.success&&((0,a.default)("#hint-edit-form input[name=content],textarea[name=content]").val(e.data.content).trigger("change"),(0,a.default)("#hint-edit-modal").on("shown.bs.modal",function(){(0,a.default)("#hint-edit-form textarea").each(function(e,t){t.hasOwnProperty("codemirror")&&t.codemirror.refresh()})}).on("hide.bs.modal",function(){(0,a.default)("#hint-edit-form textarea").each(function(e,t){(0,a.default)(t).val("").trigger("change"),t.hasOwnProperty("codemirror")&&t.codemirror.refresh()})}),(0,a.default)("#hint-edit-form input[name=cost]").val(e.data.cost),(0,a.default)("#hint-edit-form input[name=id]").val(e.data.id),(0,a.default)("#hint-edit-modal").modal())})},t.deleteHint=function(e){e.preventDefault();var t=(0,a.default)(this).attr("hint-id"),o=(0,a.default)(this).parent().parent();(0,n.ezQuery)({title:"Delete Hint",body:"Are you sure you want to delete this hint?",success:function(){s.default.fetch("/api/v1/hints/"+t,{method:"DELETE"}).then(function(e){return e.json()}).then(function(e){e.success&&o.remove()})}})},t.editHint=function(e){e.preventDefault();var t=(0,a.default)(this).serializeJSON(!0);t.challenge=window.CHALLENGE_ID;var o="POST",n="/api/v1/hints";t.id&&(o="PATCH",n="/api/v1/hints/"+t.id);s.default.fetch(n,{method:o,credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)}).then(function(e){return e.json()}).then(function(e){e.success&&window.location.reload()})};var a=i(o("./node_modules/jquery/dist/jquery.js")),s=i(o("./CTFd/themes/core/assets/js/CTFd.js")),n=o("./CTFd/themes/core/assets/js/ezq.js");function i(e){return e&&e.__esModule?e:{default:e}}},"./CTFd/themes/admin/assets/js/challenges/requirements.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.addRequirement=function(e){e.preventDefault();var t=(0,a.default)("#prerequisite-add-form").serializeJSON();if(!t.prerequisite)return;window.CHALLENGE_REQUIREMENTS.prerequisites.push(parseInt(t.prerequisite));var o={requirements:window.CHALLENGE_REQUIREMENTS};s.default.fetch("/api/v1/challenges/"+window.CHALLENGE_ID,{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(o)}).then(function(e){return e.json()}).then(function(e){e.success&&window.location.reload()})},t.deleteRequirement=function(e){var t=(0,a.default)(this).attr("challenge-id"),o=(0,a.default)(this).parent().parent();window.CHALLENGE_REQUIREMENTS.prerequisites.pop(t);var n={requirements:window.CHALLENGE_REQUIREMENTS};s.default.fetch("/api/v1/challenges/"+window.CHALLENGE_ID,{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(n)}).then(function(e){return e.json()}).then(function(e){e.success&&o.remove()})};var a=n(o("./node_modules/jquery/dist/jquery.js")),s=n(o("./CTFd/themes/core/assets/js/CTFd.js"));function n(e){return e&&e.__esModule?e:{default:e}}},"./CTFd/themes/admin/assets/js/challenges/tags.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.deleteTag=i,t.addTag=function(e){if(13!=e.keyCode)return;var t=(0,n.default)(this),o={value:t.val(),challenge:window.CHALLENGE_ID};a.default.api.post_tag_list({},o).then(function(e){if(e.success){var t=(0,n.default)("{0}×".format(e.data.value,e.data.id));(0,n.default)("#challenge-tags").append(t),t.click(i)}}),t.val("")};var n=s(o("./node_modules/jquery/dist/jquery.js")),a=s(o("./CTFd/themes/core/assets/js/CTFd.js"));function s(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=(0,n.default)(this),o=t.attr("tag-id");a.default.api.delete_tag({tagId:o}).then(function(e){e.success&&t.parent().remove()})}},"./CTFd/themes/admin/assets/js/pages/challenge.js":function(e,t,o){o("./CTFd/themes/admin/assets/js/pages/main.js");var n=o("./CTFd/themes/core/assets/js/utils.js"),i=j(o("./node_modules/jquery/dist/jquery.js"));o("./node_modules/bootstrap/js/dist/tab.js");var l=j(o("./CTFd/themes/core/assets/js/CTFd.js")),a=o("./CTFd/themes/core/assets/js/ezq.js"),d=j(o("./CTFd/themes/core/assets/js/helpers.js")),s=o("./CTFd/themes/admin/assets/js/challenges/files.js"),r=o("./CTFd/themes/admin/assets/js/challenges/tags.js"),c=o("./CTFd/themes/admin/assets/js/challenges/requirements.js"),u=o("./CTFd/themes/admin/assets/js/styles.js"),m=j(o("./node_modules/vue/dist/vue.esm.browser.js")),p=j(o("./CTFd/themes/admin/assets/js/components/comments/CommentBox.vue")),f=o("./CTFd/themes/admin/assets/js/challenges/hints.js"),h=o("./CTFd/themes/admin/assets/js/challenges/flags.js");function j(e){return e&&e.__esModule?e:{default:e}}function g(e){l.default.api.get_hint({hintId:e,preview:!0}).then(function(e){e.data.content&&function(e){(0,a.ezAlert)({title:"Hint",body:e.html,button:"Got it!"})}(e.data)})}function _(e,t){var o=e.data,n=(0,i.default)("#result-message"),a=(0,i.default)("#result-notification"),s=(0,i.default)("#submission-input");a.removeClass(),n.text(o.message),"authentication_required"!==o.status?("incorrect"===o.status?(a.addClass("alert alert-danger alert-dismissable text-center"),a.slideDown(),s.removeClass("correct"),s.addClass("wrong"),setTimeout(function(){s.removeClass("wrong")},3e3)):"correct"===o.status?(a.addClass("alert alert-success alert-dismissable text-center"),a.slideDown(),(0,i.default)(".challenge-solves").text(parseInt((0,i.default)(".challenge-solves").text().split(" ")[0])+1+" Solves"),s.val(""),s.removeClass("wrong"),s.addClass("correct")):"already_solved"===o.status?(a.addClass("alert alert-info alert-dismissable text-center"),a.slideDown(),s.addClass("correct")):"paused"===o.status?(a.addClass("alert alert-warning alert-dismissable text-center"),a.slideDown()):"ratelimited"===o.status&&(a.addClass("alert alert-warning alert-dismissable text-center"),a.slideDown(),s.addClass("too-fast"),setTimeout(function(){s.removeClass("too-fast")},3e3)),setTimeout(function(){(0,i.default)(".alert").slideUp(),(0,i.default)("#challenge-submit").removeClass("disabled-button"),(0,i.default)("#challenge-submit").prop("disabled",!1)},3e3),t&&t(o)):window.location=l.default.config.urlRoot+"/login?next="+l.default.config.urlRoot+window.location.pathname+window.location.hash}function v(t){l.default._internal.challenge={},i.default.getScript(l.default.config.urlRoot+t.scripts.view,function(){var e=t.create;(0,i.default)("#create-chal-entry-div").html(e),(0,u.bindMarkdownEditors)(),i.default.getScript(l.default.config.urlRoot+t.scripts.create,function(){(0,i.default)("#create-chal-entry-div form").submit(function(e){e.preventDefault();var t=(0,i.default)("#create-chal-entry-div form").serializeJSON();l.default.fetch("/api/v1/challenges",{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)}).then(function(e){return e.json()}).then(function(e){e.success&&((0,i.default)("#challenge-create-options #challenge_id").val(e.data.id),(0,i.default)("#challenge-create-options").modal())})})})})}function y(a){a.preventDefault();var s=(0,i.default)(a.target).serializeJSON(!0),o={challenge_id:s.challenge_id,content:s.flag||"",type:s.flag_type,data:s.flag_data?s.flag_data:""};Promise.all([new Promise(function(t,e){0!=o.content.length?l.default.fetch("/api/v1/flags",{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(o)}).then(function(e){t(e.json())}):t()}),new Promise(function(e,t){var o=a.target,n={challenge:s.challenge_id,type:"challenge"};(0,i.default)(o.elements.file).val()&&d.default.files.upload(o,n),e()})]).then(function(e){l.default.fetch("/api/v1/challenges/"+s.challenge_id,{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({state:s.state})}).then(function(e){return e.json()}).then(function(e){e.success&&setTimeout(function(){window.location=l.default.config.urlRoot+"/admin/challenges/"+s.challenge_id},700)})})}(0,i.default)(function(){(0,i.default)(".preview-challenge").click(function(e){l.default._internal.challenge={},i.default.get(l.default.config.urlRoot+"/api/v1/challenges/"+window.CHALLENGE_ID,function(t){var o=t.data;o.solves=null,i.default.getScript(l.default.config.urlRoot+o.type_data.scripts.view,function(){var e=l.default._internal.challenge;e.data=t.data,(0,i.default)("#challenge-window").empty(),e.preRender(),(0,i.default)("#challenge-window").append(o.view),(0,i.default)("#challenge-window #challenge-input").addClass("form-control"),(0,i.default)("#challenge-window #challenge-submit").addClass("btn btn-md btn-outline-secondary float-right"),(0,i.default)(".challenge-solves").hide(),(0,i.default)(".nav-tabs a").click(function(e){e.preventDefault(),(0,i.default)(this).tab("show")}),(0,i.default)("#challenge-window").on("hide.bs.modal",function(e){(0,i.default)("#challenge-input").removeClass("wrong"),(0,i.default)("#challenge-input").removeClass("correct"),(0,i.default)("#incorrect-key").slideUp(),(0,i.default)("#correct-key").slideUp(),(0,i.default)("#already-solved").slideUp(),(0,i.default)("#too-fast").slideUp()}),(0,i.default)(".load-hint").on("click",function(e){g((0,i.default)(this).data("hint-id"))}),(0,i.default)("#challenge-submit").click(function(e){e.preventDefault(),(0,i.default)("#challenge-submit").addClass("disabled-button"),(0,i.default)("#challenge-submit").prop("disabled",!0),l.default._internal.challenge.submit(!0).then(_)}),(0,i.default)("#challenge-input").keyup(function(e){13==e.keyCode&&(0,i.default)("#challenge-submit").click()}),e.postRender(),window.location.replace(window.location.href.split("#")[0]+"#preview"),(0,i.default)("#challenge-window").modal()})})}),(0,i.default)(".delete-challenge").click(function(e){(0,a.ezQuery)({title:"Delete Challenge",body:"Are you sure you want to delete {0}".format(""+(0,n.htmlEntities)(window.CHALLENGE_NAME)+""),success:function(){l.default.fetch("/api/v1/challenges/"+window.CHALLENGE_ID,{method:"DELETE"}).then(function(e){return e.json()}).then(function(e){e.success&&(window.location=l.default.config.urlRoot+"/admin/challenges")})}})}),(0,i.default)("#challenge-update-container > form").submit(function(e){e.preventDefault();var o=(0,i.default)(e.target).serializeJSON(!0);l.default.fetch("/api/v1/challenges/"+window.CHALLENGE_ID+"/flags",{method:"GET",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"}}).then(function(e){return e.json()}).then(function(e){function t(){l.default.fetch("/api/v1/challenges/"+window.CHALLENGE_ID,{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(o)}).then(function(e){return e.json()}).then(function(e){if(e.success){switch((0,i.default)(".challenge-state").text(e.data.state),e.data.state){case"visible":(0,i.default)(".challenge-state").removeClass("badge-danger").addClass("badge-success");break;case"hidden":(0,i.default)(".challenge-state").removeClass("badge-success").addClass("badge-danger")}(0,a.ezToast)({title:"Success",body:"Your challenge has been updated!"})}})}0===e.data.length&&"visible"===o.state?(0,a.ezQuery)({title:"Missing Flags",body:"This challenge does not have any flags meaning it may be unsolveable. Are you sure you'd like to update this challenge?",success:t}):t()})}),(0,i.default)("#challenge-create-options form").submit(y),(0,i.default)("#tags-add-input").keyup(r.addTag),(0,i.default)(".delete-tag").click(r.deleteTag),(0,i.default)("#prerequisite-add-form").submit(c.addRequirement),(0,i.default)(".delete-requirement").click(c.deleteRequirement),(0,i.default)("#file-add-form").submit(s.addFile),(0,i.default)(".delete-file").click(s.deleteFile),(0,i.default)("#hint-add-button").click(f.showHintModal),(0,i.default)(".delete-hint").click(f.deleteHint),(0,i.default)(".edit-hint").click(f.showEditHintModal),(0,i.default)("#hint-edit-form").submit(f.editHint),(0,i.default)("#flag-add-button").click(h.addFlagModal),(0,i.default)(".delete-flag").click(h.deleteFlag),(0,i.default)("#flags-create-select").change(h.flagTypeSelect),(0,i.default)(".edit-flag").click(h.editFlagModal);var e=m.default.extend(p.default),t=document.createElement("div");document.querySelector("#comment-box").appendChild(t),new e({propsData:{type:"challenge",id:window.CHALLENGE_ID}}).$mount(t),i.default.get(l.default.config.urlRoot+"/api/v1/challenges/types",function(e){var t=e.data;v(t.standard),(0,i.default)("#create-chals-select input[name=type]").change(function(){v(t[this.value])})})})},"./CTFd/themes/admin/assets/js/pages/main.js":function(e,t,o){var n=m(o("./CTFd/themes/core/assets/js/CTFd.js")),a=m(o("./node_modules/jquery/dist/jquery.js")),s=m(o("./node_modules/moment/moment.js")),i=m(o("./node_modules/nunjucks/browser/nunjucks.js")),l=o("./node_modules/howler/dist/howler.js"),d=m(o("./CTFd/themes/core/assets/js/events.js")),r=m(o("./CTFd/themes/core/assets/js/times.js")),c=m(o("./CTFd/themes/admin/assets/js/styles.js")),u=m(o("./CTFd/themes/core/assets/js/helpers.js"));function m(e){return e&&e.__esModule?e:{default:e}}n.default.init(window.init),window.CTFd=n.default,window.helpers=u.default,window.$=a.default,window.Moment=s.default,window.nunjucks=i.default,window.Howl=l.Howl,(0,a.default)(function(){(0,c.default)(),(0,r.default)(),(0,d.default)(n.default.config.urlRoot)})},"./CTFd/themes/admin/assets/js/styles.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.showMediaLibrary=r,t.bindMarkdownEditors=c,t.default=void 0,o("./node_modules/bootstrap/dist/js/bootstrap.bundle.js");var n=o("./CTFd/themes/core/assets/js/utils.js"),a=d(o("./node_modules/jquery/dist/jquery.js")),s=d(o("./node_modules/easymde/src/js/easymde.js")),i=d(o("./node_modules/vue/dist/vue.esm.browser.js")),l=d(o("./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue"));function d(e){return e&&e.__esModule?e:{default:e}}function r(e){var t=i.default.extend(l.default),o=document.createElement("div");document.querySelector("main").appendChild(o);var n=new t({propsData:{editor:e}}).$mount(o);(0,a.default)("#media-modal").on("hidden.bs.modal",function(e){n.$destroy(),(0,a.default)("#media-modal").remove()}),(0,a.default)("#media-modal").modal()}function c(){(0,a.default)("textarea.markdown").each(function(e,t){if(!1===t.hasOwnProperty("mde")){var o=new s.default({autoDownloadFontAwesome:!1,toolbar:["bold","italic","heading","|","quote","unordered-list","ordered-list","|","link","image",{name:"media",action:function(e){r(e)},className:"fas fa-file-upload",title:"Media Library"},"|","preview","guide"],element:this,initialValue:(0,a.default)(this).val(),forceSync:!0,minHeight:"200px"});this.mde=o,this.codemirror=o.codemirror,(0,a.default)(this).on("change keyup paste",function(){o.codemirror.getDoc().setValue((0,a.default)(this).val()),o.codemirror.refresh()})}})}t.default=function(){(0,a.default)(":input").each(function(){(0,a.default)(this).data("initial",(0,a.default)(this).val())}),(0,a.default)(function(){(0,a.default)("tr[data-href], td[data-href]").click(function(){if(!getSelection().toString()){var e=(0,a.default)(this).attr("data-href");e&&(window.location=e)}return!1}),(0,a.default)("[data-checkbox]").click(function(e){(0,a.default)(e.target).is("input[type=checkbox]")?e.stopImmediatePropagation():((0,a.default)(this).find("input[type=checkbox]").click(),e.stopImmediatePropagation())}),(0,a.default)("[data-checkbox-all]").on("click change",function(e){var t=(0,a.default)(this).prop("checked"),o=(0,a.default)(this).index()+1;(0,a.default)(this).closest("table").find("tr td:nth-child(".concat(o,") input[type=checkbox]")).prop("checked",t),e.stopImmediatePropagation()}),(0,a.default)("tr[data-href] a, tr[data-href] button").click(function(e){(0,a.default)(this).attr("data-dismiss")||e.stopPropagation()}),(0,a.default)(".page-select").change(function(){var e=new URL(window.location);e.searchParams.set("page",this.value),window.location.href=e.toString()}),(0,a.default)('a[data-toggle="tab"]').on("shown.bs.tab",function(e){sessionStorage.setItem("activeTab",(0,a.default)(e.target).attr("href"))});var e=sessionStorage.getItem("activeTab");if(e){var t=(0,a.default)('.nav-tabs a[href="'.concat(e,'"], .nav-pills a[href="').concat(e,'"]'));t.length?t.tab("show"):sessionStorage.removeItem("activeTab")}c(),(0,n.makeSortableTables)(),(0,a.default)('[data-toggle="tooltip"]').tooltip()})}},"./CTFd/themes/core/assets/js/CTFd.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=r(o("./CTFd/themes/core/assets/js/fetch.js")),a=r(o("./CTFd/themes/core/assets/js/config.js")),s=o("./CTFd/themes/core/assets/js/api.js");o("./CTFd/themes/core/assets/js/patch.js");var i=r(o("./node_modules/markdown-it/index.js")),l=r(o("./node_modules/jquery/dist/jquery.js")),d=r(o("./CTFd/themes/core/assets/js/ezq.js"));function r(e){return e&&e.__esModule?e:{default:e}}function c(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}var u=new s.API("/"),m={},p={ezq:d.default},f={$:l.default,markdown:function(e){var t=function(t){for(var e=1;e".concat(e.body,"

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

".concat(e.body,"

")):o.find(".modal-body").append((0,l.default)(e.body));var n=(0,l.default)(m),a=(0,l.default)(u);return o.find(".modal-footer").append(a),o.find(".modal-footer").append(n),(0,l.default)("main").append(o),(0,l.default)(o).on("hidden.bs.modal",function(){(0,l.default)(this).modal("dispose")}),(0,l.default)(n).click(function(){e.success()}),o.modal("show"),o}function j(e){if(e.target){var t=(0,l.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var o=i.format(e.width),n=s.format(e.title),a=(0,l.default)(n);return a.find(".modal-body").append((0,l.default)(o)),(0,l.default)("main").append(a),a.modal("show")}function g(e){var t={success:r,error:a}[e.type].format(e.body);return(0,l.default)(t)}var _={ezAlert:p,ezToast:f,ezQuery:h,ezProgressBar:j,ezBadge:g};t.default=_},"./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,a=(n=o("./CTFd/themes/core/assets/js/config.js"))&&n.__esModule?n:{default:n};var s=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=a.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"]=a.default.csrfNonce,s(e,t)}},"./CTFd/themes/core/assets/js/patch.js":function(e,t,o){var n,l=(n=o("./node_modules/q/q.js"))&&n.__esModule?n:{default:n},a=o("./CTFd/themes/core/assets/js/api.js");function s(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function d(e,t){return function(t){for(var e=1;e>4*a&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(a){return function(e,t){var o=s(e,a),n=s(t,a);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 -- ");for(var a in o.append(n),t)t.hasOwnProperty(a)&&(n=(0,s.default)("".format(a,t[a].name)),o.append(n));(0,s.default)("#flag-edit-modal").modal()}),(0,s.default)("#flag-edit-modal form").submit(function(e){e.preventDefault();var t=(0,s.default)(this).serializeJSON(!0);t.challenge=window.CHALLENGE_ID,i.default.fetch("/api/v1/flags",{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)}).then(function(e){return e.json()}).then(function(e){window.location.reload()})}),(0,s.default)("#flag-edit-modal").modal()},t.editFlagModal=function(e){e.preventDefault();var n=(0,s.default)(this).attr("flag-id"),a=(0,s.default)(this).parent().parent();s.default.get(i.default.config.urlRoot+"/api/v1/flags/"+n,function(e){var o=e.data;s.default.get(i.default.config.urlRoot+o.templates.update,function(e){(0,s.default)("#edit-flags form").empty(),(0,s.default)("#edit-flags form").off();var t=l.default.compile(e);(0,s.default)("#edit-flags form").append(t.render(o)),(0,s.default)("#edit-flags form").submit(function(e){e.preventDefault();var t=(0,s.default)("#edit-flags form").serializeJSON();i.default.fetch("/api/v1/flags/"+n,{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(e){e.success&&((0,s.default)(a).find(".flag-content").text(e.data.content),(0,s.default)("#edit-flags").modal("toggle"))})}),(0,s.default)("#edit-flags").modal()})})},t.flagTypeSelect=function(e){e.preventDefault();var t=(0,s.default)(this).find("option:selected").text();s.default.get(i.default.config.urlRoot+"/api/v1/flags/types/"+t,function(e){var t=e.data;s.default.get(i.default.config.urlRoot+t.templates.create,function(e){var t=l.default.compile(e);(0,s.default)("#create-keys-entry-div").html(t.render()),(0,s.default)("#create-keys-button-div").show()})})};var s=a(o("./node_modules/jquery/dist/jquery.js")),i=a(o("./CTFd/themes/core/assets/js/CTFd.js")),l=a(o("./node_modules/nunjucks/browser/nunjucks.js")),n=o("./CTFd/themes/core/assets/js/ezq.js");function a(e){return e&&e.__esModule?e:{default:e}}},"./CTFd/themes/admin/assets/js/challenges/hints.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.showHintModal=function(e){e.preventDefault(),(0,a.default)("#hint-edit-modal form").find("input, textarea").val("").trigger("change"),(0,a.default)("#hint-edit-form textarea").each(function(e,t){t.hasOwnProperty("codemirror")&&t.codemirror.refresh()}),(0,a.default)("#hint-edit-modal").modal()},t.showEditHintModal=function(e){e.preventDefault();var t=(0,a.default)(this).attr("hint-id");s.default.fetch("/api/v1/hints/"+t+"?preview=true",{method:"GET",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"}}).then(function(e){return e.json()}).then(function(e){e.success&&((0,a.default)("#hint-edit-form input[name=content],textarea[name=content]").val(e.data.content).trigger("change"),(0,a.default)("#hint-edit-modal").on("shown.bs.modal",function(){(0,a.default)("#hint-edit-form textarea").each(function(e,t){t.hasOwnProperty("codemirror")&&t.codemirror.refresh()})}).on("hide.bs.modal",function(){(0,a.default)("#hint-edit-form textarea").each(function(e,t){(0,a.default)(t).val("").trigger("change"),t.hasOwnProperty("codemirror")&&t.codemirror.refresh()})}),(0,a.default)("#hint-edit-form input[name=cost]").val(e.data.cost),(0,a.default)("#hint-edit-form input[name=id]").val(e.data.id),(0,a.default)("#hint-edit-modal").modal())})},t.deleteHint=function(e){e.preventDefault();var t=(0,a.default)(this).attr("hint-id"),o=(0,a.default)(this).parent().parent();(0,n.ezQuery)({title:"Delete Hint",body:"Are you sure you want to delete this hint?",success:function(){s.default.fetch("/api/v1/hints/"+t,{method:"DELETE"}).then(function(e){return e.json()}).then(function(e){e.success&&o.remove()})}})},t.editHint=function(e){e.preventDefault();var t=(0,a.default)(this).serializeJSON(!0);t.challenge=window.CHALLENGE_ID;var o="POST",n="/api/v1/hints";t.id&&(o="PATCH",n="/api/v1/hints/"+t.id);s.default.fetch(n,{method:o,credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)}).then(function(e){return e.json()}).then(function(e){e.success&&window.location.reload()})};var a=i(o("./node_modules/jquery/dist/jquery.js")),s=i(o("./CTFd/themes/core/assets/js/CTFd.js")),n=o("./CTFd/themes/core/assets/js/ezq.js");function i(e){return e&&e.__esModule?e:{default:e}}},"./CTFd/themes/admin/assets/js/challenges/requirements.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.addRequirement=function(e){e.preventDefault();var t=(0,a.default)("#prerequisite-add-form").serializeJSON();if(!t.prerequisite)return;window.CHALLENGE_REQUIREMENTS.prerequisites.push(parseInt(t.prerequisite));var o={requirements:window.CHALLENGE_REQUIREMENTS};s.default.fetch("/api/v1/challenges/"+window.CHALLENGE_ID,{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(o)}).then(function(e){return e.json()}).then(function(e){e.success&&window.location.reload()})},t.deleteRequirement=function(e){var t=(0,a.default)(this).attr("challenge-id"),o=(0,a.default)(this).parent().parent();window.CHALLENGE_REQUIREMENTS.prerequisites.pop(t);var n={requirements:window.CHALLENGE_REQUIREMENTS};s.default.fetch("/api/v1/challenges/"+window.CHALLENGE_ID,{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(n)}).then(function(e){return e.json()}).then(function(e){e.success&&o.remove()})};var a=n(o("./node_modules/jquery/dist/jquery.js")),s=n(o("./CTFd/themes/core/assets/js/CTFd.js"));function n(e){return e&&e.__esModule?e:{default:e}}},"./CTFd/themes/admin/assets/js/challenges/tags.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.deleteTag=i,t.addTag=function(e){if(13!=e.keyCode)return;var t=(0,n.default)(this),o={value:t.val(),challenge:window.CHALLENGE_ID};a.default.api.post_tag_list({},o).then(function(e){if(e.success){var t=(0,n.default)("{0}×".format(e.data.value,e.data.id));(0,n.default)("#challenge-tags").append(t),t.click(i)}}),t.val("")};var n=s(o("./node_modules/jquery/dist/jquery.js")),a=s(o("./CTFd/themes/core/assets/js/CTFd.js"));function s(e){return e&&e.__esModule?e:{default:e}}function i(e){var t=(0,n.default)(this),o=t.attr("tag-id");a.default.api.delete_tag({tagId:o}).then(function(e){e.success&&t.parent().remove()})}},"./CTFd/themes/admin/assets/js/pages/challenge.js":function(e,t,o){o("./CTFd/themes/admin/assets/js/pages/main.js");var n=o("./CTFd/themes/core/assets/js/utils.js"),i=j(o("./node_modules/jquery/dist/jquery.js"));o("./node_modules/bootstrap/js/dist/tab.js");var l=j(o("./CTFd/themes/core/assets/js/CTFd.js")),a=o("./CTFd/themes/core/assets/js/ezq.js"),d=j(o("./CTFd/themes/core/assets/js/helpers.js")),s=o("./CTFd/themes/admin/assets/js/challenges/files.js"),r=o("./CTFd/themes/admin/assets/js/challenges/tags.js"),c=o("./CTFd/themes/admin/assets/js/challenges/requirements.js"),u=o("./CTFd/themes/admin/assets/js/styles.js"),m=j(o("./node_modules/vue/dist/vue.esm.browser.js")),p=j(o("./CTFd/themes/admin/assets/js/components/comments/CommentBox.vue")),f=o("./CTFd/themes/admin/assets/js/challenges/hints.js"),h=o("./CTFd/themes/admin/assets/js/challenges/flags.js");function j(e){return e&&e.__esModule?e:{default:e}}function g(e){l.default.api.get_hint({hintId:e,preview:!0}).then(function(e){e.data.content&&function(e){(0,a.ezAlert)({title:"Hint",body:e.html,button:"Got it!"})}(e.data)})}function _(e,t){var o=e.data,n=(0,i.default)("#result-message"),a=(0,i.default)("#result-notification"),s=(0,i.default)("#submission-input");a.removeClass(),n.text(o.message),"authentication_required"!==o.status?("incorrect"===o.status?(a.addClass("alert alert-danger alert-dismissable text-center"),a.slideDown(),s.removeClass("correct"),s.addClass("wrong"),setTimeout(function(){s.removeClass("wrong")},3e3)):"correct"===o.status?(a.addClass("alert alert-success alert-dismissable text-center"),a.slideDown(),(0,i.default)(".challenge-solves").text(parseInt((0,i.default)(".challenge-solves").text().split(" ")[0])+1+" Solves"),s.val(""),s.removeClass("wrong"),s.addClass("correct")):"already_solved"===o.status?(a.addClass("alert alert-info alert-dismissable text-center"),a.slideDown(),s.addClass("correct")):"paused"===o.status?(a.addClass("alert alert-warning alert-dismissable text-center"),a.slideDown()):"ratelimited"===o.status&&(a.addClass("alert alert-warning alert-dismissable text-center"),a.slideDown(),s.addClass("too-fast"),setTimeout(function(){s.removeClass("too-fast")},3e3)),setTimeout(function(){(0,i.default)(".alert").slideUp(),(0,i.default)("#challenge-submit").removeClass("disabled-button"),(0,i.default)("#challenge-submit").prop("disabled",!1)},3e3),t&&t(o)):window.location=l.default.config.urlRoot+"/login?next="+l.default.config.urlRoot+window.location.pathname+window.location.hash}function v(t){l.default._internal.challenge={},i.default.getScript(l.default.config.urlRoot+t.scripts.view,function(){var e=t.create;(0,i.default)("#create-chal-entry-div").html(e),(0,u.bindMarkdownEditors)(),i.default.getScript(l.default.config.urlRoot+t.scripts.create,function(){(0,i.default)("#create-chal-entry-div form").submit(function(e){e.preventDefault();var t=(0,i.default)("#create-chal-entry-div form").serializeJSON();l.default.fetch("/api/v1/challenges",{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(t)}).then(function(e){return e.json()}).then(function(e){e.success&&((0,i.default)("#challenge-create-options #challenge_id").val(e.data.id),(0,i.default)("#challenge-create-options").modal())})})})})}function y(a){a.preventDefault();var s=(0,i.default)(a.target).serializeJSON(!0),o={challenge_id:s.challenge_id,content:s.flag||"",type:s.flag_type,data:s.flag_data?s.flag_data:""};Promise.all([new Promise(function(t,e){0!=o.content.length?l.default.fetch("/api/v1/flags",{method:"POST",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(o)}).then(function(e){t(e.json())}):t()}),new Promise(function(e,t){var o=a.target,n={challenge:s.challenge_id,type:"challenge"};(0,i.default)(o.elements.file).val()&&d.default.files.upload(o,n),e()})]).then(function(e){l.default.fetch("/api/v1/challenges/"+s.challenge_id,{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({state:s.state})}).then(function(e){return e.json()}).then(function(e){e.success&&setTimeout(function(){window.location=l.default.config.urlRoot+"/admin/challenges/"+s.challenge_id},700)})})}(0,i.default)(function(){(0,i.default)(".preview-challenge").click(function(e){l.default._internal.challenge={},i.default.get(l.default.config.urlRoot+"/api/v1/challenges/"+window.CHALLENGE_ID,function(t){var o=t.data;o.solves=null,i.default.getScript(l.default.config.urlRoot+o.type_data.scripts.view,function(){var e=l.default._internal.challenge;e.data=t.data,(0,i.default)("#challenge-window").empty(),e.preRender(),(0,i.default)("#challenge-window").append(o.view),(0,i.default)("#challenge-window #challenge-input").addClass("form-control"),(0,i.default)("#challenge-window #challenge-submit").addClass("btn btn-md btn-outline-secondary float-right"),(0,i.default)(".challenge-solves").hide(),(0,i.default)(".nav-tabs a").click(function(e){e.preventDefault(),(0,i.default)(this).tab("show")}),(0,i.default)("#challenge-window").on("hide.bs.modal",function(e){(0,i.default)("#challenge-input").removeClass("wrong"),(0,i.default)("#challenge-input").removeClass("correct"),(0,i.default)("#incorrect-key").slideUp(),(0,i.default)("#correct-key").slideUp(),(0,i.default)("#already-solved").slideUp(),(0,i.default)("#too-fast").slideUp()}),(0,i.default)(".load-hint").on("click",function(e){g((0,i.default)(this).data("hint-id"))}),(0,i.default)("#challenge-submit").click(function(e){e.preventDefault(),(0,i.default)("#challenge-submit").addClass("disabled-button"),(0,i.default)("#challenge-submit").prop("disabled",!0),l.default._internal.challenge.submit(!0).then(_)}),(0,i.default)("#challenge-input").keyup(function(e){13==e.keyCode&&(0,i.default)("#challenge-submit").click()}),e.postRender(),window.location.replace(window.location.href.split("#")[0]+"#preview"),(0,i.default)("#challenge-window").modal()})})}),(0,i.default)(".delete-challenge").click(function(e){(0,a.ezQuery)({title:"Delete Challenge",body:"Are you sure you want to delete {0}".format(""+(0,n.htmlEntities)(window.CHALLENGE_NAME)+""),success:function(){l.default.fetch("/api/v1/challenges/"+window.CHALLENGE_ID,{method:"DELETE"}).then(function(e){return e.json()}).then(function(e){e.success&&(window.location=l.default.config.urlRoot+"/admin/challenges")})}})}),(0,i.default)("#challenge-update-container > form").submit(function(e){e.preventDefault();var o=(0,i.default)(e.target).serializeJSON(!0);l.default.fetch("/api/v1/challenges/"+window.CHALLENGE_ID+"/flags",{method:"GET",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"}}).then(function(e){return e.json()}).then(function(e){function t(){l.default.fetch("/api/v1/challenges/"+window.CHALLENGE_ID,{method:"PATCH",credentials:"same-origin",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(o)}).then(function(e){return e.json()}).then(function(e){if(e.success){switch((0,i.default)(".challenge-state").text(e.data.state),e.data.state){case"visible":(0,i.default)(".challenge-state").removeClass("badge-danger").addClass("badge-success");break;case"hidden":(0,i.default)(".challenge-state").removeClass("badge-success").addClass("badge-danger")}(0,a.ezToast)({title:"Success",body:"Your challenge has been updated!"})}})}0===e.data.length&&"visible"===o.state?(0,a.ezQuery)({title:"Missing Flags",body:"This challenge does not have any flags meaning it may be unsolveable. Are you sure you'd like to update this challenge?",success:t}):t()})}),(0,i.default)("#challenge-create-options form").submit(y),(0,i.default)("#tags-add-input").keyup(r.addTag),(0,i.default)(".delete-tag").click(r.deleteTag),(0,i.default)("#prerequisite-add-form").submit(c.addRequirement),(0,i.default)(".delete-requirement").click(c.deleteRequirement),(0,i.default)("#file-add-form").submit(s.addFile),(0,i.default)(".delete-file").click(s.deleteFile),(0,i.default)("#hint-add-button").click(f.showHintModal),(0,i.default)(".delete-hint").click(f.deleteHint),(0,i.default)(".edit-hint").click(f.showEditHintModal),(0,i.default)("#hint-edit-form").submit(f.editHint),(0,i.default)("#flag-add-button").click(h.addFlagModal),(0,i.default)(".delete-flag").click(h.deleteFlag),(0,i.default)("#flags-create-select").change(h.flagTypeSelect),(0,i.default)(".edit-flag").click(h.editFlagModal);var e=m.default.extend(p.default),t=document.createElement("div");document.querySelector("#comment-box").appendChild(t),new e({propsData:{type:"challenge",id:window.CHALLENGE_ID}}).$mount(t),i.default.get(l.default.config.urlRoot+"/api/v1/challenges/types",function(e){var t=e.data;v(t.standard),(0,i.default)("#create-chals-select input[name=type]").change(function(){v(t[this.value])})})})},"./CTFd/themes/admin/assets/js/pages/main.js":function(e,t,o){var n=m(o("./CTFd/themes/core/assets/js/CTFd.js")),a=m(o("./node_modules/jquery/dist/jquery.js")),s=m(o("./node_modules/moment/moment.js")),i=m(o("./node_modules/nunjucks/browser/nunjucks.js")),l=o("./node_modules/howler/dist/howler.js"),d=m(o("./CTFd/themes/core/assets/js/events.js")),r=m(o("./CTFd/themes/core/assets/js/times.js")),c=m(o("./CTFd/themes/admin/assets/js/styles.js")),u=m(o("./CTFd/themes/core/assets/js/helpers.js"));function m(e){return e&&e.__esModule?e:{default:e}}n.default.init(window.init),window.CTFd=n.default,window.helpers=u.default,window.$=a.default,window.Moment=s.default,window.nunjucks=i.default,window.Howl=l.Howl,(0,a.default)(function(){(0,c.default)(),(0,r.default)(),(0,d.default)(n.default.config.urlRoot)})},"./CTFd/themes/admin/assets/js/styles.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.showMediaLibrary=r,t.bindMarkdownEditors=c,t.default=void 0,o("./node_modules/bootstrap/dist/js/bootstrap.bundle.js");var n=o("./CTFd/themes/core/assets/js/utils.js"),a=d(o("./node_modules/jquery/dist/jquery.js")),s=d(o("./node_modules/easymde/src/js/easymde.js")),i=d(o("./node_modules/vue/dist/vue.esm.browser.js")),l=d(o("./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue"));function d(e){return e&&e.__esModule?e:{default:e}}function r(e){var t=i.default.extend(l.default),o=document.createElement("div");document.querySelector("main").appendChild(o);var n=new t({propsData:{editor:e}}).$mount(o);(0,a.default)("#media-modal").on("hidden.bs.modal",function(e){n.$destroy(),(0,a.default)("#media-modal").remove()}),(0,a.default)("#media-modal").modal()}function c(){(0,a.default)("textarea.markdown").each(function(e,t){if(!1===t.hasOwnProperty("mde")){var o=new s.default({autoDownloadFontAwesome:!1,toolbar:["bold","italic","heading","|","quote","unordered-list","ordered-list","|","link","image",{name:"media",action:function(e){r(e)},className:"fas fa-file-upload",title:"Media Library"},"|","preview","guide"],element:this,initialValue:(0,a.default)(this).val(),forceSync:!0,minHeight:"200px"});this.mde=o,this.codemirror=o.codemirror,(0,a.default)(this).on("change keyup paste",function(){o.codemirror.getDoc().setValue((0,a.default)(this).val()),o.codemirror.refresh()})}})}t.default=function(){(0,a.default)(":input").each(function(){(0,a.default)(this).data("initial",(0,a.default)(this).val())}),(0,a.default)(function(){(0,a.default)("tr[data-href], td[data-href]").click(function(){if(!getSelection().toString()){var e=(0,a.default)(this).attr("data-href");e&&(window.location=e)}return!1}),(0,a.default)("[data-checkbox]").click(function(e){(0,a.default)(e.target).is("input[type=checkbox]")?e.stopImmediatePropagation():((0,a.default)(this).find("input[type=checkbox]").click(),e.stopImmediatePropagation())}),(0,a.default)("[data-checkbox-all]").on("click change",function(e){var t=(0,a.default)(this).prop("checked"),o=(0,a.default)(this).index()+1;(0,a.default)(this).closest("table").find("tr td:nth-child(".concat(o,") input[type=checkbox]")).prop("checked",t),e.stopImmediatePropagation()}),(0,a.default)("tr[data-href] a, tr[data-href] button").click(function(e){(0,a.default)(this).attr("data-dismiss")||e.stopPropagation()}),(0,a.default)(".page-select").change(function(){var e=new URL(window.location);e.searchParams.set("page",this.value),window.location.href=e.toString()}),(0,a.default)('a[data-toggle="tab"]').on("shown.bs.tab",function(e){sessionStorage.setItem("activeTab",(0,a.default)(e.target).attr("href"))});var e=sessionStorage.getItem("activeTab");if(e){var t=(0,a.default)('.nav-tabs a[href="'.concat(e,'"], .nav-pills a[href="').concat(e,'"]'));t.length?t.tab("show"):sessionStorage.removeItem("activeTab")}c(),(0,n.makeSortableTables)(),(0,a.default)('[data-toggle="tooltip"]').tooltip()})}},"./CTFd/themes/core/assets/js/CTFd.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=r(o("./CTFd/themes/core/assets/js/fetch.js")),a=r(o("./CTFd/themes/core/assets/js/config.js")),s=o("./CTFd/themes/core/assets/js/api.js");o("./CTFd/themes/core/assets/js/patch.js");var i=r(o("./node_modules/markdown-it/index.js")),l=r(o("./node_modules/jquery/dist/jquery.js")),d=r(o("./CTFd/themes/core/assets/js/ezq.js"));function r(e){return e&&e.__esModule?e:{default:e}}function c(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}var u=new s.API("/"),m={},p={ezq:d.default},f={$:l.default,markdown:function(e){var t=function(t){for(var e=1;e".concat(e.body,"

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

".concat(e.body,"

")):o.find(".modal-body").append((0,l.default)(e.body));var n=(0,l.default)(m),a=(0,l.default)(u);return o.find(".modal-footer").append(a),o.find(".modal-footer").append(n),(0,l.default)("main").append(o),(0,l.default)(o).on("hidden.bs.modal",function(){(0,l.default)(this).modal("dispose")}),(0,l.default)(n).click(function(){e.success()}),o.modal("show"),o}function j(e){if(e.target){var t=(0,l.default)(e.target);return t.find(".progress-bar").css("width",e.width+"%"),t}var o=i.format(e.width),n=s.format(e.title),a=(0,l.default)(n);return a.find(".modal-body").append((0,l.default)(o)),(0,l.default)("main").append(a),a.modal("show")}function g(e){var t={success:r,error:a}[e.type].format(e.body);return(0,l.default)(t)}var _={ezAlert:p,ezToast:f,ezQuery:h,ezProgressBar:j,ezBadge:g};t.default=_},"./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,a=(n=o("./CTFd/themes/core/assets/js/config.js"))&&n.__esModule?n:{default:n};var s=window.fetch;t.default=function(e,t){return void 0===t&&(t={method:"GET",credentials:"same-origin",headers:{}}),e=a.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"]=a.default.csrfNonce,s(e,t)}},"./CTFd/themes/core/assets/js/patch.js":function(e,t,o){var n,l=(n=o("./node_modules/q/q.js"))&&n.__esModule?n:{default:n},a=o("./CTFd/themes/core/assets/js/api.js");function s(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function d(e,t){return function(t){for(var e=1;e>4*a&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(a){return function(e,t){var o=s(e,a),n=s(t,a);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\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n \n '),button:"Submit",success:function(){var e=(0,c.default)("#challenges-bulk-edit").serializeJSON(!0),t=[],o=!0,n=!1,s=void 0;try{for(var a,i=l[Symbol.iterator]();!(o=(a=i.next()).done);o=!0){var r=a.value;t.push(d.default.fetch("/api/v1/challenges/".concat(r),{method:"PATCH",body:JSON.stringify(e)}))}}catch(e){n=!0,s=e}finally{try{o||null==i.return||i.return()}finally{if(n)throw s}}Promise.all(t).then(function(e){window.location.reload()})}})}(0,c.default)(function(){(0,c.default)("#challenges-delete-button").click(a),(0,c.default)("#challenges-edit-button").click(i)})},"./CTFd/themes/admin/assets/js/pages/main.js":function(e,t,o){var n=m(o("./CTFd/themes/core/assets/js/CTFd.js")),s=m(o("./node_modules/jquery/dist/jquery.js")),a=m(o("./node_modules/moment/moment.js")),i=m(o("./node_modules/nunjucks/browser/nunjucks.js")),r=o("./node_modules/howler/dist/howler.js"),l=m(o("./CTFd/themes/core/assets/js/events.js")),d=m(o("./CTFd/themes/core/assets/js/times.js")),c=m(o("./CTFd/themes/admin/assets/js/styles.js")),u=m(o("./CTFd/themes/core/assets/js/helpers.js"));function m(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=a.default,window.nunjucks=i.default,window.Howl=r.Howl,(0,s.default)(function(){(0,c.default)(),(0,d.default)(),(0,l.default)(n.default.config.urlRoot)})},"./CTFd/themes/admin/assets/js/styles.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.showMediaLibrary=d,t.bindMarkdownEditors=c,t.default=void 0,o("./node_modules/bootstrap/dist/js/bootstrap.bundle.js");var n=o("./CTFd/themes/core/assets/js/utils.js"),s=l(o("./node_modules/jquery/dist/jquery.js")),a=l(o("./node_modules/easymde/src/js/easymde.js")),i=l(o("./node_modules/vue/dist/vue.esm.browser.js")),r=l(o("./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue"));function l(e){return e&&e.__esModule?e:{default:e}}function d(e){var t=i.default.extend(r.default),o=document.createElement("div");document.querySelector("main").appendChild(o);var n=new t({propsData:{editor:e}}).$mount(o);(0,s.default)("#media-modal").on("hidden.bs.modal",function(e){n.$destroy(),(0,s.default)("#media-modal").remove()}),(0,s.default)("#media-modal").modal()}function c(){(0,s.default)("textarea.markdown").each(function(e,t){if(!1===t.hasOwnProperty("mde")){var o=new a.default({autoDownloadFontAwesome:!1,toolbar:["bold","italic","heading","|","quote","unordered-list","ordered-list","|","link","image",{name:"media",action:function(e){d(e)},className:"fas fa-file-upload",title:"Media Library"},"|","preview","guide"],element:this,initialValue:(0,s.default)(this).val(),forceSync:!0,minHeight:"200px"});this.mde=o,this.codemirror=o.codemirror,(0,s.default)(this).on("change keyup paste",function(){o.codemirror.getDoc().setValue((0,s.default)(this).val()),o.codemirror.refresh()})}})}t.default=function(){(0,s.default)(":input").each(function(){(0,s.default)(this).data("initial",(0,s.default)(this).val())}),(0,s.default)(function(){(0,s.default)("tr[data-href], td[data-href]").click(function(){if(!getSelection().toString()){var e=(0,s.default)(this).attr("data-href");e&&(window.location=e)}return!1}),(0,s.default)("[data-checkbox]").click(function(e){(0,s.default)(e.target).is("input[type=checkbox]")?e.stopImmediatePropagation():((0,s.default)(this).find("input[type=checkbox]").click(),e.stopImmediatePropagation())}),(0,s.default)("[data-checkbox-all]").on("click change",function(e){var t=(0,s.default)(this).prop("checked"),o=(0,s.default)(this).index()+1;(0,s.default)(this).closest("table").find("tr td:nth-child(".concat(o,") input[type=checkbox]")).prop("checked",t),e.stopImmediatePropagation()}),(0,s.default)("tr[data-href] a, tr[data-href] button").click(function(e){(0,s.default)(this).attr("data-dismiss")||e.stopPropagation()}),(0,s.default)(".page-select").change(function(){var e=new URL(window.location);e.searchParams.set("page",this.value),window.location.href=e.toString()}),(0,s.default)('a[data-toggle="tab"]').on("shown.bs.tab",function(e){sessionStorage.setItem("activeTab",(0,s.default)(e.target).attr("href"))});var e=sessionStorage.getItem("activeTab");if(e){var t=(0,s.default)('.nav-tabs a[href="'.concat(e,'"], .nav-pills a[href="').concat(e,'"]'));t.length?t.tab("show"):sessionStorage.removeItem("activeTab")}c(),(0,n.makeSortableTables)(),(0,s.default)('[data-toggle="tooltip"]').tooltip()})}},"./CTFd/themes/core/assets/js/CTFd.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=d(o("./CTFd/themes/core/assets/js/fetch.js")),s=d(o("./CTFd/themes/core/assets/js/config.js")),a=o("./CTFd/themes/core/assets/js/api.js");o("./CTFd/themes/core/assets/js/patch.js");var i=d(o("./node_modules/markdown-it/index.js")),r=d(o("./node_modules/jquery/dist/jquery.js")),l=d(o("./CTFd/themes/core/assets/js/ezq.js"));function d(e){return e&&e.__esModule?e:{default:e}}function c(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}var u=new a.API("/"),m={},p={ezq:l.default},f={$:r.default,markdown:function(e){var t=function(t){for(var e=1;e".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 h(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 _(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:h,ezBadge:_};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/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 a(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>4*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\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n \n '),button:"Submit",success:function(){var e=(0,c.default)("#challenges-bulk-edit").serializeJSON(!0),t=[],o=!0,n=!1,s=void 0;try{for(var a,i=l[Symbol.iterator]();!(o=(a=i.next()).done);o=!0){var r=a.value;t.push(d.default.fetch("/api/v1/challenges/".concat(r),{method:"PATCH",body:JSON.stringify(e)}))}}catch(e){n=!0,s=e}finally{try{o||null==i.return||i.return()}finally{if(n)throw s}}Promise.all(t).then(function(e){window.location.reload()})}})}(0,c.default)(function(){(0,c.default)("#challenges-delete-button").click(a),(0,c.default)("#challenges-edit-button").click(i)})},"./CTFd/themes/admin/assets/js/pages/main.js":function(e,t,o){var n=m(o("./CTFd/themes/core/assets/js/CTFd.js")),s=m(o("./node_modules/jquery/dist/jquery.js")),a=m(o("./node_modules/moment/moment.js")),i=m(o("./node_modules/nunjucks/browser/nunjucks.js")),r=o("./node_modules/howler/dist/howler.js"),l=m(o("./CTFd/themes/core/assets/js/events.js")),d=m(o("./CTFd/themes/core/assets/js/times.js")),c=m(o("./CTFd/themes/admin/assets/js/styles.js")),u=m(o("./CTFd/themes/core/assets/js/helpers.js"));function m(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=a.default,window.nunjucks=i.default,window.Howl=r.Howl,(0,s.default)(function(){(0,c.default)(),(0,d.default)(),(0,l.default)(n.default.config.urlRoot)})},"./CTFd/themes/admin/assets/js/styles.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.showMediaLibrary=d,t.bindMarkdownEditors=c,t.default=void 0,o("./node_modules/bootstrap/dist/js/bootstrap.bundle.js");var n=o("./CTFd/themes/core/assets/js/utils.js"),s=l(o("./node_modules/jquery/dist/jquery.js")),a=l(o("./node_modules/easymde/src/js/easymde.js")),i=l(o("./node_modules/vue/dist/vue.esm.browser.js")),r=l(o("./CTFd/themes/admin/assets/js/components/files/MediaLibrary.vue"));function l(e){return e&&e.__esModule?e:{default:e}}function d(e){var t=i.default.extend(r.default),o=document.createElement("div");document.querySelector("main").appendChild(o);var n=new t({propsData:{editor:e}}).$mount(o);(0,s.default)("#media-modal").on("hidden.bs.modal",function(e){n.$destroy(),(0,s.default)("#media-modal").remove()}),(0,s.default)("#media-modal").modal()}function c(){(0,s.default)("textarea.markdown").each(function(e,t){if(!1===t.hasOwnProperty("mde")){var o=new a.default({autoDownloadFontAwesome:!1,toolbar:["bold","italic","heading","|","quote","unordered-list","ordered-list","|","link","image",{name:"media",action:function(e){d(e)},className:"fas fa-file-upload",title:"Media Library"},"|","preview","guide"],element:this,initialValue:(0,s.default)(this).val(),forceSync:!0,minHeight:"200px"});this.mde=o,this.codemirror=o.codemirror,(0,s.default)(this).on("change keyup paste",function(){o.codemirror.getDoc().setValue((0,s.default)(this).val()),o.codemirror.refresh()})}})}t.default=function(){(0,s.default)(":input").each(function(){(0,s.default)(this).data("initial",(0,s.default)(this).val())}),(0,s.default)(function(){(0,s.default)("tr[data-href], td[data-href]").click(function(){if(!getSelection().toString()){var e=(0,s.default)(this).attr("data-href");e&&(window.location=e)}return!1}),(0,s.default)("[data-checkbox]").click(function(e){(0,s.default)(e.target).is("input[type=checkbox]")?e.stopImmediatePropagation():((0,s.default)(this).find("input[type=checkbox]").click(),e.stopImmediatePropagation())}),(0,s.default)("[data-checkbox-all]").on("click change",function(e){var t=(0,s.default)(this).prop("checked"),o=(0,s.default)(this).index()+1;(0,s.default)(this).closest("table").find("tr td:nth-child(".concat(o,") input[type=checkbox]")).prop("checked",t),e.stopImmediatePropagation()}),(0,s.default)("tr[data-href] a, tr[data-href] button").click(function(e){(0,s.default)(this).attr("data-dismiss")||e.stopPropagation()}),(0,s.default)(".page-select").change(function(){var e=new URL(window.location);e.searchParams.set("page",this.value),window.location.href=e.toString()}),(0,s.default)('a[data-toggle="tab"]').on("shown.bs.tab",function(e){sessionStorage.setItem("activeTab",(0,s.default)(e.target).attr("href"))});var e=sessionStorage.getItem("activeTab");if(e){var t=(0,s.default)('.nav-tabs a[href="'.concat(e,'"], .nav-pills a[href="').concat(e,'"]'));t.length?t.tab("show"):sessionStorage.removeItem("activeTab")}c(),(0,n.makeSortableTables)(),(0,s.default)('[data-toggle="tooltip"]').tooltip()})}},"./CTFd/themes/core/assets/js/CTFd.js":function(e,t,o){Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=d(o("./CTFd/themes/core/assets/js/fetch.js")),s=d(o("./CTFd/themes/core/assets/js/config.js")),a=o("./CTFd/themes/core/assets/js/api.js");o("./CTFd/themes/core/assets/js/patch.js");var i=d(o("./node_modules/markdown-it/index.js")),r=d(o("./node_modules/jquery/dist/jquery.js")),l=d(o("./CTFd/themes/core/assets/js/ezq.js"));function d(e){return e&&e.__esModule?e:{default:e}}function c(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}var u=new a.API("/"),m={},p={ezq:l.default},f={$:r.default,markdown:function(e){var t=function(t){for(var e=1;e".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 h(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 _(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:h,ezBadge:_};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/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 a(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>4*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\").text(_momentTimezone.default.tz.guess());\n (0, _jquery.default)(target).append(current);\n\n var tz_names = _momentTimezone.default.tz.names();\n\n for (var i = 0; i < tz_names.length; i++) {\n var tz = (0, _jquery.default)(\"