From d77ba67d5c29a9b648f4e4b8d3c872046b331e8f Mon Sep 17 00:00:00 2001 From: mole404 <248403041+mole404@users.noreply.github.com> Date: Wed, 30 Sep 2026 08:00:46 +0800 Subject: [PATCH] =?UTF-8?q?fix(security,deps):=20=E8=AE=A4=E8=AF=81?= =?UTF-8?q?=E7=AB=AF=E7=82=B9=E8=8A=82=E6=B5=81=20+=20=E9=95=9C=E5=83=8F?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=94=B6=E6=95=9B=20+=20=E4=B8=A4=E6=9D=A1?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E5=85=AC=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 认证(src/routes/auth.php): - login / register / confirm-password 加 throttle:5,1,forgot-password 加 throttle:6,1。 实测发现登录原本并非零防护 —— Breeze 的 LoginRequest 有按(邮箱|IP)的 5 次/60 秒 RateLimiter(CACHE_DRIVER=file,真生效),它挡单账号撞库;路由级节流补的是 『换邮箱撒网 / 换 IP 轮换』这个口,两者互补。 - verification.verify(6,1) 与 verification.send(3,1) 原样未动。 - 已知取舍(未改,已登记):TrustProxies 配的是 $proxies='*',节流键取自 X-Forwarded-For 且外层 nginx 用 $proxy_add_x_forwarded_for 追加 → 客户端自带的假 XFF 会排在前面并被采信, 即限流键可伪造。修法是把信任代理收窄到 nginx 的地址/网段。 镜像信息收敛(Dockerfile): - 新增 /usr/local/etc/php/conf.d/zz-lsky-hardening.ini(expose_php=0 / display_errors=0), zz- 前缀保证不被别的 ini 覆盖;构建期用 php -r 真读回 ini_get 断言。 - 新增 /etc/apache2/conf-enabled/zz-lsky-hardening.conf(ServerTokens Prod / ServerSignature Off)。放 conf-enabled 而不是 vhost 模板:ServerTokens 是全局指令, 写进 VirtualHost 会被 Apache 拒绝加载。 - 自证从 8 条加到 9 条(新增 routes/auth.php 钉住),本地实算 9/9 通过。 依赖公告(OSV 扫描到 11 条,本次清掉两条有修复版本的): - psy/psysh v0.11.12 → v0.11.23(它在生产依赖树里、随镜像发布;Dockerfile 的 composer.lock md5 自证同步为新值),并从 osv-scanner.toml 删掉那条白名单。 - sweetalert2 11.4.6 → 11.22.4(前端依赖,会打进浏览器包)。升级后新版默认样式 div:where(.swal2-container) .swal2-input 与我们的皮肤权重打平并靠注入顺序取胜, 实测把输入框高度从 38px 压成 36.75px → 把皮肤前缀从 html 提到 html:root 修掉, 并同步 3 条断言;jsdom 290/290 全绿。 - OSV 门禁复跑:exit 0,已过滤清单里只剩 laravel 9.x 那 4 条(上游无修复版本) 与 debugbar / phpunit 等 dev-only 项。 --- Dockerfile | 64 +++++++++++++++++++++++++++++++++-- osv-scanner.toml | 39 +++++++-------------- src/composer.lock | 20 ++++++----- src/package-lock.json | 16 ++++----- src/package.json | 2 +- src/public/css/common.css | 2 +- src/public/js/app.js | 2 +- src/resources/css/common.less | 9 +++-- src/routes/auth.php | 21 +++++++++--- test/package-lock.json | 11 +++--- test/package.json | 4 +-- test/swal-theme.test.mjs | 40 +++++++++++++++------- 12 files changed, 157 insertions(+), 73 deletions(-) diff --git a/Dockerfile b/Dockerfile index 45f6b4e..c662b16 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,6 +16,11 @@ # 4. install-php-extensions 钉到具体版本,不再用 latest # 5. 构建期自证:① 我们从不修改的上游文件按上游 md5 校验(快照没被动过) # ② 补丁产物与「有意偏离上游」的 composer.lock 按预期 md5 校验(改了不更新就构建失败) +# 6. 运行时加固(F23,2026-09-30):PHP 关掉 expose_php / display_errors +# (/usr/local/etc/php/conf.d/zz-lsky-hardening.ini)、Apache 关掉版本号外泄 +# (/etc/apache2/conf-enabled/zz-lsky-hardening.conf:ServerTokens Prod + ServerSignature Off), +# 两处都带构建期断言;CI 的「Verify published image」再对真实响应头断言一次。 +# 7. 认证类 POST 加路由级节流(src/routes/auth.php:login/register/forgot-password/confirm-password) # # 构建:docker build -t lsky-pro-docker . # --------------------------------------------------------------------------- @@ -104,10 +109,14 @@ RUN printf '%s\n' \ # app/Services/ImageService.php 同样是有意偏离的:移除 SVG 支持时删掉了几个「只可能因为 # svg 数据而命中」的分支(上传跳过图片处理 / 跳过违规扫描的 in_array svg、makeThumbnail # 里 svg 直拷原文件),详见 README「与上游的差异」第 7 条。 -# 这三个文件以后只要被改动(哪怕手滑),构建就会红 —— md5 必须随改动同步更新。 +# routes/auth.php 也是有意偏离(F23 防爆破):给 login / register / forgot-password / +# confirm-password 四个 POST 端点加了 throttle(详见文件内注释)。它同样被钉住, +# 改了不更新这行 md5 就构建失败。 +# 这几个文件以后只要被改动(哪怕手滑),构建就会红 —— md5 必须随改动同步更新。 RUN printf '%s\n' \ '8136e73b50315d783f105dd4ac9971bb ./config/convention.php' \ 'f6167a0726f8f2892494952a14c2bf49 ./routes/web.php' \ + 'c1ab546f3e7f5237c1d45435171858ce ./routes/auth.php' \ 'e7edc0fc9dc8c654c4debca0e1d2eac4 ./app/Services/ImageService.php' \ | md5sum -c - @@ -117,10 +126,13 @@ RUN printf '%s\n' \ # laravel/framework 9.52.22(9.x 最后一个补丁;9.52.21 -> 9.52.22 是一次安全修复)、symfony/* 6.4 LTS(Laravel 9 的 ^6.0 允许)、 # guzzlehttp/guzzle 7.15.5、guzzlehttp/psr7 2.13.1、phpseclib 3.0.57、 # league/commonmark 2.10.3、aws/aws-sdk-php 3.398.1、laminas-diactoros 2.26.0 +# psy/psysh 0.11.23(2026-09-30:原 0.11.12 有 GHSA-4486-gxhx-5mg7 —— CWD 下 .psysh.php 自动加载 +# 导致本地提权;上游在同一条 0.11 线发了修复,随 laravel/tinker 一起进镜像,故一并升掉。 +# osv-scanner.toml 里对应那条白名单已随之删除=扫描真的干净,而不是被豁免。) # —— 修掉了除「Laravel 9 框架自身那几条(9.x 线没有修复版本)」以外的已知公告。 # 所以它不再等于上游值 —— 但仍钉 md5:任何改动都必须同步更新这里(防止有人别处悄悄改)。 RUN printf '%s\n' \ - '47dc4ba720293bffe2d3ee1992775e02 ./composer.lock' \ + '12ab233331630b2dd1c48cee9e5ce927 ./composer.lock' \ | md5sum -c - # --no-dev:镜像只装运行时依赖。开发包(debugbar / ignition / whoops / phpunit / faker / sail…) @@ -242,6 +254,33 @@ RUN sed -i \ && ! grep -rn '/etc/ssl/certs/ssl-cert-snakeoil\|/etc/ssl/private/ssl-cert-snakeoil' /etc/apache2/ \ && grep -q 'lsky-selfsigned.crt' /etc/apache2/sites-available/default-ssl.conf +# --------------------------------------------------------------------------- +# F23:Apache 版本号外泄 —— 关掉 Server 头里的精确版本与页脚签名。 +# 实测(2026-09-30,本机 docker run 已发布镜像):响应头 `Server: Apache/2.4.68 (Debian)`。 +# (同一次探测还看到 `X-Powered-By: PHP/8.3.35` —— 那条由下面的 PHP ini 加固负责。) +# ServerTokens Prod → Server 头只发 "Apache"(不带版本 / 模块 / OS); +# ServerSignature Off → 错误页与目录列表不再追加 "Apache/2.4.68 (Debian) Server at …" 页脚 +# (Debian 出厂默认本就是 Off,这里显式写死:基镜像换版本时默认值可能变)。 +# 为什么放 conf-enabled 的独立文件、而不是 000-default.conf.template 那个 vhost 模板: +# ① ServerTokens 是**全局(main server config)指令**,写进 里 Apache 会直接 +# 拒绝加载该配置("ServerTokens not allowed in context")→ 整站起不来; +# 它必须落在全局上下文,而模板整份就是 vhost。 +# ② 那个模板同时管 HTTPS vhost、目录权限等一堆东西,改它等于改 vhost 行为,风险面远大于 +# 「加一个 conf-enabled 文件」。 +# ③ apache2.conf 先 IncludeOptional mods-enabled/ 再 IncludeOptional conf-enabled/,入口 +# 脚本写 mpm.conf 也走这里;conf-enabled 不会被入口脚本覆写,换镜像照样生效。 +# 构建期自证:① 文件真的在;② 两行**逐行精确**在里面(grep -qx,不是模糊包含)。 +# 语法由真容器自证(CI 的 smoke 步骤会起容器跑 Apache,配置写错站点就起不来)。 +# --------------------------------------------------------------------------- +RUN printf '%s\n' \ + '# fork 加固(F23):不对外泄露 Apache 精确版本' \ + 'ServerTokens Prod' \ + 'ServerSignature Off' \ + > /etc/apache2/conf-enabled/zz-lsky-hardening.conf \ + && test -f /etc/apache2/conf-enabled/zz-lsky-hardening.conf \ + && grep -qx 'ServerTokens Prod' /etc/apache2/conf-enabled/zz-lsky-hardening.conf \ + && grep -qx 'ServerSignature Off' /etc/apache2/conf-enabled/zz-lsky-hardening.conf + # ftp 必须**显式**装进运行时镜像:官方 php:8.1 镜像自带 ftp,php:8.3 的没有 # (2026-09-28 换 8.3 时 CI 实测:builder 阶段 composer install 直接失败, # 报 league/flysystem-ftp requires ext-ftp)。它是 Lsky 的 FTP 存储驱动要用的扩展, @@ -275,6 +314,27 @@ RUN apt-get update && \ chown -R www-data:root /var/www; \ chmod -R g=u /var/www +# --------------------------------------------------------------------------- +# F23:PHP ini 加固 —— 关掉「版本号外泄」与「错误直出」。 +# 实测(2026-09-30,本机 docker run 已发布镜像):响应头带 `X-Powered-By: PHP/8.3.35`。 +# 官方 php 镜像**不带 php.ini**(只有 php.ini-production/-development 两个样本),于是 +# PHP 编译期的默认值直接生效:expose_php=1、display_errors=1。 +# expose_php=0 → 不再发 X-Powered-By(少给扫描器一条精确版本情报); +# display_errors=0 → 运行期错误不往 HTTP 响应里吐(Laravel 自己的错误处理/日志不受影响)。 +# 文件名用 zz- 前缀:conf.d 里的 ini 按**文件名 ASCII 序**加载、后加载的覆盖先前的, +# zz- 排最后 = 以后基镜像或扩展安装器再加什么 ini,都盖不掉这两项(顺序就是这里的关键)。 +# 只改镜像的 PHP 配置,不碰应用代码,也不动现有那几份 ini(upload / opcache / memory)。 +# 构建期自证:用 php -r **真读回 ini_get()** 断言已是关闭态 —— 不是 grep 配置文件里有没有那两行 +# (那只证明"文件写了",证明不了"PHP 真的读到了")。判定用 filter_var(FILTER_VALIDATE_BOOL), +# 兼容 Off / false / 0 / 空串 几种写法;CLI 与 Apache 模块用的是同一份 /usr/local/etc/php/conf.d。 +# --------------------------------------------------------------------------- +RUN printf '%s\n' \ + 'expose_php=0' \ + 'display_errors=0' \ + > /usr/local/etc/php/conf.d/zz-lsky-hardening.ini \ + && test -f /usr/local/etc/php/conf.d/zz-lsky-hardening.ini \ + && php -r 'foreach (["expose_php", "display_errors"] as $k) { if (filter_var(ini_get($k), FILTER_VALIDATE_BOOL)) { fwrite(STDERR, "ini 加固自证失败:".$k." 仍开着 (".var_export(ini_get($k), true).")".PHP_EOL); exit(1); } echo $k."=".var_export(ini_get($k), true)." 已关闭".PHP_EOL; }' + # F21:不再随镜像发货证书。 # 原来这里是 `COPY ./ssl /etc/ssl` —— 把仓库里那对 Debian snakeoil 证书(ssl/certs + ssl/private, # 在 GitHub 上人人可见)拷进镜像,模板的 HTTPS vhost 直接引用它 = 每个使用者共用同一份公开私钥。 diff --git a/osv-scanner.toml b/osv-scanner.toml index cddf288..20d1bf6 100644 --- a/osv-scanner.toml +++ b/osv-scanner.toml @@ -42,16 +42,12 @@ ignoreUntil = 2027-06-30 reason = "laravel/framework 9.x:上游修复在 12.69.0/13.30.0,9.x(EOL) 无补丁;镜像里 APP_DEBUG 关闭,调试页不对外" # ----------------------------------------------------------------------------- -# 2) psy/psysh v0.11.12 —— 生产依赖(随 laravel/tinker 进镜像) -# 上游已在 **同一条 0.11 线** 发修复(0.11.23),是可修的。 -# 但改它必须动 src/composer.lock,而 Dockerfile 对 composer.lock 有 md5 自证, -# 牵一发动全身;不在本次「只加门禁」范围内 —— 记为待办,到期前处理。 -# 想根治:把 psy/psysh 升到 >=0.11.23 并同步更新 Dockerfile 里的 lock md5 自证。 +# 2) psy/psysh —— **已修**(2026-09-30),不再需要白名单。 +# 原 v0.11.12 命中 GHSA-4486-gxhx-5mg7(CVE-2026-25129:CWD 下 .psysh.php 自动加载 +# 导致本地提权);它是**生产依赖**(随 laravel/tinker 进镜像),且上游在同一条 0.11 线 +# 发了修复。已把 src/composer.lock 升到 v0.11.23,并同步更新 Dockerfile 里的 lock md5 自证 +# (47dc4ba7… → 12ab2333…)。没有白名单兜底 —— 若 lock 被回退,这条会被扫描重新报出来。 # ----------------------------------------------------------------------------- -[[IgnoredVulns]] -id = "GHSA-4486-gxhx-5mg7" # CVE-2026-25129:CWD 下 .psysh.php 自动加载导致本地提权 -ignoreUntil = 2026-12-31 -reason = "psy/psysh 0.11.12:同线 0.11.23 已修,但升级需改 composer.lock + Dockerfile md5 自证(待办);镜像内 psysh 仅本机可触达,无远程面" # ----------------------------------------------------------------------------- # 3) maximebf/debugbar v1.18.2 —— **开发依赖**(packages-dev) @@ -79,21 +75,12 @@ ignoreUntil = 2026-12-31 reason = "phpunit 是 packages-dev 开发依赖,不进 --no-dev 镜像;同线 9.6.33 已修,升级需动 lock(待办)" # ----------------------------------------------------------------------------- -# 5) sweetalert2@11.4.6 —— 只被 test/ 的行为测试用(test/package-lock.json), -# 是测试工具链依赖,不随镜像发布(镜像里没有 sweetalert2)。 -# 上游已发 11.22.4(同线可修)→ 升级 test/package-lock.json 即可,属待办。 +# 5) sweetalert2 —— **已修**(2026-09-30),不再需要白名单。 +# 它既是 test/ 行为测试的依赖(test/package-lock.json),也作为前端依赖被打进 +# 镜像里的 public/js/app.js(resources/js/bootstrap.js 里 require 的)—— 所以本轮 +# 把它从 11.4.6 升到 11.22.4(三条公告的总修复版本),src/ 与 test/ 两侧同步升。 +# 锁定后:src/package-lock.json 与 test/package-lock.json 都解析到 11.22.4 +# (swal-theme.test.mjs 有「两侧版本逐字一致」断言兜底),并重建了 public/js/app.js。 +# 三条公告(GHSA-457r-cqc8-9vj9 / GHSA-8jh9-wqpf-q52c / GHSA-pg98-6v7f-2xfv)随之消失, +# 白名单条目已删除 —— 若任一侧的锁被回退,会被扫描重新报出来。 # ----------------------------------------------------------------------------- -[[IgnoredVulns]] -id = "GHSA-457r-cqc8-9vj9" -ignoreUntil = 2026-12-31 -reason = "sweetalert2 仅为 test/ 行为测试依赖,不进镜像;同线 11.22.4 已修,升 test/package-lock.json 即消(待办)" - -[[IgnoredVulns]] -id = "GHSA-8jh9-wqpf-q52c" -ignoreUntil = 2026-12-31 -reason = "同上:test-only 依赖,不进镜像,同线可修" - -[[IgnoredVulns]] -id = "GHSA-pg98-6v7f-2xfv" -ignoreUntil = 2026-12-31 -reason = "同上:test-only 依赖,不进镜像,同线可修" diff --git a/src/composer.lock b/src/composer.lock index f5aeef3..dd14565 100644 --- a/src/composer.lock +++ b/src/composer.lock @@ -5162,16 +5162,16 @@ }, { "name": "psy/psysh", - "version": "v0.11.12", + "version": "v0.11.23", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "52cb7c47d403c31c0adc9bf7710fc355f93c20f7" + "reference": "e9ac4fae08b0bc7fb4f8391b220daa1dc55f03bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/52cb7c47d403c31c0adc9bf7710fc355f93c20f7", - "reference": "52cb7c47d403c31c0adc9bf7710fc355f93c20f7", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e9ac4fae08b0bc7fb4f8391b220daa1dc55f03bf", + "reference": "e9ac4fae08b0bc7fb4f8391b220daa1dc55f03bf", "shasum": "" }, "require": { @@ -5199,8 +5199,12 @@ ], "type": "library", "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, "branch-alias": { - "dev-main": "0.11.x-dev" + "dev-0.11": "0.11.x-dev" } }, "autoload": { @@ -5232,9 +5236,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.12" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.23" }, - "time": "2023-01-29T21:24:40+00:00" + "time": "2026-01-30T05:01:10+00:00" }, { "name": "qiniu/php-sdk", @@ -11400,5 +11404,5 @@ "php": "^8.0" }, "platform-dev": {}, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } diff --git a/src/package-lock.json b/src/package-lock.json index 11ba1ea..0acbebd 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -34,7 +34,7 @@ "postcss": "^8.4.31", "postcss-import": "^14.0.1", "resolve-url-loader": "^4.0.0", - "sweetalert2": "^11.3.3", + "sweetalert2": "11.22.4", "tailwindcss": "^3.0.0", "toastr": "^2.1.4", "viewerjs": "^1.10.2" @@ -16056,13 +16056,13 @@ } }, "node_modules/sweetalert2": { - "version": "11.4.6", - "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.4.6.tgz", - "integrity": "sha512-7UDJV8etrJQ6vJGh88k7D63qBKtwEl8JV7zIxmO2Frp8ZGQDgQQC6f9ivqiVwLRxoEyfxsn/v3T6Zykk7/vlEg==", + "version": "11.22.4", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.22.4.tgz", + "integrity": "sha512-JwcRODfozxiKmspFp+xctZ2izAmLAKbRPcoLMEW7LdugN/YmNrX1LT7hdBW87qsgupEO1ukBBuB17KzKFKW0tg==", "dev": true, "funding": { "type": "individual", - "url": "https://sweetalert2.github.io/#donations" + "url": "https://github.com/sponsors/limonte" } }, "node_modules/tableize-object": { @@ -30403,9 +30403,9 @@ } }, "sweetalert2": { - "version": "11.4.6", - "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.4.6.tgz", - "integrity": "sha512-7UDJV8etrJQ6vJGh88k7D63qBKtwEl8JV7zIxmO2Frp8ZGQDgQQC6f9ivqiVwLRxoEyfxsn/v3T6Zykk7/vlEg==", + "version": "11.22.4", + "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.22.4.tgz", + "integrity": "sha512-JwcRODfozxiKmspFp+xctZ2izAmLAKbRPcoLMEW7LdugN/YmNrX1LT7hdBW87qsgupEO1ukBBuB17KzKFKW0tg==", "dev": true }, "tableize-object": { diff --git a/src/package.json b/src/package.json index 2ebc43a..818760d 100644 --- a/src/package.json +++ b/src/package.json @@ -36,7 +36,7 @@ "postcss": "^8.4.31", "postcss-import": "^14.0.1", "resolve-url-loader": "^4.0.0", - "sweetalert2": "^11.3.3", + "sweetalert2": "11.22.4", "tailwindcss": "^3.0.0", "toastr": "^2.1.4", "viewerjs": "^1.10.2" diff --git a/src/public/css/common.css b/src/public/css/common.css index bf1eadc..fc523f1 100644 --- a/src/public/css/common.css +++ b/src/public/css/common.css @@ -1 +1 @@ -.toast-title{font-weight:700}.toast-message{-ms-word-wrap:break-word;word-wrap:break-word}.toast-message a,.toast-message label{color:#fff}.toast-message a:hover{color:#ccc;text-decoration:none}.toast-close-button{color:#fff;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=80);filter:alpha(opacity=80);float:right;font-size:20px;font-weight:700;line-height:1;opacity:.8;position:relative;right:-.3em;-webkit-text-shadow:0 1px 0 #fff;text-shadow:0 1px 0 #fff;top:-.3em}.toast-close-button:focus,.toast-close-button:hover{color:#000;cursor:pointer;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);filter:alpha(opacity=40);opacity:.4;text-decoration:none}.rtl .toast-close-button{float:left;left:-.3em;right:.3em}button.toast-close-button{-webkit-appearance:none;background:0 0;border:0;cursor:pointer;padding:0}.toast-top-center{right:0;top:0;width:100%}.toast-bottom-center{bottom:0;right:0;width:100%}.toast-top-full-width{right:0;top:0;width:100%}.toast-bottom-full-width{bottom:0;right:0;width:100%}.toast-top-left{left:12px;top:12px}.toast-top-right{right:12px;top:12px}.toast-bottom-right{bottom:12px;right:12px}.toast-bottom-left{bottom:12px;left:12px}#toast-container{pointer-events:none;position:fixed;z-index:999999}#toast-container *{box-sizing:border-box}#toast-container>div{background-position:15px;background-repeat:no-repeat;border-radius:3px;box-shadow:0 0 12px #999;color:#fff;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=80);filter:alpha(opacity=80);margin:0 0 6px;opacity:.8;overflow:hidden;padding:15px 15px 15px 50px;pointer-events:auto;position:relative;width:300px}#toast-container>div.rtl{background-position:right 15px center;direction:rtl;padding:15px 50px 15px 15px}#toast-container>div:hover{box-shadow:0 0 12px #000;cursor:pointer;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);filter:alpha(opacity=100);opacity:1}#toast-container>.toast-info{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=)!important}#toast-container>.toast-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=)!important}#toast-container>.toast-success{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==)!important}#toast-container>.toast-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=)!important}#toast-container.toast-bottom-center>div,#toast-container.toast-top-center>div{margin-left:auto;margin-right:auto;width:300px}#toast-container.toast-bottom-full-width>div,#toast-container.toast-top-full-width>div{margin-left:auto;margin-right:auto;width:96%}.toast{background-color:#030303}.toast-success{background-color:#51a351}.toast-error{background-color:#bd362f}.toast-info{background-color:#2f96b4}.toast-warning{background-color:#f89406}.toast-progress{background-color:#000;bottom:0;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);filter:alpha(opacity=40);height:4px;left:0;opacity:.4;position:absolute}@media (max-width:240px){#toast-container>div{padding:8px 8px 8px 50px;width:11em}#toast-container>div.rtl{padding:8px 50px 8px 8px}#toast-container .toast-close-button{right:-.2em;top:-.2em}#toast-container .rtl .toast-close-button{left:-.2em;right:.2em}}@media (min-width:241px) and (max-width:480px){#toast-container>div{padding:8px 8px 8px 50px;width:18em}#toast-container>div.rtl{padding:8px 50px 8px 8px}#toast-container .toast-close-button{right:-.2em;top:-.2em}#toast-container .rtl .toast-close-button{left:-.2em;right:.2em}}@media (min-width:481px) and (max-width:768px){#toast-container>div{padding:15px 15px 15px 50px;width:25em}#toast-container>div.rtl{padding:15px 50px 15px 15px}}[x-cloak]{display:none!important}.scrollbar-none::-webkit-scrollbar{display:none}.scrollbar-none{-ms-overflow-style:none;scrollbar-width:none}::-webkit-scrollbar{height:100%;min-height:8px;width:8px}::-webkit-scrollbar-thumb{background:var(--lsky-border-2);border-radius:6px}::-webkit-scrollbar-track{background:var(--lsky-surface-2);border-radius:6px}progress::-webkit-progress-bar{background-color:var(--lsky-surface-3)}progress::-webkit-progress-value{background-color:var(--lsky-accent)}#capacity-progress progress.green::-webkit-progress-value{background:#00ab00}#capacity-progress progress.yellowgreen::-webkit-progress-value{background:#9acd32}#capacity-progress progress.yellow::-webkit-progress-value{background:#b9b900}#capacity-progress progress.orange::-webkit-progress-value{background:#f90}#capacity-progress progress.red::-webkit-progress-value{background:#ff4141}#toast-container>div{font-size:13.5px;padding:10px 10px 10px 50px}#toast-container>div,#toast-container>div:hover{box-shadow:var(--lsky-shadow-pop)}.toast-close-button{right:-.15em}.viewer-backdrop{background-color:rgba(0,0,0,.75)}.infinite-scroll{display:flex;justify-content:center;justify-items:center;padding:1rem 0;width:100%}.infinite-scroll span{color:var(--lsky-text-2);cursor:pointer;display:inline-flex;font-size:.9em}.infinite-scroll span.disabled{color:var(--lsky-text-3);cursor:not-allowed}#image-movements-modal .infinite-scroll{display:none}#images-grid a.ds-selected,#images-grid a:hover{outline-color:var(--lsky-accent)}#images-grid a.ds-selected .image-selector,#images-grid a:hover .image-selector{display:block}#images-grid a.ds-selected.ds-selected .image-selector i,#images-grid a:hover.ds-selected .image-selector i{border-color:#fff;color:var(--lsky-accent)}.switch{display:inline-block;height:30px;position:relative;width:55px}.switch input{display:none}.slider{background-color:var(--lsky-border-2);bottom:0;cursor:pointer;left:0;right:0;top:0}.slider,.slider:before{position:absolute;transition:.4s}.slider:before{background-color:#fff;bottom:3px;content:"";height:24px;left:4px;width:24px}input:checked+.slider{background-color:var(--lsky-accent)}input:focus+.slider{box-shadow:0 0 0 3px var(--lsky-accent-soft)}input:checked+.slider:before{transform:translateX(23px)}.slider.round{border-radius:34px}.slider.round:before{border-radius:50%}html .swal2-container.swal2-backdrop-show,html .swal2-container.swal2-noanimation{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background:rgba(0,0,0,.5)}html .swal2-popup{background:var(--lsky-surface);border-color:var(--lsky-border);border-radius:12px;border-style:solid;border-width:1px;box-shadow:var(--lsky-shadow-modal);font-family:inherit;max-width:calc(100% - 2rem);padding:20px;width:32em}html .swal2-popup,html .swal2-title{color:var(--lsky-text);text-align:left}html .swal2-title{font-size:16px;font-weight:600;line-height:1.5;margin:0;padding:0}html .swal2-html-container{color:var(--lsky-text-2);font-size:14px;line-height:1.6;margin:8px 0 0;padding:0;text-align:left}html .swal2-icon{border-color:var(--lsky-border-2);color:var(--lsky-border-2);font-size:11px;margin:2px 0 14px}html .swal2-icon.swal2-error,html .swal2-icon.swal2-warning{border-color:var(--lsky-danger);color:var(--lsky-danger)}html .swal2-actions{gap:8px;justify-content:flex-end;margin:20px 0 0}html .swal2-styled,html .swal2-styled.swal2-cancel,html .swal2-styled.swal2-confirm,html .swal2-styled.swal2-deny{background-image:none;border:1px solid transparent;border-radius:8px;box-shadow:none;font-size:13.5px;font-weight:500;height:36px;margin:0;padding:0 14px}html .swal2-styled.swal2-confirm{background-color:var(--lsky-accent);border-color:var(--lsky-accent);color:#fff}html .swal2-styled.swal2-confirm:hover{background-color:var(--lsky-accent-hover);border-color:var(--lsky-accent-hover)}html .swal2-styled.swal2-confirm:focus{box-shadow:0 0 0 3px var(--lsky-accent-soft)}html .swal2-styled.swal2-cancel{background-color:var(--lsky-surface);border-color:var(--lsky-border-2);color:var(--lsky-text)}html .swal2-styled.swal2-cancel:hover{background-color:var(--lsky-surface-2)}html .swal2-styled.swal2-cancel:focus{box-shadow:0 0 0 3px var(--lsky-accent-soft)}html .swal2-styled.swal2-deny{background-color:var(--lsky-danger-soft);color:var(--lsky-danger)}html .swal2-popup .swal2-actions .swal2-styled:active,html .swal2-popup .swal2-actions .swal2-styled:hover{background-image:none}html .swal2-input,html .swal2-select,html .swal2-textarea{background-color:var(--lsky-surface-2);border-color:var(--lsky-border-2);border-radius:8px;border-style:solid;border-width:1px;box-shadow:none;color:var(--lsky-text);font-size:14px;height:38px;margin:12px 0 0;padding:0 12px;width:100%}html .swal2-input:focus,html .swal2-select:focus,html .swal2-textarea:focus{border-color:var(--lsky-accent);box-shadow:0 0 0 3px var(--lsky-accent-soft)}html .swal2-input::-moz-placeholder,html .swal2-textarea::-moz-placeholder{color:var(--lsky-text-3)}html .swal2-input::placeholder,html .swal2-textarea::placeholder{color:var(--lsky-text-3)}html .swal2-select{background-position:right 10px center;padding-right:28px}html .swal2-validation-message{background-color:var(--lsky-danger-soft);border-radius:8px;color:var(--lsky-danger);font-size:13px;font-weight:400;line-height:1.5;margin:12px 0 0;padding:8px 12px}html .swal2-loader{border-color:var(--lsky-accent) transparent var(--lsky-accent) transparent}html .swal2-close{color:var(--lsky-text-3);font-size:20px;height:1.2em;width:1.2em}html .swal2-close:hover{color:var(--lsky-text)}html .swal2-show{animation:lsky-swal-in .3s cubic-bezier(0,0,.2,1) both}html .swal2-hide{animation:lsky-swal-out .2s cubic-bezier(.4,0,1,1) both}@media (max-width:767px){html .swal2-show{animation-name:lsky-swal-in-mobile}html .swal2-hide{animation-name:lsky-swal-out-mobile}}html .swal2-container{transition:background-color .2s cubic-bezier(.4,0,1,1)}html .swal2-container.swal2-backdrop-show,html .swal2-container.swal2-noanimation{transition-duration:.3s;transition-timing-function:cubic-bezier(0,0,.2,1)}html body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow:visible}@keyframes lsky-swal-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes lsky-swal-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.95)}}@keyframes lsky-swal-in-mobile{0%{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}@keyframes lsky-swal-out-mobile{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(16px)}}html.dark #toast-container>div{background-color:var(--lsky-surface);background-image:none;border:1px solid var(--lsky-border);color:var(--lsky-text);opacity:.97}html.dark #toast-container>div:hover{box-shadow:var(--lsky-shadow-pop)}html.dark #toast-container .toast-progress{background-color:var(--lsky-accent)}html.dark .viewer-toolbar>ul>li{background-color:hsla(0,0%,100%,.12)}.dropdown-context .submenu-back>a>i{margin-right:7px!important}#app-sidebar{height:100vh;height:100dvh} +.toast-title{font-weight:700}.toast-message{-ms-word-wrap:break-word;word-wrap:break-word}.toast-message a,.toast-message label{color:#fff}.toast-message a:hover{color:#ccc;text-decoration:none}.toast-close-button{color:#fff;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=80);filter:alpha(opacity=80);float:right;font-size:20px;font-weight:700;line-height:1;opacity:.8;position:relative;right:-.3em;-webkit-text-shadow:0 1px 0 #fff;text-shadow:0 1px 0 #fff;top:-.3em}.toast-close-button:focus,.toast-close-button:hover{color:#000;cursor:pointer;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);filter:alpha(opacity=40);opacity:.4;text-decoration:none}.rtl .toast-close-button{float:left;left:-.3em;right:.3em}button.toast-close-button{-webkit-appearance:none;background:0 0;border:0;cursor:pointer;padding:0}.toast-top-center{right:0;top:0;width:100%}.toast-bottom-center{bottom:0;right:0;width:100%}.toast-top-full-width{right:0;top:0;width:100%}.toast-bottom-full-width{bottom:0;right:0;width:100%}.toast-top-left{left:12px;top:12px}.toast-top-right{right:12px;top:12px}.toast-bottom-right{bottom:12px;right:12px}.toast-bottom-left{bottom:12px;left:12px}#toast-container{pointer-events:none;position:fixed;z-index:999999}#toast-container *{box-sizing:border-box}#toast-container>div{background-position:15px;background-repeat:no-repeat;border-radius:3px;box-shadow:0 0 12px #999;color:#fff;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=80);filter:alpha(opacity=80);margin:0 0 6px;opacity:.8;overflow:hidden;padding:15px 15px 15px 50px;pointer-events:auto;position:relative;width:300px}#toast-container>div.rtl{background-position:right 15px center;direction:rtl;padding:15px 50px 15px 15px}#toast-container>div:hover{box-shadow:0 0 12px #000;cursor:pointer;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);filter:alpha(opacity=100);opacity:1}#toast-container>.toast-info{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGwSURBVEhLtZa9SgNBEMc9sUxxRcoUKSzSWIhXpFMhhYWFhaBg4yPYiWCXZxBLERsLRS3EQkEfwCKdjWJAwSKCgoKCcudv4O5YLrt7EzgXhiU3/4+b2ckmwVjJSpKkQ6wAi4gwhT+z3wRBcEz0yjSseUTrcRyfsHsXmD0AmbHOC9Ii8VImnuXBPglHpQ5wwSVM7sNnTG7Za4JwDdCjxyAiH3nyA2mtaTJufiDZ5dCaqlItILh1NHatfN5skvjx9Z38m69CgzuXmZgVrPIGE763Jx9qKsRozWYw6xOHdER+nn2KkO+Bb+UV5CBN6WC6QtBgbRVozrahAbmm6HtUsgtPC19tFdxXZYBOfkbmFJ1VaHA1VAHjd0pp70oTZzvR+EVrx2Ygfdsq6eu55BHYR8hlcki+n+kERUFG8BrA0BwjeAv2M8WLQBtcy+SD6fNsmnB3AlBLrgTtVW1c2QN4bVWLATaIS60J2Du5y1TiJgjSBvFVZgTmwCU+dAZFoPxGEEs8nyHC9Bwe2GvEJv2WXZb0vjdyFT4Cxk3e/kIqlOGoVLwwPevpYHT+00T+hWwXDf4AJAOUqWcDhbwAAAAASUVORK5CYII=)!important}#toast-container>.toast-error{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=)!important}#toast-container>.toast-success{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==)!important}#toast-container>.toast-warning{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=)!important}#toast-container.toast-bottom-center>div,#toast-container.toast-top-center>div{margin-left:auto;margin-right:auto;width:300px}#toast-container.toast-bottom-full-width>div,#toast-container.toast-top-full-width>div{margin-left:auto;margin-right:auto;width:96%}.toast{background-color:#030303}.toast-success{background-color:#51a351}.toast-error{background-color:#bd362f}.toast-info{background-color:#2f96b4}.toast-warning{background-color:#f89406}.toast-progress{background-color:#000;bottom:0;-ms-filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);filter:alpha(opacity=40);height:4px;left:0;opacity:.4;position:absolute}@media (max-width:240px){#toast-container>div{padding:8px 8px 8px 50px;width:11em}#toast-container>div.rtl{padding:8px 50px 8px 8px}#toast-container .toast-close-button{right:-.2em;top:-.2em}#toast-container .rtl .toast-close-button{left:-.2em;right:.2em}}@media (min-width:241px) and (max-width:480px){#toast-container>div{padding:8px 8px 8px 50px;width:18em}#toast-container>div.rtl{padding:8px 50px 8px 8px}#toast-container .toast-close-button{right:-.2em;top:-.2em}#toast-container .rtl .toast-close-button{left:-.2em;right:.2em}}@media (min-width:481px) and (max-width:768px){#toast-container>div{padding:15px 15px 15px 50px;width:25em}#toast-container>div.rtl{padding:15px 50px 15px 15px}}[x-cloak]{display:none!important}.scrollbar-none::-webkit-scrollbar{display:none}.scrollbar-none{-ms-overflow-style:none;scrollbar-width:none}::-webkit-scrollbar{height:100%;min-height:8px;width:8px}::-webkit-scrollbar-thumb{background:var(--lsky-border-2);border-radius:6px}::-webkit-scrollbar-track{background:var(--lsky-surface-2);border-radius:6px}progress::-webkit-progress-bar{background-color:var(--lsky-surface-3)}progress::-webkit-progress-value{background-color:var(--lsky-accent)}#capacity-progress progress.green::-webkit-progress-value{background:#00ab00}#capacity-progress progress.yellowgreen::-webkit-progress-value{background:#9acd32}#capacity-progress progress.yellow::-webkit-progress-value{background:#b9b900}#capacity-progress progress.orange::-webkit-progress-value{background:#f90}#capacity-progress progress.red::-webkit-progress-value{background:#ff4141}#toast-container>div{font-size:13.5px;padding:10px 10px 10px 50px}#toast-container>div,#toast-container>div:hover{box-shadow:var(--lsky-shadow-pop)}.toast-close-button{right:-.15em}.viewer-backdrop{background-color:rgba(0,0,0,.75)}.infinite-scroll{display:flex;justify-content:center;justify-items:center;padding:1rem 0;width:100%}.infinite-scroll span{color:var(--lsky-text-2);cursor:pointer;display:inline-flex;font-size:.9em}.infinite-scroll span.disabled{color:var(--lsky-text-3);cursor:not-allowed}#image-movements-modal .infinite-scroll{display:none}#images-grid a.ds-selected,#images-grid a:hover{outline-color:var(--lsky-accent)}#images-grid a.ds-selected .image-selector,#images-grid a:hover .image-selector{display:block}#images-grid a.ds-selected.ds-selected .image-selector i,#images-grid a:hover.ds-selected .image-selector i{border-color:#fff;color:var(--lsky-accent)}.switch{display:inline-block;height:30px;position:relative;width:55px}.switch input{display:none}.slider{background-color:var(--lsky-border-2);bottom:0;cursor:pointer;left:0;right:0;top:0}.slider,.slider:before{position:absolute;transition:.4s}.slider:before{background-color:#fff;bottom:3px;content:"";height:24px;left:4px;width:24px}input:checked+.slider{background-color:var(--lsky-accent)}input:focus+.slider{box-shadow:0 0 0 3px var(--lsky-accent-soft)}input:checked+.slider:before{transform:translateX(23px)}.slider.round{border-radius:34px}.slider.round:before{border-radius:50%}html:root .swal2-container.swal2-backdrop-show,html:root .swal2-container.swal2-noanimation{-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);background:rgba(0,0,0,.5)}html:root .swal2-popup{background:var(--lsky-surface);border-color:var(--lsky-border);border-radius:12px;border-style:solid;border-width:1px;box-shadow:var(--lsky-shadow-modal);color:var(--lsky-text);font-family:inherit;max-width:calc(100% - 2rem);padding:20px;text-align:left;width:32em}html:root .swal2-title{color:var(--lsky-text);font-size:16px;font-weight:600;line-height:1.5;margin:0;padding:0;text-align:left}html:root .swal2-html-container{color:var(--lsky-text-2);font-size:14px;line-height:1.6;margin:8px 0 0;padding:0;text-align:left}html:root .swal2-icon{border-color:var(--lsky-border-2);color:var(--lsky-border-2);font-size:11px;margin:2px 0 14px}html:root .swal2-icon.swal2-error,html:root .swal2-icon.swal2-warning{border-color:var(--lsky-danger);color:var(--lsky-danger)}html:root .swal2-actions{gap:8px;justify-content:flex-end;margin:20px 0 0}html:root .swal2-styled,html:root .swal2-styled.swal2-cancel,html:root .swal2-styled.swal2-confirm,html:root .swal2-styled.swal2-deny{background-image:none;border:1px solid transparent;border-radius:8px;box-shadow:none;font-size:13.5px;font-weight:500;height:36px;margin:0;padding:0 14px}html:root .swal2-styled.swal2-confirm{background-color:var(--lsky-accent);border-color:var(--lsky-accent);color:#fff}html:root .swal2-styled.swal2-confirm:hover{background-color:var(--lsky-accent-hover);border-color:var(--lsky-accent-hover)}html:root .swal2-styled.swal2-confirm:focus{box-shadow:0 0 0 3px var(--lsky-accent-soft)}html:root .swal2-styled.swal2-cancel{background-color:var(--lsky-surface);border-color:var(--lsky-border-2);color:var(--lsky-text)}html:root .swal2-styled.swal2-cancel:hover{background-color:var(--lsky-surface-2)}html:root .swal2-styled.swal2-cancel:focus{box-shadow:0 0 0 3px var(--lsky-accent-soft)}html:root .swal2-styled.swal2-deny{background-color:var(--lsky-danger-soft);color:var(--lsky-danger)}html:root .swal2-popup .swal2-actions .swal2-styled:active,html:root .swal2-popup .swal2-actions .swal2-styled:hover{background-image:none}html:root .swal2-input,html:root .swal2-select,html:root .swal2-textarea{background-color:var(--lsky-surface-2);border-color:var(--lsky-border-2);border-radius:8px;border-style:solid;border-width:1px;box-shadow:none;color:var(--lsky-text);font-size:14px;height:38px;margin:12px 0 0;padding:0 12px;width:100%}html:root .swal2-input:focus,html:root .swal2-select:focus,html:root .swal2-textarea:focus{border-color:var(--lsky-accent);box-shadow:0 0 0 3px var(--lsky-accent-soft)}html:root .swal2-input::-moz-placeholder,html:root .swal2-textarea::-moz-placeholder{color:var(--lsky-text-3)}html:root .swal2-input::placeholder,html:root .swal2-textarea::placeholder{color:var(--lsky-text-3)}html:root .swal2-select{background-position:right 10px center;padding-right:28px}html:root .swal2-validation-message{background-color:var(--lsky-danger-soft);border-radius:8px;color:var(--lsky-danger);font-size:13px;font-weight:400;line-height:1.5;margin:12px 0 0;padding:8px 12px}html:root .swal2-loader{border-color:var(--lsky-accent) transparent var(--lsky-accent) transparent}html:root .swal2-close{color:var(--lsky-text-3);font-size:20px;height:1.2em;width:1.2em}html:root .swal2-close:hover{color:var(--lsky-text)}html:root .swal2-show{animation:lsky-swal-in .3s cubic-bezier(0,0,.2,1) both}html:root .swal2-hide{animation:lsky-swal-out .2s cubic-bezier(.4,0,1,1) both}@media (max-width:767px){html:root .swal2-show{animation-name:lsky-swal-in-mobile}html:root .swal2-hide{animation-name:lsky-swal-out-mobile}}html:root .swal2-container{transition:background-color .2s cubic-bezier(.4,0,1,1)}html:root .swal2-container.swal2-backdrop-show,html:root .swal2-container.swal2-noanimation{transition-duration:.3s;transition-timing-function:cubic-bezier(0,0,.2,1)}html:root body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow:visible}@keyframes lsky-swal-in{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}@keyframes lsky-swal-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.95)}}@keyframes lsky-swal-in-mobile{0%{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}@keyframes lsky-swal-out-mobile{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(16px)}}html.dark #toast-container>div{background-color:var(--lsky-surface);background-image:none;border:1px solid var(--lsky-border);color:var(--lsky-text);opacity:.97}html.dark #toast-container>div:hover{box-shadow:var(--lsky-shadow-pop)}html.dark #toast-container .toast-progress{background-color:var(--lsky-accent)}html.dark .viewer-toolbar>ul>li{background-color:hsla(0,0%,100%,.12)}.dropdown-context .submenu-back>a>i{margin-right:7px!important}#app-sidebar{height:100vh;height:100dvh} diff --git a/src/public/js/app.js b/src/public/js/app.js index 8b695c3..d7eb948 100644 --- a/src/public/js/app.js +++ b/src/public/js/app.js @@ -1,2 +1,2 @@ /*! For license information please see app.js.LICENSE.txt */ -(()=>{var e,t={192:(e,t,n)=>{"use strict";var r,o,i,a,s=!1,u=!1,l=[];function c(e){!function(e){l.includes(e)||l.push(e);u||s||(s=!0,queueMicrotask(d))}(e)}function f(e){let t=l.indexOf(e);-1!==t&&l.splice(t,1)}function d(){s=!1,u=!0;for(let e=0;e{(void 0===t||t.includes(n))&&(r.forEach((e=>e())),delete e._x_attributeCleanups[n])}))}var b=new MutationObserver(O),x=!1;function _(){b.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0}),x=!0}function E(){(k=k.concat(b.takeRecords())).length&&!C&&(C=!0,queueMicrotask((()=>{O(k),k.length=0,C=!1}))),b.disconnect(),x=!1}var k=[],C=!1;function A(e){if(!x)return e();E();let t=e();return _(),t}var T=!1,S=[];function O(e){if(T)return void(S=S.concat(e));let t=[],n=[],r=new Map,o=new Map;for(let i=0;i1===e.nodeType&&t.push(e))),e[i].removedNodes.forEach((e=>1===e.nodeType&&n.push(e)))),"attributes"===e[i].type)){let t=e[i].target,n=e[i].attributeName,a=e[i].oldValue,s=()=>{r.has(t)||r.set(t,[]),r.get(t).push({name:n,value:t.getAttribute(n)})},u=()=>{o.has(t)||o.set(t,[]),o.get(t).push(n)};t.hasAttribute(n)&&null===a?s():t.hasAttribute(n)?(u(),s()):u()}o.forEach(((e,t)=>{w(t,e)})),r.forEach(((e,t)=>{g.forEach((n=>n(t,e)))}));for(let e of n)if(!t.includes(e)&&(m.forEach((t=>t(e))),e._x_cleanups))for(;e._x_cleanups.length;)e._x_cleanups.pop()();t.forEach((e=>{e._x_ignoreSelf=!0,e._x_ignore=!0}));for(let e of t)n.includes(e)||e.isConnected&&(delete e._x_ignoreSelf,delete e._x_ignore,y.forEach((t=>t(e))),e._x_ignore=!0,e._x_ignoreSelf=!0);t.forEach((e=>{delete e._x_ignoreSelf,delete e._x_ignore})),t=null,n=null,r=null,o=null}function j(e){return B(L(e))}function R(e,t,n){return e._x_dataStack=[t,...L(n||e)],()=>{e._x_dataStack=e._x_dataStack.filter((e=>e!==t))}}function P(e,t){let n=e._x_dataStack[0];Object.entries(t).forEach((([e,t])=>{n[e]=t}))}function L(e){return e._x_dataStack?e._x_dataStack:"function"==typeof ShadowRoot&&e instanceof ShadowRoot?L(e.host):e.parentNode?L(e.parentNode):[]}function B(e){let t=new Proxy({},{ownKeys:()=>Array.from(new Set(e.flatMap((e=>Object.keys(e))))),has:(t,n)=>e.some((e=>e.hasOwnProperty(n))),get:(n,r)=>(e.find((e=>{if(e.hasOwnProperty(r)){let n=Object.getOwnPropertyDescriptor(e,r);if(n.get&&n.get._x_alreadyBound||n.set&&n.set._x_alreadyBound)return!0;if((n.get||n.set)&&n.enumerable){let o=n.get,i=n.set,a=n;o=o&&o.bind(t),i=i&&i.bind(t),o&&(o._x_alreadyBound=!0),i&&(i._x_alreadyBound=!0),Object.defineProperty(e,r,{...a,get:o,set:i})}return!0}return!1}))||{})[r],set:(t,n,r)=>{let o=e.find((e=>e.hasOwnProperty(n)));return o?o[n]=r:e[e.length-1][n]=r,!0}});return t}function D(e){let t=(n,r="")=>{Object.entries(Object.getOwnPropertyDescriptors(n)).forEach((([o,{value:i,enumerable:a}])=>{if(!1===a||void 0===i)return;let s=""===r?o:`${r}.${o}`;var u;"object"==typeof i&&null!==i&&i._x_interceptor?n[o]=i.initialize(e,s,o):"object"!=typeof(u=i)||Array.isArray(u)||null===u||i===n||i instanceof Element||t(i,s)}))};return t(e)}function N(e,t=()=>{}){let n={initialValue:void 0,_x_interceptor:!0,initialize(t,n,r){return e(this.initialValue,(()=>function(e,t){return t.split(".").reduce(((e,t)=>e[t]),e)}(t,n)),(e=>I(t,n,e)),n,r)}};return t(n),e=>{if("object"==typeof e&&null!==e&&e._x_interceptor){let t=n.initialize.bind(n);n.initialize=(r,o,i)=>{let a=e.initialize(r,o,i);return n.initialValue=a,t(r,o,i)}}else n.initialValue=e;return n}}function I(e,t,n){if("string"==typeof t&&(t=t.split(".")),1!==t.length){if(0===t.length)throw error;return e[t[0]]||(e[t[0]]={}),I(e[t[0]],t.slice(1),n)}e[t[0]]=n}var M={};function q(e,t){M[e]=t}function U(e,t){return Object.entries(M).forEach((([n,r])=>{Object.defineProperty(e,`$${n}`,{get(){let[e,n]=oe(t);return e={interceptor:N,...e},v(t,n),r(t,e)},enumerable:!1})})),e}function z(e,t,n,...r){try{return n(...r)}catch(n){F(n,e,t)}}function F(e,t,n=void 0){Object.assign(e,{el:t,expression:n}),console.warn(`Alpine Expression Error: ${e.message}\n\n${n?'Expression: "'+n+'"\n\n':""}`,t),setTimeout((()=>{throw e}),0)}function H(e,t,n={}){let r;return W(e,t)((e=>r=e),n),r}function W(...e){return V(...e)}var V=Y;function Y(e,t){let n={};U(n,e);let r=[n,...L(e)];if("function"==typeof t)return function(e,t){return(n=()=>{},{scope:r={},params:o=[]}={})=>{X(n,t.apply(B([r,...e]),o))}}(r,t);let o=function(e,t,n){let r=function(e,t){if(K[e])return K[e];let n=Object.getPrototypeOf((async function(){})).constructor,r=/^[\n\s]*if.*\(.*\)/.test(e)||/^(let|const)\s/.test(e)?`(() => { ${e} })()`:e;const o=()=>{try{return new n(["__self","scope"],`with (scope) { __self.result = ${r} }; __self.finished = true; return __self.result;`)}catch(n){return F(n,t,e),Promise.resolve()}};let i=o();return K[e]=i,i}(t,n);return(o=()=>{},{scope:i={},params:a=[]}={})=>{r.result=void 0,r.finished=!1;let s=B([i,...e]);if("function"==typeof r){let e=r(r,s).catch((e=>F(e,n,t)));r.finished?(X(o,r.result,s,a,n),r.result=void 0):e.then((e=>{X(o,e,s,a,n)})).catch((e=>F(e,n,t))).finally((()=>r.result=void 0))}}}(r,t,e);return z.bind(null,e,t,o)}var K={};function X(e,t,n,r,o){if("function"==typeof t){let i=t.apply(n,r);i instanceof Promise?i.then((t=>X(e,t,n,r))).catch((e=>F(e,o,t))):e(i)}else e(t)}var Z="x-";function J(e=""){return Z+e}var G={};function Q(e,t){G[e]=t}function ee(e,t,n){let r={},o=Array.from(t).map(ae(((e,t)=>r[e]=t))).filter(le).map(function(e,t){return({name:n,value:r})=>{let o=n.match(ce()),i=n.match(/:([a-zA-Z0-9\-:]+)/),a=n.match(/\.[^.\]]+(?=[^\]]*$)/g)||[],s=t||e[n]||n;return{type:o?o[1]:null,value:i?i[1]:null,modifiers:a.map((e=>e.replace(".",""))),expression:r,original:s}}}(r,n)).sort(pe);return o.map((t=>function(e,t){let n=()=>{},r=G[t.type]||n,[o,i]=oe(e);!function(e,t,n){e._x_attributeCleanups||(e._x_attributeCleanups={}),e._x_attributeCleanups[t]||(e._x_attributeCleanups[t]=[]),e._x_attributeCleanups[t].push(n)}(e,t.original,i);let a=()=>{e._x_ignore||e._x_ignoreSelf||(r.inline&&r.inline(e,t,o),r=r.bind(r,e,t,o),te?ne.get(re).push(r):r())};return a.runCleanups=i,a}(e,t)))}var te=!1,ne=new Map,re=Symbol();function oe(e){let t=[],[n,r]=function(e){let t=()=>{};return[n=>{let r=o(n);return e._x_effects||(e._x_effects=new Set,e._x_runEffects=()=>{e._x_effects.forEach((e=>e()))}),e._x_effects.add(r),t=()=>{void 0!==r&&(e._x_effects.delete(r),i(r))},r},()=>{t()}]}(e);t.push(r);return[{Alpine:Xe,effect:n,cleanup:e=>t.push(e),evaluateLater:W.bind(W,e),evaluate:H.bind(H,e)},()=>t.forEach((e=>e()))]}var ie=(e,t)=>({name:n,value:r})=>(n.startsWith(e)&&(n=n.replace(e,t)),{name:n,value:r});function ae(e=()=>{}){return({name:t,value:n})=>{let{name:r,value:o}=se.reduce(((e,t)=>t(e)),{name:t,value:n});return r!==t&&e(r,t),{name:r,value:o}}}var se=[];function ue(e){se.push(e)}function le({name:e}){return ce().test(e)}var ce=()=>new RegExp(`^${Z}([^:^.]+)\\b`);var fe="DEFAULT",de=["ignore","ref","data","id","bind","init","for","model","modelable","transition","show","if",fe,"teleport","element"];function pe(e,t){let n=-1===de.indexOf(e.type)?fe:e.type,r=-1===de.indexOf(t.type)?fe:t.type;return de.indexOf(n)-de.indexOf(r)}function he(e,t,n={}){e.dispatchEvent(new CustomEvent(t,{detail:n,bubbles:!0,composed:!0,cancelable:!0}))}var ge=[],me=!1;function ye(e){ge.push(e),queueMicrotask((()=>{me||setTimeout((()=>{ve()}))}))}function ve(){for(me=!1;ge.length;)ge.shift()()}function we(e,t){if("function"==typeof ShadowRoot&&e instanceof ShadowRoot)return void Array.from(e.children).forEach((e=>we(e,t)));let n=!1;if(t(e,(()=>n=!0)),n)return;let r=e.firstElementChild;for(;r;)we(r,t),r=r.nextElementSibling}function be(e,...t){console.warn(`Alpine Warning: ${e}`,...t)}var xe=[],_e=[];function Ee(){return xe.map((e=>e()))}function ke(){return xe.concat(_e).map((e=>e()))}function Ce(e){xe.push(e)}function Ae(e){_e.push(e)}function Te(e,t=!1){return Se(e,(e=>{if((t?ke():Ee()).some((t=>e.matches(t))))return!0}))}function Se(e,t){if(e){if(t(e))return e;if(e._x_teleportBack&&(e=e._x_teleportBack),e.parentElement)return Se(e.parentElement,t)}}function Oe(e,t=we){!function(e){te=!0;let t=Symbol();re=t,ne.set(t,[]);let n=()=>{for(;ne.get(t).length;)ne.get(t).shift()();ne.delete(t)};e(n),te=!1,n()}((()=>{t(e,((e,t)=>{ee(e,e.attributes).forEach((e=>e())),e._x_ignore&&t()}))}))}function je(e,t){return Array.isArray(t)?Re(e,t.join(" ")):"object"==typeof t&&null!==t?function(e,t){let n=e=>e.split(" ").filter(Boolean),r=Object.entries(t).flatMap((([e,t])=>!!t&&n(e))).filter(Boolean),o=Object.entries(t).flatMap((([e,t])=>!t&&n(e))).filter(Boolean),i=[],a=[];return o.forEach((t=>{e.classList.contains(t)&&(e.classList.remove(t),a.push(t))})),r.forEach((t=>{e.classList.contains(t)||(e.classList.add(t),i.push(t))})),()=>{a.forEach((t=>e.classList.add(t))),i.forEach((t=>e.classList.remove(t)))}}(e,t):"function"==typeof t?je(e,t()):Re(e,t)}function Re(e,t){return t=!0===t?t="":t||"",n=t.split(" ").filter((t=>!e.classList.contains(t))).filter(Boolean),e.classList.add(...n),()=>{e.classList.remove(...n)};var n}function Pe(e,t){return"object"==typeof t&&null!==t?function(e,t){let n={};return Object.entries(t).forEach((([t,r])=>{n[t]=e.style[t],t.startsWith("--")||(t=t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()),e.style.setProperty(t,r)})),setTimeout((()=>{0===e.style.length&&e.removeAttribute("style")})),()=>{Pe(e,n)}}(e,t):function(e,t){let n=e.getAttribute("style",t);return e.setAttribute("style",t),()=>{e.setAttribute("style",n||"")}}(e,t)}function Le(e,t=()=>{}){let n=!1;return function(){n?t.apply(this,arguments):(n=!0,e.apply(this,arguments))}}function Be(e,t,n={}){e._x_transition||(e._x_transition={enter:{during:n,start:n,end:n},leave:{during:n,start:n,end:n},in(n=()=>{},r=()=>{}){Ne(e,t,{during:this.enter.during,start:this.enter.start,end:this.enter.end},n,r)},out(n=()=>{},r=()=>{}){Ne(e,t,{during:this.leave.during,start:this.leave.start,end:this.leave.end},n,r)}})}function De(e){let t=e.parentNode;if(t)return t._x_hidePromise?t:De(t)}function Ne(e,t,{during:n,start:r,end:o}={},i=()=>{},a=()=>{}){if(e._x_transitioning&&e._x_transitioning.cancel(),0===Object.keys(n).length&&0===Object.keys(r).length&&0===Object.keys(o).length)return i(),void a();let s,u,l;!function(e,t){let n,r,o,i=Le((()=>{A((()=>{n=!0,r||t.before(),o||(t.end(),ve()),t.after(),e.isConnected&&t.cleanup(),delete e._x_transitioning}))}));e._x_transitioning={beforeCancels:[],beforeCancel(e){this.beforeCancels.push(e)},cancel:Le((function(){for(;this.beforeCancels.length;)this.beforeCancels.shift()();i()})),finish:i},A((()=>{t.start(),t.during()})),me=!0,requestAnimationFrame((()=>{if(n)return;let i=1e3*Number(getComputedStyle(e).transitionDuration.replace(/,.*/,"").replace("s","")),a=1e3*Number(getComputedStyle(e).transitionDelay.replace(/,.*/,"").replace("s",""));0===i&&(i=1e3*Number(getComputedStyle(e).animationDuration.replace("s",""))),A((()=>{t.before()})),r=!0,requestAnimationFrame((()=>{n||(A((()=>{t.end()})),ve(),setTimeout(e._x_transitioning.finish,i+a),o=!0)}))}))}(e,{start(){s=t(e,r)},during(){u=t(e,n)},before:i,end(){s(),l=t(e,o)},after:a,cleanup(){u(),l()}})}function Ie(e,t,n){if(-1===e.indexOf(t))return n;const r=e[e.indexOf(t)+1];if(!r)return n;if("scale"===t&&isNaN(r))return n;if("duration"===t){let e=r.match(/([0-9]+)ms/);if(e)return e[1]}return"origin"===t&&["top","right","left","center","bottom"].includes(e[e.indexOf(t)+2])?[r,e[e.indexOf(t)+2]].join(" "):r}Q("transition",((e,{value:t,modifiers:n,expression:r},{evaluate:o})=>{"function"==typeof r&&(r=o(r)),r?function(e,t,n){Be(e,je,"");let r={enter:t=>{e._x_transition.enter.during=t},"enter-start":t=>{e._x_transition.enter.start=t},"enter-end":t=>{e._x_transition.enter.end=t},leave:t=>{e._x_transition.leave.during=t},"leave-start":t=>{e._x_transition.leave.start=t},"leave-end":t=>{e._x_transition.leave.end=t}};r[n](t)}(e,r,t):function(e,t,n){Be(e,Pe);let r=!t.includes("in")&&!t.includes("out")&&!n,o=r||t.includes("in")||["enter"].includes(n),i=r||t.includes("out")||["leave"].includes(n);t.includes("in")&&!r&&(t=t.filter(((e,n)=>nn>t.indexOf("out"))));let a=!t.includes("opacity")&&!t.includes("scale"),s=a||t.includes("opacity"),u=a||t.includes("scale"),l=s?0:1,c=u?Ie(t,"scale",95)/100:1,f=Ie(t,"delay",0),d=Ie(t,"origin","center"),p="opacity, transform",h=Ie(t,"duration",150)/1e3,g=Ie(t,"duration",75)/1e3,m="cubic-bezier(0.4, 0.0, 0.2, 1)";o&&(e._x_transition.enter.during={transformOrigin:d,transitionDelay:f,transitionProperty:p,transitionDuration:`${h}s`,transitionTimingFunction:m},e._x_transition.enter.start={opacity:l,transform:`scale(${c})`},e._x_transition.enter.end={opacity:1,transform:"scale(1)"});i&&(e._x_transition.leave.during={transformOrigin:d,transitionDelay:f,transitionProperty:p,transitionDuration:`${g}s`,transitionTimingFunction:m},e._x_transition.leave.start={opacity:1,transform:"scale(1)"},e._x_transition.leave.end={opacity:l,transform:`scale(${c})`})}(e,n,t)})),window.Element.prototype._x_toggleAndCascadeWithTransitions=function(e,t,n,r){let o=()=>{"visible"===document.visibilityState?requestAnimationFrame(n):setTimeout(n)};t?e._x_transition&&(e._x_transition.enter||e._x_transition.leave)?e._x_transition.enter&&(Object.entries(e._x_transition.enter.during).length||Object.entries(e._x_transition.enter.start).length||Object.entries(e._x_transition.enter.end).length)?e._x_transition.in(n):o():e._x_transition?e._x_transition.in(n):o():(e._x_hidePromise=e._x_transition?new Promise(((t,n)=>{e._x_transition.out((()=>{}),(()=>t(r))),e._x_transitioning.beforeCancel((()=>n({isFromCancelledTransition:!0})))})):Promise.resolve(r),queueMicrotask((()=>{let t=De(e);t?(t._x_hideChildren||(t._x_hideChildren=[]),t._x_hideChildren.push(e)):queueMicrotask((()=>{let t=e=>{let n=Promise.all([e._x_hidePromise,...(e._x_hideChildren||[]).map(t)]).then((([e])=>e()));return delete e._x_hidePromise,delete e._x_hideChildren,n};t(e).catch((e=>{if(!e.isFromCancelledTransition)throw e}))}))})))};var Me=!1;function qe(e,t=()=>{}){return(...n)=>Me?t(...n):e(...n)}function Ue(e,t,n,o=[]){switch(e._x_bindings||(e._x_bindings=r({})),e._x_bindings[t]=n,t=o.includes("camel")?t.toLowerCase().replace(/-(\w)/g,((e,t)=>t.toUpperCase())):t){case"value":!function(e,t){if("radio"===e.type)void 0===e.attributes.value&&(e.value=t),window.fromModel&&(e.checked=ze(e.value,t));else if("checkbox"===e.type)Number.isInteger(t)?e.value=t:Number.isInteger(t)||Array.isArray(t)||"boolean"==typeof t||[null,void 0].includes(t)?Array.isArray(t)?e.checked=t.some((t=>ze(t,e.value))):e.checked=!!t:e.value=String(t);else if("SELECT"===e.tagName)!function(e,t){const n=[].concat(t).map((e=>e+""));Array.from(e.options).forEach((e=>{e.selected=n.includes(e.value)}))}(e,t);else{if(e.value===t)return;e.value=t}}(e,n);break;case"style":!function(e,t){e._x_undoAddedStyles&&e._x_undoAddedStyles();e._x_undoAddedStyles=Pe(e,t)}(e,n);break;case"class":!function(e,t){e._x_undoAddedClasses&&e._x_undoAddedClasses();e._x_undoAddedClasses=je(e,t)}(e,n);break;default:!function(e,t,n){[null,void 0,!1].includes(n)&&function(e){return!["aria-pressed","aria-checked","aria-expanded","aria-selected"].includes(e)}(t)?e.removeAttribute(t):(Fe(t)&&(n=t),function(e,t,n){e.getAttribute(t)!=n&&e.setAttribute(t,n)}(e,t,n))}(e,t,n)}}function ze(e,t){return e==t}function Fe(e){return["disabled","checked","required","readonly","hidden","open","selected","autofocus","itemscope","multiple","novalidate","allowfullscreen","allowpaymentrequest","formnovalidate","autoplay","controls","loop","muted","playsinline","default","ismap","reversed","async","defer","nomodule"].includes(e)}function He(e,t){var n;return function(){var r=this,o=arguments;clearTimeout(n),n=setTimeout((function(){n=null,e.apply(r,o)}),t)}}function $e(e,t){let n;return function(){let r=this,o=arguments;n||(e.apply(r,o),n=!0,setTimeout((()=>n=!1),t))}}var We={},Ve=!1;var Ye={};var Ke={};var Xe={get reactive(){return r},get release(){return i},get effect(){return o},get raw(){return a},version:"3.9.2",flushAndStopDeferringMutations:function(){T=!1,O(S),S=[]},disableEffectScheduling:function(e){p=!1,e(),p=!0},setReactivityEngine:function(e){r=e.reactive,i=e.release,o=t=>e.effect(t,{scheduler:e=>{p?c(e):e()}}),a=e.raw},closestDataStack:L,skipDuringClone:qe,addRootSelector:Ce,addInitSelector:Ae,addScopeToNode:R,deferMutations:function(){T=!0},mapAttributes:ue,evaluateLater:W,setEvaluator:function(e){V=e},mergeProxies:B,findClosest:Se,closestRoot:Te,interceptor:N,transition:Ne,setStyles:Pe,mutateDom:A,directive:Q,throttle:$e,debounce:He,evaluate:H,initTree:Oe,nextTick:ye,prefixed:J,prefix:function(e){Z=e},plugin:function(e){e(Xe)},magic:q,store:function(e,t){if(Ve||(We=r(We),Ve=!0),void 0===t)return We[e];We[e]=t,"object"==typeof t&&null!==t&&t.hasOwnProperty("init")&&"function"==typeof t.init&&We[e].init(),D(We[e])},start:function(){var e;document.body||be("Unable to initialize. Trying to load Alpine before `` is available. Did you forget to add `defer` in Alpine's `