@digabi/exam-engine-core 23.8.1 → 23.8.2-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/dist/__tests__/examServerApi.d.ts.map +1 -1
  2. package/dist/__tests__/examServerApi.js +2 -0
  3. package/dist/__tests__/examServerApi.js.map +1 -1
  4. package/dist/__tests__/playwright/exam/Exam.test.js +17 -18
  5. package/dist/__tests__/playwright/exam/Exam.test.js.map +1 -1
  6. package/dist/__tests__/playwright/stories/exam/Exam.story.d.ts +1 -5
  7. package/dist/__tests__/playwright/stories/exam/Exam.story.d.ts.map +1 -1
  8. package/dist/__tests__/playwright/stories/exam/Exam.story.js +7 -45
  9. package/dist/__tests__/playwright/stories/exam/Exam.story.js.map +1 -1
  10. package/dist/__tests__/playwright/utils/utils.d.ts +1 -1
  11. package/dist/__tests__/playwright/utils/utils.d.ts.map +1 -1
  12. package/dist/__tests__/playwright/utils/utils.js +2 -2
  13. package/dist/__tests__/playwright/utils/utils.js.map +1 -1
  14. package/dist/__tests__/tsconfig.tsbuildinfo +1 -1
  15. package/dist/components/context/QuestionContext.d.ts.map +1 -1
  16. package/dist/components/context/QuestionContext.js +1 -1
  17. package/dist/components/context/QuestionContext.js.map +1 -1
  18. package/dist/components/exam/AudioAnswer.d.ts +7 -0
  19. package/dist/components/exam/AudioAnswer.d.ts.map +1 -0
  20. package/dist/components/exam/AudioAnswer.js +79 -0
  21. package/dist/components/exam/AudioAnswer.js.map +1 -0
  22. package/dist/components/exam/AudioAnswerRecorder.d.ts +10 -0
  23. package/dist/components/exam/AudioAnswerRecorder.d.ts.map +1 -0
  24. package/dist/components/exam/AudioAnswerRecorder.js +28 -0
  25. package/dist/components/exam/AudioAnswerRecorder.js.map +1 -0
  26. package/dist/components/exam/Exam.d.ts.map +1 -1
  27. package/dist/components/exam/Exam.js +13 -2
  28. package/dist/components/exam/Exam.js.map +1 -1
  29. package/dist/components/exam/OralAnswer.d.ts +6 -0
  30. package/dist/components/exam/OralAnswer.d.ts.map +1 -0
  31. package/dist/components/exam/OralAnswer.js +18 -0
  32. package/dist/components/exam/OralAnswer.js.map +1 -0
  33. package/dist/components/grading/GradingAnswer.d.ts +2 -6
  34. package/dist/components/grading/GradingAnswer.d.ts.map +1 -1
  35. package/dist/components/grading/GradingAnswer.js +4 -3
  36. package/dist/components/grading/GradingAnswer.js.map +1 -1
  37. package/dist/components/results/AudioAnswer.d.ts +6 -0
  38. package/dist/components/results/AudioAnswer.d.ts.map +1 -0
  39. package/dist/components/results/AudioAnswer.js +29 -0
  40. package/dist/components/results/AudioAnswer.js.map +1 -0
  41. package/dist/components/results/Results.d.ts.map +1 -1
  42. package/dist/components/results/Results.js +3 -1
  43. package/dist/components/results/Results.js.map +1 -1
  44. package/dist/components/shared/internal/AudioError.d.ts +8 -0
  45. package/dist/components/shared/internal/AudioError.d.ts.map +1 -0
  46. package/dist/components/shared/internal/AudioError.js +17 -0
  47. package/dist/components/shared/internal/AudioError.js.map +1 -0
  48. package/dist/components/shared/internal/AudioRecordingError.d.ts +8 -0
  49. package/dist/components/shared/internal/AudioRecordingError.d.ts.map +1 -0
  50. package/dist/components/shared/internal/AudioRecordingError.js +17 -0
  51. package/dist/components/shared/internal/AudioRecordingError.js.map +1 -0
  52. package/dist/dom-utils.js +1 -1
  53. package/dist/dom-utils.js.map +1 -1
  54. package/dist/i18n/fi-FI.d.ts +4 -0
  55. package/dist/i18n/fi-FI.d.ts.map +1 -1
  56. package/dist/i18n/fi-FI.js +4 -0
  57. package/dist/i18n/fi-FI.js.map +1 -1
  58. package/dist/i18n/sv-FI.d.ts.map +1 -1
  59. package/dist/i18n/sv-FI.js +4 -0
  60. package/dist/i18n/sv-FI.js.map +1 -1
  61. package/dist/index.d.ts +1 -1
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/main-bundle.js +13 -13
  64. package/dist/main-bundle.js.LICENSE.txt +7 -0
  65. package/dist/main.css +1 -1
  66. package/dist/node_modules_music-metadata_lib_aiff_AiffParser_js.main-bundle.js +33 -0
  67. package/dist/node_modules_music-metadata_lib_dsdiff_DsdiffParser_js.main-bundle.js +26 -0
  68. package/dist/node_modules_music-metadata_lib_dsf_DsfParser_js.main-bundle.js +33 -0
  69. package/dist/node_modules_music-metadata_lib_wavpack_WavPackParser_js.main-bundle.js +26 -0
  70. package/dist/parser/parseExamStructure.d.ts +8 -1
  71. package/dist/parser/parseExamStructure.d.ts.map +1 -1
  72. package/dist/parser/parseExamStructure.js +1 -1
  73. package/dist/parser/parseExamStructure.js.map +1 -1
  74. package/dist/types/ExamAnswer.d.ts +5 -1
  75. package/dist/types/ExamAnswer.d.ts.map +1 -1
  76. package/dist/types/ExamServerAPI.d.ts +4 -0
  77. package/dist/types/ExamServerAPI.d.ts.map +1 -1
  78. package/dist/types/GradingStructure.d.ts +7 -1
  79. package/dist/types/GradingStructure.d.ts.map +1 -1
  80. package/dist/validateAnswers.d.ts.map +1 -1
  81. package/dist/validateAnswers.js +1 -0
  82. package/dist/validateAnswers.js.map +1 -1
  83. package/dist/vendors-node_modules_music-metadata_lib_asf_AsfParser_js.main-bundle.js +40 -0
  84. package/dist/vendors-node_modules_music-metadata_lib_flac_FlacParser_js.main-bundle.js +47 -0
  85. package/dist/vendors-node_modules_music-metadata_lib_id3v2_ID3v2Parser_js.main-bundle.js +26 -0
  86. package/dist/vendors-node_modules_music-metadata_lib_matroska_MatroskaParser_js.main-bundle.js +40 -0
  87. package/dist/vendors-node_modules_music-metadata_lib_mp4_MP4Parser_js.main-bundle.js +33 -0
  88. package/dist/vendors-node_modules_music-metadata_lib_mpeg_MpegParser_js.main-bundle.js +47 -0
  89. package/dist/vendors-node_modules_music-metadata_lib_musepack_MusepackParser_js.main-bundle.js +68 -0
  90. package/dist/vendors-node_modules_music-metadata_lib_ogg_OggParser_js.main-bundle.js +82 -0
  91. package/dist/vendors-node_modules_music-metadata_lib_wav_WaveParser_js.main-bundle.js +40 -0
  92. package/package.json +4 -3
  93. package/dist/__tests__/annotations.test.d.ts +0 -2
  94. package/dist/__tests__/annotations.test.d.ts.map +0 -1
  95. package/dist/__tests__/annotations.test.js +0 -306
  96. package/dist/__tests__/annotations.test.js.map +0 -1
  97. package/dist/__tests__/playwright/Annotations.test.d.ts +0 -2
  98. package/dist/__tests__/playwright/Annotations.test.d.ts.map +0 -1
  99. package/dist/__tests__/playwright/Annotations.test.js +0 -201
  100. package/dist/__tests__/playwright/Annotations.test.js.map +0 -1
  101. package/dist/__tests__/playwright/attachments/Attachments.test.d.ts +0 -2
  102. package/dist/__tests__/playwright/attachments/Attachments.test.d.ts.map +0 -1
  103. package/dist/__tests__/playwright/attachments/Attachments.test.js +0 -30
  104. package/dist/__tests__/playwright/attachments/Attachments.test.js.map +0 -1
  105. package/dist/__tests__/playwright/grading-instructions/GradingInstructions.test.d.ts +0 -2
  106. package/dist/__tests__/playwright/grading-instructions/GradingInstructions.test.d.ts.map +0 -1
  107. package/dist/__tests__/playwright/grading-instructions/GradingInstructions.test.js +0 -30
  108. package/dist/__tests__/playwright/grading-instructions/GradingInstructions.test.js.map +0 -1
  109. package/dist/__tests__/playwright/stories/Annotations.story.d.ts +0 -15
  110. package/dist/__tests__/playwright/stories/Annotations.story.d.ts.map +0 -1
  111. package/dist/__tests__/playwright/stories/Annotations.story.js +0 -27
  112. package/dist/__tests__/playwright/stories/Annotations.story.js.map +0 -1
  113. package/dist/__tests__/playwright/stories/attachments/Attachments.story.d.ts +0 -13
  114. package/dist/__tests__/playwright/stories/attachments/Attachments.story.d.ts.map +0 -1
  115. package/dist/__tests__/playwright/stories/attachments/Attachments.story.js +0 -17
  116. package/dist/__tests__/playwright/stories/attachments/Attachments.story.js.map +0 -1
  117. package/dist/__tests__/playwright/stories/grading-intructions/GradingInstructions.story.d.ts +0 -13
  118. package/dist/__tests__/playwright/stories/grading-intructions/GradingInstructions.story.d.ts.map +0 -1
  119. package/dist/__tests__/playwright/stories/grading-intructions/GradingInstructions.story.js +0 -16
  120. package/dist/__tests__/playwright/stories/grading-intructions/GradingInstructions.story.js.map +0 -1
  121. package/dist/assets/closeButton.svg +0 -1
  122. package/dist/assets/collapse.svg +0 -12
  123. package/dist/assets/expand.svg +0 -12
  124. package/dist/assets/helpButton.svg +0 -9
  125. package/dist/assets/redoButton.svg +0 -5
  126. package/dist/assets/undoButton.svg +0 -5
  127. package/dist/components/grading/examAnnotationUtils.d.ts +0 -4
  128. package/dist/components/grading/examAnnotationUtils.d.ts.map +0 -1
  129. package/dist/components/grading/examAnnotationUtils.js +0 -123
  130. package/dist/components/grading/examAnnotationUtils.js.map +0 -1
  131. package/dist/components/results/DNDAnswerContainer.d.ts +0 -4
  132. package/dist/components/results/DNDAnswerContainer.d.ts.map +0 -1
  133. package/dist/components/results/DNDAnswerContainer.js +0 -22
  134. package/dist/components/results/DNDAnswerContainer.js.map +0 -1
  135. package/dist/components/shared/AnnotatableText.d.ts +0 -5
  136. package/dist/components/shared/AnnotatableText.d.ts.map +0 -1
  137. package/dist/components/shared/AnnotatableText.js +0 -25
  138. package/dist/components/shared/AnnotatableText.js.map +0 -1
  139. package/dist/components/shared/AnnotationImageMark.d.ts +0 -16
  140. package/dist/components/shared/AnnotationImageMark.d.ts.map +0 -1
  141. package/dist/components/shared/AnnotationImageMark.js +0 -99
  142. package/dist/components/shared/AnnotationImageMark.js.map +0 -1
  143. package/dist/components/shared/AnnotationMark.d.ts +0 -9
  144. package/dist/components/shared/AnnotationMark.d.ts.map +0 -1
  145. package/dist/components/shared/AnnotationMark.js +0 -14
  146. package/dist/components/shared/AnnotationMark.js.map +0 -1
  147. package/dist/components/shared/AnnotationPopup.d.ts +0 -3
  148. package/dist/components/shared/AnnotationPopup.d.ts.map +0 -1
  149. package/dist/components/shared/AnnotationPopup.js +0 -24
  150. package/dist/components/shared/AnnotationPopup.js.map +0 -1
  151. package/dist/components/shared/AnnotationTextMark.d.ts +0 -11
  152. package/dist/components/shared/AnnotationTextMark.d.ts.map +0 -1
  153. package/dist/components/shared/AnnotationTextMark.js +0 -21
  154. package/dist/components/shared/AnnotationTextMark.js.map +0 -1
  155. package/dist/components/shared/markText.d.ts +0 -6
  156. package/dist/components/shared/markText.d.ts.map +0 -1
  157. package/dist/components/shared/markText.js +0 -77
  158. package/dist/components/shared/markText.js.map +0 -1
  159. package/dist/eslint.config.d.ts +0 -22
  160. package/dist/eslint.config.d.ts.map +0 -1
  161. package/dist/eslint.config.js +0 -31
  162. package/dist/eslint.config.js.map +0 -1
  163. package/dist/i18n/exam_titles_fi-FI.d.ts +0 -46
  164. package/dist/i18n/exam_titles_fi-FI.d.ts.map +0 -1
  165. package/dist/i18n/exam_titles_fi-FI.js +0 -46
  166. package/dist/i18n/exam_titles_fi-FI.js.map +0 -1
  167. package/dist/i18n/exam_titles_fi-FI.json +0 -45
  168. package/dist/i18n/exam_titles_sv-FI.d.ts +0 -46
  169. package/dist/i18n/exam_titles_sv-FI.d.ts.map +0 -1
  170. package/dist/i18n/exam_titles_sv-FI.js +0 -46
  171. package/dist/i18n/exam_titles_sv-FI.js.map +0 -1
  172. package/dist/i18n/exam_titles_sv-FI.json +0 -45
  173. package/dist/i18n/exams.d.ts +0 -11
  174. package/dist/i18n/exams.d.ts.map +0 -1
  175. package/dist/i18n/exams.js +0 -10
  176. package/dist/i18n/exams.js.map +0 -1
  177. package/dist/types/ExamAnnotations.d.ts +0 -46
  178. package/dist/types/ExamAnnotations.d.ts.map +0 -1
  179. package/dist/types/ExamAnnotations.js +0 -2
  180. package/dist/types/ExamAnnotations.js.map +0 -1
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ /*
3
+ * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
4
+ * This devtool is neither made for production nor for readable output files.
5
+ * It uses "eval()" calls to create a separate source file in the browser devtools.
6
+ * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
7
+ * or disable the default devtool with "devtool: false".
8
+ * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
9
+ */
10
+ (this["webpackChunkExamBundle"] = this["webpackChunkExamBundle"] || []).push([["node_modules_music-metadata_lib_wavpack_WavPackParser_js"],{
11
+
12
+ /***/ "../../node_modules/music-metadata/lib/wavpack/WavPackParser.js":
13
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
14
+
15
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ WavPackContentError: () => (/* binding */ WavPackContentError),\n/* harmony export */ WavPackParser: () => (/* binding */ WavPackParser)\n/* harmony export */ });\n/* harmony import */ var token_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"../../node_modules/token-types/lib/index.js\");\n/* harmony import */ var _apev2_APEv2Parser_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(\"../../node_modules/music-metadata/lib/apev2/APEv2Parser.js\");\n/* harmony import */ var _common_FourCC_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(\"../../node_modules/music-metadata/lib/common/FourCC.js\");\n/* harmony import */ var _common_BasicParser_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(\"../../node_modules/music-metadata/lib/common/BasicParser.js\");\n/* harmony import */ var _WavPackToken_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(\"../../node_modules/music-metadata/lib/wavpack/WavPackToken.js\");\n/* harmony import */ var debug__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(\"../../node_modules/debug/src/browser.js\");\n/* harmony import */ var uint8array_extras__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(\"../../node_modules/uint8array-extras/index.js\");\n/* harmony import */ var _ParseError_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(\"../../node_modules/music-metadata/lib/ParseError.js\");\n\n\n\n\n\n\n\n\nconst debug = debug__WEBPACK_IMPORTED_MODULE_5__('music-metadata:parser:WavPack');\nclass WavPackContentError extends (0,_ParseError_js__WEBPACK_IMPORTED_MODULE_6__.makeUnexpectedFileContentError)('WavPack') {\n}\n/**\n * WavPack Parser\n */\nclass WavPackParser extends _common_BasicParser_js__WEBPACK_IMPORTED_MODULE_3__.BasicParser {\n constructor() {\n super(...arguments);\n this.audioDataSize = 0;\n }\n async parse() {\n this.audioDataSize = 0;\n // First parse all WavPack blocks\n await this.parseWavPackBlocks();\n // try to parse APEv2 header\n return _apev2_APEv2Parser_js__WEBPACK_IMPORTED_MODULE_1__.APEv2Parser.tryParseApeHeader(this.metadata, this.tokenizer, this.options);\n }\n async parseWavPackBlocks() {\n do {\n const blockId = await this.tokenizer.peekToken(_common_FourCC_js__WEBPACK_IMPORTED_MODULE_2__.FourCcToken);\n if (blockId !== 'wvpk')\n break;\n const header = await this.tokenizer.readToken(_WavPackToken_js__WEBPACK_IMPORTED_MODULE_4__.BlockHeaderToken);\n if (header.BlockID !== 'wvpk')\n throw new WavPackContentError('Invalid WavPack Block-ID');\n debug(`WavPack header blockIndex=${header.blockIndex}, len=${_WavPackToken_js__WEBPACK_IMPORTED_MODULE_4__.BlockHeaderToken.len}`);\n if (header.blockIndex === 0 && !this.metadata.format.container) {\n this.metadata.setFormat('container', 'WavPack');\n this.metadata.setFormat('lossless', !header.flags.isHybrid);\n // tagTypes: this.type,\n this.metadata.setFormat('bitsPerSample', header.flags.bitsPerSample);\n if (!header.flags.isDSD) {\n // In case isDSD, these values will ne set in ID_DSD_BLOCK\n this.metadata.setFormat('sampleRate', header.flags.samplingRate);\n this.metadata.setFormat('duration', header.totalSamples / header.flags.samplingRate);\n }\n this.metadata.setFormat('numberOfChannels', header.flags.isMono ? 1 : 2);\n this.metadata.setFormat('numberOfSamples', header.totalSamples);\n this.metadata.setFormat('codec', header.flags.isDSD ? 'DSD' : 'PCM');\n }\n const ignoreBytes = header.blockSize - (_WavPackToken_js__WEBPACK_IMPORTED_MODULE_4__.BlockHeaderToken.len - 8);\n await (header.blockIndex === 0 ? this.parseMetadataSubBlock(header, ignoreBytes) : this.tokenizer.ignore(ignoreBytes));\n if (header.blockSamples > 0) {\n this.audioDataSize += header.blockSize; // Count audio data for bit-rate calculation\n }\n } while (!this.tokenizer.fileInfo.size || this.tokenizer.fileInfo.size - this.tokenizer.position >= _WavPackToken_js__WEBPACK_IMPORTED_MODULE_4__.BlockHeaderToken.len);\n if (this.metadata.format.duration) {\n this.metadata.setFormat('bitrate', this.audioDataSize * 8 / this.metadata.format.duration);\n }\n }\n /**\n * Ref: http://www.wavpack.com/WavPack5FileFormat.pdf, 3.0 Metadata Sub-blocks\n * @param header Header\n * @param remainingLength Remaining length\n */\n async parseMetadataSubBlock(header, remainingLength) {\n let remaining = remainingLength;\n while (remaining > _WavPackToken_js__WEBPACK_IMPORTED_MODULE_4__.MetadataIdToken.len) {\n const id = await this.tokenizer.readToken(_WavPackToken_js__WEBPACK_IMPORTED_MODULE_4__.MetadataIdToken);\n const dataSizeInWords = await this.tokenizer.readNumber(id.largeBlock ? token_types__WEBPACK_IMPORTED_MODULE_0__.UINT24_LE : token_types__WEBPACK_IMPORTED_MODULE_0__.UINT8);\n const data = new Uint8Array(dataSizeInWords * 2 - (id.isOddSize ? 1 : 0));\n await this.tokenizer.readBuffer(data);\n debug(`Metadata Sub-Blocks functionId=0x${id.functionId.toString(16)}, id.largeBlock=${id.largeBlock},data-size=${data.length}`);\n switch (id.functionId) {\n case 0x0: // ID_DUMMY: could be used to pad WavPack blocks\n break;\n case 0xe: { // ID_DSD_BLOCK\n debug('ID_DSD_BLOCK');\n // https://github.com/dbry/WavPack/issues/71#issuecomment-483094813\n const mp = 1 << token_types__WEBPACK_IMPORTED_MODULE_0__.UINT8.get(data, 0);\n const samplingRate = header.flags.samplingRate * mp * 8; // ToDo: second factor should be read from DSD-metadata block https://github.com/dbry/WavPack/issues/71#issuecomment-483094813\n if (!header.flags.isDSD)\n throw new WavPackContentError('Only expect DSD block if DSD-flag is set');\n this.metadata.setFormat('sampleRate', samplingRate);\n this.metadata.setFormat('duration', header.totalSamples / samplingRate);\n break;\n }\n case 0x24: // ID_ALT_TRAILER: maybe used to embed original ID3 tag header\n debug('ID_ALT_TRAILER: trailer for non-wav files');\n break;\n case 0x26: // ID_MD5_CHECKSUM\n this.metadata.setFormat('audioMD5', data);\n break;\n case 0x2f: // ID_BLOCK_CHECKSUM\n debug(`ID_BLOCK_CHECKSUM: checksum=${(0,uint8array_extras__WEBPACK_IMPORTED_MODULE_7__.uint8ArrayToHex)(data)}`);\n break;\n default:\n debug(`Ignore unsupported meta-sub-block-id functionId=0x${id.functionId.toString(16)}`);\n break;\n }\n remaining -= _WavPackToken_js__WEBPACK_IMPORTED_MODULE_4__.MetadataIdToken.len + (id.largeBlock ? token_types__WEBPACK_IMPORTED_MODULE_0__.UINT24_LE.len : token_types__WEBPACK_IMPORTED_MODULE_0__.UINT8.len) + dataSizeInWords * 2;\n debug(`remainingLength=${remaining}`);\n if (id.isOddSize)\n this.tokenizer.ignore(1);\n }\n if (remaining !== 0)\n throw new WavPackContentError('metadata-sub-block should fit it remaining length');\n }\n}\n//# sourceMappingURL=WavPackParser.js.map\n\n//# sourceURL=webpack://ExamBundle/../../node_modules/music-metadata/lib/wavpack/WavPackParser.js?");
16
+
17
+ /***/ }),
18
+
19
+ /***/ "../../node_modules/music-metadata/lib/wavpack/WavPackToken.js":
20
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
21
+
22
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ BlockHeaderToken: () => (/* binding */ BlockHeaderToken),\n/* harmony export */ MetadataIdToken: () => (/* binding */ MetadataIdToken)\n/* harmony export */ });\n/* harmony import */ var token_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"../../node_modules/token-types/lib/index.js\");\n/* harmony import */ var _common_FourCC_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(\"../../node_modules/music-metadata/lib/common/FourCC.js\");\n\n\nconst SampleRates = [6000, 8000, 9600, 11025, 12000, 16000, 22050, 24000, 32000, 44100,\n 48000, 64000, 88200, 96000, 192000, -1];\n/**\n * WavPack Block Header\n *\n * 32-byte little-endian header at the front of every WavPack block\n *\n * Ref: http://www.wavpack.com/WavPack5FileFormat.pdf (page 2/6: 2.0 \"Block Header\")\n */\nconst BlockHeaderToken = {\n len: 32,\n get: (buf, off) => {\n const flags = token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_LE.get(buf, off + 24);\n const res = {\n // should equal 'wvpk'\n BlockID: _common_FourCC_js__WEBPACK_IMPORTED_MODULE_1__.FourCcToken.get(buf, off),\n // 0x402 to 0x410 are valid for decode\n blockSize: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_LE.get(buf, off + 4),\n // 0x402 (1026) to 0x410 are valid for decode\n version: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT16_LE.get(buf, off + 8),\n // 40-bit total samples for entire file (if block_index == 0 and a value of -1 indicates an unknown length)\n totalSamples: /* replace with bigint? (Token.UINT8.get(buf, off + 11) << 32) + */ token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_LE.get(buf, off + 12),\n // 40-bit block_index\n blockIndex: /* replace with bigint? (Token.UINT8.get(buf, off + 10) << 32) + */ token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_LE.get(buf, off + 16),\n // 40-bit total samples for entire file (if block_index == 0 and a value of -1 indicates an unknown length)\n blockSamples: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_LE.get(buf, off + 20),\n // various flags for id and decoding\n flags: {\n bitsPerSample: (1 + getBitAllignedNumber(flags, 0, 2)) * 8,\n isMono: isBitSet(flags, 2),\n isHybrid: isBitSet(flags, 3),\n isJointStereo: isBitSet(flags, 4),\n crossChannel: isBitSet(flags, 5),\n hybridNoiseShaping: isBitSet(flags, 6),\n floatingPoint: isBitSet(flags, 7),\n samplingRate: SampleRates[getBitAllignedNumber(flags, 23, 4)],\n isDSD: isBitSet(flags, 31)\n },\n // crc for actual decoded data\n crc: new token_types__WEBPACK_IMPORTED_MODULE_0__.Uint8ArrayType(4).get(buf, off + 28)\n };\n if (res.flags.isDSD) {\n res.totalSamples *= 8;\n }\n return res;\n }\n};\n/**\n * 3.0 Metadata Sub-Blocks\n * Ref: http://www.wavpack.com/WavPack5FileFormat.pdf (page 4/6: 3.0 \"Metadata Sub-Block\")\n */\nconst MetadataIdToken = {\n len: 1,\n get: (buf, off) => {\n return {\n functionId: getBitAllignedNumber(buf[off], 0, 6), // functionId overlaps with isOptional flag\n isOptional: isBitSet(buf[off], 5),\n isOddSize: isBitSet(buf[off], 6),\n largeBlock: isBitSet(buf[off], 7)\n };\n }\n};\nfunction isBitSet(flags, bitOffset) {\n return getBitAllignedNumber(flags, bitOffset, 1) === 1;\n}\nfunction getBitAllignedNumber(flags, bitOffset, len) {\n return (flags >>> bitOffset) & (0xffffffff >>> (32 - len));\n}\n//# sourceMappingURL=WavPackToken.js.map\n\n//# sourceURL=webpack://ExamBundle/../../node_modules/music-metadata/lib/wavpack/WavPackToken.js?");
23
+
24
+ /***/ })
25
+
26
+ }]);
@@ -59,7 +59,14 @@ export interface DragAndDropAnswerElement extends BaseElement {
59
59
  questionId: number;
60
60
  };
61
61
  }
62
+ export interface AudioAnswerElement extends BaseElement {
63
+ name: 'audio-answer';
64
+ attributes: {
65
+ displayNumber: string;
66
+ questionId: number;
67
+ };
68
+ }
62
69
  export type ExamElement = RootElement | SectionElement | QuestionElement | AnswerElement;
63
- export type AnswerElement = TextAnswerElement | ScoredTextAnswerElement | ChoiceAnswerElement | DropdownAnswerElement | DragAndDropAnswerElement;
70
+ export type AnswerElement = TextAnswerElement | ScoredTextAnswerElement | ChoiceAnswerElement | DropdownAnswerElement | DragAndDropAnswerElement | AudioAnswerElement;
64
71
  export declare function parseExamStructure(doc: XMLDocument): RootElement;
65
72
  //# sourceMappingURL=parseExamStructure.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseExamStructure.d.ts","sourceRoot":"","sources":["../../src/parser/parseExamStructure.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,WAAW,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC9C,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE;QACV,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;CACF;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,IAAI,EAAE,SAAS,CAAA;IACf,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;CACF;AAED,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAClD,IAAI,EAAE,UAAU,CAAA;IAChB,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;CACF;AAED,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,IAAI,EAAE,aAAa,CAAA;IACnB,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;QAClB,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,MAAM,WAAW,uBAAwB,SAAQ,WAAW;IAC1D,IAAI,EAAE,oBAAoB,CAAA;IAC1B,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACtD,IAAI,EAAE,eAAe,CAAA;IACrB,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,MAAM,WAAW,qBAAsB,SAAQ,WAAW;IACxD,IAAI,EAAE,iBAAiB,CAAA;IACvB,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,MAAM,WAAW,wBAAyB,SAAQ,WAAW;IAC3D,IAAI,EAAE,YAAY,CAAA;IAClB,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,cAAc,GAAG,eAAe,GAAG,aAAa,CAAA;AAExF,MAAM,MAAM,aAAa,GACrB,iBAAiB,GACjB,uBAAuB,GACvB,mBAAmB,GACnB,qBAAqB,GACrB,wBAAwB,CAAA;AAE5B,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,GAAG,WAAW,CAIhE"}
1
+ {"version":3,"file":"parseExamStructure.d.ts","sourceRoot":"","sources":["../../src/parser/parseExamStructure.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,WAAW,EAAE,CAAA;CAC1B;AAED,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC9C,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE;QACV,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;CACF;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,IAAI,EAAE,SAAS,CAAA;IACf,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;CACF;AAED,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAClD,IAAI,EAAE,UAAU,CAAA;IAChB,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;CACF;AAED,MAAM,WAAW,iBAAkB,SAAQ,WAAW;IACpD,IAAI,EAAE,aAAa,CAAA;IACnB,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;QAClB,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,MAAM,WAAW,uBAAwB,SAAQ,WAAW;IAC1D,IAAI,EAAE,oBAAoB,CAAA;IAC1B,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACtD,IAAI,EAAE,eAAe,CAAA;IACrB,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,MAAM,WAAW,qBAAsB,SAAQ,WAAW;IACxD,IAAI,EAAE,iBAAiB,CAAA;IACvB,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,MAAM,WAAW,wBAAyB,SAAQ,WAAW;IAC3D,IAAI,EAAE,YAAY,CAAA;IAClB,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACrD,IAAI,EAAE,cAAc,CAAA;IACpB,UAAU,EAAE;QACV,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,cAAc,GAAG,eAAe,GAAG,aAAa,CAAA;AAExF,MAAM,MAAM,aAAa,GACrB,iBAAiB,GACjB,uBAAuB,GACvB,mBAAmB,GACnB,qBAAqB,GACrB,wBAAwB,GACxB,kBAAkB,CAAA;AAEtB,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,GAAG,WAAW,CAIhE"}
@@ -16,7 +16,7 @@ function parseQuestion(question) {
16
16
  const childQuestions = queryAll(question, 'question', false);
17
17
  const childElements = childQuestions.length
18
18
  ? childQuestions.map(parseQuestion)
19
- : queryAll(question, ['text-answer', 'scored-text-answer', 'choice-answer', 'dropdown-answer', 'dnd-answer'], false).map(parseAnswer);
19
+ : queryAll(question, ['text-answer', 'scored-text-answer', 'choice-answer', 'dropdown-answer', 'dnd-answer', 'audio-answer'], false).map(parseAnswer);
20
20
  return parseElement(question, childElements, {
21
21
  displayNumber: getAttribute(question, 'display-number'),
22
22
  maxAnswers: getNumericAttribute(question, 'max-answers')
@@ -1 +1 @@
1
- {"version":3,"file":"parseExamStructure.js","sourceRoot":"","sources":["../../src/parser/parseExamStructure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAiF1E,MAAM,UAAU,kBAAkB,CAAC,GAAgB;IACjD,MAAM,IAAI,GAAG,GAAG,CAAC,eAAe,CAAA;IAChC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;IACnE,OAAO,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,mBAAmB,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,CAAC,CAAA;AAC/F,CAAC;AAED,SAAS,YAAY,CAAC,OAAgB;IACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IACzE,OAAO,YAAY,CAAiB,OAAO,EAAE,SAAS,EAAE;QACtD,aAAa,EAAE,YAAY,CAAC,OAAO,EAAE,gBAAgB,CAAE;QACvD,UAAU,EAAE,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC;QACvD,UAAU,EAAE,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC;KACxD,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,QAAiB;IACtC,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,CAAA;IAC5D,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM;QACzC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC;QACnC,CAAC,CAAC,QAAQ,CACN,QAAQ,EACR,CAAC,aAAa,EAAE,oBAAoB,EAAE,eAAe,EAAE,iBAAiB,EAAE,YAAY,CAAC,EACvF,KAAK,CACN,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IACtB,OAAO,YAAY,CAAkB,QAAQ,EAAE,aAAa,EAAE;QAC5D,aAAa,EAAE,YAAY,CAAC,QAAQ,EAAE,gBAAgB,CAAE;QACxD,UAAU,EAAE,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC;KACzD,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,MAAe;IAClC,MAAM,UAAU,GAAG;QACjB,aAAa,EAAE,YAAY,CAAC,MAAM,EAAE,gBAAgB,CAAE;QACtD,UAAU,EAAE,mBAAmB,CAAC,MAAM,EAAE,aAAa,CAAE;QACvD,SAAS,EAAE,mBAAmB,CAAC,MAAM,EAAE,YAAY,CAAC;KACrD,CAAA;IACD,OAAO,YAAY,CAAC,MAAM,EAAE,EAAE,EAAE,UAAU,CAAC,CAAA;AAC7C,CAAC;AAED,SAAS,YAAY,CACnB,OAAgB,EAChB,UAAyB,EACzB,UAA2B;IAE3B,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,SAAS;QACvB,UAAU;QACV,UAAU;KACN,CAAA;AACR,CAAC"}
1
+ {"version":3,"file":"parseExamStructure.js","sourceRoot":"","sources":["../../src/parser/parseExamStructure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AA0F1E,MAAM,UAAU,kBAAkB,CAAC,GAAgB;IACjD,MAAM,IAAI,GAAG,GAAG,CAAC,eAAe,CAAA;IAChC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;IACnE,OAAO,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,mBAAmB,CAAC,IAAI,EAAE,aAAa,CAAC,EAAE,CAAC,CAAA;AAC/F,CAAC;AAED,SAAS,YAAY,CAAC,OAAgB;IACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IACzE,OAAO,YAAY,CAAiB,OAAO,EAAE,SAAS,EAAE;QACtD,aAAa,EAAE,YAAY,CAAC,OAAO,EAAE,gBAAgB,CAAE;QACvD,UAAU,EAAE,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC;QACvD,UAAU,EAAE,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC;KACxD,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,QAAiB;IACtC,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,CAAA;IAC5D,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM;QACzC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC;QACnC,CAAC,CAAC,QAAQ,CACN,QAAQ,EACR,CAAC,aAAa,EAAE,oBAAoB,EAAE,eAAe,EAAE,iBAAiB,EAAE,YAAY,EAAE,cAAc,CAAC,EACvG,KAAK,CACN,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IACtB,OAAO,YAAY,CAAkB,QAAQ,EAAE,aAAa,EAAE;QAC5D,aAAa,EAAE,YAAY,CAAC,QAAQ,EAAE,gBAAgB,CAAE;QACxD,UAAU,EAAE,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC;KACzD,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,MAAe;IAClC,MAAM,UAAU,GAAG;QACjB,aAAa,EAAE,YAAY,CAAC,MAAM,EAAE,gBAAgB,CAAE;QACtD,UAAU,EAAE,mBAAmB,CAAC,MAAM,EAAE,aAAa,CAAE;QACvD,SAAS,EAAE,mBAAmB,CAAC,MAAM,EAAE,YAAY,CAAC;KACrD,CAAA;IACD,OAAO,YAAY,CAAC,MAAM,EAAE,EAAE,EAAE,UAAU,CAAC,CAAA;AAC7C,CAAC;AAED,SAAS,YAAY,CACnB,OAAgB,EAChB,UAAyB,EACzB,UAA2B;IAE3B,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,SAAS;QACvB,UAAU;QACV,UAAU;KACN,CAAA;AACR,CAAC"}
@@ -18,6 +18,10 @@ export interface RichTextAnswer extends AnswerCommon {
18
18
  export interface ChoiceAnswer extends AnswerCommon {
19
19
  type: 'choice';
20
20
  }
21
- export type ExamAnswer = TextAnswer | RichTextAnswer | ChoiceAnswer;
21
+ export interface AudioAnswer extends AnswerCommon {
22
+ type: 'audio';
23
+ characterCount?: never;
24
+ }
25
+ export type ExamAnswer = TextAnswer | RichTextAnswer | ChoiceAnswer | AudioAnswer;
22
26
  export {};
23
27
  //# sourceMappingURL=ExamAnswer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExamAnswer.d.ts","sourceRoot":"","sources":["../../src/types/ExamAnswer.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,MAAM,CAAA;AAE/B,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,sBAAsB,CAAA;AAElE,UAAU,YAAY;IACpB,UAAU,EAAE,UAAU,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,oFAAoF;IACpF,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,UAAW,SAAQ,YAAY;IAC9C,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,IAAI,EAAE,UAAU,CAAA;IAChB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,IAAI,EAAE,QAAQ,CAAA;CACf;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,cAAc,GAAG,YAAY,CAAA"}
1
+ {"version":3,"file":"ExamAnswer.d.ts","sourceRoot":"","sources":["../../src/types/ExamAnswer.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,MAAM,CAAA;AAE/B,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,sBAAsB,CAAA;AAElE,UAAU,YAAY;IACpB,UAAU,EAAE,UAAU,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,oFAAoF;IACpF,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,UAAW,SAAQ,YAAY;IAC9C,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,IAAI,EAAE,UAAU,CAAA;IAChB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,IAAI,EAAE,QAAQ,CAAA;CACf;AAED,MAAM,WAAW,WAAY,SAAQ,YAAY;IAC/C,IAAI,EAAE,OAAO,CAAA;IACb,cAAc,CAAC,EAAE,KAAK,CAAA;CACvB;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,CAAA"}
@@ -71,6 +71,10 @@ export interface ExamServerAPI {
71
71
  selectAnswerVersion?: (questionId: QuestionId, questionTitle: string) => Promise<ExamAnswer | undefined>;
72
72
  /** Save screenshot to server. Should return the URL to the saved screenshot. */
73
73
  saveScreenshot: (questionId: QuestionId, screenshot: Blob) => Promise<string>;
74
+ /** Save audio to server. Should return the URL to the saved audio. */
75
+ saveAudio: (questionId: QuestionId, audio: Blob) => Promise<string>;
76
+ /** Delete audio from server */
77
+ deleteAudio: (audioId: string) => Promise<void>;
74
78
  examineExam?: () => void;
75
79
  /** Log client activity to server. Message format is free. Optional feature. */
76
80
  logActivity?: (message: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"ExamServerAPI.d.ts","sourceRoot":"","sources":["../../src/types/ExamServerAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAErD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAA;AACtD;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,SAAS,GAAG,gBAAgB,GAAG,UAAU,CAAA;AACrD,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,WAAW,CAAA;AACtD,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAA;AACtC,MAAM,MAAM,kBAAkB;AAC5B,0DAA0D;AACxD,kBAAkB;AACpB,6CAA6C;GAC3C,iBAAiB;AACnB,wCAAwC;GACtC,aAAa,CAAA;AACjB,MAAM,MAAM,qBAAqB,GAAG,IAAI,GAAG,kBAAkB,CAAA;AAE7D,MAAM,WAAW,4BAA4B;IAC3C,6DAA6D;IAC7D,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,aAAa;IAC5B;;;;;;;OAOG;IACH,YAAY,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC,CAAA;IAC1D,mDAAmD;IACnD,UAAU,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;IACvC,sCAAsC;IACtC,UAAU,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD;;;;OAIG;IACH,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAA;IAC1D;;;;;;OAMG;IACH,mBAAmB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAA;IAEtH;;;;;;OAMG;IACH,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACpG,uGAAuG;IACvG,mBAAmB,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAA;IACxG,gFAAgF;IAChF,cAAc,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7E,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACxC"}
1
+ {"version":3,"file":"ExamServerAPI.d.ts","sourceRoot":"","sources":["../../src/types/ExamServerAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAErD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAA;AACtD;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,SAAS,GAAG,gBAAgB,GAAG,UAAU,CAAA;AACrD,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,WAAW,CAAA;AACtD,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAA;AACtC,MAAM,MAAM,kBAAkB;AAC5B,0DAA0D;AACxD,kBAAkB;AACpB,6CAA6C;GAC3C,iBAAiB;AACnB,wCAAwC;GACtC,aAAa,CAAA;AACjB,MAAM,MAAM,qBAAqB,GAAG,IAAI,GAAG,kBAAkB,CAAA;AAE7D,MAAM,WAAW,4BAA4B;IAC3C,6DAA6D;IAC7D,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,aAAa;IAC5B;;;;;;;OAOG;IACH,YAAY,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC,CAAA;IAC1D,mDAAmD;IACnD,UAAU,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;IACvC,sCAAsC;IACtC,UAAU,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD;;;;OAIG;IACH,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAA;IAC1D;;;;;;OAMG;IACH,mBAAmB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAA;IAEtH;;;;;;OAMG;IACH,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACpG,uGAAuG;IACvG,mBAAmB,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAA;IACxG,gFAAgF;IAChF,cAAc,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7E,sEAAsE;IACtE,SAAS,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IACnE,+BAA+B;IAC/B,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAE/C,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACxC"}
@@ -1,7 +1,7 @@
1
1
  export interface GradingStructure {
2
2
  questions: GradingStructureQuestion[];
3
3
  }
4
- export type GradingStructureQuestion = TextQuestion | ChoiceGroupQuestion;
4
+ export type GradingStructureQuestion = TextQuestion | ChoiceGroupQuestion | AudioQuestion;
5
5
  export interface TextQuestion {
6
6
  type: 'text';
7
7
  id: number;
@@ -16,6 +16,12 @@ export interface TextQuestion {
16
16
  */
17
17
  correctAnswers?: CorrectAnswer[];
18
18
  }
19
+ export interface AudioQuestion {
20
+ type: 'audio';
21
+ id: number;
22
+ displayNumber: string;
23
+ maxScore: number;
24
+ }
19
25
  export interface CorrectAnswer {
20
26
  text: string;
21
27
  score: number;
@@ -1 +1 @@
1
- {"version":3,"file":"GradingStructure.d.ts","sourceRoot":"","sources":["../../src/types/GradingStructure.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,wBAAwB,EAAE,CAAA;CACtC;AAED,MAAM,MAAM,wBAAwB,GAAG,YAAY,GAAG,mBAAmB,CAAA;AAEzE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,aAAa,EAAE,CAAA;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,aAAa,CAAA;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,iBAAiB,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,QAAQ,CAAA;IACd,OAAO,EAAE,iBAAiB,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;CACd"}
1
+ {"version":3,"file":"GradingStructure.d.ts","sourceRoot":"","sources":["../../src/types/GradingStructure.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,wBAAwB,EAAE,CAAA;CACtC;AAED,MAAM,MAAM,wBAAwB,GAAG,YAAY,GAAG,mBAAmB,GAAG,aAAa,CAAA;AAEzF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,aAAa,EAAE,CAAA;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,CAAA;IACb,EAAE,EAAE,MAAM,CAAA;IACV,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,aAAa,CAAA;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,iBAAiB,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,QAAQ,CAAA;IACd,OAAO,EAAE,iBAAiB,EAAE,CAAA;CAC7B;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;CACd"}
@@ -1 +1 @@
1
- {"version":3,"file":"validateAnswers.d.ts","sourceRoot":"","sources":["../src/validateAnswers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACtE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAE3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAA;AAE9E,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,aAAa,CAAA;AAEzD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,eAAe,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAAA;CAC7C;AAED,MAAM,WAAW,WAAY,SAAQ,yBAAyB;IAC5D,IAAI,EAAE,aAAa,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;CACtB;AA2GD,wBAAgB,eAAe,CAC7B,aAAa,EAAE,WAAW,EAC1B,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,GAC1C,eAAe,EAAE,CAInB"}
1
+ {"version":3,"file":"validateAnswers.d.ts","sourceRoot":"","sources":["../src/validateAnswers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACtE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAE3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAA;AAE9E,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,aAAa,CAAA;AAEzD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,eAAe,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAAA;CAC7C;AAED,MAAM,WAAW,WAAY,SAAQ,yBAAyB;IAC5D,IAAI,EAAE,aAAa,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;CACtB;AA4GD,wBAAgB,eAAe,CAC7B,aAAa,EAAE,WAAW,EAC1B,WAAW,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,GAC1C,eAAe,EAAE,CAInB"}
@@ -70,6 +70,7 @@ function validateExtraAnswers(examStructure, answersById) {
70
70
  return { answerCount, displayNumber, extraAnswers };
71
71
  }
72
72
  case 'text-answer':
73
+ case 'audio-answer':
73
74
  case 'scored-text-answer':
74
75
  case 'choice-answer':
75
76
  case 'dnd-answer':
@@ -1 +1 @@
1
- {"version":3,"file":"validateAnswers.js","sourceRoot":"","sources":["../src/validateAnswers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,CAAC,MAAM,WAAW,CAAA;AAiB9B,SAAS,UAAU,CACjB,aAA0B,EAC1B,OAAoD,EACpD,YAAe;IAEf,SAAS,EAAE,CAAC,WAAc,EAAE,OAAoB;QAC9C,OAAO,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAA;IACrE,CAAC;IAED,OAAO,EAAE,CAAC,YAAY,EAAE,aAAa,CAAC,CAAA;AACxC,CAAC;AAED,SAAS,oBAAoB,CAC3B,aAA0B,EAC1B,WAA2C;IAE3C,OAAO,UAAU,CACf,aAAa,EACb,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;QAClB,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;YAC3E,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;YAC9D,IAAI,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,IAAI,MAAK,UAAU,IAAI,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,IAAI,MAAK,MAAM,EAAE,CAAC;gBACrE,OAAO,WAAW,CAAC,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS;oBAC9D,CAAC,CAAC;wBACE,GAAG,MAAM;wBACT;4BACE,IAAI,EAAE,eAAe;4BACrB,aAAa,EAAE,OAAO,CAAC,UAAU,CAAC,aAAa;4BAC/C,cAAc,EAAE,WAAW,CAAC,cAAc;4BAC1C,WAAW,EAAE,UAAU;yBACxB;qBACF;oBACH,CAAC,CAAC,MAAM,CAAA;YACZ,CAAC;YACD,OAAO,MAAM,CAAA;QACf,CAAC;aAAM,CAAC;YACN,OAAO,MAAM,CAAA;QACf,CAAC;IACH,CAAC,EACD,EAAuB,CACxB,CAAA;AACH,CAAC;AAED,SAAS,oBAAoB,CAC3B,aAA0B,EAC1B,WAA2C;IAE3C,2EAA2E;IAC3E,6DAA6D;IAC7D,SAAS,EAAE,CAAC,OAAoB;;QAC9B,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAA;QAErF,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,KAAK,MAAM,CAAC;YACZ,KAAK,SAAS,CAAC;YACf,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBAC3C,MAAM,mBAAmB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAA;gBACnE,MAAM,UAAU,GAAG,MAAA,OAAO,CAAC,UAAU,CAAC,UAAU,mCAAI,QAAQ,CAAA;gBAC5D,uDAAuD;gBACvD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAA;gBACzF,kEAAkE;gBAClE,sEAAsE;gBACtE,8CAA8C;gBAC9C,MAAM,WAAW,GACf,OAAO,CAAC,IAAI,KAAK,MAAM;oBACrB,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;oBAC5E,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAA;gBAChC,MAAM,iBAAiB,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;gBAClE,sEAAsE;gBACtE,kEAAkE;gBAClE,SAAS;gBACT,MAAM,YAAY,GAChB,WAAW,GAAG,UAAU;oBACtB,CAAC,CAAC;wBACE;4BACE,IAAI,EAAE,aAAa;4BACnB,WAAW,EAAE,OAAO,CAAC,IAAI;4BACzB,aAAa;4BACb,cAAc,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;4BAClD,UAAU;4BACV,UAAU;yBACI;wBAChB,GAAG,iBAAiB;qBACrB;oBACH,CAAC,CAAC,iBAAiB,CAAA;gBAEvB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,CAAA;YACrD,CAAC;YACD,KAAK,aAAa,CAAC;YACnB,KAAK,oBAAoB,CAAC;YAC1B,KAAK,eAAe,CAAC;YACrB,KAAK,YAAY,CAAC;YAClB,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;gBAC9D,sEAAsE;gBACtE,QAAQ;gBACR,MAAM,aAAa,GAAG,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,KAAK,CAAC,MAAM,IAAG,CAAC,CAAA;gBACnD,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,EAAE,EAAE,CAAA;YAChF,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC,aAAa,CAAC,CAAC,YAAY,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,aAA0B,EAC1B,WAA2C;IAE3C,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,EAAE,YAAY,CAAC,EAAE,CAC5E,YAAY,CAAC,aAAa,EAAE,WAAW,CAAC,CACzC,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"validateAnswers.js","sourceRoot":"","sources":["../src/validateAnswers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ /*
3
+ * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
4
+ * This devtool is neither made for production nor for readable output files.
5
+ * It uses "eval()" calls to create a separate source file in the browser devtools.
6
+ * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
7
+ * or disable the default devtool with "devtool: false".
8
+ * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
9
+ */
10
+ (this["webpackChunkExamBundle"] = this["webpackChunkExamBundle"] || []).push([["vendors-node_modules_music-metadata_lib_asf_AsfParser_js"],{
11
+
12
+ /***/ "../../node_modules/music-metadata/lib/asf/AsfObject.js":
13
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
14
+
15
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AsfContentParseError: () => (/* binding */ AsfContentParseError),\n/* harmony export */ ContentDescriptionObjectState: () => (/* binding */ ContentDescriptionObjectState),\n/* harmony export */ DataType: () => (/* binding */ DataType),\n/* harmony export */ ExtendedContentDescriptionObjectState: () => (/* binding */ ExtendedContentDescriptionObjectState),\n/* harmony export */ ExtendedStreamPropertiesObjectState: () => (/* binding */ ExtendedStreamPropertiesObjectState),\n/* harmony export */ FilePropertiesObject: () => (/* binding */ FilePropertiesObject),\n/* harmony export */ HeaderExtensionObject: () => (/* binding */ HeaderExtensionObject),\n/* harmony export */ HeaderObjectToken: () => (/* binding */ HeaderObjectToken),\n/* harmony export */ IgnoreObjectState: () => (/* binding */ IgnoreObjectState),\n/* harmony export */ MetadataLibraryObjectState: () => (/* binding */ MetadataLibraryObjectState),\n/* harmony export */ MetadataObjectState: () => (/* binding */ MetadataObjectState),\n/* harmony export */ State: () => (/* binding */ State),\n/* harmony export */ StreamPropertiesObject: () => (/* binding */ StreamPropertiesObject),\n/* harmony export */ TopLevelHeaderObjectToken: () => (/* binding */ TopLevelHeaderObjectToken),\n/* harmony export */ WmPictureToken: () => (/* binding */ WmPictureToken),\n/* harmony export */ readCodecEntries: () => (/* binding */ readCodecEntries)\n/* harmony export */ });\n/* harmony import */ var token_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"../../node_modules/token-types/lib/index.js\");\n/* harmony import */ var _common_Util_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(\"../../node_modules/music-metadata/lib/common/Util.js\");\n/* harmony import */ var _GUID_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(\"../../node_modules/music-metadata/lib/asf/GUID.js\");\n/* harmony import */ var _AsfUtil_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(\"../../node_modules/music-metadata/lib/asf/AsfUtil.js\");\n/* harmony import */ var _id3v2_ID3v2Token_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(\"../../node_modules/music-metadata/lib/id3v2/ID3v2Token.js\");\n/* harmony import */ var _ParseError_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(\"../../node_modules/music-metadata/lib/ParseError.js\");\n// ASF Objects\n\n\n\n\n\n\nclass AsfContentParseError extends (0,_ParseError_js__WEBPACK_IMPORTED_MODULE_5__.makeUnexpectedFileContentError)('ASF') {\n}\n/**\n * Data Type: Specifies the type of information being stored. The following values are recognized.\n */\nvar DataType;\n(function (DataType) {\n /**\n * Unicode string. The data consists of a sequence of Unicode characters.\n */\n DataType[DataType[\"UnicodeString\"] = 0] = \"UnicodeString\";\n /**\n * BYTE array. The type of data is implementation-specific.\n */\n DataType[DataType[\"ByteArray\"] = 1] = \"ByteArray\";\n /**\n * BOOL. The data is 2 bytes long and should be interpreted as a 16-bit unsigned integer. Only 0x0000 or 0x0001 are permitted values.\n */\n DataType[DataType[\"Bool\"] = 2] = \"Bool\";\n /**\n * DWORD. The data is 4 bytes long and should be interpreted as a 32-bit unsigned integer.\n */\n DataType[DataType[\"DWord\"] = 3] = \"DWord\";\n /**\n * QWORD. The data is 8 bytes long and should be interpreted as a 64-bit unsigned integer.\n */\n DataType[DataType[\"QWord\"] = 4] = \"QWord\";\n /**\n * WORD. The data is 2 bytes long and should be interpreted as a 16-bit unsigned integer.\n */\n DataType[DataType[\"Word\"] = 5] = \"Word\";\n})(DataType || (DataType = {}));\n/**\n * Token for: 3. ASF top-level Header Object\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/03_asf_top_level_header_object.html#3\n */\nconst TopLevelHeaderObjectToken = {\n len: 30,\n get: (buf, off) => {\n return {\n objectId: _GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fromBin(buf, off),\n objectSize: Number(token_types__WEBPACK_IMPORTED_MODULE_0__.UINT64_LE.get(buf, off + 16)),\n numberOfHeaderObjects: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_LE.get(buf, off + 24)\n // Reserved: 2 bytes\n };\n }\n};\n/**\n * Token for: 3.1 Header Object (mandatory, one only)\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/03_asf_top_level_header_object.html#3_1\n */\nconst HeaderObjectToken = {\n len: 24,\n get: (buf, off) => {\n return {\n objectId: _GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fromBin(buf, off),\n objectSize: Number(token_types__WEBPACK_IMPORTED_MODULE_0__.UINT64_LE.get(buf, off + 16))\n };\n }\n};\nclass State {\n constructor(header) {\n this.len = Number(header.objectSize) - HeaderObjectToken.len;\n }\n postProcessTag(tags, name, valueType, data) {\n if (name === 'WM/Picture') {\n tags.push({ id: name, value: WmPictureToken.fromBuffer(data) });\n }\n else {\n const parseAttr = (0,_AsfUtil_js__WEBPACK_IMPORTED_MODULE_3__.getParserForAttr)(valueType);\n if (!parseAttr) {\n throw new AsfContentParseError(`unexpected value headerType: ${valueType}`);\n }\n tags.push({ id: name, value: parseAttr(data) });\n }\n }\n}\n// ToDo: use ignore type\nclass IgnoreObjectState extends State {\n get(buf, off) {\n return null;\n }\n}\n/**\n * Token for: 3.2: File Properties Object (mandatory, one only)\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/03_asf_top_level_header_object.html#3_2\n */\nclass FilePropertiesObject extends State {\n get(buf, off) {\n return {\n fileId: _GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fromBin(buf, off),\n fileSize: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT64_LE.get(buf, off + 16),\n creationDate: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT64_LE.get(buf, off + 24),\n dataPacketsCount: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT64_LE.get(buf, off + 32),\n playDuration: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT64_LE.get(buf, off + 40),\n sendDuration: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT64_LE.get(buf, off + 48),\n preroll: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT64_LE.get(buf, off + 56),\n flags: {\n broadcast: _common_Util_js__WEBPACK_IMPORTED_MODULE_1__.getBit(buf, off + 64, 24),\n seekable: _common_Util_js__WEBPACK_IMPORTED_MODULE_1__.getBit(buf, off + 64, 25)\n },\n // flagsNumeric: Token.UINT32_LE.get(buf, off + 64),\n minimumDataPacketSize: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_LE.get(buf, off + 68),\n maximumDataPacketSize: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_LE.get(buf, off + 72),\n maximumBitrate: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_LE.get(buf, off + 76)\n };\n }\n}\nFilePropertiesObject.guid = _GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].FilePropertiesObject;\n/**\n * Token for: 3.3 Stream Properties Object (mandatory, one per stream)\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/03_asf_top_level_header_object.html#3_3\n */\nclass StreamPropertiesObject extends State {\n get(buf, off) {\n return {\n streamType: _GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].decodeMediaType(_GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fromBin(buf, off)),\n errorCorrectionType: _GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fromBin(buf, off + 8)\n // ToDo\n };\n }\n}\nStreamPropertiesObject.guid = _GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].StreamPropertiesObject;\n/**\n * 3.4: Header Extension Object (mandatory, one only)\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/03_asf_top_level_header_object.html#3_4\n */\nclass HeaderExtensionObject {\n constructor() {\n this.len = 22;\n }\n get(buf, off) {\n const view = new DataView(buf.buffer, off);\n return {\n reserved1: _GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].fromBin(buf, off),\n reserved2: view.getUint16(16, true),\n extensionDataSize: view.getUint16(18, true)\n };\n }\n}\nHeaderExtensionObject.guid = _GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].HeaderExtensionObject;\n/**\n * 3.5: The Codec List Object provides user-friendly information about the codecs and formats used to encode the content found in the ASF file.\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/03_asf_top_level_header_object.html#3_5\n */\nconst CodecListObjectHeader = {\n len: 20,\n get: (buf, off) => {\n const view = new DataView(buf.buffer, off);\n return {\n entryCount: view.getUint16(16, true)\n };\n }\n};\nasync function readString(tokenizer) {\n const length = await tokenizer.readNumber(token_types__WEBPACK_IMPORTED_MODULE_0__.UINT16_LE);\n return (await tokenizer.readToken(new token_types__WEBPACK_IMPORTED_MODULE_0__.StringType(length * 2, 'utf-16le'))).replace('\\0', '');\n}\n/**\n * 3.5: Read the Codec-List-Object, which provides user-friendly information about the codecs and formats used to encode the content found in the ASF file.\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/03_asf_top_level_header_object.html#3_5\n */\nasync function readCodecEntries(tokenizer) {\n const codecHeader = await tokenizer.readToken(CodecListObjectHeader);\n const entries = [];\n for (let i = 0; i < codecHeader.entryCount; ++i) {\n entries.push(await readCodecEntry(tokenizer));\n }\n return entries;\n}\nasync function readInformation(tokenizer) {\n const length = await tokenizer.readNumber(token_types__WEBPACK_IMPORTED_MODULE_0__.UINT16_LE);\n const buf = new Uint8Array(length);\n await tokenizer.readBuffer(buf);\n return buf;\n}\n/**\n * Read Codec-Entries\n * @param tokenizer\n */\nasync function readCodecEntry(tokenizer) {\n const type = await tokenizer.readNumber(token_types__WEBPACK_IMPORTED_MODULE_0__.UINT16_LE);\n return {\n type: {\n videoCodec: (type & 0x0001) === 0x0001,\n audioCodec: (type & 0x0002) === 0x0002\n },\n codecName: await readString(tokenizer),\n description: await readString(tokenizer),\n information: await readInformation(tokenizer)\n };\n}\n/**\n * 3.10 Content Description Object (optional, one only)\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/03_asf_top_level_header_object.html#3_10\n */\nclass ContentDescriptionObjectState extends State {\n get(buf, off) {\n const tags = [];\n const view = new DataView(buf.buffer, off);\n let pos = 10;\n for (let i = 0; i < ContentDescriptionObjectState.contentDescTags.length; ++i) {\n const length = view.getUint16(i * 2, true);\n if (length > 0) {\n const tagName = ContentDescriptionObjectState.contentDescTags[i];\n const end = pos + length;\n tags.push({ id: tagName, value: (0,_AsfUtil_js__WEBPACK_IMPORTED_MODULE_3__.parseUnicodeAttr)(buf.slice(off + pos, off + end)) });\n pos = end;\n }\n }\n return tags;\n }\n}\nContentDescriptionObjectState.guid = _GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].ContentDescriptionObject;\nContentDescriptionObjectState.contentDescTags = ['Title', 'Author', 'Copyright', 'Description', 'Rating'];\n/**\n * 3.11 Extended Content Description Object (optional, one only)\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/03_asf_top_level_header_object.html#3_11\n */\nclass ExtendedContentDescriptionObjectState extends State {\n get(buf, off) {\n const tags = [];\n const view = new DataView(buf.buffer, off);\n const attrCount = view.getUint16(0, true);\n let pos = 2;\n for (let i = 0; i < attrCount; i += 1) {\n const nameLen = view.getUint16(pos, true);\n pos += 2;\n const name = (0,_AsfUtil_js__WEBPACK_IMPORTED_MODULE_3__.parseUnicodeAttr)(buf.slice(off + pos, off + pos + nameLen));\n pos += nameLen;\n const valueType = view.getUint16(pos, true);\n pos += 2;\n const valueLen = view.getUint16(pos, true);\n pos += 2;\n const value = buf.slice(off + pos, off + pos + valueLen);\n pos += valueLen;\n this.postProcessTag(tags, name, valueType, value);\n }\n return tags;\n }\n}\nExtendedContentDescriptionObjectState.guid = _GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].ExtendedContentDescriptionObject;\n/**\n * 4.1 Extended Stream Properties Object (optional, 1 per media stream)\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/04_objects_in_the_asf_header_extension_object.html#4_1\n */\nclass ExtendedStreamPropertiesObjectState extends State {\n get(buf, off) {\n const view = new DataView(buf.buffer, off);\n return {\n startTime: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT64_LE.get(buf, off),\n endTime: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT64_LE.get(buf, off + 8),\n dataBitrate: view.getInt32(12, true),\n bufferSize: view.getInt32(16, true),\n initialBufferFullness: view.getInt32(20, true),\n alternateDataBitrate: view.getInt32(24, true),\n alternateBufferSize: view.getInt32(28, true),\n alternateInitialBufferFullness: view.getInt32(32, true),\n maximumObjectSize: view.getInt32(36, true),\n flags: {\n reliableFlag: _common_Util_js__WEBPACK_IMPORTED_MODULE_1__.getBit(buf, off + 40, 0),\n seekableFlag: _common_Util_js__WEBPACK_IMPORTED_MODULE_1__.getBit(buf, off + 40, 1),\n resendLiveCleanpointsFlag: _common_Util_js__WEBPACK_IMPORTED_MODULE_1__.getBit(buf, off + 40, 2)\n },\n // flagsNumeric: Token.UINT32_LE.get(buf, off + 64),\n streamNumber: view.getInt16(42, true),\n streamLanguageId: view.getInt16(44, true),\n averageTimePerFrame: view.getInt32(52, true),\n streamNameCount: view.getInt32(54, true),\n payloadExtensionSystems: view.getInt32(56, true),\n streamNames: [], // ToDo\n streamPropertiesObject: null\n };\n }\n}\nExtendedStreamPropertiesObjectState.guid = _GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].ExtendedStreamPropertiesObject;\n/**\n * 4.7 Metadata Object (optional, 0 or 1)\n * Ref: http://drang.s4.xrea.com/program/tips/id3tag/wmp/04_objects_in_the_asf_header_extension_object.html#4_7\n */\nclass MetadataObjectState extends State {\n get(uint8Array, off) {\n const tags = [];\n const view = new DataView(uint8Array.buffer, off);\n const descriptionRecordsCount = view.getUint16(0, true);\n let pos = 2;\n for (let i = 0; i < descriptionRecordsCount; i += 1) {\n pos += 4;\n const nameLen = view.getUint16(pos, true);\n pos += 2;\n const dataType = view.getUint16(pos, true);\n pos += 2;\n const dataLen = view.getUint32(pos, true);\n pos += 4;\n const name = (0,_AsfUtil_js__WEBPACK_IMPORTED_MODULE_3__.parseUnicodeAttr)(uint8Array.slice(off + pos, off + pos + nameLen));\n pos += nameLen;\n const data = uint8Array.slice(off + pos, off + pos + dataLen);\n pos += dataLen;\n this.postProcessTag(tags, name, dataType, data);\n }\n return tags;\n }\n}\nMetadataObjectState.guid = _GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].MetadataObject;\n// 4.8\tMetadata Library Object (optional, 0 or 1)\nclass MetadataLibraryObjectState extends MetadataObjectState {\n}\nMetadataLibraryObjectState.guid = _GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].MetadataLibraryObject;\n/**\n * Ref: https://msdn.microsoft.com/en-us/library/windows/desktop/dd757977(v=vs.85).aspx\n */\nclass WmPictureToken {\n static fromBuffer(buffer) {\n const pic = new WmPictureToken(buffer.length);\n return pic.get(buffer, 0);\n }\n constructor(len) {\n this.len = len;\n }\n get(buffer, offset) {\n const view = new DataView(buffer.buffer, offset);\n const typeId = view.getUint8(0);\n const size = view.getInt32(1, true);\n let index = 5;\n while (view.getUint16(index) !== 0) {\n index += 2;\n }\n const format = new token_types__WEBPACK_IMPORTED_MODULE_0__.StringType(index - 5, 'utf-16le').get(buffer, 5);\n while (view.getUint16(index) !== 0) {\n index += 2;\n }\n const description = new token_types__WEBPACK_IMPORTED_MODULE_0__.StringType(index - 5, 'utf-16le').get(buffer, 5);\n return {\n type: _id3v2_ID3v2Token_js__WEBPACK_IMPORTED_MODULE_4__.AttachedPictureType[typeId],\n format,\n description,\n size,\n data: buffer.slice(index + 4)\n };\n }\n}\n//# sourceMappingURL=AsfObject.js.map\n\n//# sourceURL=webpack://ExamBundle/../../node_modules/music-metadata/lib/asf/AsfObject.js?");
16
+
17
+ /***/ }),
18
+
19
+ /***/ "../../node_modules/music-metadata/lib/asf/AsfParser.js":
20
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
21
+
22
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AsfParser: () => (/* binding */ AsfParser)\n/* harmony export */ });\n/* harmony import */ var debug__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"../../node_modules/debug/src/browser.js\");\n/* harmony import */ var _type_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(\"../../node_modules/music-metadata/lib/type.js\");\n/* harmony import */ var _GUID_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(\"../../node_modules/music-metadata/lib/asf/GUID.js\");\n/* harmony import */ var _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(\"../../node_modules/music-metadata/lib/asf/AsfObject.js\");\n/* harmony import */ var _common_BasicParser_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(\"../../node_modules/music-metadata/lib/common/BasicParser.js\");\n\n\n\n\n\n\nconst debug = debug__WEBPACK_IMPORTED_MODULE_0__('music-metadata:parser:ASF');\nconst headerType = 'asf';\n/**\n * Windows Media Metadata Usage Guidelines\n * - Ref: https://msdn.microsoft.com/en-us/library/ms867702.aspx\n *\n * Ref:\n * - https://tools.ietf.org/html/draft-fleischman-asf-01\n * - https://hwiegman.home.xs4all.nl/fileformats/asf/ASF_Specification.pdf\n * - http://drang.s4.xrea.com/program/tips/id3tag/wmp/index.html\n * - https://msdn.microsoft.com/en-us/library/windows/desktop/ee663575(v=vs.85).aspx\n */\nclass AsfParser extends _common_BasicParser_js__WEBPACK_IMPORTED_MODULE_4__.BasicParser {\n async parse() {\n const header = await this.tokenizer.readToken(_AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.TopLevelHeaderObjectToken);\n if (!header.objectId.equals(_GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].HeaderObject)) {\n throw new _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.AsfContentParseError(`expected asf header; but was not found; got: ${header.objectId.str}`);\n }\n try {\n await this.parseObjectHeader(header.numberOfHeaderObjects);\n }\n catch (err) {\n debug('Error while parsing ASF: %s', err);\n }\n }\n async parseObjectHeader(numberOfObjectHeaders) {\n let tags;\n do {\n // Parse common header of the ASF Object (3.1)\n const header = await this.tokenizer.readToken(_AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.HeaderObjectToken);\n // Parse data part of the ASF Object\n debug('header GUID=%s', header.objectId.str);\n switch (header.objectId.str) {\n case _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.FilePropertiesObject.guid.str: { // 3.2\n const fpo = await this.tokenizer.readToken(new _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.FilePropertiesObject(header));\n this.metadata.setFormat('duration', Number(fpo.playDuration / BigInt(1000)) / 10000 - Number(fpo.preroll) / 1000);\n this.metadata.setFormat('bitrate', fpo.maximumBitrate);\n break;\n }\n case _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.StreamPropertiesObject.guid.str: { // 3.3\n const spo = await this.tokenizer.readToken(new _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.StreamPropertiesObject(header));\n this.metadata.setFormat('container', `ASF/${spo.streamType}`);\n break;\n }\n case _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.HeaderExtensionObject.guid.str: { // 3.4\n const extHeader = await this.tokenizer.readToken(new _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.HeaderExtensionObject());\n await this.parseExtensionObject(extHeader.extensionDataSize);\n break;\n }\n case _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.ContentDescriptionObjectState.guid.str: // 3.10\n tags = await this.tokenizer.readToken(new _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.ContentDescriptionObjectState(header));\n await this.addTags(tags);\n break;\n case _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.ExtendedContentDescriptionObjectState.guid.str: // 3.11\n tags = await this.tokenizer.readToken(new _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.ExtendedContentDescriptionObjectState(header));\n await this.addTags(tags);\n break;\n case _GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CodecListObject.str: {\n const codecs = await _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.readCodecEntries(this.tokenizer);\n codecs.forEach(codec => {\n this.metadata.addStreamInfo({\n type: codec.type.videoCodec ? _type_js__WEBPACK_IMPORTED_MODULE_1__.TrackType.video : _type_js__WEBPACK_IMPORTED_MODULE_1__.TrackType.audio,\n codecName: codec.codecName\n });\n });\n const audioCodecs = codecs.filter(codec => codec.type.audioCodec).map(codec => codec.codecName).join('/');\n this.metadata.setFormat('codec', audioCodecs);\n break;\n }\n case _GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].StreamBitratePropertiesObject.str:\n // ToDo?\n await this.tokenizer.ignore(header.objectSize - _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.HeaderObjectToken.len);\n break;\n case _GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].PaddingObject.str:\n // ToDo: register bytes pad\n debug('Padding: %s bytes', header.objectSize - _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.HeaderObjectToken.len);\n await this.tokenizer.ignore(header.objectSize - _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.HeaderObjectToken.len);\n break;\n default:\n this.metadata.addWarning(`Ignore ASF-Object-GUID: ${header.objectId.str}`);\n debug('Ignore ASF-Object-GUID: %s', header.objectId.str);\n await this.tokenizer.readToken(new _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.IgnoreObjectState(header));\n }\n } while (--numberOfObjectHeaders);\n // done\n }\n async addTags(tags) {\n await Promise.all(tags.map(({ id, value }) => this.metadata.addTag(headerType, id, value)));\n }\n async parseExtensionObject(extensionSize) {\n do {\n // Parse common header of the ASF Object (3.1)\n const header = await this.tokenizer.readToken(_AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.HeaderObjectToken);\n const remaining = header.objectSize - _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.HeaderObjectToken.len;\n // Parse data part of the ASF Object\n switch (header.objectId.str) {\n case _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.ExtendedStreamPropertiesObjectState.guid.str: // 4.1\n // ToDo: extended stream header properties are ignored\n await this.tokenizer.readToken(new _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.ExtendedStreamPropertiesObjectState(header));\n break;\n case _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.MetadataObjectState.guid.str: { // 4.7\n const moTags = await this.tokenizer.readToken(new _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.MetadataObjectState(header));\n await this.addTags(moTags);\n break;\n }\n case _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.MetadataLibraryObjectState.guid.str: { // 4.8\n const mlTags = await this.tokenizer.readToken(new _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.MetadataLibraryObjectState(header));\n await this.addTags(mlTags);\n break;\n }\n case _GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].PaddingObject.str:\n // ToDo: register bytes pad\n await this.tokenizer.ignore(remaining);\n break;\n case _GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].CompatibilityObject.str:\n await this.tokenizer.ignore(remaining);\n break;\n case _GUID_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"].ASF_Index_Placeholder_Object.str:\n await this.tokenizer.ignore(remaining);\n break;\n default:\n this.metadata.addWarning(`Ignore ASF-Object-GUID: ${header.objectId.str}`);\n // console.log(\"Ignore ASF-Object-GUID: %s\", header.objectId.str);\n await this.tokenizer.readToken(new _AsfObject_js__WEBPACK_IMPORTED_MODULE_3__.IgnoreObjectState(header));\n break;\n }\n extensionSize -= header.objectSize;\n } while (extensionSize > 0);\n }\n}\n//# sourceMappingURL=AsfParser.js.map\n\n//# sourceURL=webpack://ExamBundle/../../node_modules/music-metadata/lib/asf/AsfParser.js?");
23
+
24
+ /***/ }),
25
+
26
+ /***/ "../../node_modules/music-metadata/lib/asf/AsfUtil.js":
27
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
28
+
29
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getParserForAttr: () => (/* binding */ getParserForAttr),\n/* harmony export */ parseUnicodeAttr: () => (/* binding */ parseUnicodeAttr)\n/* harmony export */ });\n/* harmony import */ var token_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"../../node_modules/token-types/lib/index.js\");\n/* harmony import */ var _common_Util_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(\"../../node_modules/music-metadata/lib/common/Util.js\");\n\n\nfunction getParserForAttr(i) {\n return attributeParsers[i];\n}\nfunction parseUnicodeAttr(uint8Array) {\n return _common_Util_js__WEBPACK_IMPORTED_MODULE_1__.stripNulls(_common_Util_js__WEBPACK_IMPORTED_MODULE_1__.decodeString(uint8Array, 'utf-16le'));\n}\nconst attributeParsers = [\n parseUnicodeAttr,\n parseByteArrayAttr,\n parseBoolAttr,\n parseDWordAttr,\n parseQWordAttr,\n parseWordAttr,\n parseByteArrayAttr\n];\nfunction parseByteArrayAttr(buf) {\n return new Uint8Array(buf);\n}\nfunction parseBoolAttr(buf, offset = 0) {\n return parseWordAttr(buf, offset) === 1;\n}\nfunction parseDWordAttr(buf, offset = 0) {\n return token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_LE.get(buf, offset);\n}\nfunction parseQWordAttr(buf, offset = 0) {\n return token_types__WEBPACK_IMPORTED_MODULE_0__.UINT64_LE.get(buf, offset);\n}\nfunction parseWordAttr(buf, offset = 0) {\n return token_types__WEBPACK_IMPORTED_MODULE_0__.UINT16_LE.get(buf, offset);\n}\n//# sourceMappingURL=AsfUtil.js.map\n\n//# sourceURL=webpack://ExamBundle/../../node_modules/music-metadata/lib/asf/AsfUtil.js?");
30
+
31
+ /***/ }),
32
+
33
+ /***/ "../../node_modules/music-metadata/lib/asf/GUID.js":
34
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
35
+
36
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var uint8array_extras__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"../../node_modules/uint8array-extras/index.js\");\n\n/**\n * Ref:\n * - https://tools.ietf.org/html/draft-fleischman-asf-01, Appendix A: ASF GUIDs\n * - http://drang.s4.xrea.com/program/tips/id3tag/wmp/10_asf_guids.html\n * - http://drang.s4.xrea.com/program/tips/id3tag/wmp/index.html\n * - http://drang.s4.xrea.com/program/tips/id3tag/wmp/10_asf_guids.html\n *\n * ASF File Structure:\n * - https://msdn.microsoft.com/en-us/library/windows/desktop/ee663575(v=vs.85).aspx\n *\n * ASF GUIDs:\n * - http://drang.s4.xrea.com/program/tips/id3tag/wmp/10_asf_guids.html\n * - https://github.com/dji-sdk/FFmpeg/blob/master/libavformat/asf.c\n */\nclass GUID {\n static fromBin(bin, offset = 0) {\n return new GUID(GUID.decode(bin, offset));\n }\n /**\n * Decode GUID in format like \"B503BF5F-2EA9-CF11-8EE3-00C00C205365\"\n * @param objectId Binary GUID\n * @param offset Read offset in bytes, default 0\n * @returns GUID as dashed hexadecimal representation\n */\n static decode(objectId, offset = 0) {\n const view = new DataView(objectId.buffer, offset);\n const guid = `${view.getUint32(0, true).toString(16)}-${view.getUint16(4, true).toString(16)}-${view.getUint16(6, true).toString(16)}-${view.getUint16(8).toString(16)}-${(0,uint8array_extras__WEBPACK_IMPORTED_MODULE_0__.uint8ArrayToHex)(objectId.slice(offset + 10, offset + 16))}`;\n return guid.toUpperCase();\n }\n /**\n * Decode stream type\n * @param mediaType Media type GUID\n * @returns Media type\n */\n static decodeMediaType(mediaType) {\n switch (mediaType.str) {\n case GUID.AudioMedia.str: return 'audio';\n case GUID.VideoMedia.str: return 'video';\n case GUID.CommandMedia.str: return 'command';\n case GUID.Degradable_JPEG_Media.str: return 'degradable-jpeg';\n case GUID.FileTransferMedia.str: return 'file-transfer';\n case GUID.BinaryMedia.str: return 'binary';\n }\n }\n /**\n * Encode GUID\n * @param guid GUID like: \"B503BF5F-2EA9-CF11-8EE3-00C00C205365\"\n * @returns Encoded Binary GUID\n */\n static encode(str) {\n const bin = new Uint8Array(16);\n const view = new DataView(bin.buffer);\n view.setUint32(0, Number.parseInt(str.slice(0, 8), 16), true);\n view.setUint16(4, Number.parseInt(str.slice(9, 13), 16), true);\n view.setUint16(6, Number.parseInt(str.slice(14, 18), 16), true);\n bin.set((0,uint8array_extras__WEBPACK_IMPORTED_MODULE_0__.hexToUint8Array)(str.slice(19, 23)), 8);\n bin.set((0,uint8array_extras__WEBPACK_IMPORTED_MODULE_0__.hexToUint8Array)(str.slice(24)), 10);\n return bin;\n }\n constructor(str) {\n this.str = str;\n }\n equals(guid) {\n return this.str === guid.str;\n }\n toBin() {\n return GUID.encode(this.str);\n }\n}\n// 10.1 Top-level ASF object GUIDs\nGUID.HeaderObject = new GUID(\"75B22630-668E-11CF-A6D9-00AA0062CE6C\");\nGUID.DataObject = new GUID(\"75B22636-668E-11CF-A6D9-00AA0062CE6C\");\nGUID.SimpleIndexObject = new GUID(\"33000890-E5B1-11CF-89F4-00A0C90349CB\");\nGUID.IndexObject = new GUID(\"D6E229D3-35DA-11D1-9034-00A0C90349BE\");\nGUID.MediaObjectIndexObject = new GUID(\"FEB103F8-12AD-4C64-840F-2A1D2F7AD48C\");\nGUID.TimecodeIndexObject = new GUID(\"3CB73FD0-0C4A-4803-953D-EDF7B6228F0C\");\n// 10.2 Header Object GUIDs\nGUID.FilePropertiesObject = new GUID(\"8CABDCA1-A947-11CF-8EE4-00C00C205365\");\nGUID.StreamPropertiesObject = new GUID(\"B7DC0791-A9B7-11CF-8EE6-00C00C205365\");\nGUID.HeaderExtensionObject = new GUID(\"5FBF03B5-A92E-11CF-8EE3-00C00C205365\");\nGUID.CodecListObject = new GUID(\"86D15240-311D-11D0-A3A4-00A0C90348F6\");\nGUID.ScriptCommandObject = new GUID(\"1EFB1A30-0B62-11D0-A39B-00A0C90348F6\");\nGUID.MarkerObject = new GUID(\"F487CD01-A951-11CF-8EE6-00C00C205365\");\nGUID.BitrateMutualExclusionObject = new GUID(\"D6E229DC-35DA-11D1-9034-00A0C90349BE\");\nGUID.ErrorCorrectionObject = new GUID(\"75B22635-668E-11CF-A6D9-00AA0062CE6C\");\nGUID.ContentDescriptionObject = new GUID(\"75B22633-668E-11CF-A6D9-00AA0062CE6C\");\nGUID.ExtendedContentDescriptionObject = new GUID(\"D2D0A440-E307-11D2-97F0-00A0C95EA850\");\nGUID.ContentBrandingObject = new GUID(\"2211B3FA-BD23-11D2-B4B7-00A0C955FC6E\");\nGUID.StreamBitratePropertiesObject = new GUID(\"7BF875CE-468D-11D1-8D82-006097C9A2B2\");\nGUID.ContentEncryptionObject = new GUID(\"2211B3FB-BD23-11D2-B4B7-00A0C955FC6E\");\nGUID.ExtendedContentEncryptionObject = new GUID(\"298AE614-2622-4C17-B935-DAE07EE9289C\");\nGUID.DigitalSignatureObject = new GUID(\"2211B3FC-BD23-11D2-B4B7-00A0C955FC6E\");\nGUID.PaddingObject = new GUID(\"1806D474-CADF-4509-A4BA-9AABCB96AAE8\");\n// 10.3 Header Extension Object GUIDs\nGUID.ExtendedStreamPropertiesObject = new GUID(\"14E6A5CB-C672-4332-8399-A96952065B5A\");\nGUID.AdvancedMutualExclusionObject = new GUID(\"A08649CF-4775-4670-8A16-6E35357566CD\");\nGUID.GroupMutualExclusionObject = new GUID(\"D1465A40-5A79-4338-B71B-E36B8FD6C249\");\nGUID.StreamPrioritizationObject = new GUID(\"D4FED15B-88D3-454F-81F0-ED5C45999E24\");\nGUID.BandwidthSharingObject = new GUID(\"A69609E6-517B-11D2-B6AF-00C04FD908E9\");\nGUID.LanguageListObject = new GUID(\"7C4346A9-EFE0-4BFC-B229-393EDE415C85\");\nGUID.MetadataObject = new GUID(\"C5F8CBEA-5BAF-4877-8467-AA8C44FA4CCA\");\nGUID.MetadataLibraryObject = new GUID(\"44231C94-9498-49D1-A141-1D134E457054\");\nGUID.IndexParametersObject = new GUID(\"D6E229DF-35DA-11D1-9034-00A0C90349BE\");\nGUID.MediaObjectIndexParametersObject = new GUID(\"6B203BAD-3F11-48E4-ACA8-D7613DE2CFA7\");\nGUID.TimecodeIndexParametersObject = new GUID(\"F55E496D-9797-4B5D-8C8B-604DFE9BFB24\");\nGUID.CompatibilityObject = new GUID(\"26F18B5D-4584-47EC-9F5F-0E651F0452C9\");\nGUID.AdvancedContentEncryptionObject = new GUID(\"43058533-6981-49E6-9B74-AD12CB86D58C\");\n// 10.4 Stream Properties Object Stream Type GUIDs\nGUID.AudioMedia = new GUID(\"F8699E40-5B4D-11CF-A8FD-00805F5C442B\");\nGUID.VideoMedia = new GUID(\"BC19EFC0-5B4D-11CF-A8FD-00805F5C442B\");\nGUID.CommandMedia = new GUID(\"59DACFC0-59E6-11D0-A3AC-00A0C90348F6\");\nGUID.JFIF_Media = new GUID(\"B61BE100-5B4E-11CF-A8FD-00805F5C442B\");\nGUID.Degradable_JPEG_Media = new GUID(\"35907DE0-E415-11CF-A917-00805F5C442B\");\nGUID.FileTransferMedia = new GUID(\"91BD222C-F21C-497A-8B6D-5AA86BFC0185\");\nGUID.BinaryMedia = new GUID(\"3AFB65E2-47EF-40F2-AC2C-70A90D71D343\");\nGUID.ASF_Index_Placeholder_Object = new GUID(\"D9AADE20-7C17-4F9C-BC28-8555DD98E2A2\");\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (GUID);\n//# sourceMappingURL=GUID.js.map\n\n//# sourceURL=webpack://ExamBundle/../../node_modules/music-metadata/lib/asf/GUID.js?");
37
+
38
+ /***/ })
39
+
40
+ }]);
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ /*
3
+ * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
4
+ * This devtool is neither made for production nor for readable output files.
5
+ * It uses "eval()" calls to create a separate source file in the browser devtools.
6
+ * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
7
+ * or disable the default devtool with "devtool: false".
8
+ * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
9
+ */
10
+ (this["webpackChunkExamBundle"] = this["webpackChunkExamBundle"] || []).push([["vendors-node_modules_music-metadata_lib_flac_FlacParser_js"],{
11
+
12
+ /***/ "../../node_modules/music-metadata/lib/flac/FlacParser.js":
13
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
14
+
15
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FlacParser: () => (/* binding */ FlacParser)\n/* harmony export */ });\n/* harmony import */ var token_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"../../node_modules/token-types/lib/index.js\");\n/* harmony import */ var debug__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(\"../../node_modules/debug/src/browser.js\");\n/* harmony import */ var _common_Util_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(\"../../node_modules/music-metadata/lib/common/Util.js\");\n/* harmony import */ var _ogg_vorbis_Vorbis_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(\"../../node_modules/music-metadata/lib/ogg/vorbis/Vorbis.js\");\n/* harmony import */ var _id3v2_AbstractID3Parser_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(\"../../node_modules/music-metadata/lib/id3v2/AbstractID3Parser.js\");\n/* harmony import */ var _common_FourCC_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(\"../../node_modules/music-metadata/lib/common/FourCC.js\");\n/* harmony import */ var _ogg_vorbis_VorbisParser_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(\"../../node_modules/music-metadata/lib/ogg/vorbis/VorbisParser.js\");\n/* harmony import */ var _ogg_vorbis_VorbisDecoder_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(\"../../node_modules/music-metadata/lib/ogg/vorbis/VorbisDecoder.js\");\n/* harmony import */ var _ParseError_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(\"../../node_modules/music-metadata/lib/ParseError.js\");\n\n\n\n\n\n\n\n\n\nconst debug = debug__WEBPACK_IMPORTED_MODULE_1__('music-metadata:parser:FLAC');\nclass FlacContentError extends (0,_ParseError_js__WEBPACK_IMPORTED_MODULE_8__.makeUnexpectedFileContentError)('FLAC') {\n}\n/**\n * FLAC supports up to 128 kinds of metadata blocks; currently the following are defined:\n * ref: https://xiph.org/flac/format.html#metadata_block\n */\nvar BlockType;\n(function (BlockType) {\n BlockType[BlockType[\"STREAMINFO\"] = 0] = \"STREAMINFO\";\n BlockType[BlockType[\"PADDING\"] = 1] = \"PADDING\";\n BlockType[BlockType[\"APPLICATION\"] = 2] = \"APPLICATION\";\n BlockType[BlockType[\"SEEKTABLE\"] = 3] = \"SEEKTABLE\";\n BlockType[BlockType[\"VORBIS_COMMENT\"] = 4] = \"VORBIS_COMMENT\";\n BlockType[BlockType[\"CUESHEET\"] = 5] = \"CUESHEET\";\n BlockType[BlockType[\"PICTURE\"] = 6] = \"PICTURE\";\n})(BlockType || (BlockType = {}));\nclass FlacParser extends _id3v2_AbstractID3Parser_js__WEBPACK_IMPORTED_MODULE_4__.AbstractID3Parser {\n constructor() {\n super(...arguments);\n this.vorbisParser = new _ogg_vorbis_VorbisParser_js__WEBPACK_IMPORTED_MODULE_6__.VorbisParser(this.metadata, this.options);\n this.padding = 0;\n }\n async postId3v2Parse() {\n const fourCC = await this.tokenizer.readToken(_common_FourCC_js__WEBPACK_IMPORTED_MODULE_5__.FourCcToken);\n if (fourCC.toString() !== 'fLaC') {\n throw new FlacContentError('Invalid FLAC preamble');\n }\n let blockHeader;\n do {\n // Read block header\n blockHeader = await this.tokenizer.readToken(BlockHeader);\n // Parse block data\n await this.parseDataBlock(blockHeader);\n } while (!blockHeader.lastBlock);\n if (this.tokenizer.fileInfo.size && this.metadata.format.duration) {\n const dataSize = this.tokenizer.fileInfo.size - this.tokenizer.position;\n this.metadata.setFormat('bitrate', 8 * dataSize / this.metadata.format.duration);\n }\n }\n async parseDataBlock(blockHeader) {\n debug(`blockHeader type=${blockHeader.type}, length=${blockHeader.length}`);\n switch (blockHeader.type) {\n case BlockType.STREAMINFO:\n return this.parseBlockStreamInfo(blockHeader.length);\n case BlockType.PADDING:\n this.padding += blockHeader.length;\n break;\n case BlockType.APPLICATION:\n break;\n case BlockType.SEEKTABLE:\n break;\n case BlockType.VORBIS_COMMENT:\n return this.parseComment(blockHeader.length);\n case BlockType.CUESHEET:\n break;\n case BlockType.PICTURE:\n await this.parsePicture(blockHeader.length);\n return;\n default:\n this.metadata.addWarning(`Unknown block type: ${blockHeader.type}`);\n }\n // Ignore data block\n return this.tokenizer.ignore(blockHeader.length).then();\n }\n /**\n * Parse STREAMINFO\n */\n async parseBlockStreamInfo(dataLen) {\n if (dataLen !== BlockStreamInfo.len)\n throw new FlacContentError('Unexpected block-stream-info length');\n const streamInfo = await this.tokenizer.readToken(BlockStreamInfo);\n this.metadata.setFormat('container', 'FLAC');\n this.metadata.setFormat('codec', 'FLAC');\n this.metadata.setFormat('lossless', true);\n this.metadata.setFormat('numberOfChannels', streamInfo.channels);\n this.metadata.setFormat('bitsPerSample', streamInfo.bitsPerSample);\n this.metadata.setFormat('sampleRate', streamInfo.sampleRate);\n if (streamInfo.totalSamples > 0) {\n this.metadata.setFormat('duration', streamInfo.totalSamples / streamInfo.sampleRate);\n }\n }\n /**\n * Parse VORBIS_COMMENT\n * Ref: https://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-640004.2.3\n */\n async parseComment(dataLen) {\n const data = await this.tokenizer.readToken(new token_types__WEBPACK_IMPORTED_MODULE_0__.Uint8ArrayType(dataLen));\n const decoder = new _ogg_vorbis_VorbisDecoder_js__WEBPACK_IMPORTED_MODULE_7__.VorbisDecoder(data, 0);\n decoder.readStringUtf8(); // vendor (skip)\n const commentListLength = decoder.readInt32();\n const tags = new Array(commentListLength);\n for (let i = 0; i < commentListLength; i++) {\n tags[i] = decoder.parseUserComment();\n }\n await Promise.all(tags.map(tag => this.vorbisParser.addTag(tag.key, tag.value)));\n }\n async parsePicture(dataLen) {\n if (this.options.skipCovers) {\n return this.tokenizer.ignore(dataLen);\n }\n const picture = await this.tokenizer.readToken(new _ogg_vorbis_Vorbis_js__WEBPACK_IMPORTED_MODULE_3__.VorbisPictureToken(dataLen));\n this.vorbisParser.addTag('METADATA_BLOCK_PICTURE', picture);\n }\n}\nconst BlockHeader = {\n len: 4,\n get: (buf, off) => {\n return {\n lastBlock: _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.getBit(buf, off, 7),\n type: _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.getBitAllignedNumber(buf, off, 1, 7),\n length: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT24_BE.get(buf, off + 1)\n };\n }\n};\n/**\n * METADATA_BLOCK_DATA\n * Ref: https://xiph.org/flac/format.html#metadata_block_streaminfo\n */\nconst BlockStreamInfo = {\n len: 34,\n get: (buf, off) => {\n return {\n // The minimum block size (in samples) used in the stream.\n minimumBlockSize: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT16_BE.get(buf, off),\n // The maximum block size (in samples) used in the stream.\n // (Minimum blocksize == maximum blocksize) implies a fixed-blocksize stream.\n maximumBlockSize: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT16_BE.get(buf, off + 2) / 1000,\n // The minimum frame size (in bytes) used in the stream.\n // May be 0 to imply the value is not known.\n minimumFrameSize: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT24_BE.get(buf, off + 4),\n // The maximum frame size (in bytes) used in the stream.\n // May be 0 to imply the value is not known.\n maximumFrameSize: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT24_BE.get(buf, off + 7),\n // Sample rate in Hz. Though 20 bits are available,\n // the maximum sample rate is limited by the structure of frame headers to 655350Hz.\n // Also, a value of 0 is invalid.\n sampleRate: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT24_BE.get(buf, off + 10) >> 4,\n // probably slower: sampleRate: common.getBitAllignedNumber(buf, off + 10, 0, 20),\n // (number of channels)-1. FLAC supports from 1 to 8 channels\n channels: _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.getBitAllignedNumber(buf, off + 12, 4, 3) + 1,\n // bits per sample)-1.\n // FLAC supports from 4 to 32 bits per sample. Currently the reference encoder and decoders only support up to 24 bits per sample.\n bitsPerSample: _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.getBitAllignedNumber(buf, off + 12, 7, 5) + 1,\n // Total samples in stream.\n // 'Samples' means inter-channel sample, i.e. one second of 44.1Khz audio will have 44100 samples regardless of the number of channels.\n // A value of zero here means the number of total samples is unknown.\n totalSamples: _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.getBitAllignedNumber(buf, off + 13, 4, 36),\n // the MD5 hash of the file (see notes for usage... it's a littly tricky)\n fileMD5: new token_types__WEBPACK_IMPORTED_MODULE_0__.Uint8ArrayType(16).get(buf, off + 18)\n };\n }\n};\n//# sourceMappingURL=FlacParser.js.map\n\n//# sourceURL=webpack://ExamBundle/../../node_modules/music-metadata/lib/flac/FlacParser.js?");
16
+
17
+ /***/ }),
18
+
19
+ /***/ "../../node_modules/music-metadata/lib/id3v2/AbstractID3Parser.js":
20
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
21
+
22
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbstractID3Parser: () => (/* binding */ AbstractID3Parser)\n/* harmony export */ });\n/* harmony import */ var strtok3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"../../node_modules/strtok3/lib/core.js\");\n/* harmony import */ var debug__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(\"../../node_modules/debug/src/browser.js\");\n/* harmony import */ var _ID3v2Token_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(\"../../node_modules/music-metadata/lib/id3v2/ID3v2Token.js\");\n/* harmony import */ var _ID3v2Parser_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(\"../../node_modules/music-metadata/lib/id3v2/ID3v2Parser.js\");\n/* harmony import */ var _id3v1_ID3v1Parser_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(\"../../node_modules/music-metadata/lib/id3v1/ID3v1Parser.js\");\n/* harmony import */ var _common_BasicParser_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(\"../../node_modules/music-metadata/lib/common/BasicParser.js\");\n\n\n\n\n\n\nconst debug = debug__WEBPACK_IMPORTED_MODULE_1__('music-metadata:parser:ID3');\n/**\n * Abstract parser which tries take ID3v2 and ID3v1 headers.\n */\nclass AbstractID3Parser extends _common_BasicParser_js__WEBPACK_IMPORTED_MODULE_5__.BasicParser {\n constructor() {\n super(...arguments);\n this.id3parser = new _ID3v2Parser_js__WEBPACK_IMPORTED_MODULE_3__.ID3v2Parser();\n }\n static async startsWithID3v2Header(tokenizer) {\n return (await tokenizer.peekToken(_ID3v2Token_js__WEBPACK_IMPORTED_MODULE_2__.ID3v2Header)).fileIdentifier === 'ID3';\n }\n async parse() {\n try {\n await this.parseID3v2();\n }\n catch (err) {\n if (err instanceof strtok3__WEBPACK_IMPORTED_MODULE_0__.EndOfStreamError) {\n debug(\"End-of-stream\");\n }\n else {\n throw err;\n }\n }\n }\n finalize() {\n return;\n }\n async parseID3v2() {\n await this.tryReadId3v2Headers();\n debug('End of ID3v2 header, go to MPEG-parser: pos=%s', this.tokenizer.position);\n await this.postId3v2Parse();\n if (this.options.skipPostHeaders && this.metadata.hasAny()) {\n this.finalize();\n }\n else {\n const id3v1parser = new _id3v1_ID3v1Parser_js__WEBPACK_IMPORTED_MODULE_4__.ID3v1Parser(this.metadata, this.tokenizer, this.options);\n await id3v1parser.parse();\n this.finalize();\n }\n }\n async tryReadId3v2Headers() {\n const id3Header = await this.tokenizer.peekToken(_ID3v2Token_js__WEBPACK_IMPORTED_MODULE_2__.ID3v2Header);\n if (id3Header.fileIdentifier === 'ID3') {\n debug('Found ID3v2 header, pos=%s', this.tokenizer.position);\n await this.id3parser.parse(this.metadata, this.tokenizer, this.options);\n return this.tryReadId3v2Headers();\n }\n }\n}\n//# sourceMappingURL=AbstractID3Parser.js.map\n\n//# sourceURL=webpack://ExamBundle/../../node_modules/music-metadata/lib/id3v2/AbstractID3Parser.js?");
23
+
24
+ /***/ }),
25
+
26
+ /***/ "../../node_modules/music-metadata/lib/ogg/vorbis/Vorbis.js":
27
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
28
+
29
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CommonHeader: () => (/* binding */ CommonHeader),\n/* harmony export */ IdentificationHeader: () => (/* binding */ IdentificationHeader),\n/* harmony export */ VorbisPictureToken: () => (/* binding */ VorbisPictureToken)\n/* harmony export */ });\n/* harmony import */ var token_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"../../node_modules/token-types/lib/index.js\");\n/* harmony import */ var _id3v2_ID3v2Token_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(\"../../node_modules/music-metadata/lib/id3v2/ID3v2Token.js\");\n\n\n/**\n * Parse the METADATA_BLOCK_PICTURE\n * Ref: https://wiki.xiph.org/VorbisComment#METADATA_BLOCK_PICTURE\n * Ref: https://xiph.org/flac/format.html#metadata_block_picture\n * // ToDo: move to ID3 / APIC?\n */\nclass VorbisPictureToken {\n static fromBase64(base64str) {\n return VorbisPictureToken.fromBuffer(Uint8Array.from(atob(base64str), c => c.charCodeAt(0)));\n }\n static fromBuffer(buffer) {\n const pic = new VorbisPictureToken(buffer.length);\n return pic.get(buffer, 0);\n }\n constructor(len) {\n this.len = len;\n }\n get(buffer, offset) {\n const type = _id3v2_ID3v2Token_js__WEBPACK_IMPORTED_MODULE_1__.AttachedPictureType[token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_BE.get(buffer, offset)];\n offset += 4;\n const mimeLen = token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_BE.get(buffer, offset);\n offset += 4;\n const format = new token_types__WEBPACK_IMPORTED_MODULE_0__.StringType(mimeLen, 'utf-8').get(buffer, offset);\n offset += mimeLen;\n const descLen = token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_BE.get(buffer, offset);\n offset += 4;\n const description = new token_types__WEBPACK_IMPORTED_MODULE_0__.StringType(descLen, 'utf-8').get(buffer, offset);\n offset += descLen;\n const width = token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_BE.get(buffer, offset);\n offset += 4;\n const height = token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_BE.get(buffer, offset);\n offset += 4;\n const colour_depth = token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_BE.get(buffer, offset);\n offset += 4;\n const indexed_color = token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_BE.get(buffer, offset);\n offset += 4;\n const picDataLen = token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_BE.get(buffer, offset);\n offset += 4;\n const data = Uint8Array.from(buffer.slice(offset, offset + picDataLen));\n return {\n type,\n format,\n description,\n width,\n height,\n colour_depth,\n indexed_color,\n data\n };\n }\n}\n/**\n * Comment header decoder\n * Ref: https://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-620004.2.1\n */\nconst CommonHeader = {\n len: 7,\n get: (buf, off) => {\n return {\n packetType: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT8.get(buf, off),\n vorbis: new token_types__WEBPACK_IMPORTED_MODULE_0__.StringType(6, 'ascii').get(buf, off + 1)\n };\n }\n};\n/**\n * Identification header decoder\n * Ref: https://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-630004.2.2\n */\nconst IdentificationHeader = {\n len: 23,\n get: (uint8Array, off) => {\n return {\n version: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_LE.get(uint8Array, off + 0),\n channelMode: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT8.get(uint8Array, off + 4),\n sampleRate: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_LE.get(uint8Array, off + 5),\n bitrateMax: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_LE.get(uint8Array, off + 9),\n bitrateNominal: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_LE.get(uint8Array, off + 13),\n bitrateMin: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_LE.get(uint8Array, off + 17)\n };\n }\n};\n//# sourceMappingURL=Vorbis.js.map\n\n//# sourceURL=webpack://ExamBundle/../../node_modules/music-metadata/lib/ogg/vorbis/Vorbis.js?");
30
+
31
+ /***/ }),
32
+
33
+ /***/ "../../node_modules/music-metadata/lib/ogg/vorbis/VorbisDecoder.js":
34
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
35
+
36
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VorbisDecoder: () => (/* binding */ VorbisDecoder)\n/* harmony export */ });\n/* harmony import */ var token_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"../../node_modules/token-types/lib/index.js\");\n\nclass VorbisDecoder {\n constructor(data, offset) {\n this.data = data;\n this.offset = offset;\n }\n readInt32() {\n const value = token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_LE.get(this.data, this.offset);\n this.offset += 4;\n return value;\n }\n readStringUtf8() {\n const len = this.readInt32();\n const value = new TextDecoder('utf-8').decode(this.data.subarray(this.offset, this.offset + len));\n this.offset += len;\n return value;\n }\n parseUserComment() {\n const offset0 = this.offset;\n const v = this.readStringUtf8();\n const idx = v.indexOf('=');\n return {\n key: v.slice(0, idx).toUpperCase(),\n value: v.slice(idx + 1),\n len: this.offset - offset0\n };\n }\n}\n//# sourceMappingURL=VorbisDecoder.js.map\n\n//# sourceURL=webpack://ExamBundle/../../node_modules/music-metadata/lib/ogg/vorbis/VorbisDecoder.js?");
37
+
38
+ /***/ }),
39
+
40
+ /***/ "../../node_modules/music-metadata/lib/ogg/vorbis/VorbisParser.js":
41
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
42
+
43
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ VorbisContentError: () => (/* binding */ VorbisContentError),\n/* harmony export */ VorbisParser: () => (/* binding */ VorbisParser)\n/* harmony export */ });\n/* harmony import */ var token_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"../../node_modules/token-types/lib/index.js\");\n/* harmony import */ var debug__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(\"../../node_modules/debug/src/browser.js\");\n/* harmony import */ var _VorbisDecoder_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(\"../../node_modules/music-metadata/lib/ogg/vorbis/VorbisDecoder.js\");\n/* harmony import */ var _Vorbis_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(\"../../node_modules/music-metadata/lib/ogg/vorbis/Vorbis.js\");\n/* harmony import */ var _ParseError_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(\"../../node_modules/music-metadata/lib/ParseError.js\");\n\n\n\n\n\nconst debug = debug__WEBPACK_IMPORTED_MODULE_1__('music-metadata:parser:ogg:vorbis1');\nclass VorbisContentError extends (0,_ParseError_js__WEBPACK_IMPORTED_MODULE_4__.makeUnexpectedFileContentError)('Vorbis') {\n}\n/**\n * Vorbis 1 Parser.\n * Used by OggParser\n */\nclass VorbisParser {\n constructor(metadata, options) {\n this.metadata = metadata;\n this.options = options;\n this.pageSegments = [];\n }\n /**\n * Vorbis 1 parser\n * @param header Ogg Page Header\n * @param pageData Page data\n */\n async parsePage(header, pageData) {\n if (header.headerType.firstPage) {\n this.parseFirstPage(header, pageData);\n }\n else {\n if (header.headerType.continued) {\n if (this.pageSegments.length === 0) {\n throw new VorbisContentError('Cannot continue on previous page');\n }\n this.pageSegments.push(pageData);\n }\n if (header.headerType.lastPage || !header.headerType.continued) {\n // Flush page segments\n if (this.pageSegments.length > 0) {\n const fullPage = VorbisParser.mergeUint8Arrays(this.pageSegments);\n await this.parseFullPage(fullPage);\n }\n // Reset page segments\n this.pageSegments = header.headerType.lastPage ? [] : [pageData];\n }\n }\n if (header.headerType.lastPage) {\n this.calculateDuration(header);\n }\n }\n static mergeUint8Arrays(arrays) {\n const totalSize = arrays.reduce((acc, e) => acc + e.length, 0);\n const merged = new Uint8Array(totalSize);\n arrays.forEach((array, i, _arrays) => {\n const offset = _arrays.slice(0, i).reduce((acc, e) => acc + e.length, 0);\n merged.set(array, offset);\n });\n return merged;\n }\n async flush() {\n await this.parseFullPage(VorbisParser.mergeUint8Arrays(this.pageSegments));\n }\n async parseUserComment(pageData, offset) {\n const decoder = new _VorbisDecoder_js__WEBPACK_IMPORTED_MODULE_2__.VorbisDecoder(pageData, offset);\n const tag = decoder.parseUserComment();\n await this.addTag(tag.key, tag.value);\n return tag.len;\n }\n async addTag(id, value) {\n if (id === 'METADATA_BLOCK_PICTURE' && (typeof value === 'string')) {\n if (this.options.skipCovers) {\n debug(\"Ignore picture\");\n return;\n }\n value = _Vorbis_js__WEBPACK_IMPORTED_MODULE_3__.VorbisPictureToken.fromBase64(value);\n debug(`Push picture: id=${id}, format=${value.format}`);\n }\n else {\n debug(`Push tag: id=${id}, value=${value}`);\n }\n await this.metadata.addTag('vorbis', id, value);\n }\n calculateDuration(header) {\n if (this.metadata.format.sampleRate && header.absoluteGranulePosition >= 0) {\n // Calculate duration\n this.metadata.setFormat('numberOfSamples', header.absoluteGranulePosition);\n this.metadata.setFormat('duration', header.absoluteGranulePosition / this.metadata.format.sampleRate);\n }\n }\n /**\n * Parse first Ogg/Vorbis page\n * @param header\n * @param pageData\n */\n parseFirstPage(header, pageData) {\n this.metadata.setFormat('codec', 'Vorbis I');\n debug('Parse first page');\n // Parse Vorbis common header\n const commonHeader = _Vorbis_js__WEBPACK_IMPORTED_MODULE_3__.CommonHeader.get(pageData, 0);\n if (commonHeader.vorbis !== 'vorbis')\n throw new VorbisContentError('Metadata does not look like Vorbis');\n if (commonHeader.packetType === 1) {\n const idHeader = _Vorbis_js__WEBPACK_IMPORTED_MODULE_3__.IdentificationHeader.get(pageData, _Vorbis_js__WEBPACK_IMPORTED_MODULE_3__.CommonHeader.len);\n this.metadata.setFormat('sampleRate', idHeader.sampleRate);\n this.metadata.setFormat('bitrate', idHeader.bitrateNominal);\n this.metadata.setFormat('numberOfChannels', idHeader.channelMode);\n debug('sample-rate=%s[hz], bitrate=%s[b/s], channel-mode=%s', idHeader.sampleRate, idHeader.bitrateNominal, idHeader.channelMode);\n }\n else\n throw new VorbisContentError('First Ogg page should be type 1: the identification header');\n }\n async parseFullPage(pageData) {\n // New page\n const commonHeader = _Vorbis_js__WEBPACK_IMPORTED_MODULE_3__.CommonHeader.get(pageData, 0);\n debug('Parse full page: type=%s, byteLength=%s', commonHeader.packetType, pageData.byteLength);\n switch (commonHeader.packetType) {\n case 3: // type 3: comment header\n return this.parseUserCommentList(pageData, _Vorbis_js__WEBPACK_IMPORTED_MODULE_3__.CommonHeader.len);\n case 1: // type 1: the identification header\n case 5: // type 5: setup header type\n break; // ignore\n }\n }\n /**\n * Ref: https://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-840005.2\n */\n async parseUserCommentList(pageData, offset) {\n const strLen = token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_LE.get(pageData, offset);\n offset += 4;\n // const vendorString = new Token.StringType(strLen, 'utf-8').get(pageData, offset);\n offset += strLen;\n let userCommentListLength = token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_LE.get(pageData, offset);\n offset += 4;\n while (userCommentListLength-- > 0) {\n offset += (await this.parseUserComment(pageData, offset));\n }\n }\n}\n//# sourceMappingURL=VorbisParser.js.map\n\n//# sourceURL=webpack://ExamBundle/../../node_modules/music-metadata/lib/ogg/vorbis/VorbisParser.js?");
44
+
45
+ /***/ })
46
+
47
+ }]);
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ /*
3
+ * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
4
+ * This devtool is neither made for production nor for readable output files.
5
+ * It uses "eval()" calls to create a separate source file in the browser devtools.
6
+ * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
7
+ * or disable the default devtool with "devtool: false".
8
+ * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
9
+ */
10
+ (this["webpackChunkExamBundle"] = this["webpackChunkExamBundle"] || []).push([["vendors-node_modules_music-metadata_lib_id3v2_ID3v2Parser_js"],{
11
+
12
+ /***/ "../../node_modules/music-metadata/lib/id3v2/FrameParser.js":
13
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
14
+
15
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ FrameParser: () => (/* binding */ FrameParser),\n/* harmony export */ Id3v2ContentError: () => (/* binding */ Id3v2ContentError),\n/* harmony export */ parseGenre: () => (/* binding */ parseGenre)\n/* harmony export */ });\n/* harmony import */ var debug__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"../../node_modules/debug/src/browser.js\");\n/* harmony import */ var token_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(\"../../node_modules/token-types/lib/index.js\");\n/* harmony import */ var _common_Util_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(\"../../node_modules/music-metadata/lib/common/Util.js\");\n/* harmony import */ var _ID3v2Token_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(\"../../node_modules/music-metadata/lib/id3v2/ID3v2Token.js\");\n/* harmony import */ var _id3v1_ID3v1Parser_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(\"../../node_modules/music-metadata/lib/id3v1/ID3v1Parser.js\");\n/* harmony import */ var _ParseError_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(\"../../node_modules/music-metadata/lib/ParseError.js\");\n\n\n\n\n\n\nconst debug = debug__WEBPACK_IMPORTED_MODULE_0__('music-metadata:id3v2:frame-parser');\nconst defaultEnc = 'latin1'; // latin1 == iso-8859-1;\nfunction parseGenre(origVal) {\n // match everything inside parentheses\n const genres = [];\n let code;\n let word = '';\n for (const c of origVal) {\n if (typeof code === 'string') {\n if (c === '(' && code === '') {\n word += '(';\n code = undefined;\n }\n else if (c === ')') {\n if (word !== '') {\n genres.push(word);\n word = '';\n }\n const genre = parseGenreCode(code);\n if (genre) {\n genres.push(genre);\n }\n code = undefined;\n }\n else\n code += c;\n }\n else if (c === '(') {\n code = '';\n }\n else {\n word += c;\n }\n }\n if (word) {\n if (genres.length === 0 && word.match(/^\\d*$/)) {\n word = parseGenreCode(word);\n }\n if (word) {\n genres.push(word);\n }\n }\n return genres;\n}\nfunction parseGenreCode(code) {\n if (code === 'RX')\n return 'Remix';\n if (code === 'CR')\n return 'Cover';\n if (code.match(/^\\d*$/)) {\n return _id3v1_ID3v1Parser_js__WEBPACK_IMPORTED_MODULE_4__.Genres[Number.parseInt(code)];\n }\n}\nclass FrameParser {\n /**\n * Create id3v2 frame parser\n * @param major - Major version, e.g. (4) for id3v2.4\n * @param warningCollector - Used to collect decode issue\n */\n constructor(major, warningCollector) {\n this.major = major;\n this.warningCollector = warningCollector;\n }\n readData(uint8Array, type, includeCovers) {\n if (uint8Array.length === 0) {\n this.warningCollector.addWarning(`id3v2.${this.major} header has empty tag type=${type}`);\n return;\n }\n const { encoding, bom } = _ID3v2Token_js__WEBPACK_IMPORTED_MODULE_3__.TextEncodingToken.get(uint8Array, 0);\n const length = uint8Array.length;\n let offset = 0;\n let output = []; // ToDo\n const nullTerminatorLength = FrameParser.getNullTerminatorLength(encoding);\n let fzero;\n debug(`Parsing tag type=${type}, encoding=${encoding}, bom=${bom}`);\n switch (type !== 'TXXX' && type[0] === 'T' ? 'T*' : type) {\n case 'T*': // 4.2.1. Text information frames - details\n case 'GRP1': // iTunes-specific ID3v2 grouping field\n case 'IPLS': // v2.3: Involved people list\n case 'MVIN':\n case 'MVNM':\n case 'PCS':\n case 'PCST': {\n let text;\n try {\n text = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.decodeString(uint8Array.slice(1), encoding).replace(/\\x00+$/, '');\n }\n catch (error) {\n if (error instanceof Error) {\n this.warningCollector.addWarning(`id3v2.${this.major} type=${type} header has invalid string value: ${error.message}`);\n break;\n }\n throw error;\n }\n switch (type) {\n case 'TMCL': // Musician credits list\n case 'TIPL': // Involved people list\n case 'IPLS': // Involved people list\n output = FrameParser.functionList(this.splitValue(type, text));\n break;\n case 'TRK':\n case 'TRCK':\n case 'TPOS':\n output = text;\n break;\n case 'TCOM':\n case 'TEXT':\n case 'TOLY':\n case 'TOPE':\n case 'TPE1':\n case 'TSRC':\n // id3v2.3 defines that TCOM, TEXT, TOLY, TOPE & TPE1 values are separated by /\n output = this.splitValue(type, text);\n break;\n case 'TCO':\n case 'TCON':\n output = this.splitValue(type, text).map(v => parseGenre(v)).reduce((acc, val) => acc.concat(val), []);\n break;\n case 'PCS':\n case 'PCST':\n // TODO: Why `default` not results `1` but `''`?\n output = this.major >= 4 ? this.splitValue(type, text) : [text];\n output = (Array.isArray(output) && output[0] === '') ? 1 : 0;\n break;\n default:\n output = this.major >= 4 ? this.splitValue(type, text) : [text];\n }\n break;\n }\n case 'TXXX': {\n const idAndData = FrameParser.readIdentifierAndData(uint8Array, offset + 1, length, encoding);\n const textTag = {\n description: idAndData.id,\n text: this.splitValue(type, _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.decodeString(idAndData.data, encoding).replace(/\\x00+$/, ''))\n };\n output = textTag;\n break;\n }\n case 'PIC':\n case 'APIC':\n if (includeCovers) {\n const pic = {};\n offset += 1;\n switch (this.major) {\n case 2:\n pic.format = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.decodeString(uint8Array.slice(offset, offset + 3), 'latin1'); // 'latin1'; // latin1 == iso-8859-1;\n offset += 3;\n break;\n case 3:\n case 4:\n fzero = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.findZero(uint8Array, offset, length, defaultEnc);\n pic.format = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.decodeString(uint8Array.slice(offset, fzero), defaultEnc);\n offset = fzero + 1;\n break;\n default:\n throw makeUnexpectedMajorVersionError(this.major);\n }\n pic.format = FrameParser.fixPictureMimeType(pic.format);\n pic.type = _ID3v2Token_js__WEBPACK_IMPORTED_MODULE_3__.AttachedPictureType[uint8Array[offset]];\n offset += 1;\n fzero = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.findZero(uint8Array, offset, length, encoding);\n pic.description = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.decodeString(uint8Array.slice(offset, fzero), encoding);\n offset = fzero + nullTerminatorLength;\n pic.data = uint8Array.slice(offset, length);\n output = pic;\n }\n break;\n case 'CNT':\n case 'PCNT':\n output = token_types__WEBPACK_IMPORTED_MODULE_1__.UINT32_BE.get(uint8Array, 0);\n break;\n case 'SYLT': {\n const syltHeader = _ID3v2Token_js__WEBPACK_IMPORTED_MODULE_3__.SyncTextHeader.get(uint8Array, 0);\n offset += _ID3v2Token_js__WEBPACK_IMPORTED_MODULE_3__.SyncTextHeader.len;\n const result = {\n descriptor: '',\n language: syltHeader.language,\n contentType: syltHeader.contentType,\n timeStampFormat: syltHeader.timeStampFormat,\n syncText: []\n };\n let readSyllables = false;\n while (offset < length) {\n const nullStr = FrameParser.readNullTerminatedString(uint8Array.subarray(offset), syltHeader.encoding);\n offset += nullStr.len;\n if (readSyllables) {\n const timestamp = token_types__WEBPACK_IMPORTED_MODULE_1__.UINT32_BE.get(uint8Array, offset);\n offset += token_types__WEBPACK_IMPORTED_MODULE_1__.UINT32_BE.len;\n result.syncText.push({\n text: nullStr.text,\n timestamp\n });\n }\n else {\n result.descriptor = nullStr.text;\n readSyllables = true;\n }\n }\n output = result;\n break;\n }\n case 'ULT':\n case 'USLT':\n case 'COM':\n case 'COMM': {\n const textHeader = _ID3v2Token_js__WEBPACK_IMPORTED_MODULE_3__.TextHeader.get(uint8Array, offset);\n offset += _ID3v2Token_js__WEBPACK_IMPORTED_MODULE_3__.TextHeader.len;\n const descriptorStr = FrameParser.readNullTerminatedString(uint8Array.subarray(offset), textHeader.encoding);\n offset += descriptorStr.len;\n const textStr = FrameParser.readNullTerminatedString(uint8Array.subarray(offset), textHeader.encoding);\n const comment = {\n language: textHeader.language,\n descriptor: descriptorStr.text,\n text: textStr.text\n };\n output = comment;\n break;\n }\n case 'UFID': {\n const ufid = FrameParser.readIdentifierAndData(uint8Array, offset, length, defaultEnc);\n output = { owner_identifier: ufid.id, identifier: ufid.data };\n break;\n }\n case 'PRIV': { // private frame\n const priv = FrameParser.readIdentifierAndData(uint8Array, offset, length, defaultEnc);\n output = { owner_identifier: priv.id, data: priv.data };\n break;\n }\n case 'POPM': { // Popularimeter\n fzero = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.findZero(uint8Array, offset, length, defaultEnc);\n const email = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.decodeString(uint8Array.slice(offset, fzero), defaultEnc);\n offset = fzero + 1;\n const dataLen = length - offset;\n output = {\n email,\n rating: token_types__WEBPACK_IMPORTED_MODULE_1__.UINT8.get(uint8Array, offset),\n counter: dataLen >= 5 ? token_types__WEBPACK_IMPORTED_MODULE_1__.UINT32_BE.get(uint8Array, offset + 1) : undefined\n };\n break;\n }\n case 'GEOB': { // General encapsulated object\n fzero = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.findZero(uint8Array, offset + 1, length, encoding);\n const mimeType = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.decodeString(uint8Array.slice(offset + 1, fzero), defaultEnc);\n offset = fzero + 1;\n fzero = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.findZero(uint8Array, offset, length, encoding);\n const filename = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.decodeString(uint8Array.slice(offset, fzero), defaultEnc);\n offset = fzero + 1;\n fzero = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.findZero(uint8Array, offset, length, encoding);\n const description = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.decodeString(uint8Array.slice(offset, fzero), defaultEnc);\n offset = fzero + 1;\n const geob = {\n type: mimeType,\n filename,\n description,\n data: uint8Array.slice(offset, length)\n };\n output = geob;\n break;\n }\n // W-Frames:\n case 'WCOM':\n case 'WCOP':\n case 'WOAF':\n case 'WOAR':\n case 'WOAS':\n case 'WORS':\n case 'WPAY':\n case 'WPUB':\n // Decode URL\n fzero = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.findZero(uint8Array, offset + 1, length, encoding);\n output = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.decodeString(uint8Array.slice(offset, fzero), defaultEnc);\n break;\n case 'WXXX': {\n // Decode URL\n fzero = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.findZero(uint8Array, offset + 1, length, encoding);\n const description = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.decodeString(uint8Array.slice(offset + 1, fzero), encoding);\n offset = fzero + (encoding === 'utf-16le' ? 2 : 1);\n output = { description, url: _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.decodeString(uint8Array.slice(offset, length), defaultEnc) };\n break;\n }\n case 'WFD':\n case 'WFED':\n output = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.decodeString(uint8Array.slice(offset + 1, _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.findZero(uint8Array, offset + 1, length, encoding)), encoding);\n break;\n case 'MCDI': {\n // Music CD identifier\n output = uint8Array.slice(0, length);\n break;\n }\n default:\n debug(`Warning: unsupported id3v2-tag-type: ${type}`);\n break;\n }\n return output;\n }\n static readNullTerminatedString(uint8Array, encoding) {\n let offset = encoding.bom ? 2 : 0;\n const zeroIndex = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.findZero(uint8Array, offset, uint8Array.length, encoding.encoding);\n const txt = uint8Array.slice(offset, zeroIndex);\n if (encoding.encoding === 'utf-16le') {\n offset = zeroIndex + 2;\n }\n else {\n offset = zeroIndex + 1;\n }\n return {\n text: _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.decodeString(txt, encoding.encoding),\n len: offset\n };\n }\n static fixPictureMimeType(pictureType) {\n pictureType = pictureType.toLocaleLowerCase();\n switch (pictureType) {\n case 'jpg':\n return 'image/jpeg';\n case 'png':\n return 'image/png';\n }\n return pictureType;\n }\n /**\n * Converts TMCL (Musician credits list) or TIPL (Involved people list)\n * @param entries\n */\n static functionList(entries) {\n const res = {};\n for (let i = 0; i + 1 < entries.length; i += 2) {\n const names = entries[i + 1].split(',');\n res[entries[i]] = res[entries[i]] ? res[entries[i]].concat(names) : names;\n }\n return res;\n }\n /**\n * id3v2.4 defines that multiple T* values are separated by 0x00\n * id3v2.3 defines that TCOM, TEXT, TOLY, TOPE & TPE1 values are separated by /\n * @param tag - Tag name\n * @param text - Concatenated tag value\n * @returns Split tag value\n */\n splitValue(tag, text) {\n let values;\n if (this.major < 4) {\n values = text.split(/\\x00/g);\n if (values.length > 1) {\n this.warningCollector.addWarning(`ID3v2.${this.major} ${tag} uses non standard null-separator.`);\n }\n else {\n values = text.split(/\\//g);\n }\n }\n else {\n values = text.split(/\\x00/g);\n }\n return FrameParser.trimArray(values);\n }\n static trimArray(values) {\n return values.map(value => value.replace(/\\x00+$/, '').trim());\n }\n static readIdentifierAndData(uint8Array, offset, length, encoding) {\n const fzero = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.findZero(uint8Array, offset, length, encoding);\n const id = _common_Util_js__WEBPACK_IMPORTED_MODULE_2__.decodeString(uint8Array.slice(offset, fzero), encoding);\n offset = fzero + FrameParser.getNullTerminatorLength(encoding);\n return { id, data: uint8Array.slice(offset, length) };\n }\n static getNullTerminatorLength(enc) {\n return enc === 'utf-16le' ? 2 : 1;\n }\n}\nclass Id3v2ContentError extends (0,_ParseError_js__WEBPACK_IMPORTED_MODULE_5__.makeUnexpectedFileContentError)('id3v2') {\n}\nfunction makeUnexpectedMajorVersionError(majorVer) {\n throw new Id3v2ContentError(`Unexpected majorVer: ${majorVer}`);\n}\n//# sourceMappingURL=FrameParser.js.map\n\n//# sourceURL=webpack://ExamBundle/../../node_modules/music-metadata/lib/id3v2/FrameParser.js?");
16
+
17
+ /***/ }),
18
+
19
+ /***/ "../../node_modules/music-metadata/lib/id3v2/ID3v2Parser.js":
20
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
21
+
22
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ ID3v2Parser: () => (/* binding */ ID3v2Parser)\n/* harmony export */ });\n/* harmony import */ var token_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(\"../../node_modules/token-types/lib/index.js\");\n/* harmony import */ var _common_Util_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(\"../../node_modules/music-metadata/lib/common/Util.js\");\n/* harmony import */ var _FrameParser_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(\"../../node_modules/music-metadata/lib/id3v2/FrameParser.js\");\n/* harmony import */ var _ID3v2Token_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(\"../../node_modules/music-metadata/lib/id3v2/ID3v2Token.js\");\n\n\n\n\nconst asciiDecoder = new TextDecoder('ascii');\nclass ID3v2Parser {\n constructor() {\n this.tokenizer = undefined;\n this.id3Header = undefined;\n this.metadata = undefined;\n this.headerType = undefined;\n this.options = undefined;\n }\n static removeUnsyncBytes(buffer) {\n let readI = 0;\n let writeI = 0;\n while (readI < buffer.length - 1) {\n if (readI !== writeI) {\n buffer[writeI] = buffer[readI];\n }\n readI += (buffer[readI] === 0xFF && buffer[readI + 1] === 0) ? 2 : 1;\n writeI++;\n }\n if (readI < buffer.length) {\n buffer[writeI++] = buffer[readI];\n }\n return buffer.slice(0, writeI);\n }\n static getFrameHeaderLength(majorVer) {\n switch (majorVer) {\n case 2:\n return 6;\n case 3:\n case 4:\n return 10;\n default:\n throw makeUnexpectedMajorVersionError(majorVer);\n }\n }\n static readFrameFlags(b) {\n return {\n status: {\n tag_alter_preservation: _common_Util_js__WEBPACK_IMPORTED_MODULE_1__.getBit(b, 0, 6),\n file_alter_preservation: _common_Util_js__WEBPACK_IMPORTED_MODULE_1__.getBit(b, 0, 5),\n read_only: _common_Util_js__WEBPACK_IMPORTED_MODULE_1__.getBit(b, 0, 4)\n },\n format: {\n grouping_identity: _common_Util_js__WEBPACK_IMPORTED_MODULE_1__.getBit(b, 1, 7),\n compression: _common_Util_js__WEBPACK_IMPORTED_MODULE_1__.getBit(b, 1, 3),\n encryption: _common_Util_js__WEBPACK_IMPORTED_MODULE_1__.getBit(b, 1, 2),\n unsynchronisation: _common_Util_js__WEBPACK_IMPORTED_MODULE_1__.getBit(b, 1, 1),\n data_length_indicator: _common_Util_js__WEBPACK_IMPORTED_MODULE_1__.getBit(b, 1, 0)\n }\n };\n }\n static readFrameData(uint8Array, frameHeader, majorVer, includeCovers, warningCollector) {\n const frameParser = new _FrameParser_js__WEBPACK_IMPORTED_MODULE_2__.FrameParser(majorVer, warningCollector);\n switch (majorVer) {\n case 2:\n return frameParser.readData(uint8Array, frameHeader.id, includeCovers);\n case 3:\n case 4:\n if (frameHeader.flags?.format.unsynchronisation) {\n uint8Array = ID3v2Parser.removeUnsyncBytes(uint8Array);\n }\n if (frameHeader.flags?.format.data_length_indicator) {\n uint8Array = uint8Array.slice(4, uint8Array.length);\n }\n return frameParser.readData(uint8Array, frameHeader.id, includeCovers);\n default:\n throw makeUnexpectedMajorVersionError(majorVer);\n }\n }\n /**\n * Create a combined tag key, of tag & description\n * @param tag e.g.: COM\n * @param description e.g. iTunPGAP\n * @returns string e.g. COM:iTunPGAP\n */\n static makeDescriptionTagName(tag, description) {\n return tag + (description ? `:${description}` : '');\n }\n async parse(metadata, tokenizer, options) {\n this.tokenizer = tokenizer;\n this.metadata = metadata;\n this.options = options;\n const id3Header = await this.tokenizer.readToken(_ID3v2Token_js__WEBPACK_IMPORTED_MODULE_3__.ID3v2Header);\n if (id3Header.fileIdentifier !== 'ID3') {\n throw new _FrameParser_js__WEBPACK_IMPORTED_MODULE_2__.Id3v2ContentError('expected ID3-header file-identifier \\'ID3\\' was not found');\n }\n this.id3Header = id3Header;\n this.headerType = (`ID3v2.${id3Header.version.major}`);\n return id3Header.flags.isExtendedHeader ? this.parseExtendedHeader() : this.parseId3Data(id3Header.size);\n }\n async parseExtendedHeader() {\n const extendedHeader = await this.tokenizer.readToken(_ID3v2Token_js__WEBPACK_IMPORTED_MODULE_3__.ExtendedHeader);\n const dataRemaining = extendedHeader.size - _ID3v2Token_js__WEBPACK_IMPORTED_MODULE_3__.ExtendedHeader.len;\n return dataRemaining > 0 ? this.parseExtendedHeaderData(dataRemaining, extendedHeader.size) : this.parseId3Data(this.id3Header.size - extendedHeader.size);\n }\n async parseExtendedHeaderData(dataRemaining, extendedHeaderSize) {\n await this.tokenizer.ignore(dataRemaining);\n return this.parseId3Data(this.id3Header.size - extendedHeaderSize);\n }\n async parseId3Data(dataLen) {\n const uint8Array = await this.tokenizer.readToken(new token_types__WEBPACK_IMPORTED_MODULE_0__.Uint8ArrayType(dataLen));\n for (const tag of this.parseMetadata(uint8Array)) {\n switch (tag.id) {\n case 'TXXX':\n if (tag.value) {\n await this.handleTag(tag, tag.value.text, () => tag.value.description);\n }\n break;\n default:\n await (Array.isArray(tag.value) ? Promise.all(tag.value.map(value => this.addTag(tag.id, value))) : this.addTag(tag.id, tag.value));\n }\n }\n }\n async handleTag(tag, values, descriptor, resolveValue = value => value) {\n await Promise.all(values.map(value => this.addTag(ID3v2Parser.makeDescriptionTagName(tag.id, descriptor(value)), resolveValue(value))));\n }\n async addTag(id, value) {\n await this.metadata.addTag(this.headerType, id, value);\n }\n parseMetadata(data) {\n let offset = 0;\n const tags = [];\n while (true) {\n if (offset === data.length)\n break;\n const frameHeaderLength = ID3v2Parser.getFrameHeaderLength(this.id3Header.version.major);\n if (offset + frameHeaderLength > data.length) {\n this.metadata.addWarning('Illegal ID3v2 tag length');\n break;\n }\n const frameHeaderBytes = data.slice(offset, offset + frameHeaderLength);\n offset += frameHeaderLength;\n const frameHeader = this.readFrameHeader(frameHeaderBytes, this.id3Header.version.major);\n const frameDataBytes = data.slice(offset, offset + frameHeader.length);\n offset += frameHeader.length;\n const values = ID3v2Parser.readFrameData(frameDataBytes, frameHeader, this.id3Header.version.major, !this.options.skipCovers, this.metadata);\n if (values) {\n tags.push({ id: frameHeader.id, value: values });\n }\n }\n return tags;\n }\n readFrameHeader(uint8Array, majorVer) {\n let header;\n switch (majorVer) {\n case 2:\n header = {\n id: asciiDecoder.decode(uint8Array.slice(0, 3)),\n length: token_types__WEBPACK_IMPORTED_MODULE_0__.UINT24_BE.get(uint8Array, 3)\n };\n if (!header.id.match(/[A-Z0-9]{3}/g)) {\n this.metadata.addWarning(`Invalid ID3v2.${this.id3Header.version.major} frame-header-ID: ${header.id}`);\n }\n break;\n case 3:\n case 4:\n header = {\n id: asciiDecoder.decode(uint8Array.slice(0, 4)),\n length: (majorVer === 4 ? _ID3v2Token_js__WEBPACK_IMPORTED_MODULE_3__.UINT32SYNCSAFE : token_types__WEBPACK_IMPORTED_MODULE_0__.UINT32_BE).get(uint8Array, 4),\n flags: ID3v2Parser.readFrameFlags(uint8Array.slice(8, 10))\n };\n if (!header.id.match(/[A-Z0-9]{4}/g)) {\n this.metadata.addWarning(`Invalid ID3v2.${this.id3Header.version.major} frame-header-ID: ${header.id}`);\n }\n break;\n default:\n throw makeUnexpectedMajorVersionError(majorVer);\n }\n return header;\n }\n}\nfunction makeUnexpectedMajorVersionError(majorVer) {\n throw new _FrameParser_js__WEBPACK_IMPORTED_MODULE_2__.Id3v2ContentError(`Unexpected majorVer: ${majorVer}`);\n}\n//# sourceMappingURL=ID3v2Parser.js.map\n\n//# sourceURL=webpack://ExamBundle/../../node_modules/music-metadata/lib/id3v2/ID3v2Parser.js?");
23
+
24
+ /***/ })
25
+
26
+ }]);