{"version":3,"file":"app-54fed55e.f584a1446b2fc034d810.bundle.js","mappings":"AAEA","sources":["webpack://lernplattform-admin-frontend/../common/classes/CoursePageDurationCalculator.ts","webpack://lernplattform-admin-frontend/../common/constants/app.constants.ts","webpack://lernplattform-admin-frontend/../common/constants/assessment.constants.ts","webpack://lernplattform-admin-frontend/../common/constants/auth.constants.ts","webpack://lernplattform-admin-frontend/../common/constants/chat.constants.ts","webpack://lernplattform-admin-frontend/../common/constants/content.editing.constants.ts","webpack://lernplattform-admin-frontend/../common/constants/content.editor.constants.ts","webpack://lernplattform-admin-frontend/../common/constants/course.constants.ts","webpack://lernplattform-admin-frontend/../common/constants/data-protection.constants.ts","webpack://lernplattform-admin-frontend/../common/constants/distinar.constants.ts","webpack://lernplattform-admin-frontend/../common/constants/event.constants.ts","webpack://lernplattform-admin-frontend/../common/constants/formula.constants.ts","webpack://lernplattform-admin-frontend/../common/constants/gallery.constants.ts","webpack://lernplattform-admin-frontend/../common/constants/http-headers.constants.ts","webpack://lernplattform-admin-frontend/../common/constants/lecture.constants.ts","webpack://lernplattform-admin-frontend/../common/constants/levels.constants.ts","webpack://lernplattform-admin-frontend/../common/constants/mimetypes.constants.ts","webpack://lernplattform-admin-frontend/../common/constants/nickname.constants.ts","webpack://lernplattform-admin-frontend/../common/constants/print.constants.ts","webpack://lernplattform-admin-frontend/../common/constants/quiz.constants.ts","webpack://lernplattform-admin-frontend/../common/constants/resolution.constants.ts","webpack://lernplattform-admin-frontend/../common/constants/states.constants.ts","webpack://lernplattform-admin-frontend/../common/dto/content-editor/content.editor.types.ts","webpack://lernplattform-admin-frontend/../common/dto/course/code/course.code.interface.ts","webpack://lernplattform-admin-frontend/../common/dto/course/content/course.types.ts","webpack://lernplattform-admin-frontend/../common/dto/course/content/formula.interface.ts","webpack://lernplattform-admin-frontend/../common/dto/course/layout.container.interface.ts","webpack://lernplattform-admin-frontend/../common/dto/course/progress/course.progress.types.ts","webpack://lernplattform-admin-frontend/../common/dto/distinar/distinar.interface.ts","webpack://lernplattform-admin-frontend/../common/dto/external-api/external.api.interface.ts","webpack://lernplattform-admin-frontend/../common/dto/filter/filter.enum.ts","webpack://lernplattform-admin-frontend/../common/dto/filter/filter.interface.ts","webpack://lernplattform-admin-frontend/../common/dto/other/language.enum.ts","webpack://lernplattform-admin-frontend/../common/dto/other/operation.response.ts","webpack://lernplattform-admin-frontend/../common/dto/skill/management/skill.management.interface.ts","webpack://lernplattform-admin-frontend/../common/enum/assessment.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/auth.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/block.style.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/chat.message.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/chat.room.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/content.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/content.layout.mode.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/country.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/course.access.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/course.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/csv.type.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/date.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/distinar.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/ea-event.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/errortype.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/external-api/sync.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/file.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/gallery.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/keyboard.key.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/media.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/notification.type.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/question-theme.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/quiz.attempt.status.enum.ts","webpack://lernplattform-admin-frontend/../common/enum/quiz.enum.ts"],"sourcesContent":["import { ICourseBlockDto } from 'common/dto/course/content/block.interface';\nimport { ICourseContentDto } from 'common/dto/course/content/course.interface';\nimport { BlockType } from 'common/dto/course/content/course.types';\nimport { ICoursePageDto } from 'common/dto/course/content/page.interface';\nimport { CourseUtils } from 'common/utils/CourseUtils';\n\nexport class CoursePageDurationCalculator<T extends Date | string = string> {\n  private course: ICourseContentDto<T>;\n  private courseDurationInfo: IDurationInfo | null = null;\n\n  public static createDurationInfo(): IDurationInfo {\n    return {\n      durationAll: 0,\n      durationAudio: 0,\n      durationText: 0,\n      durationVideo: 0,\n      durationMpInteractiveText: 0,\n      durationMpRfg: 0,\n      durationMpSequence: 0,\n      durationQuestion: 0,\n      durationMpHotSpot: 0,\n      durationMpFlippingCard: 0,\n      durationMpRisi: 0,\n      subPageCount: 0,\n    };\n  }\n\n  public static addDurationInfos(a: IDurationInfo, b: IDurationInfo): IDurationInfo {\n    return {\n      durationAll: a.durationAll + b.durationAll,\n      durationAudio: a.durationAudio + b.durationAudio,\n      durationText: a.durationText + b.durationText,\n      durationVideo: a.durationVideo + b.durationVideo,\n      durationMpInteractiveText: a.durationMpInteractiveText + b.durationMpInteractiveText,\n      durationMpRfg: a.durationMpRfg + b.durationMpRfg,\n      durationMpSequence: a.durationMpSequence + b.durationMpSequence,\n      durationQuestion: a.durationQuestion + b.durationQuestion,\n      durationMpHotSpot: a.durationMpHotSpot + b.durationMpHotSpot,\n      durationMpFlippingCard: a.durationMpFlippingCard + b.durationMpFlippingCard,\n      durationMpRisi: a.durationMpRisi + b.durationMpRisi,\n      subPageCount: a.subPageCount + b.subPageCount,\n    };\n  }\n\n  constructor(course: ICourseContentDto<T>) {\n    this.course = course;\n  }\n\n  public get totalPageDuration(): IDurationInfo {\n    if(this.courseDurationInfo == null) {\n      this.courseDurationInfo = this.calculateTotalPageDuration();\n    }\n\n    return this.courseDurationInfo;\n  }\n\n  public calculatePageDuration(page: ICoursePageDto): IPageDurationInfo {\n    const blocks = this.course.blocks.filter(block => block.pageId === page.id);\n\n    const blockDurationInfo = this.calculateBlockDurations(blocks);\n    const subPagesDuration = this.calculateSubPagesDuration(page.id);\n    const duration = CoursePageDurationCalculator.addDurationInfos(blockDurationInfo, subPagesDuration);\n\n    return {\n      ...duration,\n      page,\n    };\n  }\n\n  /**\n   * evaluates the relative percentage of page duration to course duration\n   */\n  public calculatePageToCourseDurationRelativePercentage(pageDuration: IPageDurationInfo): number {\n    return pageDuration.durationAll / this.totalPageDuration.durationAll;\n  }\n\n  private calculateBlockDurations(blocks: Array<ICourseBlockDto>): IDurationInfo {\n    const durationInfo: IDurationInfo = CoursePageDurationCalculator.createDurationInfo();\n\n    for(const block of blocks) {\n      // Blocks that are part of an interactive sequence do not count against\n      // the page progress.\n      if(block.isPartOfSequence) continue;\n\n      durationInfo.durationAll += block.duration;\n\n      switch(block.type) {\n        case BlockType.AUDIO:\n          durationInfo.durationAudio += block.duration;\n          break;\n\n        case BlockType.TEXT:\n          durationInfo.durationText += block.duration;\n          break;\n\n        case BlockType.VIDEO:\n          durationInfo.durationVideo += block.duration;\n          break;\n\n        case BlockType.MP_INTERACTIVE_TEXT:\n          durationInfo.durationMpInteractiveText += block.duration;\n          break;\n\n        case BlockType.MP_RFG:\n          durationInfo.durationMpRfg += block.duration;\n          break;\n\n        case BlockType.MP_SEQUENCE_START:\n          durationInfo.durationMpSequence += block.duration;\n          break;\n\n        case BlockType.MP_SCORM:\n          durationInfo.durationMpSequence += block.duration;\n          break;\n\n        case BlockType.QUESTION:\n          durationInfo.durationQuestion += block.duration;\n          break;\n\n        case BlockType.MP_HOT_SPOT:\n          durationInfo.durationMpHotSpot += block.duration;\n          break;\n\n        case BlockType.MP_FLIPPING_CARD:\n          durationInfo.durationMpFlippingCard += block.duration;\n          break;\n\n        case BlockType.MP_RISI:\n          durationInfo.durationMpRisi += block.duration;\n          break;\n\n        default:\n        // ignore other types\n      }\n    }\n\n    return durationInfo;\n  }\n\n  private calculateSubPagesDuration(pageId: number): IDurationInfo {\n    let durationInfo: IDurationInfo = CoursePageDurationCalculator.createDurationInfo();\n\n    const subPages = this.course.pages.filter(p => p.parentId === pageId);\n    durationInfo.subPageCount += subPages.filter(p => p.type === 'page').length;\n\n    for(const subPage of subPages) {\n      const subPageDuration = this.calculatePageDuration(subPage);\n      durationInfo = CoursePageDurationCalculator.addDurationInfos(durationInfo, subPageDuration);\n    }\n\n    return durationInfo;\n  }\n\n  private calculateTotalPageDuration(): IDurationInfo {\n    const rootPages = CourseUtils.getLearningRootPagesWithoutIntro(this.course);\n    return rootPages.reduce((duration, page) => {\n      const pageDuration = this.calculatePageDuration(page);\n      return CoursePageDurationCalculator.addDurationInfos(duration, pageDuration);\n    }, CoursePageDurationCalculator.createDurationInfo());\n  }\n}\n\nexport interface IDurationInfo {\n  durationAll: number;\n  durationAudio: number;\n  durationText: number;\n  durationVideo: number;\n  durationMpInteractiveText: number;\n  durationMpRfg: number;\n  durationMpSequence: number;\n  durationMpHotSpot: number;\n  durationMpFlippingCard: number;\n  durationMpRisi: number;\n  durationQuestion: number;\n  subPageCount: number; // all sub pages of type page\n}\n\nexport interface IPageDurationInfo extends IDurationInfo {\n  page: ICoursePageDto;\n}\n","import { imageNameToString } from 'common/aurelia-components/images';\nimport { AppFlavour } from 'common/fe-config/config.interface';\nimport {\n  DATA_PRIVACY_AGREEMENT_EXTERNAL_LINK,\n  DATA_PRIVACY_AGREEMENT_EXTERNAL_LINK_FRP,\n  DATA_PRIVACY_AGREEMENT_EXTERNAL_LINK_LERA,\n  LEGAL_NOTICE_EXTERNAL_LINK_FRP,\n  LEGAL_NOTICE_EXTERNAL_LINK_LERA,\n  LEGAL_NOTICE_EXTERNAL_LINK_YARRIVE,\n  LEGAL_NOTICE_EXTERNAL_LINK_YARRIVE_EN,\n} from './data-protection.constants';\n\nexport type TProductIdentityConfig = Record<AppFlavour, IProductIdentity>;\n\nexport const productIdentityConfigs: TProductIdentityConfig = {\n  yarrive: {\n    appName: 'Yarrive',\n    brandUrl: 'yarrive.com',\n    appBrandUrl: 'yarrive.com/download',\n    dataPrivacyAgreementLink: DATA_PRIVACY_AGREEMENT_EXTERNAL_LINK,\n    favicon: imageNameToString.FaviconYarrive,\n    legalNoticeLink: LEGAL_NOTICE_EXTERNAL_LINK_YARRIVE,\n    legalNoticeNonGermanDefaultLink: LEGAL_NOTICE_EXTERNAL_LINK_YARRIVE_EN,\n    logoUrl: 'https://app.yarrive.com/logos/yarrive.png',\n    supportMail: 'support@yarrive.com',\n    supportPhone: null,\n  },\n  lera: {\n    appName: 'Lera',\n    brandUrl: 'lera.app',\n    appBrandUrl: 'lera.app',\n    dataPrivacyAgreementLink: DATA_PRIVACY_AGREEMENT_EXTERNAL_LINK_LERA,\n    favicon: imageNameToString.FaviconLera,\n    legalNoticeLink: LEGAL_NOTICE_EXTERNAL_LINK_LERA,\n    legalNoticeNonGermanDefaultLink: LEGAL_NOTICE_EXTERNAL_LINK_LERA,\n    logoUrl: 'https://my.lera.app/logos/lera.png',\n    supportMail: 'support@lera.app',\n    supportPhone: null,\n  },\n  risi: {\n    appName: 'Risi',\n    brandUrl: 'yarrive.com',\n    appBrandUrl: 'yarrive.com',\n    dataPrivacyAgreementLink: DATA_PRIVACY_AGREEMENT_EXTERNAL_LINK,\n    favicon: imageNameToString.FaviconRisi,\n    legalNoticeLink: LEGAL_NOTICE_EXTERNAL_LINK_YARRIVE,\n    legalNoticeNonGermanDefaultLink: LEGAL_NOTICE_EXTERNAL_LINK_YARRIVE_EN,\n    logoUrl: 'https://app.risi-und-ko.at/logos/risi.png',\n    supportMail: 'support@yarrive.app',\n    supportPhone: null,\n  },\n  frp: {\n    appName: 'Freiwillige Radfahrprüfung',\n    brandUrl: 'https://www.xn--radfahrprfung-4ob.at/',\n    appBrandUrl: 'radfahrpruefung.at/die-app',\n    dataPrivacyAgreementLink: DATA_PRIVACY_AGREEMENT_EXTERNAL_LINK_FRP,\n    favicon: imageNameToString.FaviconFrp,\n    legalNoticeLink: LEGAL_NOTICE_EXTERNAL_LINK_FRP,\n    legalNoticeNonGermanDefaultLink: LEGAL_NOTICE_EXTERNAL_LINK_FRP,\n    logoUrl: 'https://app.yarrive.com/logos/frp.png',\n    supportMail: 'radfahrpruefung@roteskreuz.at',\n    supportPhone: null,\n  },\n};\n\nexport interface IProductIdentity {\n  appName: string;\n  brandUrl: string;\n  appBrandUrl: string;\n  dataPrivacyAgreementLink: string;\n  favicon: string;\n  legalNoticeLink: string;\n  legalNoticeNonGermanDefaultLink: string;\n  logoUrl: string;\n  supportMail: string;\n  supportPhone: string | null;\n}\n","export const MAX_CODE_AMOUNT = 150;","export const MIN_PASSWORD_LENGTH = 8;\nexport const STUDENT_MAX_AGE_IN_YEARS = 100;\nexport const STUDENT_MIN_AGE_IN_YEARS = 14;\nexport const MIN_DIGITS_IN_PHONE_NUMBER = 6;\nexport const MIN_PASSWORD_STRENGTH_UFE = 2;\nexport const MIN_PASSWORD_STRENGTH_AFE = 3;\n","export const MESSAGES_PER_REQUEST_COUNT = 25;\n","/**\n * possible insert modes:\n * Sequential: insert into a list of elements (at a specific index)\n * OrthoSequential: insert orthogonal before or after an element/list of elements\n * Cardinal: insert in a cardinal direction next to an element\n * Plain: simplest insert without any specific information\n */\nexport enum ContentEditingInsertModeSelector {\n  Sequential = 'sequential',\n  OrthoSequential = 'ortho-sequential',\n  Cardinal = 'cardinal',\n  Plain = 'plain',\n}\n\nexport enum ContentEditingInsertModeCardinal {\n  Top = 'top',\n  Right = 'right',\n  Bottom = 'bottom',\n  Left = 'left',\n  None = 'none',\n}","export const CONTENT_EDITOR_PRESENTATION_CONTEXT = 'content-editor-presentation';\nexport const CONTENT_EDITOR_COURSE_CONTEXT = 'content-editor-course';\nexport const VIEWER_PRESENTATION_CONTEXT = 'viewer-presentation-context';\nexport const DISTINAR_PRESENTATION_CONTEXT = 'distinar-presentation-context';\nexport const LEARNING_COURSE_CONTEXT = 'learning-course-context';\nexport const PRINT_PRESENTATION_CONTEXT = 'print-presentation-context';\nexport const CONTENT_EDITOR_FRACTIONS = 12;\nexport const CONTENT_EDITOR_DROPZONE_MIN_WIDTH_PX = 16;\n","export const COURSE_TOTAL_LEARN_POINTS = 250000;\nexport const COURSE_TARGET_TRAINING_POINTS = 200000;\nexport const FILE_NAME_SEPARATOR = '_';\nexport const WINDOW_BREAK_POINT_DESKTOP = 1200; // related to $window-xlarge-min breakpoint\nexport const WINDOW_BREAK_POINT_MOBILE = 800; // related to $window-medium-min breakpoint\nexport const DEFAULT_MIN_DAYS_TO_EXAM = 7;\nexport const DEFAULT_MAX_DAYS_TO_EXAM = 90;\nexport const DEFAULT_DAYS_TO_EXAM = 42;\nexport const DEFAULT_ACCESS_CODE_EXPIRATION_IN_MONTHS = 6;\nexport const DEFAULT_FRP_ACCESS_CODE_EXPIRATION_IN_MONTHS = 60;\nexport const DEFAULT_SKILL_TIME_IN_MONTHS = 18;\nexport const COURSE_AM_DEFAULT_PRICE_IN_CENT = 700;\nexport const COURSE_DEFAULT_PRICE_IN_CENT = 500;\nexport const COURSE_RATING_OPTIONS = [1, 2, 3, 4, 5].map(v => ({ value: String(v), key: String(v) }));\nexport const MAX_TRAIN_TIME_IN_SECONDS = 60 * 15;\nexport const MAX_LEADERBOARD_LIMIT = 300;\n","/* eslint-disable max-len */\nexport const DATA_PRIVACY_AGREEMENT_EXTERNAL_LINK = 'https://yarrive.com/de/datenschutzerklaerung/';\nexport const DATA_PRIVACY_AGREEMENT_EXTERNAL_LINK_LERA = 'https://lera.app/datenschutzerklaerung/';\nexport const DATA_PRIVACY_AGREEMENT_EXTERNAL_LINK_FRP = 'https://radfahrpruefung.at/de/datenschutzerklaerung/';\nexport const LEGAL_NOTICE_EXTERNAL_LINK_FRP = 'https://radfahrpruefung.at/de/impressum/';\nexport const LEGAL_NOTICE_EXTERNAL_LINK_YARRIVE = 'https://yarrive.com/de/impressum/';\nexport const LEGAL_NOTICE_EXTERNAL_LINK_YARRIVE_EN = 'https://yarrive.com/en/legal-notice/';\nexport const LEGAL_NOTICE_EXTERNAL_LINK_LERA = 'https://lera.app/impressum/';\n\n","export const CONFERENCE_ACTIVE_MEETING_SYNC_CONTEXT = 'conference-active-meeting-sync-context';\nexport const DISTINAR_WEBSOCKET_GRANTED_PING_PONG_TIMEOUT = 5000;\nexport const DISTINAR_WEBSOCKET_PING_INTERVAL = 10000;\nexport const MAX_RECONNECTION_ATTEMPTS = 5;","// 'mousedown' seems to be universally supported, but there is room to just \"drop in\" more events if a new browser listens to something else\nexport const INTERACTION_EVENTS_TO_TRACK: Array<keyof HTMLElementEventMap> = ['mousedown'];","/* eslint-disable no-useless-escape */\nexport const FORMULA_NUMBER_VALIDATION_REGEX = /^([-+]?)(\\d+),?(\\d*)((?=[eE])([eE]?)([+-]?)(\\d*)|)$/;\nexport const FORMULA_TEXT_VALIDATION_REGEX = /^[a-zA-Z0-9öÖäÄüÜßẞα-ωΑ-Ω\\/-\\s,\\+-;\\(\\)§€\\$&/\\*<>\\[\\]~]*$/;\nexport const FORMULA_UNIT_COLOR = '#8095ad'; // = rgba(0, 42, 90, 0.5)\nexport const FORMULA_KATEX_RENDER_OPTIONS = { throwOnError: false, strict: false };\n/**\n * used to identify the start of a replaceable element for caluclation (e.g.: variables)\n */\nexport const FORMULA_REFERENCE_START_IDENTIFIER = '?{';\n/**\n * used to identify the end of a replaceable element for caluclation (e.g.: variables)\n */\nexport const FORMULA_REFERENCE_END_IDENTIFIER = '}';\n/**\n * FORMULA_*_PREFIX 's help to distinct between types of replaceable elements.\n * PREFIXes and FORMULA_REFERENCE_TYPE_PREFIX_LENGTH must be coherent.\n */\nexport const FORMULA_VARIABLE_PREFIX = 'Jw6toO';\nexport const FORMULA_KEY_VALUE_LIST_PREFIX = 'vSuLMc';\nexport const FORMULA_REFERENCE_TYPE_PREFIX_LENGTH = 6;\n/**\n * Used to validate formula length in frontend\n * Must keep in sync with DB model definition\n */\nexport const FORMULA_MAX_LENGTH_FORMULA = 8191;\nexport const FORMULA_MAX_LENGTH_DISPLAY = 2047;\nexport const FORMULA_MAX_LENGTH_LATEX = 2047;\nexport const FORMULA_MAX_LENGTH_UNIQUE_VARIABLES = 2047;\nexport const FORMULA_MAX_LENGTH_UNIQUE_KEY_VALUE_LISTS = 2047;","import { MimeTypes } from './mimetypes.constants';\n\nexport const GalleryFileWhiteList = {\n  video: [MimeTypes.VideoMp4, MimeTypes.VideoMov, MimeTypes.VideoWmv, MimeTypes.VideoAvi] as string[],\n  audio: [MimeTypes.AudioMp3, MimeTypes.AudioMpeg, MimeTypes.AudioFlac] as string[],\n  picture: [MimeTypes.ImagePng, MimeTypes.ImageJpeg, MimeTypes.ImageJpg, MimeTypes.ImageSvg] as string[],\n  file: [MimeTypes.ApplicationPdf, MimeTypes.ApplicationZip, MimeTypes.ApplicationZipCompressed]  as string[],\n};\n","export var HttpRequestHeaders;\n(function (HttpRequestHeaders) {\n    HttpRequestHeaders[\"ACCEPT\"] = \"Accept\";\n    HttpRequestHeaders[\"CONTENT_TYPE\"] = \"Content-Type\";\n    HttpRequestHeaders[\"X_API_VERSION\"] = \"x-api-version\";\n    HttpRequestHeaders[\"X_CSRF_TOKEN\"] = \"x-csrf-token\";\n    HttpRequestHeaders[\"X_VERSION\"] = \"x-version\";\n    HttpRequestHeaders[\"X_API_KEY\"] = \"X-Api-Key\";\n})(HttpRequestHeaders || (HttpRequestHeaders = {}));\nexport var HttpResponseHeaders;\n(function (HttpResponseHeaders) {\n    HttpResponseHeaders[\"X_UPDATE_RECOMMENDED\"] = \"x-update-recommended\";\n})(HttpResponseHeaders || (HttpResponseHeaders = {}));\nexport var CookieNames;\n(function (CookieNames) {\n    CookieNames[\"SESSION\"] = \"session\";\n    CookieNames[\"CSRF_TOKEN\"] = \"csrftoken\";\n})(CookieNames || (CookieNames = {}));\nexport const CURRENT_API_VERSION = 10;\nexport const CURRENT_API_VERSION_HEADER = String(CURRENT_API_VERSION);\nexport const MINIMUM_API_VERSION = 5;\nexport const MAXIMUM_API_VERSION = CURRENT_API_VERSION + 1;\nexport const supportedApiVersionValues = [];\nfor (let i = MINIMUM_API_VERSION; i <= MAXIMUM_API_VERSION; i++)\n    supportedApiVersionValues.push(String(i));\nexport var UpdateRecommendation;\n(function (UpdateRecommendation) {\n    UpdateRecommendation[\"None\"] = \"none\";\n    UpdateRecommendation[\"Soft\"] = \"soft\";\n    UpdateRecommendation[\"Hard\"] = \"hard\";\n})(UpdateRecommendation || (UpdateRecommendation = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1oZWFkZXJzLmNvbnN0YW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2NvbW1vbi9jb25zdGFudHMvaHR0cC1oZWFkZXJzLmNvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSxrQkFPWDtBQVBELFdBQVksa0JBQWtCO0lBQzVCLHVDQUFpQixDQUFBO0lBQ2pCLG1EQUE2QixDQUFBO0lBQzdCLHFEQUErQixDQUFBO0lBQy9CLG1EQUE2QixDQUFBO0lBQzdCLDZDQUF1QixDQUFBO0lBQ3ZCLDZDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFQVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBTzdCO0FBRUQsTUFBTSxDQUFOLElBQVksbUJBRVg7QUFGRCxXQUFZLG1CQUFtQjtJQUM3QixvRUFBNkMsQ0FBQTtBQUMvQyxDQUFDLEVBRlcsbUJBQW1CLEtBQW5CLG1CQUFtQixRQUU5QjtBQUVELE1BQU0sQ0FBTixJQUFZLFdBR1g7QUFIRCxXQUFZLFdBQVc7SUFDckIsa0NBQW1CLENBQUE7SUFDbkIsdUNBQXdCLENBQUE7QUFDMUIsQ0FBQyxFQUhXLFdBQVcsS0FBWCxXQUFXLFFBR3RCO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0FBQ3RDLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQ3RFLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQztBQUVyQyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFFM0QsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQWEsRUFBRSxDQUFDO0FBQ3RELEtBQUksSUFBSSxDQUFDLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQyxJQUFJLG1CQUFtQixFQUFFLENBQUMsRUFBRTtJQUFFLHlCQUF5QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUUxRyxNQUFNLENBQU4sSUFBWSxvQkFJWDtBQUpELFdBQVksb0JBQW9CO0lBQzlCLHFDQUFhLENBQUE7SUFDYixxQ0FBYSxDQUFBO0lBQ2IscUNBQWEsQ0FBQTtBQUNmLENBQUMsRUFKVyxvQkFBb0IsS0FBcEIsb0JBQW9CLFFBSS9CIn0=","/**\n  * the timespan a lecture can be started or joined before the `plannedDateFrom` date of the event in minutes\n  */\nexport const LECTURE_STARTABLE_BEFORE_PLANNED_DATE_FROM_MIN = 30;\n/**\n * the attendance percentage a student needs to be auto marked as `attended`\n */\nexport const LECTURE_AUTO_ATTENDED_PERCENTAGE = 95;\n/**\n * the time the join info of the lecturers separate window should be cached in seconds\n */\nexport const LECTURER_CACHED_SEPARATE_WINDOW_JOIN_INFO_EXPIRATION_IN_SECS = 86400;\n\nexport const LECTURE_VIDEO_MATRIX_VIDEO_ROTATION_INTERVAL_MS = 10000;\n\nexport const CHIME_MAX_ATTENDEE_COUNT = 250;\n\nexport const CHIME_ACTIVE_SPEAKER_UPDATE_INTERVAL_MS = 5000;\n","export const LEVEL_POINTS: number[] = [\n  0,\n  30000,\n  90000,\n  150000,\n  300000,\n  450000,\n  600000,\n  750000,\n  900000,\n];\n\nexport enum LevelColor {\n  Gold = 'gold',\n  Silver = 'silver',\n  Bronze = 'bronze',\n}\n\nexport const LEVEL_UNLOCKS: ILevelUnlocks[] = [\n  { level: 1, color: LevelColor.Bronze },\n  { level: 4, color: LevelColor.Silver },\n  { level: 7, color: LevelColor.Gold },\n];\n\nexport interface ILevelUnlocks {\n  level: number;\n  color: LevelColor;\n}\n","export enum MimeTypes {\n  ApplicationJson = 'application/json',\n  ApplicationOctedStream = 'application/octet-stream',\n  ApplicationPdf = 'application/pdf',\n  ApplicationZip = 'application/zip',\n  ApplicationZipCompressed = 'application/x-zip-compressed',\n  AudioFlac = 'audio/flac',\n  AudioMp3 = 'audio/mp3',\n  AudioMpeg = 'audio/mpeg',\n  ImageJpeg = 'image/jpeg',\n  ImageJpg = 'image/jpg',\n  ImagePng = 'image/png',\n  ImageSvg = 'image/svg+xml',\n  VideoAvi = 'videoAvi',\n  VideoMov= 'video/mov',\n  VideoMp4 = 'video/mp4',\n  VideoWmv = 'video/wmv',\n}\n","export const MIN_NICKNAME_LENGTH = 3;\nexport const MAX_NICKNAME_LENGTH = 20;\n","export const PDF_CONTENT_LOADED_CBNAME = 'pdfContentLoaded';","export const LT_QUESTION_SEPARATOR = '%INPUT%';\nexport const LT_HELPTEXT_SEPARATOR = '%INPUT%';\nexport const DEFAULT_POINTS_PER_QUESTION = 300;\nexport const ANSWER_COUNT_REQUIRED_FOR_COMPLETION = 2;\nexport const ABSOLUTE_MAX_QUESTIONS = 20;\n","export const FULL_HD = {\n  width: 1920,\n  height: 1080,\n};","import { ECountryCode } from 'common/enum/country.enum';\nimport {\n  StatesOfAustria,\n  StatesOfBelgium,\n  StatesOfCzech,\n  StatesOfDenmark,\n  StatesOfFinland,\n  StatesOfGermany,\n  StatesOfGreece,\n  StatesOfItaly,\n  StatesOfNetherlands,\n  StatesOfNorway,\n  StatesOfPoland,\n  StatesOfPortugal,\n  StatesOfSlovakia,\n  StatesOfSpain,\n  StatesOfSweden,\n  StatesOfSwitzerland,\n} from 'common/enum/states.enum';\n\ntype TStateOfCountry = Record<string, string>;\nexport const STATES_BY_COUNTRY_CODE: { [key in ECountryCode]: TStateOfCountry | null } = {\n  [ECountryCode.AD]: null,\n  [ECountryCode.AL]: null,\n  [ECountryCode.AT]: StatesOfAustria,\n  [ECountryCode.BA]: null,\n  [ECountryCode.BE]: StatesOfBelgium,\n  [ECountryCode.BG]: null,\n  [ECountryCode.BY]: null,\n  [ECountryCode.CH]: StatesOfSwitzerland,\n  [ECountryCode.CY]: null,\n  [ECountryCode.CZ]: StatesOfCzech,\n  [ECountryCode.DE]: StatesOfGermany,\n  [ECountryCode.DK]: StatesOfDenmark,\n  [ECountryCode.EE]: null,\n  [ECountryCode.ES]: StatesOfSpain,\n  [ECountryCode.FI]: StatesOfFinland,\n  [ECountryCode.FR]: null,\n  [ECountryCode.GB]: null,\n  [ECountryCode.GR]: StatesOfGreece,\n  [ECountryCode.HR]: null,\n  [ECountryCode.HU]: null,\n  [ECountryCode.IE]: null,\n  [ECountryCode.IS]: null,\n  [ECountryCode.IT]: StatesOfItaly,\n  [ECountryCode.LI]: null,\n  [ECountryCode.LT]: null,\n  [ECountryCode.LU]: null,\n  [ECountryCode.LV]: null,\n  [ECountryCode.MC]: null,\n  [ECountryCode.MD]: null,\n  [ECountryCode.ME]: null,\n  [ECountryCode.MK]: null,\n  [ECountryCode.MT]: null,\n  [ECountryCode.NL]: StatesOfNetherlands,\n  [ECountryCode.NO]: StatesOfNorway,\n  [ECountryCode.PL]: StatesOfPoland,\n  [ECountryCode.PT]: StatesOfPortugal,\n  [ECountryCode.RO]: null,\n  [ECountryCode.RS]: null,\n  [ECountryCode.RU]: null,\n  [ECountryCode.SE]: StatesOfSweden,\n  [ECountryCode.SI]: null,\n  [ECountryCode.SK]: StatesOfSlovakia,\n  [ECountryCode.SM]: null,\n  [ECountryCode.UA]: null,\n  [ECountryCode.VA]: null,\n};\n\nexport const getStatesOfCountry = (countryCode: ECountryCode): IStateOfCountry[] | null => {\n  const states = STATES_BY_COUNTRY_CODE[countryCode];\n  if(!states) return null;\n  return Object.entries(states).map(state => ({\n    nameTk: `common.states.${countryCode}.${state[0].charAt(0).toLowerCase() + state[0].slice(1)}`,\n    key: state[1],\n  })) as IStateOfCountry[];\n};\n\nexport const STATES = getStatesOfCountry(ECountryCode.AT) as IStateOfAustria[];\n\nexport interface IStateOfAustria {\n  nameTk: string;\n  key: StatesOfAustria;\n}\n\nexport interface IStateOfCountry {\n  nameTk: string;\n  key: string;\n}\n\n","import { BlockType } from '../course/content/course.types';\n\nexport type ContentElementType = BlockType | NonBlockElementType;\n\nexport enum NonBlockElementType {\n  Card = 'card',\n  AiQuiz = 'ai-quiz',\n  AiText = 'ai-text',\n}","import { IUserDataWithIdAndAvatar, IUserDataWithIdAndOnlineStatus, IMinimalUserDataWithIdAndOnlineStatus } from 'common/dto/auth/auth.interface';\nimport { IStudentCourseGroupDto } from 'common/dto/user/students/students.interface';\nimport { NotificationMethod } from 'common/enum/auth.enum';\nimport { GamesAndChatStatus } from 'common/enum/course.enum';\nimport { CSVType } from '../../../enum/csv.type.enum';\nimport { IAddressDto } from '../../other/address.interface';\nimport { ICourseInfoDto } from '../course.info.interface';\n\nexport interface ICourseCodeMetadataForLecturerDto {\n  firstname: string;\n  lastname: string;\n}\n\nexport interface ICourseCodeMetadataDto<TDate extends Date | string> {\n  firstname: string;\n  lastname: string;\n  address: IAddressDto;\n  email: string | null;\n  phoneNumber: string | null;\n  birthdate: TDate | null;\n  importantNotificationMethod: NotificationMethod;\n}\n\nexport interface ICourseCodeCreationCourseInfoDto<TDate extends Date | string> {\n  courseId: number;\n  courseGroupId: number;\n  examDate: TDate | null;\n}\n\nexport interface ICourseCodeCreationDto<TDate extends Date | string> {\n  courseInfos: ICourseCodeCreationCourseInfoDto<TDate>[];\n  metadata: ICourseCodeMetadataDto<TDate>;\n  note: string | null;\n  force: boolean;\n}\n\nexport interface ICourseCodeUpdateDto<TDate extends Date | string> {\n  active: boolean;\n  metadata: ICourseCodeMetadataDto<TDate> | null;\n  note: string | null;\n}\n\nexport interface ICourseCodeUpdateActiveStatusDto {\n  active: boolean;\n  codeIds: number[];\n}\n\nexport interface ICourseCodeRedeemDto {\n  accessCodeIds: number[];\n}\n\nexport interface ICourseCodeDeclineDto {\n  accessCodeIds: number[];\n}\n\nexport interface IAddCourseToMyCoursesDto {\n  accessCodeId?: number;\n  courseId?: number;\n  tenantId?: number;\n  learningJourneyId?: number;\n}\n\nexport interface ICourseCodeResponseForLecturerDto<TDate extends Date | string> {\n  id: number;\n  activeUntil: Date | null;\n  activatedAt: Date | null;\n  completedAt: Date | null;\n  active: boolean;\n  status: CodeStatus;\n  student: IMinimalUserDataWithIdAndOnlineStatus<TDate> | null;\n  metadata: ICourseCodeMetadataForLecturerDto | null;\n  course: ICourseInfoDto;\n  courseGroup: IStudentCourseGroupDto;\n  courseProgress: number;\n  trainingProgress: number;\n  code: string;\n  examDate: Date | null;\n  note: string | null;\n  tenantId: number;\n  tenantName?: string;\n  tenantEnabled?: boolean;\n  points: number;\n  gamesAndChatStatus: GamesAndChatStatus;\n  syncId: string | null;\n}\n\ninterface ICourseUser {\n  accumulatedStatus: AccumulatedCodeStatus;\n  courseCount: number;\n}\n\nexport interface ICourseUserForLecturerDto<TDate extends Date | string> extends IMinimalUserDataWithIdAndOnlineStatus<TDate>, ICourseUser { }\n\nexport interface ICourseUserDto<TDate extends Date | string> extends IUserDataWithIdAndAvatar<TDate>, ICourseUser { }\n\nexport interface ICourseCodeResponseDto<TDate extends Date | string> {\n  id: number;\n  activeUntil: Date | null;\n  activatedAt: Date | null;\n  completedAt: Date | null;\n  active: boolean;\n  status: CodeStatus;\n  student: IUserDataWithIdAndOnlineStatus<TDate> | null;\n  metadata: ICourseCodeMetadataDto<TDate> | null;\n  course: ICourseInfoDto;\n  courseGroup: IStudentCourseGroupDto;\n  courseProgress: number;\n  trainingProgress: number;\n  code: string;\n  examDate: Date | null;\n  note: string | null;\n  tenantId: number;\n  tenantName?: string;\n  tenantEnabled?: boolean;\n  tenantSyncActive?: boolean;\n  points: number;\n  gamesAndChatStatus: GamesAndChatStatus;\n  syncId: string | null;\n}\n\nexport interface INewCourseCodesDto<TDate extends Date | string> {\n  existingCodes: ICourseCodeResponseDto<TDate>[];\n  newCodes: ICourseCodeResponseDto<TDate>[];\n  transferableCodes: ICourseCodeResponseDto<TDate>[];\n  transferedCodes: ICourseCodeResponseDto<TDate>[];\n  transferingCodes: ICourseCodeResponseDto<TDate>[];\n}\n\nexport interface ICourseUpdateExamDate {\n  examDate: Date;\n}\n\nexport interface ICourseUpdateActiveUntil {\n  activeUntil: Date;\n}\n\nexport interface ICourseCodeStatisticsDto {\n  created: number;\n  used: number;\n}\n\nexport interface ICourseCodeStatisticsByTenantDto {\n  tenantId: number;\n  tenantName: string;\n  externalId: string | null;\n  created: number;\n  used: number;\n  unused: number;\n}\n\nexport interface ICourseCodeStatisticsQueryDto {\n  tenantId?: number;\n}\n\nexport interface ICourseCodeExportListDto {\n  codeIds: number[];\n  exportFreeAccessCodes?: boolean;\n}\n\nexport interface IDownloadCourseCodeStatisticsQueryDto {\n  exportType: CSVType;\n}\n\nexport interface IExportCodesDto {\n  exportType: CSVType;\n}\n\nexport interface ISelfEnrollDto {\n  identifier: string;\n}\n\nexport interface IUpdateRefererTenantDto {\n  refererTenantId: number;\n}\n\nexport interface IChangeStudentTenantDto {\n  tenantId: number;\n  courseGroupId: number;\n}\n\nexport enum CodeStatus {\n  Active = 'active',\n  Pending = 'pending',\n  Declined = 'declined',\n}\n\n// KL-5537\nexport enum AccumulatedCodeStatus {\n  Active = 'active',\n  Inactive = 'inactive',\n}\n\nexport interface IBulkAssignStudentToCourseDto<TDate extends Date | string> {\n  courses: IAssignStudentToCourseDto<TDate>[];\n  studentIds: number[];\n}\n\nexport interface IAssignStudentToCourseDto<TDate extends Date | string> {\n  courseId: number;\n  examDate: TDate | null;\n}","export type PageType = 'page' | 'chapter';\n\n/**\n * changes on enum BlockType require updating model:\n * layout_containers\n */\nexport enum BlockType {\n  AUDIO = 'audio',\n  EMPTY_CARD = 'empty-card',\n  FILE = 'file',\n  FORMULA = 'formula',\n  MP_FLIPPING_CARD = 'mp-flipping-card',\n  MP_HOT_SPOT = 'mp-hot-spot',\n  MP_INTERACTIVE_TEXT = 'mp-interactive-text',\n  MP_QUESTION = 'mp-question',\n  MP_RFG = 'mp-rfg',\n  MP_RISI = 'mp-risi',\n  MP_SCORM = 'mp-scorm',\n  MP_SEQUENCE_START = 'mp-sequence-start',\n  MP_TILES = 'mp-tiles',\n  PICTURE = 'picture',\n  QUESTION = 'question',\n  SPACER = 'spacer',\n  TEXT = 'text',\n  VIDEO = 'video',\n  VIMEO = 'vimeo',\n  YOUTUBE = 'youtube',\n}\n\nexport enum EventType {\n  Lecture = 'lecture',\n  Other = 'other',\n  ExamPractical = 'exam-practical',\n  ExamTheory = 'exam-theory',\n  Excercise = 'excercise',\n  ExamOther = 'exam-other',\n}\n\nexport enum EventEmailNotificationType {\n  CREATED = 'created',\n  RESCHEDULED = 'rescheduled',\n  CANCELED = 'canceled',\n  ADDRESS_CHANGED = 'address-changed'\n}\n\nexport enum QuestionType {\n  MC = 'MC',\n  SC = 'SC',\n  LT = 'LT',\n  TF = 'TF',\n  SCP = 'SCP',\n  MCP = 'MCP',\n}\n\nexport type CourseBlockUpdateInfo = { id: number; size: number | null }; // entity ID (video/audio/picture/file and data size in bytes)\n\nexport type OutdatedCourseData = {\n  pageIds: OutdatedIds;\n  blockIds: OutdatedIds;\n  videos: OutdatedIds;\n  pictures: OutdatedIds;\n  audio: OutdatedIds;\n  files: OutdatedIds;\n};\n\nexport type OutdatedIds = {\n  removed: number[];\n  updated: number[] | CourseBlockUpdateInfo[];\n  added: number[] | CourseBlockUpdateInfo[];\n};\n\nexport interface IEditorResponseDto {\n  id: number;\n  titlePrefix: string | null;\n  titleSuffix: string | null;\n  firstname: string | null;\n  lastname: string | null;\n}\n","/**\n * FormulaEditor uses formulaString to populate operators, variables, keyValueLists and values of the formula.\n * FormulaEditor uses these elements to calculate the displayString, latexFormula, uniqueVariables and uniqueKeyValueLists.\n * These calculated strings are then used to display the formula-block allowing variable and key-value-list setting and calculation.\n */\nexport interface IFormulaDto {\n  id: number | null;\n  blockId: number;\n  isValid: boolean;\n  resultName: string;\n  resultUnit: string;\n  resultArguments: string;\n  formulaString: string; // JSON-String\n  displayString: string; // Latex-String for display\n  latexFormula: string; // Latex-STring for calculation\n  uniqueVariables: string; // JSON-String\n  uniqueKeyValueLists: string; // JSON-String\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface IUpdateFormulaDto extends Partial<IFormulaDto> {}\n\nexport interface IUniqueFormulaItemBase {\n  id: number;\n  name: string;\n}\n\nexport interface IFormulaVariable extends IUniqueFormulaItemBase {\n  unit: string;\n  minValueAsString: string;\n  minDisplayString: string;\n  minValueAsNumber: number | null;\n  maxValueAsString: string;\n  maxDisplayString: string;\n  maxValueAsNumber: number | null;\n}\n\nexport interface IFormulaKeyValueList extends IUniqueFormulaItemBase {\n  entries: IKeyValueEntry[];\n}\n\n/**\n * since attributes will be stored as strings in JSON in the DB,\n * we want to save space, thus the *Short version in addtion to the normal *\n */\nexport interface IFormulaKeyValueListShort extends IUniqueFormulaItemBase {\n  entries: IKeyValueEntryShort[];\n}\n\nexport interface IKeyValueEntry {\n  order: number;\n  key: string;\n  valueAsString: string;\n  displayString: string;\n  valueAsNumber: number | null;\n}\n\n/**\n * since attributes will be stored as strings in JSON in the DB,\n * we want to save space, thus the *Short version in addtion to the normal *\n */\n\nexport interface IKeyValueEntryShort {\n  o: number;\n  k: string;\n  vs: string;\n  ds: string;\n  vn: number | null;\n}\n\nexport interface IFormulaVariableShort extends IUniqueFormulaItemBase {\n  unit: string;\n  ivs: string;\n  ids: string;\n  ivn: number | null;\n  avs: string;\n  ads: string;\n  avn: number | null;\n}\n\nexport interface IFormulaElementTypeBase {\n  id: number;\n}\n\n/**\n * Naming is consciously \"value\" instead of \"constant\", although mathematically they\n * are constants. This is a preperation for the possible future addition\n * of common constants like e, pi, ...\n */\nexport enum FormulaElementType {\n  Operator = 'operator',\n  Variable = 'variable',\n  Value = 'value',\n  KeyValueList = 'key-value-list',\n}\n\nexport enum FormulaOperatorType {\n  BracketOpen = 'bracket-open',\n  BracketClose = 'bracket-close',\n  Add = 'add',\n  Subtract = 'subtract',\n  Multiply = 'multiply',\n  Divide = 'divide',\n  Squared = 'squared',\n  Power = 'power',\n  Root = 'root',\n}\n\nexport interface IFormulaValue extends IFormulaElementTypeBase {\n  valueAsString: string; // value string for editing\n  displayString: string; // value string for display (includes 1.000s separator dot)\n  valueAsNumber: number | null;\n  unit: string;\n}\n\nexport interface IFormulaElement extends IFormulaElementTypeBase {\n  type: FormulaElementType;\n}\n\nexport interface IFormulaOperator extends IFormulaElementTypeBase {\n  operator: FormulaOperatorType;\n}\n\n\n\nexport type FormulaStructureShort = {\n  sequence: IFormulaElement[];\n  operators: IFormulaOperator[];\n  variables: IFormulaVariableShort[];\n  values: IFormulaValue[];\n  keyValueLists: IFormulaKeyValueListShort[];\n};\n\nexport type FormulaStructure = {\n  sequence: IFormulaElement[];\n  operators: IFormulaOperator[];\n  variables: IFormulaVariable[];\n  values: IFormulaValue[];\n  keyValueLists: IFormulaKeyValueList[];\n};\n","import { IPictureDto } from './content/course.interface';\nimport { SlideBackgroundColor } from './content/slide.interface';\nimport { BlockType } from 'common/dto/course/content/course.types';\n\n/**\n * ENUM used for column in LayoutContainerEntity !\n */\nexport enum LayoutContainerDirection {\n  Horizontal = 'horizontal',\n  Vertical = 'vertical',\n}\n\nexport enum LayoutContainerType {\n  Block = 'block',\n  Card = 'card',\n  Layout = 'layout',\n}\n\nexport enum CornerStyle {\n  Rounded = 'rounded',\n  Cornered = 'cornered',\n}\n\nexport enum LayoutContainerHAlignment {\n  Center = 'center',\n  Left = 'left',\n  Right = 'right',\n}\n\nexport enum LayoutContainerVAlignment {\n  Top = 'top',\n  Bottom = 'bottom',\n  Center = 'center',\n}\n\nexport enum LayoutContainerBlockSize {\n  Large = 'large',\n  Medium = 'medium',\n  Small = 'small',\n  Full = 'full'\n}\n\nexport interface ILayoutContainerDto {\n  id: number;\n  order: number;\n  parentLayoutContainerId: number | null;\n  type: LayoutContainerType;\n  blockId: number | null;\n  style: ILayoutContainerStyleDto;\n  layout: ILayoutContainerLayoutDto;\n}\n\nexport interface IPresentationLayoutContainerDto extends ILayoutContainerDto {\n  slideId: number;\n}\n\nexport interface ICourseLayoutContainerDto extends ILayoutContainerDto {\n  pageId: number;\n  // for ias slides\n  slideId: number | null;\n}\n\nexport interface IUniversalLayoutContainerDto extends ILayoutContainerDto {\n  pageId: number | null;\n  slideId: number | null;\n}\n\nexport interface ITemplateLayoutContainerDto {\n  id: number;\n  order: number;\n  parentLayoutContainerId: number | null;\n  style: ILayoutContainerStyleDto;\n  type: LayoutContainerType;\n  layout: ILayoutContainerLayoutDto;\n  templateId: number | null;\n  templateBlockType: BlockType | null;\n}\n\nexport interface ILayoutContainerChildInfo {\n  id: number;\n  blockType: BlockType | null;\n  itemSize: number;\n}\n\nexport interface ILayoutContainerStyleDto {\n  border: boolean;\n  shadow: boolean;\n  spacing: boolean;\n  separator: boolean;\n  corner: CornerStyle;\n  horizontalAlignment: LayoutContainerHAlignment;\n  verticalAlignment: LayoutContainerVAlignment;\n  blockSize: LayoutContainerBlockSize;\n  backgroundColor: SlideBackgroundColor | null;\n  backgroundImage: IPictureDto | null;\n}\n\nexport interface ILayoutContainerLayoutDto {\n  direction: LayoutContainerDirection | null;\n  itemSize: number;\n}\n","export enum CourseProgressDataType {\n  Percentage = 'percentage', // covers both: single progress and average\n  Duration = 'duration', // covers both: single progress and average\n  TotalDuration = 'total-duration',\n  Count = 'count',\n}\n\nexport type CourseProgressDataTypeRecordAddressingType = 0 | 1 | 2 | 3;\n\nexport const CourseProgressToDataTypeMap = {\n  [CourseProgressDataType.Percentage]: 0,\n  [CourseProgressDataType.Duration]: 1,\n  [CourseProgressDataType.TotalDuration]: 2,\n  [CourseProgressDataType.Count]: 3,\n};\n\nexport const DataTypeToCourseProgressMap = {\n  0: CourseProgressDataType.Percentage,\n  1: CourseProgressDataType.Duration,\n  2: CourseProgressDataType.TotalDuration,\n  3: CourseProgressDataType.Count,\n};\n\nexport enum CourseProgressProgressType {\n  Learning = 'learning',\n  Training = 'training',\n  Overall = 'overall',\n}\n\nexport type CourseProgressProgressTypeRecordAddressingType = 0 | 1 | 2;\n\nexport const CourseProgressToProgressTypeMap = {\n  [CourseProgressProgressType.Learning]: 0,\n  [CourseProgressProgressType.Training]: 1,\n  [CourseProgressProgressType.Overall]: 2,\n};\n\nexport const ProgressTypeToCourseProgressMap = {\n  0: CourseProgressProgressType.Learning,\n  1: CourseProgressProgressType.Training,\n  2: CourseProgressProgressType.Overall,\n};\n\n/**\n * Percentages are stored as INT but with three post decimal digits.\n * Thus the scaling factor 1000. Example 16.1% is stored as 16100.\n */\nexport const STATISTICS_PERCENTAGE_SCALE_FACTOR = 1000;\n\n/**\n * Shared helper type to reference progresses\n */\nexport type ProgressReferencesForStatistics = {\n  accessCodeId: number | null;\n  courseId: number;\n  tenantId: number | null;\n  pageId: number | null;\n};\n","import { EmitConfig } from 'common/aurelia-classes/WebSocketConnection';\nimport { SendChatMessageType } from 'common/enum/chat.message.enum';\nimport {\n  AttendeeInputMediaState,\n  CommonEmitName,\n  ContentView,\n  DistinarListenerEventName,\n  LecturerEmitName,\n  StudentEmitName,\n  SyncRequestType,\n} from 'common/enum/distinar.enum';\nimport { QuizAnswerTime } from 'common/enum/quiz.attempt.status.enum';\nimport { IPointInfo } from '../course/points/course.points.interface';\nimport { IQuizQuestionDto } from '../course/quiz/quiz.question.interface';\nimport { ISendMessageDto } from '../user/chat/chat.interface';\nimport { ChimeJoinInfo } from './distinar.response';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface, no-undef\n// export interface ILectureStatusUpdateDto<TDate extends Date | string = string> extends RecursivePartial<ILectureStatusDto<TDate>> {}\n\nexport interface IDistinarStatusUpdateDto<TDate extends Date | string = string> {\n  version: number;\n  conference?: Partial<ILectureConferenceStatusDto>;\n  course?: Partial<ILectureCourseStatusDto>;\n  currentContentView?: ContentView;\n  startedAt?: TDate | null;\n  paused?: boolean;\n  endedAt?: TDate | null;\n  quiz?: Partial<ILectureQuizStatusDto> | null;\n  whiteboard?: Partial<IWhiteboardDto> | null;\n  qrCode?: Partial<IDistinarQrCodeState> | null;\n}\n\nexport interface ILectureStatusDto<TDate extends Date | string = string> {\n  version: number;\n  conference: ILectureConferenceStatusDto;\n  course: ILectureCourseStatusDto;\n  currentContentView: ContentView;\n  startedAt: TDate | null;\n  paused: boolean;\n  endedAt: TDate | null;\n  quiz: ILectureQuizStatusDto | null;\n  whiteboard: IWhiteboardDto | null;\n  qrCode: IDistinarQrCodeState | null;\n}\n\nexport interface ILectureConferenceStatusDto {\n  active: boolean;\n  readyForStudentConnection: boolean;\n  chimeLecturerExternalUserId: string | null;\n  chimeLecturerAttendeeId: string | null;\n}\n\nexport interface ILectureCourseStatusDto {\n  courseId: number | null;\n  slideId: number | null;\n  fullscreenPictureBlockId: number | null;\n  revealedAnswerBlockIds: number[];\n}\n\nexport interface IQuizConfiguration {\n  remoteView: boolean;\n}\n\nexport enum LectureQuizState {\n  Ready = 'ready',\n  Loading = 'loading',\n  Intro = 'intro',\n  GetReady = 'get-ready',\n  Answer = 'answer',\n  Result = 'result',\n  Outro = 'outro',\n  IntermediateResult = 'intermediate-result',\n  FinalResult = 'final-result',\n}\n\nexport interface ILectureQuizStatusDto {\n  answerTime: QuizAnswerTime;\n  courseId: number;\n  elapsedMsSinceStateChange: number;\n  lastQuestionAnswers: ILectureQuizAnswerStats | null;\n  questionCount: number;\n  questionIndex: number;\n  quizQuestion: IQuizQuestionDto | null;\n  quizSessionId: number;\n  scores: IScoreBoardEntry[] | null;\n  state: LectureQuizState;\n  subQuestionIndex: number;\n  showHelpText: boolean;\n}\n\nexport interface ILectureQuizAnswerStats {\n  correctCount: number;\n  wrongCount: number;\n}\n\nexport interface IScoreBoardEntry {\n  userId: number;\n  score: number;\n}\n\nexport interface IScoreBoardEntryWithLearningVisibility extends IScoreBoardEntry {\n  /**\n   * learning visibility flag of the corresponding user\n   */\n  learningProgressVisible?: boolean;\n}\n\nexport interface IUpdateOrCreateWhiteboardDto {\n  slideId: number;\n  svgData?: string | null;\n  backgroundColor?: string | null;\n}\n\nexport interface IUpdateOrCreateLectureStatusDto<TDate extends Date | string = string> {\n  conference?: Partial<ILectureConferenceStatusDto>;\n  course?: Partial<ILectureCourseStatusDto>;\n  currentContentView?: ContentView;\n  startedAt?: TDate | null;\n  paused?: boolean;\n  endedAt?: TDate | null;\n  quiz?: (\n    Partial<ILectureQuizStatusDto> & {\n      currentStateTimestamp?: Date | null;\n      questionDate?: Date | null;\n      questionId?: number | null;\n    }\n  ) | null;\n  whiteboard?: IUpdateOrCreateWhiteboardDto | null;\n  qrCode?: IDistinarQrCodeState | null;\n}\n\nexport interface IUpdateLectureWebSocketDto {\n  actualDateFrom?: Date;\n  actualDateTo?: Date;\n}\n\nexport interface IStudentJoinOrReconnectLectureDto {\n  audioActivated: boolean;\n  videoActivated: boolean;\n  code: string | null;\n}\n\nexport interface IResumePresentationDto {\n  slideId: number;\n  courseId: number;\n}\n\nexport interface IChangeCourseSlideDto {\n  slideId: number;\n}\n\nexport interface ISetCurrentContentViewDto {\n  contentView: ContentView;\n}\n\nexport interface IDeactivateAndLockAudioOrVideoDto {\n  userId: number;\n}\n\nexport interface IAttendeeInputMediaStateDto {\n  state: AttendeeInputMediaState;\n}\n\nexport interface IAttendeeDto extends ISafeAttendeeDto {\n  firstname: string | null;\n  lastname: string | null;\n  conferenceAudioState: AttendeeInputMediaState;\n  conferenceVideoState: AttendeeInputMediaState;\n  isHandRaised: boolean;\n  courseId: number;\n}\n\nexport interface IAttendeeWithLearningProgressVisibilityDto extends IAttendeeDto {\n  learningProgressVisible: boolean;\n}\n\nexport interface ISafeAttendeeDto extends IPointInfo {\n  id: number;\n  nickname: string | null;\n  avatarSvgDownloadLink: string | null;\n  chimeExternalUserId: string | null;\n  chimeAttendeeId: string | null;\n  online: boolean;\n  isPhysicallyPresent: boolean;\n}\n\nexport interface ILecturerLectureStatusDto<TDate extends Date | string = string> {\n  lectureStatus: ILectureStatusDto<TDate>;\n  attendees: Array<IAttendeeDto>;\n  chatRoomId: number | null;\n}\n\nexport interface IStudentLectureStatusDto<TDate extends Date | string = string> {\n  lectureStatus: ILectureStatusDto<TDate>;\n  audioState: AttendeeInputMediaState;\n  videoState: AttendeeInputMediaState;\n  handRaised: boolean;\n  physicallyPresent: boolean;\n  attendees: Array<ISafeAttendeeDto>;\n  chatRoomId: number | null;\n  chatRoomHasUnreadMessages: boolean;\n  code: string | null;\n}\n\nexport interface IPrepareQuickQuizDto {\n  courseId: number;\n  chapterId?: number; // old API version\n  chapterIds?: number[]; // new API version\n  questionCount: number;\n  answerTime: QuizAnswerTime;\n}\n\nexport interface IPrepareTemplateQuizDto {\n  quizTemplateId: number;\n  answerTime: QuizAnswerTime;\n}\n\nexport interface IGetQuizContentDto {\n  lectureId: number;\n}\n\nexport interface ISetQuizStateDto {\n  newState: LectureQuizState;\n  questionIndex?: number;\n  subQuestionIndex?: number;\n}\n\nexport interface IToggleQuizShowHelpTextDto {\n  explicitValue?: boolean;\n}\n\nexport interface ILectureQuizConfig {\n  shortAnswerTimeLimitSeconds: number;\n  mediumAnswerTimeLimitSeconds: number;\n  longAnswerTimeLimitSeconds: number;\n  getReadyTimeoutSeconds: number;\n  maxTimeBonusPercentage: number;\n  maxTimeBonusPoints: number;\n  minTimeBonusPercentage: number;\n  rightAnswerPoints: number;\n}\n\nexport interface ISyncRequest {\n  type: SyncRequestType;\n  reply: () => void;\n}\n\n/**\n * Payload of the SYNC_REQUEST message\n */\nexport interface ISyncRequestDto {\n  type: SyncRequestType;\n  id: number;\n}\n\n/**\n * Payload of the SYNC_REPLY message when the user sends it to the server\n */\nexport interface ISyncReplyDto {\n  requestId: number;\n}\n\n/**\n * Payload of the SYNC_REPLY message when the server forwards it to the lecturer\n */\nexport interface ISyncReplyForwardDto {\n  requestId: number;\n  attendeeId: number;\n}\n\nexport interface ISentMessageDto {\n  type: SendChatMessageType;\n  text: string;\n  userName: string;\n}\n\nexport interface ILocalConferenceConfiguration {\n  streamAudio: boolean;\n  streamVideo: boolean;\n  shareScreen: boolean;\n  selectedDevices: {\n    audioInput: MediaDeviceInfo | null;\n    audioOutput: MediaDeviceInfo | null;\n    videoInput: MediaDeviceInfo | null;\n  };\n}\n\nexport interface ILecturerLowerSingleRaiseHandDto {\n  userId: number;\n}\n\nexport interface ILecturerSetCourseFullscreenPictureDto {\n  pictureBlockId: number | null;\n}\n\nexport interface ILecturerSetCourseRevealedAnswerBlockIdsDto {\n  blockIds?: number[] | null;\n}\n\nexport interface IWhiteboardDto {\n  slideId: number | null;\n  svgData: string | null;\n  backgroundColor: string | null;\n}\n\nexport interface IDistinarQrCodeState {\n  shown: boolean;\n}\n\n/**\n * for FE audio output device selection\n */\nexport interface INullDevice {\n  label?: string;\n  labelTk?: string;\n  deviceId: null;\n}\n\nexport type CommonListenerMap = {\n  [DistinarListenerEventName.Status]: (status: IDistinarStatusUpdateDto) => void;\n  [DistinarListenerEventName.AttendeesChanged]: (attendees: Array<IAttendeeDto>) => void;\n  [DistinarListenerEventName.MessageSent]: (message: ISentMessageDto) => void;\n  [DistinarListenerEventName.SystemMessageSent]: (message: string) => void;\n};\n\nexport type LecturerListenerMap = {\n  [DistinarListenerEventName.DistinarWasTakenOver]: () => void;\n  [DistinarListenerEventName.SyncReply]: (syncReply: ISyncReplyForwardDto) => void;\n} & CommonListenerMap;\n\nexport type StudentListenerMap = {\n  [DistinarListenerEventName.DeactivateAndLockAudio]: () => void;\n  [DistinarListenerEventName.DeactivateAndLockVideo]: () => void;\n  [DistinarListenerEventName.UnlockAudio]: () => void;\n  [DistinarListenerEventName.UnlockVideo]: () => void;\n  [DistinarListenerEventName.LowerAllRaisedHands]: () => void;\n  [DistinarListenerEventName.LowerSingleRaisedHand]: () => void;\n  [DistinarListenerEventName.SyncRequest]: (data: ISyncRequestDto) => void;\n} & CommonListenerMap;\n\nexport type CommonEmitMap = {\n  [CommonEmitName.MessageSent]: EmitConfig<ISendMessageDto>;\n};\n\n// export type EmitMap = { [key: string]: { params: Partial<Record<string, unknown>>; response: unknown; result: unknown } };\nexport type LecturerEmitMap = {\n  [LecturerEmitName.ContinueDistinar]: EmitConfig;\n  [LecturerEmitName.DeactivateAndLockAudio]: EmitConfig<IDeactivateAndLockAudioOrVideoDto>;\n  [LecturerEmitName.DeactivateAndLockAudioForAll]: EmitConfig;\n  [LecturerEmitName.DeactivateAndLockVideo]: EmitConfig<IDeactivateAndLockAudioOrVideoDto>;\n  [LecturerEmitName.DeactivateAndLockVideoForAll]: EmitConfig;\n  [LecturerEmitName.EndDistinar]: EmitConfig;\n  [LecturerEmitName.LowerAllRaisedHands]: EmitConfig;\n  [LecturerEmitName.LowerSingleRaisedHand]: EmitConfig<ILecturerLowerSingleRaiseHandDto>;\n  [LecturerEmitName.PauseDistinar]: EmitConfig;\n  [LecturerEmitName.PrepareQuickQuiz]: EmitConfig<IPrepareQuickQuizDto>;\n  [LecturerEmitName.PrepareTemplateQuiz]: EmitConfig<IPrepareTemplateQuizDto>;\n  [LecturerEmitName.ReconnectConference]: EmitConfig<Record<string, never>, { joinInfo: ChimeJoinInfo }, ChimeJoinInfo>;\n  [LecturerEmitName.ResumePresentation]: EmitConfig<IResumePresentationDto>;\n  [LecturerEmitName.SetCourseFullscreenPicture]: EmitConfig<ILecturerSetCourseFullscreenPictureDto>;\n  [LecturerEmitName.SetCourseRevealedAnswerBlockIds]: EmitConfig<ILecturerSetCourseRevealedAnswerBlockIdsDto>;\n  [LecturerEmitName.SetCourseSlide]: EmitConfig<IChangeCourseSlideDto>;\n  [LecturerEmitName.SetCurrentContentView]: EmitConfig<ISetCurrentContentViewDto>;\n  [LecturerEmitName.SetQrCodeState]: EmitConfig<Partial<IDistinarQrCodeState>>;\n  [LecturerEmitName.SetQuizState]: EmitConfig<ISetQuizStateDto>;\n  [LecturerEmitName.StartConference]: EmitConfig<Record<string, never>, { joinInfo: ChimeJoinInfo }, ChimeJoinInfo>;\n  [LecturerEmitName.StartOrReconnectDistinar]: EmitConfig<Record<string, never>, ILecturerLectureStatusDto<string>, ILecturerLectureStatusDto<string>>;\n  [LecturerEmitName.StartQuiz]: EmitConfig;\n  [LecturerEmitName.StopConference]: EmitConfig;\n  [LecturerEmitName.StopQuiz]: EmitConfig;\n  [LecturerEmitName.SyncRequest]: EmitConfig<ISyncRequestDto>;\n  [LecturerEmitName.ToggleQuizShowHelpText]: EmitConfig<IToggleQuizShowHelpTextDto>;\n  [LecturerEmitName.UnlockAudio]: EmitConfig<IDeactivateAndLockAudioOrVideoDto>;\n  [LecturerEmitName.UnlockAudioForAll]: EmitConfig;\n  [LecturerEmitName.UnlockVideo]: EmitConfig<IDeactivateAndLockAudioOrVideoDto>;\n  [LecturerEmitName.UnlockVideoForAll]: EmitConfig;\n  [LecturerEmitName.WhiteboardChanged]: EmitConfig<IWhiteboardDto>;\n} & CommonEmitMap;\n\nexport type StudentEmitMap = {\n  [StudentEmitName.JoinConference]: EmitConfig<Record<string, never>, { joinInfo: ChimeJoinInfo }, ChimeJoinInfo>;\n  [StudentEmitName.JoinDistinar]: EmitConfig<IStudentJoinOrReconnectLectureDto, IStudentLectureStatusDto, IStudentLectureStatusDto>;\n  [StudentEmitName.LowerHand]: EmitConfig;\n  [StudentEmitName.RaiseHand]: EmitConfig;\n  [StudentEmitName.StillOnline]: EmitConfig;\n  [StudentEmitName.RecreateConferenceAttendee]: EmitConfig<Record<string, never>, { joinInfo: ChimeJoinInfo }, ChimeJoinInfo>;\n  [StudentEmitName.SetAttendeeAudioState]: EmitConfig<IAttendeeInputMediaStateDto>;\n  [StudentEmitName.SetAttendeeVideoState]: EmitConfig<IAttendeeInputMediaStateDto>;\n  [StudentEmitName.SyncReply]: EmitConfig<ISyncReplyDto>;\n} & CommonEmitMap;","import {\n  SyncActionStatus,\n  SyncActionType,\n  SyncLogActionType,\n  SyncLogType,\n} from 'common/enum/external-api/sync.enum';\n\nexport enum ExternalOutgoingApiKeyStatus {\n  Valid = 'valid',\n  Invalid = 'invalid',\n  Unchecked = 'unchecked',\n  Unset = 'unset'\n}\n\nexport enum ExternalApiSyncStatus {\n  Active = 'active',\n  None = 'none',\n  Stopped = 'stopped',\n}\n\nexport enum ExternalApiErrorStatus {\n  Ok = 'ok',\n  Timeout = 'timeout',\n  ApiKeyRejected = 'apiKeyRejected',\n  ServerError = 'serverError',\n  ServerUnreachable = 'serverUnreachable',\n  UnknownError = 'unknownError',\n}\n\nexport interface IExternalApiTenantSyncStatusDto {\n  apiKey: string | null;\n  outgoingApiKey: ExternalOutgoingApiKeyStatus;\n  sync: ExternalApiSyncStatus;\n  error: ExternalApiErrorStatus;\n  errorMessage?: string | null;\n  queueLength: number;\n}\n\nexport interface IExternalApiSyncLogDto {\n  type: SyncLogType;\n  actionType: SyncLogActionType;\n  endpoint: string;\n  status: SyncActionStatus;\n  data: any;\n  metadata: any;\n  updatedAt: Date;\n}\n\nexport interface IExternalApiSyncQueueEntryDto {\n  id: number;\n  endpoint: string | null;\n  data: any;\n  response: any;\n  userId: number | null;\n  lastAttemptTimestamp: Date | null;\n  status: SyncActionStatus;\n  actionType: SyncActionType;\n  createdAt: Date;\n}","export enum FilterOperationType {\n  Eq = '=',\n  Lt = '<',\n  Lte = '<=',\n  Gt = '>',\n  Gte = '>=',\n  Ne = '!=',\n  Like = 'like',\n  LikeLowerCase = 'likeLowerCase',\n  In = 'in',\n  InOrNull = 'inOrNull',\n  EqFloor = 'eqfloor',\n  Regex = 'regex',\n  Eqnull = 'eqnull',\n  Neqnull = 'neqnull',\n}\n\nexport enum ColumnSortDirection {\n  ASC = 'asc',\n  ASC_NULLS_FIRST = 'asc-nulls-first',\n  ASC_NULLS_LAST = 'asc-nulls-last',\n  DESC = 'desc',\n  DESC_NULLS_FIRST = 'desc-nulls-first',\n  DESC_NULLS_LAST = 'desc-nulls-last',\n}\n","import { FilterOperationType, ColumnSortDirection } from 'common/dto/filter/filter.enum';\n\nexport type FilterField<T> = { field: keyof T; type: FilterOperationType; value: any; group?: string };\nexport type OrderField<T> = { field: keyof T; dir: ColumnSortDirection };\n\nexport interface IFilterDto<T = any> {\n  filter?: Array<FilterField<T>>;\n  order?: Array<OrderField<T>>;\n  offset?: number;\n  limit?: number;\n}\n\nexport interface IPaginatedDto<T> {\n  rows: Array<T>;\n  count: number;\n}\n\nexport type FilterChangedEvent = Event & { detail: { filter: string } };\n\nexport enum FilterInputTheme {\n  Default = 'default', // normal input\n  TableHead = 'table-head',\n}\n\nexport type FilterOptions = Array<{\n  key?: string;\n  value: string;\n  icon?: string;\n} | {\n  keyTk?: string;\n  tkParams?: Record<string, string>;\n  value: string;\n}>;\n","export enum Language {\n  De = 'de',\n  En = 'en',\n  Hr = 'hr',\n  Sl = 'sl',\n}\n","import { GalleryMediaType } from 'common/enum/gallery.enum';\nimport { AppResponse } from 'common/types';\n\nexport enum OperationStatus {\n  Running = 'running',\n  Success = 'success',\n  Error = 'error',\n}\n\nexport type OperationState<T = unknown> = {\n  status: OperationStatus.Running | OperationStatus.Error;\n  message?: string;\n} | {\n  status: OperationStatus.Success;\n  value?: T;\n};\n\nexport type OperationCreatedResponse = AppResponse<{ operationId: number }>;\nexport type OperationStateResponse<T = unknown> = AppResponse<OperationState<T>>;\nexport type OperationStateTkMessage = {\n  tk: string;\n  tkParams?: Record<string, unknown>;\n};\n\nexport type ExportDownload = { url: string; name: string };\n// Responses used for workers as well as operations. You can find the worker data in backend/src/worker/worker.type.ts\nexport type PresentationImportWorkerReturnValue = { presentationId: number };\nexport type ExportWorkerReturnValue = { downloads: Array<ExportDownload> };\nexport type MediaImportWorkerReturnValue = {\n  errors: MediaImportErrorReport;\n  /**\n   * if only one file is imported this will be the id and type of the media entity\n   */\n  media?: {\n    id: number;\n    type: GalleryMediaType;\n  };\n};\n\nexport type MediaImportErrorReport = {\n  /**\n   * files that failed import because a file with that name already exists\n   */\n  nameAlreadyExists: Array<MediaImportReportFile>;\n  /**\n   * files that failed import due to unknown error\n   */\n  unknown: Array<MediaImportReportFile>;\n};\n\nexport type MediaImportReportFile = {\n  filename: string;\n  errorMessage: string;\n  mimetype: string;\n};\n","export interface ICreateSkillDto {\n  title: string;\n  description: string;\n  iconKey: string;\n  validityDurationInMonths: number;\n  offerRenewalAfterPeriodInMonths: number;\n  unlimitedValidity: boolean;\n}\n\nexport interface IUpdateSkillDto {\n  title?: string;\n  description?: string;\n  iconKey?: string;\n  validityDurationInMonths?: number;\n  offerRenewalAfterPeriodInMonths?: number;\n  unlimitedValidity?: boolean;\n}\n\nexport interface ISkillDto {\n  id: number;\n  title: string;\n  description: string;\n  iconKey: string;\n  validityDurationInMonths: number;\n  offerRenewalAfterPeriodInMonths: number;\n  unlimitedValidity: boolean;\n}\n\nexport interface IStudentWithSkillsDto {\n  id: number;\n  firstname: string | null;\n  lastname: string | null;\n  avatarSvgDownloadLink: null | string;\n  skills: IStudentSkillDto[] | null;\n}\n\nexport interface IStudentSkillDto<T extends Date | string = string> {\n  skillId: number;\n  studentId: number;\n  awardedReason: SkillAwardReason;\n  expiresAt: T | null;\n  extensionPossibleFrom: T | null;\n}\n\nexport interface IStudentSkillListItemDto extends ISkillDto, Partial<Omit<IStudentSkillDto, 'skillId'>> {\n}\n\nexport interface IAssignSkillToStudentDto {\n  overrideExpirationDate?: string | null;\n  overrideRenewabilityDate?: string | null;\n}\n\nexport enum SkillAwardReason {\n  Course = 'course',\n  LearningJourney = 'learning-journey',\n  Manual = 'manual',\n}\n\nexport interface IAssignSkillsDto {\n  skillIds: number[];\n}\n\nexport interface IBulkAssignSkillsToCoursesDto extends IAssignSkillsDto {\n  courseIds: number[];\n}\n","export enum ECodeDownloadOption {\n  OVERVIEW = 'overview',\n  MULTI = 'multi',\n  SINGLE = 'single',\n}\n\nexport enum EProtocolLength {\n  SHORT = 'short',\n  LONG = 'long',\n}\n\nexport enum WebSocketEventName {\n  AnswerProgress = 'answer-progress',\n  ClosedDueToInactivity = 'closed-due-to-inactivity',\n  CodeState = 'code-state',\n}\n\nexport enum WebSocketActionName {\n  SubscribeToProgress = 'subscribe-to-progress',\n  SubscribeToState = 'subscribe-to-state',\n}","export enum LoginClient {\n  AdminFrontend = 'management',\n  UserFrontendApp = 'app',\n  UserFrontendWeb = 'web',\n  RisiFrontendApp = 'risi-app',\n  RisiFrontendWeb = 'risi-web',\n}\n\nexport enum LoginEndpoint {\n  Api = 'api',\n  Frontend = 'frontend',\n}\n\nexport enum LoginAction {\n  Login = 'login',\n  Link = 'link',\n}\n\nexport enum LoginProvider {\n  Anonymous = 'anonymous',\n  Facebook = 'facebook',\n  Google = 'google',\n  Apple = 'apple',\n  Buergerkarte = 'bku',\n  PasswordReset = 'passwordreset',\n  Local = 'local',\n  Risi = 'risi',\n  ProviderImpersonate = 'provider-impersonate',\n  AAD = 'aad',\n  SAML = 'saml',\n  DriveAdmin = 'driveadmin',\n  PinCode = 'pinCode',\n}\n\nexport enum AnonymousUserSource {\n  Promotion = 'promotion',\n  Risi = 'risi',\n  Unknown = 'unknown',\n  PinCode = 'pin-code',\n}\n\nexport enum NotificationMethod {\n  Email = 'email',\n  Sms = 'sms',\n}","export enum BlockStyleTitlePosition {\n  Above = 'Above',\n  Below = 'Below',\n}\n\nexport enum PipVideoPosition {\n  TopRight = 'top-right',\n  TopLeft = 'top-left',\n}\n\nexport enum BlockStyleSizingDefault {\n  Large = 25,\n  Medium = 20,\n  Small = 15,\n}","export enum ChatMessageType {\n  All = 'all',\n  Duel = 'duel',\n  Regular = 'regular',\n  Incognito = 'incognito',\n  File = 'file',\n}\n\nexport enum SendChatMessageType {\n  Regular = 'regular',\n  Incognito = 'incognito',\n  File = 'file',\n}\n","export enum ChatRoomType {\n  OneToOne = 'one-to-one',\n  Group = 'group'\n}\n","/**\n * attention: GenericAlignment is used in slide.model\n */\nexport enum GenericAlignment {\n  Start = 'start',\n  Middle = 'middle',\n  End = 'end',\n}\n\n/**\n * attention: GenericFitAndFill is used in slide.model\n */\nexport enum GenericFitAndFill {\n  Original = 'original',\n  Fit = 'fit',\n  Fill = 'fill',\n}\n\nexport enum CornerAlignment {\n  TopLeft = 'top-left',\n  TopRight = 'top-right',\n  BottomRight = 'bottom-right',\n  BottomLeft = 'bottom-left',\n  CenterCenter = 'center-center',\n}","/**\n * layout mode used for styling purposes\n */\nexport enum ContentLayoutMode {\n  /**\n   * layout containers stretch to their needed intrinsic height\n   */\n  Intrinsic = 'intrinsic',\n  /**\n   * extrinsic height is forced on each layout container - fixed sizes\n   */\n  Extrinsic = 'extrinsic',\n}","export enum ECountryCode {\n  AD = 'ad',\n  AL = 'al',\n  AT = 'at',\n  BA = 'ba',\n  BE = 'be',\n  BG = 'bg',\n  BY = 'by',\n  CH = 'ch',\n  CY = 'cy',\n  CZ = 'cz',\n  DE = 'de',\n  DK = 'dk',\n  EE = 'ee',\n  ES = 'es',\n  FI = 'fi',\n  FR = 'fr',\n  GB = 'gb',\n  GR = 'gr',\n  HR = 'hr',\n  HU = 'hu',\n  IE = 'ie',\n  IS = 'is',\n  IT = 'it',\n  LI = 'li',\n  LT = 'lt',\n  LU = 'lu',\n  LV = 'lv',\n  MC = 'mc',\n  MD = 'md',\n  ME = 'me',\n  MK = 'mk',\n  MT = 'mt',\n  NL = 'nl',\n  NO = 'no',\n  PL = 'pl',\n  PT = 'pt',\n  RO = 'ro',\n  RS = 'rs',\n  RU = 'ru',\n  SE = 'se',\n  SI = 'si',\n  SK = 'sk',\n  SM = 'sm',\n  UA = 'ua',\n  VA = 'va',\n}","export enum ActivityFilterType {\n  ActiveInUse = 'activeInUse',\n}\n\nexport enum FilterActiveUntil {\n  NotExpired = 'notExpired',\n}\n\nexport enum CodeStatusFilter {\n  Active = 'active',\n  Blocked = 'blocked',\n  Expired = 'expired',\n  Pending = 'pending',\n}","export enum PageType {\n  Page = 'page',\n  Chapter = 'chapter',\n}\n\nexport enum CourseModule {\n  Learning = 'learning',\n  Training = 'training',\n  Testexam = 'testexam',\n}\n\nexport enum PresentationOwnership {\n  Shared = 'shared',\n  Own = 'own',\n  Provider = 'provider'\n}\n\nexport enum GamesAndChatStatus {\n  Disabled = 'disabled',\n  DisabledAndHidden = 'disabled-and-hidden',\n  Enabled = 'enabled',\n}\n\nexport enum RatingStatus {\n  NotRated = 'not-rated',\n  Rated = 'rated',\n  WontRate = 'wont-rate',\n}\n\n/**\n * default course titles - used for retrieval of default courses\n */\nexport enum CourseTitleDefaults {\n  Frp = 'Radfahrkurs',\n  Risi = 'Fahrradkurs',\n  Yarrive = 'Führerscheinklasse-AM'\n}","export enum CSVType {\n  /**\n   * TSV file, explicitly presented as \"Excel compatible\"\n   */\n  TSV_UTF16BOM = 'tsv-utf16-bom',\n  /**\n   * Regular CSV file\n   */\n  CSV_UTF8 = 'csv-utf8'\n}\n","export enum DateIntervalType {\n  Days = 'days',\n  Weeks = 'weeks',\n  Months = 'months',\n  Quarters = 'quarters',\n  Years = 'years',\n}","export enum ContentView {\n  Conference = 'conference',\n  Course = 'course',\n  Quiz = 'quiz',\n}\n\nexport enum CommonEmitName {\n  MessageSent = 'message-sent',\n}\n\nexport enum LecturerEmitName {\n  ContinueDistinar = 'continue-distinar',\n  DeactivateAndLockAudio = 'deactivate-and-lock-audio',\n  DeactivateAndLockAudioForAll = 'deactivate-and-lock-audio-for-all',\n  DeactivateAndLockVideo = 'deactivate-and-lock-video',\n  DeactivateAndLockVideoForAll = 'deactivate-and-lock-video-for-all',\n  EndDistinar = 'end-distinar',\n  LowerAllRaisedHands = 'lower-all-raised-hands',\n  LowerSingleRaisedHand = 'lower-single-raised-hand',\n  PauseDistinar = 'pause-distinar',\n  PrepareQuickQuiz = 'prepare-quick-quiz',\n  PrepareTemplateQuiz = 'prepare-template-quiz',\n  ReconnectConference = 'reconnect-conference',\n  ResumePresentation = 'resume-presentation',\n  SetCourseFullscreenPicture = 'set-course-picture-fullscreen',\n  SetCourseRevealedAnswerBlockIds = 'set-course-revealed-answer-block-ids',\n  SetCourseSlide = 'set-course-slide',\n  SetCurrentContentView = 'set-current-content-view',\n  SetQrCodeState = 'set-qr-code-shown',\n  SetQuizQuestionIndex = 'set-quiz-question-index',\n  SetQuizState = 'set-quiz-state',\n  StartConference = 'start-conference',\n  StartOrReconnectDistinar = 'start-or-reconnect-distinar',\n  StartQuiz = 'start-quiz',\n  StopConference = 'stop-conference',\n  StopQuiz = 'stop-quiz',\n  SyncRequest = 'sync-request',\n  ToggleQuizShowHelpText = 'set-quiz-show-help-text',\n  UnlockAudio = 'unlock-audio',\n  UnlockAudioForAll = 'unlock-audio-for-all',\n  UnlockVideo = 'unlock-video',\n  UnlockVideoForAll = 'unlock-video-for-all',\n  WhiteboardChanged = 'whiteboard-changed',\n}\n\nexport enum StudentEmitName {\n  JoinConference = 'join-conference',\n  JoinDistinar = 'join-distinar',\n  LowerHand = 'lower-hand',\n  RaiseHand = 'raise-hand',\n  RecreateConferenceAttendee = 'recreate-conference-attendee',\n  SetAttendeeAudioState = 'set-attendee-audio-state',\n  SetAttendeeVideoState = 'set-attendee-video-state',\n  StillOnline = 'still-online',\n  SyncReply = 'sync-reply',\n}\n\nexport enum DistinarListenerEventName {\n  AttendeesChanged = 'attendees-changed',\n  DeactivateAndLockAudio = 'deactivate-and-lock-audio',\n  DeactivateAndLockVideo = 'deactivate-and-lock-video',\n  DistinarWasTakenOver = 'distinar-was-taken-over',\n  LowerAllRaisedHands = 'lower-all-raised-hands',\n  LowerSingleRaisedHand = 'lower-single-raised-hand',\n  MessageSent = 'message-sent',\n  Status = 'status',\n  SyncReply = 'sync-reply',\n  SyncRequest = 'sync-request',\n  SystemMessageSent = 'system-message-sent',\n  UnlockAudio = 'unlock-audio',\n  UnlockVideo = 'unlock-video',\n  WhiteboardChanged = 'whiteboard-changed',\n}\n\nexport enum AttendeeInputMediaState {\n  ACTIVE = 'active',\n  INACTIVE = 'inactive',\n  LOCKED = 'locked',\n}\n\nexport enum SyncRequestType {\n  QUIZ_ANSWER_SUBMITTED = 'quiz-answer-submitted',\n  QUIZ_QUESTION_LOADED = 'quiz-question-loaded',\n}\n\nexport enum WebSocketServiceEvent {\n  ConnectionDidFail = 'connection-did-fail',\n  Reconnected = 'reconnected',\n}\n\nexport enum EventStatus {\n  Ended = 'ended',\n  Expired = 'expired',\n  IsStarted = 'is-started',\n  Ready = 'ready',\n  WaitingForStart = 'waiting-for-start',\n}\n\nexport enum StudentEventStatus {\n  Attended = 'attended',\n  IsStarted = 'is-started',\n  NotAttended = 'not-attended',\n  StartingShortly = 'starting-shortly',\n  WaitingForLecturer = 'waiting-for-lecturer',\n}\n","export enum EaEvent {\n  ApiServiceTokenInvalid = 'api-service:token-invalid',\n  ApiServiceTooManySessions = 'api-service:too-many-sessions',\n  GenericServerError = 'api-service:generic-server-error',\n  MomentLocaleChanged = 'moment:locale-changed',\n  PromotionUserReset = 'api-service:promotion-user-reset',\n  RouteRemovedError = 'api-service:route-removed-error',\n  UpdateRecommended = 'api-service:update-recommended',\n  VideoPlayerPressedPlay = 'video-player:pressed-play',\n}\n","export enum ErrorType {\n  ADMINISTRATIVE_LOGIN_WRONG_CLIENT = 'ERR_ADMINISTRATIVE_LOGIN_WRONG_CLIENT',\n  AI_CONTENT_POLICY_VIOLATION = 'ERR_AI_CONTENT_POLICY_VIOLATION',\n  AI_INSUFFICIENT_INFORMATION = 'ERR_AI_INSUFFICIENT_INFORMATION',\n  AI_PROMPT_TOO_LONG = 'ERR_AI_PROMPT_TOO_LONG',\n  AI_RESPONSE_FORMAT_ERROR = 'ERR_AI_FORMAT_ERROR',\n  AI_TOO_MANY_REQUESTS = 'ERR_AI_TOO_MANY_REQUESTS',\n  AI_UNKNOWN_ERROR = 'ERR_AI_UNKNOWN_ERROR',\n  ALREADY_IN_COURSE = 'ERR_ALREADY_IN_COURSE',\n  ALREADY_SELF_ENROLLED = 'ERR_ALREADY_SELF_ENROLLED',\n  AVATAR_COMPONENT_SET_NOT_FOUND = 'ERR_AVATAR_COMPONENT_SET_NOT_FOUND',\n  BAD_GATEWAY_PROBABLY_SERVER_DOWN = 'BAD_GATEWAY_PROBABLY_SERVER_DOWN ',\n  BLACKLISTED_NICKNAME = 'ERR_BLACKLISTED_NICKNAME',\n  BLOCK_DOES_NOT_BELONG_TO_GIVEN_COURSE = 'ERR_BLOCK_DOES_NOT_BELONG_TO_GIVEN_COURSE',\n  BLOCK_WITHOUT_COURSE = 'ERR_BLOCK_WITHOUT_COURSE',\n  CANNOT_DELETE_EVENT_WITH_ATTENDANCE = 'ERR_CANNOT_DELETE_EVENT_WITH_ATTENDANCE',\n  CANNOT_DELETE_LAST_SLIDE = 'ERR_CANNOT_DELETE_LAST_SLIDE',\n  CANNOT_DELETE_NONEMPTY_COURSE_GROUP = 'ERR_CANNOT_DELETE_NONEMPTY_COURSE_GROUP',\n  CANNOT_DELETE_WITH_SUBPAGES = 'ERR_CANNOT_DELETE_WITH_SUBPAGES',\n  CANNOT_MESSAGE_YOURSELF = 'ERR_CANT_MESSAGE_YOURSELF',\n  CHIME_CONFERENCE_DOES_NOT_EXIST = 'CHIME_CONFERENCE_DOES_NOT_EXIST',\n  COURSE_GROUP_IS_DUPLICATE = 'ERR_COURSE_GROUP_IS_DUPLICATE',\n  COURSE_INVITATION_CODE_ALREADY_ACTIVE = 'ERR_COURSE_INVITATION_ALREADY_ACTIVE',\n  COURSE_INVITATION_EMAIL_RATE_LIMIT = 'ERR_COURSE_INVITATION_EMAIL_RATE_LIMIT',\n  COURSE_INVITATION_NO_PHONE_NUMBER = 'ERR_COURSE_INVITATION_NO_PHONE_NUMBER',\n  COURSE_INVITATION_NO_USER = 'ERR_COURSE_INVITATION_NO_USER',\n  COURSE_QUESTION_ALREADY_MARKED = 'ERR_COURSE_QUESTION_ALREADY_MARKED',\n  COURSE_TITLE_ALREADY_IN_USE = 'ERR_COURSE_TITLE_ALREADY_IN_USE',\n  DISABLED_TENANT = 'ERR_DISABLED_TENANT',\n  DUEL_COURSE_NOT_ACCESSIBLE = 'ERR_DUEL_COURSE_NOT_ACCESSIBLE',\n  DUEL_OPPONENT_LACKS_COURSE = 'ERR_DUEL_OPPONENT_LACKS_COURSE',\n  EVENT_ATTENDANCE_INTERVAL_OUT_OF_BOUNDS = 'ERR_EVENT_ATTENDANCE_INTERVAL_OUT_OF_BOUNDS',\n  EXAM_DATE_CANNOT_BE_IN_THE_PAST = 'ERR_EXAM_DATE_CANNOT_BE_IN_PAST',\n  EXAMPLATFORM_NOT_LINKED = 'ERR_EXAMPLATFORM_NOT_LINKED',\n  EXAMPLATFORM_TENANT_NOT_FOUND = 'ERR_EXAMPLATFORM_TENANT_NOT_FOUND',\n  EXT_API_BAD_EMAIL = 'ERR_EXT_API_BAD_EMAIL',\n  EXT_API_INVALID_KEY = 'ERR_EXT_API_INVALID_KEY',\n  EXT_API_MISSING_KEY = 'ERR_EXT_API_MISSING_KEY',\n  EXT_API_STUDENT_IMPORT_FAILED = 'ERR_EXT_API_STUDENT_IMPORT_FAILED',\n  EXT_API_STUDENT_VALIDATION_FAILED = 'ERR_EXT_API_STUDENT_VALIDATION_FAILED',\n  EXTERNAL_VIDEO_VALIDATION_FAILED = 'ERR_EXTERNAL_VIDEO_VALIDATION_FAILED',\n  FILE_WITH_SAME_NAME_ALREADY_EXISTS = 'ERR_FILE_WITH_SAME_NAME_ALREADY_EXISTS',\n  FRIEND_REQUEST_EXISTS = 'ERR_FRIEND_REQUEST_EXISTS',\n  INVALID_ACCESS_CODE = 'ERR_INVALID_ACCESS_CODE',\n  INVALID_ANIMATION_FILE = 'ERR_INVALID_ANIMATION_FILE',\n  INVALID_EMAIL = 'ERR_INVALID_EMAIL',\n  INVALID_LOGIN = 'ERR_INVALID_LOGIN',\n  INVALID_ROLE = 'ERR_INVALID_ROLE',\n  INVALID_TFA = 'ERR_INVALID_TFA',\n  LECTURE_MODE_EXPIRED = 'ERR_LECTURE_MODE_EXPIRED',\n  LECTURE_PARTICIPANT_LIMIT_REACHED = 'ERR_LECTURE_PARTICIPANT_LIMIT_REACHED',\n  LECTURE_WAS_ALREADY_STARTED = 'ERR_LECTURE_WAS_ALREADY_STARTED',\n  MISSING_INFORMATION = 'ERR_MISSING_INFORMATION',\n  NEW_PASSWORD_TOO_SHORT = 'ERR_NEW_PASSWORD_TOO_SHORT',\n  NICKNAME_ALREADY_TAKEN = 'ERR_NICKNAME_ALREADY_TAKEN',\n  NO_ACTIVE_TRAINING_SESSION = 'ERR_NO_ACTIVE_TRAINING_SESSION',\n  NO_PERMISSION = 'ERR_NO_PERMISSION',\n  NO_PERMISSION_WITH_REASON = 'ERR_NO_PERMISSION_WITH_REASON',\n  NO_VALID_UPLOAD_FILE = 'ERR_NO_VALID_UPLOAD_FILE',\n  OTHER_DUEL_IN_PROGRESS = 'ERR_OTHER_DUEL_IN_PROGRESS',\n  PARENT_PAGE_MUST_BE_CHAPTER = 'ERR_PARENT_PAGE_MUST_BE_CHAPTER',\n  PASSWORD_RESET_CODE_INVALID = 'ERR_PASSWORD_RESET_CODE_INVALID',\n  PHONE_NUMBER_EXISTS = 'ERR_PHONE_NUMBER_EXISTS',\n  PIN_CODE_NOT_FOUND = 'ERR_PIN_CODE_NOT_FOUND',\n  PROGRESS_NOT_AVAILABLE = 'ERR_PROGRESS_NOT_AVAILABLE',\n  PROGRESS_NOT_AVAILABLE_DIFFERENT_COURSE = 'ERR_PROGRESS_NOT_AVAILABLE_DIFFERENT_COURSE',\n  PROMOTION_NOT_FOUND = 'ERR_PROMOTION_NOT_FOUND',\n  QUIZ_ALREADY_FINISHED = 'ERR_QUIZ_ALREADY_FINISHED',\n  QUIZ_HAS_NO_QUESTIONS = 'ERR_QUIZ_HAS_NO_QUESTIONS',\n  QUIZ_TEMPLATE_QUESTION_LIMIT = 'ERR_QUIZ_TEMPLATE_QUESTION_LIMIT',\n  RESOURCE_IN_USE = 'ERR_RESOURCE_IN_USE',\n  RESOURCE_NOT_FOUND = 'ERR_RESOURCE_NOT_FOUND',\n  ROUTE_REMOVED = 'ERR_ROUTE_REMOVED',\n  SHARE_ALREADY_EXISTS = 'ERR_SHARE_ALREADY_EXISTS',\n  STATISTICS_ERROR = 'ERR_STATISTICS_ERROR',\n  STUDENT_IMPORT_INVALID_DATE = 'ERR_STUDENT_IMPORT_INVALID_DATE',\n  SYNC_API_ERROR = 'ERR_SYNC_API_ERROR',\n  TEACHER_REGISTRATION_EXISTS = 'ERR_TEACHER_REGISTRATION_EXISTS',\n  TENANT_ALREADY_HAS_OPERATOR = 'ERR_TENANT_ALREADY_HAS_OPERATOR',\n  TENANT_ID_ALREADY_IN_USE = 'ERR_TENANT_ID_ALREADY_IN_USE',\n  TENANT_MUST_HAVE_BILLING_ADDRESS = 'ERR_TENANT_MUST_HAVE_BILLING_ADDRESS',\n  TFA_ALREADY_ENABLED = 'ERR_TFA_ALREADY_ENABLED',\n  TOKEN_INVALID = 'ERR_TOKEN_INVALID',\n  TOO_MANY_INVALID_LOGINS_BY_IP = 'ERR_TOO_MANY_INVALID_LOGINS_BY_IP',\n  TOO_MANY_SESSIONS = 'ERR_TOO_MANY_SESSIONS',\n  USER_ALREADY_BELONGS_TO_TENANT = 'ERR_USER_ALREADY_BELONGS_TO_TENANT',\n  USER_CTX_OR_TENANTID_REQUIRED = 'ERR_USER_CTX_OR_TENANTID_REQUIRED',\n  USER_EXISTS = 'ERR_USER_EXISTS',\n  USER_EXISTS_AS_ADMIN = 'ERR_USER_EXISTS_AS_ADMIN',\n  USER_EXISTS_AS_STUDENT = 'ERR_USER_EXISTS_AS_STUDENT',\n  USER_LOGIN_WRONG_CLIENT = 'ERR_USER_LOGIN_WRONG_CLIENT',\n  USER_NOT_FOUND = 'ERR_USER_NOT_FOUND',\n  VALIDATION_FAILED = 'ERR_VALIDATION_FAILED',\n}\n","/**\n * is used in DB models!\n */\nexport enum SyncActionStatus {\n  Pending = 'pending',\n  Success = 'success',\n  ErrorNonblocking = 'error_nonblocking',\n  ErrorApiKeyRejected = 'error_api_key_rejected',\n  ErrorTimeout = 'error_timeout',\n  ErrorServerError = 'error_server_error',\n  ErrorServerUnreachable = 'error_server_unreachable',\n  ErrorUnknown = 'error_unknown',\n  ErrorValidation = 'error_validation',\n  Canceled = 'canceled'\n}\n\n/**\n * SyncQueueEntries with these status can be (re)tried\n */\nexport const PendingSyncActionStatus: SyncActionStatus[] = [\n  SyncActionStatus.Pending,\n  SyncActionStatus.ErrorUnknown,\n  SyncActionStatus.ErrorApiKeyRejected,\n  SyncActionStatus.ErrorServerError,\n  SyncActionStatus.ErrorServerUnreachable,\n  SyncActionStatus.ErrorTimeout,\n  SyncActionStatus.ErrorValidation,\n];\n\n/**\n* SyncQueueEntries with these status are considered completed\n*/\nexport const FinishedSyncActionStatus: SyncActionStatus[] = [\n  SyncActionStatus.Success,\n  SyncActionStatus.ErrorNonblocking,\n  SyncActionStatus.Canceled,\n];\n\nexport enum VirtualSyncActionStatus {\n  Todo = 'todo',\n  Done = 'done',\n}\n\n/**\n * is used in DB models!\n */\nexport enum SyncActionType {\n  Create = 'create',\n  Read = 'read',\n  Update = 'update',\n  Delete = 'delete',\n  Unknown = 'unknown',\n}\n\nexport enum SyncLogOnlyActionType {\n  Unlink = 'unlink',\n}\n\nexport type SyncLogActionType = SyncActionType | SyncLogOnlyActionType;\n\n/**\n * is used in DB models!\n *\n * intentional not called SyncActionDirection because\n * type could be more than incoming and outgoing\n */\nexport enum SyncLogType {\n  Incoming = 'incoming',\n  Outgoing = 'outgoing',\n  Other = 'other',\n}\n\nexport enum SyncEndpoint {\n  TENANT_ADDRESS = 'TENANT_ADDRESS',\n  COURSE_GROUP = 'COURSE_GROUP',\n  ACCESS_CODE = 'ACCESS_CODE',\n  EVENT = 'EVENT',\n  AVATAR = 'AVATAR',\n  SYNC = 'SYNC',\n}\n","export enum FileSymbol {\n  Archive = 'archive',\n  Code = 'code',\n  Download = 'download',\n  Pdf = 'file', // for some reason this is called \"file\", won't change because it might need migration\n  FileText = 'file-text',\n  Headphones = 'headphones',\n  Image = 'image',\n  Save = 'save',\n  Video = 'video',\n}\n","export enum GalleryMediaType {\n  Audio = 'audio',\n  File = 'file',\n  Picture = 'picture',\n  Video = 'video',\n  Scorm = 'scorm',\n}\n","export enum KeyboardKey {\n  ArrowLeft = 'ArrowLeft',\n  ArrowRight = 'ArrowRight',\n  Backquote = 'Backquote',\n  Enter = 'Enter',\n  Escape = 'Escape',\n  Space = ' ',\n  Tab = 'Tab',\n}\n","export enum MediaRelation {\n  Course = 'course',\n  User = 'user',\n  Auto = 'auto',\n}\n\nexport type MediaRelationConfig = {\n  type: MediaRelation.Auto;\n} | {\n  type: MediaRelation.Course;\n  /** if undefined, take first course relation */\n  courseId?: number;\n} | {\n  type: MediaRelation.User;\n  /** if undefined, take first user relation */\n  userId?: number;\n};\n","export enum NotificationEvents {\n  NewNotification = 'new-notification',\n  NotificationsDeleted = 'notifications-deleted',\n}\n\nexport enum NotificationType {\n  ChatMessage = 'chat-message',\n  CoinsUpdated = 'coins-updated',\n  CourseIsArchivedChanged = 'course-is-archived-changed',\n  DuelMessage = 'duel-message',\n  EventReminder = 'event-reminder',\n  Feedback = 'feedback',\n  FriendRequest = 'friend-request',\n  FriendRequestAccepted = 'friend-request-accepted',\n  LearnReminder = 'learn-reminder',\n  PointsReceived = 'points-received',\n}\n","export enum QuestionTheme {\n  Exam = 'exam',\n  Landscape = 'landscape',\n  Lecturer = 'lecturer',\n  AttendeeLocal = 'attendee-local',\n  AttendeeRemote = 'attendee-remote',\n}\n","export enum QuizAttemptStatus {\n  Ready = 'ready',\n  Running = 'running',\n  Finished = 'finished',\n  Suspended = 'suspended',\n}\n\nexport enum QuizSessionType {\n  Training = 'training',\n  Learning = 'learning',\n  Duel = 'duel',\n  Testexam = 'testexam',\n  Lecture = 'lecture',\n  /** Radfahrprüfung */\n  Assessment = 'assessment'\n}\n\nexport enum TestexamLayout {\n  AskUser = 'ask-user',\n  Yarrive = 'yarrive',\n  Classic = 'classic'\n}\n\nexport enum QuizAnswerTime {\n  Long = 'long',\n  Manual = 'manual',\n  Medium = 'medium',\n  Short = 'short',\n}\n\nexport enum DuelType {\n  Random = 'random',\n  Buddy = 'buddy',\n}\n\nexport enum DuelStatus {\n  FirstPlayerTurn = 'first-player-turn',\n  InvitationPending = 'invitation-pending',\n  InvitationExpired = 'invitation-expired',\n  Accepted = 'accepted',\n  Declined = 'declined',\n  Finished = 'finished',\n}\n\nexport enum ContrastMode {\n  High = 'high',\n  Default = 'default',\n}\n","export enum ExamType {\r\n  Default = 'default',\r\n  FS_AM = 'fs_am',\r\n  FS_GW = 'fs_gw',\r\n  FS_A = 'fs_a',\r\n  FS_B = 'fs_b',\r\n  FS_BE = 'fs_be',\r\n  FS_C = 'fs_c',\r\n  FS_D = 'fs_d',\r\n  FS_E = 'fs_e',\r\n  FS_F = 'fs_f',\r\n  FS_COMBO = 'fs_combo',\r\n  FRP = 'frp',\r\n  C95_STANDARD = 'c95_standard',\r\n  D95_STANDARD = 'd95_standard',\r\n  C95_ANRECHNER = 'c95_anrechner',\r\n  D95_ANRECHNER = 'd95_anrechner',\r\n  C95_AUSWEITER = 'c95_ausweiter',\r\n  D95_AUSWEITER = 'd95_ausweiter',\r\n  C95_STANDARD_WIEN = 'c95_standard_wien',\r\n  D95_STANDARD_WIEN = 'd95_standard_wien',\r\n  C95_ANRECHNER_WIEN = 'c95_anrechner_wien',\r\n  D95_ANRECHNER_WIEN = 'd95_anrechner_wien',\r\n  C95_AUSWEITER_WIEN = 'c95_ausweiter_wien',\r\n  D95_AUSWEITER_WIEN = 'd95_ausweiter_wien',\r\n  C95_PRAXIS_WIEN = 'c95_praxis_wien',\r\n  D95_PRAXIS_WIEN = 'd95_praxis_wien',\r\n}\r\n\r\nexport enum TrainingSessionType {\r\n  SpacedRepetition = 'spaced-repetition',\r\n  Free = 'free',\r\n  Marked = 'marked',\r\n  Chat = 'chat',\r\n  Unknown = 'unknown',\r\n}\r\n"],"names":[],"sourceRoot":""}