PluginProbe
Squeeze – Image Optimization & Compression, WEBP Conversion / 1.7.8
Squeeze – Image Optimization & Compression, WEBP Conversion v1.7.8
1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 trunk 1.0 1.1 1.2 1.3 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5 1.5.1 1.5.2 1.6 All 42 releases
squeeze / assets / js / script.bundle.js

script.bundle.js in Squeeze – Image Optimization & Compression, WEBP Conversion 1.7.8, at assets/js/script.bundle.js

358 lines 171.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /*
2 * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
3 * This devtool is neither made for production nor for readable output files.
4 * It uses "eval()" calls to create a separate source file in the browser devtools.
5 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
6 * or disable the default devtool with "devtool: false".
7 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
8 */
9 /******/ (() => { // webpackBootstrap
10 /******/ "use strict";
11 /******/ var __webpack_modules__ = ({
12
13 /***/ "./assets/js/handlers.js":
14 /*!*******************************!*\
15 !*** ./assets/js/handlers.js ***!
16 \*******************************/
17 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
18
19 eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"handleBulkButtonClick\": () => (/* binding */ handleBulkButtonClick),\n/* harmony export */ \"handleBulkFromPage\": () => (/* binding */ handleBulkFromPage),\n/* harmony export */ \"handleBulkToggle\": () => (/* binding */ handleBulkToggle),\n/* harmony export */ \"handleButtonsClick\": () => (/* binding */ handleButtonsClick),\n/* harmony export */ \"handleClosePathDialog\": () => (/* binding */ handleClosePathDialog),\n/* harmony export */ \"handleCompressAfterUpload\": () => (/* binding */ handleCompressAfterUpload),\n/* harmony export */ \"handleCompressBeforeUpload\": () => (/* binding */ handleCompressBeforeUpload),\n/* harmony export */ \"handleDirectoryCheck\": () => (/* binding */ handleDirectoryCheck),\n/* harmony export */ \"handleDirectoryClick\": () => (/* binding */ handleDirectoryClick),\n/* harmony export */ \"handleFetchImagesFromPage\": () => (/* binding */ handleFetchImagesFromPage),\n/* harmony export */ \"handleMultiFileFormUpload\": () => (/* binding */ handleMultiFileFormUpload),\n/* harmony export */ \"handleOnLeave\": () => (/* binding */ handleOnLeave),\n/* harmony export */ \"handleRecursiveUpload\": () => (/* binding */ handleRecursiveUpload),\n/* harmony export */ \"handleRestoreBtnClick\": () => (/* binding */ handleRestoreBtnClick),\n/* harmony export */ \"handleSingleBtnClick\": () => (/* binding */ handleSingleBtnClick)\n/* harmony export */ });\n/* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers.js */ \"./assets/js/helpers.js\");\n\r\n\r\n\r\n\r\n\r\nconst { __ } = wp.i18n; // Import __() from wp.i18n\r\n\r\nconst updateUI = (initId, response) => {\r\n const statusEl = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.elements.postsFilterForm?.querySelector(`#post-${initId} .column-squeeze .squeeze_status`);\r\n if (statusEl) statusEl.innerHTML = response?.data?.message ?? response?.data ?? response;\r\n\r\n const gridItem = document.querySelector(`.media-frame.mode-grid .attachment[data-id=\"${initId}\"]`);\r\n if (gridItem) {\r\n const centered = gridItem.querySelector('.centered');\r\n const progress = gridItem.querySelector('.media-progress-bar');\r\n if (centered) centered.style.display = 'block';\r\n if (progress) progress.remove();\r\n gridItem.classList.remove('uploading');\r\n }\r\n};\r\n\r\nconst getTotalPages = (path) => {\r\n const selectors = {\r\n uncompressed: \"input[name='squeeze_bulk_uncompressed_pages']\",\r\n all: \"input[name='squeeze_bulk_total_pages']\"\r\n };\r\n const sel = selectors[path];\r\n const val = sel && document.querySelector(sel)?.value;\r\n return Number(val) || 1;\r\n};\r\n\r\nconst checkPaused = (data, page) => {\r\n if (!_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.isPaused) return false;\r\n handleBulkPause(data, page);\r\n return true;\r\n};\r\n\r\nconst logAndThumbnail = async (filename, response, wrapper) => {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.logMessage(response?.data?.message ?? response?.data, {\r\n mediaLogWrapper: wrapper,\r\n iconId: response.success ? 'check-mark-circle-icon' : 'ban-sign-icon',\r\n isSuccess: response.success\r\n });\r\n\r\n const titleEl = wrapper?.querySelector('h3');\r\n if (titleEl && response?.data?.filename) {\r\n titleEl.textContent = `${__('Media', 'squeeze')} ${filename} (${response.data.filename}):`;\r\n }\r\n\r\n const thumbUrl = response?.data?.sizes?.thumbnail?.url || response?.data?.url || response?.url;\r\n if (thumbUrl) {\r\n const thumb = document.createElement('div');\r\n thumb.classList.add('media-log-thumbnail');\r\n thumb.innerHTML = `<img src=\"${thumbUrl}\" alt=\"${filename}\"/>`;\r\n wrapper?.appendChild(thumb);\r\n }\r\n};\r\n\r\nconst handleDirectoryCheck = (event) => {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.elements.savePathBtn.disabled = !_helpers_js__WEBPACK_IMPORTED_MODULE_0__.elements.dirContainer.querySelector(\"input[type='checkbox']:checked\");\r\n};\r\n\r\nconst handleClosePathDialog = (event) => {\r\n if (!event.target.contains(_helpers_js__WEBPACK_IMPORTED_MODULE_0__.elements.pathDialog)) return;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.elements.pathDialog.close();\r\n};\r\n\r\nconst handleBulkToggle = (event, process, mediaIDs, page = 1) => {\r\n const isPaused = event.target.dataset.running === 'true';\r\n\r\n event.target.dataset.running = isPaused ? 'false' : 'true';\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.updateButtonText(event.target, isPaused ? __('Resume bulk squeezing', 'squeeze') : __('Pause bulk squeezing', 'squeeze'), isPaused ? '#play-button-round-icon' : '#pause-button-icon');\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.isPaused = isPaused;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.process = process;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.mediaIDs = mediaIDs;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.page = page;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.target = event.target;\r\n\r\n //console.log('handleBulkToggle', cachedMediaData);\r\n\r\n return isPaused;\r\n};\r\n\r\n// Handle single compress button click\r\nconst handleSingleBtnClick = async (event, timeoutId) => {\r\n const attachmentID = event.target.dataset.attachment;\r\n const squeezeStatus = event.target.closest(\"td\").querySelector(\".squeeze_status\");\r\n\r\n try {\r\n wp.media.attachment(attachmentID).fetch().then(async (data) => {\r\n const attachment = { attributes: data };\r\n\r\n try {\r\n const compressData = await Squeeze.handleCompress(attachment);\r\n const response = await Squeeze.handleUpload({ attachment, base64: compressData });\r\n\r\n squeezeStatus.innerHTML = response?.data?.message ?? response?.data ?? response;\r\n\r\n if (event.target.closest(\"td.field\")) {\r\n const table = event.target.closest(\"td\")?.querySelector(\".squeeze_status .squeeze-comparison-table\");\r\n if (table) {\r\n const td = document.createElement(\"td\");\r\n td.classList.add(\"field\");\r\n td.style.width = \"100%\";\r\n td.appendChild(table);\r\n event.target.closest(\"tr\").appendChild(td);\r\n }\r\n }\r\n // TBD: add file size label to the attachment info\r\n /*\r\n if (event.target.closest('.attachment-info')) {\r\n const fileSizeLabel = event.target.closest('.attachment-info').querySelector('.file-size');\r\n if (fileSizeLabel) {\r\n const fileSize = response?.data?.sizes?.scaled?.compressed_size ?? response?.data?.sizes?.original?.compressed_size ?? null;\r\n if (fileSize) {\r\n const humanFileSize = SqueezeHelpers.humanFileSize(fileSize, true);\r\n fileSizeLabel.innerHTML = fileSizeLabel.innerHTML.replace(/(<\\/strong>\\s*)(.*)/, `$1${humanFileSize}`);\r\n }\r\n }\r\n }\r\n */\r\n } catch (error) {\r\n console.error(error);\r\n squeezeStatus.innerHTML = error?.message ?? error;\r\n } finally {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.removeAllButtons(event.target.closest(\"td\")?.querySelectorAll(`button`));\r\n window.onbeforeunload = null;\r\n if (timeoutId) clearTimeout(timeoutId);\r\n }\r\n });\r\n } catch (error) {\r\n console.error(error);\r\n squeezeStatus.innerHTML = error?.message ?? error;\r\n event.target.remove();\r\n window.onbeforeunload = null;\r\n if (timeoutId) clearTimeout(timeoutId);\r\n }\r\n};\r\n\r\nconst handleRestoreBtnClick = async (event) => {\r\n const attachmentID = event.target.dataset.attachment;\r\n const statusEl = event.target.closest(\"td\").querySelector(\".squeeze_status\");\r\n\r\n event.target.disabled = true;\r\n statusEl.innerHTML = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.squeezeLoadingAnimationHTML + __('Restoring the original image...', 'squeeze');\r\n\r\n // if still squeezing after 3 seconds, update the status message\r\n const timeoutId = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.waitMessage(_helpers_js__WEBPACK_IMPORTED_MODULE_0__.squeezeLoadingAnimationHTML + __('Still restoring... Just need to regenerate thumbnails, please wait a moment.', 'squeeze'), statusEl);\r\n\r\n try {\r\n const response = await Squeeze.handleRestore(attachmentID);\r\n statusEl.innerHTML = response?.data ?? response;\r\n } catch (error) {\r\n console.error(error);\r\n statusEl.innerHTML = error?.message ?? JSON.stringify(error, null, 2);\r\n } finally {\r\n event.target.closest('td').querySelector(`[name='squeeze_compress_again']`).disabled = false;\r\n event.target.remove();\r\n window.onbeforeunload = null;\r\n if (timeoutId) clearTimeout(timeoutId);\r\n }\r\n};\r\n\r\nconst handleBulkButtonClick = async (event, process, mediaIDs, currentPage) => {\r\n if (mediaIDs.length === 0) return;\r\n\r\n const totalPages = getTotalPages(process);\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.disableBulkButtons();\r\n window.onbeforeunload = handleOnLeave;\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.process === process) {\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.mediaIDs/*.length > 0*/) {\r\n mediaIDs = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.mediaIDs;\r\n }\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.page) {\r\n currentPage = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.page;\r\n }\r\n }\r\n\r\n const isPaused = handleBulkToggle(event, process, mediaIDs, currentPage);\r\n if (isPaused) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.updateButtonText(event.target, __('Pausing...', 'squeeze'), '#pause-button-icon');\r\n return;\r\n } else {\r\n event.target.disabled = false;\r\n }\r\n\r\n try {\r\n const finalResponse = await handleRecursiveUpload(process, mediaIDs, currentPage, true);\r\n\r\n if (finalResponse?.mediaIDs) {\r\n if (finalResponse.mediaIDs.length === 0 && finalResponse.page >= totalPages) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.logMessage(__('All images have been processed!', 'squeeze'), { isEnd: true });\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.showPopupMessage( {\r\n title: __('Squeezing complete', 'squeeze'),\r\n message: __('All images have been processed!', 'squeeze'),\r\n type: 'success'\r\n });\r\n window.onbeforeunload = null;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.restoreBulkButtons();\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.restoreBulkButtons();\r\n window.onbeforeunload = null;\r\n alert(__('An error has occured. Check the console for details.', 'squeeze'));\r\n }\r\n};\r\n\r\nconst handleButtonsClick = async (event) => {\r\n const singleBtnName = 'squeeze_compress_single';\r\n const compressAgainBtnName = 'squeeze_compress_again';\r\n const restoreBtnName = 'squeeze_restore';\r\n //console.log(Squeeze?.options?.webp_quality)\r\n\r\n if (event.target.getAttribute(\"name\") === singleBtnName || event.target.getAttribute(\"name\") === compressAgainBtnName) {\r\n //console.log('Clicked compress button, WebP quality:', Squeeze?.options?.webp_quality);\r\n \r\n const statusEl = event.target.closest(\"td\").querySelector(\".squeeze_status\");\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.disableAllButtons(event.target.closest(\"td\").querySelectorAll(`button`));\r\n statusEl.innerHTML = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.squeezeLoadingAnimationHTML + __('Squeezing...', 'squeeze');\r\n\r\n // if still squeezing after 5 seconds, update the status message\r\n const timeoutId = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.waitMessage(\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.squeezeLoadingAnimationHTML + \r\n __('Still squeezing... This may take a while depending on the image size.', 'squeeze'), \r\n statusEl\r\n );\r\n\r\n window.onbeforeunload = handleOnLeave;\r\n handleSingleBtnClick(event, timeoutId);\r\n }\r\n\r\n if (event.target.getAttribute(\"name\") === restoreBtnName) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.disableAllButtons(event.target.closest(\"td\").querySelectorAll(`button`));\r\n window.onbeforeunload = handleOnLeave;\r\n handleRestoreBtnClick(event);\r\n }\r\n}\r\n\r\nconst handleDirectoryClick = async (event) => {\r\n if (event.target !== event.currentTarget) return;\r\n\r\n const currentDir = event.target.closest(\".directory-item\");\r\n const currentPath = currentDir.dataset.path;\r\n const parentPath = currentDir.dataset.parent;\r\n\r\n if (parentPath === '/' || currentDir.classList.contains(\"loading\")) return;\r\n\r\n if (currentDir.classList.contains(\"loaded\")) {\r\n currentDir.classList.toggle(\"opened\");\r\n return;\r\n }\r\n\r\n currentDir.classList.add(\"loading\");\r\n\r\n const subDirs = await Squeeze.getDirectories(currentPath);\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.renderDirectories(subDirs, currentDir, {\r\n handleDirectoryClick,\r\n handleDirectoryCheck\r\n });\r\n\r\n currentDir.classList.remove(\"loading\");\r\n currentDir.classList.add(\"loaded\", \"opened\");\r\n}\r\n\r\n/**\r\n * Hadnle warning on page leave\r\n*/\r\nconst handleOnLeave = () => {\r\n const urlParams = new URLSearchParams(window.location.search);\r\n const page = urlParams.get('page');\r\n const isUploadPage = window.location.href.includes('upload.php');\r\n const isMediaNewPage = window.location.href.includes('media-new.php');\r\n const isAttachmentPage = window.location.href.includes('post.php') && urlParams.get('action') === 'edit';\r\n\r\n if (page === 'squeeze-bulk' || isMediaNewPage || isAttachmentPage) {\r\n return __('Are you sure you want to leave this page? The squeezing process will be terminated!', 'squeeze');\r\n }\r\n if (isUploadPage) {\r\n return __('Are you sure you want to leave this page? The settings will not be saved!', 'squeeze');\r\n }\r\n};\r\n\r\nconst handleBulkPause = (data, currentPage) => {\r\n window.onbeforeunload = null;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.logMessage(__('Bulk squeezing has been paused!', 'squeeze'), { isPause: true });\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.mediaIDs = data;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.page = currentPage;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.target.disabled = false;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.updateButtonText(_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.target, __('Resume bulk squeezing', 'squeeze'), '#play-button-round-icon');\r\n};\r\n\r\nconst handleUpdateChart = (uncompressedImagesCount) => {\r\n const chartValue = document.querySelector(\".squeeze-bulk-media-stats-chart-value > text\");\r\n const chartBar = document.querySelector(\".squeeze-bulk-media-stats-chart\");\r\n const squeezedImages = document.querySelector(\".squeeze-bulk-media-stats-item-value\");\r\n\r\n if (!chartValue || !chartBar) return;\r\n\r\n const imagesLeft = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.totalImages - uncompressedImagesCount;\r\n const percentage = parseFloat((imagesLeft / _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.totalImages) * 100).toFixed(2);\r\n const dasharray = percentage * 560 / 100;\r\n chartValue.textContent = `${percentage}%`;\r\n chartBar.style.setProperty('--squeeze-dasharray', dasharray);\r\n\r\n if (squeezedImages) {\r\n squeezedImages.textContent = `${imagesLeft} / ${_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.totalImages}`;\r\n }\r\n};\r\n\r\nconst handleRecursiveUpload = async (path, data, currentPage, isUpdateChart = false) => {\r\n\r\n if (!Array.isArray(data)) return { success: false, data: 'No data provided!', mediaIDs: [] }; // when bulk directory path has no images\r\n\r\n const totalPages = getTotalPages(path);\r\n\r\n const noMoreImages = (page, message = __('No more images found!', 'squeeze')) => ({\r\n success: true,\r\n data: message,\r\n mediaIDs: [],\r\n page,\r\n });\r\n\r\n if (data.length === 0) {\r\n currentPage += 1;\r\n if (currentPage > totalPages || !_helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.lastId) return noMoreImages(currentPage);\r\n\r\n const maybeGetNextMediaIDs = await Squeeze.getNextAttachments(currentPage, path, _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.lastId);\r\n if (maybeGetNextMediaIDs.success && maybeGetNextMediaIDs.data.length > 0) {\r\n const nextMediaIDs = maybeGetNextMediaIDs.data;\r\n return handleRecursiveUpload(path, nextMediaIDs, currentPage, isUpdateChart);\r\n } else {\r\n return noMoreImages(currentPage);\r\n }\r\n }\r\n\r\n const initData = [...data]; // initial data\r\n\r\n const filename = data[0]?.filename ? data[0].filename : `ID #${data[0]}`;\r\n const mediaLogWrapper = await _helpers_js__WEBPACK_IMPORTED_MODULE_0__.logMessage(\r\n `${__('Start squeezing...', 'squeeze')}`, \r\n { title: filename, isStart: true, iconId: 'lemon-dot-icon' }\r\n );\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.lastId = data[0] || 0; // update lastId to the last processed ID\r\n\r\n try {\r\n const response = await Squeeze.handleBulkUpload(path, data);\r\n\r\n //console.log('handleRecursiveUpload response', response);\r\n\r\n await logAndThumbnail(filename, response, mediaLogWrapper);\r\n\r\n if (isUpdateChart && path !== 'all') {\r\n let uncompressedImagesCount = 0;\r\n if (path === 'uncompressed') {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.uncompressedImages = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.uncompressedImages - 1 || 0;\r\n uncompressedImagesCount = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.cachedMediaData.uncompressedImages;\r\n } else if (path === 'path') {\r\n uncompressedImagesCount = response.mediaIDs.length;\r\n }\r\n handleUpdateChart(uncompressedImagesCount);\r\n }\r\n\r\n if (checkPaused(data, currentPage)) {\r\n return { success: false, data: 'Process has been paused!', mediaIDs: data, page: currentPage };\r\n }\r\n\r\n updateUI(initData[0], response);\r\n\r\n if (response.mediaIDs.length > 0) {\r\n return handleRecursiveUpload(path, response.mediaIDs, currentPage, isUpdateChart);\r\n } else {\r\n currentPage += 1;\r\n if (currentPage > totalPages) return { ...response, page: currentPage };\r\n\r\n const lastId = initData[initData.length - 1];\r\n const maybeGetNextMediaIDs = await Squeeze.getNextAttachments(currentPage, path, lastId);\r\n if (maybeGetNextMediaIDs.success && maybeGetNextMediaIDs.data.length > 0) {\r\n const nextMediaIDs = maybeGetNextMediaIDs.data;\r\n return handleRecursiveUpload(path, nextMediaIDs, currentPage, isUpdateChart);\r\n }\r\n }\r\n\r\n return response;\r\n\r\n } catch (error) {\r\n console.error(error);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.logMessage(`${error}`, { mediaLogWrapper, iconId: 'ban-sign-icon' });\r\n\r\n if (data.length > 0) {\r\n return handleRecursiveUpload(path, data, currentPage, isUpdateChart);\r\n } else {\r\n currentPage += 1;\r\n if (currentPage > totalPages) return { success: false, data: error, mediaIDs: [], page: currentPage };\r\n\r\n const lastId = initData[initData.length - 1];\r\n const maybeGetNextMediaIDs = await Squeeze.getNextAttachments(currentPage, path, lastId);\r\n if (maybeGetNextMediaIDs.success && maybeGetNextMediaIDs.data.length > 0) {\r\n const nextMediaIDs = maybeGetNextMediaIDs.data;\r\n return handleRecursiveUpload(path, nextMediaIDs, currentPage, isUpdateChart);\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n/**\r\n * Handles the compression of image before upload using Squeeze.\r\n * It compresses only the original image, not the thumbnails.\r\n * \r\n * @param {object} up - The plupload instance\r\n * @param {object} pluploadFile - The file to be compressed\r\n * @param {object} compressOptions - The compression options object\r\n * @returns {boolean} - Returns false to prevent further processing of the file\r\n */\r\nconst handleCompressBeforeUpload = async (up, pluploadFile, compressOptions) => {\r\n //*\r\n if (!_helpers_js__WEBPACK_IMPORTED_MODULE_0__.isSqueezeAvailable()) return;\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_0__.isFileAlreadyProcessed(pluploadFile)) return;\r\n if (!_helpers_js__WEBPACK_IMPORTED_MODULE_0__.isImageFile(pluploadFile)) return;\r\n\r\n const file = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.getNativeFile(pluploadFile);\r\n const { type, subtype } = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.parseMimeType(file);\r\n\r\n if (!_helpers_js__WEBPACK_IMPORTED_MODULE_0__.maybeCompressAttachment(type, subtype, compressOptions)) return;\r\n\r\n up?.stop();\r\n window.onbeforeunload = handleOnLeave;\r\n\r\n if (await _helpers_js__WEBPACK_IMPORTED_MODULE_0__.isExcludedFile(pluploadFile, up)) return;\r\n //*/\r\n\r\n try {\r\n return await processCompression(up, pluploadFile, file, compressOptions);\r\n } catch (error) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.handleCompressionError(error, up, pluploadFile);\r\n return false;\r\n }\r\n}\r\n\r\nasync function processCompression(up, pluploadFile, file, compressOptions) {\r\n\r\n //*\r\n let originalFile = file;\r\n\r\n const base64Obj = await Squeeze.compressBeforeUpload(file);\r\n if (!base64Obj?.base64) {\r\n console.warn('Compression skipped or failed for:', file.name);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.markFileFailed(pluploadFile);\r\n if (up) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.restartUploader(up);\r\n }\r\n return;\r\n }\r\n\r\n if (compressOptions?.backup_original) {\r\n originalFile = await _helpers_js__WEBPACK_IMPORTED_MODULE_0__.maybeBackupOriginal(file, compressOptions);\r\n pluploadFile.originalFile = originalFile;\r\n }\r\n\r\n const compressedFile = _helpers_js__WEBPACK_IMPORTED_MODULE_0__.base64ToFile(base64Obj.base64, file.name, file.type);\r\n const newSource = new mOxie.File(null, compressedFile);\r\n if (!newSource) {\r\n console.error('Failed to create new mOxie.File from base64 data');\r\n return;\r\n }\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.markFileCompressed(pluploadFile, newSource, base64Obj);\r\n if (up) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.restartUploader(up);\r\n }\r\n\r\n //console.timeEnd('Compressing image:', pluploadFile.name);\r\n\r\n return true;\r\n //*/\r\n}\r\n\r\nconst handleMultiFileFormUpload = (compressOptions) => {\r\n if (typeof wpUploaderInit === 'undefined' || typeof plupload === 'undefined' || typeof uploader === 'undefined') return;\r\n\r\n const SqueezeUploader = uploader;\r\n\r\n SqueezeUploader.bind('BeforeUpload', async function (up, pluploadFile) {\r\n //console.log('BeforeUpload', up, pluploadFile.name, pluploadFile);\r\n handleCompressBeforeUpload(up, pluploadFile, compressOptions)\r\n });\r\n\r\n SqueezeUploader.bind('FileUploaded', function (up, file, response) {\r\n //console.log('FileUploaded', file, response);\r\n handleCompressAfterUpload(file, compressOptions, response);\r\n });\r\n}\r\n\r\nconst handleCompressAfterUpload = async (file, compressOptions, response = null) => {\r\n const fileID = file?.id;\r\n const attachmentID = response?.response;\r\n const mediaItem = document.getElementById(`media-item-${fileID}`);\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_0__.isFileFailedAfterCompression(file)) {\r\n window.onbeforeunload = null;\r\n if (mediaItem) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.waitForItemLoad(mediaItem, false).then(() => {\r\n mediaItem.innerHTML += `<div class=\"squeeze_status\">\r\n ${file?._isExcluded ? __('File is excluded from compression:', 'squeeze') : __('File compression failed:', 'squeeze')}\r\n ${file.name}\r\n </div>`;\r\n });\r\n }\r\n return;\r\n }\r\n\r\n let attachment = file?.attachment;\r\n const type = attachment?.attributes?.type ?? file?.type?.split('/')[0];\r\n const subtype = attachment?.attributes?.subtype ?? file?.type?.split('/')[1];\r\n\r\n if (!_helpers_js__WEBPACK_IMPORTED_MODULE_0__.maybeCompressAttachment(type, subtype, compressOptions)) {\r\n //console.warn('Skipping compression for:', type, subtype);\r\n return; // Skip compression for this attachment\r\n }\r\n\r\n window.onbeforeunload = handleOnLeave;\r\n \r\n // set 'uploading' param to true, to pause the uploading process\r\n attachment?.set('uploading', true);\r\n attachment?.set('percent', 50);\r\n attachment?.set('status', 'Squeezing'); // Set status to 'Squeezing' to indicate compression is in progress\r\n\r\n if (mediaItem) {\r\n try {\r\n await _helpers_js__WEBPACK_IMPORTED_MODULE_0__.waitForItemLoad(mediaItem);\r\n const data = await wp.media.attachment(attachmentID).fetch();\r\n //console.log('Fetched attachment data:', data);\r\n attachment = { attributes: data };\r\n } catch (error) {\r\n console.error(error);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.updateAttachmentUIFailed(mediaItem, error);\r\n window.onbeforeunload = null;\r\n }\r\n }\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.extendAttachment(attachment, file);\r\n\r\n try {\r\n const compressData = await Squeeze.handleCompress(attachment);\r\n if (attachment && typeof attachment.set === 'function') {\r\n attachment.set('percent', 75); // Set percent to 75% to indicate compression is done\r\n }\r\n const uploadData = await Squeeze.handleUpload({ attachment, base64: compressData });\r\n\r\n if (uploadData.success) {\r\n if (mediaItem) {\r\n mediaItem.innerHTML += `<div class=\"squeeze_status\">${uploadData?.data?.message}</div>`;\r\n mediaItem.querySelector('.progress')?.remove();\r\n } else {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.updateAttachmentUI(attachment, uploadData);\r\n }\r\n \r\n } else {\r\n console.warn(uploadData.data);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.updateAttachmentUIFailed(mediaItem, uploadData?.data?.message ?? uploadData?.data ?? uploadData)\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_0__.updateAttachmentUIFailed(mediaItem, error);\r\n } finally {\r\n if (attachment && typeof attachment.set === 'function') {\r\n attachment.set('uploading', false);\r\n }\r\n window.onbeforeunload = null;\r\n }\r\n}\r\n\n\n//# sourceURL=webpack:///./assets/js/handlers.js?");
20
21 /***/ }),
22
23 /***/ "./assets/js/helpers.js":
24 /*!******************************!*\
25 !*** ./assets/js/helpers.js ***!
26 \******************************/
27 /***/ ((__unused_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 */ \"base64SizeInBytes\": () => (/* binding */ base64SizeInBytes),\n/* harmony export */ \"base64ToBlob\": () => (/* binding */ base64ToBlob),\n/* harmony export */ \"base64ToFile\": () => (/* binding */ base64ToFile),\n/* harmony export */ \"cachedMediaData\": () => (/* binding */ cachedMediaData),\n/* harmony export */ \"disableAllButtons\": () => (/* binding */ disableAllButtons),\n/* harmony export */ \"disableBulkButtons\": () => (/* binding */ disableBulkButtons),\n/* harmony export */ \"elements\": () => (/* binding */ elements),\n/* harmony export */ \"extendAttachment\": () => (/* binding */ extendAttachment),\n/* harmony export */ \"fileToBase64\": () => (/* binding */ fileToBase64),\n/* harmony export */ \"getFileFromUrl\": () => (/* binding */ getFileFromUrl),\n/* harmony export */ \"getNativeFile\": () => (/* binding */ getNativeFile),\n/* harmony export */ \"handleCompressionError\": () => (/* binding */ handleCompressionError),\n/* harmony export */ \"handleRemovePathButton\": () => (/* binding */ handleRemovePathButton),\n/* harmony export */ \"humanFileSize\": () => (/* binding */ humanFileSize),\n/* harmony export */ \"isDocHidden\": () => (/* binding */ isDocHidden),\n/* harmony export */ \"isExcludedFile\": () => (/* binding */ isExcludedFile),\n/* harmony export */ \"isFileAlreadyProcessed\": () => (/* binding */ isFileAlreadyProcessed),\n/* harmony export */ \"isFileFailedAfterCompression\": () => (/* binding */ isFileFailedAfterCompression),\n/* harmony export */ \"isImageFile\": () => (/* binding */ isImageFile),\n/* harmony export */ \"isSqueezeAvailable\": () => (/* binding */ isSqueezeAvailable),\n/* harmony export */ \"logMessage\": () => (/* binding */ logMessage),\n/* harmony export */ \"markFileCompressed\": () => (/* binding */ markFileCompressed),\n/* harmony export */ \"markFileExcluded\": () => (/* binding */ markFileExcluded),\n/* harmony export */ \"markFileFailed\": () => (/* binding */ markFileFailed),\n/* harmony export */ \"maybeBackupOriginal\": () => (/* binding */ maybeBackupOriginal),\n/* harmony export */ \"maybeCompressAttachment\": () => (/* binding */ maybeCompressAttachment),\n/* harmony export */ \"objectToFormData\": () => (/* binding */ objectToFormData),\n/* harmony export */ \"parseMimeType\": () => (/* binding */ parseMimeType),\n/* harmony export */ \"populatePathInput\": () => (/* binding */ populatePathInput),\n/* harmony export */ \"removeAllButtons\": () => (/* binding */ removeAllButtons),\n/* harmony export */ \"renderDirectories\": () => (/* binding */ renderDirectories),\n/* harmony export */ \"renderTemplate\": () => (/* binding */ renderTemplate),\n/* harmony export */ \"restartUploader\": () => (/* binding */ restartUploader),\n/* harmony export */ \"restoreBulkButtons\": () => (/* binding */ restoreBulkButtons),\n/* harmony export */ \"showPopupMessage\": () => (/* binding */ showPopupMessage),\n/* harmony export */ \"squeezeLoadingAnimationHTML\": () => (/* binding */ squeezeLoadingAnimationHTML),\n/* harmony export */ \"updateAttachmentUI\": () => (/* binding */ updateAttachmentUI),\n/* harmony export */ \"updateAttachmentUIFailed\": () => (/* binding */ updateAttachmentUIFailed),\n/* harmony export */ \"updateButtonText\": () => (/* binding */ updateButtonText),\n/* harmony export */ \"waitForItemLoad\": () => (/* binding */ waitForItemLoad),\n/* harmony export */ \"waitMessage\": () => (/* binding */ waitMessage)\n/* harmony export */ });\n\r\n\r\nconst { __ } = wp.i18n; // Import __() from wp.i18n\r\n\r\n// move static helper functions here\r\nconst elements = {\r\n bulkBtn: document.querySelector(\"[name='squeeze_bulk']\"),\r\n bulkAgainBtn: document.querySelector(\"[name='squeeze_bulk_again']\"),\r\n bulkPathBtn: document.querySelector(\"[name='squeeze_bulk_path_button']\"),\r\n bulkPathRemoveBtns: document.querySelectorAll(\".squeeze-path-list__remove\"),\r\n selectPathBtn: document.querySelector(\"[name='squeeze_select_path_button']\"),\r\n savePathBtn: document.querySelector(\"[name='squeeze_save_path_button']\"),\r\n pathDialog: document.getElementById(\"squeeze-path-dialog\"),\r\n closePathDialogBtn: document.querySelector(\"[name='squeeze_close_path_dialog_button']\"),\r\n pathInput: document.querySelector(\"[name='squeeze_bulk_path']\"),\r\n pathList: document.querySelector(\".squeeze-path-list\"),\r\n postsFilterForm: document.querySelector(\"#posts-filter\"),\r\n dirContainer: document.getElementById(\"squeeze-bulk-directory-list\"),\r\n bulkLogInput: document.querySelector(\"#squeeze-log-data\"),\r\n pauseBulkBtn: document.querySelector(\"[name='squeeze_pause_page_bulk']\")\r\n}\r\n\r\nconst cachedMediaData = {\r\n isPaused: false,\r\n page: 1,\r\n process: '',\r\n mediaIDs: [],\r\n lastId: 0,\r\n totalImages: document.querySelector(\"[name='squeeze_bulk_total_images']\")?.value || 0,\r\n uncompressedImages: document.querySelector(\"[name='squeeze_bulk_uncompressed_images']\")?.value || 0,\r\n target: null\r\n}\r\n\r\nconst loadTemplate = async (templatePath, data) => {\r\n const response = await fetch(templatePath);\r\n let template = await response.text();\r\n\r\n // Process sub-templates\r\n const subTemplateRegex = /\\{\\{\\>\\s*(.*?)\\s*\\}\\}/g;\r\n let match;\r\n while ((match = subTemplateRegex.exec(template)) !== null) {\r\n const subTemplatePath = `${squeezeOptions.templateBase}/${match[1].trim()}.html`;\r\n const subTemplate = await loadTemplate(subTemplatePath, data);\r\n template = template.replace(match[0], subTemplate);\r\n }\r\n\r\n // Function to safely evaluate conditions (supports boolean variables, expressions, AND/OR)\r\n const evaluateCondition = (condition, data) => {\r\n try {\r\n // Convert standalone boolean variables (e.g., webp_lossless) to data['webp_lossless']\r\n condition = condition.replace(/\\b([a-zA-Z_][a-zA-Z0-9_]*)\\b/g, (match) =>\r\n match in data ? `data['${match}']` : match\r\n );\r\n\r\n return new Function(\"data\", `with(data) { return ${condition}; }`)(data);\r\n } catch (e) {\r\n console.error(\"Error evaluating condition:\", condition, e);\r\n return false;\r\n }\r\n };\r\n\r\n // Recursive function to process nested if-else conditions\r\n const processIfStatements = (template) => {\r\n return template.replace(/\\{\\{#if ([\\s\\S]*?)\\}\\}([\\s\\S]*?)\\{\\{\\/if\\}\\}/g, (match, condition, content) => {\r\n condition = condition.trim();\r\n const conditionResult = evaluateCondition(condition, data);\r\n\r\n // Extract and split the if-else blocks\r\n const elseMatch = content.match(/\\{\\{#else\\}\\}([\\s\\S]*)/);\r\n const trueBlock = elseMatch ? content.replace(/\\{\\{#else\\}\\}([\\s\\S]*)/, \"\") : content;\r\n const falseBlock = elseMatch ? elseMatch[1] : \"\";\r\n\r\n // Process nested if statements recursively\r\n return processIfStatements(conditionResult ? trueBlock : falseBlock);\r\n });\r\n };\r\n\r\n // Apply recursive processing of if conditions\r\n template = processIfStatements(template);\r\n\r\n // Replace variables\r\n return template.replace(/\\{\\{(.*?)\\}\\}/g, (match, key) => data[key.trim()] || '');\r\n}\r\n\r\nconst renderTemplate = async (templatePath, data, target = null) => {\r\n const renderedHTML = await loadTemplate(templatePath, data);\r\n\r\n // Create a temporary container to parse HTML\r\n const tempContainer = document.createElement(\"template\");\r\n tempContainer.innerHTML = renderedHTML.trim();\r\n\r\n if (!target) {\r\n return tempContainer.content.firstChild;\r\n }\r\n\r\n target.appendChild(tempContainer.content.firstChild);\r\n\r\n // Return the last element of the rendered template\r\n return target.lastElementChild;\r\n}\r\n\r\nconst logMessage = async (msg, options = {}) => {\r\n const { mediaLogWrapper = null, isStart = false, isPause = false, isEnd = false, isSuccess = false } = options;\r\n let { title = '', iconId = 'check-mark-circle-icon' } = options;\r\n\r\n if (!elements.bulkLogInput) return;\r\n\r\n if (isStart || isPause || isEnd) {\r\n iconId = isPause ? 'pause-button-icon' : ( isEnd ? 'check-mark-circle-icon' : 'image-file-icon' );\r\n title = isPause ? __('Bulk squeezing has been paused!', 'squeeze') : ( isEnd ? __('Bulk squeezing has been completed!', 'squeeze') : `${__('Media', 'squeeze')} ${title}:` );\r\n return await renderTemplate(squeezeOptions.templates.logWrapper, { title: title, msg: msg, iconId: iconId, isStart: isStart, isPause: isPause, isEnd: isEnd }, elements.bulkLogInput);\r\n } else {\r\n if (mediaLogWrapper) {\r\n const process = mediaLogWrapper.querySelector(\".media-log-process\");\r\n const step = await renderTemplate(squeezeOptions.templates.logStep, { msg: msg, iconId: iconId }, process);\r\n\r\n if (msg && msg.includes('squeeze-comparison-table')) {\r\n const comparisonTable = step.querySelector('.squeeze-comparison-table');\r\n const toggleBtn = await renderTemplate(squeezeOptions.templates.logDetailsButton, { buttonText: __('Show details', 'squeeze') }, mediaLogWrapper);\r\n\r\n toggleBtn.addEventListener(\"click\", () => {\r\n comparisonTable.classList.toggle(\"show\");\r\n toggleBtn.textContent = comparisonTable.classList.contains(\"show\") ? __('Hide details', 'squeeze') : __('Show details', 'squeeze');\r\n });\r\n step.closest(\".media-log-wrapper\").appendChild(comparisonTable);\r\n step.closest(\".media-log-wrapper\").appendChild(toggleBtn);\r\n }\r\n\r\n mediaLogWrapper.classList.add('media-log-wrapper--done');\r\n \r\n if (isSuccess) {\r\n mediaLogWrapper.classList.add('media-log-wrapper--success');\r\n }\r\n } else {\r\n elements.bulkLogInput.innerHTML += msg + `<br>`;\r\n }\r\n }\r\n}\r\n\r\nconst showPopupMessage = (args) => {\r\n const { title = '', message, type = 'info', onClose = null } = args;\r\n const popup = document.createElement('dialog');\r\n const popupCloseBtn = document.createElement('button');\r\n const popupCloseIcon = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n const popupIcon = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n const popupText = document.createElement('p');\r\n const popupTitle = document.createElement('h3');\r\n\r\n popupIcon.setAttributeNS(null, 'viewBox', '0 0 32 32');\r\n popupIcon.classList.add('squeeze-icon');\r\n switch (type) {\r\n case 'success':\r\n popupIcon.innerHTML = `<use xlink:href=\"#check-mark-circle-icon\"></use>`;\r\n break;\r\n case 'error':\r\n popupIcon.innerHTML = `<use xlink:href=\"#ban-sign-icon\"></use>`;\r\n break;\r\n case 'info':\r\n popupIcon.innerHTML = `<use xlink:href=\"#info-icon\"></use>`;\r\n break;\r\n }\r\n\r\n popup.appendChild(popupIcon);\r\n\r\n if (title) {\r\n popupTitle.innerText = title;\r\n popup.appendChild(popupTitle);\r\n }\r\n\r\n const closePopup = () => {\r\n popup.close();\r\n popup.remove();\r\n }\r\n popup.addEventListener('click', (event) => {\r\n const rect = popup.getBoundingClientRect();\r\n const isInDialog = (rect.top <= event.clientY && event.clientY <= rect.top + rect.height &&\r\n rect.left <= event.clientX && event.clientX <= rect.left + rect.width);\r\n \r\n if (!isInDialog) {\r\n popup.close();\r\n }\r\n })\r\n popupCloseBtn.addEventListener('click', closePopup);\r\n if (onClose) {\r\n popup.addEventListener('close', onClose);\r\n }\r\n popupCloseBtn.className = 'squeeze-popup-close-btn';\r\n popup.className = `squeeze-popup-message squeeze-popup-${type} squeeze-box`;\r\n popupText.innerHTML = message;\r\n popupCloseIcon.setAttributeNS(null, 'viewBox', '0 0 24 24');\r\n popupCloseIcon.classList.add('squeeze-icon');\r\n popupCloseIcon.innerHTML = `<use xlink:href=\"#close-round-icon\"></use>`;\r\n\r\n popupCloseBtn.appendChild(popupCloseIcon);\r\n popup.appendChild(popupText);\r\n popup.appendChild(popupCloseBtn);\r\n document.body.appendChild(popup);\r\n popup.showModal();\r\n}\r\n\r\nconst restoreBulkButtons = () => {\r\n elements.bulkBtn.disabled = false;\r\n elements.bulkAgainBtn.disabled = false;\r\n elements.bulkPathBtn.disabled = false;\r\n elements.selectPathBtn.disabled = false;\r\n updateButtonText(elements.bulkBtn, __('Run Bulk Squeeze', 'squeeze'), '#play-button-round-icon');\r\n updateButtonText(elements.bulkAgainBtn, __('Repeat Bulk Squeeze', 'squeeze'), '#combine-left-right-outline-icon');\r\n updateButtonText(elements.bulkPathBtn, __('Run Directory Squeeze', 'squeeze'), '#play-button-round-icon');\r\n elements.bulkBtn.dataset.running = 'false';\r\n elements.bulkAgainBtn.dataset.running = 'false';\r\n elements.bulkPathBtn.dataset.running = 'false';\r\n elements.bulkPathRemoveBtns?.forEach((btn) => {\r\n btn.disabled = false;\r\n });\r\n\r\n cachedMediaData.process = '';\r\n cachedMediaData.mediaIDs = [];\r\n cachedMediaData.page = 1;\r\n}\r\n\r\nconst disableBulkButtons = () => {\r\n elements.bulkBtn.disabled = true;\r\n elements.bulkAgainBtn.disabled = true;\r\n elements.bulkPathBtn.disabled = true;\r\n elements.selectPathBtn.disabled = true;\r\n elements.bulkPathRemoveBtns?.forEach((btn) => btn.disabled = true);\r\n}\r\n\r\nconst disableAllButtons = (buttons) => {\r\n if (!buttons) return;\r\n buttons.forEach((btn) => btn.disabled = true);\r\n}\r\n\r\nconst removeAllButtons = (buttons) => {\r\n if (!buttons) return;\r\n buttons.forEach((btn) => btn.remove());\r\n}\r\n\r\nconst updateButtonText = (button, text, svgAnchor = false) => {\r\n button.childNodes.forEach((node) => {\r\n if (node.nodeName === '#text' && node.textContent.trim() !== '') {\r\n node.textContent = text;\r\n }\r\n if (svgAnchor && node.nodeName === 'svg') {\r\n node.querySelector('use').setAttribute('xlink:href', svgAnchor);\r\n }\r\n });\r\n}\r\n\r\n// Function to render directories in the dialog\r\nconst renderDirectories = async (dirs, parentDir = null, listeners = {}) => {\r\n if (!dirs) return;\r\n if (typeof dirs === 'object') dirs = Object.values(dirs);\r\n if (!elements.dirContainer.classList.contains(\"loaded\")) elements.dirContainer.innerHTML = \"\";\r\n\r\n if (dirs.length === 0 && !parentDir) {\r\n const listItem = await renderTemplate(squeezeOptions.templates.directoryItemEmpty, { emptyText: __('No directories found!', 'squeeze') }, elements.dirContainer);\r\n return;\r\n }\r\n\r\n const selectedFolders = JSON.parse(elements.pathInput.value);\r\n let target;\r\n\r\n for (const dir of dirs) {\r\n const listItemClasses = [];\r\n\r\n if (dir.parent === '/') {\r\n listItemClasses.push(\"loaded\", \"opened\");\r\n }\r\n\r\n if (parentDir) {\r\n target = parentDir;\r\n } else if (dir.parent) {\r\n const parentElement = elements.dirContainer.querySelector(`[data-path=\"${dir.parent}\"]`);\r\n if (parentElement) {\r\n target = parentElement;\r\n } else {\r\n target = elements.dirContainer;\r\n }\r\n } else {\r\n target = elements.dirContainer;\r\n }\r\n\r\n const listItem = await renderTemplate(\r\n squeezeOptions.templates.directoryItem,\r\n {\r\n parent: dir.parent,\r\n path: dir.path,\r\n label: dir.name,\r\n classes: listItemClasses.join(\" \"),\r\n isWritable: dir.is_writeable && !(Array.isArray(selectedFolders) && selectedFolders.includes(dir.path)),\r\n isChecked: dir.is_writeable && Array.isArray(selectedFolders) && selectedFolders.includes(dir.path),\r\n },\r\n target\r\n )\r\n\r\n listItem.querySelector(\"label\").addEventListener(\"click\", listeners.handleDirectoryClick);\r\n listItem.querySelector(\"input[type='checkbox']\")?.addEventListener(\"change\", listeners.handleDirectoryCheck);\r\n }\r\n\r\n elements.dirContainer.classList.add(\"loaded\");\r\n}\r\n\r\nconst handleRemovePathButton = (e) => {\r\n e.preventDefault();\r\n const item = e.target.closest(\".squeeze-path-list__item\");\r\n if (item) {\r\n item.remove();\r\n const currentPaths = Array.from(elements.pathList.querySelectorAll(\".squeeze-path-list__input\"))\r\n .map(input => input.value.trim())\r\n .filter(value => value !== '');\r\n elements.pathInput.value = JSON.stringify(currentPaths);\r\n }\r\n}\r\n\r\nconst populatePathInput = async () => {\r\n const path = elements.pathInput.value;\r\n if (!path) return;\r\n\r\n try {\r\n const selectedFolders = JSON.parse(path);\r\n const items = elements.pathList.querySelectorAll(\".squeeze-path-list__item\");\r\n\r\n items.forEach(item => item.remove());\r\n\r\n for (const folder of selectedFolders) {\r\n const item = await renderTemplate(squeezeOptions.templates.pathListItem, { folder: folder }, elements.pathList);\r\n const removeButton = item.querySelector(\".squeeze-path-list__remove\");\r\n removeButton.addEventListener(\"click\", handleRemovePathButton);\r\n\r\n }\r\n } catch (error) {\r\n alert(__('Error parsing path input!', 'squeeze'));\r\n console.error('Error parsing path input:', error);\r\n }\r\n}\r\n\r\nconst getHiddenProp = () => {\r\n var prefixes = ['webkit', 'moz', 'ms', 'o'];\r\n\r\n // if 'hidden' is natively supported just return it\r\n if ('hidden' in document) return 'hidden';\r\n\r\n // otherwise loop over all the known prefixes until we find one\r\n for (let i = 0; i < prefixes.length; i++) {\r\n if ((prefixes[i] + 'Hidden') in document)\r\n return prefixes[i] + 'Hidden';\r\n }\r\n\r\n // otherwise it's not supported\r\n return null;\r\n}\r\n\r\nconst isDocHidden = () => {\r\n const prop = getHiddenProp();\r\n if (!prop) return false;\r\n\r\n return document[prop];\r\n}\r\n\r\n/**\r\n * @see https://stackoverflow.com/a/20732091\r\n */\r\nconst humanFileSize = (size) => {\r\n let i = size == 0 ? 0 : Math.floor(Math.log(size) / Math.log(1024));\r\n return +((size / Math.pow(1024, i)).toFixed(2)) * 1 + ' ' + ['B', 'KB', 'MB', 'GB', 'TB'][i];\r\n}\r\n\r\nconst base64SizeInBytes = (base64) => {\r\n // Remove data URL prefix if present\r\n const base64String = base64.split(',')[1] || base64; \r\n\r\n // Calculate padding characters ('=' at the end of Base64)\r\n const padding = (base64String.match(/=+$/) || [\"\"])[0].length;\r\n\r\n // Compute byte size\r\n return (base64String.length * 3) / 4 - padding;\r\n}\r\n\r\nconst maybeCompressAttachment = (attachmentType, attachmentSubType, compressOptions = null) => {\r\n const isAutoCompress = compressOptions?.auto_compress ?? true;\r\n const allowedMimeTypes = ['jpeg', 'png', 'webp', 'avif'];\r\n const isImage = attachmentType === 'image' && allowedMimeTypes.includes(attachmentSubType);\r\n\r\n return isImage && isAutoCompress;\r\n};\r\n\r\nconst base64ToBlob = (base64, type = 'image/jpeg') => {\r\n // Remove data URL prefix if present\r\n const base64String = base64.split(',')[1] || base64;\r\n\r\n // Decode Base64 string\r\n const byteCharacters = atob(base64String);\r\n const byteNumbers = new Array(byteCharacters.length);\r\n \r\n for (let i = 0; i < byteCharacters.length; i++) {\r\n byteNumbers[i] = byteCharacters.charCodeAt(i);\r\n }\r\n\r\n const byteArray = new Uint8Array(byteNumbers);\r\n return new Blob([byteArray], { type: type });\r\n}\r\n\r\nconst base64ToFile = (base64, fileName = 'image.jpg', type = 'image/jpeg') => {\r\n const blob = base64ToBlob(base64, type);\r\n return new File([blob], fileName, { type: type });\r\n}\r\n\r\nconst fileToBase64 = (file) => {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = () => resolve(reader.result);\r\n reader.onerror = (error) => reject(error);\r\n reader.readAsDataURL(file);\r\n });\r\n}\r\n\r\nfunction objectToFormData(obj, fd = null, parentKey = null) {\r\n const formData = fd || new FormData();\r\n\r\n for (const key in obj) {\r\n if (!obj.hasOwnProperty(key)) continue;\r\n const value = obj[key];\r\n\r\n // build the form key: either \"foo\", \"parent[foo]\" or \"parent[]\" for arrays\r\n const formKey = parentKey\r\n ? Array.isArray(obj)\r\n ? `${parentKey}[]`\r\n : `${parentKey}[${key}]`\r\n : key;\r\n\r\n // Files or Blobs go straight in\r\n if (value instanceof File || value instanceof Blob) {\r\n formData.append(formKey, value, value.name);\r\n }\r\n // Arrays: recurse so they become key[]=val0, key[]=val1…\r\n else if (Array.isArray(value)) {\r\n objectToFormData(value, formData, formKey);\r\n }\r\n // Plain objects: recurse so they become key[subkey]=subval\r\n else if (\r\n value !== null &&\r\n typeof value === 'object' &&\r\n !(value instanceof Date)\r\n ) {\r\n objectToFormData(value, formData, formKey);\r\n }\r\n // Dates: convert to ISO string (or format as you like)\r\n else if (value instanceof Date) {\r\n formData.append(formKey, value.toISOString());\r\n }\r\n // Everything else (number, string, boolean, null, undefined)\r\n else {\r\n // Explicitly convert undefined to empty string so PHP sees it\r\n const stringVal =\r\n value === undefined || value === null ? '' : String(value);\r\n formData.append(formKey, stringVal);\r\n }\r\n }\r\n\r\n return formData;\r\n}\r\n\r\n/**\r\n * Extend the attachment object with additional data from the file.\r\n * @param {object} attachment \r\n * @param {object} file \r\n * @returns {object} — the extended attachment object.\r\n */\r\nconst extendAttachment = async (attachment, file) => {\r\n if (typeof attachment !== 'object' || !attachment.attributes) {\r\n console.warn('Invalid attachment object:', attachment);\r\n return;\r\n }\r\n\r\n const attributes = attachment.attributes;\r\n\r\n if (file?.base64) {\r\n attributes.base64Compressed = file.base64; // Use the base64 data from the attachment\r\n }\r\n\r\n if (file?.base64Webp) {\r\n attributes.base64WebpCompressed = file.base64Webp; // Use the WebP base64 data from the attachment\r\n }\r\n\r\n if (file?.originalFile) {\r\n attributes.originalFile = file.originalFile; // Use the original file from the attachment to be able to create a backup\r\n }\r\n\r\n return attachment;\r\n}\r\n\r\nconst getFileFromUrl = async (url, filename, format) => {\r\n const response = await fetch(url);\r\n const blob = await response.blob();\r\n const mimeType = format ? `image/${format}` : blob.type;\r\n return new File([blob], filename, { type: mimeType });\r\n}\r\n\r\nfunction isSqueezeAvailable() {\r\n if (typeof Squeeze === 'undefined') return false;\r\n if (typeof Squeeze.compressBeforeUpload !== 'function') {\r\n console.warn('Squeeze.compressBeforeUpload is not a function');\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\nfunction isFileAlreadyProcessed(file) {\r\n return file?._isSqueezed || file?._isExcluded || file?._isFailed;\r\n}\r\n\r\nfunction isFileFailedAfterCompression(file) {\r\n if (file?._isExcluded || file?._isFailed) {\r\n console.warn(`File is ${file?._isExcluded ? 'excluded' : 'failed'} from compression:`, file.name);\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\nfunction isImageFile(file) {\r\n return file.type?.startsWith('image/');\r\n}\r\n\r\nfunction getNativeFile(pluploadFile) {\r\n return pluploadFile.getNative() || pluploadFile.getSource();\r\n}\r\n\r\nfunction parseMimeType(file) {\r\n const [type = '', subtype = ''] = file?.type?.split('/') ?? [];\r\n return { type, subtype };\r\n}\r\n\r\nasync function isExcludedFile(pluploadFile, up) {\r\n \r\n}\r\n\r\nfunction markFileExcluded(pluploadFile) {\r\n pluploadFile.status = plupload.QUEUED;\r\n pluploadFile.loaded = 0;\r\n pluploadFile._isExcluded = true;\r\n}\r\n\r\nfunction markFileFailed(pluploadFile) {\r\n pluploadFile.status = plupload.QUEUED;\r\n pluploadFile.loaded = 0;\r\n pluploadFile._isFailed = true;\r\n}\r\n\r\nfunction markFileCompressed(pluploadFile, newSource, base64Obj) {\r\n pluploadFile.getSource = () => newSource;\r\n pluploadFile.status = plupload.QUEUED;\r\n pluploadFile.loaded = 0;\r\n pluploadFile._isSqueezed = true;\r\n pluploadFile.base64 = base64Obj.base64;\r\n pluploadFile.base64Webp = base64Obj?.base64Webp;\r\n}\r\n\r\nfunction restartUploader(up) {\r\n if (!up) return;\r\n setTimeout(() => up.start(), 0);\r\n}\r\n\r\nasync function maybeBackupOriginal(file, compressOptions) {\r\n const isDirectWebp = compressOptions?.direct_webp && file.type !== 'image/webp';\r\n if (isDirectWebp) {\r\n return await Squeeze.convertFileToWebp(file);\r\n }\r\n return file;\r\n}\r\n\r\nfunction handleCompressionError(error, up, pluploadFile) {\r\n console.error('Error during compression before upload:', error);\r\n markFileFailed(pluploadFile);\r\n if (up) {\r\n restartUploader(up);\r\n }\r\n}\r\n\r\nfunction updateAttachmentUI(attachment, uploadData) {\r\n if (!attachment || !uploadData) return;\r\n if (uploadData.success === false) return;\r\n\r\n const compat = attachment.get('compat');\r\n const tempDiv = document.createElement('div');\r\n let compatItem = compat.item;\r\n\r\n tempDiv.innerHTML = compatItem;\r\n if (tempDiv.querySelector('.compat-field-squeeze_is_compressed .field')) {\r\n tempDiv.querySelector('.compat-field-squeeze_is_compressed .field').innerHTML = uploadData?.data?.message;\r\n }\r\n compat.item = tempDiv.innerHTML;\r\n\r\n attachment.set('compat', compat);\r\n}\r\n\r\nfunction updateAttachmentUIFailed(mediaItem, message) {\r\n if (!mediaItem) return;\r\n\r\n mediaItem.innerHTML += message;\r\n mediaItem.querySelector('.progress')?.remove();\r\n}\r\n\r\n/**\r\n * Wait for media item to load( 'async-upload.php' )\r\n * Ping every 1 second until the media item is loaded\r\n * @returns Promise\r\n*/\r\nconst waitForItemLoad = (mediaItem, addProgressBar = true) => {\r\n return new Promise((resolve) => {\r\n let interval = setInterval(() => {\r\n if (mediaItem.querySelector('.media-item-wrapper')) {\r\n if (addProgressBar) {\r\n mediaItem.querySelector('.media-item-wrapper').innerHTML += `\r\n <div class=\"progress\">\r\n <div class=\"percent\">${__('Squeezing...', 'squeeze')}</div>\r\n <div class=\"bar\" style=\"width: 200px;\"></div>\r\n </div>\r\n `;\r\n }\r\n clearInterval(interval);\r\n resolve();\r\n }\r\n }, 1000);\r\n });\r\n}\r\n\r\n/**\r\n * Show a message in the status element after a delay\r\n * Useful for long-running operations\r\n * @param {string} message \r\n * @param {HTMLElement} statusEl \r\n * @param {integer} delay - delay in milliseconds (default: 5000)\r\n * @returns {integer} - timeout ID\r\n */\r\nconst waitMessage = (message, statusEl, delay = 5000) => {\r\n const timeoutId = setTimeout(() => {\r\n statusEl.innerHTML = message;\r\n }, delay);\r\n\r\n return timeoutId;\r\n}\r\n\r\nconst squeezeLoadingAnimationHTML = `\r\n <div class=\"squeeze-loading-wrap\" aria-live=\"polite\" aria-label=\"Loading\">\r\n <span class=\"squeeze-loading-icon\">⌛</span>\r\n </div>\r\n`;\n\n//# sourceURL=webpack:///./assets/js/helpers.js?");
30
31 /***/ }),
32
33 /***/ "./assets/js/script.js":
34 /*!*****************************!*\
35 !*** ./assets/js/script.js ***!
36 \*****************************/
37 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
38
39 eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _squeeze_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./squeeze.js */ \"./assets/js/squeeze.js\");\n/* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./helpers.js */ \"./assets/js/helpers.js\");\n/* harmony import */ var _handlers_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./handlers.js */ \"./assets/js/handlers.js\");\n\r\n\r\n\r\n\r\n\r\n\"use strict\";\r\n\r\nconst { sprintf, __ } = wp.i18n; // Import __() from wp.i18n\r\n\r\n//const Squeeze = new SQUEEZE(squeezeOptions);\r\nconst compressOptions = JSON.parse(squeezeOptions.options);\r\nwindow.Squeeze = window.Squeeze || new _squeeze_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"](squeezeOptions); // make it globally accessible for other scripts\r\n\r\ndocument.addEventListener(\"click\", (event) => {\r\n _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleButtonsClick(event);\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.bulkBtn?.addEventListener(\"click\", async (event) => {\r\n let uncompressedIDs = squeezeBulk.unCompressedImages ? squeezeBulk.unCompressedImages.split(\",\") : [];\r\n let currentPage = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.page ?? 1;\r\n\r\n _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleBulkButtonClick(event, 'uncompressed', uncompressedIDs, currentPage);\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.bulkAgainBtn?.addEventListener(\"click\", async (event) => {\r\n let allIDs = squeezeBulk.allImages ? squeezeBulk.allImages.split(\",\") : [];\r\n let currentPage = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.page ?? 1;\r\n\r\n _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleBulkButtonClick(event, 'all', allIDs, currentPage);\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.bulkPathBtn?.addEventListener(\"click\", async (event) => {\r\n const path = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathInput?.value ?? '';\r\n let bulkPathData;\r\n\r\n if (path.replace(/\\[\\]/g, '').split(',').length === 0 || !path.replace(/\\[\\]/g, '').split(',')[0] || !path) {\r\n alert(__('Please enter a valid path!', 'squeeze'));\r\n return;\r\n }\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.disableBulkButtons();\r\n window.onbeforeunload = _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleOnLeave;\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.process === 'path' && _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs.length > 0) {\r\n bulkPathData = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.cachedMediaData.mediaIDs;\r\n } else {\r\n const pathData = await Squeeze.getAttachmentsByPath(path);\r\n\r\n if (pathData.success) {\r\n bulkPathData = pathData.data;\r\n } else {\r\n console.error(pathData.data);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.restoreBulkButtons();\r\n window.onbeforeunload = null;\r\n }\r\n }\r\n\r\n const isPaused = _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleBulkToggle(event, 'path', bulkPathData);\r\n\r\n if (isPaused) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.updateButtonText(event.target, __('Pausing...', 'squeeze'), '#pause-button-icon');\r\n return;\r\n } else {\r\n event.target.disabled = false;\r\n }\r\n\r\n try {\r\n const finalResponse = await _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleRecursiveUpload('path', bulkPathData, 1);\r\n\r\n if (finalResponse?.mediaIDs) {\r\n if (finalResponse.mediaIDs.length === 0) {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.logMessage(__('All images have been processed!', 'squeeze'), { isEnd: true });\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.showPopupMessage( {\r\n title: __('Squeezing complete', 'squeeze'),\r\n message: __('All images have been processed!', 'squeeze'),\r\n type: 'success'\r\n });\r\n window.onbeforeunload = null;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.restoreBulkButtons();\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.restoreBulkButtons();\r\n window.onbeforeunload = null;\r\n alert(__('An error has occured. Check the console for details.', 'squeeze'));\r\n }\r\n})\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.bulkPathRemoveBtns?.forEach((btn) => {\r\n btn.addEventListener(\"click\", _helpers_js__WEBPACK_IMPORTED_MODULE_1__.handleRemovePathButton);\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.selectPathBtn?.addEventListener(\"click\", async (event) => {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathDialog.showModal();\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.classList.contains(\"loading\")) return;\r\n\r\n if (_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.classList.contains(\"loaded\")) {\r\n const selectedFolders = JSON.parse(_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathInput.value);\r\n\r\n if (Array.isArray(selectedFolders)) {\r\n selectedFolders.forEach((folder) => {\r\n const checkbox = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.querySelector(`input[value=\"${folder}\"]`);\r\n if (checkbox) {\r\n checkbox.checked = true;\r\n }\r\n });\r\n }\r\n\r\n return;\r\n\r\n } else {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.classList.add(\"loading\");\r\n const folders = await Squeeze.getDirectories();\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.renderDirectories(folders, null, {\r\n handleDirectoryClick: _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleDirectoryClick,\r\n handleDirectoryCheck: _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleDirectoryCheck\r\n });\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.classList.remove(\"loading\");\r\n }\r\n\r\n\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.savePathBtn?.addEventListener(\"click\", () => {\r\n const checkboxes = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.dirContainer.querySelectorAll(\"input[type='checkbox']\");\r\n const selectedFolders = Array.from(checkboxes)\r\n .filter(checkbox => checkbox.checked)\r\n .map(checkbox => checkbox.value);\r\n\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathInput.value = JSON.stringify(selectedFolders);\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.populatePathInput();\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathDialog.close();\r\n});\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.closePathDialogBtn?.addEventListener(\"click\", () => {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.pathDialog.close();\r\n});\r\n\r\ndocument.addEventListener('click', _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleClosePathDialog);\r\n\r\n_helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm?.addEventListener(\"submit\", async (event) => {\r\n const dataAction = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.dataset.action;\r\n const action = event.target.querySelector(\"select[name='action']\").value;\r\n const submitButtons = event.target.querySelectorAll(\"input[name='bulk_action']\");\r\n\r\n if (action === 'squeeze_bulk_compress' && dataAction !== 'squeeze_bulk_compressed') {\r\n event.preventDefault();\r\n const mediaList = document.querySelectorAll(\"input[name='media[]']:checked\");\r\n const uncompressedIDs = Array.from(mediaList).map((el) => el.value);\r\n\r\n if (uncompressedIDs.length === 0) return;\r\n\r\n window.onbeforeunload = _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleOnLeave;\r\n\r\n uncompressedIDs.forEach((id) => {\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.querySelectorAll(`#post-${id} .column-squeeze button`).forEach((btn) => {\r\n btn.disabled = true;\r\n });\r\n const squeezeStatusElement = _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.querySelector(`#post-${id} .column-squeeze .squeeze_status`);\r\n if (squeezeStatusElement) {\r\n squeezeStatusElement.innerText = '⏳ ' + __('Squeezing...', 'squeeze');\r\n }\r\n });\r\n\r\n submitButtons.forEach((btn) => {\r\n btn.disabled = true;\r\n btn.value = __('Squeezing...', 'squeeze');\r\n });\r\n\r\n try {\r\n const finalResponse = await _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleRecursiveUpload('uncompressed', uncompressedIDs, 1);\r\n\r\n if (finalResponse?.mediaIDs) {\r\n if (finalResponse.mediaIDs.length === 0) {\r\n window.onbeforeunload = null;\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.dataset.action = 'squeeze_bulk_compressed';\r\n _helpers_js__WEBPACK_IMPORTED_MODULE_1__.elements.postsFilterForm.submit();\r\n }\r\n }\r\n } catch (error) {\r\n console.error(error);\r\n window.onbeforeunload = null;\r\n alert(__('An error has occured. Check the console for details.', 'squeeze'));\r\n }\r\n }\r\n});\r\n\r\n// https://wordpress.stackexchange.com/a/131295/186146 - override wp.Uploader.prototype.success\r\nwindow.wp.domReady(()=>{\r\n\r\n if (wp?.Uploader?.prototype) {\r\n const prevInit = wp.Uploader.prototype.init;\r\n\r\n wp.Uploader.prototype.init = function (...args) {\r\n // Call Filebird’s (or whoever’s) init first\r\n if (typeof prevInit === 'function') {\r\n prevInit.apply(this, args);\r\n }\r\n \r\n const uploader = this.uploader;\r\n\r\n // Now add *your* logic\r\n if (uploader) {\r\n\r\n uploader.bind('BeforeUpload', async function (up, pluploadFile) {\r\n //console.time('Compressing image:', pluploadFile.name);\r\n _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleCompressBeforeUpload(up, pluploadFile, compressOptions);\r\n });\r\n\r\n uploader.bind('FileUploaded', async function (up, file, response) {\r\n _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleCompressAfterUpload(file, compressOptions);\r\n //console.timeEnd('Compressing image:', file.name)\r\n })\r\n\r\n }\r\n }\r\n }\r\n});\r\n\r\ndocument.onreadystatechange = function () {\r\n if (document.readyState === \"complete\") { // equivalent to jQuery $(document).ready()\r\n _handlers_js__WEBPACK_IMPORTED_MODULE_2__.handleMultiFileFormUpload(compressOptions);\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Create the toggle preview checkbox\r\n * @param {Integer} attachmentId \r\n * @param {Boolean} isPlaceholder\r\n * @returns HTMLElement\r\n */\r\nconst createTogglePreview = (attachmentId, isPlaceholder = false) => {\r\n\r\n // Create the toggle\r\n const toggleWrap = document.createElement('span');\r\n const toggleInput = document.createElement('input');\r\n const toggleLabel = document.createElement('label');\r\n const toggleIcon = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n\r\n toggleInput.type = 'checkbox';\r\n toggleInput.className = 'squeeze-ios8-switch';\r\n toggleInput.id = 'squeeze-ios8-switch-' + attachmentId;\r\n toggleLabel.textContent = __('Compare Squeeze', 'squeeze');\r\n toggleLabel.title = __('Image comparison with Squeeze', 'squeeze');\r\n toggleLabel.htmlFor = toggleInput.id;\r\n toggleWrap.style.marginInlineStart = '1em';\r\n toggleWrap.style.verticalAlign = 'sub';\r\n toggleIcon.style.display = 'inline-block';\r\n toggleIcon.style.verticalAlign = 'middle';\r\n toggleIcon.setAttributeNS(null, 'viewBox', '0 0 122.88 101.61');\r\n toggleIcon.classList.add('squeeze-icon');\r\n toggleIcon.innerHTML = `<g><path d=\"M15.28,46.33h30V4.44c0-2.45,1.99-4.44,4.44-4.44c2.45,0,4.44,1.99,4.44,4.44v92.72c0,2.45-1.99,4.44-4.44,4.44 c-2.45,0-4.44-1.99-4.44-4.44V55.21H15.07l15.15,15.28c1.72,1.73,1.72,4.54-0.02,6.26c-1.73,1.72-4.54,1.72-6.26-0.02L1.29,53.89 l0,0l-0.01-0.01c-0.05-0.05-0.09-0.09-0.13-0.14l-0.01-0.01l-0.06-0.07l-0.02-0.02l-0.05-0.06l-0.02-0.03l-0.02-0.02l-0.05-0.07 l0,0L0.87,53.4l-0.02-0.02l-0.01-0.02l-0.05-0.07l-0.01-0.02l-0.05-0.07l0,0l-0.04-0.07L0.66,53.1l-0.01-0.02l-0.04-0.07 l-0.01-0.02l-0.02-0.03l-0.04-0.06l0,0L0.5,52.82l-0.01-0.02l-0.04-0.08l0,0l-0.04-0.08L0.4,52.62l-0.03-0.06l-0.01-0.03L0.35,52.5 l-0.03-0.08L0.31,52.4l-0.03-0.08L0.27,52.3l-0.03-0.08l0-0.01c-0.02-0.06-0.04-0.13-0.06-0.19l0-0.01l-0.02-0.08l-0.01-0.02 l-0.01-0.02l-0.02-0.08l-0.02-0.1l0-0.01l-0.02-0.1l0-0.01l-0.01-0.07L0.06,51.5l0-0.02l-0.01-0.08l0-0.02l-0.01-0.08l0,0 L0.02,51.2l0-0.01l0-0.02l-0.01-0.08l0-0.01C0.01,51,0,50.93,0,50.87l0-0.01l0-0.09v-0.02l0-0.08l0-0.02l0-0.02l0-0.08l0-0.02 l0.01-0.08l0,0l0.01-0.09l0-0.01c0.01-0.1,0.02-0.21,0.04-0.31l0.02-0.09l0-0.02c0.02-0.1,0.04-0.2,0.07-0.3l0,0l0.02-0.08 l0.01-0.03l0.01-0.02l0.02-0.08l0.01-0.02l0.03-0.08l0.01-0.02l0.03-0.08l0-0.01c0.04-0.1,0.08-0.19,0.12-0.28l0.01-0.01 c0.03-0.06,0.06-0.12,0.09-0.17l0.01-0.02l0.01-0.02l0.04-0.07l0.01-0.02l0.04-0.07c0.03-0.05,0.06-0.11,0.1-0.16l0.02-0.03 l0.01-0.02l0.05-0.07l0-0.01c0.04-0.06,0.08-0.11,0.12-0.16l0.01-0.01L1,47.97v0l0.07-0.08l0.01-0.01l0.04-0.05l0.05-0.05l0,0 l0.06-0.06l0.02-0.02l0.06-0.06l0,0l0.01-0.01L23.97,25.4c1.74-1.71,4.55-1.69,6.26,0.05c1.71,1.74,1.69,4.55-0.05,6.26 L15.28,46.33L15.28,46.33z M67.86,4.44C67.86,1.99,69.85,0,72.3,0c2.45,0,4.44,1.99,4.44,4.44v41.89h30.86L92.7,31.72 c-1.74-1.71-1.77-4.52-0.05-6.26c1.71-1.74,4.52-1.77,6.26-0.05l22.65,22.21l0.01,0.01l0,0l0.06,0.06l0.02,0.02l0.06,0.06l0,0 l0.05,0.05l0.04,0.05l0.01,0.01l0.07,0.08v0l0.07,0.08l0.01,0.01c0.04,0.05,0.08,0.11,0.12,0.16l0,0.01l0.05,0.07l0.01,0.02 l0.02,0.03c0.03,0.05,0.07,0.11,0.1,0.16l0.04,0.07l0.01,0.02l0.04,0.07l0.01,0.02l0.01,0.02c0.03,0.06,0.06,0.12,0.09,0.17 l0.01,0.01c0.04,0.09,0.08,0.19,0.12,0.28l0,0.01l0.03,0.08l0.01,0.02l0.03,0.08l0.01,0.02l0.02,0.08l0.01,0.02l0.01,0.03 l0.02,0.08l0,0c0.03,0.1,0.05,0.2,0.07,0.3l0,0.02l0.02,0.09c0.02,0.1,0.03,0.21,0.04,0.31l0,0.01l0.01,0.09l0,0l0.01,0.08l0,0.02 l0,0.08l0,0.02l0,0.02l0,0.08v0.02l0,0.09l0,0.01c0,0.07,0,0.13-0.01,0.2l0,0.01l-0.01,0.08l0,0.02l0,0.01l-0.01,0.09l0,0 l-0.01,0.08l0,0.02l-0.01,0.08l0,0.02l-0.01,0.03l-0.01,0.07l0,0.01l-0.02,0.1l0,0.01l-0.02,0.1l-0.02,0.08l-0.01,0.02l-0.01,0.02 l-0.02,0.08l0,0.01c-0.02,0.06-0.04,0.13-0.06,0.19l0,0.01l-0.03,0.08l-0.01,0.02l-0.03,0.08l-0.01,0.02l-0.03,0.08l-0.01,0.02 l-0.01,0.03l-0.03,0.06l-0.01,0.02l-0.04,0.08l0,0l-0.04,0.08l-0.01,0.02l-0.04,0.07l0,0l-0.04,0.06l-0.02,0.03l-0.01,0.02 l-0.04,0.07l-0.01,0.02l-0.01,0.02l-0.04,0.07l0,0l-0.05,0.07l-0.01,0.02l-0.05,0.07l-0.01,0.02l-0.02,0.02l-0.05,0.06l0,0 l-0.05,0.07l-0.02,0.02l-0.02,0.03l-0.05,0.06l-0.02,0.02l-0.06,0.07l-0.01,0.01c-0.04,0.05-0.09,0.1-0.13,0.14l-0.01,0.01l0,0 L98.94,76.73c-1.72,1.73-4.53,1.74-6.26,0.02c-1.73-1.72-1.74-4.53-0.02-6.26l15.15-15.28H76.74v41.96c0,2.45-1.99,4.44-4.44,4.44 c-2.45,0-4.44-1.99-4.44-4.44V4.44L67.86,4.44z M122.16,48.35c0.03,0.05,0.07,0.11,0.1,0.16L122.16,48.35L122.16,48.35z\"></path></g>`;\r\n\r\n if (isPlaceholder) {\r\n toggleInput.disabled = true;\r\n toggleLabel.innerHTML += ' ' + sprintf(__('(<a href=\"%s\" target=\"_blank\">premium only</a>)', 'squeeze'), squeezeOptions.upgradeUrl);\r\n }\r\n\r\n toggleWrap.appendChild(toggleIcon);\r\n toggleWrap.appendChild(toggleInput);\r\n toggleWrap.appendChild(toggleLabel);\r\n\r\n return toggleWrap;\r\n}\r\n\r\n\n\n//# sourceURL=webpack:///./assets/js/script.js?");
40
41 /***/ }),
42
43 /***/ "./assets/js/squeeze.js":
44 /*!******************************!*\
45 !*** ./assets/js/squeeze.js ***!
46 \******************************/
47 /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
48
49 eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ SQUEEZE)\n/* harmony export */ });\n/* harmony import */ var _helpers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers.js */ \"./assets/js/helpers.js\");\n/* harmony import */ var browser_image_compression__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! browser-image-compression */ \"./node_modules/browser-image-compression/dist/browser-image-compression.mjs\");\n/* harmony import */ var _jsquash_webp__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @jsquash/webp */ \"./node_modules/@jsquash/webp/encode.js\");\n\r\n\r\n\r\n\r\n\r\n\r\nconst { __, sprintf } = wp.i18n; // Import __() from wp.i18n\r\n\r\nclass SQUEEZE {\r\n\r\n constructor(squeeze) {\r\n this.options = JSON.parse(squeeze.options); // plugin options\r\n this.nonce = squeeze.nonce; // nonce\r\n this.ajaxUrl = squeeze.ajaxUrl; // ajax url\r\n this.timeout = parseInt(this.options.timeout) * 1000; // convert to milliseconds\r\n this.poolSize = navigator.hardwareConcurrency || 1; // number of threads\r\n this.settingsPageUrl = squeeze.settingsPageUrl || ''; // settings page URL\r\n }\r\n\r\n handleCompress = async ( attachment, type = 'uncompressed' ) => {\r\n const attachmentData = attachment.attributes;\r\n const url = attachmentData?.originalImageURL ?? attachmentData.url;\r\n const mime = attachmentData.mime;\r\n const name = attachmentData.name;\r\n const filename = attachmentData?.originalImageName ?? attachmentData.filename;\r\n const attachmentID = attachmentData.id;\r\n const sizes = attachmentData.sizes;\r\n const format = mime.split(\"/\")[1];\r\n const sourceType = format;\r\n const outputType = format;\r\n const skipFull = attachmentData?.skipFull ?? attachmentData.originalImageName === undefined ? true : false;\r\n const timeout = this.timeout;\r\n const isPreview = attachmentData?.isPreview ?? false;\r\n const file = attachmentData?.file ?? null; // the original file, it passed for the newly uploaded attachment to compress it\r\n\r\n // the original compressed image base64, it passed when the attachment was already compressed and we need to compress thumbs only\r\n // we pass it in order to prevent re-compressing the original image when we need to compress thumbs only\r\n const base64Compressed = attachmentData?.base64Compressed ?? null; \r\n const base64WebpCompressed = attachmentData?.base64WebpCompressed ?? null; // the original compressed webp image base64\r\n\r\n const worker = new Worker(new URL(/* worker import */ __webpack_require__.p + __webpack_require__.u(\"assets_js_worker_js\"), __webpack_require__.b), {type: undefined}); // worker url\r\n const channel = new MessageChannel();\r\n worker.postMessage({\r\n action: 'compress',\r\n format,\r\n url,\r\n name,\r\n sourceType,\r\n outputType,\r\n mime,\r\n sizes,\r\n skipFull,\r\n timeout,\r\n isPreview,\r\n file,\r\n base64Compressed,\r\n base64WebpCompressed,\r\n type,\r\n options: this.options,\r\n //urlOriginal: urlOriginal,\r\n }, [channel.port2]);\r\n\r\n // Listen for compression requests from the worker via port1\r\n channel.port1.onmessage = async (ev) => {\r\n //console.log(\"Worker received compression request:\", ev.data);\r\n const { id, action, fileOrArrayBuffer, mime, options } = ev.data;\r\n if (action !== 'imageCompression') return;\r\n\r\n try {\r\n // Accept ArrayBuffer or Blob\r\n const blob = (fileOrArrayBuffer instanceof ArrayBuffer)\r\n ? new Blob([this.toUint8Array(fileOrArrayBuffer)], { type: mime })\r\n : fileOrArrayBuffer;\r\n\r\n const compressedBlob = await (0,browser_image_compression__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(blob, { useWebWorker: true, ...(options || {}) });\r\n\r\n // quick checks\r\n //console.log('compressedBlob.type, size:', compressedBlob.type, compressedBlob.size);\r\n // normalize final binary\r\n const compressedArrayBuffer = await compressedBlob.arrayBuffer();\r\n\r\n // Reply with the compressed ArrayBuffer (transfer to avoid copy)\r\n channel.port1.postMessage({ id, ok: true, arrayBuffer: compressedArrayBuffer }, [compressedArrayBuffer]);\r\n } catch (err) {\r\n channel.port1.postMessage({ id, ok: false, error: err.message || String(err) });\r\n }\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const timeoutId = setTimeout(() => {\r\n worker.terminate();\r\n console.warn('Worker compress terminated', name, sourceType, outputType);\r\n reject(sprintf('😩 ' + __('Request timed out. Try to increase the timeout limit on the Squeeze <a target=\"_blank\" href=\"%s\">settings page</a>.', 'squeeze'), `${this.settingsPageUrl}#:~:text=Squeeze%20timeout`));\r\n }, timeout);\r\n\r\n worker.onmessage = (event) => {\r\n clearTimeout(timeoutId);\r\n if (event.data.error) {\r\n reject(event.data.error);\r\n } else {\r\n resolve(event.data);\r\n }\r\n worker.terminate();\r\n };\r\n\r\n worker.onerror = (error) => {\r\n clearTimeout(timeoutId);\r\n reject(`Worker error: ${error.message}`);\r\n };\r\n });\r\n\r\n }\r\n\r\n handleUpload = async ({ attachment, base64, type = 'uncompressed', mediaIDs = [] }) => {\r\n\r\n const attachmentData = attachment.attributes;\r\n const url = attachmentData?.originalImageURL ?? attachmentData.url;\r\n const mime = attachmentData.mime;\r\n const filename = attachmentData?.originalImageName ?? attachmentData.filename;\r\n const attachmentID = attachmentData.id;\r\n const format = base64?.isDirectWebp && type !== 'path' ? 'webp' : mime.split(\"/\")[1];\r\n const sizes = attachmentData.sizes;\r\n\r\n const isDirectWebp = base64?.isDirectWebp && mime !== 'image/webp';\r\n const isBackupOriginal = this.options?.backup_original ?? false; // check if backup original is enabled\r\n let originalFile = attachmentData?.originalFile ?? null; // the original file, used for creating backup\r\n \r\n // if originalFile is not provided, try to get it from the URL\r\n // used when the attachment needs to be converted to webp from jpg or png\r\n if (!originalFile && type !== 'path' && isBackupOriginal && isDirectWebp) {\r\n const file = await (0,_helpers_js__WEBPACK_IMPORTED_MODULE_0__.getFileFromUrl)(url, filename, mime.split(\"/\")[1])\r\n //console.log('conveting original file to webp', file);\r\n originalFile = await this.convertFileToWebp(file);\r\n }\r\n //console.log('handleUpload attachmentData', attachmentData)\r\n\r\n const data = {\r\n action: 'squeeze_update_attachment',\r\n _ajax_nonce: this.nonce,\r\n filename: filename,\r\n type: 'image',\r\n format: format,\r\n base64: base64.base64,\r\n base64Sizes: base64.base64Sizes,\r\n base64Webp: base64.base64Webp,\r\n base64SizesWebp: base64.base64SizesWebp,\r\n attachmentID: attachmentID,\r\n url: url,\r\n process: type,\r\n originalFile: originalFile,\r\n }\r\n\r\n const formData = (0,_helpers_js__WEBPACK_IMPORTED_MODULE_0__.objectToFormData)(data);\r\n\r\n //console.log('squeeze_update_attachment', JSON.stringify(data, null, 2));\r\n\r\n try {\r\n const uploadResponse = await jQuery.ajax({\r\n url: this.ajaxUrl, // + '111',\r\n type: 'POST',\r\n data: formData,\r\n processData: false, // very important!\r\n contentType: false, // very important!\r\n });\r\n\r\n //if (uploadResponse.success) {\r\n uploadResponse['mediaIDs'] = mediaIDs;\r\n //}\r\n\r\n if (!uploadResponse?.data?.url) {\r\n uploadResponse.url = url; // fallback to original URL if not provided\r\n }\r\n\r\n //console.log('uploadResponse', JSON.stringify(uploadResponse, null, 2));\r\n\r\n return uploadResponse;\r\n \r\n } catch (error) {\r\n return {\r\n 'mediaIDs': mediaIDs,\r\n 'data': error.message,\r\n 'success': false\r\n };\r\n }\r\n\r\n }\r\n\r\n handleBulkUpload = async (type = 'uncompressed', mediaIDs = []) => {\r\n let currentID;\r\n let attachment;\r\n\r\n switch (type) {\r\n case 'all':\r\n case 'uncompressed':\r\n currentID = mediaIDs[0];\r\n break;\r\n case 'path':\r\n currentID = mediaIDs[0]?.filename;\r\n break;\r\n default:\r\n currentID = 0;\r\n break;\r\n }\r\n\r\n if (type === 'path') {\r\n\r\n \r\n\r\n attachment = {\r\n attributes: {\r\n url: mediaIDs[0].url,\r\n mime: mediaIDs[0].mime,\r\n name: mediaIDs[0].name,\r\n filename: mediaIDs[0].filename,\r\n id: mediaIDs[0].id,\r\n sizes: mediaIDs[0]?.sizes,\r\n }\r\n }\r\n\r\n } else {\r\n\r\n const attachmentResponse = await this.getAttachment(currentID); \r\n if (attachmentResponse.success === false) {\r\n if (Array.isArray(mediaIDs)) mediaIDs.shift();\r\n return {\r\n 'mediaIDs': mediaIDs,\r\n 'data': attachmentResponse.data\r\n }\r\n }\r\n const attachmentData = attachmentResponse.data;\r\n attachment = {\r\n attributes: {\r\n url: attachmentData.url,\r\n mime: attachmentData.mime,\r\n name: attachmentData.name,\r\n filename: attachmentData.filename,\r\n id: attachmentData.id,\r\n sizes: attachmentData.sizes,\r\n }\r\n }\r\n\r\n }\r\n\r\n if (Array.isArray(mediaIDs)) mediaIDs.shift();\r\n\r\n const mediaType = attachment.attributes.mime.split(\"/\")[0];\r\n const mediaSubType = attachment.attributes.mime.split(\"/\")[1];\r\n\r\n if (!(0,_helpers_js__WEBPACK_IMPORTED_MODULE_0__.maybeCompressAttachment)(mediaType, mediaSubType)) {\r\n return {\r\n 'mediaIDs': mediaIDs,\r\n 'data': __('Skipped: the image is broken or its format is not supported or excluded from squeezing.', 'squeeze')\r\n }\r\n }\r\n\r\n try {\r\n const compressData = await this.handleCompress( attachment, type );\r\n const uploadData = await this.handleUpload({ attachment: attachment, base64: compressData, type: type, mediaIDs: mediaIDs })\r\n\r\n return uploadData;\r\n\r\n } catch (error) {\r\n return {\r\n 'mediaIDs': mediaIDs,\r\n 'data': error?.message ?? error,\r\n 'success': false\r\n }\r\n }\r\n\r\n }\r\n\r\n \r\n\r\n handleRestore = async (attachmentID) => {\r\n const data = {\r\n action: 'squeeze_restore_attachment',\r\n _ajax_nonce: this.nonce,\r\n attachmentID: attachmentID,\r\n };\r\n\r\n const response = await jQuery.ajax({\r\n url: this.ajaxUrl,\r\n type: 'POST',\r\n data: data,\r\n });\r\n\r\n return response;\r\n };\r\n\r\n // Get list of attachments by path\r\n getAttachmentsByPath = async (path) => {\r\n\r\n const data = {\r\n action: 'squeeze_get_attachment_by_path',\r\n path: path,\r\n _ajax_nonce: this.nonce,\r\n }\r\n\r\n const response = jQuery.ajax({\r\n url: this.ajaxUrl,\r\n type: 'POST',\r\n data: data,\r\n });\r\n\r\n return response;\r\n }\r\n\r\n getAttachment = async (attachmentID) => {\r\n const data = {\r\n action: 'squeeze_get_attachment',\r\n _ajax_nonce: this.nonce,\r\n attachmentID: attachmentID,\r\n }\r\n\r\n const response = jQuery.ajax({\r\n url: this.ajaxUrl,\r\n type: 'POST',\r\n data: data,\r\n });\r\n\r\n return response;\r\n }\r\n\r\n getNextAttachments = async (page = 1, type = 'uncompressed', lastId = 0) => {\r\n const data = {\r\n action: 'squeeze_get_next_attachments',\r\n _ajax_nonce: this.nonce,\r\n page: page,\r\n type: type,\r\n lastId: lastId,\r\n }\r\n\r\n const response = jQuery.ajax({\r\n url: this.ajaxUrl,\r\n type: 'POST',\r\n data: data,\r\n });\r\n\r\n return response;\r\n }\r\n\r\n getDirectories = async (parentDir = false) => {\r\n const data = {\r\n action: 'squeeze_get_directories',\r\n _ajax_nonce: this.nonce,\r\n }\r\n\r\n if (parentDir) {\r\n data['parentDir'] = parentDir;\r\n }\r\n\r\n const response = jQuery.ajax({\r\n url: this.ajaxUrl,\r\n type: 'POST',\r\n data: data,\r\n });\r\n\r\n return response;\r\n }\r\n\r\n \r\n\r\n setOptions = async (options) => {\r\n const data = {\r\n action: 'squeeze_set_options',\r\n _ajax_nonce: this.nonce,\r\n options: options,\r\n }\r\n\r\n const response = jQuery.ajax({\r\n url: this.ajaxUrl,\r\n type: 'POST',\r\n data: data,\r\n });\r\n\r\n return response;\r\n }\r\n\r\n /**\r\n * Compresses an image before upload.\r\n * If the compressSizes parameter is provided, it will compress the sizes specified along with the original image.\r\n * \r\n * @param {File} file - The file to be compressed\r\n * @param {object} compressSizes - Optional sizes for compression\r\n * @returns {Promise<object|boolean>} - Returns a Promise that resolves to the compressed file as a base64 object or false if the file is invalid\r\n */\r\n compressBeforeUpload = async (file, compressSizes = null) => {\r\n if (!(file instanceof Blob) && !(file instanceof File) && (file.constructor.name !== 'File')) {\r\n console.error('Invalid file type:', file);\r\n return false; // Return false if the file is not a Blob or File\r\n }\r\n\r\n const attachment = {\r\n attributes: {\r\n url: null,\r\n mime: file.type,\r\n name: file.name,\r\n filename: file.name,\r\n id: 0,\r\n sizes: compressSizes,\r\n file: file,\r\n skipFull: false,\r\n }\r\n }\r\n\r\n try {\r\n const base64Obj = await this.handleCompress(attachment);\r\n\r\n return base64Obj; // Return the compressed file as base64Obj\r\n } catch (error) {\r\n console.error(error);\r\n return error; // Return the error for further handling\r\n }\r\n }\r\n\r\n isWebpEncodingSupported = async () => {\r\n try {\r\n const canvas = document.createElement('canvas');\r\n if (!canvas.toDataURL) return false;\r\n const data = canvas.toDataURL('image/webp');\r\n // WebP signature starts with \"data:image/webp\"\r\n return data.indexOf('data:image/webp') === 0;\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n handleConvertFileToWebp = async (args) => {\r\n const timeout = this.timeout;\r\n \r\n const { file, sourceType, name } = args;\r\n const fileBuffer = await file.arrayBuffer();\r\n const mime = sourceType === 'png' ? 'image/png' : 'image/jpeg';\r\n const inputBlob = new Blob([fileBuffer], { type: mime });\r\n // compression options you can tune\r\n const imageCompressionOptions = {\r\n useWebWorker: true,\r\n fileType: 'image/webp',\r\n };\r\n\r\n return new Promise(async (resolve, reject) => {\r\n const timeoutId = setTimeout(() => {\r\n console.warn('Worker convertToWebp terminated', name);\r\n reject(new Error(sprintf('😩 ' + __('Request timed out. Try to increase the timeout limit on the Squeeze <a target=\"_blank\" href=\"%s\">settings page</a>.', 'squeeze'), `${this.settingsPageUrl}#:~:text=Squeeze%20timeout`)));\r\n }, timeout);\r\n\r\n try {\r\n\r\n const compressedBlob = await (0,browser_image_compression__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(inputBlob, imageCompressionOptions);\r\n\r\n // quick checks\r\n //console.log('compressedBlob.type, size:', compressedBlob.type, compressedBlob.size);\r\n // normalize final binary\r\n const webpArrayBuffer = await compressedBlob.arrayBuffer();\r\n\r\n const webpName = name.replace(/\\.\\w+$/, '.webp');\r\n const webpFile = new File([webpArrayBuffer], webpName, { type: 'image/webp', lastModified: Date.now() });\r\n\r\n clearTimeout(timeoutId);\r\n resolve({ webpFile }); // must return object with webpFile prop\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n console.error('Error during image processing:', error);\r\n reject(error);\r\n }\r\n });\r\n \r\n }\r\n\r\n // helper: normalize buffer-like inputs to Uint8Array\r\n toUint8Array = (bufferLike) => {\r\n if (bufferLike instanceof Uint8Array) return bufferLike;\r\n if (bufferLike instanceof ArrayBuffer) return new Uint8Array(bufferLike);\r\n if (ArrayBuffer.isView(bufferLike)) return new Uint8Array(bufferLike.buffer, bufferLike.byteOffset, bufferLike.byteLength);\r\n // Node Buffer (in some environments) has .buffer and .byteOffset\r\n if (bufferLike && typeof bufferLike === 'object' && bufferLike.buffer) {\r\n return new Uint8Array(bufferLike.buffer, bufferLike.byteOffset || 0, bufferLike.byteLength || bufferLike.length);\r\n }\r\n throw new Error('Unsupported buffer type: ' + Object.prototype.toString.call(bufferLike));\r\n }\r\n\r\n /**\r\n * Convert an image File to WebP.\r\n *\r\n * @param {File} inputFile — the original image File (e.g. JPEG, PNG).\r\n * @returns {Promise<File>} — a Promise that resolves to a WebP File.\r\n */\r\n convertFileToWebp = async (inputFile) => {\r\n // Ensure it’s an image\r\n if (!inputFile.type.startsWith('image/')) {\r\n throw new Error('Input must be an image File');\r\n }\r\n if (this.isCanvasExtractionBlocked()) {\r\n console.warn('Canvas extraction is blocked');\r\n // Handle the case where canvas extraction is blocked\r\n alert(__('Image conversion blocked by browser privacy setting', 'squeeze'));\r\n throw new Error('Canvas extraction is blocked');\r\n } else {\r\n console.log('Canvas extraction is allowed');\r\n }\r\n const args = {\r\n file: inputFile,\r\n sourceType: inputFile.type.split('/')[1], // e.g. 'jpeg', 'png'\r\n name: inputFile.name,\r\n }\r\n const webpSupported = await this.isWebpEncodingSupported();\r\n try {\r\n // Convert the image to WebP\r\n let webpData;\r\n if (webpSupported) {\r\n //console.log('WebP decoding is supported');\r\n webpData = await this.handleConvertFileToWebp(args);\r\n } else {\r\n console.warn('WebP encoding not supported on this device. Using original format instead.');\r\n const webpName = args.name.replace(/\\.\\w+$/, '.webp');\r\n webpData = await this.convertToWebpWithJsquash(inputFile, webpName);\r\n }\r\n if (!webpData || !webpData.webpFile) {\r\n throw new Error('Failed to convert image to WebP');\r\n }\r\n\r\n return webpData.webpFile; // Return the WebP File\r\n\r\n } catch (error) {\r\n console.error('Error converting image to WebP:', error);\r\n throw error; // Re-throw the error for further handling\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Convert an input (File | Blob | ArrayBuffer | Uint8Array) to a WebP File using @jsquash/webp.\r\n * @param {File|Blob|ArrayBuffer|Uint8Array} input\r\n * @param {string} outputName - desired filename for the .webp output\r\n * @param {{quality?: number, lossless?: boolean, method?: number}} [opts] - encoder options (quality 0-100)\r\n * @returns {Promise<File>} - WebP File\r\n */\r\n convertToWebpWithJsquash = async (input, outputName = 'out.webp', opts = { quality: 100 }) => {\r\n // Normalize input to Blob\r\n let blob;\r\n if (input instanceof Blob) {\r\n blob = input;\r\n } else if (input instanceof ArrayBuffer || ArrayBuffer.isView(input)) {\r\n blob = new Blob([input]);\r\n } else {\r\n throw new Error('Unsupported input type. Provide File, Blob, ArrayBuffer or TypedArray.');\r\n }\r\n\r\n // Load image into <img>\r\n const dataURL = await new Promise((resolve, reject) => {\r\n const fr = new FileReader();\r\n fr.onload = () => resolve(fr.result);\r\n fr.onerror = reject;\r\n fr.readAsDataURL(blob);\r\n });\r\n\r\n const img = await new Promise((resolve, reject) => {\r\n const i = new Image();\r\n i.onload = () => resolve(i);\r\n i.onerror = () => reject(new Error('Failed to load image for conversion'));\r\n i.src = dataURL;\r\n // avoid cross-origin taint if data-url is used\r\n });\r\n\r\n // Draw to canvas and extract ImageData\r\n const canvas = document.createElement('canvas');\r\n canvas.width = img.naturalWidth || img.width;\r\n canvas.height = img.naturalHeight || img.height;\r\n const ctx = canvas.getContext('2d');\r\n ctx.drawImage(img, 0, 0);\r\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\r\n\r\n // encode -> returns ArrayBuffer (WASM libwebp)\r\n // opts example: { quality: 75, lossless: false, method: 4 }\r\n const webpArrayBuffer = await (0,_jsquash_webp__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(imageData, opts);\r\n\r\n // Validate a little (size)\r\n if (!webpArrayBuffer || webpArrayBuffer.byteLength < 20) {\r\n throw new Error('jsquash produced an invalid WebP buffer');\r\n }\r\n\r\n // Wrap into File\r\n const webpFile = new File([webpArrayBuffer], outputName.replace(/\\.\\w+$/, '.webp'), {\r\n type: 'image/webp',\r\n lastModified: Date.now(),\r\n });\r\n\r\n return {webpFile};\r\n }\r\n\r\n isCanvasExtractionBlocked = () => {\r\n try {\r\n const c = document.createElement('canvas');\r\n c.width = 2;\r\n c.height = 2;\r\n const ctx = c.getContext('2d');\r\n if (!ctx) return false; // no ctx => treat as not-blocked here (or handle separately)\r\n\r\n // draw four known opaque pixels (no alpha surprise)\r\n ctx.fillStyle = 'rgb(255,0,0)'; // top-left\r\n ctx.fillRect(0, 0, 1, 1);\r\n\r\n ctx.fillStyle = 'rgb(0,255,0)'; // top-right\r\n ctx.fillRect(1, 0, 1, 1);\r\n\r\n ctx.fillStyle = 'rgb(0,0,255)'; // bottom-left\r\n ctx.fillRect(0, 1, 1, 1);\r\n\r\n ctx.fillStyle = 'rgb(1,2,3)'; // bottom-right (small values detect naive normalization)\r\n ctx.fillRect(1, 1, 1, 1);\r\n\r\n let data;\r\n try {\r\n data = ctx.getImageData(0, 0, 2, 2).data; // Uint8ClampedArray length 16 (4*2*2)\r\n } catch (err) {\r\n // thrown security/blocked error (Firefox/resistFingerprinting sometimes throws)\r\n if (err && (err.name === 'SecurityError' || /blocked/i.test(err.message))) return true;\r\n // other errors: be conservative and return false\r\n return false;\r\n }\r\n\r\n // Expected RGBA order for pixels (top-left, top-right, bottom-left, bottom-right)\r\n const expected = new Uint8ClampedArray([\r\n 255, 0, 0, 255, // top-left\r\n 0, 255, 0, 255, // top-right\r\n 0, 0, 255, 255, // bottom-left\r\n 1, 2, 3, 255 // bottom-right\r\n ]);\r\n\r\n // Compare each channel exactly. If ANY mismatch — canvas data was altered.\r\n for (let i = 0; i < expected.length; i++) {\r\n if (data[i] !== expected[i]) {\r\n // mismatch -> either fingerprint-protection normalized the canvas OR something else tainted it\r\n return true;\r\n }\r\n }\r\n\r\n // No thrown error and pixels match exactly => extraction works\r\n return false;\r\n } catch (e) {\r\n // If something unexpected goes wrong, assume not blocked so caller can handle fallback.\r\n return false;\r\n }\r\n }\r\n\r\n\r\n}\n\n//# sourceURL=webpack:///./assets/js/squeeze.js?");
50
51 /***/ }),
52
53 /***/ "./node_modules/@jsquash/webp/encode.js":
54 /*!**********************************************!*\
55 !*** ./node_modules/@jsquash/webp/encode.js ***!
56 \**********************************************/
57 /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
58
59 eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ encode),\n/* harmony export */ \"init\": () => (/* binding */ init)\n/* harmony export */ });\n/* harmony import */ var _meta_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./meta.js */ \"./node_modules/@jsquash/webp/meta.js\");\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils.js */ \"./node_modules/@jsquash/webp/utils.js\");\n/* harmony import */ var wasm_feature_detect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! wasm-feature-detect */ \"./node_modules/wasm-feature-detect/dist/esm/index.js\");\n/**\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n\nlet emscriptenModule;\nasync function init(module, moduleOptionOverrides) {\n if (await (0,wasm_feature_detect__WEBPACK_IMPORTED_MODULE_0__.simd)()) {\n const webpEncoder = await __webpack_require__.e(/*! import() */ \"vendors-node_modules_jsquash_webp_codec_enc_webp_enc_simd_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./codec/enc/webp_enc_simd.js */ \"./node_modules/@jsquash/webp/codec/enc/webp_enc_simd.js\"));\n emscriptenModule = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.initEmscriptenModule)(webpEncoder.default, module, moduleOptionOverrides);\n return emscriptenModule;\n }\n const webpEncoder = await __webpack_require__.e(/*! import() */ \"vendors-node_modules_jsquash_webp_codec_enc_webp_enc_js\").then(__webpack_require__.bind(__webpack_require__, /*! ./codec/enc/webp_enc.js */ \"./node_modules/@jsquash/webp/codec/enc/webp_enc.js\"));\n emscriptenModule = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.initEmscriptenModule)(webpEncoder.default, module, moduleOptionOverrides);\n return emscriptenModule;\n}\nasync function encode(data, options = {}) {\n if (!emscriptenModule)\n emscriptenModule = init();\n const _options = { ..._meta_js__WEBPACK_IMPORTED_MODULE_2__.defaultOptions, ...options };\n const module = await emscriptenModule;\n const result = module.encode(data.data, data.width, data.height, _options);\n if (!result)\n throw new Error('Encoding error.');\n return result.buffer;\n}\n\n\n//# sourceURL=webpack:///./node_modules/@jsquash/webp/encode.js?");
60
61 /***/ }),
62
63 /***/ "./node_modules/@jsquash/webp/meta.js":
64 /*!********************************************!*\
65 !*** ./node_modules/@jsquash/webp/meta.js ***!
66 \********************************************/
67 /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
68
69 eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"defaultOptions\": () => (/* binding */ defaultOptions),\n/* harmony export */ \"extension\": () => (/* binding */ extension),\n/* harmony export */ \"label\": () => (/* binding */ label),\n/* harmony export */ \"mimeType\": () => (/* binding */ mimeType)\n/* harmony export */ });\nconst label = 'WebP';\nconst mimeType = 'image/webp';\nconst extension = 'webp';\n// These come from struct WebPConfig in encode.h.\nconst defaultOptions = {\n quality: 75,\n target_size: 0,\n target_PSNR: 0,\n method: 4,\n sns_strength: 50,\n filter_strength: 60,\n filter_sharpness: 0,\n filter_type: 1,\n partitions: 0,\n segments: 4,\n pass: 1,\n show_compressed: 0,\n preprocessing: 0,\n autofilter: 0,\n partition_limit: 0,\n alpha_compression: 1,\n alpha_filtering: 1,\n alpha_quality: 100,\n lossless: 0,\n exact: 0,\n image_hint: 0,\n emulate_jpeg_size: 0,\n thread_level: 0,\n low_memory: 0,\n near_lossless: 100,\n use_delta_palette: 0,\n use_sharp_yuv: 0,\n};\n\n\n//# sourceURL=webpack:///./node_modules/@jsquash/webp/meta.js?");
70
71 /***/ }),
72
73 /***/ "./node_modules/@jsquash/webp/utils.js":
74 /*!*********************************************!*\
75 !*** ./node_modules/@jsquash/webp/utils.js ***!
76 \*********************************************/
77 /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
78
79 eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"initEmscriptenModule\": () => (/* binding */ initEmscriptenModule)\n/* harmony export */ });\n/**\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n * http://www.apache.org/licenses/LICENSE-2.0\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * Notice: I (Jamie Sinclair) have modified this file to allow manual instantiation of the Wasm Module.\n */\nfunction initEmscriptenModule(moduleFactory, wasmModule, moduleOptionOverrides = {}) {\n let instantiateWasm;\n if (wasmModule) {\n instantiateWasm = (imports, callback) => {\n const instance = new WebAssembly.Instance(wasmModule, imports);\n callback(instance);\n return instance.exports;\n };\n }\n return moduleFactory({\n // Just to be safe, don't automatically invoke any wasm functions\n noInitialRun: true,\n instantiateWasm,\n ...moduleOptionOverrides,\n });\n}\n\n\n//# sourceURL=webpack:///./node_modules/@jsquash/webp/utils.js?");
80
81 /***/ }),
82
83 /***/ "./node_modules/browser-image-compression/dist/browser-image-compression.mjs":
84 /*!***********************************************************************************!*\
85 !*** ./node_modules/browser-image-compression/dist/browser-image-compression.mjs ***!
86 \***********************************************************************************/
87 /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
88
89 eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ imageCompression)\n/* harmony export */ });\n/**\n * Browser Image Compression\n * v2.0.2\n * by Donald <donaldcwl@gmail.com>\n * https://github.com/Donaldcwl/browser-image-compression\n */\n\nfunction _mergeNamespaces(e,t){return t.forEach((function(t){t&&\"string\"!=typeof t&&!Array.isArray(t)&&Object.keys(t).forEach((function(r){if(\"default\"!==r&&!(r in e)){var i=Object.getOwnPropertyDescriptor(t,r);Object.defineProperty(e,r,i.get?i:{enumerable:!0,get:function(){return t[r]}})}}))})),Object.freeze(e)}function copyExifWithoutOrientation(e,t){return new Promise((function(r,i){let o;return getApp1Segment(e).then((function(e){try{return o=e,r(new Blob([t.slice(0,2),o,t.slice(2)],{type:\"image/jpeg\"}))}catch(e){return i(e)}}),i)}))}const getApp1Segment=e=>new Promise(((t,r)=>{const i=new FileReader;i.addEventListener(\"load\",(({target:{result:e}})=>{const i=new DataView(e);let o=0;if(65496!==i.getUint16(o))return r(\"not a valid JPEG\");for(o+=2;;){const a=i.getUint16(o);if(65498===a)break;const s=i.getUint16(o+2);if(65505===a&&1165519206===i.getUint32(o+4)){const a=o+10;let f;switch(i.getUint16(a)){case 18761:f=!0;break;case 19789:f=!1;break;default:return r(\"TIFF header contains invalid endian\")}if(42!==i.getUint16(a+2,f))return r(\"TIFF header contains invalid version\");const l=i.getUint32(a+4,f),c=a+l+2+12*i.getUint16(a+l,f);for(let e=a+l+2;e<c;e+=12){if(274==i.getUint16(e,f)){if(3!==i.getUint16(e+2,f))return r(\"Orientation data type is invalid\");if(1!==i.getUint32(e+4,f))return r(\"Orientation data count is invalid\");i.setUint16(e+8,1,f);break}}return t(e.slice(o,o+2+s))}o+=2+s}return t(new Blob)})),i.readAsArrayBuffer(e)}));var e={},t={get exports(){return e},set exports(t){e=t}};!function(e){var r,i,UZIP={};t.exports=UZIP,UZIP.parse=function(e,t){for(var r=UZIP.bin.readUshort,i=UZIP.bin.readUint,o=0,a={},s=new Uint8Array(e),f=s.length-4;101010256!=i(s,f);)f--;o=f;o+=4;var l=r(s,o+=4);r(s,o+=2);var c=i(s,o+=2),u=i(s,o+=4);o+=4,o=u;for(var h=0;h<l;h++){i(s,o),o+=4,o+=4,o+=4,i(s,o+=4);c=i(s,o+=4);var d=i(s,o+=4),A=r(s,o+=4),g=r(s,o+2),p=r(s,o+4);o+=6;var m=i(s,o+=8);o+=4,o+=A+g+p,UZIP._readLocal(s,m,a,c,d,t)}return a},UZIP._readLocal=function(e,t,r,i,o,a){var s=UZIP.bin.readUshort,f=UZIP.bin.readUint;f(e,t),s(e,t+=4),s(e,t+=2);var l=s(e,t+=2);f(e,t+=2),f(e,t+=4),t+=4;var c=s(e,t+=8),u=s(e,t+=2);t+=2;var h=UZIP.bin.readUTF8(e,t,c);if(t+=c,t+=u,a)r[h]={size:o,csize:i};else{var d=new Uint8Array(e.buffer,t);if(0==l)r[h]=new Uint8Array(d.buffer.slice(t,t+i));else{if(8!=l)throw\"unknown compression method: \"+l;var A=new Uint8Array(o);UZIP.inflateRaw(d,A),r[h]=A}}},UZIP.inflateRaw=function(e,t){return UZIP.F.inflate(e,t)},UZIP.inflate=function(e,t){return e[0],e[1],UZIP.inflateRaw(new Uint8Array(e.buffer,e.byteOffset+2,e.length-6),t)},UZIP.deflate=function(e,t){null==t&&(t={level:6});var r=0,i=new Uint8Array(50+Math.floor(1.1*e.length));i[r]=120,i[r+1]=156,r+=2,r=UZIP.F.deflateRaw(e,i,r,t.level);var o=UZIP.adler(e,0,e.length);return i[r+0]=o>>>24&255,i[r+1]=o>>>16&255,i[r+2]=o>>>8&255,i[r+3]=o>>>0&255,new Uint8Array(i.buffer,0,r+4)},UZIP.deflateRaw=function(e,t){null==t&&(t={level:6});var r=new Uint8Array(50+Math.floor(1.1*e.length)),i=UZIP.F.deflateRaw(e,r,i,t.level);return new Uint8Array(r.buffer,0,i)},UZIP.encode=function(e,t){null==t&&(t=!1);var r=0,i=UZIP.bin.writeUint,o=UZIP.bin.writeUshort,a={};for(var s in e){var f=!UZIP._noNeed(s)&&!t,l=e[s],c=UZIP.crc.crc(l,0,l.length);a[s]={cpr:f,usize:l.length,crc:c,file:f?UZIP.deflateRaw(l):l}}for(var s in a)r+=a[s].file.length+30+46+2*UZIP.bin.sizeUTF8(s);r+=22;var u=new Uint8Array(r),h=0,d=[];for(var s in a){var A=a[s];d.push(h),h=UZIP._writeHeader(u,h,s,A,0)}var g=0,p=h;for(var s in a){A=a[s];d.push(h),h=UZIP._writeHeader(u,h,s,A,1,d[g++])}var m=h-p;return i(u,h,101010256),h+=4,o(u,h+=4,g),o(u,h+=2,g),i(u,h+=2,m),i(u,h+=4,p),h+=4,h+=2,u.buffer},UZIP._noNeed=function(e){var t=e.split(\".\").pop().toLowerCase();return-1!=\"png,jpg,jpeg,zip\".indexOf(t)},UZIP._writeHeader=function(e,t,r,i,o,a){var s=UZIP.bin.writeUint,f=UZIP.bin.writeUshort,l=i.file;return s(e,t,0==o?67324752:33639248),t+=4,1==o&&(t+=2),f(e,t,20),f(e,t+=2,0),f(e,t+=2,i.cpr?8:0),s(e,t+=2,0),s(e,t+=4,i.crc),s(e,t+=4,l.length),s(e,t+=4,i.usize),f(e,t+=4,UZIP.bin.sizeUTF8(r)),f(e,t+=2,0),t+=2,1==o&&(t+=2,t+=2,s(e,t+=6,a),t+=4),t+=UZIP.bin.writeUTF8(e,t,r),0==o&&(e.set(l,t),t+=l.length),t},UZIP.crc={table:function(){for(var e=new Uint32Array(256),t=0;t<256;t++){for(var r=t,i=0;i<8;i++)1&r?r=3988292384^r>>>1:r>>>=1;e[t]=r}return e}(),update:function(e,t,r,i){for(var o=0;o<i;o++)e=UZIP.crc.table[255&(e^t[r+o])]^e>>>8;return e},crc:function(e,t,r){return 4294967295^UZIP.crc.update(4294967295,e,t,r)}},UZIP.adler=function(e,t,r){for(var i=1,o=0,a=t,s=t+r;a<s;){for(var f=Math.min(a+5552,s);a<f;)o+=i+=e[a++];i%=65521,o%=65521}return o<<16|i},UZIP.bin={readUshort:function(e,t){return e[t]|e[t+1]<<8},writeUshort:function(e,t,r){e[t]=255&r,e[t+1]=r>>8&255},readUint:function(e,t){return 16777216*e[t+3]+(e[t+2]<<16|e[t+1]<<8|e[t])},writeUint:function(e,t,r){e[t]=255&r,e[t+1]=r>>8&255,e[t+2]=r>>16&255,e[t+3]=r>>24&255},readASCII:function(e,t,r){for(var i=\"\",o=0;o<r;o++)i+=String.fromCharCode(e[t+o]);return i},writeASCII:function(e,t,r){for(var i=0;i<r.length;i++)e[t+i]=r.charCodeAt(i)},pad:function(e){return e.length<2?\"0\"+e:e},readUTF8:function(e,t,r){for(var i,o=\"\",a=0;a<r;a++)o+=\"%\"+UZIP.bin.pad(e[t+a].toString(16));try{i=decodeURIComponent(o)}catch(i){return UZIP.bin.readASCII(e,t,r)}return i},writeUTF8:function(e,t,r){for(var i=r.length,o=0,a=0;a<i;a++){var s=r.charCodeAt(a);if(0==(4294967168&s))e[t+o]=s,o++;else if(0==(4294965248&s))e[t+o]=192|s>>6,e[t+o+1]=128|s>>0&63,o+=2;else if(0==(4294901760&s))e[t+o]=224|s>>12,e[t+o+1]=128|s>>6&63,e[t+o+2]=128|s>>0&63,o+=3;else{if(0!=(4292870144&s))throw\"e\";e[t+o]=240|s>>18,e[t+o+1]=128|s>>12&63,e[t+o+2]=128|s>>6&63,e[t+o+3]=128|s>>0&63,o+=4}}return o},sizeUTF8:function(e){for(var t=e.length,r=0,i=0;i<t;i++){var o=e.charCodeAt(i);if(0==(4294967168&o))r++;else if(0==(4294965248&o))r+=2;else if(0==(4294901760&o))r+=3;else{if(0!=(4292870144&o))throw\"e\";r+=4}}return r}},UZIP.F={},UZIP.F.deflateRaw=function(e,t,r,i){var o=[[0,0,0,0,0],[4,4,8,4,0],[4,5,16,8,0],[4,6,16,16,0],[4,10,16,32,0],[8,16,32,32,0],[8,16,128,128,0],[8,32,128,256,0],[32,128,258,1024,1],[32,258,258,4096,1]][i],a=UZIP.F.U,s=UZIP.F._goodIndex;UZIP.F._hash;var f=UZIP.F._putsE,l=0,c=r<<3,u=0,h=e.length;if(0==i){for(;l<h;){f(t,c,l+(_=Math.min(65535,h-l))==h?1:0),c=UZIP.F._copyExact(e,l,_,t,c+8),l+=_}return c>>>3}var d=a.lits,A=a.strt,g=a.prev,p=0,m=0,w=0,v=0,b=0,y=0;for(h>2&&(A[y=UZIP.F._hash(e,0)]=0),l=0;l<h;l++){if(b=y,l+1<h-2){y=UZIP.F._hash(e,l+1);var E=l+1&32767;g[E]=A[y],A[y]=E}if(u<=l){(p>14e3||m>26697)&&h-l>100&&(u<l&&(d[p]=l-u,p+=2,u=l),c=UZIP.F._writeBlock(l==h-1||u==h?1:0,d,p,v,e,w,l-w,t,c),p=m=v=0,w=l);var F=0;l<h-2&&(F=UZIP.F._bestMatch(e,l,g,b,Math.min(o[2],h-l),o[3]));var _=F>>>16,B=65535&F;if(0!=F){B=65535&F;var U=s(_=F>>>16,a.of0);a.lhst[257+U]++;var C=s(B,a.df0);a.dhst[C]++,v+=a.exb[U]+a.dxb[C],d[p]=_<<23|l-u,d[p+1]=B<<16|U<<8|C,p+=2,u=l+_}else a.lhst[e[l]]++;m++}}for(w==l&&0!=e.length||(u<l&&(d[p]=l-u,p+=2,u=l),c=UZIP.F._writeBlock(1,d,p,v,e,w,l-w,t,c),p=0,m=0,p=m=v=0,w=l);0!=(7&c);)c++;return c>>>3},UZIP.F._bestMatch=function(e,t,r,i,o,a){var s=32767&t,f=r[s],l=s-f+32768&32767;if(f==s||i!=UZIP.F._hash(e,t-l))return 0;for(var c=0,u=0,h=Math.min(32767,t);l<=h&&0!=--a&&f!=s;){if(0==c||e[t+c]==e[t+c-l]){var d=UZIP.F._howLong(e,t,l);if(d>c){if(u=l,(c=d)>=o)break;l+2<d&&(d=l+2);for(var A=0,g=0;g<d-2;g++){var p=t-l+g+32768&32767,m=p-r[p]+32768&32767;m>A&&(A=m,f=p)}}}l+=(s=f)-(f=r[s])+32768&32767}return c<<16|u},UZIP.F._howLong=function(e,t,r){if(e[t]!=e[t-r]||e[t+1]!=e[t+1-r]||e[t+2]!=e[t+2-r])return 0;var i=t,o=Math.min(e.length,t+258);for(t+=3;t<o&&e[t]==e[t-r];)t++;return t-i},UZIP.F._hash=function(e,t){return(e[t]<<8|e[t+1])+(e[t+2]<<4)&65535},UZIP.saved=0,UZIP.F._writeBlock=function(e,t,r,i,o,a,s,f,l){var c,u,h,d,A,g,p,m,w,v=UZIP.F.U,b=UZIP.F._putsF,y=UZIP.F._putsE;v.lhst[256]++,u=(c=UZIP.F.getTrees())[0],h=c[1],d=c[2],A=c[3],g=c[4],p=c[5],m=c[6],w=c[7];var E=32+(0==(l+3&7)?0:8-(l+3&7))+(s<<3),F=i+UZIP.F.contSize(v.fltree,v.lhst)+UZIP.F.contSize(v.fdtree,v.dhst),_=i+UZIP.F.contSize(v.ltree,v.lhst)+UZIP.F.contSize(v.dtree,v.dhst);_+=14+3*p+UZIP.F.contSize(v.itree,v.ihst)+(2*v.ihst[16]+3*v.ihst[17]+7*v.ihst[18]);for(var B=0;B<286;B++)v.lhst[B]=0;for(B=0;B<30;B++)v.dhst[B]=0;for(B=0;B<19;B++)v.ihst[B]=0;var U=E<F&&E<_?0:F<_?1:2;if(b(f,l,e),b(f,l+1,U),l+=3,0==U){for(;0!=(7&l);)l++;l=UZIP.F._copyExact(o,a,s,f,l)}else{var C,I;if(1==U&&(C=v.fltree,I=v.fdtree),2==U){UZIP.F.makeCodes(v.ltree,u),UZIP.F.revCodes(v.ltree,u),UZIP.F.makeCodes(v.dtree,h),UZIP.F.revCodes(v.dtree,h),UZIP.F.makeCodes(v.itree,d),UZIP.F.revCodes(v.itree,d),C=v.ltree,I=v.dtree,y(f,l,A-257),y(f,l+=5,g-1),y(f,l+=5,p-4),l+=4;for(var Q=0;Q<p;Q++)y(f,l+3*Q,v.itree[1+(v.ordr[Q]<<1)]);l+=3*p,l=UZIP.F._codeTiny(m,v.itree,f,l),l=UZIP.F._codeTiny(w,v.itree,f,l)}for(var M=a,x=0;x<r;x+=2){for(var S=t[x],R=S>>>23,T=M+(8388607&S);M<T;)l=UZIP.F._writeLit(o[M++],C,f,l);if(0!=R){var O=t[x+1],P=O>>16,H=O>>8&255,L=255&O;y(f,l=UZIP.F._writeLit(257+H,C,f,l),R-v.of0[H]),l+=v.exb[H],b(f,l=UZIP.F._writeLit(L,I,f,l),P-v.df0[L]),l+=v.dxb[L],M+=R}}l=UZIP.F._writeLit(256,C,f,l)}return l},UZIP.F._copyExact=function(e,t,r,i,o){var a=o>>>3;return i[a]=r,i[a+1]=r>>>8,i[a+2]=255-i[a],i[a+3]=255-i[a+1],a+=4,i.set(new Uint8Array(e.buffer,t,r),a),o+(r+4<<3)},UZIP.F.getTrees=function(){for(var e=UZIP.F.U,t=UZIP.F._hufTree(e.lhst,e.ltree,15),r=UZIP.F._hufTree(e.dhst,e.dtree,15),i=[],o=UZIP.F._lenCodes(e.ltree,i),a=[],s=UZIP.F._lenCodes(e.dtree,a),f=0;f<i.length;f+=2)e.ihst[i[f]]++;for(f=0;f<a.length;f+=2)e.ihst[a[f]]++;for(var l=UZIP.F._hufTree(e.ihst,e.itree,7),c=19;c>4&&0==e.itree[1+(e.ordr[c-1]<<1)];)c--;return[t,r,l,o,s,c,i,a]},UZIP.F.getSecond=function(e){for(var t=[],r=0;r<e.length;r+=2)t.push(e[r+1]);return t},UZIP.F.nonZero=function(e){for(var t=\"\",r=0;r<e.length;r+=2)0!=e[r+1]&&(t+=(r>>1)+\",\");return t},UZIP.F.contSize=function(e,t){for(var r=0,i=0;i<t.length;i++)r+=t[i]*e[1+(i<<1)];return r},UZIP.F._codeTiny=function(e,t,r,i){for(var o=0;o<e.length;o+=2){var a=e[o],s=e[o+1];i=UZIP.F._writeLit(a,t,r,i);var f=16==a?2:17==a?3:7;a>15&&(UZIP.F._putsE(r,i,s,f),i+=f)}return i},UZIP.F._lenCodes=function(e,t){for(var r=e.length;2!=r&&0==e[r-1];)r-=2;for(var i=0;i<r;i+=2){var o=e[i+1],a=i+3<r?e[i+3]:-1,s=i+5<r?e[i+5]:-1,f=0==i?-1:e[i-1];if(0==o&&a==o&&s==o){for(var l=i+5;l+2<r&&e[l+2]==o;)l+=2;(c=Math.min(l+1-i>>>1,138))<11?t.push(17,c-3):t.push(18,c-11),i+=2*c-2}else if(o==f&&a==o&&s==o){for(l=i+5;l+2<r&&e[l+2]==o;)l+=2;var c=Math.min(l+1-i>>>1,6);t.push(16,c-3),i+=2*c-2}else t.push(o,0)}return r>>>1},UZIP.F._hufTree=function(e,t,r){var i=[],o=e.length,a=t.length,s=0;for(s=0;s<a;s+=2)t[s]=0,t[s+1]=0;for(s=0;s<o;s++)0!=e[s]&&i.push({lit:s,f:e[s]});var f=i.length,l=i.slice(0);if(0==f)return 0;if(1==f){var c=i[0].lit;l=0==c?1:0;return t[1+(c<<1)]=1,t[1+(l<<1)]=1,1}i.sort((function(e,t){return e.f-t.f}));var u=i[0],h=i[1],d=0,A=1,g=2;for(i[0]={lit:-1,f:u.f+h.f,l:u,r:h,d:0};A!=f-1;)u=d!=A&&(g==f||i[d].f<i[g].f)?i[d++]:i[g++],h=d!=A&&(g==f||i[d].f<i[g].f)?i[d++]:i[g++],i[A++]={lit:-1,f:u.f+h.f,l:u,r:h};var p=UZIP.F.setDepth(i[A-1],0);for(p>r&&(UZIP.F.restrictDepth(l,r,p),p=r),s=0;s<f;s++)t[1+(l[s].lit<<1)]=l[s].d;return p},UZIP.F.setDepth=function(e,t){return-1!=e.lit?(e.d=t,t):Math.max(UZIP.F.setDepth(e.l,t+1),UZIP.F.setDepth(e.r,t+1))},UZIP.F.restrictDepth=function(e,t,r){var i=0,o=1<<r-t,a=0;for(e.sort((function(e,t){return t.d==e.d?e.f-t.f:t.d-e.d})),i=0;i<e.length&&e[i].d>t;i++){var s=e[i].d;e[i].d=t,a+=o-(1<<r-s)}for(a>>>=r-t;a>0;){(s=e[i].d)<t?(e[i].d++,a-=1<<t-s-1):i++}for(;i>=0;i--)e[i].d==t&&a<0&&(e[i].d--,a++);0!=a&&console.log(\"debt left\")},UZIP.F._goodIndex=function(e,t){var r=0;return t[16|r]<=e&&(r|=16),t[8|r]<=e&&(r|=8),t[4|r]<=e&&(r|=4),t[2|r]<=e&&(r|=2),t[1|r]<=e&&(r|=1),r},UZIP.F._writeLit=function(e,t,r,i){return UZIP.F._putsF(r,i,t[e<<1]),i+t[1+(e<<1)]},UZIP.F.inflate=function(e,t){var r=Uint8Array;if(3==e[0]&&0==e[1])return t||new r(0);var i=UZIP.F,o=i._bitsF,a=i._bitsE,s=i._decodeTiny,f=i.makeCodes,l=i.codes2map,c=i._get17,u=i.U,h=null==t;h&&(t=new r(e.length>>>2<<3));for(var d,A,g=0,p=0,m=0,w=0,v=0,b=0,y=0,E=0,F=0;0==g;)if(g=o(e,F,1),p=o(e,F+1,2),F+=3,0!=p){if(h&&(t=UZIP.F._check(t,E+(1<<17))),1==p&&(d=u.flmap,A=u.fdmap,b=511,y=31),2==p){m=a(e,F,5)+257,w=a(e,F+5,5)+1,v=a(e,F+10,4)+4,F+=14;for(var _=0;_<38;_+=2)u.itree[_]=0,u.itree[_+1]=0;var B=1;for(_=0;_<v;_++){var U=a(e,F+3*_,3);u.itree[1+(u.ordr[_]<<1)]=U,U>B&&(B=U)}F+=3*v,f(u.itree,B),l(u.itree,B,u.imap),d=u.lmap,A=u.dmap,F=s(u.imap,(1<<B)-1,m+w,e,F,u.ttree);var C=i._copyOut(u.ttree,0,m,u.ltree);b=(1<<C)-1;var I=i._copyOut(u.ttree,m,w,u.dtree);y=(1<<I)-1,f(u.ltree,C),l(u.ltree,C,d),f(u.dtree,I),l(u.dtree,I,A)}for(;;){var Q=d[c(e,F)&b];F+=15&Q;var M=Q>>>4;if(M>>>8==0)t[E++]=M;else{if(256==M)break;var x=E+M-254;if(M>264){var S=u.ldef[M-257];x=E+(S>>>3)+a(e,F,7&S),F+=7&S}var R=A[c(e,F)&y];F+=15&R;var T=R>>>4,O=u.ddef[T],P=(O>>>4)+o(e,F,15&O);for(F+=15&O,h&&(t=UZIP.F._check(t,E+(1<<17)));E<x;)t[E]=t[E++-P],t[E]=t[E++-P],t[E]=t[E++-P],t[E]=t[E++-P];E=x}}}else{0!=(7&F)&&(F+=8-(7&F));var H=4+(F>>>3),L=e[H-4]|e[H-3]<<8;h&&(t=UZIP.F._check(t,E+L)),t.set(new r(e.buffer,e.byteOffset+H,L),E),F=H+L<<3,E+=L}return t.length==E?t:t.slice(0,E)},UZIP.F._check=function(e,t){var r=e.length;if(t<=r)return e;var i=new Uint8Array(Math.max(r<<1,t));return i.set(e,0),i},UZIP.F._decodeTiny=function(e,t,r,i,o,a){for(var s=UZIP.F._bitsE,f=UZIP.F._get17,l=0;l<r;){var c=e[f(i,o)&t];o+=15&c;var u=c>>>4;if(u<=15)a[l]=u,l++;else{var h=0,d=0;16==u?(d=3+s(i,o,2),o+=2,h=a[l-1]):17==u?(d=3+s(i,o,3),o+=3):18==u&&(d=11+s(i,o,7),o+=7);for(var A=l+d;l<A;)a[l]=h,l++}}return o},UZIP.F._copyOut=function(e,t,r,i){for(var o=0,a=0,s=i.length>>>1;a<r;){var f=e[a+t];i[a<<1]=0,i[1+(a<<1)]=f,f>o&&(o=f),a++}for(;a<s;)i[a<<1]=0,i[1+(a<<1)]=0,a++;return o},UZIP.F.makeCodes=function(e,t){for(var r,i,o,a,s=UZIP.F.U,f=e.length,l=s.bl_count,c=0;c<=t;c++)l[c]=0;for(c=1;c<f;c+=2)l[e[c]]++;var u=s.next_code;for(r=0,l[0]=0,i=1;i<=t;i++)r=r+l[i-1]<<1,u[i]=r;for(o=0;o<f;o+=2)0!=(a=e[o+1])&&(e[o]=u[a],u[a]++)},UZIP.F.codes2map=function(e,t,r){for(var i=e.length,o=UZIP.F.U.rev15,a=0;a<i;a+=2)if(0!=e[a+1])for(var s=a>>1,f=e[a+1],l=s<<4|f,c=t-f,u=e[a]<<c,h=u+(1<<c);u!=h;){r[o[u]>>>15-t]=l,u++}},UZIP.F.revCodes=function(e,t){for(var r=UZIP.F.U.rev15,i=15-t,o=0;o<e.length;o+=2){var a=e[o]<<t-e[o+1];e[o]=r[a]>>>i}},UZIP.F._putsE=function(e,t,r){r<<=7&t;var i=t>>>3;e[i]|=r,e[i+1]|=r>>>8},UZIP.F._putsF=function(e,t,r){r<<=7&t;var i=t>>>3;e[i]|=r,e[i+1]|=r>>>8,e[i+2]|=r>>>16},UZIP.F._bitsE=function(e,t,r){return(e[t>>>3]|e[1+(t>>>3)]<<8)>>>(7&t)&(1<<r)-1},UZIP.F._bitsF=function(e,t,r){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16)>>>(7&t)&(1<<r)-1},UZIP.F._get17=function(e,t){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16)>>>(7&t)},UZIP.F._get25=function(e,t){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16|e[3+(t>>>3)]<<24)>>>(7&t)},UZIP.F.U=(r=Uint16Array,i=Uint32Array,{next_code:new r(16),bl_count:new r(16),ordr:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],of0:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],exb:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],ldef:new r(32),df0:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],dxb:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],ddef:new i(32),flmap:new r(512),fltree:[],fdmap:new r(32),fdtree:[],lmap:new r(32768),ltree:[],ttree:[],dmap:new r(32768),dtree:[],imap:new r(512),itree:[],rev15:new r(32768),lhst:new i(286),dhst:new i(30),ihst:new i(19),lits:new i(15e3),strt:new r(65536),prev:new r(32768)}),function(){for(var e=UZIP.F.U,t=0;t<32768;t++){var r=t;r=(4278255360&(r=(4042322160&(r=(3435973836&(r=(2863311530&r)>>>1|(1431655765&r)<<1))>>>2|(858993459&r)<<2))>>>4|(252645135&r)<<4))>>>8|(16711935&r)<<8,e.rev15[t]=(r>>>16|r<<16)>>>17}function pushV(e,t,r){for(;0!=t--;)e.push(0,r)}for(t=0;t<32;t++)e.ldef[t]=e.of0[t]<<3|e.exb[t],e.ddef[t]=e.df0[t]<<4|e.dxb[t];pushV(e.fltree,144,8),pushV(e.fltree,112,9),pushV(e.fltree,24,7),pushV(e.fltree,8,8),UZIP.F.makeCodes(e.fltree,9),UZIP.F.codes2map(e.fltree,9,e.flmap),UZIP.F.revCodes(e.fltree,9),pushV(e.fdtree,32,5),UZIP.F.makeCodes(e.fdtree,5),UZIP.F.codes2map(e.fdtree,5,e.fdmap),UZIP.F.revCodes(e.fdtree,5),pushV(e.itree,19,0),pushV(e.ltree,286,0),pushV(e.dtree,30,0),pushV(e.ttree,320,0)}()}();var UZIP=_mergeNamespaces({__proto__:null,default:e},[e]);const UPNG=function(){var e={nextZero(e,t){for(;0!=e[t];)t++;return t},readUshort:(e,t)=>e[t]<<8|e[t+1],writeUshort(e,t,r){e[t]=r>>8&255,e[t+1]=255&r},readUint:(e,t)=>16777216*e[t]+(e[t+1]<<16|e[t+2]<<8|e[t+3]),writeUint(e,t,r){e[t]=r>>24&255,e[t+1]=r>>16&255,e[t+2]=r>>8&255,e[t+3]=255&r},readASCII(e,t,r){let i=\"\";for(let o=0;o<r;o++)i+=String.fromCharCode(e[t+o]);return i},writeASCII(e,t,r){for(let i=0;i<r.length;i++)e[t+i]=r.charCodeAt(i)},readBytes(e,t,r){const i=[];for(let o=0;o<r;o++)i.push(e[t+o]);return i},pad:e=>e.length<2?`0${e}`:e,readUTF8(t,r,i){let o,a=\"\";for(let o=0;o<i;o++)a+=`%${e.pad(t[r+o].toString(16))}`;try{o=decodeURIComponent(a)}catch(o){return e.readASCII(t,r,i)}return o}};function decodeImage(t,r,i,o){const a=r*i,s=_getBPP(o),f=Math.ceil(r*s/8),l=new Uint8Array(4*a),c=new Uint32Array(l.buffer),{ctype:u}=o,{depth:h}=o,d=e.readUshort;if(6==u){const e=a<<2;if(8==h)for(var A=0;A<e;A+=4)l[A]=t[A],l[A+1]=t[A+1],l[A+2]=t[A+2],l[A+3]=t[A+3];if(16==h)for(A=0;A<e;A++)l[A]=t[A<<1]}else if(2==u){const e=o.tabs.tRNS;if(null==e){if(8==h)for(A=0;A<a;A++){var g=3*A;c[A]=255<<24|t[g+2]<<16|t[g+1]<<8|t[g]}if(16==h)for(A=0;A<a;A++){g=6*A;c[A]=255<<24|t[g+4]<<16|t[g+2]<<8|t[g]}}else{var p=e[0];const r=e[1],i=e[2];if(8==h)for(A=0;A<a;A++){var m=A<<2;g=3*A;c[A]=255<<24|t[g+2]<<16|t[g+1]<<8|t[g],t[g]==p&&t[g+1]==r&&t[g+2]==i&&(l[m+3]=0)}if(16==h)for(A=0;A<a;A++){m=A<<2,g=6*A;c[A]=255<<24|t[g+4]<<16|t[g+2]<<8|t[g],d(t,g)==p&&d(t,g+2)==r&&d(t,g+4)==i&&(l[m+3]=0)}}}else if(3==u){const e=o.tabs.PLTE,s=o.tabs.tRNS,c=s?s.length:0;if(1==h)for(var w=0;w<i;w++){var v=w*f,b=w*r;for(A=0;A<r;A++){m=b+A<<2;var y=3*(E=t[v+(A>>3)]>>7-((7&A)<<0)&1);l[m]=e[y],l[m+1]=e[y+1],l[m+2]=e[y+2],l[m+3]=E<c?s[E]:255}}if(2==h)for(w=0;w<i;w++)for(v=w*f,b=w*r,A=0;A<r;A++){m=b+A<<2,y=3*(E=t[v+(A>>2)]>>6-((3&A)<<1)&3);l[m]=e[y],l[m+1]=e[y+1],l[m+2]=e[y+2],l[m+3]=E<c?s[E]:255}if(4==h)for(w=0;w<i;w++)for(v=w*f,b=w*r,A=0;A<r;A++){m=b+A<<2,y=3*(E=t[v+(A>>1)]>>4-((1&A)<<2)&15);l[m]=e[y],l[m+1]=e[y+1],l[m+2]=e[y+2],l[m+3]=E<c?s[E]:255}if(8==h)for(A=0;A<a;A++){var E;m=A<<2,y=3*(E=t[A]);l[m]=e[y],l[m+1]=e[y+1],l[m+2]=e[y+2],l[m+3]=E<c?s[E]:255}}else if(4==u){if(8==h)for(A=0;A<a;A++){m=A<<2;var F=t[_=A<<1];l[m]=F,l[m+1]=F,l[m+2]=F,l[m+3]=t[_+1]}if(16==h)for(A=0;A<a;A++){var _;m=A<<2,F=t[_=A<<2];l[m]=F,l[m+1]=F,l[m+2]=F,l[m+3]=t[_+2]}}else if(0==u)for(p=o.tabs.tRNS?o.tabs.tRNS:-1,w=0;w<i;w++){const e=w*f,i=w*r;if(1==h)for(var B=0;B<r;B++){var U=(F=255*(t[e+(B>>>3)]>>>7-(7&B)&1))==255*p?0:255;c[i+B]=U<<24|F<<16|F<<8|F}else if(2==h)for(B=0;B<r;B++){U=(F=85*(t[e+(B>>>2)]>>>6-((3&B)<<1)&3))==85*p?0:255;c[i+B]=U<<24|F<<16|F<<8|F}else if(4==h)for(B=0;B<r;B++){U=(F=17*(t[e+(B>>>1)]>>>4-((1&B)<<2)&15))==17*p?0:255;c[i+B]=U<<24|F<<16|F<<8|F}else if(8==h)for(B=0;B<r;B++){U=(F=t[e+B])==p?0:255;c[i+B]=U<<24|F<<16|F<<8|F}else if(16==h)for(B=0;B<r;B++){F=t[e+(B<<1)],U=d(t,e+(B<<1))==p?0:255;c[i+B]=U<<24|F<<16|F<<8|F}}return l}function _decompress(e,r,i,o){const a=_getBPP(e),s=Math.ceil(i*a/8),f=new Uint8Array((s+1+e.interlace)*o);return r=e.tabs.CgBI?t(r,f):_inflate(r,f),0==e.interlace?r=_filterZero(r,e,0,i,o):1==e.interlace&&(r=function _readInterlace(e,t){const r=t.width,i=t.height,o=_getBPP(t),a=o>>3,s=Math.ceil(r*o/8),f=new Uint8Array(i*s);let l=0;const c=[0,0,4,0,2,0,1],u=[0,4,0,2,0,1,0],h=[8,8,8,4,4,2,2],d=[8,8,4,4,2,2,1];let A=0;for(;A<7;){const p=h[A],m=d[A];let w=0,v=0,b=c[A];for(;b<i;)b+=p,v++;let y=u[A];for(;y<r;)y+=m,w++;const E=Math.ceil(w*o/8);_filterZero(e,t,l,w,v);let F=0,_=c[A];for(;_<i;){let t=u[A],i=l+F*E<<3;for(;t<r;){var g;if(1==o)g=(g=e[i>>3])>>7-(7&i)&1,f[_*s+(t>>3)]|=g<<7-((7&t)<<0);if(2==o)g=(g=e[i>>3])>>6-(7&i)&3,f[_*s+(t>>2)]|=g<<6-((3&t)<<1);if(4==o)g=(g=e[i>>3])>>4-(7&i)&15,f[_*s+(t>>1)]|=g<<4-((1&t)<<2);if(o>=8){const r=_*s+t*a;for(let t=0;t<a;t++)f[r+t]=e[(i>>3)+t]}i+=o,t+=m}F++,_+=p}w*v!=0&&(l+=v*(1+E)),A+=1}return f}(r,e)),r}function _inflate(e,r){return t(new Uint8Array(e.buffer,2,e.length-6),r)}var t=function(){const e={H:{}};return e.H.N=function(t,r){const i=Uint8Array;let o,a,s=0,f=0,l=0,c=0,u=0,h=0,d=0,A=0,g=0;if(3==t[0]&&0==t[1])return r||new i(0);const p=e.H,m=p.b,w=p.e,v=p.R,b=p.n,y=p.A,E=p.Z,F=p.m,_=null==r;for(_&&(r=new i(t.length>>>2<<5));0==s;)if(s=m(t,g,1),f=m(t,g+1,2),g+=3,0!=f){if(_&&(r=e.H.W(r,A+(1<<17))),1==f&&(o=F.J,a=F.h,h=511,d=31),2==f){l=w(t,g,5)+257,c=w(t,g+5,5)+1,u=w(t,g+10,4)+4,g+=14;let e=1;for(var B=0;B<38;B+=2)F.Q[B]=0,F.Q[B+1]=0;for(B=0;B<u;B++){const r=w(t,g+3*B,3);F.Q[1+(F.X[B]<<1)]=r,r>e&&(e=r)}g+=3*u,b(F.Q,e),y(F.Q,e,F.u),o=F.w,a=F.d,g=v(F.u,(1<<e)-1,l+c,t,g,F.v);const r=p.V(F.v,0,l,F.C);h=(1<<r)-1;const i=p.V(F.v,l,c,F.D);d=(1<<i)-1,b(F.C,r),y(F.C,r,o),b(F.D,i),y(F.D,i,a)}for(;;){const e=o[E(t,g)&h];g+=15&e;const i=e>>>4;if(i>>>8==0)r[A++]=i;else{if(256==i)break;{let e=A+i-254;if(i>264){const r=F.q[i-257];e=A+(r>>>3)+w(t,g,7&r),g+=7&r}const o=a[E(t,g)&d];g+=15&o;const s=o>>>4,f=F.c[s],l=(f>>>4)+m(t,g,15&f);for(g+=15&f;A<e;)r[A]=r[A++-l],r[A]=r[A++-l],r[A]=r[A++-l],r[A]=r[A++-l];A=e}}}}else{0!=(7&g)&&(g+=8-(7&g));const o=4+(g>>>3),a=t[o-4]|t[o-3]<<8;_&&(r=e.H.W(r,A+a)),r.set(new i(t.buffer,t.byteOffset+o,a),A),g=o+a<<3,A+=a}return r.length==A?r:r.slice(0,A)},e.H.W=function(e,t){const r=e.length;if(t<=r)return e;const i=new Uint8Array(r<<1);return i.set(e,0),i},e.H.R=function(t,r,i,o,a,s){const f=e.H.e,l=e.H.Z;let c=0;for(;c<i;){const e=t[l(o,a)&r];a+=15&e;const i=e>>>4;if(i<=15)s[c]=i,c++;else{let e=0,t=0;16==i?(t=3+f(o,a,2),a+=2,e=s[c-1]):17==i?(t=3+f(o,a,3),a+=3):18==i&&(t=11+f(o,a,7),a+=7);const r=c+t;for(;c<r;)s[c]=e,c++}}return a},e.H.V=function(e,t,r,i){let o=0,a=0;const s=i.length>>>1;for(;a<r;){const r=e[a+t];i[a<<1]=0,i[1+(a<<1)]=r,r>o&&(o=r),a++}for(;a<s;)i[a<<1]=0,i[1+(a<<1)]=0,a++;return o},e.H.n=function(t,r){const i=e.H.m,o=t.length;let a,s,f;let l;const c=i.j;for(var u=0;u<=r;u++)c[u]=0;for(u=1;u<o;u+=2)c[t[u]]++;const h=i.K;for(a=0,c[0]=0,s=1;s<=r;s++)a=a+c[s-1]<<1,h[s]=a;for(f=0;f<o;f+=2)l=t[f+1],0!=l&&(t[f]=h[l],h[l]++)},e.H.A=function(t,r,i){const o=t.length,a=e.H.m.r;for(let e=0;e<o;e+=2)if(0!=t[e+1]){const o=e>>1,s=t[e+1],f=o<<4|s,l=r-s;let c=t[e]<<l;const u=c+(1<<l);for(;c!=u;){i[a[c]>>>15-r]=f,c++}}},e.H.l=function(t,r){const i=e.H.m.r,o=15-r;for(let e=0;e<t.length;e+=2){const a=t[e]<<r-t[e+1];t[e]=i[a]>>>o}},e.H.M=function(e,t,r){r<<=7&t;const i=t>>>3;e[i]|=r,e[i+1]|=r>>>8},e.H.I=function(e,t,r){r<<=7&t;const i=t>>>3;e[i]|=r,e[i+1]|=r>>>8,e[i+2]|=r>>>16},e.H.e=function(e,t,r){return(e[t>>>3]|e[1+(t>>>3)]<<8)>>>(7&t)&(1<<r)-1},e.H.b=function(e,t,r){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16)>>>(7&t)&(1<<r)-1},e.H.Z=function(e,t){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16)>>>(7&t)},e.H.i=function(e,t){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16|e[3+(t>>>3)]<<24)>>>(7&t)},e.H.m=function(){const e=Uint16Array,t=Uint32Array;return{K:new e(16),j:new e(16),X:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],S:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],T:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],q:new e(32),p:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],z:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],c:new t(32),J:new e(512),_:[],h:new e(32),$:[],w:new e(32768),C:[],v:[],d:new e(32768),D:[],u:new e(512),Q:[],r:new e(32768),s:new t(286),Y:new t(30),a:new t(19),t:new t(15e3),k:new e(65536),g:new e(32768)}}(),function(){const t=e.H.m;for(var r=0;r<32768;r++){let e=r;e=(2863311530&e)>>>1|(1431655765&e)<<1,e=(3435973836&e)>>>2|(858993459&e)<<2,e=(4042322160&e)>>>4|(252645135&e)<<4,e=(4278255360&e)>>>8|(16711935&e)<<8,t.r[r]=(e>>>16|e<<16)>>>17}function n(e,t,r){for(;0!=t--;)e.push(0,r)}for(r=0;r<32;r++)t.q[r]=t.S[r]<<3|t.T[r],t.c[r]=t.p[r]<<4|t.z[r];n(t._,144,8),n(t._,112,9),n(t._,24,7),n(t._,8,8),e.H.n(t._,9),e.H.A(t._,9,t.J),e.H.l(t._,9),n(t.$,32,5),e.H.n(t.$,5),e.H.A(t.$,5,t.h),e.H.l(t.$,5),n(t.Q,19,0),n(t.C,286,0),n(t.D,30,0),n(t.v,320,0)}(),e.H.N}();function _getBPP(e){return[1,null,3,1,2,null,4][e.ctype]*e.depth}function _filterZero(e,t,r,i,o){let a=_getBPP(t);const s=Math.ceil(i*a/8);let f,l;a=Math.ceil(a/8);let c=e[r],u=0;if(c>1&&(e[r]=[0,0,1][c-2]),3==c)for(u=a;u<s;u++)e[u+1]=e[u+1]+(e[u+1-a]>>>1)&255;for(let t=0;t<o;t++)if(f=r+t*s,l=f+t+1,c=e[l-1],u=0,0==c)for(;u<s;u++)e[f+u]=e[l+u];else if(1==c){for(;u<a;u++)e[f+u]=e[l+u];for(;u<s;u++)e[f+u]=e[l+u]+e[f+u-a]}else if(2==c)for(;u<s;u++)e[f+u]=e[l+u]+e[f+u-s];else if(3==c){for(;u<a;u++)e[f+u]=e[l+u]+(e[f+u-s]>>>1);for(;u<s;u++)e[f+u]=e[l+u]+(e[f+u-s]+e[f+u-a]>>>1)}else{for(;u<a;u++)e[f+u]=e[l+u]+_paeth(0,e[f+u-s],0);for(;u<s;u++)e[f+u]=e[l+u]+_paeth(e[f+u-a],e[f+u-s],e[f+u-a-s])}return e}function _paeth(e,t,r){const i=e+t-r,o=i-e,a=i-t,s=i-r;return o*o<=a*a&&o*o<=s*s?e:a*a<=s*s?t:r}function _IHDR(t,r,i){i.width=e.readUint(t,r),r+=4,i.height=e.readUint(t,r),r+=4,i.depth=t[r],r++,i.ctype=t[r],r++,i.compress=t[r],r++,i.filter=t[r],r++,i.interlace=t[r],r++}function _copyTile(e,t,r,i,o,a,s,f,l){const c=Math.min(t,o),u=Math.min(r,a);let h=0,d=0;for(let r=0;r<u;r++)for(let a=0;a<c;a++)if(s>=0&&f>=0?(h=r*t+a<<2,d=(f+r)*o+s+a<<2):(h=(-f+r)*t-s+a<<2,d=r*o+a<<2),0==l)i[d]=e[h],i[d+1]=e[h+1],i[d+2]=e[h+2],i[d+3]=e[h+3];else if(1==l){var A=e[h+3]*(1/255),g=e[h]*A,p=e[h+1]*A,m=e[h+2]*A,w=i[d+3]*(1/255),v=i[d]*w,b=i[d+1]*w,y=i[d+2]*w;const t=1-A,r=A+w*t,o=0==r?0:1/r;i[d+3]=255*r,i[d+0]=(g+v*t)*o,i[d+1]=(p+b*t)*o,i[d+2]=(m+y*t)*o}else if(2==l){A=e[h+3],g=e[h],p=e[h+1],m=e[h+2],w=i[d+3],v=i[d],b=i[d+1],y=i[d+2];A==w&&g==v&&p==b&&m==y?(i[d]=0,i[d+1]=0,i[d+2]=0,i[d+3]=0):(i[d]=g,i[d+1]=p,i[d+2]=m,i[d+3]=A)}else if(3==l){A=e[h+3],g=e[h],p=e[h+1],m=e[h+2],w=i[d+3],v=i[d],b=i[d+1],y=i[d+2];if(A==w&&g==v&&p==b&&m==y)continue;if(A<220&&w>20)return!1}return!0}return{decode:function decode(r){const i=new Uint8Array(r);let o=8;const a=e,s=a.readUshort,f=a.readUint,l={tabs:{},frames:[]},c=new Uint8Array(i.length);let u,h=0,d=0;const A=[137,80,78,71,13,10,26,10];for(var g=0;g<8;g++)if(i[g]!=A[g])throw\"The input is not a PNG file!\";for(;o<i.length;){const e=a.readUint(i,o);o+=4;const r=a.readASCII(i,o,4);if(o+=4,\"IHDR\"==r)_IHDR(i,o,l);else if(\"iCCP\"==r){for(var p=o;0!=i[p];)p++;a.readASCII(i,o,p-o),i[p+1];const s=i.slice(p+2,o+e);let f=null;try{f=_inflate(s)}catch(e){f=t(s)}l.tabs[r]=f}else if(\"CgBI\"==r)l.tabs[r]=i.slice(o,o+4);else if(\"IDAT\"==r){for(g=0;g<e;g++)c[h+g]=i[o+g];h+=e}else if(\"acTL\"==r)l.tabs[r]={num_frames:f(i,o),num_plays:f(i,o+4)},u=new Uint8Array(i.length);else if(\"fcTL\"==r){if(0!=d)(E=l.frames[l.frames.length-1]).data=_decompress(l,u.slice(0,d),E.rect.width,E.rect.height),d=0;const e={x:f(i,o+12),y:f(i,o+16),width:f(i,o+4),height:f(i,o+8)};let t=s(i,o+22);t=s(i,o+20)/(0==t?100:t);const r={rect:e,delay:Math.round(1e3*t),dispose:i[o+24],blend:i[o+25]};l.frames.push(r)}else if(\"fdAT\"==r){for(g=0;g<e-4;g++)u[d+g]=i[o+g+4];d+=e-4}else if(\"pHYs\"==r)l.tabs[r]=[a.readUint(i,o),a.readUint(i,o+4),i[o+8]];else if(\"cHRM\"==r){l.tabs[r]=[];for(g=0;g<8;g++)l.tabs[r].push(a.readUint(i,o+4*g))}else if(\"tEXt\"==r||\"zTXt\"==r){null==l.tabs[r]&&(l.tabs[r]={});var m=a.nextZero(i,o),w=a.readASCII(i,o,m-o),v=o+e-m-1;if(\"tEXt\"==r)y=a.readASCII(i,m+1,v);else{var b=_inflate(i.slice(m+2,m+2+v));y=a.readUTF8(b,0,b.length)}l.tabs[r][w]=y}else if(\"iTXt\"==r){null==l.tabs[r]&&(l.tabs[r]={});m=0,p=o;m=a.nextZero(i,p);w=a.readASCII(i,p,m-p);const t=i[p=m+1];var y;i[p+1],p+=2,m=a.nextZero(i,p),a.readASCII(i,p,m-p),p=m+1,m=a.nextZero(i,p),a.readUTF8(i,p,m-p);v=e-((p=m+1)-o);if(0==t)y=a.readUTF8(i,p,v);else{b=_inflate(i.slice(p,p+v));y=a.readUTF8(b,0,b.length)}l.tabs[r][w]=y}else if(\"PLTE\"==r)l.tabs[r]=a.readBytes(i,o,e);else if(\"hIST\"==r){const e=l.tabs.PLTE.length/3;l.tabs[r]=[];for(g=0;g<e;g++)l.tabs[r].push(s(i,o+2*g))}else if(\"tRNS\"==r)3==l.ctype?l.tabs[r]=a.readBytes(i,o,e):0==l.ctype?l.tabs[r]=s(i,o):2==l.ctype&&(l.tabs[r]=[s(i,o),s(i,o+2),s(i,o+4)]);else if(\"gAMA\"==r)l.tabs[r]=a.readUint(i,o)/1e5;else if(\"sRGB\"==r)l.tabs[r]=i[o];else if(\"bKGD\"==r)0==l.ctype||4==l.ctype?l.tabs[r]=[s(i,o)]:2==l.ctype||6==l.ctype?l.tabs[r]=[s(i,o),s(i,o+2),s(i,o+4)]:3==l.ctype&&(l.tabs[r]=i[o]);else if(\"IEND\"==r)break;o+=e,a.readUint(i,o),o+=4}var E;return 0!=d&&((E=l.frames[l.frames.length-1]).data=_decompress(l,u.slice(0,d),E.rect.width,E.rect.height)),l.data=_decompress(l,c,l.width,l.height),delete l.compress,delete l.interlace,delete l.filter,l},toRGBA8:function toRGBA8(e){const t=e.width,r=e.height;if(null==e.tabs.acTL)return[decodeImage(e.data,t,r,e).buffer];const i=[];null==e.frames[0].data&&(e.frames[0].data=e.data);const o=t*r*4,a=new Uint8Array(o),s=new Uint8Array(o),f=new Uint8Array(o);for(let c=0;c<e.frames.length;c++){const u=e.frames[c],h=u.rect.x,d=u.rect.y,A=u.rect.width,g=u.rect.height,p=decodeImage(u.data,A,g,e);if(0!=c)for(var l=0;l<o;l++)f[l]=a[l];if(0==u.blend?_copyTile(p,A,g,a,t,r,h,d,0):1==u.blend&&_copyTile(p,A,g,a,t,r,h,d,1),i.push(a.buffer.slice(0)),0==u.dispose);else if(1==u.dispose)_copyTile(s,A,g,a,t,r,h,d,0);else if(2==u.dispose)for(l=0;l<o;l++)a[l]=f[l]}return i},_paeth:_paeth,_copyTile:_copyTile,_bin:e}}();!function(){const{_copyTile:e}=UPNG,{_bin:t}=UPNG,r=UPNG._paeth;var i={table:function(){const e=new Uint32Array(256);for(let t=0;t<256;t++){let r=t;for(let e=0;e<8;e++)1&r?r=3988292384^r>>>1:r>>>=1;e[t]=r}return e}(),update(e,t,r,o){for(let a=0;a<o;a++)e=i.table[255&(e^t[r+a])]^e>>>8;return e},crc:(e,t,r)=>4294967295^i.update(4294967295,e,t,r)};function addErr(e,t,r,i){t[r]+=e[0]*i>>4,t[r+1]+=e[1]*i>>4,t[r+2]+=e[2]*i>>4,t[r+3]+=e[3]*i>>4}function N(e){return Math.max(0,Math.min(255,e))}function D(e,t){const r=e[0]-t[0],i=e[1]-t[1],o=e[2]-t[2],a=e[3]-t[3];return r*r+i*i+o*o+a*a}function dither(e,t,r,i,o,a,s){null==s&&(s=1);const f=i.length,l=[];for(var c=0;c<f;c++){const e=i[c];l.push([e>>>0&255,e>>>8&255,e>>>16&255,e>>>24&255])}for(c=0;c<f;c++){let e=4294967295;for(var u=0,h=0;h<f;h++){var d=D(l[c],l[h]);h!=c&&d<e&&(e=d,u=h)}}const A=new Uint32Array(o.buffer),g=new Int16Array(t*r*4),p=[0,8,2,10,12,4,14,6,3,11,1,9,15,7,13,5];for(c=0;c<p.length;c++)p[c]=255*((p[c]+.5)/16-.5);for(let o=0;o<r;o++)for(let w=0;w<t;w++){var m;c=4*(o*t+w);if(2!=s)m=[N(e[c]+g[c]),N(e[c+1]+g[c+1]),N(e[c+2]+g[c+2]),N(e[c+3]+g[c+3])];else{d=p[4*(3&o)+(3&w)];m=[N(e[c]+d),N(e[c+1]+d),N(e[c+2]+d),N(e[c+3]+d)]}u=0;let v=16777215;for(h=0;h<f;h++){const e=D(m,l[h]);e<v&&(v=e,u=h)}const b=l[u],y=[m[0]-b[0],m[1]-b[1],m[2]-b[2],m[3]-b[3]];1==s&&(w!=t-1&&addErr(y,g,c+4,7),o!=r-1&&(0!=w&&addErr(y,g,c+4*t-4,3),addErr(y,g,c+4*t,5),w!=t-1&&addErr(y,g,c+4*t+4,1))),a[c>>2]=u,A[c>>2]=i[u]}}function _main(e,r,o,a,s){null==s&&(s={});const{crc:f}=i,l=t.writeUint,c=t.writeUshort,u=t.writeASCII;let h=8;const d=e.frames.length>1;let A,g=!1,p=33+(d?20:0);if(null!=s.sRGB&&(p+=13),null!=s.pHYs&&(p+=21),null!=s.iCCP&&(A=pako.deflate(s.iCCP),p+=21+A.length+4),3==e.ctype){for(var m=e.plte.length,w=0;w<m;w++)e.plte[w]>>>24!=255&&(g=!0);p+=8+3*m+4+(g?8+1*m+4:0)}for(var v=0;v<e.frames.length;v++){d&&(p+=38),p+=(F=e.frames[v]).cimg.length+12,0!=v&&(p+=4)}p+=12;const b=new Uint8Array(p),y=[137,80,78,71,13,10,26,10];for(w=0;w<8;w++)b[w]=y[w];if(l(b,h,13),h+=4,u(b,h,\"IHDR\"),h+=4,l(b,h,r),h+=4,l(b,h,o),h+=4,b[h]=e.depth,h++,b[h]=e.ctype,h++,b[h]=0,h++,b[h]=0,h++,b[h]=0,h++,l(b,h,f(b,h-17,17)),h+=4,null!=s.sRGB&&(l(b,h,1),h+=4,u(b,h,\"sRGB\"),h+=4,b[h]=s.sRGB,h++,l(b,h,f(b,h-5,5)),h+=4),null!=s.iCCP){const e=13+A.length;l(b,h,e),h+=4,u(b,h,\"iCCP\"),h+=4,u(b,h,\"ICC profile\"),h+=11,h+=2,b.set(A,h),h+=A.length,l(b,h,f(b,h-(e+4),e+4)),h+=4}if(null!=s.pHYs&&(l(b,h,9),h+=4,u(b,h,\"pHYs\"),h+=4,l(b,h,s.pHYs[0]),h+=4,l(b,h,s.pHYs[1]),h+=4,b[h]=s.pHYs[2],h++,l(b,h,f(b,h-13,13)),h+=4),d&&(l(b,h,8),h+=4,u(b,h,\"acTL\"),h+=4,l(b,h,e.frames.length),h+=4,l(b,h,null!=s.loop?s.loop:0),h+=4,l(b,h,f(b,h-12,12)),h+=4),3==e.ctype){l(b,h,3*(m=e.plte.length)),h+=4,u(b,h,\"PLTE\"),h+=4;for(w=0;w<m;w++){const t=3*w,r=e.plte[w],i=255&r,o=r>>>8&255,a=r>>>16&255;b[h+t+0]=i,b[h+t+1]=o,b[h+t+2]=a}if(h+=3*m,l(b,h,f(b,h-3*m-4,3*m+4)),h+=4,g){l(b,h,m),h+=4,u(b,h,\"tRNS\"),h+=4;for(w=0;w<m;w++)b[h+w]=e.plte[w]>>>24&255;h+=m,l(b,h,f(b,h-m-4,m+4)),h+=4}}let E=0;for(v=0;v<e.frames.length;v++){var F=e.frames[v];d&&(l(b,h,26),h+=4,u(b,h,\"fcTL\"),h+=4,l(b,h,E++),h+=4,l(b,h,F.rect.width),h+=4,l(b,h,F.rect.height),h+=4,l(b,h,F.rect.x),h+=4,l(b,h,F.rect.y),h+=4,c(b,h,a[v]),h+=2,c(b,h,1e3),h+=2,b[h]=F.dispose,h++,b[h]=F.blend,h++,l(b,h,f(b,h-30,30)),h+=4);const t=F.cimg;l(b,h,(m=t.length)+(0==v?0:4)),h+=4;const r=h;u(b,h,0==v?\"IDAT\":\"fdAT\"),h+=4,0!=v&&(l(b,h,E++),h+=4),b.set(t,h),h+=m,l(b,h,f(b,r,h-r)),h+=4}return l(b,h,0),h+=4,u(b,h,\"IEND\"),h+=4,l(b,h,f(b,h-4,4)),h+=4,b.buffer}function compressPNG(e,t,r){for(let i=0;i<e.frames.length;i++){const o=e.frames[i];o.rect.width;const a=o.rect.height,s=new Uint8Array(a*o.bpl+a);o.cimg=_filterZero(o.img,a,o.bpp,o.bpl,s,t,r)}}function compress(t,r,i,o,a){const s=a[0],f=a[1],l=a[2],c=a[3],u=a[4],h=a[5];let d=6,A=8,g=255;for(var p=0;p<t.length;p++){const e=new Uint8Array(t[p]);for(var m=e.length,w=0;w<m;w+=4)g&=e[w+3]}const v=255!=g,b=function framize(t,r,i,o,a,s){const f=[];for(var l=0;l<t.length;l++){const h=new Uint8Array(t[l]),A=new Uint32Array(h.buffer);var c;let g=0,p=0,m=r,w=i,v=o?1:0;if(0!=l){const b=s||o||1==l||0!=f[l-2].dispose?1:2;let y=0,E=1e9;for(let e=0;e<b;e++){var u=new Uint8Array(t[l-1-e]);const o=new Uint32Array(t[l-1-e]);let s=r,f=i,c=-1,h=-1;for(let e=0;e<i;e++)for(let t=0;t<r;t++){A[d=e*r+t]!=o[d]&&(t<s&&(s=t),t>c&&(c=t),e<f&&(f=e),e>h&&(h=e))}-1==c&&(s=f=c=h=0),a&&(1==(1&s)&&s--,1==(1&f)&&f--);const v=(c-s+1)*(h-f+1);v<E&&(E=v,y=e,g=s,p=f,m=c-s+1,w=h-f+1)}u=new Uint8Array(t[l-1-y]);1==y&&(f[l-1].dispose=2),c=new Uint8Array(m*w*4),e(u,r,i,c,m,w,-g,-p,0),v=e(h,r,i,c,m,w,-g,-p,3)?1:0,1==v?_prepareDiff(h,r,i,c,{x:g,y:p,width:m,height:w}):e(h,r,i,c,m,w,-g,-p,0)}else c=h.slice(0);f.push({rect:{x:g,y:p,width:m,height:w},img:c,blend:v,dispose:0})}if(o)for(l=0;l<f.length;l++){if(1==(A=f[l]).blend)continue;const e=A.rect,o=f[l-1].rect,s=Math.min(e.x,o.x),c=Math.min(e.y,o.y),u={x:s,y:c,width:Math.max(e.x+e.width,o.x+o.width)-s,height:Math.max(e.y+e.height,o.y+o.height)-c};f[l-1].dispose=1,l-1!=0&&_updateFrame(t,r,i,f,l-1,u,a),_updateFrame(t,r,i,f,l,u,a)}let h=0;if(1!=t.length)for(var d=0;d<f.length;d++){var A;h+=(A=f[d]).rect.width*A.rect.height}return f}(t,r,i,s,f,l),y={},E=[],F=[];if(0!=o){const e=[];for(w=0;w<b.length;w++)e.push(b[w].img.buffer);const t=function concatRGBA(e){let t=0;for(var r=0;r<e.length;r++)t+=e[r].byteLength;const i=new Uint8Array(t);let o=0;for(r=0;r<e.length;r++){const t=new Uint8Array(e[r]),a=t.length;for(let e=0;e<a;e+=4){let r=t[e],a=t[e+1],s=t[e+2];const f=t[e+3];0==f&&(r=a=s=0),i[o+e]=r,i[o+e+1]=a,i[o+e+2]=s,i[o+e+3]=f}o+=a}return i.buffer}(e),r=quantize(t,o);for(w=0;w<r.plte.length;w++)E.push(r.plte[w].est.rgba);let i=0;for(w=0;w<b.length;w++){const e=(B=b[w]).img.length;var _=new Uint8Array(r.inds.buffer,i>>2,e>>2);F.push(_);const t=new Uint8Array(r.abuf,i,e);h&&dither(B.img,B.rect.width,B.rect.height,E,t,_),B.img.set(t),i+=e}}else for(p=0;p<b.length;p++){var B=b[p];const e=new Uint32Array(B.img.buffer);var U=B.rect.width;m=e.length,_=new Uint8Array(m);F.push(_);for(w=0;w<m;w++){const t=e[w];if(0!=w&&t==e[w-1])_[w]=_[w-1];else if(w>U&&t==e[w-U])_[w]=_[w-U];else{let e=y[t];if(null==e&&(y[t]=e=E.length,E.push(t),E.length>=300))break;_[w]=e}}}const C=E.length;C<=256&&0==u&&(A=C<=2?1:C<=4?2:C<=16?4:8,A=Math.max(A,c));for(p=0;p<b.length;p++){(B=b[p]).rect.x,B.rect.y;U=B.rect.width;const e=B.rect.height;let t=B.img;new Uint32Array(t.buffer);let r=4*U,i=4;if(C<=256&&0==u){r=Math.ceil(A*U/8);var I=new Uint8Array(r*e);const o=F[p];for(let t=0;t<e;t++){w=t*r;const e=t*U;if(8==A)for(var Q=0;Q<U;Q++)I[w+Q]=o[e+Q];else if(4==A)for(Q=0;Q<U;Q++)I[w+(Q>>1)]|=o[e+Q]<<4-4*(1&Q);else if(2==A)for(Q=0;Q<U;Q++)I[w+(Q>>2)]|=o[e+Q]<<6-2*(3&Q);else if(1==A)for(Q=0;Q<U;Q++)I[w+(Q>>3)]|=o[e+Q]<<7-1*(7&Q)}t=I,d=3,i=1}else if(0==v&&1==b.length){I=new Uint8Array(U*e*3);const o=U*e;for(w=0;w<o;w++){const e=3*w,r=4*w;I[e]=t[r],I[e+1]=t[r+1],I[e+2]=t[r+2]}t=I,d=2,i=3,r=3*U}B.img=t,B.bpl=r,B.bpp=i}return{ctype:d,depth:A,plte:E,frames:b}}function _updateFrame(t,r,i,o,a,s,f){const l=Uint8Array,c=Uint32Array,u=new l(t[a-1]),h=new c(t[a-1]),d=a+1<t.length?new l(t[a+1]):null,A=new l(t[a]),g=new c(A.buffer);let p=r,m=i,w=-1,v=-1;for(let e=0;e<s.height;e++)for(let t=0;t<s.width;t++){const i=s.x+t,f=s.y+e,l=f*r+i,c=g[l];0==c||0==o[a-1].dispose&&h[l]==c&&(null==d||0!=d[4*l+3])||(i<p&&(p=i),i>w&&(w=i),f<m&&(m=f),f>v&&(v=f))}-1==w&&(p=m=w=v=0),f&&(1==(1&p)&&p--,1==(1&m)&&m--),s={x:p,y:m,width:w-p+1,height:v-m+1};const b=o[a];b.rect=s,b.blend=1,b.img=new Uint8Array(s.width*s.height*4),0==o[a-1].dispose?(e(u,r,i,b.img,s.width,s.height,-s.x,-s.y,0),_prepareDiff(A,r,i,b.img,s)):e(A,r,i,b.img,s.width,s.height,-s.x,-s.y,0)}function _prepareDiff(t,r,i,o,a){e(t,r,i,o,a.width,a.height,-a.x,-a.y,2)}function _filterZero(e,t,r,i,o,a,s){const f=[];let l,c=[0,1,2,3,4];-1!=a?c=[a]:(t*i>5e5||1==r)&&(c=[0]),s&&(l={level:0});const u=UZIP;for(var h=0;h<c.length;h++){for(let a=0;a<t;a++)_filterLine(o,e,a,i,r,c[h]);f.push(u.deflate(o,l))}let d,A=1e9;for(h=0;h<f.length;h++)f[h].length<A&&(d=h,A=f[h].length);return f[d]}function _filterLine(e,t,i,o,a,s){const f=i*o;let l=f+i;if(e[l]=s,l++,0==s)if(o<500)for(var c=0;c<o;c++)e[l+c]=t[f+c];else e.set(new Uint8Array(t.buffer,f,o),l);else if(1==s){for(c=0;c<a;c++)e[l+c]=t[f+c];for(c=a;c<o;c++)e[l+c]=t[f+c]-t[f+c-a]+256&255}else if(0==i){for(c=0;c<a;c++)e[l+c]=t[f+c];if(2==s)for(c=a;c<o;c++)e[l+c]=t[f+c];if(3==s)for(c=a;c<o;c++)e[l+c]=t[f+c]-(t[f+c-a]>>1)+256&255;if(4==s)for(c=a;c<o;c++)e[l+c]=t[f+c]-r(t[f+c-a],0,0)+256&255}else{if(2==s)for(c=0;c<o;c++)e[l+c]=t[f+c]+256-t[f+c-o]&255;if(3==s){for(c=0;c<a;c++)e[l+c]=t[f+c]+256-(t[f+c-o]>>1)&255;for(c=a;c<o;c++)e[l+c]=t[f+c]+256-(t[f+c-o]+t[f+c-a]>>1)&255}if(4==s){for(c=0;c<a;c++)e[l+c]=t[f+c]+256-r(0,t[f+c-o],0)&255;for(c=a;c<o;c++)e[l+c]=t[f+c]+256-r(t[f+c-a],t[f+c-o],t[f+c-a-o])&255}}}function quantize(e,t){const r=new Uint8Array(e),i=r.slice(0),o=new Uint32Array(i.buffer),a=getKDtree(i,t),s=a[0],f=a[1],l=r.length,c=new Uint8Array(l>>2);let u;if(r.length<2e7)for(var h=0;h<l;h+=4){u=getNearest(s,d=r[h]*(1/255),A=r[h+1]*(1/255),g=r[h+2]*(1/255),p=r[h+3]*(1/255)),c[h>>2]=u.ind,o[h>>2]=u.est.rgba}else for(h=0;h<l;h+=4){var d=r[h]*(1/255),A=r[h+1]*(1/255),g=r[h+2]*(1/255),p=r[h+3]*(1/255);for(u=s;u.left;)u=planeDst(u.est,d,A,g,p)<=0?u.left:u.right;c[h>>2]=u.ind,o[h>>2]=u.est.rgba}return{abuf:i.buffer,inds:c,plte:f}}function getKDtree(e,t,r){null==r&&(r=1e-4);const i=new Uint32Array(e.buffer),o={i0:0,i1:e.length,bst:null,est:null,tdst:0,left:null,right:null};o.bst=stats(e,o.i0,o.i1),o.est=estats(o.bst);const a=[o];for(;a.length<t;){let t=0,o=0;for(var s=0;s<a.length;s++)a[s].est.L>t&&(t=a[s].est.L,o=s);if(t<r)break;const f=a[o],l=splitPixels(e,i,f.i0,f.i1,f.est.e,f.est.eMq255);if(f.i0>=l||f.i1<=l){f.est.L=0;continue}const c={i0:f.i0,i1:l,bst:null,est:null,tdst:0,left:null,right:null};c.bst=stats(e,c.i0,c.i1),c.est=estats(c.bst);const u={i0:l,i1:f.i1,bst:null,est:null,tdst:0,left:null,right:null};u.bst={R:[],m:[],N:f.bst.N-c.bst.N};for(s=0;s<16;s++)u.bst.R[s]=f.bst.R[s]-c.bst.R[s];for(s=0;s<4;s++)u.bst.m[s]=f.bst.m[s]-c.bst.m[s];u.est=estats(u.bst),f.left=c,f.right=u,a[o]=c,a.push(u)}a.sort(((e,t)=>t.bst.N-e.bst.N));for(s=0;s<a.length;s++)a[s].ind=s;return[o,a]}function getNearest(e,t,r,i,o){if(null==e.left)return e.tdst=function dist(e,t,r,i,o){const a=t-e[0],s=r-e[1],f=i-e[2],l=o-e[3];return a*a+s*s+f*f+l*l}(e.est.q,t,r,i,o),e;const a=planeDst(e.est,t,r,i,o);let s=e.left,f=e.right;a>0&&(s=e.right,f=e.left);const l=getNearest(s,t,r,i,o);if(l.tdst<=a*a)return l;const c=getNearest(f,t,r,i,o);return c.tdst<l.tdst?c:l}function planeDst(e,t,r,i,o){const{e:a}=e;return a[0]*t+a[1]*r+a[2]*i+a[3]*o-e.eMq}function splitPixels(e,t,r,i,o,a){for(i-=4;r<i;){for(;vecDot(e,r,o)<=a;)r+=4;for(;vecDot(e,i,o)>a;)i-=4;if(r>=i)break;const s=t[r>>2];t[r>>2]=t[i>>2],t[i>>2]=s,r+=4,i-=4}for(;vecDot(e,r,o)>a;)r-=4;return r+4}function vecDot(e,t,r){return e[t]*r[0]+e[t+1]*r[1]+e[t+2]*r[2]+e[t+3]*r[3]}function stats(e,t,r){const i=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],o=[0,0,0,0],a=r-t>>2;for(let a=t;a<r;a+=4){const t=e[a]*(1/255),r=e[a+1]*(1/255),s=e[a+2]*(1/255),f=e[a+3]*(1/255);o[0]+=t,o[1]+=r,o[2]+=s,o[3]+=f,i[0]+=t*t,i[1]+=t*r,i[2]+=t*s,i[3]+=t*f,i[5]+=r*r,i[6]+=r*s,i[7]+=r*f,i[10]+=s*s,i[11]+=s*f,i[15]+=f*f}return i[4]=i[1],i[8]=i[2],i[9]=i[6],i[12]=i[3],i[13]=i[7],i[14]=i[11],{R:i,m:o,N:a}}function estats(e){const{R:t}=e,{m:r}=e,{N:i}=e,a=r[0],s=r[1],f=r[2],l=r[3],c=0==i?0:1/i,u=[t[0]-a*a*c,t[1]-a*s*c,t[2]-a*f*c,t[3]-a*l*c,t[4]-s*a*c,t[5]-s*s*c,t[6]-s*f*c,t[7]-s*l*c,t[8]-f*a*c,t[9]-f*s*c,t[10]-f*f*c,t[11]-f*l*c,t[12]-l*a*c,t[13]-l*s*c,t[14]-l*f*c,t[15]-l*l*c],h=u,d=o;let A=[Math.random(),Math.random(),Math.random(),Math.random()],g=0,p=0;if(0!=i)for(let e=0;e<16&&(A=d.multVec(h,A),p=Math.sqrt(d.dot(A,A)),A=d.sml(1/p,A),!(0!=e&&Math.abs(p-g)<1e-9));e++)g=p;const m=[a*c,s*c,f*c,l*c];return{Cov:u,q:m,e:A,L:g,eMq255:d.dot(d.sml(255,m),A),eMq:d.dot(A,m),rgba:(Math.round(255*m[3])<<24|Math.round(255*m[2])<<16|Math.round(255*m[1])<<8|Math.round(255*m[0])<<0)>>>0}}var o={multVec:(e,t)=>[e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3],e[4]*t[0]+e[5]*t[1]+e[6]*t[2]+e[7]*t[3],e[8]*t[0]+e[9]*t[1]+e[10]*t[2]+e[11]*t[3],e[12]*t[0]+e[13]*t[1]+e[14]*t[2]+e[15]*t[3]],dot:(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3],sml:(e,t)=>[e*t[0],e*t[1],e*t[2],e*t[3]]};UPNG.encode=function encode(e,t,r,i,o,a,s){null==i&&(i=0),null==s&&(s=!1);const f=compress(e,t,r,i,[!1,!1,!1,0,s,!1]);return compressPNG(f,-1),_main(f,t,r,o,a)},UPNG.encodeLL=function encodeLL(e,t,r,i,o,a,s,f){const l={ctype:0+(1==i?0:2)+(0==o?0:4),depth:a,frames:[]},c=(i+o)*a,u=c*t;for(let i=0;i<e.length;i++)l.frames.push({rect:{x:0,y:0,width:t,height:r},img:new Uint8Array(e[i]),blend:0,dispose:1,bpp:Math.ceil(c/8),bpl:Math.ceil(u/8)});return compressPNG(l,0,!0),_main(l,t,r,s,f)},UPNG.encode.compress=compress,UPNG.encode.dither=dither,UPNG.quantize=quantize,UPNG.quantize.getKDtree=getKDtree,UPNG.quantize.getNearest=getNearest}();const r={toArrayBuffer(e,t){const i=e.width,o=e.height,a=i<<2,s=e.getContext(\"2d\").getImageData(0,0,i,o),f=new Uint32Array(s.data.buffer),l=(32*i+31)/32<<2,c=l*o,u=122+c,h=new ArrayBuffer(u),d=new DataView(h),A=1<<20;let g,p,m,w,v=A,b=0,y=0,E=0;function set16(e){d.setUint16(y,e,!0),y+=2}function set32(e){d.setUint32(y,e,!0),y+=4}function seek(e){y+=e}set16(19778),set32(u),seek(4),set32(122),set32(108),set32(i),set32(-o>>>0),set16(1),set16(32),set32(3),set32(c),set32(2835),set32(2835),seek(8),set32(16711680),set32(65280),set32(255),set32(4278190080),set32(1466527264),function convert(){for(;b<o&&v>0;){for(w=122+b*l,g=0;g<a;)v--,p=f[E++],m=p>>>24,d.setUint32(w+g,p<<8|m),g+=4;b++}E<f.length?(v=A,setTimeout(convert,r._dly)):t(h)}()},toBlob(e,t){this.toArrayBuffer(e,(e=>{t(new Blob([e],{type:\"image/bmp\"}))}))},_dly:9};var i={CHROME:\"CHROME\",FIREFOX:\"FIREFOX\",DESKTOP_SAFARI:\"DESKTOP_SAFARI\",IE:\"IE\",IOS:\"IOS\",ETC:\"ETC\"},o={[i.CHROME]:16384,[i.FIREFOX]:11180,[i.DESKTOP_SAFARI]:16384,[i.IE]:8192,[i.IOS]:4096,[i.ETC]:8192};const a=\"undefined\"!=typeof window,s=\"undefined\"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,f=a&&window.cordova&&window.cordova.require&&window.cordova.require(\"cordova/modulemapper\"),CustomFile=(a||s)&&(f&&f.getOriginalSymbol(window,\"File\")||\"undefined\"!=typeof File&&File),CustomFileReader=(a||s)&&(f&&f.getOriginalSymbol(window,\"FileReader\")||\"undefined\"!=typeof FileReader&&FileReader);function getFilefromDataUrl(e,t,r=Date.now()){return new Promise((i=>{const o=e.split(\",\"),a=o[0].match(/:(.*?);/)[1],s=globalThis.atob(o[1]);let f=s.length;const l=new Uint8Array(f);for(;f--;)l[f]=s.charCodeAt(f);const c=new Blob([l],{type:a});c.name=t,c.lastModified=r,i(c)}))}function getDataUrlFromFile(e){return new Promise(((t,r)=>{const i=new CustomFileReader;i.onload=()=>t(i.result),i.onerror=e=>r(e),i.readAsDataURL(e)}))}function loadImage(e){return new Promise(((t,r)=>{const i=new Image;i.onload=()=>t(i),i.onerror=e=>r(e),i.src=e}))}function getBrowserName(){if(void 0!==getBrowserName.cachedResult)return getBrowserName.cachedResult;let e=i.ETC;const{userAgent:t}=navigator;return/Chrom(e|ium)/i.test(t)?e=i.CHROME:/iP(ad|od|hone)/i.test(t)&&/WebKit/i.test(t)?e=i.IOS:/Safari/i.test(t)?e=i.DESKTOP_SAFARI:/Firefox/i.test(t)?e=i.FIREFOX:(/MSIE/i.test(t)||!0==!!document.documentMode)&&(e=i.IE),getBrowserName.cachedResult=e,getBrowserName.cachedResult}function approximateBelowMaximumCanvasSizeOfBrowser(e,t){const r=getBrowserName(),i=o[r];let a=e,s=t,f=a*s;const l=a>s?s/a:a/s;for(;f>i*i;){const e=(i+a)/2,t=(i+s)/2;e<t?(s=t,a=t*l):(s=e*l,a=e),f=a*s}return{width:a,height:s}}function getNewCanvasAndCtx(e,t){let r,i;try{if(r=new OffscreenCanvas(e,t),i=r.getContext(\"2d\"),null===i)throw new Error(\"getContext of OffscreenCanvas returns null\")}catch(e){r=document.createElement(\"canvas\"),i=r.getContext(\"2d\")}return r.width=e,r.height=t,[r,i]}function drawImageInCanvas(e,t){const{width:r,height:i}=approximateBelowMaximumCanvasSizeOfBrowser(e.width,e.height),[o,a]=getNewCanvasAndCtx(r,i);return t&&/jpe?g/.test(t)&&(a.fillStyle=\"white\",a.fillRect(0,0,o.width,o.height)),a.drawImage(e,0,0,o.width,o.height),o}function isIOS(){return void 0!==isIOS.cachedResult||(isIOS.cachedResult=[\"iPad Simulator\",\"iPhone Simulator\",\"iPod Simulator\",\"iPad\",\"iPhone\",\"iPod\"].includes(navigator.platform)||navigator.userAgent.includes(\"Mac\")&&\"undefined\"!=typeof document&&\"ontouchend\"in document),isIOS.cachedResult}function drawFileInCanvas(e,t={}){return new Promise((function(r,o){let a,s;var $Try_2_Post=function(){try{return s=drawImageInCanvas(a,t.fileType||e.type),r([a,s])}catch(e){return o(e)}},$Try_2_Catch=function(t){try{0;var $Try_3_Catch=function(e){try{throw e}catch(e){return o(e)}};try{let t;return getDataUrlFromFile(e).then((function(e){try{return t=e,loadImage(t).then((function(e){try{return a=e,function(){try{return $Try_2_Post()}catch(e){return o(e)}}()}catch(e){return $Try_3_Catch(e)}}),$Try_3_Catch)}catch(e){return $Try_3_Catch(e)}}),$Try_3_Catch)}catch(e){$Try_3_Catch(e)}}catch(e){return o(e)}};try{if(isIOS()||[i.DESKTOP_SAFARI,i.MOBILE_SAFARI].includes(getBrowserName()))throw new Error(\"Skip createImageBitmap on IOS and Safari\");return createImageBitmap(e).then((function(e){try{return a=e,$Try_2_Post()}catch(e){return $Try_2_Catch()}}),$Try_2_Catch)}catch(e){$Try_2_Catch()}}))}function canvasToFile(e,t,i,o,a=1){return new Promise((function(s,f){let l;if(\"image/png\"===t){let c,u,h;return c=e.getContext(\"2d\"),({data:u}=c.getImageData(0,0,e.width,e.height)),h=UPNG.encode([u.buffer],e.width,e.height,4096*a),l=new Blob([h],{type:t}),l.name=i,l.lastModified=o,$If_4.call(this)}{if(\"image/bmp\"===t)return new Promise((t=>r.toBlob(e,t))).then(function(e){try{return l=e,l.name=i,l.lastModified=o,$If_5.call(this)}catch(e){return f(e)}}.bind(this),f);{if(\"function\"==typeof OffscreenCanvas&&e instanceof OffscreenCanvas)return e.convertToBlob({type:t,quality:a}).then(function(e){try{return l=e,l.name=i,l.lastModified=o,$If_6.call(this)}catch(e){return f(e)}}.bind(this),f);{let d;return d=e.toDataURL(t,a),getFilefromDataUrl(d,i,o).then(function(e){try{return l=e,$If_6.call(this)}catch(e){return f(e)}}.bind(this),f)}function $If_6(){return $If_5.call(this)}}function $If_5(){return $If_4.call(this)}}function $If_4(){return s(l)}}))}function cleanupCanvasMemory(e){e.width=0,e.height=0}function isAutoOrientationInBrowser(){return new Promise((function(e,t){let r,i,o,a,s;return void 0!==isAutoOrientationInBrowser.cachedResult?e(isAutoOrientationInBrowser.cachedResult):(r=\"data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/xABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==\",getFilefromDataUrl(\"data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/xABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==\",\"test.jpg\",Date.now()).then((function(r){try{return i=r,drawFileInCanvas(i).then((function(r){try{return o=r[1],canvasToFile(o,i.type,i.name,i.lastModified).then((function(r){try{return a=r,cleanupCanvasMemory(o),drawFileInCanvas(a).then((function(r){try{return s=r[0],isAutoOrientationInBrowser.cachedResult=1===s.width&&2===s.height,e(isAutoOrientationInBrowser.cachedResult)}catch(e){return t(e)}}),t)}catch(e){return t(e)}}),t)}catch(e){return t(e)}}),t)}catch(e){return t(e)}}),t))}))}function getExifOrientation(e){return new Promise(((t,r)=>{const i=new CustomFileReader;i.onload=e=>{const r=new DataView(e.target.result);if(65496!=r.getUint16(0,!1))return t(-2);const i=r.byteLength;let o=2;for(;o<i;){if(r.getUint16(o+2,!1)<=8)return t(-1);const e=r.getUint16(o,!1);if(o+=2,65505==e){if(1165519206!=r.getUint32(o+=2,!1))return t(-1);const e=18761==r.getUint16(o+=6,!1);o+=r.getUint32(o+4,e);const i=r.getUint16(o,e);o+=2;for(let a=0;a<i;a++)if(274==r.getUint16(o+12*a,e))return t(r.getUint16(o+12*a+8,e))}else{if(65280!=(65280&e))break;o+=r.getUint16(o,!1)}}return t(-1)},i.onerror=e=>r(e),i.readAsArrayBuffer(e)}))}function handleMaxWidthOrHeight(e,t){const{width:r}=e,{height:i}=e,{maxWidthOrHeight:o}=t;let a,s=e;return isFinite(o)&&(r>o||i>o)&&([s,a]=getNewCanvasAndCtx(r,i),r>i?(s.width=o,s.height=i/r*o):(s.width=r/i*o,s.height=o),a.drawImage(e,0,0,s.width,s.height),cleanupCanvasMemory(e)),s}function followExifOrientation(e,t){const{width:r}=e,{height:i}=e,[o,a]=getNewCanvasAndCtx(r,i);switch(t>4&&t<9?(o.width=i,o.height=r):(o.width=r,o.height=i),t){case 2:a.transform(-1,0,0,1,r,0);break;case 3:a.transform(-1,0,0,-1,r,i);break;case 4:a.transform(1,0,0,-1,0,i);break;case 5:a.transform(0,1,1,0,0,0);break;case 6:a.transform(0,1,-1,0,i,0);break;case 7:a.transform(0,-1,-1,0,i,r);break;case 8:a.transform(0,-1,1,0,0,r)}return a.drawImage(e,0,0,r,i),cleanupCanvasMemory(e),o}function compress(e,t,r=0){return new Promise((function(i,o){let a,s,f,l,c,u,h,d,A,g,p,m,w,v,b,y,E,F,_,B;function incProgress(e=5){if(t.signal&&t.signal.aborted)throw t.signal.reason;a+=e,t.onProgress(Math.min(a,100))}function setProgress(e){if(t.signal&&t.signal.aborted)throw t.signal.reason;a=Math.min(Math.max(e,a),100),t.onProgress(a)}return a=r,s=t.maxIteration||10,f=1024*t.maxSizeMB*1024,incProgress(),drawFileInCanvas(e,t).then(function(r){try{return[,l]=r,incProgress(),c=handleMaxWidthOrHeight(l,t),incProgress(),new Promise((function(r,i){var o;if(!(o=t.exifOrientation))return getExifOrientation(e).then(function(e){try{return o=e,$If_2.call(this)}catch(e){return i(e)}}.bind(this),i);function $If_2(){return r(o)}return $If_2.call(this)})).then(function(r){try{return u=r,incProgress(),isAutoOrientationInBrowser().then(function(r){try{return h=r?c:followExifOrientation(c,u),incProgress(),d=t.initialQuality||1,A=t.fileType||e.type,canvasToFile(h,A,e.name,e.lastModified,d).then(function(r){try{{if(g=r,incProgress(),p=g.size>f,m=g.size>e.size,!p&&!m)return setProgress(100),i(g);var a;function $Loop_3(){if(s--&&(b>f||b>w)){let t,r;return t=B?.95*_.width:_.width,r=B?.95*_.height:_.height,[E,F]=getNewCanvasAndCtx(t,r),F.drawImage(_,0,0,t,r),d*=\"image/png\"===A?.85:.95,canvasToFile(E,A,e.name,e.lastModified,d).then((function(e){try{return y=e,cleanupCanvasMemory(_),_=E,b=y.size,setProgress(Math.min(99,Math.floor((v-b)/(v-f)*100))),$Loop_3}catch(e){return o(e)}}),o)}return[1]}return w=e.size,v=g.size,b=v,_=h,B=!t.alwaysKeepResolution&&p,(a=function(e){for(;e;){if(e.then)return void e.then(a,o);try{if(e.pop){if(e.length)return e.pop()?$Loop_3_exit.call(this):e;e=$Loop_3}else e=e.call(this)}catch(e){return o(e)}}}.bind(this))($Loop_3);function $Loop_3_exit(){return cleanupCanvasMemory(_),cleanupCanvasMemory(E),cleanupCanvasMemory(c),cleanupCanvasMemory(h),cleanupCanvasMemory(l),setProgress(100),i(y)}}}catch(u){return o(u)}}.bind(this),o)}catch(e){return o(e)}}.bind(this),o)}catch(e){return o(e)}}.bind(this),o)}catch(e){return o(e)}}.bind(this),o)}))}const l=\"\\nlet scriptImported = false\\nself.addEventListener('message', async (e) => {\\n const { file, id, imageCompressionLibUrl, options } = e.data\\n options.onProgress = (progress) => self.postMessage({ progress, id })\\n try {\\n if (!scriptImported) {\\n // console.log('[worker] importScripts', imageCompressionLibUrl)\\n self.importScripts(imageCompressionLibUrl)\\n scriptImported = true\\n }\\n // console.log('[worker] self', self)\\n const compressedFile = await imageCompression(file, options)\\n self.postMessage({ file: compressedFile, id })\\n } catch (e) {\\n // console.error('[worker] error', e)\\n self.postMessage({ error: e.message + '\\\\n' + e.stack, id })\\n }\\n})\\n\";let c;function compressOnWebWorker(e,t){return new Promise(((r,i)=>{c||(c=function createWorkerScriptURL(e){const t=[];return\"function\"==typeof e?t.push(`(${e})()`):t.push(e),URL.createObjectURL(new Blob(t))}(l));const o=new Worker(c);o.addEventListener(\"message\",(function handler(e){if(t.signal&&t.signal.aborted)o.terminate();else if(void 0===e.data.progress){if(e.data.error)return i(new Error(e.data.error)),void o.terminate();r(e.data.file),o.terminate()}else t.onProgress(e.data.progress)})),o.addEventListener(\"error\",i),t.signal&&t.signal.addEventListener(\"abort\",(()=>{i(t.signal.reason),o.terminate()})),o.postMessage({file:e,imageCompressionLibUrl:t.libURL,options:{...t,onProgress:void 0,signal:void 0}})}))}function imageCompression(e,t){return new Promise((function(r,i){let o,a,s,f,l,c;if(o={...t},s=0,({onProgress:f}=o),o.maxSizeMB=o.maxSizeMB||Number.POSITIVE_INFINITY,l=\"boolean\"!=typeof o.useWebWorker||o.useWebWorker,delete o.useWebWorker,o.onProgress=e=>{s=e,\"function\"==typeof f&&f(s)},!(e instanceof Blob||e instanceof CustomFile))return i(new Error(\"The file given is not an instance of Blob or File\"));if(!/^image/.test(e.type))return i(new Error(\"The file given is not an image\"));if(c=\"undefined\"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,!l||\"function\"!=typeof Worker||c)return compress(e,o).then(function(e){try{return a=e,$If_4.call(this)}catch(e){return i(e)}}.bind(this),i);var u=function(){try{return $If_4.call(this)}catch(e){return i(e)}}.bind(this),$Try_1_Catch=function(t){try{return compress(e,o).then((function(e){try{return a=e,u()}catch(e){return i(e)}}),i)}catch(e){return i(e)}};try{return o.libURL=o.libURL||\"https://cdn.jsdelivr.net/npm/browser-image-compression@2.0.2/dist/browser-image-compression.js\",compressOnWebWorker(e,o).then((function(e){try{return a=e,u()}catch(e){return $Try_1_Catch()}}),$Try_1_Catch)}catch(e){$Try_1_Catch()}function $If_4(){try{a.name=e.name,a.lastModified=e.lastModified}catch(e){}try{o.preserveExif&&\"image/jpeg\"===e.type&&(!o.fileType||o.fileType&&o.fileType===e.type)&&(a=copyExifWithoutOrientation(e,a))}catch(e){}return r(a)}}))}imageCompression.getDataUrlFromFile=getDataUrlFromFile,imageCompression.getFilefromDataUrl=getFilefromDataUrl,imageCompression.loadImage=loadImage,imageCompression.drawImageInCanvas=drawImageInCanvas,imageCompression.drawFileInCanvas=drawFileInCanvas,imageCompression.canvasToFile=canvasToFile,imageCompression.getExifOrientation=getExifOrientation,imageCompression.handleMaxWidthOrHeight=handleMaxWidthOrHeight,imageCompression.followExifOrientation=followExifOrientation,imageCompression.cleanupCanvasMemory=cleanupCanvasMemory,imageCompression.isAutoOrientationInBrowser=isAutoOrientationInBrowser,imageCompression.approximateBelowMaximumCanvasSizeOfBrowser=approximateBelowMaximumCanvasSizeOfBrowser,imageCompression.copyExifWithoutOrientation=copyExifWithoutOrientation,imageCompression.getBrowserName=getBrowserName,imageCompression.version=\"2.0.2\";\n//# sourceMappingURL=browser-image-compression.mjs.map\n\n\n//# sourceURL=webpack:///./node_modules/browser-image-compression/dist/browser-image-compression.mjs?");
90
91 /***/ }),
92
93 /***/ "./node_modules/wasm-feature-detect/dist/esm/index.js":
94 /*!************************************************************!*\
95 !*** ./node_modules/wasm-feature-detect/dist/esm/index.js ***!
96 \************************************************************/
97 /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
98
99 eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"bigInt\": () => (/* binding */ bigInt),\n/* harmony export */ \"bulkMemory\": () => (/* binding */ bulkMemory),\n/* harmony export */ \"exceptions\": () => (/* binding */ exceptions),\n/* harmony export */ \"extendedConst\": () => (/* binding */ extendedConst),\n/* harmony export */ \"gc\": () => (/* binding */ gc),\n/* harmony export */ \"memory64\": () => (/* binding */ memory64),\n/* harmony export */ \"multiValue\": () => (/* binding */ multiValue),\n/* harmony export */ \"mutableGlobals\": () => (/* binding */ mutableGlobals),\n/* harmony export */ \"referenceTypes\": () => (/* binding */ referenceTypes),\n/* harmony export */ \"relaxedSimd\": () => (/* binding */ relaxedSimd),\n/* harmony export */ \"saturatedFloatToInt\": () => (/* binding */ saturatedFloatToInt),\n/* harmony export */ \"signExtensions\": () => (/* binding */ signExtensions),\n/* harmony export */ \"simd\": () => (/* binding */ simd),\n/* harmony export */ \"streamingCompilation\": () => (/* binding */ streamingCompilation),\n/* harmony export */ \"tailCall\": () => (/* binding */ tailCall),\n/* harmony export */ \"threads\": () => (/* binding */ threads)\n/* harmony export */ });\nconst bigInt=()=>(async e=>{try{return(await WebAssembly.instantiate(e)).instance.exports.b(BigInt(0))===BigInt(0)}catch(e){return!1}})(new Uint8Array([0,97,115,109,1,0,0,0,1,6,1,96,1,126,1,126,3,2,1,0,7,5,1,1,98,0,0,10,6,1,4,0,32,0,11])),bulkMemory=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,3,1,0,1,10,14,1,12,0,65,0,65,0,65,0,252,10,0,0,11])),exceptions=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,8,1,6,0,6,64,25,11,11])),extendedConst=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,5,3,1,0,1,11,9,1,0,65,1,65,2,106,11,0])),gc=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,10,2,95,1,125,0,96,0,1,107,0,3,2,1,1,10,12,1,10,0,67,0,0,0,0,251,7,0,11])),memory64=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,5,3,1,4,1])),multiValue=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,6,1,96,0,2,127,127,3,2,1,0,10,8,1,6,0,65,0,65,0,11])),mutableGlobals=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,2,8,1,1,97,1,98,3,127,1,6,6,1,127,1,65,0,11,7,5,1,1,97,3,1])),referenceTypes=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,7,1,5,0,208,112,26,11])),relaxedSimd=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,15,1,13,0,65,1,253,15,65,2,253,15,253,128,2,11])),saturatedFloatToInt=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,12,1,10,0,67,0,0,0,0,252,0,26,11])),signExtensions=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,8,1,6,0,65,0,192,26,11])),simd=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11])),streamingCompilation=()=>(async()=>\"compileStreaming\"in WebAssembly)(),tailCall=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,6,1,4,0,18,0,11])),threads=()=>(async e=>{try{return\"undefined\"!=typeof MessageChannel&&(new MessageChannel).port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(e)}catch(e){return!1}})(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]));\n\n\n//# sourceURL=webpack:///./node_modules/wasm-feature-detect/dist/esm/index.js?");
100
101 /***/ })
102
103 /******/ });
104 /************************************************************************/
105 /******/ // The module cache
106 /******/ var __webpack_module_cache__ = {};
107 /******/
108 /******/ // The require function
109 /******/ function __webpack_require__(moduleId) {
110 /******/ // Check if module is in cache
111 /******/ var cachedModule = __webpack_module_cache__[moduleId];
112 /******/ if (cachedModule !== undefined) {
113 /******/ return cachedModule.exports;
114 /******/ }
115 /******/ // Create a new module (and put it into the cache)
116 /******/ var module = __webpack_module_cache__[moduleId] = {
117 /******/ // no module.id needed
118 /******/ // no module.loaded needed
119 /******/ exports: {}
120 /******/ };
121 /******/
122 /******/ // Execute the module function
123 /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
124 /******/
125 /******/ // Return the exports of the module
126 /******/ return module.exports;
127 /******/ }
128 /******/
129 /******/ // expose the modules object (__webpack_modules__)
130 /******/ __webpack_require__.m = __webpack_modules__;
131 /******/
132 /************************************************************************/
133 /******/ /* webpack/runtime/define property getters */
134 /******/ (() => {
135 /******/ // define getter functions for harmony exports
136 /******/ __webpack_require__.d = (exports, definition) => {
137 /******/ for(var key in definition) {
138 /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
139 /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
140 /******/ }
141 /******/ }
142 /******/ };
143 /******/ })();
144 /******/
145 /******/ /* webpack/runtime/ensure chunk */
146 /******/ (() => {
147 /******/ __webpack_require__.f = {};
148 /******/ // This file contains only the entry chunk.
149 /******/ // The chunk loading function for additional chunks
150 /******/ __webpack_require__.e = (chunkId) => {
151 /******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {
152 /******/ __webpack_require__.f[key](chunkId, promises);
153 /******/ return promises;
154 /******/ }, []));
155 /******/ };
156 /******/ })();
157 /******/
158 /******/ /* webpack/runtime/get javascript chunk filename */
159 /******/ (() => {
160 /******/ // This function allow to reference async chunks
161 /******/ __webpack_require__.u = (chunkId) => {
162 /******/ // return url for filenames based on template
163 /******/ return "" + chunkId + ".bundle.js";
164 /******/ };
165 /******/ })();
166 /******/
167 /******/ /* webpack/runtime/global */
168 /******/ (() => {
169 /******/ __webpack_require__.g = (function() {
170 /******/ if (typeof globalThis === 'object') return globalThis;
171 /******/ try {
172 /******/ return this || new Function('return this')();
173 /******/ } catch (e) {
174 /******/ if (typeof window === 'object') return window;
175 /******/ }
176 /******/ })();
177 /******/ })();
178 /******/
179 /******/ /* webpack/runtime/hasOwnProperty shorthand */
180 /******/ (() => {
181 /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
182 /******/ })();
183 /******/
184 /******/ /* webpack/runtime/load script */
185 /******/ (() => {
186 /******/ var inProgress = {};
187 /******/ // data-webpack is not used as build has no uniqueName
188 /******/ // loadScript function to load a script via script tag
189 /******/ __webpack_require__.l = (url, done, key, chunkId) => {
190 /******/ if(inProgress[url]) { inProgress[url].push(done); return; }
191 /******/ var script, needAttach;
192 /******/ if(key !== undefined) {
193 /******/ var scripts = document.getElementsByTagName("script");
194 /******/ for(var i = 0; i < scripts.length; i++) {
195 /******/ var s = scripts[i];
196 /******/ if(s.getAttribute("src") == url) { script = s; break; }
197 /******/ }
198 /******/ }
199 /******/ if(!script) {
200 /******/ needAttach = true;
201 /******/ script = document.createElement('script');
202 /******/
203 /******/ script.charset = 'utf-8';
204 /******/ script.timeout = 120;
205 /******/ if (__webpack_require__.nc) {
206 /******/ script.setAttribute("nonce", __webpack_require__.nc);
207 /******/ }
208 /******/
209 /******/ script.src = url;
210 /******/ }
211 /******/ inProgress[url] = [done];
212 /******/ var onScriptComplete = (prev, event) => {
213 /******/ // avoid mem leaks in IE.
214 /******/ script.onerror = script.onload = null;
215 /******/ clearTimeout(timeout);
216 /******/ var doneFns = inProgress[url];
217 /******/ delete inProgress[url];
218 /******/ script.parentNode && script.parentNode.removeChild(script);
219 /******/ doneFns && doneFns.forEach((fn) => (fn(event)));
220 /******/ if(prev) return prev(event);
221 /******/ }
222 /******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);
223 /******/ script.onerror = onScriptComplete.bind(null, script.onerror);
224 /******/ script.onload = onScriptComplete.bind(null, script.onload);
225 /******/ needAttach && document.head.appendChild(script);
226 /******/ };
227 /******/ })();
228 /******/
229 /******/ /* webpack/runtime/make namespace object */
230 /******/ (() => {
231 /******/ // define __esModule on exports
232 /******/ __webpack_require__.r = (exports) => {
233 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
234 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
235 /******/ }
236 /******/ Object.defineProperty(exports, '__esModule', { value: true });
237 /******/ };
238 /******/ })();
239 /******/
240 /******/ /* webpack/runtime/publicPath */
241 /******/ (() => {
242 /******/ var scriptUrl;
243 /******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + "";
244 /******/ var document = __webpack_require__.g.document;
245 /******/ if (!scriptUrl && document) {
246 /******/ if (document.currentScript)
247 /******/ scriptUrl = document.currentScript.src;
248 /******/ if (!scriptUrl) {
249 /******/ var scripts = document.getElementsByTagName("script");
250 /******/ if(scripts.length) scriptUrl = scripts[scripts.length - 1].src
251 /******/ }
252 /******/ }
253 /******/ // When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration
254 /******/ // or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic.
255 /******/ if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser");
256 /******/ scriptUrl = scriptUrl.replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/");
257 /******/ __webpack_require__.p = scriptUrl;
258 /******/ })();
259 /******/
260 /******/ /* webpack/runtime/jsonp chunk loading */
261 /******/ (() => {
262 /******/ __webpack_require__.b = document.baseURI || self.location.href;
263 /******/
264 /******/ // object to store loaded and loading chunks
265 /******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
266 /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded
267 /******/ var installedChunks = {
268 /******/ "script": 0
269 /******/ };
270 /******/
271 /******/ __webpack_require__.f.j = (chunkId, promises) => {
272 /******/ // JSONP chunk loading for javascript
273 /******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;
274 /******/ if(installedChunkData !== 0) { // 0 means "already installed".
275 /******/
276 /******/ // a Promise means "currently loading".
277 /******/ if(installedChunkData) {
278 /******/ promises.push(installedChunkData[2]);
279 /******/ } else {
280 /******/ if(true) { // all chunks have JS
281 /******/ // setup Promise in chunk cache
282 /******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));
283 /******/ promises.push(installedChunkData[2] = promise);
284 /******/
285 /******/ // start chunk loading
286 /******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId);
287 /******/ // create error before stack unwound to get useful stacktrace later
288 /******/ var error = new Error();
289 /******/ var loadingEnded = (event) => {
290 /******/ if(__webpack_require__.o(installedChunks, chunkId)) {
291 /******/ installedChunkData = installedChunks[chunkId];
292 /******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined;
293 /******/ if(installedChunkData) {
294 /******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type);
295 /******/ var realSrc = event && event.target && event.target.src;
296 /******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')';
297 /******/ error.name = 'ChunkLoadError';
298 /******/ error.type = errorType;
299 /******/ error.request = realSrc;
300 /******/ installedChunkData[1](error);
301 /******/ }
302 /******/ }
303 /******/ };
304 /******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId);
305 /******/ } else installedChunks[chunkId] = 0;
306 /******/ }
307 /******/ }
308 /******/ };
309 /******/
310 /******/ // no prefetching
311 /******/
312 /******/ // no preloaded
313 /******/
314 /******/ // no HMR
315 /******/
316 /******/ // no HMR manifest
317 /******/
318 /******/ // no on chunks loaded
319 /******/
320 /******/ // install a JSONP callback for chunk loading
321 /******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => {
322 /******/ var [chunkIds, moreModules, runtime] = data;
323 /******/ // add "moreModules" to the modules object,
324 /******/ // then flag all "chunkIds" as loaded and fire callback
325 /******/ var moduleId, chunkId, i = 0;
326 /******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) {
327 /******/ for(moduleId in moreModules) {
328 /******/ if(__webpack_require__.o(moreModules, moduleId)) {
329 /******/ __webpack_require__.m[moduleId] = moreModules[moduleId];
330 /******/ }
331 /******/ }
332 /******/ if(runtime) var result = runtime(__webpack_require__);
333 /******/ }
334 /******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data);
335 /******/ for(;i < chunkIds.length; i++) {
336 /******/ chunkId = chunkIds[i];
337 /******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {
338 /******/ installedChunks[chunkId][0]();
339 /******/ }
340 /******/ installedChunks[chunkId] = 0;
341 /******/ }
342 /******/
343 /******/ }
344 /******/
345 /******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || [];
346 /******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));
347 /******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));
348 /******/ })();
349 /******/
350 /************************************************************************/
351 /******/
352 /******/ // startup
353 /******/ // Load entry module and return exports
354 /******/ // This entry module can't be inlined because the eval devtool is used.
355 /******/ var __webpack_exports__ = __webpack_require__("./assets/js/script.js");
356 /******/
357 /******/ })()
358 ;